@fde-desktop/fde-core 0.4.9 → 0.4.11

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 (186) hide show
  1. package/dist/{AppEmptyState-Bxpit0JV.js → AppEmptyState-Boej96TB.js} +1 -1
  2. package/dist/AppEmptyState-CLc00OOG.cjs +1 -0
  3. package/dist/AppIcon-C8vHUVcb.cjs +1 -0
  4. package/dist/AppIcon-mtEoyzOb.js +22 -0
  5. package/dist/AppMenuBar-CAlkNHjj.cjs +1 -0
  6. package/dist/AppMenuBar-DmSfQRXU.js +197 -0
  7. package/dist/CalendarApp-DOmjWbpl.js +10 -0
  8. package/dist/CalendarApp-Z0bCCYsK.cjs +1 -0
  9. package/dist/ColorPicker-CQRRwY-y.cjs +1 -0
  10. package/dist/ColorPicker-WCeD3Wjf.js +35 -0
  11. package/dist/CreateItemApp-BkFFFdX1.cjs +1 -0
  12. package/dist/CreateItemApp-DR8Y4bwo.js +202 -0
  13. package/dist/DeviceInfoApp-BXQ9uOwF.cjs +1 -0
  14. package/dist/DeviceInfoApp-I63mJRWy.js +195 -0
  15. package/dist/DownloadProgress-CkTGTf0z.cjs +1 -0
  16. package/dist/DownloadProgress-DnVASsv5.js +39 -0
  17. package/dist/FilePickerApp-By6-vbag.cjs +1 -0
  18. package/dist/FilePickerApp-ClHuhm6Z.js +390 -0
  19. package/dist/FilesApp-BC4UPNuw.cjs +1 -0
  20. package/dist/FilesApp-D8MqvC5X.js +210 -0
  21. package/dist/ImageViewerApp-B1niWF75.cjs +1 -0
  22. package/dist/{ImageViewerApp-BaLP3gkO.js → ImageViewerApp-iojtyFEf.js} +5 -5
  23. package/dist/{ImageViewerMenuBar-CabGSi9r.js → ImageViewerMenuBar-BIsUokxV.js} +2 -2
  24. package/dist/ImageViewerMenuBar-BgzgSF3v.cjs +1 -0
  25. package/dist/MenuEditApp-BHptoJbz.cjs +1 -0
  26. package/dist/{MenuEditApp-BTRppYnD.js → MenuEditApp-CJUbJaqh.js} +138 -143
  27. package/dist/MenuEditMenuBar-CCOSPAUe.cjs +1 -0
  28. package/dist/{MenuEditMenuBar-x1IQrHP2.js → MenuEditMenuBar-DnCL-kaZ.js} +3 -3
  29. package/dist/NotesApp-BmQIBtJ2.cjs +1 -0
  30. package/dist/{NotesApp-CQe7UfBC.js → NotesApp-DJ2dGt4-.js} +5 -5
  31. package/dist/NotesMenuBar-BzojwMtH.cjs +1 -0
  32. package/dist/{NotesMenuBar-VhpIe68v.js → NotesMenuBar-DILZTjnT.js} +3 -3
  33. package/dist/{PdfApp-DL_R9-Nc.js → PdfApp-IjY_GtnW.js} +3 -3
  34. package/dist/PdfApp-krW8UI97.cjs +1 -0
  35. package/dist/{PdfMenuBar-DZCLSOpR.js → PdfMenuBar-Bd5MTZcZ.js} +1 -1
  36. package/dist/PdfMenuBar-DWD0Qa3F.cjs +1 -0
  37. package/dist/SettingsApp-BE22l5UP.cjs +1 -0
  38. package/dist/SettingsApp-BTFtTFY_.js +1228 -0
  39. package/dist/SettingsMenuBar-CZE2evG2.cjs +1 -0
  40. package/dist/{SettingsMenuBar-YWiJHaxq.js → SettingsMenuBar-ktC0viTd.js} +3 -3
  41. package/dist/UploaderApp-CbypD538.js +263 -0
  42. package/dist/UploaderApp-D_qD3O70.cjs +1 -0
  43. package/dist/{VscIcon-DBfVnArE.js → VscIcon-AEENjKOE.js} +1 -1
  44. package/dist/VscIcon-BYb_Soyy.cjs +1 -0
  45. package/dist/buildBreadcrumbs-Ccd8i11b.cjs +1 -0
  46. package/dist/buildBreadcrumbs-noWhu8os.js +45 -0
  47. package/dist/{desktopStore-F8bgLqFl.js → desktopStore-8cSZlj7s.js} +407 -477
  48. package/dist/desktopStore-C1jR6Fdb.cjs +1 -0
  49. package/dist/imageViewerStore-Dfylg59V.cjs +1 -0
  50. package/dist/index.cjs +1 -1
  51. package/dist/index.css +1 -1
  52. package/dist/index.d.ts +16 -6
  53. package/dist/index.js +1646 -1960
  54. package/dist/menuEditStore-CYwtfD6H.cjs +1 -0
  55. package/dist/notesStore-CrWTO6oB.cjs +1 -0
  56. package/dist/settingsAppStore-DuYZNeFf.cjs +1 -0
  57. package/dist/useAdaptiveDimensions-3Lz4X0Tc.cjs +1 -0
  58. package/dist/{useAdaptiveDimensions-AVDc_qPa.js → useAdaptiveDimensions-DxNLJ7R5.js} +1 -1
  59. package/dist/{useCloseInterceptor-BZd3VILp.js → useCloseInterceptor-CIxhOZx1.js} +1 -1
  60. package/dist/useCloseInterceptor-CdX-09Ib.cjs +1 -0
  61. package/dist/useDynamicIcon-CK6SjEv5.cjs +1 -0
  62. package/dist/useOpenApp-D-FOY88T.cjs +1 -0
  63. package/dist/{useOpenApp-CBIm7Gzl.js → useOpenApp-DkZLFFCH.js} +51 -67
  64. package/dist/{useResolvedUrl-DQpLqOoL.js → useResolvedUrl-B6x4xy0x.js} +1 -2
  65. package/dist/useResolvedUrl-Bb39DpVy.cjs +1 -0
  66. package/package.json +2 -1
  67. package/dist/AccordionChevron-DxpOyInK.js +0 -26
  68. package/dist/AccordionChevron-kn5kSrEc.cjs +0 -1
  69. package/dist/ActionIcon-Drh4p6Fv.js +0 -145
  70. package/dist/ActionIcon-alk2zZD6.cjs +0 -1
  71. package/dist/AppEmptyState-BWCUbf-B.cjs +0 -1
  72. package/dist/AppIcon-BU7a3ZNH.cjs +0 -1
  73. package/dist/AppIcon-XumS3bIG.js +0 -80
  74. package/dist/AppMenuBar-B9U0n1Vv.cjs +0 -1
  75. package/dist/AppMenuBar-CnIEVjr8.js +0 -2049
  76. package/dist/Box-DSKR_qaa.js +0 -1579
  77. package/dist/Box-zW6Twge8.cjs +0 -1
  78. package/dist/Button-DMlnrqyx.cjs +0 -1
  79. package/dist/Button-wTOTQKxF.js +0 -178
  80. package/dist/CalendarApp-B_e1B1Yn.cjs +0 -1
  81. package/dist/CalendarApp-C-l9D6nd.cjs +0 -1
  82. package/dist/CalendarApp-D0ftTCTG.js +0 -1399
  83. package/dist/Center-CmxXB9ql.js +0 -25
  84. package/dist/Center-DKUE2pER.cjs +0 -1
  85. package/dist/CheckIcon-CZhtJD1O.cjs +0 -1
  86. package/dist/CheckIcon-N5qBqXQJ.js +0 -25
  87. package/dist/CodeServerApp-BOoGwZ7r.cjs +0 -1
  88. package/dist/CodeServerApp-Be3I5EGg.cjs +0 -1
  89. package/dist/CodeServerApp-DW18EZxa.js +0 -150
  90. package/dist/ColorPicker-BCNqi02x.js +0 -997
  91. package/dist/ColorPicker-BrDE7tMO.cjs +0 -1
  92. package/dist/CreateItemApp-B12M1E_1.cjs +0 -1
  93. package/dist/CreateItemApp-TAAprby3.js +0 -400
  94. package/dist/CreateItemApp-ePB6ujNl.cjs +0 -1
  95. package/dist/DeviceInfoApp-BMF18BGo.cjs +0 -1
  96. package/dist/DeviceInfoApp-DRy0H3aT.cjs +0 -1
  97. package/dist/DeviceInfoApp-lgpwkeRR.js +0 -223
  98. package/dist/DownloadProgress-EoyCaD5O.js +0 -174
  99. package/dist/DownloadProgress-VNdj22U8.cjs +0 -1
  100. package/dist/FileIcon-7JaSR3Gn.js +0 -89
  101. package/dist/FileIcon-CIXopWLv.cjs +0 -1
  102. package/dist/FilePickerApp-DaMgEqKh.js +0 -409
  103. package/dist/FilePickerApp-DjmuSFqa.cjs +0 -1
  104. package/dist/FilesApp-Bp7wfrBZ.cjs +0 -1
  105. package/dist/FilesApp-BpJJRKhi.cjs +0 -1
  106. package/dist/FilesApp-Cj94QG5o.js +0 -225
  107. package/dist/Group-CtBJSfCo.js +0 -48
  108. package/dist/Group-Dsrf6lEK.cjs +0 -1
  109. package/dist/ImageViewerApp-DlHGeB3S.cjs +0 -1
  110. package/dist/ImageViewerApp-DoXd_Swu.cjs +0 -1
  111. package/dist/ImageViewerMenuBar-SAI7UNz7.cjs +0 -1
  112. package/dist/ImageViewerMenuBar-_Jr29gii.cjs +0 -1
  113. package/dist/MenuEditApp-BJjlPTOa.cjs +0 -1
  114. package/dist/MenuEditApp-JPsGT-S3.cjs +0 -1
  115. package/dist/MenuEditMenuBar-BydGkqMw.cjs +0 -1
  116. package/dist/MenuEditMenuBar-DptlwVPQ.cjs +0 -1
  117. package/dist/NotesApp-BOcRGO7w.cjs +0 -1
  118. package/dist/NotesApp-OL07JXRE.cjs +0 -1
  119. package/dist/NotesMenuBar-BSI_2Y7p.cjs +0 -1
  120. package/dist/NotesMenuBar-Df6aW85J.cjs +0 -1
  121. package/dist/Paper-BX_9odR6.js +0 -30
  122. package/dist/Paper-D8-BaBx2.cjs +0 -1
  123. package/dist/PdfApp-CNEbty5v.cjs +0 -1
  124. package/dist/PdfApp-CVv3ZCaM.cjs +0 -1
  125. package/dist/PdfMenuBar--E6kDyrT.cjs +0 -1
  126. package/dist/PdfMenuBar-Dj5cJUkg.cjs +0 -1
  127. package/dist/SettingsApp-BlmHuAjT.js +0 -1831
  128. package/dist/SettingsApp-CNvIgf5B.cjs +0 -1
  129. package/dist/SettingsApp-DWxanNE4.cjs +0 -1
  130. package/dist/SettingsMenuBar-CBoOBCfx.cjs +0 -1
  131. package/dist/SettingsMenuBar-DQooFkZN.cjs +0 -1
  132. package/dist/Slider-BUiHxjKO.cjs +0 -1
  133. package/dist/Slider-t-NcD60t.js +0 -1176
  134. package/dist/Stack-Bp1Ek2Gp.js +0 -34
  135. package/dist/Stack-D4jAiRfc.cjs +0 -1
  136. package/dist/StorybookApp-CDLV_kja.cjs +0 -1
  137. package/dist/StorybookApp-DKwlPCmo.js +0 -10
  138. package/dist/TerminalApp-BCB7i1lR.cjs +0 -1
  139. package/dist/TerminalApp-BYc_gHLe.js +0 -326
  140. package/dist/TerminalApp-Dviz6aP2.cjs +0 -1
  141. package/dist/TerminalMenuBar-D5tPmgR_.js +0 -113
  142. package/dist/TerminalMenuBar-DNshPmCa.cjs +0 -1
  143. package/dist/TerminalMenuBar-HzMSR7XP.cjs +0 -1
  144. package/dist/TextInput-C-JtGWn1.js +0 -981
  145. package/dist/TextInput-CrsmcOip.cjs +0 -1
  146. package/dist/Tooltip-D5Cd9wtz.cjs +0 -1
  147. package/dist/Tooltip-DOeIvhrO.js +0 -1142
  148. package/dist/UnstyledButton-DGaG-e_G.js +0 -25
  149. package/dist/UnstyledButton-DX2pTahr.cjs +0 -1
  150. package/dist/UploaderApp-C6xA5Rrf2.cjs +0 -1
  151. package/dist/UploaderApp-DnHIRxB_.cjs +0 -1
  152. package/dist/UploaderApp-qBfpukR_.js +0 -488
  153. package/dist/VscIcon-CcMdrFoJ.cjs +0 -1
  154. package/dist/create-safe-context-Bboj0GWC.cjs +0 -1
  155. package/dist/create-safe-context-XT2cxc14.js +0 -12
  156. package/dist/desktopStore-CZoA9VHO.cjs +0 -1
  157. package/dist/getRuntime-BFK0-8R1.cjs +0 -1
  158. package/dist/getRuntime-DAPqFH2W.js +0 -63
  159. package/dist/imageViewerStore-BB_tssZR.cjs +0 -1
  160. package/dist/is-element-Bu_JY8Qy.js +0 -7
  161. package/dist/is-element-CdV0xajp.cjs +0 -1
  162. package/dist/menuEditStore-CTeM_dns.cjs +0 -1
  163. package/dist/notesStore-BCEl1D_v.cjs +0 -1
  164. package/dist/settingsAppStore-CMBc13VU.cjs +0 -1
  165. package/dist/terminalStore-IWdf4Mm6.js +0 -30
  166. package/dist/terminalStore-iIuyodfK.cjs +0 -1
  167. package/dist/use-merged-ref-BT8_u6vW.js +0 -25
  168. package/dist/use-merged-ref-n9Gw9LNn.cjs +0 -1
  169. package/dist/use-resolved-styles-api-8OXE2oRq.cjs +0 -1
  170. package/dist/use-resolved-styles-api-DNUlJJZf.js +0 -21
  171. package/dist/use-uncontrolled-A4hm9ATM.js +0 -23
  172. package/dist/use-uncontrolled-DDJVQiM_.cjs +0 -1
  173. package/dist/useAdaptiveDimensions-CfITBJ_m.cjs +0 -1
  174. package/dist/useCloseInterceptor-yntBEzNc.cjs +0 -1
  175. package/dist/useDynamicIcon-DJ_il30E.cjs +0 -1
  176. package/dist/useOpenApp-DW4x79Zg.cjs +0 -1
  177. package/dist/useResolvedUrl-BkMPM1fM.cjs +0 -1
  178. /package/dist/{Colors-zP2AFgU3.cjs → Colors-CNJbU7oq.cjs} +0 -0
  179. /package/dist/{Colors-ClnDxnyA.js → Colors-CuABn2W4.js} +0 -0
  180. /package/dist/{imageViewerStore-C5kWz0o7.js → imageViewerStore-COrD02Zu.js} +0 -0
  181. /package/dist/{menuEditStore-Cj1zAwxQ.js → menuEditStore-CxsgLiQu.js} +0 -0
  182. /package/dist/{notesStore-BPyRTHEc.js → notesStore-Dgah46U5.js} +0 -0
  183. /package/dist/{settingsAppStore-BDQ3ts1y.js → settingsAppStore-DHZhi6Rl.js} +0 -0
  184. /package/dist/{useDynamicIcon-Bf0t2foA.js → useDynamicIcon-_wGeWu-b.js} +0 -0
  185. /package/dist/{useMenuBarUtils-nmu9yehT.js → useMenuBarUtils-ChAfI7OA.js} +0 -0
  186. /package/dist/{useMenuBarUtils-nJIPJGIQ.cjs → useMenuBarUtils-DAap0ukp.cjs} +0 -0
@@ -0,0 +1,1228 @@
1
+ import { t as e } from "./rolldown-runtime-CAFD8bLK.js";
2
+ import { G as t, o as n } from "./desktopStore-8cSZlj7s.js";
3
+ import { t as r } from "./AppIcon-mtEoyzOb.js";
4
+ import { i } from "./useCloseInterceptor-CIxhOZx1.js";
5
+ import { t as a } from "./useResolvedUrl-B6x4xy0x.js";
6
+ import { n as o } from "./FilePickerApp-ClHuhm6Z.js";
7
+ import { t as s } from "./Colors-CuABn2W4.js";
8
+ import { t as c } from "./DownloadProgress-DnVASsv5.js";
9
+ import { t as l } from "./ColorPicker-WCeD3Wjf.js";
10
+ import { n as u } from "./settingsAppStore-DHZhi6Rl.js";
11
+ import { useCallback as d, useDeferredValue as f, useEffect as p, useRef as m, useState as h } from "react";
12
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
13
+ import { Badge as v, Box as y, Button as b, Card as x, Group as S, Paper as C, Radio as w, ScrollArea as T, SegmentedControl as E, SimpleGrid as ee, Slider as D, Stack as O, Text as k, TextInput as A, Tooltip as te, UnstyledButton as j } from "@mantine/core";
14
+ import { useQuery as M, useQueryClient as N } from "@tanstack/react-query";
15
+ import { create as P } from "zustand";
16
+ import { createJSONStorage as ne, persist as F } from "zustand/middleware";
17
+ import { useTranslation as I } from "react-i18next";
18
+ //#region src/infrastructure/adapters/DefaultThemeProvider.ts
19
+ var L = {
20
+ mode: "light",
21
+ colors: {
22
+ desktop: "#f0f4f8",
23
+ taskbar: "rgba(255, 255, 255, 0.9)",
24
+ window: "#ffffff",
25
+ accent: "#339af0"
26
+ },
27
+ window: {
28
+ borderRadius: "8px",
29
+ headerHeight: 40,
30
+ minWidth: 400,
31
+ minHeight: 300,
32
+ defaultWidth: 800,
33
+ defaultHeight: 600,
34
+ shadow: "0 8px 32px rgba(0, 0, 0, 0.2)"
35
+ },
36
+ taskbar: {
37
+ height: 48,
38
+ position: "bottom",
39
+ background: "rgba(0, 0, 0, 0.8)",
40
+ blur: !0
41
+ },
42
+ desktop: {
43
+ background: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
44
+ iconSize: 64,
45
+ iconSpacing: 16
46
+ }
47
+ }, R = {
48
+ mode: "dark",
49
+ colors: {
50
+ desktop: "#1a1b1e",
51
+ taskbar: "rgba(26, 27, 30, 0.9)",
52
+ window: "#25262b",
53
+ accent: "#4dabf7"
54
+ },
55
+ window: {
56
+ borderRadius: "8px",
57
+ headerHeight: 40,
58
+ minWidth: 400,
59
+ minHeight: 300,
60
+ defaultWidth: 800,
61
+ defaultHeight: 600,
62
+ shadow: "0 8px 32px rgba(0, 0, 0, 0.2)"
63
+ },
64
+ taskbar: {
65
+ height: 48,
66
+ position: "bottom",
67
+ background: "rgba(0, 0, 0, 0.8)",
68
+ blur: !0
69
+ },
70
+ desktop: {
71
+ background: "linear-gradient(135deg, #1a1b1e 0%, #2d1f3d 100%)",
72
+ iconSize: 64,
73
+ iconSpacing: 16
74
+ }
75
+ }, z = class {
76
+ mode;
77
+ customColors = null;
78
+ constructor(e = "light") {
79
+ this.mode = e;
80
+ }
81
+ getTheme() {
82
+ let e = this.mode === "light" ? L : R;
83
+ return this.customColors ? {
84
+ ...e,
85
+ colors: {
86
+ ...e.colors,
87
+ taskbar: this.customColors.taskbar,
88
+ window: this.customColors.window,
89
+ accent: this.customColors.accent
90
+ }
91
+ } : e;
92
+ }
93
+ setMode(e) {
94
+ this.mode = e;
95
+ }
96
+ setCustomColors(e) {
97
+ this.customColors = e;
98
+ }
99
+ toggle() {
100
+ this.mode = this.mode === "light" ? "dark" : "light";
101
+ }
102
+ }, B = ["en", "es"], V = "en", H = () => {
103
+ try {
104
+ let e = localStorage.getItem("fde-desktop:settings"), t = localStorage.getItem("fran-desktop:settings");
105
+ return JSON.parse(e ?? t ?? "{}")?.state?.theme?.mode ?? null;
106
+ } catch {
107
+ return null;
108
+ }
109
+ }, U = H(), W = () => {
110
+ if (typeof navigator > "u" || !navigator.language) return V;
111
+ let e = navigator.language.split("-")[0];
112
+ return B.includes(e) ? e : V;
113
+ }, re = (() => {
114
+ try {
115
+ let e = localStorage.getItem("fde-desktop:settings"), t = localStorage.getItem("fran-desktop:settings"), n = JSON.parse(e ?? t ?? "{}")?.state?.language;
116
+ return n && B.includes(n) ? n : W();
117
+ } catch {
118
+ return W();
119
+ }
120
+ })(), ie = typeof window < "u" && window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light", G = new z(U ?? ie), K = P()(F((e) => ({
121
+ wallpaper: null,
122
+ wallpaperModule: "default",
123
+ launcherIcon: "FcElectronics",
124
+ font: "system-ui",
125
+ downloadedFonts: [],
126
+ fontSize: 14,
127
+ animationDuration: .3,
128
+ theme: G.getTheme(),
129
+ themeSetManually: U !== null,
130
+ customThemeColors: null,
131
+ language: re,
132
+ setWallpaper: (t) => e({ wallpaper: t }),
133
+ setWallpaperModule: (t) => e({ wallpaperModule: t }),
134
+ setLauncherIcon: (t) => e({ launcherIcon: t }),
135
+ setFont: (t) => e({ font: t }),
136
+ markFontDownloaded: (t) => e((e) => ({ downloadedFonts: e.downloadedFonts.includes(t) ? e.downloadedFonts : [...e.downloadedFonts, t] })),
137
+ setFontSize: (t) => e({ fontSize: t }),
138
+ setAnimationDuration: (t) => e({ animationDuration: t }),
139
+ setThemeMode: (t) => {
140
+ G.setMode(t), e({
141
+ theme: G.getTheme(),
142
+ themeSetManually: !0
143
+ });
144
+ },
145
+ toggleTheme: () => {
146
+ G.toggle(), e({
147
+ theme: G.getTheme(),
148
+ themeSetManually: !0
149
+ });
150
+ },
151
+ setThemeAutomatic: () => e({ themeSetManually: !1 }),
152
+ applySystemTheme: (t) => {
153
+ G.setMode(t), e({ theme: G.getTheme() });
154
+ },
155
+ setCustomThemeColors: (t) => {
156
+ e({ customThemeColors: t });
157
+ },
158
+ setLanguage: (t) => e({ language: t })
159
+ }), {
160
+ name: "fde-desktop:settings",
161
+ storage: ne(() => localStorage)
162
+ })), q = {
163
+ container: "_container_a0fjd_1",
164
+ flag: "_flag_a0fjd_8"
165
+ }, ae = {
166
+ en: /* @__PURE__ */ _("svg", {
167
+ viewBox: "0 0 60 40",
168
+ className: q.flag,
169
+ children: [
170
+ /* @__PURE__ */ g("rect", {
171
+ fill: "#012169",
172
+ width: "60",
173
+ height: "40"
174
+ }),
175
+ /* @__PURE__ */ g("path", {
176
+ d: "M0,0 L60,40 M60,0 L0,40",
177
+ stroke: "#fff",
178
+ strokeWidth: "6"
179
+ }),
180
+ /* @__PURE__ */ g("path", {
181
+ d: "M0,0 L60,40 M60,0 L0,40",
182
+ stroke: "#C8102E",
183
+ strokeWidth: "4"
184
+ }),
185
+ /* @__PURE__ */ g("path", {
186
+ d: "M30,0 V40 M0,20 H60",
187
+ stroke: "#fff",
188
+ strokeWidth: "10"
189
+ }),
190
+ /* @__PURE__ */ g("path", {
191
+ d: "M30,0 V40 M0,20 H60",
192
+ stroke: "#C8102E",
193
+ strokeWidth: "6"
194
+ })
195
+ ]
196
+ }),
197
+ es: /* @__PURE__ */ _("svg", {
198
+ viewBox: "0 0 60 40",
199
+ className: q.flag,
200
+ children: [/* @__PURE__ */ g("rect", {
201
+ fill: "#C60B1E",
202
+ width: "60",
203
+ height: "40"
204
+ }), /* @__PURE__ */ g("rect", {
205
+ fill: "#FFC400",
206
+ y: "10",
207
+ width: "60",
208
+ height: "20"
209
+ })]
210
+ })
211
+ }, oe = ({ lang: e, size: t = 20 }) => /* @__PURE__ */ g("div", {
212
+ style: {
213
+ width: t * 1.5,
214
+ height: t
215
+ },
216
+ className: q.container,
217
+ "aria-label": e === "en" ? "English" : "Español",
218
+ "data-testid": `flag-${e}`,
219
+ children: ae[e]
220
+ }), J = [
221
+ {
222
+ value: "system-ui",
223
+ label: "System Default",
224
+ stack: "system-ui, Avenir, Helvetica, Arial, sans-serif"
225
+ },
226
+ {
227
+ value: "Courier New",
228
+ label: "Courier New",
229
+ stack: "\"Courier New\", monospace"
230
+ },
231
+ {
232
+ value: "Source Code Pro",
233
+ label: "Source Code Pro",
234
+ stack: "\"Source Code Pro\", monospace"
235
+ },
236
+ {
237
+ value: "Open Sans",
238
+ label: "Open Sans",
239
+ stack: "\"Open Sans\", monospace"
240
+ }
241
+ ], se = Object.fromEntries(J.map((e) => [e.value, e.stack])), Y = {
242
+ "Source Code Pro": "https://fonts.googleapis.com/css2?family=Source+Code+Pro&display=swap",
243
+ "Open Sans": "https://fonts.googleapis.com/css2?family=Open+Sans&display=swap"
244
+ }, X = [
245
+ {
246
+ id: "wallpaper",
247
+ label: "Wallpaper",
248
+ fcIcon: "FcPicture",
249
+ description: "Change the desktop background image."
250
+ },
251
+ {
252
+ id: "appearance",
253
+ label: "Appearance",
254
+ fcIcon: "FcBinoculars",
255
+ description: "Switch between light and dark mode."
256
+ },
257
+ {
258
+ id: "launcher",
259
+ label: "Launcher",
260
+ fcIcon: "FcElectronics",
261
+ description: "Choose the launcher button icon."
262
+ },
263
+ {
264
+ id: "font",
265
+ label: "Font",
266
+ fcIcon: "FcEditImage",
267
+ description: "Select the system font family."
268
+ },
269
+ {
270
+ id: "language",
271
+ label: "Language",
272
+ fcIcon: "FcGlobe",
273
+ description: "Choose your preferred language."
274
+ },
275
+ {
276
+ id: "reset",
277
+ label: "Reset to Default",
278
+ fcIcon: "FcDisclaimer",
279
+ description: "Reset all settings and data to defaults."
280
+ }
281
+ ], Z = ({ title: e, description: t, children: n }) => /* @__PURE__ */ _(O, {
282
+ gap: "md",
283
+ p: "md",
284
+ children: [
285
+ /* @__PURE__ */ g(k, {
286
+ fw: 600,
287
+ size: "lg",
288
+ children: e
289
+ }),
290
+ t && /* @__PURE__ */ g(k, {
291
+ size: "sm",
292
+ c: "dimmed",
293
+ children: t
294
+ }),
295
+ n
296
+ ]
297
+ }), ce = "/Images/wallpaper.jpg", le = () => {
298
+ let { t: e } = I("settings"), t = K((e) => e.wallpaper), n = K((e) => e.wallpaperModule), r = K((e) => e.setWallpaper), i = K((e) => e.setWallpaperModule), [s, c] = h(""), [l, u] = h(!1), f = m(null), p = a(t ?? void 0) ?? ce, v = d((e) => {
299
+ let t = e.target.files?.[0];
300
+ if (!t) return;
301
+ let n = new FileReader();
302
+ n.onload = (e) => {
303
+ let t = e.target?.result;
304
+ typeof t == "string" && r(t);
305
+ }, n.readAsDataURL(t);
306
+ }, [r]), y = d(() => {
307
+ let e = s.trim();
308
+ e && r(e);
309
+ }, [s, r]), x = d(() => {
310
+ r(null), c("");
311
+ }, [r]), C = d((e) => {
312
+ let t = e.url ? e.url.startsWith("idb://") ? e.url : `/${e.url}` : null;
313
+ t && r(t), u(!1);
314
+ }, [r]);
315
+ return /* @__PURE__ */ _(Z, {
316
+ title: e("wallpaper.title"),
317
+ children: [
318
+ /* @__PURE__ */ g("div", { children: /* @__PURE__ */ g(E, {
319
+ value: n,
320
+ onChange: i,
321
+ data: [{
322
+ value: "default",
323
+ label: e("wallpaper.staticImage")
324
+ }],
325
+ fullWidth: !0
326
+ }) }),
327
+ /* @__PURE__ */ g("img", {
328
+ src: p,
329
+ alt: e("wallpaper.wallpaperPreview"),
330
+ style: {
331
+ width: "100%",
332
+ height: 180,
333
+ objectFit: "cover",
334
+ borderRadius: 8
335
+ }
336
+ }),
337
+ /* @__PURE__ */ _(S, { children: [
338
+ /* @__PURE__ */ g("input", {
339
+ ref: f,
340
+ type: "file",
341
+ accept: "image/*",
342
+ style: { display: "none" },
343
+ onChange: v,
344
+ "aria-label": e("wallpaper.uploadAria", { defaultValue: "Upload wallpaper file" })
345
+ }),
346
+ /* @__PURE__ */ g(b, {
347
+ variant: "light",
348
+ onClick: () => u(!0),
349
+ children: e("wallpaper.chooseFromImages")
350
+ }),
351
+ /* @__PURE__ */ g(b, {
352
+ variant: "light",
353
+ onClick: () => f.current?.click(),
354
+ children: e("wallpaper.uploadFromDisk")
355
+ }),
356
+ /* @__PURE__ */ g(b, {
357
+ variant: "subtle",
358
+ color: "red",
359
+ onClick: x,
360
+ children: e("wallpaper.resetToDefault")
361
+ })
362
+ ] }),
363
+ /* @__PURE__ */ _(S, {
364
+ align: "flex-end",
365
+ children: [/* @__PURE__ */ g(A, {
366
+ label: e("wallpaper.orEnterUrl"),
367
+ placeholder: "https://example.com/image.jpg",
368
+ value: s,
369
+ onChange: (e) => c(e.currentTarget.value),
370
+ style: { flex: 1 }
371
+ }), /* @__PURE__ */ g(b, {
372
+ onClick: y,
373
+ disabled: !s.trim(),
374
+ children: e("common:actions.apply")
375
+ })]
376
+ }),
377
+ /* @__PURE__ */ g(o, {
378
+ opened: l,
379
+ acceptedMimeTypes: ["image/*"],
380
+ onConfirm: C,
381
+ onCancel: () => u(!1)
382
+ })
383
+ ]
384
+ });
385
+ }, ue = () => {
386
+ let { t: e } = I("settings"), t = K((e) => e.theme.mode), n = K((e) => e.themeSetManually), r = K((e) => e.customThemeColors), i = K((e) => e.animationDuration), a = K((e) => e.setThemeMode), o = K((e) => e.setThemeAutomatic), s = K((e) => e.setCustomThemeColors), c = K((e) => e.setAnimationDuration), u = r ? "custom" : n ? t : "system", f = d((e) => {
387
+ e === "system" ? (o(), s(null)) : e === "custom" ? s({
388
+ taskbar: "#339af0",
389
+ window: "#ffffff",
390
+ accent: "#339af0"
391
+ }) : (a(e), s(null));
392
+ }, [
393
+ a,
394
+ o,
395
+ s
396
+ ]), p = d((e) => (t) => {
397
+ r && s({
398
+ ...r,
399
+ [e]: t
400
+ });
401
+ }, [r, s]), m = d((e) => {
402
+ c(e);
403
+ }, [c]), h = u === "custom";
404
+ return /* @__PURE__ */ _(O, {
405
+ gap: "md",
406
+ p: "md",
407
+ children: [
408
+ /* @__PURE__ */ g(k, {
409
+ fw: 600,
410
+ size: "lg",
411
+ children: e("appearance.title")
412
+ }),
413
+ /* @__PURE__ */ g(k, {
414
+ size: "sm",
415
+ c: "dimmed",
416
+ children: e("appearance.description")
417
+ }),
418
+ /* @__PURE__ */ g(E, {
419
+ value: u,
420
+ onChange: f,
421
+ data: [
422
+ {
423
+ label: e("common:theme.light"),
424
+ value: "light"
425
+ },
426
+ {
427
+ label: e("common:theme.dark"),
428
+ value: "dark"
429
+ },
430
+ {
431
+ label: e("common:theme.system"),
432
+ value: "system"
433
+ },
434
+ {
435
+ label: e("common:theme.custom"),
436
+ value: "custom"
437
+ }
438
+ ],
439
+ "aria-label": e("appearance.themeMode", { defaultValue: "Theme mode" })
440
+ }),
441
+ /* @__PURE__ */ _(O, {
442
+ gap: "sm",
443
+ mt: "md",
444
+ children: [
445
+ /* @__PURE__ */ _(y, { children: [/* @__PURE__ */ g(k, {
446
+ size: "sm",
447
+ fw: 500,
448
+ mb: "xs",
449
+ c: h ? "dark" : void 0,
450
+ children: e("appearance.taskbar")
451
+ }), /* @__PURE__ */ g(l, {
452
+ value: r?.taskbar ?? "#339af0",
453
+ onChange: p("taskbar"),
454
+ disabled: !h
455
+ })] }),
456
+ /* @__PURE__ */ _(y, { children: [/* @__PURE__ */ g(k, {
457
+ size: "sm",
458
+ fw: 500,
459
+ mb: "xs",
460
+ c: h ? "dark" : void 0,
461
+ children: e("appearance.window")
462
+ }), /* @__PURE__ */ g(l, {
463
+ value: r?.window ?? "#ffffff",
464
+ onChange: p("window"),
465
+ disabled: !h
466
+ })] }),
467
+ /* @__PURE__ */ _(y, { children: [/* @__PURE__ */ g(k, {
468
+ size: "sm",
469
+ fw: 500,
470
+ mb: "xs",
471
+ c: h ? "dark" : void 0,
472
+ children: e("appearance.accent")
473
+ }), /* @__PURE__ */ g(l, {
474
+ value: r?.accent ?? "#339af0",
475
+ onChange: p("accent"),
476
+ disabled: !h
477
+ })] })
478
+ ]
479
+ }),
480
+ /* @__PURE__ */ _(y, {
481
+ mt: "md",
482
+ children: [
483
+ /* @__PURE__ */ g(k, {
484
+ size: "sm",
485
+ fw: 500,
486
+ mb: "xs",
487
+ children: e("appearance.animationDuration")
488
+ }),
489
+ /* @__PURE__ */ g(k, {
490
+ size: "xs",
491
+ c: "dimmed",
492
+ mb: "sm",
493
+ children: e("appearance.animationDescription")
494
+ }),
495
+ /* @__PURE__ */ _(S, {
496
+ align: "center",
497
+ gap: "md",
498
+ children: [/* @__PURE__ */ g(D, {
499
+ value: i,
500
+ onChange: m,
501
+ min: .1,
502
+ max: 1,
503
+ step: .1,
504
+ style: { flex: 1 },
505
+ marks: [
506
+ {
507
+ value: .1,
508
+ label: "0.1s"
509
+ },
510
+ {
511
+ value: .5,
512
+ label: "0.5s"
513
+ },
514
+ {
515
+ value: 1,
516
+ label: "1.0s"
517
+ }
518
+ ],
519
+ "aria-label": e("appearance.animationDuration")
520
+ }), /* @__PURE__ */ _(k, {
521
+ size: "sm",
522
+ fw: 500,
523
+ style: { minWidth: 40 },
524
+ children: [i.toFixed(1), "s"]
525
+ })]
526
+ })
527
+ ]
528
+ })
529
+ ]
530
+ });
531
+ }, de = () => {
532
+ let e = K((e) => e.launcherIcon), t = K((e) => e.setLauncherIcon), [n, i] = h([]), [a, o] = h(""), s = f(a);
533
+ p(() => {
534
+ import("react-icons/fc").then((e) => {
535
+ i(Object.keys(e).filter((e) => e.startsWith("Fc")).sort());
536
+ });
537
+ }, []);
538
+ let c = s ? n.filter((e) => e.toLowerCase().includes(s.toLowerCase())) : n, l = d((e) => {
539
+ t(e);
540
+ }, [t]);
541
+ return /* @__PURE__ */ _(Z, {
542
+ title: "Launcher Icon",
543
+ description: `Selected: ${e}`,
544
+ children: [/* @__PURE__ */ g(A, {
545
+ placeholder: "Search icons...",
546
+ value: a,
547
+ onChange: (e) => o(e.currentTarget.value),
548
+ "aria-label": "Search icons"
549
+ }), /* @__PURE__ */ g(T, {
550
+ style: {
551
+ flex: 1,
552
+ height: 300
553
+ },
554
+ children: /* @__PURE__ */ g(ee, {
555
+ cols: 8,
556
+ spacing: 4,
557
+ children: c.map((t) => /* @__PURE__ */ g(te, {
558
+ label: t,
559
+ withArrow: !0,
560
+ openDelay: 400,
561
+ children: /* @__PURE__ */ g(j, {
562
+ onClick: () => l(t),
563
+ "aria-label": t,
564
+ "aria-pressed": t === e,
565
+ style: {
566
+ padding: 6,
567
+ borderRadius: 6,
568
+ background: t === e ? "var(--mantine-primary-color-light)" : "transparent",
569
+ display: "flex",
570
+ alignItems: "center",
571
+ justifyContent: "center"
572
+ },
573
+ children: /* @__PURE__ */ g(r, {
574
+ fcIcon: t,
575
+ size: 24
576
+ })
577
+ })
578
+ }, t))
579
+ })
580
+ })]
581
+ });
582
+ }, fe = (e) => {
583
+ let t = Y[e];
584
+ if (!t || document.head.querySelector(`link[data-font="${e}"]`)) return;
585
+ let n = document.createElement("link");
586
+ n.rel = "stylesheet", n.href = t, n.setAttribute("data-font", e), document.head.appendChild(n);
587
+ }, pe = async (e) => {
588
+ let t = Y[e];
589
+ if (!t) throw Error(`Font "${e}" not found in Google Fonts`);
590
+ let n = await fetch(t);
591
+ if (!n.ok) throw Error(`Failed to download font: HTTP ${n.status}`);
592
+ return await n.text(), fe(e), {
593
+ font: e,
594
+ success: !0
595
+ };
596
+ }, me = (e) => {
597
+ let t = N(), n = K((e) => e.markFontDownloaded), r = K((e) => e.downloadedFonts), i = e ? r.includes(e) : !1, a = e && !i && Y[e], o = M({
598
+ queryKey: ["font", e ?? ""],
599
+ queryFn: async ({ queryKey: e }) => {
600
+ let [, t] = e;
601
+ if (!t || !Y[t]) throw Error(`Font "${t}" not available`);
602
+ let r = await pe(t);
603
+ return r.success && n(t), r;
604
+ },
605
+ enabled: !!a,
606
+ staleTime: Infinity,
607
+ gcTime: Infinity,
608
+ retry: !1
609
+ }), s = o.isFetching ? {
610
+ status: "downloading",
611
+ loaded: 0,
612
+ total: null,
613
+ percent: null,
614
+ error: null
615
+ } : o.isError ? {
616
+ status: "error",
617
+ loaded: 0,
618
+ total: null,
619
+ percent: null,
620
+ error: o.error?.message ?? "Unknown error"
621
+ } : o.isSuccess ? {
622
+ status: "done",
623
+ loaded: 0,
624
+ total: 0,
625
+ percent: 100,
626
+ error: null
627
+ } : {
628
+ status: "idle",
629
+ loaded: 0,
630
+ total: null,
631
+ percent: null,
632
+ error: null
633
+ }, c = () => {
634
+ e && t.removeQueries({ queryKey: ["font", e] });
635
+ };
636
+ return {
637
+ ...o,
638
+ progress: s,
639
+ isDownloaded: i,
640
+ reset: c
641
+ };
642
+ }, he = s[1], ge = ({ status: e, error: t, onDownload: n }) => {
643
+ let { t: r } = I("settings");
644
+ return t ? /* @__PURE__ */ g(v, {
645
+ color: he,
646
+ variant: "filled",
647
+ size: "sm",
648
+ "aria-label": `Download error: ${t}`,
649
+ children: r("common:status.error")
650
+ }) : /* @__PURE__ */ g(b, {
651
+ size: "xs",
652
+ variant: "light",
653
+ onClick: n,
654
+ loading: e === "downloading",
655
+ "aria-label": r("font.download"),
656
+ children: r("font.download")
657
+ });
658
+ }, _e = () => {
659
+ let { t: e } = I("settings"), t = K((e) => e.font), n = K((e) => e.setFont), r = K((e) => e.fontSize), i = K((e) => e.setFontSize), a = K((e) => e.downloadedFonts), o = K((e) => e.markFontDownloaded), [s, l] = h(null), u = me(s);
660
+ p(() => {
661
+ u.isSuccess && u.data?.success && s && (a.includes(s) || o(s));
662
+ }, [
663
+ u.isSuccess,
664
+ u.data,
665
+ s,
666
+ a,
667
+ o
668
+ ]);
669
+ let f = d((e) => {
670
+ l(e);
671
+ }, []), m = (e) => a.includes(e) ? "done" : s === e ? u.progress.status : "idle", v = (e) => s === e ? u.progress.error : null, y = d((e) => {
672
+ let t = e.trim();
673
+ t && (Y[t] = `https://fonts.googleapis.com/css2?family=${t.replace(/\s+/g, "+")}&display=swap`, l(t));
674
+ }, []), b = J.map((e) => e.value), x = a.filter((e) => !b.includes(e));
675
+ return /* @__PURE__ */ _(O, {
676
+ gap: "md",
677
+ p: "md",
678
+ children: [
679
+ /* @__PURE__ */ g(k, {
680
+ fw: 600,
681
+ size: "lg",
682
+ children: e("font.title")
683
+ }),
684
+ /* @__PURE__ */ g(k, {
685
+ size: "sm",
686
+ c: "dimmed",
687
+ children: e("font.description")
688
+ }),
689
+ /* @__PURE__ */ g(w.Group, {
690
+ value: t,
691
+ onChange: n,
692
+ "aria-label": e("font.selectionAria", { defaultValue: "Font selection" }),
693
+ children: /* @__PURE__ */ _(O, {
694
+ gap: "xs",
695
+ children: [J.map((e) => {
696
+ let t = !!Y[e.value], n = a.includes(e.value), r = m(e.value), i = v(e.value), o = !t || n || r === "done";
697
+ return /* @__PURE__ */ g(C, {
698
+ p: "sm",
699
+ withBorder: !0,
700
+ radius: "md",
701
+ children: /* @__PURE__ */ _(O, {
702
+ gap: "xs",
703
+ children: [/* @__PURE__ */ _(S, {
704
+ justify: "space-between",
705
+ children: [/* @__PURE__ */ g(w, {
706
+ value: e.value,
707
+ label: e.label,
708
+ "aria-label": e.label,
709
+ disabled: !o
710
+ }), /* @__PURE__ */ _(S, {
711
+ gap: "xs",
712
+ align: "center",
713
+ children: [o && /* @__PURE__ */ g(k, {
714
+ size: "sm",
715
+ c: "dimmed",
716
+ style: { fontFamily: e.stack },
717
+ children: "AaBbCcDd"
718
+ }), t && /* @__PURE__ */ g(ge, {
719
+ fontLabel: e.label,
720
+ status: r,
721
+ error: i,
722
+ onDownload: () => f(e.value),
723
+ isDownloaded: n
724
+ })]
725
+ })]
726
+ }), t && r === "downloading" && /* @__PURE__ */ g(c, { state: u.progress })]
727
+ })
728
+ }, e.value);
729
+ }), x.map((e) => /* @__PURE__ */ g(C, {
730
+ p: "sm",
731
+ withBorder: !0,
732
+ radius: "md",
733
+ children: /* @__PURE__ */ _(S, {
734
+ justify: "space-between",
735
+ children: [/* @__PURE__ */ g(w, {
736
+ value: e,
737
+ label: e,
738
+ "aria-label": e
739
+ }), /* @__PURE__ */ g(k, {
740
+ size: "sm",
741
+ c: "dimmed",
742
+ style: { fontFamily: `"${e}"` },
743
+ children: "AaBbCcDd"
744
+ })]
745
+ })
746
+ }, e))]
747
+ })
748
+ }),
749
+ /* @__PURE__ */ g(C, {
750
+ p: "sm",
751
+ withBorder: !0,
752
+ radius: "md",
753
+ children: /* @__PURE__ */ _(O, {
754
+ gap: "xs",
755
+ children: [/* @__PURE__ */ _(S, {
756
+ justify: "space-between",
757
+ children: [/* @__PURE__ */ g(k, {
758
+ size: "sm",
759
+ fw: 500,
760
+ children: e("font.fontSize")
761
+ }), /* @__PURE__ */ _(k, {
762
+ size: "sm",
763
+ c: "dimmed",
764
+ children: [r, "px"]
765
+ })]
766
+ }), /* @__PURE__ */ g(D, {
767
+ value: r,
768
+ onChange: i,
769
+ min: 10,
770
+ max: 24,
771
+ step: 1,
772
+ marks: [
773
+ { value: 10 },
774
+ { value: 14 },
775
+ { value: 18 },
776
+ { value: 20 },
777
+ { value: 24 }
778
+ ],
779
+ "aria-label": e("font.fontSizeAria", { defaultValue: "Font size" })
780
+ })]
781
+ })
782
+ }),
783
+ /* @__PURE__ */ g(ve, {
784
+ onDownload: y,
785
+ activeDownload: s,
786
+ fontDownload: u
787
+ })
788
+ ]
789
+ });
790
+ }, ve = ({ onDownload: e, activeDownload: t, fontDownload: n }) => {
791
+ let { t: r } = I("settings"), [i, a] = h(""), o = t === i.trim(), s = o ? n.progress.status : "idle", l = o && n.progress.status === "error", u = d((e) => {
792
+ a(e), l && n.reset?.();
793
+ }, [l, n]), f = d(() => {
794
+ e(i);
795
+ }, [i, e]), p = o && s === "done";
796
+ return /* @__PURE__ */ g(C, {
797
+ p: "sm",
798
+ withBorder: !0,
799
+ radius: "md",
800
+ children: /* @__PURE__ */ _(O, {
801
+ gap: "xs",
802
+ children: [
803
+ /* @__PURE__ */ _(k, {
804
+ size: "sm",
805
+ fw: 500,
806
+ children: [
807
+ r("font.downloadByName"),
808
+ " ",
809
+ /* @__PURE__ */ g("a", {
810
+ href: "https://fonts.google.com/",
811
+ target: "_blank",
812
+ rel: "noreferrer",
813
+ children: r("font.fromGoogleFonts")
814
+ })
815
+ ]
816
+ }),
817
+ /* @__PURE__ */ _(S, {
818
+ gap: "xs",
819
+ align: "flex-start",
820
+ children: [/* @__PURE__ */ g(A, {
821
+ placeholder: r("font.namePlaceholder", { defaultValue: "e.g. Open Sans" }),
822
+ value: i,
823
+ onChange: (e) => u(e.currentTarget.value),
824
+ style: { flex: 1 },
825
+ "aria-label": r("font.customNameAria", { defaultValue: "Custom font name" }),
826
+ error: l ? r("font.downloadError") : void 0
827
+ }), /* @__PURE__ */ g(b, {
828
+ onClick: f,
829
+ disabled: !i.trim() || s === "downloading",
830
+ loading: s === "downloading",
831
+ "aria-label": r("font.downloadCustomAria", { defaultValue: "Download custom font" }),
832
+ style: { marginTop: l ? 0 : void 0 },
833
+ children: r("font.download")
834
+ })]
835
+ }),
836
+ s === "downloading" && /* @__PURE__ */ g(c, { state: n.progress }),
837
+ p && /* @__PURE__ */ g(k, {
838
+ size: "xs",
839
+ c: "dimmed",
840
+ children: r("font.downloadSuccess")
841
+ })
842
+ ]
843
+ })
844
+ });
845
+ }, ye = ["en", "es"], be = "en", xe = {
846
+ en: "English",
847
+ es: "Español"
848
+ }, Se = () => {
849
+ let { t: e } = I("settings"), t = K((e) => e.language), n = K((e) => e.setLanguage), r = d((e) => {
850
+ n(e);
851
+ }, [n]);
852
+ return /* @__PURE__ */ g(Z, {
853
+ title: e("language.title"),
854
+ description: e("language.description"),
855
+ children: /* @__PURE__ */ g(O, {
856
+ gap: "xs",
857
+ children: ye.map((e) => /* @__PURE__ */ g(j, {
858
+ onClick: () => r(e),
859
+ "aria-label": xe[e],
860
+ "aria-pressed": e === t,
861
+ style: {
862
+ padding: "12px 16px",
863
+ borderRadius: 8,
864
+ width: "100%",
865
+ background: e === t ? "var(--mantine-primary-color-light)" : "transparent",
866
+ border: e === t ? "1px solid var(--mantine-primary-color-filled)" : "1px solid transparent",
867
+ transition: "all 0.15s ease",
868
+ cursor: "pointer"
869
+ },
870
+ children: /* @__PURE__ */ _(S, {
871
+ gap: "sm",
872
+ children: [/* @__PURE__ */ g(oe, {
873
+ lang: e,
874
+ size: 24
875
+ }), /* @__PURE__ */ g(k, {
876
+ fw: e === t ? 600 : 400,
877
+ children: xe[e]
878
+ })]
879
+ })
880
+ }, e))
881
+ })
882
+ });
883
+ };
884
+ //#endregion
885
+ //#region src/utils/clearBrowserData.ts
886
+ async function Q(e) {
887
+ let t = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : void 0;
888
+ if (t) {
889
+ if (!e?.keepServiceWorker && "serviceWorker" in t.navigator) {
890
+ let e = await t.navigator.serviceWorker.getRegistrations();
891
+ for (let t of e) await t.unregister();
892
+ }
893
+ if ("caches" in t) {
894
+ let e = await t.caches.keys();
895
+ for (let n of e) await t.caches.delete(n);
896
+ }
897
+ if (!e?.keepIndexedDB && "indexedDB" in t) {
898
+ let e = await t.indexedDB.databases();
899
+ for (let n of e) n.name && t.indexedDB.deleteDatabase(n.name);
900
+ }
901
+ !e?.keepLocalStorage && "localStorage" in t && t.localStorage.clear(), !e?.keepSessionStorage && "sessionStorage" in t && t.sessionStorage.clear();
902
+ }
903
+ }
904
+ //#endregion
905
+ //#region src/utils/resetDockerWorkspace.ts
906
+ async function Ce() {
907
+ t() && (await fetch("/api/fs/reset", { method: "POST" }), await fetch("/api/fs/seed", { method: "POST" }));
908
+ }
909
+ //#endregion
910
+ //#region src/components/Apps/SettingsApp/sections/ResetSettings.tsx
911
+ var we = () => {
912
+ let { t: e } = I("settings"), [t, n] = h(!1), r = d(() => {
913
+ n(!0);
914
+ }, []), i = d(() => {
915
+ n(!1);
916
+ }, []), a = d(async () => {
917
+ await Ce(), await Q(), window.location.reload();
918
+ }, []), o = d(async () => {
919
+ await Ce(), await Q({ keepIndexedDB: !0 }), window.location.reload();
920
+ }, []);
921
+ return /* @__PURE__ */ _(Z, {
922
+ title: e("reset.title"),
923
+ description: e("reset.description"),
924
+ children: [/* @__PURE__ */ g(b, {
925
+ color: "red",
926
+ onClick: r,
927
+ style: { alignSelf: "flex-start" },
928
+ children: e("reset.resetButton")
929
+ }), t && /* @__PURE__ */ g(y, {
930
+ style: {
931
+ position: "fixed",
932
+ top: 0,
933
+ left: 0,
934
+ right: 0,
935
+ bottom: 0,
936
+ background: "rgba(0,0,0,0.5)",
937
+ display: "flex",
938
+ alignItems: "center",
939
+ justifyContent: "center",
940
+ zIndex: 1e3
941
+ },
942
+ role: "dialog",
943
+ "aria-label": "Confirm reset",
944
+ children: /* @__PURE__ */ g(y, {
945
+ style: {
946
+ background: "var(--mantine-color-default)",
947
+ borderRadius: 8,
948
+ padding: 24,
949
+ maxWidth: 400,
950
+ width: "100%"
951
+ },
952
+ children: /* @__PURE__ */ _(O, {
953
+ gap: "md",
954
+ children: [
955
+ /* @__PURE__ */ g(k, {
956
+ fw: 600,
957
+ size: "lg",
958
+ ta: "center",
959
+ children: e("reset.modalTitle")
960
+ }),
961
+ /* @__PURE__ */ g(k, {
962
+ size: "sm",
963
+ c: "dimmed",
964
+ ta: "center",
965
+ children: e("reset.modalDescription")
966
+ }),
967
+ /* @__PURE__ */ _(S, {
968
+ justify: "center",
969
+ gap: "xs",
970
+ mt: "md",
971
+ children: [
972
+ /* @__PURE__ */ g(b, {
973
+ variant: "default",
974
+ onClick: i,
975
+ children: e("reset.goBack")
976
+ }),
977
+ /* @__PURE__ */ g(b, {
978
+ color: "blue",
979
+ onClick: o,
980
+ children: e("reset.keepFiles")
981
+ }),
982
+ /* @__PURE__ */ g(b, {
983
+ color: "red",
984
+ onClick: a,
985
+ children: e("reset.burnEverything")
986
+ })
987
+ ]
988
+ })
989
+ ]
990
+ })
991
+ })
992
+ })]
993
+ });
994
+ }, $ = {
995
+ root: "_root_77epl_1",
996
+ sidebar: "_sidebar_77epl_8",
997
+ navItem: "_navItem_77epl_16",
998
+ content: "_content_77epl_41",
999
+ overviewPadding: "_overviewPadding_77epl_47",
1000
+ sectionCard: "_sectionCard_77epl_51",
1001
+ toolbar: "_toolbar_77epl_60",
1002
+ dirtyIndicator: "_dirtyIndicator_77epl_70",
1003
+ versionFooter: "_versionFooter_77epl_77"
1004
+ }, Te = {
1005
+ name: "Francisco Núñez Palomares",
1006
+ title: "Fullstack Developer & DevOps",
1007
+ email: "frannunpal@gmail.com",
1008
+ phone: "+34 600 275 210",
1009
+ location: "Spain",
1010
+ linkedin: "https://www.linkedin.com/in/francisco-núñez-palomares-74a484171/",
1011
+ github: "https://github.com/frannunpal",
1012
+ cvUrls: {
1013
+ en: "Desktop/CV_2026_English.pdf",
1014
+ es: "Desktop/CV 2026.pdf"
1015
+ }
1016
+ }, Ee = /* @__PURE__ */ e({ default: () => Ae }), De = "0.4.0", Oe = () => De, ke = {
1017
+ wallpaper: le,
1018
+ appearance: ue,
1019
+ launcher: de,
1020
+ font: _e,
1021
+ language: Se,
1022
+ reset: we
1023
+ }, Ae = ({ window: e, notifyReady: t }) => {
1024
+ let { t: a } = I("settings"), [o, s] = h(null), [c, l] = h(!1), f = n((e) => e.windows), v = e?.id ?? f.find((e) => e.content === "settings")?.id, y = K((e) => e.wallpaper), S = K((e) => e.wallpaperModule), C = K((e) => e.theme), w = K((e) => e.font), T = K((e) => e.fontSize), E = K((e) => e.launcherIcon), D = K((e) => e.customThemeColors), A = K((e) => e.animationDuration), te = K((e) => e.setWallpaper), j = K((e) => e.setWallpaperModule), M = K((e) => e.setFont), N = K((e) => e.setFontSize), P = K((e) => e.setLauncherIcon), ne = K((e) => e.setThemeMode), F = K((e) => e.setCustomThemeColors), L = K((e) => e.setThemeAutomatic), R = K((e) => e.setAnimationDuration), z = m(null);
1025
+ p(() => {
1026
+ z.current === null && (z.current = {
1027
+ wallpaper: y,
1028
+ wallpaperModule: S,
1029
+ themeMode: C.mode,
1030
+ font: w,
1031
+ fontSize: T,
1032
+ launcherIcon: E,
1033
+ customThemeColors: D,
1034
+ animationDuration: A
1035
+ });
1036
+ }, [
1037
+ y,
1038
+ S,
1039
+ C.mode,
1040
+ w,
1041
+ T,
1042
+ E,
1043
+ D,
1044
+ A
1045
+ ]), p(() => {
1046
+ if (!z.current) return;
1047
+ let e = {
1048
+ wallpaper: y,
1049
+ wallpaperModule: S,
1050
+ themeMode: C.mode,
1051
+ font: w,
1052
+ fontSize: T,
1053
+ launcherIcon: E,
1054
+ customThemeColors: D,
1055
+ animationDuration: A
1056
+ };
1057
+ l(JSON.stringify(e) !== JSON.stringify(z.current));
1058
+ }, [
1059
+ y,
1060
+ S,
1061
+ C.mode,
1062
+ w,
1063
+ T,
1064
+ E,
1065
+ D,
1066
+ A
1067
+ ]);
1068
+ let B = d(() => {
1069
+ let e = z.current;
1070
+ e && (te(e.wallpaper), j(e.wallpaperModule), M(e.font), N(e.fontSize), P(e.launcherIcon), R(e.animationDuration), e.customThemeColors ? F(e.customThemeColors) : (F(null), L()), ne(e.themeMode), l(!1));
1071
+ }, [
1072
+ te,
1073
+ j,
1074
+ M,
1075
+ N,
1076
+ P,
1077
+ R,
1078
+ ne,
1079
+ F,
1080
+ L
1081
+ ]);
1082
+ p(() => {
1083
+ v && u.getState().reset(v);
1084
+ }, [v]), p(() => {
1085
+ v && u.getState().setIsDirty(v, c);
1086
+ }, [v, c]), p(() => {
1087
+ t?.({
1088
+ ...e?.contentData ?? {},
1089
+ discard: B
1090
+ });
1091
+ }, [
1092
+ e,
1093
+ t,
1094
+ B
1095
+ ]), i({
1096
+ isDirtyGetter: d(() => {
1097
+ if (!z.current) return !1;
1098
+ let e = {
1099
+ wallpaper: K.getState().wallpaper,
1100
+ wallpaperModule: K.getState().wallpaperModule,
1101
+ themeMode: K.getState().theme.mode,
1102
+ font: K.getState().font,
1103
+ fontSize: K.getState().fontSize,
1104
+ launcherIcon: K.getState().launcherIcon,
1105
+ customThemeColors: K.getState().customThemeColors,
1106
+ animationDuration: K.getState().animationDuration
1107
+ };
1108
+ return JSON.stringify(e) !== JSON.stringify(z.current);
1109
+ }, []),
1110
+ windowId: v,
1111
+ onDiscard: B,
1112
+ onSave: () => {}
1113
+ });
1114
+ let V = d((e) => {
1115
+ s(e);
1116
+ }, []), H = d(() => {
1117
+ s(null);
1118
+ }, []), U = d(() => {
1119
+ globalThis.location.href = `mailto:${Te.email}`;
1120
+ }, []), W = o ? ke[o] : null;
1121
+ return /* @__PURE__ */ _("div", {
1122
+ className: $.root,
1123
+ children: [/* @__PURE__ */ g("aside", {
1124
+ className: $.sidebar,
1125
+ children: /* @__PURE__ */ _("nav", {
1126
+ "aria-label": "Settings sections",
1127
+ children: [/* @__PURE__ */ _("button", {
1128
+ className: $.navItem,
1129
+ "data-active": o === null || void 0,
1130
+ onClick: H,
1131
+ "aria-label": "All Settings",
1132
+ "aria-current": o === null ? "page" : void 0,
1133
+ children: [/* @__PURE__ */ g(r, {
1134
+ fcIcon: "FcList",
1135
+ size: 16
1136
+ }), /* @__PURE__ */ g(k, {
1137
+ size: "xs",
1138
+ ml: 6,
1139
+ truncate: !0,
1140
+ children: a("all")
1141
+ })]
1142
+ }), X.map((e) => /* @__PURE__ */ _("button", {
1143
+ className: $.navItem,
1144
+ "data-active": o === e.id || void 0,
1145
+ onClick: () => V(e.id),
1146
+ "aria-label": e.label,
1147
+ "aria-current": o === e.id ? "page" : void 0,
1148
+ children: [/* @__PURE__ */ g(r, {
1149
+ fcIcon: e.fcIcon,
1150
+ size: 16
1151
+ }), /* @__PURE__ */ g(k, {
1152
+ size: "xs",
1153
+ ml: 6,
1154
+ truncate: !0,
1155
+ children: a(`sections.${e.id}.label`)
1156
+ })]
1157
+ }, e.id))]
1158
+ })
1159
+ }), /* @__PURE__ */ g("main", {
1160
+ className: $.content,
1161
+ children: W ? /* @__PURE__ */ g(W, {}) : /* @__PURE__ */ _(O, {
1162
+ className: $.overviewPadding,
1163
+ h: "100%",
1164
+ justify: "space-between",
1165
+ gap: 0,
1166
+ children: [
1167
+ /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g(k, {
1168
+ fw: 500,
1169
+ mb: "md",
1170
+ size: "sm",
1171
+ c: "dimmed",
1172
+ children: a("all")
1173
+ }), /* @__PURE__ */ g(ee, {
1174
+ cols: 2,
1175
+ spacing: "sm",
1176
+ children: X.map((e) => /* @__PURE__ */ g(x, {
1177
+ withBorder: !0,
1178
+ padding: "md",
1179
+ radius: "md",
1180
+ className: $.sectionCard,
1181
+ onClick: () => V(e.id),
1182
+ role: "button",
1183
+ "aria-label": `Open ${e.label} settings`,
1184
+ children: /* @__PURE__ */ _(O, {
1185
+ gap: 6,
1186
+ align: "flex-start",
1187
+ children: [
1188
+ /* @__PURE__ */ g(r, {
1189
+ fcIcon: e.fcIcon,
1190
+ size: 28
1191
+ }),
1192
+ /* @__PURE__ */ g(k, {
1193
+ size: "sm",
1194
+ fw: 500,
1195
+ children: a(`sections.${e.id}.label`)
1196
+ }),
1197
+ /* @__PURE__ */ g(k, {
1198
+ size: "xs",
1199
+ c: "dimmed",
1200
+ children: a(`sections.${e.id}.description`)
1201
+ })
1202
+ ]
1203
+ })
1204
+ }, e.id))
1205
+ })] }),
1206
+ /* @__PURE__ */ g(b, {
1207
+ gradient: {
1208
+ from: "blue",
1209
+ to: "cyan",
1210
+ deg: 90
1211
+ },
1212
+ onClick: U,
1213
+ children: "FDE: Fran Desktop Environment"
1214
+ }),
1215
+ /* @__PURE__ */ g(k, {
1216
+ size: "xs",
1217
+ c: "dimmed",
1218
+ ta: "center",
1219
+ className: $.versionFooter,
1220
+ children: Oe()
1221
+ })
1222
+ ]
1223
+ })
1224
+ })]
1225
+ });
1226
+ };
1227
+ //#endregion
1228
+ export { z as _, be as a, fe as c, J as d, se as f, K as g, H as h, Q as i, Z as l, oe as m, Ee as n, ye as o, Y as p, Te as r, me as s, Ae as t, X as u };