@fde-desktop/fde-core 0.3.8 → 0.4.2

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 (148) 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 +4405 -5156
  144. package/dist/index.css +9192 -0
  145. package/dist/index.d.cts +1324 -762
  146. package/dist/index.d.ts +1324 -762
  147. package/dist/index.js +3648 -5038
  148. package/package.json +14 -6
@@ -0,0 +1,286 @@
1
+ 'use strict';
2
+
3
+ var chunk657BJOY5_cjs = require('./chunk-657BJOY5.cjs');
4
+ var chunkABIAPZ6S_cjs = require('./chunk-ABIAPZ6S.cjs');
5
+ var chunk6QOUYSEE_cjs = require('./chunk-6QOUYSEE.cjs');
6
+ var chunkE55VXNLK_cjs = require('./chunk-E55VXNLK.cjs');
7
+ var react = require('react');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ var useNotifications = () => {
11
+ const notifications = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.notifications);
12
+ const addNotification = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.addNotification);
13
+ const removeNotification = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.removeNotification);
14
+ const notify = react.useCallback(
15
+ (title, message, options) => {
16
+ const item = {
17
+ id: chunk6QOUYSEE_cjs.generateUUID(),
18
+ title,
19
+ message,
20
+ fcIcon: options?.fcIcon,
21
+ onClose: options?.onClose
22
+ };
23
+ addNotification(item);
24
+ return item.id;
25
+ },
26
+ [addNotification]
27
+ );
28
+ const dismiss = react.useCallback(
29
+ (id) => {
30
+ removeNotification(id);
31
+ },
32
+ [removeNotification]
33
+ );
34
+ return {
35
+ notifications,
36
+ notify,
37
+ dismiss,
38
+ addNotification,
39
+ removeNotification
40
+ };
41
+ };
42
+
43
+ // src/components/Apps/FilesApp/components/FolderTree.module.css
44
+ var FolderTree_default = {};
45
+ var FolderTreeItem = ({
46
+ node,
47
+ allNodes,
48
+ currentFolderId,
49
+ depth,
50
+ onNavigate
51
+ }) => {
52
+ const children = allNodes.filter(
53
+ (n) => n.parentId === node.id && n.type === "folder"
54
+ );
55
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
56
+ /* @__PURE__ */ jsxRuntime.jsxs(
57
+ chunkE55VXNLK_cjs.UnstyledButton,
58
+ {
59
+ className: FolderTree_default.item,
60
+ "data-active": currentFolderId === node.id || void 0,
61
+ style: { paddingLeft: 8 + depth * 14 },
62
+ onClick: () => onNavigate(node.id),
63
+ "aria-label": node.name,
64
+ "aria-current": currentFolderId === node.id ? "page" : void 0,
65
+ children: [
66
+ /* @__PURE__ */ jsxRuntime.jsx(chunkABIAPZ6S_cjs.FileIcon_default, { type: "folder", folderNode: node, size: 14 }),
67
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", ml: 6, truncate: true, children: node.name })
68
+ ]
69
+ }
70
+ ),
71
+ children.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
72
+ FolderTreeItem,
73
+ {
74
+ node: child,
75
+ allNodes,
76
+ currentFolderId,
77
+ depth: depth + 1,
78
+ onNavigate
79
+ },
80
+ child.id
81
+ ))
82
+ ] });
83
+ };
84
+ var FolderTree = ({ allNodes, currentFolderId, onNavigate }) => {
85
+ const rootFolders = allNodes.filter(
86
+ (n) => n.parentId === null && n.type === "folder"
87
+ );
88
+ return /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: FolderTree_default.root, "aria-label": "Folder tree", children: [
89
+ /* @__PURE__ */ jsxRuntime.jsxs(
90
+ chunkE55VXNLK_cjs.UnstyledButton,
91
+ {
92
+ className: FolderTree_default.item,
93
+ "data-active": currentFolderId === null || void 0,
94
+ style: { paddingLeft: 8 },
95
+ onClick: () => onNavigate(null),
96
+ "aria-label": "Home",
97
+ "aria-current": currentFolderId === null ? "page" : void 0,
98
+ children: [
99
+ /* @__PURE__ */ jsxRuntime.jsx(chunkABIAPZ6S_cjs.FileIcon_default, { type: "folder", size: 14 }),
100
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", ml: 6, fw: 500, children: "Home" })
101
+ ]
102
+ }
103
+ ),
104
+ rootFolders.map((folder) => /* @__PURE__ */ jsxRuntime.jsx(
105
+ FolderTreeItem,
106
+ {
107
+ node: folder,
108
+ allNodes,
109
+ currentFolderId,
110
+ depth: 1,
111
+ onNavigate
112
+ },
113
+ folder.id
114
+ ))
115
+ ] });
116
+ };
117
+ var FolderTree_default2 = FolderTree;
118
+
119
+ // src/components/Apps/FilesApp/components/FileList.module.css
120
+ var FileList_default = {};
121
+ var FileListItem = ({ node, onNavigate, onOpenFile, onContextMenu }) => {
122
+ const handleDoubleClick = () => {
123
+ if (node.type === "folder") {
124
+ onNavigate(node.id);
125
+ } else {
126
+ onOpenFile(node);
127
+ }
128
+ };
129
+ const label = node.type === "folder" ? `Open folder ${node.name}` : `Open file ${node.name}`;
130
+ return /* @__PURE__ */ jsxRuntime.jsxs(
131
+ chunkE55VXNLK_cjs.UnstyledButton,
132
+ {
133
+ className: FileList_default.item,
134
+ onDoubleClick: handleDoubleClick,
135
+ onContextMenu: (e) => onContextMenu(e, node.id),
136
+ "aria-label": label,
137
+ role: "option",
138
+ children: [
139
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: FileList_default.icon, children: /* @__PURE__ */ jsxRuntime.jsx(
140
+ chunkABIAPZ6S_cjs.FileIcon_default,
141
+ {
142
+ type: node.type,
143
+ name: node.name,
144
+ folderNode: node.type === "folder" ? node : void 0,
145
+ size: 32
146
+ }
147
+ ) }),
148
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", className: FileList_default.name, truncate: true, children: node.name })
149
+ ]
150
+ }
151
+ );
152
+ };
153
+ var FileList = ({ nodes, onNavigate, onOpenFile, onNodeContextMenu }) => {
154
+ const filesSortMode = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.filesSortMode);
155
+ if (nodes.length === 0) {
156
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: FileList_default.empty, children: /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "sm", c: "dimmed", children: "This folder is empty" }) });
157
+ }
158
+ const sorted = chunk6QOUYSEE_cjs.sortNodesByMode(nodes, filesSortMode);
159
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: FileList_default.grid, role: "listbox", "aria-label": "Files", children: sorted.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
160
+ FileListItem,
161
+ {
162
+ node,
163
+ onNavigate,
164
+ onOpenFile,
165
+ onContextMenu: onNodeContextMenu
166
+ },
167
+ node.id
168
+ )) });
169
+ };
170
+ var FileList_default2 = FileList;
171
+
172
+ // src/components/Apps/FilesApp/FilesApp.module.css
173
+ var FilesApp_default = {};
174
+ var FilesApp = ({ window }) => {
175
+ const win = window;
176
+ const initialFolderId = win?.contentData?.initialFolderId;
177
+ const fsNodes = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.fsNodes);
178
+ const openContextMenu = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.openContextMenu);
179
+ const setFilesCurrentFolderId = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.setFilesCurrentFolderId);
180
+ const openApp = chunk657BJOY5_cjs.useOpenApp();
181
+ const { notify } = useNotifications();
182
+ const [currentFolderId, setCurrentFolderIdLocal] = react.useState(
183
+ initialFolderId ?? null
184
+ );
185
+ const setCurrentFolderId = react.useCallback(
186
+ (id) => {
187
+ setCurrentFolderIdLocal(id);
188
+ setFilesCurrentFolderId(id);
189
+ },
190
+ [setFilesCurrentFolderId]
191
+ );
192
+ react.useEffect(() => {
193
+ setFilesCurrentFolderId(initialFolderId ?? null);
194
+ }, [initialFolderId, setFilesCurrentFolderId]);
195
+ const currentNodes = currentFolderId === null ? fsNodes.filter((n) => n.parentId === null) : fsNodes.filter((n) => n.parentId === currentFolderId);
196
+ const buildBreadcrumbs = () => {
197
+ const crumbs2 = [{ id: null, name: "Home" }];
198
+ let id = currentFolderId;
199
+ const trail = [];
200
+ while (id !== null) {
201
+ const node = fsNodes.find((n) => n.id === id);
202
+ if (!node) break;
203
+ trail.unshift({ id: node.id, name: node.name });
204
+ id = node.parentId;
205
+ }
206
+ return [...crumbs2, ...trail];
207
+ };
208
+ const handleContextMenu = react.useCallback(
209
+ (e) => {
210
+ e.preventDefault();
211
+ e.stopPropagation();
212
+ openContextMenu(e.clientX, e.clientY, "files");
213
+ },
214
+ [openContextMenu]
215
+ );
216
+ const handleNodeContextMenu = react.useCallback(
217
+ (e, nodeId) => {
218
+ e.preventDefault();
219
+ e.stopPropagation();
220
+ openContextMenu(e.clientX, e.clientY, "files", nodeId);
221
+ },
222
+ [openContextMenu]
223
+ );
224
+ const handleOpenFile = react.useCallback(
225
+ (node) => {
226
+ try {
227
+ const result = chunk6QOUYSEE_cjs.getAppIdForMime(node);
228
+ if (result) {
229
+ openApp(result.appId, { contentData: result.contentData });
230
+ } else {
231
+ const mimeType = node.mimeType || "unknown";
232
+ console.warn(`[FilesApp] Unsupported file type: ${node.name} (${mimeType})`);
233
+ notify(
234
+ "Unsupported file type",
235
+ `Cannot open "${node.name}". File type "${mimeType}" is not supported.`,
236
+ { fcIcon: "FcDeleteRow" }
237
+ );
238
+ }
239
+ } catch (error) {
240
+ console.error("[FilesApp] Error opening file:", error);
241
+ notify("Error opening file", `An unexpected error occurred while opening "${node.name}".`, {
242
+ fcIcon: "FcHighPriority"
243
+ });
244
+ }
245
+ },
246
+ [openApp, notify]
247
+ );
248
+ const crumbs = buildBreadcrumbs();
249
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilesApp_default.root, onContextMenu: handleContextMenu, children: [
250
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: FilesApp_default.breadcrumbBar, children: /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Breadcrumbs, { separator: "\u203A", classNames: { separator: FilesApp_default.breadcrumbSep }, children: crumbs.map((crumb, i) => {
251
+ const isLast = i === crumbs.length - 1;
252
+ return isLast ? /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", fw: 500, children: crumb.name }, crumb.id ?? "root") : /* @__PURE__ */ jsxRuntime.jsx(
253
+ chunkE55VXNLK_cjs.Anchor,
254
+ {
255
+ size: "xs",
256
+ onClick: () => setCurrentFolderId(crumb.id),
257
+ children: crumb.name
258
+ },
259
+ crumb.id ?? "root"
260
+ );
261
+ }) }) }),
262
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilesApp_default.body, children: [
263
+ /* @__PURE__ */ jsxRuntime.jsx("aside", { className: FilesApp_default.sidebar, children: /* @__PURE__ */ jsxRuntime.jsx(
264
+ FolderTree_default2,
265
+ {
266
+ allNodes: fsNodes,
267
+ currentFolderId,
268
+ onNavigate: setCurrentFolderId
269
+ }
270
+ ) }),
271
+ /* @__PURE__ */ jsxRuntime.jsx("main", { className: FilesApp_default.content, children: /* @__PURE__ */ jsxRuntime.jsx(
272
+ FileList_default2,
273
+ {
274
+ nodes: currentNodes,
275
+ onNavigate: setCurrentFolderId,
276
+ onOpenFile: handleOpenFile,
277
+ onNodeContextMenu: handleNodeContextMenu
278
+ }
279
+ ) })
280
+ ] })
281
+ ] });
282
+ };
283
+ var FilesApp_default2 = FilesApp;
284
+
285
+ exports.FilesApp_default = FilesApp_default2;
286
+ exports.useNotifications = useNotifications;
@@ -0,0 +1,47 @@
1
+ import { AppEmptyState_default } from './chunk-ZHNDXNL4.js';
2
+ import { useResolvedUrl } from './chunk-EUQLZW6P.js';
3
+ import { FilePickerModal } from './chunk-4MCFQPKY.js';
4
+ import { useState, useEffect, useCallback } from 'react';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ // src/components/Apps/PdfApp/PdfApp.module.css
9
+ var PdfApp_default = {};
10
+ var PdfApp = ({ window, notifyReady }) => {
11
+ const { t } = useTranslation("apps");
12
+ const win = window;
13
+ const initialSrc = win?.contentData?.src;
14
+ const [src, setSrc] = useState(initialSrc ?? void 0);
15
+ const [pickerOpen, setPickerOpen] = useState(false);
16
+ const resolvedSrc = useResolvedUrl(src);
17
+ useEffect(() => {
18
+ notifyReady?.({ ...win?.contentData ?? {}, setPickerOpen: () => setPickerOpen(true) });
19
+ }, [win, notifyReady]);
20
+ const handleFileSelected = useCallback((node) => {
21
+ setSrc(node.url ?? node.name);
22
+ setPickerOpen(false);
23
+ }, []);
24
+ return /* @__PURE__ */ jsxs("div", { className: PdfApp_default.container, "data-windowid": win?.id, children: [
25
+ resolvedSrc || src ? /* @__PURE__ */ jsx(
26
+ "iframe",
27
+ {
28
+ src: resolvedSrc ?? src,
29
+ className: PdfApp_default.frame,
30
+ title: t("pdf.viewer"),
31
+ "aria-label": t("pdf.viewer")
32
+ }
33
+ ) : /* @__PURE__ */ jsx(AppEmptyState_default, { label: t("pdf.noFile", { defaultValue: "No PDF loaded" }) }),
34
+ /* @__PURE__ */ jsx(
35
+ FilePickerModal,
36
+ {
37
+ opened: pickerOpen,
38
+ acceptedMimeTypes: ["application/pdf"],
39
+ onConfirm: handleFileSelected,
40
+ onCancel: () => setPickerOpen(false)
41
+ }
42
+ )
43
+ ] });
44
+ };
45
+ var PdfApp_default2 = PdfApp;
46
+
47
+ export { PdfApp_default2 as PdfApp_default };
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ var chunkZX3EDZ5C_cjs = require('./chunk-ZX3EDZ5C.cjs');
4
+ var react = require('react');
5
+ var framerMotion = require('framer-motion');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ // src/utils/getFourRandomColors.ts
9
+ function getFourRandomColors(count = 4) {
10
+ const shuffled = [...chunkZX3EDZ5C_cjs.PRESET_COLORS].sort(() => Math.random() - 0.5);
11
+ return shuffled.slice(0, count);
12
+ }
13
+
14
+ // src/components/Shared/AppEmptyState/AppEmptyState.module.css
15
+ var AppEmptyState_default = {};
16
+ var COLORS = getFourRandomColors();
17
+ var spring = {
18
+ type: "spring",
19
+ damping: 20,
20
+ stiffness: 300
21
+ };
22
+ function shuffle(array) {
23
+ return [...array].sort(() => Math.random() - 0.5);
24
+ }
25
+ var AppEmptyState = ({ label = "Work In Progress" }) => {
26
+ const [order, setOrder] = react.useState(COLORS);
27
+ react.useEffect(() => {
28
+ const timeout = setTimeout(() => setOrder((prev) => shuffle(prev)), 1e3);
29
+ return () => clearTimeout(timeout);
30
+ }, [order]);
31
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: AppEmptyState_default.root, "data-testid": "app-empty-state", children: [
32
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: AppEmptyState_default.container, children: order.map((color) => /* @__PURE__ */ jsxRuntime.jsx(
33
+ framerMotion.motion.li,
34
+ {
35
+ layout: true,
36
+ transition: spring,
37
+ className: AppEmptyState_default.item,
38
+ style: { backgroundColor: color }
39
+ },
40
+ color
41
+ )) }),
42
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: AppEmptyState_default.label, children: label })
43
+ ] });
44
+ };
45
+ var AppEmptyState_default2 = AppEmptyState;
46
+
47
+ exports.AppEmptyState_default = AppEmptyState_default2;
48
+ exports.getFourRandomColors = getFourRandomColors;