@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
package/dist/index.d.ts CHANGED
@@ -1,11 +1,2019 @@
1
- export * from './apps';
2
- export * from './components';
3
- export * from './stores';
4
- export * from './hooks';
5
- export * from './types';
6
- export * from './interfaces';
7
- export * from './utils';
8
- export * from './constants';
9
- export * from './domain';
10
- export * from './infrastructure';
11
- export { default as i18n } from './i18n/index';
1
+ import * as react from 'react';
2
+ import react__default, { ReactNode, FC, MouseEvent, ReactElement } from 'react';
3
+ import { MantineThemeOverride } from '@mantine/core';
4
+ import i18n from 'i18next';
5
+ export { default as i18n } from 'i18next';
6
+ import * as framer_motion from 'framer-motion';
7
+ import { Transition, TargetAndTransition, Variants } from 'framer-motion';
8
+ import { IconType, IconBaseProps } from 'react-icons';
9
+ import * as _tanstack_react_query from '@tanstack/react-query';
10
+ import * as zustand_middleware from 'zustand/middleware';
11
+ import * as zustand from 'zustand';
12
+ export { v4 as uuidv4 } from 'uuid';
13
+
14
+ type SupportedLanguage$2 = 'en' | 'es';
15
+ interface CustomThemeColors {
16
+ taskbar: string;
17
+ window: string;
18
+ accent: string;
19
+ }
20
+ interface ISettingsState {
21
+ wallpaper: string | null;
22
+ wallpaperModule: string;
23
+ launcherIcon: string;
24
+ font: string;
25
+ downloadedFonts: string[];
26
+ fontSize: number;
27
+ animationDuration: number;
28
+ theme: FdeTheme;
29
+ themeSetManually: boolean;
30
+ customThemeColors: CustomThemeColors | null;
31
+ language: SupportedLanguage$2;
32
+ setWallpaper: (url: string | null) => void;
33
+ setWallpaperModule: (module: string) => void;
34
+ setLauncherIcon: (icon: string) => void;
35
+ setFont: (font: string) => void;
36
+ markFontDownloaded: (fontName: string) => void;
37
+ setFontSize: (size: number) => void;
38
+ setAnimationDuration: (duration: number) => void;
39
+ setThemeMode: (mode: ThemeMode) => void;
40
+ toggleTheme: () => void;
41
+ setThemeAutomatic: () => void;
42
+ applySystemTheme: (mode: ThemeMode) => void;
43
+ setCustomThemeColors: (colors: CustomThemeColors | null) => void;
44
+ setLanguage: (lang: SupportedLanguage$2) => void;
45
+ }
46
+
47
+ type ThemeMode = 'light' | 'dark';
48
+ interface Theme {
49
+ mode: ThemeMode;
50
+ desktop: string;
51
+ taskbar: string;
52
+ window: string;
53
+ accent: string;
54
+ }
55
+ interface WindowTheme {
56
+ borderRadius: string;
57
+ headerHeight: number;
58
+ minWidth: number;
59
+ minHeight: number;
60
+ defaultWidth: number;
61
+ defaultHeight: number;
62
+ shadow: string;
63
+ }
64
+ interface TaskbarTheme {
65
+ height: number;
66
+ position: 'bottom' | 'top';
67
+ background: string;
68
+ blur: boolean;
69
+ }
70
+ interface DesktopTheme {
71
+ background: string;
72
+ iconSize: number;
73
+ iconSpacing: number;
74
+ }
75
+ interface FdeTheme {
76
+ mode: ThemeMode;
77
+ colors: {
78
+ desktop: string;
79
+ taskbar: string;
80
+ window: string;
81
+ accent: string;
82
+ };
83
+ window: WindowTheme;
84
+ taskbar: TaskbarTheme;
85
+ desktop: DesktopTheme;
86
+ }
87
+ interface PartialFdeTheme {
88
+ mode?: ThemeMode;
89
+ colors?: Partial<FdeTheme['colors']>;
90
+ window?: Partial<WindowTheme>;
91
+ taskbar?: Partial<TaskbarTheme>;
92
+ desktop?: Partial<DesktopTheme>;
93
+ }
94
+ interface IThemeProvider {
95
+ getTheme(): FdeTheme;
96
+ setMode(mode: ThemeMode): void;
97
+ toggle(): void;
98
+ setCustomColors(colors: CustomThemeColors | null): void;
99
+ }
100
+
101
+ interface ThemeProviderProps {
102
+ children: react__default.ReactNode;
103
+ initialMode?: ThemeMode;
104
+ /** External mode override - when provided, syncs internal state with this value */
105
+ mode?: ThemeMode;
106
+ theme?: PartialFdeTheme;
107
+ }
108
+ declare function ThemeProvider({ children, initialMode, mode: externalMode, theme, }: ThemeProviderProps): react__default.ReactElement;
109
+
110
+ declare function useTheme(): FdeTheme;
111
+ declare function useThemeContext(): IThemeProvider;
112
+
113
+ declare const DEFAULT_FDE_THEME: Record<ThemeMode, FdeTheme>;
114
+
115
+ interface FileSystemNode {
116
+ id: string;
117
+ name: string;
118
+ type: FileSystemNodeType;
119
+ parentId: string | null;
120
+ createdAt: Date;
121
+ updatedAt: Date;
122
+ }
123
+
124
+ interface FileNode extends FileSystemNode {
125
+ type: 'file';
126
+ content: string;
127
+ mimeType?: string;
128
+ url?: string;
129
+ iconName?: string;
130
+ iconColor?: string;
131
+ }
132
+
133
+ interface FolderNode extends FileSystemNode {
134
+ type: 'folder';
135
+ children: string[];
136
+ iconName?: string;
137
+ iconColor?: string;
138
+ }
139
+
140
+ type FileSystemNodeType = 'file' | 'folder';
141
+ type FSNode = FileNode | FolderNode;
142
+
143
+ interface FsManifestFile {
144
+ name: string;
145
+ folder: string;
146
+ mimeType: string;
147
+ url: string;
148
+ }
149
+ interface FsManifest {
150
+ folders: string[];
151
+ files: FsManifestFile[];
152
+ }
153
+ interface IFileSystem {
154
+ initialize(): Promise<void>;
155
+ reinitialize(): Promise<void>;
156
+ isReady(): boolean;
157
+ isEmpty(): boolean;
158
+ getNode(id: string): FSNode | undefined;
159
+ getChildren(folderId: string): FSNode[];
160
+ getRootNodes(): FSNode[];
161
+ getAllNodes(): FSNode[];
162
+ createFile(name: string, content: string, parentId: string | null, url?: string): Promise<FileNode>;
163
+ createFolder(name: string, parentId: string | null, iconName?: string, iconColor?: string): Promise<FolderNode>;
164
+ updateFile(id: string, content: string): Promise<FileNode>;
165
+ move(id: string, newParentId: string | null): Promise<FSNode>;
166
+ delete(id: string): Promise<void>;
167
+ readFile(path: string): Promise<string>;
168
+ writeFile(path: string, content: string): Promise<void>;
169
+ saveBlob(blob: Blob): Promise<string>;
170
+ /** url: `idb://{hash}` for IndexedDB, `/api/fs?action=file&path=...` for Docker */
171
+ getBlob(url: string): Promise<Blob | null>;
172
+ toBlobUrl(url: string): Promise<string | null>;
173
+ seed(manifest: FsManifest): Promise<void>;
174
+ mergeSeed(manifest: FsManifest): Promise<void>;
175
+ getManifestSha(): Promise<string | null>;
176
+ saveManifestSha(sha: string): Promise<void>;
177
+ clearAll(): Promise<void>;
178
+ }
179
+
180
+ interface FdeProviderProps {
181
+ children: react__default.ReactNode;
182
+ fileSystem: IFileSystem;
183
+ initialMode?: ThemeMode;
184
+ theme?: PartialFdeTheme;
185
+ mantineTheme?: MantineThemeOverride;
186
+ fallback?: react__default.ReactNode;
187
+ onError?: (error: Error) => void;
188
+ }
189
+ declare function FdeProvider({ children, fileSystem, initialMode, theme, mantineTheme, fallback, onError, }: FdeProviderProps): react__default.ReactElement;
190
+
191
+ interface FdeContextValue {
192
+ fs: IFileSystem | null;
193
+ isReady: boolean;
194
+ error: Error | null;
195
+ theme: FdeTheme;
196
+ setThemeMode: (mode: ThemeMode) => void;
197
+ toggleTheme: () => void;
198
+ }
199
+
200
+ declare function useFdeContext(): FdeContextValue;
201
+
202
+ interface AppEntry {
203
+ id: string;
204
+ name: string;
205
+ icon: string;
206
+ fcIcon?: string;
207
+ iconUrl?: string;
208
+ iconColor?: string;
209
+ defaultWidth?: number;
210
+ defaultHeight?: number;
211
+ minWidth?: number | false;
212
+ minHeight?: number | false;
213
+ canMaximize?: boolean;
214
+ alwaysOnTop?: boolean;
215
+ autoLoad?: {
216
+ url: string;
217
+ name?: string;
218
+ };
219
+ hasContextMenu?: boolean;
220
+ singleWindow?: boolean;
221
+ }
222
+
223
+ type WindowState = 'normal' | 'minimized' | 'maximized';
224
+ type WindowInput<T = Record<string, unknown>> = {
225
+ title: string;
226
+ content: string;
227
+ x: number;
228
+ y: number;
229
+ width: number;
230
+ height: number;
231
+ minWidth?: number;
232
+ minHeight?: number;
233
+ icon?: string;
234
+ fcIcon?: string;
235
+ iconUrl?: string;
236
+ iconColor?: string;
237
+ canMaximize?: boolean;
238
+ alwaysOnTop?: boolean;
239
+ contentData?: T;
240
+ };
241
+
242
+ interface WindowEntity {
243
+ id: string;
244
+ title: string;
245
+ content: string;
246
+ x: number;
247
+ y: number;
248
+ width: number;
249
+ height: number;
250
+ minWidth?: number;
251
+ minHeight?: number;
252
+ isOpen: boolean;
253
+ state: WindowState;
254
+ zIndex: number;
255
+ icon?: string;
256
+ fcIcon?: string;
257
+ iconUrl?: string;
258
+ iconColor?: string;
259
+ canMaximize?: boolean;
260
+ alwaysOnTop?: boolean;
261
+ contentData?: Record<string, unknown>;
262
+ closeInterceptor?: () => boolean;
263
+ }
264
+
265
+ interface MenuItemAction {
266
+ type: 'item';
267
+ label: string;
268
+ icon?: string;
269
+ onClick: () => void;
270
+ disabled?: boolean;
271
+ }
272
+ interface MenuItemDivider {
273
+ type: 'divider';
274
+ }
275
+ interface MenuItemSlider {
276
+ type: 'slider';
277
+ label?: string;
278
+ min: number;
279
+ max: number;
280
+ value: number;
281
+ onChange: (value: number) => void;
282
+ labelFormat?: (value: number) => string;
283
+ }
284
+ type MenuItem = MenuItemAction | MenuItemDivider | MenuItemSlider;
285
+ interface AppMenuDropdown {
286
+ type: 'menu';
287
+ label: string;
288
+ icon?: string;
289
+ items: MenuItem[];
290
+ rightSection?: ReactNode;
291
+ }
292
+ interface AppMenuCombobox {
293
+ type: 'combobox';
294
+ label?: string;
295
+ options: string[];
296
+ value: string;
297
+ onChange: (value: string) => void;
298
+ }
299
+ interface AppMenuSwitch {
300
+ type: 'switch';
301
+ label: string;
302
+ checked: boolean;
303
+ onChange: (value: boolean) => void;
304
+ }
305
+ interface AppMenuSlider {
306
+ type: 'slider';
307
+ label?: string;
308
+ min: number;
309
+ max: number;
310
+ value: number;
311
+ onChange: (value: number) => void;
312
+ marks?: {
313
+ value: number;
314
+ label?: string;
315
+ }[];
316
+ labelFormat?: (value: number) => string;
317
+ }
318
+ interface AppMenuTextInput {
319
+ type: 'text-input';
320
+ placeholder?: string;
321
+ value: string;
322
+ onChange: (value: string) => void;
323
+ }
324
+ interface AppMenuNumberInput {
325
+ type: 'number-input';
326
+ label?: string;
327
+ value: number;
328
+ onChange: (value: number) => void;
329
+ min?: number;
330
+ max?: number;
331
+ step?: number;
332
+ placeholder?: string;
333
+ }
334
+ interface AppMenuSelect {
335
+ type: 'select';
336
+ label?: string;
337
+ options: {
338
+ value: string;
339
+ label: string;
340
+ }[];
341
+ value: string;
342
+ onChange: (value: string) => void;
343
+ }
344
+ interface AppMenuDirtyIndicator {
345
+ type: 'dirty-indicator';
346
+ }
347
+ type AppMenuElement = AppMenuDropdown | AppMenuCombobox | AppMenuSwitch | AppMenuSlider | AppMenuTextInput | AppMenuNumberInput | AppMenuSelect | AppMenuDirtyIndicator;
348
+
349
+ interface WindowContentProps {
350
+ window?: WindowEntity;
351
+ notifyReady?: (contentData?: Record<string, unknown>) => void;
352
+ }
353
+ type AppComponent$1 = FC<WindowContentProps>;
354
+ type MenuBarBuilder = (window: WindowEntity) => AppMenuElement[] | undefined;
355
+ interface MenuBarComponentProps {
356
+ windowId: string;
357
+ onExit: () => void;
358
+ contentData?: Record<string, unknown>;
359
+ }
360
+ type MenuBarComponent = FC<MenuBarComponentProps>;
361
+ interface AppRegistration {
362
+ component: AppComponent$1;
363
+ buildMenuBar?: MenuBarBuilder;
364
+ MenuBarComponent?: MenuBarComponent;
365
+ }
366
+
367
+ interface DesktopIconEntity {
368
+ id: string;
369
+ name: string;
370
+ icon: string;
371
+ iconName?: string;
372
+ iconColor?: string;
373
+ x: number;
374
+ y: number;
375
+ appId: string;
376
+ nodeId?: string;
377
+ }
378
+
379
+ interface MenuPosition {
380
+ x: number;
381
+ y: number;
382
+ }
383
+
384
+ interface CreateFolderOptions {
385
+ iconName?: string;
386
+ iconColor?: string;
387
+ }
388
+
389
+ type LoadingState = 'idle' | 'fetching' | 'compiling' | 'loading' | 'ready' | 'error';
390
+ interface LoadingProgress {
391
+ state: LoadingState;
392
+ progress: number;
393
+ message?: string;
394
+ appName?: string;
395
+ error?: string;
396
+ }
397
+ interface WindowLoading extends LoadingProgress {
398
+ windowId: string;
399
+ }
400
+
401
+ type DesktopIconInput = Omit<DesktopIconEntity, 'id'>;
402
+
403
+ interface OpenAppOptions {
404
+ title?: string;
405
+ icon?: string;
406
+ contentData?: Record<string, unknown>;
407
+ position?: {
408
+ x?: number;
409
+ y?: number;
410
+ };
411
+ size?: {
412
+ width?: number;
413
+ height?: number;
414
+ };
415
+ }
416
+ interface FileDialogOptions {
417
+ acceptedMimeTypes?: string[];
418
+ multiple?: boolean;
419
+ defaultPath?: string;
420
+ }
421
+ interface SaveDialogOptions {
422
+ defaultName?: string;
423
+ defaultPath?: string;
424
+ acceptedMimeTypes?: string[];
425
+ }
426
+ interface NotificationOptions {
427
+ title: string;
428
+ message: string;
429
+ type?: 'info' | 'success' | 'warning' | 'error';
430
+ duration?: number;
431
+ }
432
+ type FdeEventType = 'window-opened' | 'window-closed' | 'window-focused' | 'window-minimized' | 'window-maximized' | 'file-opened' | 'file-saved' | 'theme-changed' | 'notification-shown';
433
+ interface FdeEventPayloads {
434
+ 'window-opened': {
435
+ windowId: string;
436
+ content: string;
437
+ };
438
+ 'window-closed': {
439
+ windowId: string;
440
+ };
441
+ 'window-focused': {
442
+ windowId: string;
443
+ };
444
+ 'window-minimized': {
445
+ windowId: string;
446
+ };
447
+ 'window-maximized': {
448
+ windowId: string;
449
+ };
450
+ 'file-opened': {
451
+ path: string;
452
+ appId?: string;
453
+ };
454
+ 'file-saved': {
455
+ path: string;
456
+ success: boolean;
457
+ };
458
+ 'theme-changed': {
459
+ theme: string;
460
+ };
461
+ 'notification-shown': {
462
+ notificationId: string;
463
+ };
464
+ }
465
+ interface FdeDesktopAPI {
466
+ openApp: (appId: string, options?: OpenAppOptions) => void;
467
+ closeWindow: (windowId?: string) => void;
468
+ minimizeWindow: (windowId?: string) => void;
469
+ maximizeWindow: (windowId?: string) => void;
470
+ restoreWindow: (windowId?: string) => void;
471
+ focusWindow: (windowId?: string) => void;
472
+ openFile: (path: string, appId?: string) => void;
473
+ openFileDialog: (options?: FileDialogOptions) => Promise<string | null>;
474
+ saveFile: (content: string, options?: SaveDialogOptions) => Promise<boolean>;
475
+ saveFileDialog: (options?: SaveDialogOptions) => Promise<string | null>;
476
+ getTheme: () => Record<string, unknown>;
477
+ setTheme: (theme: Record<string, unknown>) => void;
478
+ showNotification: (options: NotificationOptions) => string;
479
+ hideNotification: (notificationId: string) => void;
480
+ getWindows: () => WindowEntity[];
481
+ getActiveWindow: () => WindowEntity | null;
482
+ getWindowById: (windowId: string) => WindowEntity | null;
483
+ fs: IFileSystem;
484
+ on: <T extends FdeEventType>(event: T, callback: (data: FdeEventPayloads[T]) => void) => () => void;
485
+ off: <T extends FdeEventType>(event: T, callback: (data: FdeEventPayloads[T]) => void) => void;
486
+ appReady: (appId: string) => void;
487
+ registerAppInstance: (appId: string, instance: unknown) => void;
488
+ }
489
+ declare global {
490
+ interface Window {
491
+ __FDE_API__?: FdeDesktopAPI;
492
+ }
493
+ }
494
+
495
+ declare const createWindow: (input: WindowInput) => WindowEntity;
496
+
497
+ declare const createDesktopIcon: (input: DesktopIconInput) => DesktopIconEntity;
498
+
499
+ interface LauncherFolder {
500
+ id: string;
501
+ name: string;
502
+ fcIcon: string;
503
+ appIds: string[];
504
+ isExpanded: boolean;
505
+ isPredefined: boolean;
506
+ order: number;
507
+ }
508
+ interface LauncherFolderInput {
509
+ name: string;
510
+ fcIcon: string;
511
+ appIds?: string[];
512
+ isExpanded?: boolean;
513
+ isPredefined?: boolean;
514
+ order?: number;
515
+ }
516
+ declare const createLauncherFolder: (input: LauncherFolderInput) => LauncherFolder;
517
+ declare const createPredefinedLauncherFolder: (input: Omit<LauncherFolderInput, "isPredefined">) => LauncherFolder;
518
+ declare const updateLauncherFolder: (folder: LauncherFolder, updates: Partial<Omit<LauncherFolder, "id" | "isPredefined">>) => LauncherFolder;
519
+
520
+ declare const createFolder: (name: string, parentId?: string | null, options?: CreateFolderOptions) => FolderNode;
521
+ declare const createFile: (name: string, content: string, parentId?: string | null, mimeType?: string, url?: string) => FileNode;
522
+
523
+ interface CustomAppManifest {
524
+ id: string;
525
+ name: string;
526
+ version: string;
527
+ icon: string;
528
+ iconUrl?: string;
529
+ entry: string;
530
+ window: {
531
+ defaultWidth?: number;
532
+ defaultHeight?: number;
533
+ minWidth?: number | false;
534
+ minHeight?: number | false;
535
+ canMaximize?: boolean;
536
+ alwaysOnTop?: boolean;
537
+ singleWindow?: boolean;
538
+ };
539
+ }
540
+ interface AppsManifest {
541
+ version: string;
542
+ generated: string;
543
+ apps: CustomAppManifest[];
544
+ }
545
+ declare function fetchAppManifest(forceRefresh?: boolean): Promise<AppsManifest | null>;
546
+ declare function getCachedManifest(): AppsManifest | null;
547
+ declare function clearManifestCache(): void;
548
+ declare function updateManifestCache(manifest: CustomAppManifest): void;
549
+ declare function removeFromManifestCache(appId: string): void;
550
+ declare function getCustomApps(): Promise<CustomAppManifest[]>;
551
+ declare function getCustomAppById(appId: string): Promise<CustomAppManifest | undefined>;
552
+ declare function isCustomApp(appId: string): boolean;
553
+ declare function convertToAppEntry(manifest: CustomAppManifest): Partial<AppEntry>;
554
+ declare function mergeAppsWithCustomApps(staticApps: AppEntry[], customApps: CustomAppManifest[]): AppEntry[];
555
+ declare function syncWithServer(currentRegisteredApps: Record<string, CustomAppManifest>): Promise<{
556
+ added: CustomAppManifest[];
557
+ removed: string[];
558
+ manifest: AppsManifest | null;
559
+ }>;
560
+
561
+ type ClipboardAction = 'copy' | 'cut' | null;
562
+ interface ClipboardState {
563
+ content: FSNode[];
564
+ action: ClipboardAction;
565
+ }
566
+ type DesktopSortMode$1 = 'default' | 'name-asc' | 'name-desc' | 'type';
567
+ interface NotificationItem {
568
+ id: string;
569
+ title: string;
570
+ message: string;
571
+ onClose?: () => void;
572
+ fcIcon?: string;
573
+ }
574
+ interface DesktopState {
575
+ windows: WindowEntity[];
576
+ openWindow: (input: WindowInput) => void;
577
+ closeWindow: (id: string) => void;
578
+ minimizeWindow: (id: string) => void;
579
+ maximizeWindow: (id: string) => void;
580
+ restoreWindow: (id: string) => void;
581
+ focusWindow: (id: string) => void;
582
+ moveWindow: (id: string, x: number, y: number) => void;
583
+ resizeWindow: (id: string, width: number, height: number) => void;
584
+ icons: DesktopIconEntity[];
585
+ addIcon: (input: DesktopIconInput) => void;
586
+ removeIcon: (id: string) => void;
587
+ fsNodes: FSNode[];
588
+ desktopFolderId: string | null;
589
+ isFsReady: boolean;
590
+ createFile: (name: string, content: string, parentId: string | null, url?: string) => Promise<FileNode>;
591
+ createFolder: (name: string, parentId: string | null, iconName?: string, iconColor?: string) => Promise<FolderNode>;
592
+ initFs: () => Promise<void>;
593
+ updateFile: (id: string, content: string) => Promise<void>;
594
+ deleteNode: (id: string) => Promise<void>;
595
+ moveNode: (id: string, newParentId: string | null) => Promise<void>;
596
+ setFsNodes: (nodes: FSNode[]) => void;
597
+ syncIcons: () => void;
598
+ clipboard: ClipboardState;
599
+ copyToClipboard: (nodes: FSNode[]) => void;
600
+ cutToClipboard: (nodes: FSNode[]) => void;
601
+ clearClipboard: () => void;
602
+ contextMenu: {
603
+ x: number;
604
+ y: number;
605
+ owner: string | null;
606
+ targetNodeId?: string;
607
+ };
608
+ openContextMenu: (x: number, y: number, owner: string, targetNodeId?: string) => void;
609
+ closeContextMenu: () => void;
610
+ filesCurrentFolderId: string | null;
611
+ setFilesCurrentFolderId: (id: string | null) => void;
612
+ mergeSeed: (manifest: FsManifest) => Promise<void>;
613
+ mergeDesktopApps: (appIds: readonly string[]) => void;
614
+ reorderDesktopApps: (appIds: readonly string[]) => void;
615
+ notifications: NotificationItem[];
616
+ addNotification: (item: NotificationItem) => void;
617
+ removeNotification: (id: string) => void;
618
+ viewportWidth: number;
619
+ viewportHeight: number;
620
+ isViewportInitialized: boolean;
621
+ setViewportSize: (width: number, height: number) => void;
622
+ desktopSortMode: DesktopSortMode$1;
623
+ filesSortMode: DesktopSortMode$1;
624
+ setDesktopSortMode: (mode: DesktopSortMode$1) => void;
625
+ setFilesSortMode: (mode: DesktopSortMode$1) => void;
626
+ launcherFolders: LauncherFolder[];
627
+ setLauncherFolders: (folders: LauncherFolder[]) => void;
628
+ createLauncherFolder: (input: LauncherFolderInput) => LauncherFolder;
629
+ updateLauncherFolder: (id: string, updates: Partial<Omit<LauncherFolder, 'id' | 'isPredefined'>>) => void;
630
+ deleteLauncherFolder: (id: string) => void;
631
+ moveLauncherFolder: (id: string, newOrder: number) => void;
632
+ addAppToFolder: (appId: string, folderId: string) => void;
633
+ removeAppFromFolder: (appId: string, folderId: string) => void;
634
+ customApps: CustomAppManifest[];
635
+ setCustomApps: (apps: CustomAppManifest[]) => void;
636
+ handleCustomAppRegistered: (manifest: CustomAppManifest) => void;
637
+ handleCustomAppUnregistered: (appId: string) => void;
638
+ }
639
+
640
+ interface MountedAppState {
641
+ isLoaded: boolean;
642
+ isLoading: boolean;
643
+ isReady: boolean;
644
+ hasError: boolean;
645
+ error?: string;
646
+ mountedAt: number;
647
+ instance?: unknown;
648
+ }
649
+ interface CustomAppState {
650
+ mountedApps: Record<string, MountedAppState>;
651
+ registeredApps: Record<string, CustomAppManifest>;
652
+ hmrConnected: boolean;
653
+ hmrError: string | null;
654
+ devServerOffline: boolean;
655
+ hmrRetryCount: number;
656
+ setAppLoading: (appId: string) => void;
657
+ setAppLoaded: (appId: string) => void;
658
+ setAppReady: (appId: string, instance?: unknown) => void;
659
+ setAppError: (appId: string, error: string) => void;
660
+ clearApp: (appId: string) => void;
661
+ registerApp: (manifest: CustomAppManifest) => void;
662
+ unregisterApp: (appId: string) => void;
663
+ setHmrConnected: (connected: boolean) => void;
664
+ setHmrError: (error: string | null) => void;
665
+ setDevServerOffline: (offline: boolean) => void;
666
+ incrementHmrRetry: () => void;
667
+ resetHmrRetry: () => void;
668
+ }
669
+
670
+ interface IWindowManager {
671
+ getAll(): WindowEntity[];
672
+ getById(id: string): WindowEntity | undefined;
673
+ open(input: WindowInput): WindowEntity;
674
+ close(id: string): void;
675
+ minimize(id: string): void;
676
+ maximize(id: string): void;
677
+ restore(id: string): void;
678
+ focus(id: string): void;
679
+ move(id: string, x: number, y: number): void;
680
+ resize(id: string, width: number, height: number): void;
681
+ loadWindows(windows: WindowEntity[]): void;
682
+ }
683
+
684
+ interface WindowProps {
685
+ window: WindowEntity;
686
+ menuBar?: AppMenuElement[];
687
+ children?: ReactNode;
688
+ closeInterceptor?: () => boolean;
689
+ }
690
+ interface DesktopIconProps {
691
+ icon: DesktopIconEntity;
692
+ onDoubleClick: (appId: string, nodeId?: string) => void;
693
+ onContextMenu: (e: React.MouseEvent, nodeId: string) => void;
694
+ }
695
+ interface DesktopContextMenuProps {
696
+ opened: boolean;
697
+ position: MenuPosition;
698
+ onClose: () => void;
699
+ onOpenApp: (appId: string) => void;
700
+ onToggleTheme: () => void;
701
+ }
702
+ interface LauncherProps {
703
+ fcIcon?: string;
704
+ onContextMenu?: (e: React.MouseEvent) => void;
705
+ }
706
+ interface DesktopAreaProps {
707
+ children?: ReactNode;
708
+ onContextMenu?: (e: MouseEvent<HTMLDivElement>) => void;
709
+ }
710
+ interface TaskbarContextMenuProps {
711
+ windowMenuOpened: boolean;
712
+ panelMenuOpened: boolean;
713
+ launcherMenuOpened: boolean;
714
+ menuPosition: MenuPosition;
715
+ targetWindowId: string | null;
716
+ targetWindowState: string | null;
717
+ onCloseWindow: (id: string) => void;
718
+ onMinimizeWindow: (id: string) => void;
719
+ onMaximizeWindow: (id: string) => void;
720
+ onRestoreWindow: (id: string) => void;
721
+ onClose: () => void;
722
+ }
723
+
724
+ interface FileIconProps {
725
+ type: 'file' | 'folder';
726
+ name?: string;
727
+ folderNode?: FolderNode;
728
+ fileNode?: FileNode;
729
+ size?: number;
730
+ iconName?: string;
731
+ }
732
+
733
+ type AppComponent = FC<WindowContentProps>;
734
+ interface AppRegistryEntry {
735
+ component?: AppComponent;
736
+ loader?: () => Promise<{
737
+ default: AppComponent;
738
+ }>;
739
+ menuBarLoader?: () => Promise<{
740
+ default: MenuBarComponent;
741
+ }>;
742
+ buildMenuBar?: MenuBarBuilder;
743
+ MenuBarComponent?: MenuBarComponent;
744
+ isLazy?: boolean;
745
+ appName?: string;
746
+ singleWindow?: boolean;
747
+ defaultWidth?: number;
748
+ defaultHeight?: number;
749
+ minWidth?: number | false;
750
+ minHeight?: number | false;
751
+ canMaximize?: boolean;
752
+ alwaysOnTop?: boolean;
753
+ icon?: string;
754
+ fcIcon?: string;
755
+ iconUrl?: string;
756
+ iconColor?: string;
757
+ }
758
+ declare function initRegistry(registry: Record<string, AppRegistryEntry>): void;
759
+ declare function getAppComponent(content: string): AppComponent;
760
+ declare function getMenuBarBuilder(content: string): MenuBarBuilder | undefined;
761
+ declare function getMenuBarComponent(content: string): MenuBarComponent | undefined;
762
+ declare function isLazyApp(content: string): boolean;
763
+ declare function getAppName(content: string): string | undefined;
764
+ declare function registerComponents(entries: Record<string, AppRegistryEntry>): void;
765
+ declare const CORE_REGISTRY: Record<string, AppRegistryEntry>;
766
+
767
+ interface FdeDesktopProps {
768
+ children?: react__default.ReactNode;
769
+ fallback?: react__default.ReactNode;
770
+ theme?: PartialFdeTheme;
771
+ mantineTheme?: MantineThemeOverride;
772
+ fileSystem?: IFileSystem;
773
+ initialMode?: ThemeMode;
774
+ customApps?: Record<string, AppRegistryEntry>;
775
+ onError?: (error: Error) => void;
776
+ /** URL or import of the default wallpaper image */
777
+ defaultWallpaper?: string;
778
+ /** App ID to open on startup */
779
+ initialApp?: string;
780
+ /** Loaders to prefetch in the background after startup */
781
+ prefetchLoaders?: Array<{
782
+ id: string;
783
+ loader: () => Promise<unknown>;
784
+ }>;
785
+ }
786
+ declare function FdeDesktop({ children, fallback, theme, mantineTheme, fileSystem, initialMode, customApps, onError, defaultWallpaper, initialApp, prefetchLoaders, }: FdeDesktopProps): react__default.ReactElement;
787
+
788
+ declare const Window: FC<WindowProps>;
789
+
790
+ declare const AppReadyProvider: FC<{
791
+ children: ReactNode;
792
+ }>;
793
+
794
+ interface AppReadyContextValue {
795
+ notifyReady: (contentData?: Record<string, unknown>) => void;
796
+ getContentData: () => Record<string, unknown> | undefined;
797
+ }
798
+ declare const useAppReady: () => AppReadyContextValue;
799
+
800
+ declare const FilesAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
801
+ declare const NotesAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
802
+ declare const ImageViewerAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
803
+ declare const PdfAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
804
+ declare const MenuEditAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
805
+ declare const UploaderAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
806
+ declare const SettingsAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
807
+ declare const DeviceInfoAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
808
+ declare const CalendarAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
809
+ declare const CreateItemAppLazy: react.LazyExoticComponent<react.FC<WindowContentProps>>;
810
+ declare const NotesMenuBarLazy: MenuBarComponent;
811
+ declare const MenuEditMenuBarLazy: MenuBarComponent;
812
+ declare const SettingsMenuBarLazy: MenuBarComponent;
813
+ declare const PdfMenuBarLazy: MenuBarComponent;
814
+ declare const ImageViewerMenuBarLazy: MenuBarComponent;
815
+
816
+ interface AppMenuBarProps {
817
+ elements: AppMenuElement[];
818
+ }
819
+ declare const AppMenuBar: FC<AppMenuBarProps>;
820
+
821
+ interface TaskbarProps {
822
+ calendarSlot?: ReactNode;
823
+ }
824
+ declare const Taskbar: FC<TaskbarProps>;
825
+
826
+ declare const LanguageSelector: FC;
827
+
828
+ declare const Launcher: FC<LauncherProps>;
829
+
830
+ declare const TaskbarContextMenu: FC<TaskbarContextMenuProps>;
831
+
832
+ interface DesktopProps extends DesktopAreaProps {
833
+ wallpaper?: string;
834
+ backgroundColor?: string;
835
+ }
836
+ declare const Desktop: FC<DesktopProps>;
837
+
838
+ declare const DesktopIcon: FC<DesktopIconProps>;
839
+
840
+ interface DynamicMenuBarRendererProps {
841
+ component?: MenuBarComponent;
842
+ windowId: string;
843
+ contentData: Record<string, unknown> | undefined;
844
+ onExit: () => void;
845
+ }
846
+ declare const DynamicMenuBarRenderer: FC<DynamicMenuBarRendererProps>;
847
+
848
+ declare const ContextMenu: FC<DesktopContextMenuProps>;
849
+
850
+ interface CreateItemContextMenuProps {
851
+ owner: string;
852
+ parentId: string | null;
853
+ currentPath: string;
854
+ }
855
+ declare const CreateItemContextMenu: FC<CreateItemContextMenuProps>;
856
+
857
+ declare const CalendarApp: FC<WindowContentProps>;
858
+
859
+ declare const FilesApp: FC<WindowContentProps>;
860
+
861
+ declare const NotesApp: FC<WindowContentProps>;
862
+
863
+ declare const ImageViewerApp: FC<WindowContentProps>;
864
+
865
+ declare const PdfApp: FC<WindowContentProps>;
866
+
867
+ declare const MenuEditApp: FC<WindowContentProps>;
868
+
869
+ declare const UploaderApp: FC<WindowContentProps>;
870
+
871
+ declare const StorybookApp: FC<WindowContentProps>;
872
+
873
+ declare const SettingsApp: FC<WindowContentProps>;
874
+
875
+ declare const DeviceInfoApp: FC<WindowContentProps>;
876
+
877
+ interface SettingsSection$1 {
878
+ id: 'wallpaper' | 'appearance' | 'launcher' | 'font' | 'language' | 'reset';
879
+ label: string;
880
+ fcIcon: string;
881
+ description: string;
882
+ }
883
+ declare const SETTINGS_SECTIONS: SettingsSection$1[];
884
+
885
+ declare const NotesMenuBar: FC<MenuBarComponentProps>;
886
+
887
+ declare const MenuEditMenuBar: FC<MenuBarComponentProps>;
888
+
889
+ declare const SettingsMenuBar: FC<MenuBarComponentProps>;
890
+
891
+ declare const PdfMenuBar: FC<MenuBarComponentProps>;
892
+
893
+ declare const ImageViewerMenuBar: FC<MenuBarComponentProps>;
894
+
895
+ interface AppIconProps {
896
+ fcIcon?: string;
897
+ fallback?: string;
898
+ iconUrl?: string;
899
+ size?: number;
900
+ color?: string;
901
+ }
902
+ declare const AppIcon: FC<AppIconProps>;
903
+
904
+ interface VscIconProps {
905
+ name: string;
906
+ size?: number;
907
+ color?: string;
908
+ }
909
+ declare const VscIcon: FC<VscIconProps>;
910
+
911
+ interface AppLoadingProps {
912
+ message?: string;
913
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
914
+ }
915
+ declare const AppLoading: FC<AppLoadingProps>;
916
+
917
+ interface DirtyIndicatorProps {
918
+ size?: number;
919
+ }
920
+ declare const DirtyIndicator: FC<DirtyIndicatorProps>;
921
+
922
+ declare const ContextMenuAnchor: FC<MenuPosition>;
923
+
924
+ declare const FileIcon: FC<FileIconProps>;
925
+
926
+ interface AppEmptyStateProps {
927
+ label?: string;
928
+ }
929
+ declare const AppEmptyState: FC<AppEmptyStateProps>;
930
+
931
+ interface ColorPickerProps {
932
+ value: string;
933
+ onChange: (color: string) => void;
934
+ error?: string;
935
+ disabled?: boolean;
936
+ }
937
+ declare const ColorPicker: FC<ColorPickerProps>;
938
+
939
+ declare const CreateItemApp: FC<WindowContentProps>;
940
+
941
+ type DownloadStatus = 'idle' | 'downloading' | 'done' | 'error';
942
+ interface DownloadState {
943
+ status: DownloadStatus;
944
+ loaded: number;
945
+ total: number | null;
946
+ percent: number | null;
947
+ error: string | null;
948
+ }
949
+ interface UseDownloadReturn extends DownloadState {
950
+ download: (url: string) => Promise<string | null>;
951
+ reset: () => void;
952
+ }
953
+ declare const useDownload: () => UseDownloadReturn;
954
+
955
+ interface DownloadProgressProps {
956
+ state: DownloadState;
957
+ ariaLabel?: string;
958
+ minDisplayTime?: number;
959
+ }
960
+ declare const DownloadProgress: FC<DownloadProgressProps>;
961
+
962
+ interface FilePickerAppProps {
963
+ acceptedMimeTypes?: string[];
964
+ onConfirm: (node: FileNode) => void;
965
+ onCancel: () => void;
966
+ }
967
+ declare const FilePickerApp: FC<FilePickerAppProps>;
968
+ interface FilePickerModalProps extends FilePickerAppProps {
969
+ opened: boolean;
970
+ }
971
+ declare const FilePickerModal: FC<FilePickerModalProps>;
972
+
973
+ interface PickerModalProps {
974
+ opened: boolean;
975
+ children: ReactNode;
976
+ ariaLabelKey: string;
977
+ ariaLabelNs?: string;
978
+ }
979
+ declare const PickerModal: react.NamedExoticComponent<PickerModalProps>;
980
+
981
+ interface IconColorPickerProps {
982
+ selectedIcon: string;
983
+ selectedColor: string;
984
+ onIconChange: (icon: string) => void;
985
+ onColorChange: (color: string) => void;
986
+ colorError?: string;
987
+ }
988
+ declare const IconColorPicker: FC<IconColorPickerProps>;
989
+
990
+ interface SettingsSectionProps {
991
+ title: string;
992
+ description?: string;
993
+ children: ReactNode;
994
+ }
995
+ declare const SettingsSection: FC<SettingsSectionProps>;
996
+
997
+ interface ExternalLinkAppConfig {
998
+ icon: string;
999
+ iconColor: string;
1000
+ title: string;
1001
+ url: string;
1002
+ buttonLabel: string;
1003
+ description?: string;
1004
+ }
1005
+ declare const ExternalLinkApp: FC<WindowContentProps & {
1006
+ config: ExternalLinkAppConfig;
1007
+ }>;
1008
+
1009
+ declare const SUPPORTED_LANGUAGES$1: readonly ["en", "es"];
1010
+ type SupportedLanguage$1 = (typeof SUPPORTED_LANGUAGES$1)[number];
1011
+
1012
+ interface LanguageFlagProps {
1013
+ lang: SupportedLanguage$1;
1014
+ size?: number;
1015
+ }
1016
+ declare const LanguageFlag: FC<LanguageFlagProps>;
1017
+
1018
+ interface CollapsibleSectionProps {
1019
+ title: string;
1020
+ fcIcon?: string;
1021
+ expanded: boolean;
1022
+ onToggle: () => void;
1023
+ children: ReactNode;
1024
+ className?: string;
1025
+ 'aria-label'?: string;
1026
+ }
1027
+ declare const CollapsibleSection: FC<CollapsibleSectionProps>;
1028
+
1029
+ interface CustomAppLoaderProps {
1030
+ appId: string;
1031
+ windowIcon?: string;
1032
+ notifyReady?: WindowContentProps['notifyReady'];
1033
+ }
1034
+ declare const CustomAppLoader: FC<CustomAppLoaderProps>;
1035
+
1036
+ interface CustomAppLoadingScreenProps {
1037
+ progress: LoadingProgress;
1038
+ windowIcon?: string;
1039
+ }
1040
+ declare const CustomAppLoadingScreen: FC<CustomAppLoadingScreenProps>;
1041
+
1042
+ interface CustomAppOfflineProps {
1043
+ appId: string;
1044
+ }
1045
+ declare const CustomAppOffline: FC<CustomAppOfflineProps>;
1046
+
1047
+ interface CustomAppNotSupportedProps {
1048
+ appId: string;
1049
+ }
1050
+ declare const CustomAppNotSupported: FC<CustomAppNotSupportedProps>;
1051
+
1052
+ declare const registerCloseInterceptor: (windowId: string, interceptor: () => boolean) => void;
1053
+ declare const unregisterCloseInterceptor: (windowId: string) => void;
1054
+ declare const getCloseInterceptor: (windowId: string) => (() => boolean) | undefined;
1055
+ interface UseCloseInterceptorOptions {
1056
+ isDirtyGetter: () => boolean;
1057
+ windowId?: string;
1058
+ onDiscard?: () => void;
1059
+ onSave?: () => void;
1060
+ }
1061
+ declare function useCloseInterceptor({ isDirtyGetter, windowId, onDiscard, onSave, }: UseCloseInterceptorOptions): void;
1062
+
1063
+ declare function useAppName(appId: string | undefined): string;
1064
+
1065
+ declare function useFolderName(folder: {
1066
+ id: string;
1067
+ name: string;
1068
+ isPredefined: boolean;
1069
+ }): string;
1070
+
1071
+ declare const useClock: () => string;
1072
+
1073
+ declare const useAnimationDuration: () => {
1074
+ duration: number;
1075
+ windowVariants: framer_motion.Variants;
1076
+ panelVariants: {
1077
+ initial: {
1078
+ opacity: number;
1079
+ y: number;
1080
+ scale: number;
1081
+ };
1082
+ animate: {
1083
+ opacity: number;
1084
+ y: number;
1085
+ scale: number;
1086
+ transition: framer_motion.Transition;
1087
+ };
1088
+ exit: {
1089
+ opacity: number;
1090
+ y: number;
1091
+ scale: number;
1092
+ transition: framer_motion.Transition;
1093
+ };
1094
+ };
1095
+ minimizeVariant: (deltaX: number, deltaY: number) => framer_motion.TargetAndTransition;
1096
+ restoreVariant: (deltaX: number, deltaY: number) => framer_motion.TargetAndTransition;
1097
+ maximizeTransition: framer_motion.Transition;
1098
+ easeIn: framer_motion.Transition;
1099
+ easeOut: framer_motion.Transition;
1100
+ };
1101
+
1102
+ type IconLibrary = 'fi' | 'fc' | 'vsc';
1103
+ declare const useDynamicIcon: (name: string, library: IconLibrary) => IconType | null;
1104
+ declare const useDynamicIconElement: (name: string, library: IconLibrary, props?: IconBaseProps) => ReactElement | null;
1105
+ declare const useFiIcon: (name: string) => IconType | null;
1106
+ declare const useFcIcon: (name: string) => IconType | null;
1107
+ declare const useVscIcon: (name: string) => IconType | null;
1108
+ declare const useFiIconElement: (name: string, props?: IconBaseProps) => ReactElement | null;
1109
+ declare const useFcIconElement: (name: string, props?: IconBaseProps) => ReactElement | null;
1110
+ declare const useVscIconElement: (name: string, props?: IconBaseProps) => ReactElement | null;
1111
+
1112
+ declare const useTaskbarHeight: (opened: boolean) => {
1113
+ menuRef: react.RefObject<HTMLDivElement | null>;
1114
+ menuHeight: number;
1115
+ };
1116
+
1117
+ type TaskbarMenuType = 'window' | 'panel' | 'launcher' | null;
1118
+ interface UseTaskbarContextMenuReturn {
1119
+ activeMenu: TaskbarMenuType;
1120
+ position: MenuPosition;
1121
+ targetWindowId: string | null;
1122
+ windowMenuOpened: boolean;
1123
+ panelMenuOpened: boolean;
1124
+ launcherMenuOpened: boolean;
1125
+ openWindowMenu: (e: React.MouseEvent, windowId: string) => void;
1126
+ openPanelMenu: (e: React.MouseEvent) => void;
1127
+ openLauncherMenu: (e: React.MouseEvent) => void;
1128
+ closeMenu: () => void;
1129
+ }
1130
+ declare const useTaskbarContextMenu: () => UseTaskbarContextMenuReturn;
1131
+
1132
+ declare function useCollapsible(initialExpanded?: Set<string>): {
1133
+ expanded: Set<string>;
1134
+ toggle: (id: string) => void;
1135
+ expand: (id: string) => void;
1136
+ collapse: (id: string) => void;
1137
+ expandAll: (ids: string[]) => void;
1138
+ collapseAll: () => void;
1139
+ reset: () => void;
1140
+ isExpanded: (id: string) => boolean;
1141
+ };
1142
+
1143
+ declare function useSearchFilter<T>(items: T[], searchQuery: string, getSearchableText: (item: T) => string | string[]): T[];
1144
+
1145
+ interface RegistryContextValue {
1146
+ register: (id: string, rect: DOMRect) => void;
1147
+ unregister: (id: string) => void;
1148
+ getRect: (id: string) => DOMRect | undefined;
1149
+ }
1150
+ declare const WindowButtonRegistryProvider: FC<{
1151
+ children: ReactNode;
1152
+ }>;
1153
+ declare const useWindowButtonRegistry: () => RegistryContextValue;
1154
+
1155
+ declare const AVAILABLE_FONTS: {
1156
+ value: string;
1157
+ label: string;
1158
+ stack: string;
1159
+ }[];
1160
+ declare const FONT_STACKS: Record<string, string>;
1161
+ declare const GOOGLE_FONTS_HREF: Record<string, string>;
1162
+
1163
+ /**
1164
+ * Applies the currently selected font stack to the document root.
1165
+ * Also re-injects <link> tags for all previously downloaded fonts on mount.
1166
+ */
1167
+ declare const useApplyFont: () => void;
1168
+
1169
+ declare const useAppUpdate: () => void;
1170
+
1171
+ interface UseContextMenuReturn {
1172
+ opened: boolean;
1173
+ position: MenuPosition;
1174
+ open: (e: MouseEvent, offsetY?: number) => void;
1175
+ close: () => void;
1176
+ }
1177
+ declare const useContextMenu: (offsetY?: number, appId?: string) => UseContextMenuReturn;
1178
+
1179
+ type DragItemType = 'app' | 'file' | 'folder';
1180
+ type DropTargetType = 'launcher-folder' | 'filesystem-folder' | 'desktop' | 'available-apps';
1181
+ interface DragItemData {
1182
+ type: DragItemType;
1183
+ id: string;
1184
+ name: string;
1185
+ sourceId: string;
1186
+ sourceType: DropTargetType;
1187
+ metadata?: {
1188
+ fcIcon?: string;
1189
+ iconUrl?: string;
1190
+ icon?: string;
1191
+ iconColor?: string;
1192
+ };
1193
+ }
1194
+ interface DropTarget {
1195
+ type: DropTargetType;
1196
+ id: string;
1197
+ name: string;
1198
+ accepts: DragItemType[];
1199
+ }
1200
+ interface DragDropContextValue {
1201
+ activeItem: DragItemData | null;
1202
+ overTarget: DropTarget | null;
1203
+ }
1204
+
1205
+ interface DragDropProviderProps {
1206
+ children: ReactNode;
1207
+ onDrop: (item: DragItemData, target: DropTarget) => void;
1208
+ onCancel?: () => void;
1209
+ }
1210
+ declare const DragDropProvider: FC<DragDropProviderProps>;
1211
+
1212
+ interface UseDraggableItemOptions {
1213
+ item: DragItemData;
1214
+ disabled?: boolean;
1215
+ }
1216
+ interface UseDraggableItemReturn {
1217
+ attributes: React.HTMLAttributes<HTMLElement>;
1218
+ listeners: Record<string, unknown> | undefined;
1219
+ setNodeRef: (node: HTMLElement | null) => void;
1220
+ isDragging: boolean;
1221
+ transform: {
1222
+ x: number;
1223
+ y: number;
1224
+ } | null;
1225
+ style: React.CSSProperties;
1226
+ }
1227
+ declare function useDraggableItem(options: UseDraggableItemOptions): UseDraggableItemReturn;
1228
+
1229
+ interface UseDroppableAreaOptions {
1230
+ target: DropTarget;
1231
+ disabled?: boolean;
1232
+ }
1233
+ interface UseDroppableAreaReturn {
1234
+ setNodeRef: (node: HTMLElement | null) => void;
1235
+ isOver: boolean;
1236
+ active: DragItemData | null;
1237
+ }
1238
+ declare function useDroppableArea(options: UseDroppableAreaOptions): UseDroppableAreaReturn;
1239
+
1240
+ declare function useDragDropState(): DragDropContextValue;
1241
+
1242
+ interface FontDownloadProgress {
1243
+ status: 'idle' | 'downloading' | 'done' | 'error';
1244
+ loaded: number;
1245
+ total: number | null;
1246
+ percent: number | null;
1247
+ error: string | null;
1248
+ }
1249
+ interface FontDownloadResult {
1250
+ font: string;
1251
+ success: boolean;
1252
+ }
1253
+ declare const useFontDownload: (font: string | null) => {
1254
+ progress: FontDownloadProgress;
1255
+ isDownloaded: boolean;
1256
+ reset: () => void;
1257
+ data: FontDownloadResult;
1258
+ error: Error;
1259
+ isError: true;
1260
+ isPending: false;
1261
+ isLoading: false;
1262
+ isLoadingError: false;
1263
+ isRefetchError: true;
1264
+ isSuccess: false;
1265
+ isPlaceholderData: false;
1266
+ status: "error";
1267
+ dataUpdatedAt: number;
1268
+ errorUpdatedAt: number;
1269
+ failureCount: number;
1270
+ failureReason: Error | null;
1271
+ errorUpdateCount: number;
1272
+ isFetched: boolean;
1273
+ isFetchedAfterMount: boolean;
1274
+ isFetching: boolean;
1275
+ isInitialLoading: boolean;
1276
+ isPaused: boolean;
1277
+ isRefetching: boolean;
1278
+ isStale: boolean;
1279
+ isEnabled: boolean;
1280
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<FontDownloadResult, Error>>;
1281
+ fetchStatus: _tanstack_react_query.FetchStatus;
1282
+ promise: Promise<FontDownloadResult>;
1283
+ } | {
1284
+ progress: FontDownloadProgress;
1285
+ isDownloaded: boolean;
1286
+ reset: () => void;
1287
+ data: FontDownloadResult;
1288
+ error: null;
1289
+ isError: false;
1290
+ isPending: false;
1291
+ isLoading: false;
1292
+ isLoadingError: false;
1293
+ isRefetchError: false;
1294
+ isSuccess: true;
1295
+ isPlaceholderData: false;
1296
+ status: "success";
1297
+ dataUpdatedAt: number;
1298
+ errorUpdatedAt: number;
1299
+ failureCount: number;
1300
+ failureReason: Error | null;
1301
+ errorUpdateCount: number;
1302
+ isFetched: boolean;
1303
+ isFetchedAfterMount: boolean;
1304
+ isFetching: boolean;
1305
+ isInitialLoading: boolean;
1306
+ isPaused: boolean;
1307
+ isRefetching: boolean;
1308
+ isStale: boolean;
1309
+ isEnabled: boolean;
1310
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<FontDownloadResult, Error>>;
1311
+ fetchStatus: _tanstack_react_query.FetchStatus;
1312
+ promise: Promise<FontDownloadResult>;
1313
+ } | {
1314
+ progress: FontDownloadProgress;
1315
+ isDownloaded: boolean;
1316
+ reset: () => void;
1317
+ data: undefined;
1318
+ error: Error;
1319
+ isError: true;
1320
+ isPending: false;
1321
+ isLoading: false;
1322
+ isLoadingError: true;
1323
+ isRefetchError: false;
1324
+ isSuccess: false;
1325
+ isPlaceholderData: false;
1326
+ status: "error";
1327
+ dataUpdatedAt: number;
1328
+ errorUpdatedAt: number;
1329
+ failureCount: number;
1330
+ failureReason: Error | null;
1331
+ errorUpdateCount: number;
1332
+ isFetched: boolean;
1333
+ isFetchedAfterMount: boolean;
1334
+ isFetching: boolean;
1335
+ isInitialLoading: boolean;
1336
+ isPaused: boolean;
1337
+ isRefetching: boolean;
1338
+ isStale: boolean;
1339
+ isEnabled: boolean;
1340
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<FontDownloadResult, Error>>;
1341
+ fetchStatus: _tanstack_react_query.FetchStatus;
1342
+ promise: Promise<FontDownloadResult>;
1343
+ } | {
1344
+ progress: FontDownloadProgress;
1345
+ isDownloaded: boolean;
1346
+ reset: () => void;
1347
+ data: undefined;
1348
+ error: null;
1349
+ isError: false;
1350
+ isPending: true;
1351
+ isLoading: true;
1352
+ isLoadingError: false;
1353
+ isRefetchError: false;
1354
+ isSuccess: false;
1355
+ isPlaceholderData: false;
1356
+ status: "pending";
1357
+ dataUpdatedAt: number;
1358
+ errorUpdatedAt: number;
1359
+ failureCount: number;
1360
+ failureReason: Error | null;
1361
+ errorUpdateCount: number;
1362
+ isFetched: boolean;
1363
+ isFetchedAfterMount: boolean;
1364
+ isFetching: boolean;
1365
+ isInitialLoading: boolean;
1366
+ isPaused: boolean;
1367
+ isRefetching: boolean;
1368
+ isStale: boolean;
1369
+ isEnabled: boolean;
1370
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<FontDownloadResult, Error>>;
1371
+ fetchStatus: _tanstack_react_query.FetchStatus;
1372
+ promise: Promise<FontDownloadResult>;
1373
+ } | {
1374
+ progress: FontDownloadProgress;
1375
+ isDownloaded: boolean;
1376
+ reset: () => void;
1377
+ data: undefined;
1378
+ error: null;
1379
+ isError: false;
1380
+ isPending: true;
1381
+ isLoadingError: false;
1382
+ isRefetchError: false;
1383
+ isSuccess: false;
1384
+ isPlaceholderData: false;
1385
+ status: "pending";
1386
+ dataUpdatedAt: number;
1387
+ errorUpdatedAt: number;
1388
+ failureCount: number;
1389
+ failureReason: Error | null;
1390
+ errorUpdateCount: number;
1391
+ isFetched: boolean;
1392
+ isFetchedAfterMount: boolean;
1393
+ isFetching: boolean;
1394
+ isLoading: boolean;
1395
+ isInitialLoading: boolean;
1396
+ isPaused: boolean;
1397
+ isRefetching: boolean;
1398
+ isStale: boolean;
1399
+ isEnabled: boolean;
1400
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<FontDownloadResult, Error>>;
1401
+ fetchStatus: _tanstack_react_query.FetchStatus;
1402
+ promise: Promise<FontDownloadResult>;
1403
+ } | {
1404
+ progress: FontDownloadProgress;
1405
+ isDownloaded: boolean;
1406
+ reset: () => void;
1407
+ data: FontDownloadResult;
1408
+ isError: false;
1409
+ error: null;
1410
+ isPending: false;
1411
+ isLoading: false;
1412
+ isLoadingError: false;
1413
+ isRefetchError: false;
1414
+ isSuccess: true;
1415
+ isPlaceholderData: true;
1416
+ status: "success";
1417
+ dataUpdatedAt: number;
1418
+ errorUpdatedAt: number;
1419
+ failureCount: number;
1420
+ failureReason: Error | null;
1421
+ errorUpdateCount: number;
1422
+ isFetched: boolean;
1423
+ isFetchedAfterMount: boolean;
1424
+ isFetching: boolean;
1425
+ isInitialLoading: boolean;
1426
+ isPaused: boolean;
1427
+ isRefetching: boolean;
1428
+ isStale: boolean;
1429
+ isEnabled: boolean;
1430
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<FontDownloadResult, Error>>;
1431
+ fetchStatus: _tanstack_react_query.FetchStatus;
1432
+ promise: Promise<FontDownloadResult>;
1433
+ };
1434
+
1435
+ interface UseIsDirtyOptions<T> {
1436
+ /** Mutable ref that holds the snapshot (used internally). */
1437
+ snapshotRef: React.MutableRefObject<T | null>;
1438
+ /** Function that returns the current state of the app. */
1439
+ getCurrentState: () => T;
1440
+ /** Optional initial snapshot – used when no stored snapshot exists. */
1441
+ initialSnapshot?: T;
1442
+ /** Optional callback invoked when the dirty flag changes. */
1443
+ onChange?: (isDirty: boolean) => void;
1444
+ /** Unique identifier for the app – used to persist the snapshot in the global store. */
1445
+ appId?: string;
1446
+ }
1447
+ declare function useIsDirty<T>({ snapshotRef, getCurrentState, initialSnapshot, onChange, appId, }: UseIsDirtyOptions<T>): {
1448
+ isDirty: boolean;
1449
+ takeSnapshot: () => void;
1450
+ reset: () => void;
1451
+ };
1452
+
1453
+ declare function useLanguageSync(): void;
1454
+
1455
+ declare class IndexedDBFileSystem implements IFileSystem {
1456
+ private db;
1457
+ private nodes;
1458
+ private ready;
1459
+ private initPromise;
1460
+ private persistQueue;
1461
+ private persistScheduled;
1462
+ initialize(): Promise<void>;
1463
+ private doInitialize;
1464
+ private openDatabase;
1465
+ private loadNodes;
1466
+ private migrateFromLocalStorage;
1467
+ isReady(): boolean;
1468
+ reinitialize(): Promise<void>;
1469
+ private persistAllNodes;
1470
+ private schedulePersist;
1471
+ private flushPersistQueue;
1472
+ private persistNode;
1473
+ private deleteNodeFromPersist;
1474
+ saveBlob(blob: Blob): Promise<string>;
1475
+ getBlob(url: string): Promise<Blob | null>;
1476
+ toBlobUrl(url: string): Promise<string | null>;
1477
+ clearBlobs(): Promise<void>;
1478
+ readFile(_path: string): Promise<string>;
1479
+ writeFile(_path: string, _content: string): Promise<void>;
1480
+ getNode(id: string): FSNode | undefined;
1481
+ getChildren(folderId: string): FSNode[];
1482
+ getRootNodes(): FSNode[];
1483
+ getAllNodes(): FSNode[];
1484
+ isEmpty(): boolean;
1485
+ createFile(name: string, content: string, parentId: string | null, url?: string): Promise<FileNode>;
1486
+ createFolder(name: string, parentId: string | null, iconName?: string, iconColor?: string): Promise<FolderNode>;
1487
+ updateFile(id: string, content: string): Promise<FileNode>;
1488
+ move(id: string, newParentId: string | null): Promise<FSNode>;
1489
+ delete(id: string): Promise<void>;
1490
+ getManifestSha(): Promise<string | null>;
1491
+ saveManifestSha(sha: string): Promise<void>;
1492
+ clearAll(): Promise<void>;
1493
+ seed(manifest: FsManifest): Promise<void>;
1494
+ mergeSeed(manifest: FsManifest): Promise<void>;
1495
+ private buildFolderMapFromManifest;
1496
+ private addChildToFolder;
1497
+ private removeChildFromParent;
1498
+ private deleteRecursive;
1499
+ }
1500
+
1501
+ declare function setApiBaseUrl(url: string): void;
1502
+ declare class DockerFileSystemAdapter implements IFileSystem {
1503
+ private nodes;
1504
+ private pathToId;
1505
+ private ready;
1506
+ private rootFolderId;
1507
+ private initPromise;
1508
+ constructor();
1509
+ initialize(): Promise<void>;
1510
+ private doInitialize;
1511
+ reinitialize(): Promise<void>;
1512
+ isReady(): boolean;
1513
+ isEmpty(): boolean;
1514
+ getNode(id: string): FSNode | undefined;
1515
+ getChildren(folderId: string): FSNode[];
1516
+ getRootNodes(): FSNode[];
1517
+ getAllNodes(): FSNode[];
1518
+ createFile(name: string, content: string, parentId: string | null, url?: string): Promise<FileNode>;
1519
+ createFolder(name: string, parentId: string | null, iconName?: string, iconColor?: string): Promise<FolderNode>;
1520
+ updateFile(id: string, content: string): Promise<FileNode>;
1521
+ move(id: string, newParentId: string | null): Promise<FSNode>;
1522
+ delete(id: string): Promise<void>;
1523
+ readFile(path: string): Promise<string>;
1524
+ writeFile(path: string, content: string): Promise<void>;
1525
+ saveBlob(blob: Blob): Promise<string>;
1526
+ getBlob(url: string): Promise<Blob | null>;
1527
+ toBlobUrl(url: string): Promise<string | null>;
1528
+ getManifestSha(): Promise<string | null>;
1529
+ saveManifestSha(_sha: string): Promise<void>;
1530
+ seed(_manifest: FsManifest): Promise<void>;
1531
+ mergeSeed(_manifest: FsManifest): Promise<void>;
1532
+ clearAll(): Promise<void>;
1533
+ private getMimeType;
1534
+ private getPathFromId;
1535
+ private deleteRecursive;
1536
+ private syncFromEntries;
1537
+ private fetchReaddir;
1538
+ private writeFileToServer;
1539
+ private createDirOnServer;
1540
+ private deleteFromServer;
1541
+ }
1542
+
1543
+ declare const fileSystem: IndexedDBFileSystem | DockerFileSystemAdapter;
1544
+ declare const resetFileSystem: () => void;
1545
+ declare const resetWindowManager: () => void;
1546
+ declare function resolveFileUrl(url: string, signal?: AbortSignal): Promise<string>;
1547
+ declare const useDesktopStore: zustand.UseBoundStore<Omit<zustand.StoreApi<DesktopState>, "setState" | "persist"> & {
1548
+ setState(partial: DesktopState | Partial<DesktopState> | ((state: DesktopState) => DesktopState | Partial<DesktopState>), replace?: false | undefined): unknown;
1549
+ setState(state: DesktopState | ((state: DesktopState) => DesktopState), replace: true): unknown;
1550
+ persist: {
1551
+ setOptions: (options: Partial<zustand_middleware.PersistOptions<DesktopState, unknown, unknown>>) => void;
1552
+ clearStorage: () => void;
1553
+ rehydrate: () => Promise<void> | void;
1554
+ hasHydrated: () => boolean;
1555
+ onHydrate: (fn: (state: DesktopState) => void) => () => void;
1556
+ onFinishHydration: (fn: (state: DesktopState) => void) => () => void;
1557
+ getOptions: () => Partial<zustand_middleware.PersistOptions<DesktopState, unknown, unknown>>;
1558
+ };
1559
+ }>;
1560
+
1561
+ declare const getPersistedThemeMode: () => ThemeMode | null;
1562
+ declare const useSettingsStore: zustand.UseBoundStore<Omit<zustand.StoreApi<ISettingsState>, "setState" | "persist"> & {
1563
+ setState(partial: ISettingsState | Partial<ISettingsState> | ((state: ISettingsState) => ISettingsState | Partial<ISettingsState>), replace?: false | undefined): unknown;
1564
+ setState(state: ISettingsState | ((state: ISettingsState) => ISettingsState), replace: true): unknown;
1565
+ persist: {
1566
+ setOptions: (options: Partial<zustand_middleware.PersistOptions<ISettingsState, unknown, unknown>>) => void;
1567
+ clearStorage: () => void;
1568
+ rehydrate: () => Promise<void> | void;
1569
+ hasHydrated: () => boolean;
1570
+ onHydrate: (fn: (state: ISettingsState) => void) => () => void;
1571
+ onFinishHydration: (fn: (state: ISettingsState) => void) => () => void;
1572
+ getOptions: () => Partial<zustand_middleware.PersistOptions<ISettingsState, unknown, unknown>>;
1573
+ };
1574
+ }>;
1575
+
1576
+ declare const useCustomAppStore: zustand.UseBoundStore<zustand.StoreApi<CustomAppState>>;
1577
+
1578
+ interface AppTempMemoryState {
1579
+ snapshots: Record<string, unknown>;
1580
+ setSnapshot: (appId: string, snapshot: unknown) => void;
1581
+ getSnapshot: (appId: string) => unknown | null;
1582
+ clearSnapshot: (appId: string) => void;
1583
+ }
1584
+ declare const useAppTempMemoryStore: zustand.UseBoundStore<Omit<zustand.StoreApi<AppTempMemoryState>, "setState" | "persist"> & {
1585
+ setState(partial: AppTempMemoryState | Partial<AppTempMemoryState> | ((state: AppTempMemoryState) => AppTempMemoryState | Partial<AppTempMemoryState>), replace?: false | undefined): unknown;
1586
+ setState(state: AppTempMemoryState | ((state: AppTempMemoryState) => AppTempMemoryState), replace: true): unknown;
1587
+ persist: {
1588
+ setOptions: (options: Partial<zustand_middleware.PersistOptions<AppTempMemoryState, unknown, unknown>>) => void;
1589
+ clearStorage: () => void;
1590
+ rehydrate: () => Promise<void> | void;
1591
+ hasHydrated: () => boolean;
1592
+ onHydrate: (fn: (state: AppTempMemoryState) => void) => () => void;
1593
+ onFinishHydration: (fn: (state: AppTempMemoryState) => void) => () => void;
1594
+ getOptions: () => Partial<zustand_middleware.PersistOptions<AppTempMemoryState, unknown, unknown>>;
1595
+ };
1596
+ }>;
1597
+
1598
+ interface CloseModalState {
1599
+ isOpen: boolean;
1600
+ windowId: string | null;
1601
+ onSave: (() => void) | null;
1602
+ onDiscard: (() => void) | null;
1603
+ }
1604
+ interface CloseModalActions {
1605
+ openModal: (windowId: string, onSave: () => void, onDiscard: () => void) => void;
1606
+ closeModal: () => void;
1607
+ }
1608
+ declare const useCloseModalStore: zustand.UseBoundStore<zustand.StoreApi<CloseModalState & CloseModalActions>>;
1609
+
1610
+ interface AdaptiveDimensions {
1611
+ defaultWidth: number;
1612
+ defaultHeight: number;
1613
+ minWidth: number;
1614
+ minHeight: number;
1615
+ }
1616
+ declare function useAdaptiveDimensions(): AdaptiveDimensions;
1617
+
1618
+ declare const useNotifications: () => {
1619
+ notifications: NotificationItem[];
1620
+ notify: (title: string, message: string, options?: {
1621
+ fcIcon?: string;
1622
+ onClose?: () => void;
1623
+ }) => string;
1624
+ dismiss: (id: string) => void;
1625
+ addNotification: (item: NotificationItem) => void;
1626
+ removeNotification: (id: string) => void;
1627
+ };
1628
+
1629
+ declare const useSystemTheme: () => void;
1630
+
1631
+ type OpenHookOptions = {
1632
+ contentData?: Record<string, unknown>;
1633
+ position?: {
1634
+ x: number;
1635
+ y: number;
1636
+ };
1637
+ };
1638
+ declare const useOpenApp: () => (appId: string, { contentData, position }?: OpenHookOptions) => void;
1639
+
1640
+ declare function useFdeApi(): FdeDesktopAPI | null;
1641
+
1642
+ declare function useResolvedUrl(url: string | undefined): string | undefined;
1643
+
1644
+ interface DeviceInfo {
1645
+ isMobile: boolean;
1646
+ isTablet: boolean;
1647
+ isDesktop: boolean;
1648
+ isPortrait: boolean;
1649
+ shouldShowWarning: boolean;
1650
+ screenWidth: number;
1651
+ screenHeight: number;
1652
+ }
1653
+ declare function useDeviceDetection(): DeviceInfo;
1654
+
1655
+ type AppReloadCallback = (appId: string) => void;
1656
+ type AppRegisteredCallback = (manifest: CustomAppManifest) => void;
1657
+ type AppUnregisteredCallback = (appId: string) => void;
1658
+ interface HMRCallbacks {
1659
+ onReload: AppReloadCallback;
1660
+ onRegistered?: AppRegisteredCallback;
1661
+ onUnregistered?: AppUnregisteredCallback;
1662
+ }
1663
+ /**
1664
+ * Reset connection state - useful for testing
1665
+ * @internal
1666
+ */
1667
+ declare function resetHMRState(): void;
1668
+ declare function checkHMREndpointExists(): Promise<boolean>;
1669
+ declare function useCustomAppHMR(callbacksArg: HMRCallbacks): void;
1670
+ declare function useCustomAppLifecycle(): void;
1671
+
1672
+ /**
1673
+ * Appends a dirty-indicator element to menu items if dirty.
1674
+ * Returns a new array when dirty (immutable), or the original array when not dirty.
1675
+ *
1676
+ * @param items - The array of menu elements
1677
+ * @param isDirty - Whether there are unsaved changes
1678
+ * @returns The same array if not dirty, or a new array with dirty-indicator appended
1679
+ *
1680
+ * @example
1681
+ * const items: AppMenuElement[] = [
1682
+ * { type: 'menu', label: 'File', items: [...] }
1683
+ * ];
1684
+ *
1685
+ * return appendDirtyIndicator(items, isDirty);
1686
+ */
1687
+ declare function appendDirtyIndicator(items: AppMenuElement[], isDirty: boolean): AppMenuElement[];
1688
+
1689
+ declare const injectFontLink: (font: string) => void;
1690
+
1691
+ type Runtime = 'browser' | 'docker' | 'electron';
1692
+ declare function getRuntime(): Runtime;
1693
+ declare function isDocker(): boolean;
1694
+ declare function isElectron(): boolean;
1695
+ declare function isBrowser(): boolean;
1696
+ declare function isDev(): boolean;
1697
+
1698
+ declare function generateUUID(): string;
1699
+
1700
+ declare function waitForContainer(containerId: string, timeout?: number): Promise<HTMLElement>;
1701
+
1702
+ declare function setTestBaseUrl(url: string | null): void;
1703
+ declare function getBaseUrl(): string;
1704
+ declare function resetBaseUrlCache(): void;
1705
+ declare function resolveUrl(relativeUrl: string): string;
1706
+
1707
+ declare const sortNodes: (nodes: FSNode[]) => FSNode[];
1708
+ declare const SortOptions: {
1709
+ readonly BY_TYPE: "byType";
1710
+ readonly BY_NAME: "byName";
1711
+ readonly BY_DATE: "byDate";
1712
+ };
1713
+ type SortOption = (typeof SortOptions)[keyof typeof SortOptions];
1714
+ type DesktopSortMode = 'default' | 'name-asc' | 'name-desc' | 'type';
1715
+ declare function sortDesktopIcons(icons: DesktopIconEntity[], desktopAppsOrder?: readonly string[]): DesktopIconEntity[];
1716
+ declare const sortDesktopIconsByMode: (icons: DesktopIconEntity[], mode: DesktopSortMode) => DesktopIconEntity[];
1717
+ declare const sortNodesByMode: (nodes: FSNode[], mode: DesktopSortMode) => FSNode[];
1718
+
1719
+ declare function formatBytes(bytes: number): string;
1720
+
1721
+ declare function hashBlob(blob: Blob): Promise<string>;
1722
+
1723
+ interface AppFileHandler {
1724
+ appId: string;
1725
+ mimeTypes: string[] | ((mimeType: string) => boolean);
1726
+ transformContentData: (node: FileNode) => Record<string, unknown>;
1727
+ }
1728
+ declare const registerAppFileHandler: (handler: AppFileHandler) => void;
1729
+ declare const IMAGE_MIME_TYPES: Set<string>;
1730
+ declare const TEXT_MIME_TYPES: Set<string>;
1731
+ declare function getAppIdForMime(mimeType: string | undefined): string;
1732
+ declare function getAppIdForMime(node: FileNode): {
1733
+ appId: string;
1734
+ contentData: Record<string, unknown>;
1735
+ } | null;
1736
+
1737
+ declare function getMimeTypeFromExtension(filename: string): string | undefined;
1738
+
1739
+ declare const getFileExtension: (name: string) => string;
1740
+
1741
+ declare function getFourRandomColors(count?: number): string[];
1742
+
1743
+ type Breadcrumb = {
1744
+ id: string | null;
1745
+ name: string;
1746
+ };
1747
+ declare const buildBreadcrumbs: (currentFolderId: string | null, fsNodes: FSNode[]) => Breadcrumb[];
1748
+
1749
+ declare const isNewerVersion: (latest: string, current: string) => boolean;
1750
+
1751
+ interface ClearBrowserDataOptions {
1752
+ keepIndexedDB?: boolean;
1753
+ keepServiceWorker?: boolean;
1754
+ keepLocalStorage?: boolean;
1755
+ keepSessionStorage?: boolean;
1756
+ }
1757
+ declare function clearBrowserData(options?: ClearBrowserDataOptions): Promise<void>;
1758
+
1759
+ declare const DEFAULT_WINDOW_DIMENSIONS: {
1760
+ readonly defaultWidth: 800;
1761
+ readonly defaultHeight: 600;
1762
+ readonly minWidth: 640;
1763
+ readonly minHeight: 480;
1764
+ };
1765
+ declare const CORE_APPS: AppEntry[];
1766
+ declare const CORE_APP_IDS: string[];
1767
+
1768
+ declare const ANIMATION_DURATION = 0.3;
1769
+ declare const createEaseIn: (duration: number) => Transition;
1770
+ declare const createEaseOut: (duration: number) => Transition;
1771
+ declare const createWindowVariants: (duration: number) => Variants;
1772
+ declare const createPanelVariants: (duration: number) => {
1773
+ initial: {
1774
+ opacity: number;
1775
+ y: number;
1776
+ scale: number;
1777
+ };
1778
+ animate: {
1779
+ opacity: number;
1780
+ y: number;
1781
+ scale: number;
1782
+ transition: Transition;
1783
+ };
1784
+ exit: {
1785
+ opacity: number;
1786
+ y: number;
1787
+ scale: number;
1788
+ transition: Transition;
1789
+ };
1790
+ };
1791
+ declare const createMinimizeVariant: (duration: number) => (deltaX: number, deltaY: number) => TargetAndTransition;
1792
+ declare const createRestoreVariant: (duration: number) => (deltaX: number, deltaY: number) => TargetAndTransition;
1793
+ declare const createMaximizeTransition: (duration: number) => Transition;
1794
+ declare const EASE_IN: Transition;
1795
+ declare const EASE_OUT: Transition;
1796
+ declare const windowVariants: Variants;
1797
+ declare const panelVariants: {
1798
+ initial: {
1799
+ opacity: number;
1800
+ y: number;
1801
+ scale: number;
1802
+ };
1803
+ animate: {
1804
+ opacity: number;
1805
+ y: number;
1806
+ scale: number;
1807
+ transition: Transition;
1808
+ };
1809
+ exit: {
1810
+ opacity: number;
1811
+ y: number;
1812
+ scale: number;
1813
+ transition: Transition;
1814
+ };
1815
+ };
1816
+ declare const minimizeVariant: (deltaX: number, deltaY: number) => TargetAndTransition;
1817
+ declare const restoreVariant: (deltaX: number, deltaY: number) => TargetAndTransition;
1818
+ declare const openVariants: {
1819
+ readonly scale: {
1820
+ readonly hidden: {
1821
+ readonly opacity: 0;
1822
+ readonly scale: 0.92;
1823
+ readonly y: 12;
1824
+ };
1825
+ readonly visible: {
1826
+ readonly opacity: 1;
1827
+ readonly scale: 1;
1828
+ readonly y: 0;
1829
+ readonly transition: Transition;
1830
+ };
1831
+ };
1832
+ readonly slide: {
1833
+ readonly hidden: {
1834
+ readonly opacity: 0;
1835
+ readonly y: 40;
1836
+ };
1837
+ readonly visible: {
1838
+ readonly opacity: 1;
1839
+ readonly y: 0;
1840
+ readonly transition: Transition;
1841
+ };
1842
+ };
1843
+ readonly fade: {
1844
+ readonly hidden: {
1845
+ readonly opacity: 0;
1846
+ };
1847
+ readonly visible: {
1848
+ readonly opacity: 1;
1849
+ readonly transition: Transition;
1850
+ };
1851
+ };
1852
+ };
1853
+ declare const maximizeTransition: Transition;
1854
+ declare const randomWindowPosition: () => {
1855
+ x: number;
1856
+ y: number;
1857
+ };
1858
+ declare const centerWindowPosition: (viewportWidth: number, viewportHeight: number, windowWidth: number, windowHeight: number) => {
1859
+ x: number;
1860
+ y: number;
1861
+ };
1862
+
1863
+ declare const BREAKPOINTS: {
1864
+ readonly MOBILE: 768;
1865
+ readonly TABLET: 1024;
1866
+ readonly DESKTOP: 1280;
1867
+ };
1868
+ type Breakpoint = (typeof BREAKPOINTS)[keyof typeof BREAKPOINTS];
1869
+
1870
+ declare const TASKBAR_HEIGHT = 48;
1871
+ declare const ICON_COLUMN_WIDTH = 80;
1872
+ declare const ICON_ROW_HEIGHT = 80;
1873
+ declare const ICON_MARGIN = 20;
1874
+ declare const DEFAULT_VIEWPORT_WIDTH: 1280;
1875
+ declare const DEFAULT_VIEWPORT_HEIGHT: 800;
1876
+
1877
+ declare const APP_IDS: {
1878
+ readonly WELCOME: "welcome";
1879
+ readonly NOTEPAD: "notepad";
1880
+ readonly UPLOADER: "uploader";
1881
+ readonly FILES: "files";
1882
+ readonly SETTINGS: "settings";
1883
+ readonly PDF: "pdf";
1884
+ readonly CALENDAR: "calendar";
1885
+ readonly STORYBOOK: "storybook";
1886
+ readonly LINKEDIN: "linkedin";
1887
+ readonly GITHUB: "github";
1888
+ readonly IMAGE_VIEWER: "image-viewer";
1889
+ readonly DOS_EMULATOR: "dos-emulator";
1890
+ readonly DOOM: "doom";
1891
+ readonly TERMINAL: "terminal";
1892
+ readonly CODE_SERVER: "code-server";
1893
+ readonly DEVICE_INFO: "device-info";
1894
+ readonly MENUEDIT: "menuedit";
1895
+ };
1896
+ declare const APP_ID_TO_TRANSLATION_KEY: Record<string, string>;
1897
+ type AppId = (typeof APP_IDS)[keyof typeof APP_IDS];
1898
+ declare const DESKTOP_APPS: AppId[];
1899
+
1900
+ declare const EXTRA_APPS: AppEntry[];
1901
+ declare const EXTRA_APP_IDS: string[];
1902
+
1903
+ declare const PRESET_COLORS: string[];
1904
+
1905
+ declare const DEFAULT_THEME_COLORS: Record<ThemeMode, Theme>;
1906
+
1907
+ declare const PRESET_ICONS: string[];
1908
+
1909
+ declare const CUSTOM_APPS_FOLDER_ID = "launcher-folder-custom-apps";
1910
+ declare const PREDEFINED_LAUNCHER_FOLDERS: LauncherFolder[];
1911
+ declare const DEFAULT_LAUNCHER_FOLDERS: LauncherFolder[];
1912
+
1913
+ declare const APPS: AppEntry[];
1914
+ declare const DESKTOP_APPS_ORDER: string[];
1915
+ declare function registerCustomApps(apps: AppEntry[]): void;
1916
+ declare function registerDesktopApps(appIds: string[]): void;
1917
+
1918
+ declare const GITHUB_RELEASES_REPO = "frannunpal/frannunpal.github.io";
1919
+ declare const GITHUB_LATEST_RELEASE_URL = "https://api.github.com/repos/frannunpal/frannunpal.github.io/releases/latest";
1920
+
1921
+ declare const PROFILE: {
1922
+ name: string;
1923
+ title: string;
1924
+ email: string;
1925
+ phone: string;
1926
+ location: string;
1927
+ linkedin: string;
1928
+ github: string;
1929
+ cvUrls: {
1930
+ en: string;
1931
+ es: string;
1932
+ };
1933
+ };
1934
+
1935
+ declare global {
1936
+ interface Window {
1937
+ __FDE_IN_DOCKER__?: boolean;
1938
+ }
1939
+ }
1940
+ declare const APP_VERSION: string;
1941
+
1942
+ declare const getVersionString: () => string;
1943
+ declare const getEnvironment: () => string;
1944
+ declare const getReleaseType: () => string;
1945
+
1946
+ declare class WindowManagerAdapter implements IWindowManager {
1947
+ private windows;
1948
+ private nextZIndex;
1949
+ private assignZIndex;
1950
+ reset(): void;
1951
+ loadWindows(windows: WindowEntity[]): void;
1952
+ getAll(): WindowEntity[];
1953
+ getById(id: string): WindowEntity | undefined;
1954
+ open(input: WindowInput): WindowEntity;
1955
+ close(id: string): void;
1956
+ minimize(id: string): void;
1957
+ maximize(id: string): void;
1958
+ restore(id: string): void;
1959
+ focus(id: string): void;
1960
+ move(id: string, x: number, y: number): void;
1961
+ resize(id: string, width: number, height: number): void;
1962
+ private updateWindow;
1963
+ }
1964
+
1965
+ declare class DefaultThemeProvider implements IThemeProvider {
1966
+ private mode;
1967
+ private customColors;
1968
+ constructor(initialMode?: ThemeMode);
1969
+ getTheme(): FdeTheme;
1970
+ setMode(mode: ThemeMode): void;
1971
+ setCustomColors(colors: CustomThemeColors | null): void;
1972
+ toggle(): void;
1973
+ }
1974
+
1975
+ declare const toMantineTheme: (theme: Theme) => MantineThemeOverride;
1976
+
1977
+ declare function initializeFdeApi(): void;
1978
+ declare function getFdeApi(): FdeDesktopAPI;
1979
+ declare function isFdeApiInitialized(): boolean;
1980
+
1981
+ type AppLoader = () => Promise<unknown>;
1982
+ declare function prefetchApps(apps: Array<{
1983
+ id: string;
1984
+ loader: AppLoader;
1985
+ }>): void;
1986
+
1987
+ /**
1988
+ * Storage Migration Utility
1989
+ *
1990
+ * Migrates legacy storage keys from 'fran-desktop' prefix to 'fde-desktop' prefix.
1991
+ * This migration is idempotent and safe to run multiple times.
1992
+ *
1993
+ * Migration includes:
1994
+ * - IndexedDB databases: fran-desktop-fs → fde-desktop-fs, fran-desktop-blobs → fde-desktop-blobs
1995
+ * - localStorage keys: fran-desktop:* → fde-desktop:*
1996
+ * - Zustand persist key: fran-desktop → fde-desktop
1997
+ */
1998
+ interface MigrationResult {
1999
+ indexedDB: {
2000
+ fs: boolean;
2001
+ blobs: boolean;
2002
+ };
2003
+ localStorage: {
2004
+ keysMigrated: number;
2005
+ };
2006
+ version: number;
2007
+ }
2008
+ /**
2009
+ * Runs the complete storage migration
2010
+ *
2011
+ * @returns MigrationResult with details about what was migrated
2012
+ */
2013
+ declare function migrateStorage(): Promise<MigrationResult>;
2014
+
2015
+ declare const SUPPORTED_LANGUAGES: readonly ["en", "es"];
2016
+ type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];
2017
+ declare const DEFAULT_LANGUAGE: SupportedLanguage;
2018
+
2019
+ export { ANIMATION_DURATION, APPS, APP_IDS, APP_ID_TO_TRANSLATION_KEY, APP_VERSION, AVAILABLE_FONTS, type AdaptiveDimensions, type AppComponent, AppEmptyState, type AppEntry, type AppFileHandler, AppIcon, type AppId, AppLoading, type AppLoadingProps, AppMenuBar, type AppMenuElement, type AppReadyContextValue, AppReadyProvider, type AppRegistration, type AppRegistryEntry, type AppsManifest, BREAKPOINTS, type Breadcrumb, type Breakpoint, CORE_APPS, CORE_APP_IDS, CORE_REGISTRY, CUSTOM_APPS_FOLDER_ID, CalendarApp, CalendarAppLazy, type ClearBrowserDataOptions, type ClipboardAction, type ClipboardState, CollapsibleSection, ColorPicker, ContextMenu, ContextMenuAnchor, type CreateFolderOptions, CreateItemApp, CreateItemAppLazy, CreateItemContextMenu, CustomAppLoader, CustomAppLoadingScreen, type CustomAppManifest, CustomAppNotSupported, CustomAppOffline, type CustomAppState, type CustomThemeColors, DEFAULT_FDE_THEME, DEFAULT_LANGUAGE, DEFAULT_LAUNCHER_FOLDERS, DEFAULT_THEME_COLORS, DEFAULT_VIEWPORT_HEIGHT, DEFAULT_VIEWPORT_WIDTH, DEFAULT_WINDOW_DIMENSIONS, DESKTOP_APPS, DESKTOP_APPS_ORDER, DefaultThemeProvider, Desktop, type DesktopAreaProps, type DesktopContextMenuProps, DesktopIcon, type DesktopIconEntity, type DesktopIconInput, type DesktopIconProps, type DesktopProps, type DesktopSortMode$1 as DesktopSortMode, type DesktopState, type DesktopTheme, type DeviceInfo, DeviceInfoApp, DeviceInfoAppLazy, DirtyIndicator, DockerFileSystemAdapter, DownloadProgress, type DownloadState, type DownloadStatus, DragDropProvider, type DropTargetType, DynamicMenuBarRenderer, EASE_IN, EASE_OUT, EXTRA_APPS, EXTRA_APP_IDS, ExternalLinkApp, FONT_STACKS, type FSNode, type FdeContextValue, FdeDesktop, type FdeDesktopAPI, type FdeDesktopProps, type FdeEventPayloads, type FdeEventType, FdeProvider, type FdeProviderProps, type FdeTheme, type FileDialogOptions, FileIcon, type FileIconProps, type FileNode, FilePickerApp, FilePickerModal, type FileSystemNode, type FileSystemNodeType, FilesApp, FilesAppLazy, type FolderNode, PickerModal as FolderPicker, type FontDownloadProgress, type FsManifest, type FsManifestFile, GITHUB_LATEST_RELEASE_URL, GITHUB_RELEASES_REPO, GOOGLE_FONTS_HREF, ICON_COLUMN_WIDTH, ICON_MARGIN, ICON_ROW_HEIGHT, type IFileSystem, IMAGE_MIME_TYPES, type ISettingsState, type IThemeProvider, type IWindowManager, IconColorPicker, ImageViewerApp, ImageViewerAppLazy, ImageViewerMenuBar, ImageViewerMenuBarLazy, IndexedDBFileSystem, LanguageFlag, LanguageSelector, Launcher, type LauncherFolder, type LauncherFolderInput, type LauncherProps, type LoadingProgress, type LoadingState, type MenuBarBuilder, type MenuBarComponent, type MenuBarComponentProps, MenuEditApp, MenuEditAppLazy, MenuEditMenuBar, MenuEditMenuBarLazy, type MenuItem, type MenuPosition, type MountedAppState, NotesApp, NotesAppLazy, NotesMenuBar, NotesMenuBarLazy, type NotificationItem, type NotificationOptions, type OpenAppOptions, PREDEFINED_LAUNCHER_FOLDERS, PRESET_COLORS, PRESET_ICONS, PROFILE, type PartialFdeTheme, PdfApp, PdfAppLazy, PdfMenuBar, PdfMenuBarLazy, SETTINGS_SECTIONS, SUPPORTED_LANGUAGES, type SaveDialogOptions, SettingsApp, SettingsAppLazy, SettingsMenuBar, SettingsMenuBarLazy, type SettingsSection$1 as SettingsSection, SettingsSection as SettingsSectionComponent, type SortOption, SortOptions, StorybookApp, type SupportedLanguage$2 as SupportedLanguage, TASKBAR_HEIGHT, TEXT_MIME_TYPES, Taskbar, TaskbarContextMenu, type TaskbarContextMenuProps, type TaskbarMenuType, type TaskbarTheme, type Theme, type ThemeMode, ThemeProvider, type ThemeProviderProps, UploaderApp, UploaderAppLazy, type UseCloseInterceptorOptions, type UseDownloadReturn, type UseIsDirtyOptions, VscIcon, Window, WindowButtonRegistryProvider, type WindowContentProps, type WindowEntity, type WindowInput, type WindowLoading, WindowManagerAdapter, type WindowProps, type WindowState, type WindowTheme, appendDirtyIndicator, buildBreadcrumbs, centerWindowPosition, checkHMREndpointExists, clearBrowserData, clearManifestCache, convertToAppEntry, createDesktopIcon, createEaseIn, createEaseOut, createFile, createFolder, createLauncherFolder, createMaximizeTransition, createMinimizeVariant, createPanelVariants, createPredefinedLauncherFolder, createRestoreVariant, createWindow, createWindowVariants, fetchAppManifest, fileSystem, formatBytes, generateUUID, getAppComponent, getAppIdForMime, getAppName, getBaseUrl, getCachedManifest, getCloseInterceptor, getCustomAppById, getCustomApps, getEnvironment, getFdeApi, getFileExtension, getFourRandomColors, getMenuBarBuilder, getMenuBarComponent, getMimeTypeFromExtension, getPersistedThemeMode, getReleaseType, getRuntime, getVersionString, hashBlob, initRegistry, initializeFdeApi, injectFontLink, isBrowser, isCustomApp, isDev, isDocker, isElectron, isFdeApiInitialized, isLazyApp, isNewerVersion, maximizeTransition, mergeAppsWithCustomApps, migrateStorage, minimizeVariant, openVariants, panelVariants, prefetchApps, randomWindowPosition, registerAppFileHandler, registerCloseInterceptor, registerComponents, registerCustomApps, registerDesktopApps, removeFromManifestCache, resetBaseUrlCache, resetFileSystem, resetHMRState, resetWindowManager, resolveFileUrl, resolveUrl, restoreVariant, setApiBaseUrl, setTestBaseUrl, sortDesktopIcons, sortDesktopIconsByMode, sortNodes, sortNodesByMode, syncWithServer, toMantineTheme, unregisterCloseInterceptor, updateLauncherFolder, updateManifestCache, useAdaptiveDimensions, useAnimationDuration, useAppName, useAppReady, useAppTempMemoryStore, useAppUpdate, useApplyFont, useClock, useCloseInterceptor, useCloseModalStore, useCollapsible, useContextMenu, useCustomAppHMR, useCustomAppLifecycle, useCustomAppStore, useDesktopStore, useDeviceDetection, useDownload, useDragDropState, useDraggableItem, useDroppableArea, useDynamicIcon, useDynamicIconElement, useFcIcon, useFcIconElement, useFdeApi, useFdeContext, useFiIcon, useFiIconElement, useFolderName, useFontDownload, useIsDirty, useLanguageSync, useNotifications, useOpenApp, useResolvedUrl, useSearchFilter, useSettingsStore, useSystemTheme, useTaskbarContextMenu, useTaskbarHeight, useTheme, useThemeContext, useVscIcon, useVscIconElement, useWindowButtonRegistry, waitForContainer, windowVariants };