@fde-desktop/fde-core 0.4.11 → 0.4.19
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.
- package/dist/{AppEmptyState-Boej96TB.js → AppEmptyState-BVfKZU-h.js} +1 -1
- package/dist/AppEmptyState-Z8_Cviti.cjs +1 -0
- package/dist/AppIcon-Czrtau6A.cjs +1 -0
- package/dist/{AppIcon-mtEoyzOb.js → AppIcon-aFNw89J2.js} +1 -1
- package/dist/AppMenuBar-38QtFTPk.cjs +1 -0
- package/dist/AppTempMemory-DAC62jiS.cjs +1 -0
- package/dist/AppTempMemory-DgUW6GaF.js +23 -0
- package/dist/CalendarApp-BYTyu089.js +9 -0
- package/dist/CalendarApp-DPOK4mqg.cjs +1 -0
- package/dist/{ColorPicker-WCeD3Wjf.js → ColorPicker-B76rCS2H.js} +1 -1
- package/dist/ColorPicker-BZqsPh3X.cjs +1 -0
- package/dist/CreateItemApp-B0IHL16b.cjs +1 -0
- package/dist/CreateItemApp-UUP2HAu2.js +149 -0
- package/dist/DeviceInfoApp-BPQyeVSd.js +162 -0
- package/dist/DeviceInfoApp-D2mS2OT-.cjs +1 -0
- package/dist/DownloadProgress-CpJguS8g.cjs +1 -0
- package/dist/FilePickerApp-ClmPw6lk.cjs +1 -0
- package/dist/{FilePickerApp-ClHuhm6Z.js → FilePickerApp-D7fERKbp.js} +1 -1
- package/dist/FilesApp-DhJbO8wg.js +191 -0
- package/dist/FilesApp-LbwRRR1i.cjs +1 -0
- package/dist/IconColorPicker-7rWNAiNQ.cjs +1 -0
- package/dist/IconColorPicker-DUIXSb5E.js +58 -0
- package/dist/ImageViewerApp-9T-V8uP5.cjs +1 -0
- package/dist/ImageViewerApp-ihqIwJ-L.js +68 -0
- package/dist/ImageViewerMenuBar-DmvZoZ03.cjs +1 -0
- package/dist/{ImageViewerMenuBar-BIsUokxV.js → ImageViewerMenuBar-ZeIKHdA-.js} +18 -19
- package/dist/MenuEditApp-DRKfmSIZ.js +361 -0
- package/dist/MenuEditApp-U7EqB5Rl.cjs +1 -0
- package/dist/MenuEditMenuBar-BE_cXaoG.cjs +1 -0
- package/dist/MenuEditMenuBar-Df1je7F6.js +59 -0
- package/dist/NotesApp-DZfNQ8mN.cjs +1 -0
- package/dist/NotesApp-rwAeXyJy.js +344 -0
- package/dist/{NotesMenuBar-DILZTjnT.js → NotesMenuBar-C503t5pu.js} +12 -13
- package/dist/NotesMenuBar-CwgZ9dHy.cjs +1 -0
- package/dist/PdfApp-DNZaSXbF.cjs +1 -0
- package/dist/PdfApp-K1Z612o3.js +38 -0
- package/dist/PdfMenuBar-BPzP_JUO.cjs +1 -0
- package/dist/PdfMenuBar-DEUKgKTE.js +38 -0
- package/dist/SettingsApp-DdWqiYFE.cjs +1 -0
- package/dist/SettingsApp-ghc3RaMv.js +875 -0
- package/dist/SettingsMenuBar-C4KAPoBs.js +41 -0
- package/dist/SettingsMenuBar-CgmaF9_B.cjs +1 -0
- package/dist/{UploaderApp-CbypD538.js → UploaderApp-D9vfOR0S.js} +28 -40
- package/dist/UploaderApp-omSY-NSn.cjs +1 -0
- package/dist/VscIcon-CeELixwP.cjs +1 -0
- package/dist/buildBreadcrumbs-C2c2a4R3.cjs +1 -0
- package/dist/desktopStore-LSQweOqZ.cjs +1 -0
- package/dist/{desktopStore-8cSZlj7s.js → desktopStore-xnNbYaYm.js} +263 -263
- package/dist/formatBytes-Bv1bQPKQ.cjs +1 -0
- package/dist/formatBytes-CaP80WnM.js +14 -0
- package/dist/i18nConstants-DgbKSBIK.cjs +1 -0
- package/dist/i18nConstants-Nzpf2IFp.js +611 -0
- package/dist/imageViewerStore-CYt4R4e4.cjs +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +50 -29
- package/dist/index.js +715 -658
- package/dist/menuEditStore-sU6qaF2j.cjs +1 -0
- package/dist/notesStore-BnMXBRaV.cjs +1 -0
- package/dist/settingsAppStore-CQ4JHd7Q.cjs +1 -0
- package/dist/useAdaptiveDimensions-BDZxP4E3.cjs +1 -0
- package/dist/{useAdaptiveDimensions-DxNLJ7R5.js → useAdaptiveDimensions-sv9lwqF_.js} +1 -1
- package/dist/useCloseInterceptor-AzfjUZgz.cjs +1 -0
- package/dist/{useCloseInterceptor-CIxhOZx1.js → useCloseInterceptor-Bwm4I0O8.js} +1 -1
- package/dist/useDeviceDetection-B9jjlate.js +37 -0
- package/dist/useDeviceDetection-CnxnQWIq.cjs +1 -0
- package/dist/useDragDrop-Bdwzk6VO.cjs +1 -0
- package/dist/useDragDrop-D2LtOEYC.js +139 -0
- package/dist/useDynamicIcon-Cg3B_Aeq.cjs +1 -0
- package/dist/useNotifications-CR9JLjtC.js +26 -0
- package/dist/useNotifications-rwLmJ7fI.cjs +1 -0
- package/dist/useOpenApp-BBZ_B7Pr.cjs +1 -0
- package/dist/{useOpenApp-DkZLFFCH.js → useOpenApp-DdEbOVby.js} +3 -3
- package/dist/useResolvedUrl-CgqjNxzw.js +389 -0
- package/dist/useResolvedUrl-Dz2AhrDV.cjs +1 -0
- package/package.json +1 -1
- package/dist/AppEmptyState-CLc00OOG.cjs +0 -1
- package/dist/AppIcon-C8vHUVcb.cjs +0 -1
- package/dist/AppMenuBar-CAlkNHjj.cjs +0 -1
- package/dist/CalendarApp-DOmjWbpl.js +0 -10
- package/dist/CalendarApp-Z0bCCYsK.cjs +0 -1
- package/dist/ColorPicker-CQRRwY-y.cjs +0 -1
- package/dist/CreateItemApp-BkFFFdX1.cjs +0 -1
- package/dist/CreateItemApp-DR8Y4bwo.js +0 -202
- package/dist/DeviceInfoApp-BXQ9uOwF.cjs +0 -1
- package/dist/DeviceInfoApp-I63mJRWy.js +0 -195
- package/dist/DownloadProgress-CkTGTf0z.cjs +0 -1
- package/dist/FilePickerApp-By6-vbag.cjs +0 -1
- package/dist/FilesApp-BC4UPNuw.cjs +0 -1
- package/dist/FilesApp-D8MqvC5X.js +0 -210
- package/dist/ImageViewerApp-B1niWF75.cjs +0 -1
- package/dist/ImageViewerApp-iojtyFEf.js +0 -69
- package/dist/ImageViewerMenuBar-BgzgSF3v.cjs +0 -1
- package/dist/MenuEditApp-BHptoJbz.cjs +0 -1
- package/dist/MenuEditApp-CJUbJaqh.js +0 -492
- package/dist/MenuEditMenuBar-CCOSPAUe.cjs +0 -1
- package/dist/MenuEditMenuBar-DnCL-kaZ.js +0 -60
- package/dist/NotesApp-BmQIBtJ2.cjs +0 -1
- package/dist/NotesApp-DJ2dGt4-.js +0 -364
- package/dist/NotesMenuBar-BzojwMtH.cjs +0 -1
- package/dist/PdfApp-IjY_GtnW.js +0 -39
- package/dist/PdfApp-krW8UI97.cjs +0 -1
- package/dist/PdfMenuBar-Bd5MTZcZ.js +0 -39
- package/dist/PdfMenuBar-DWD0Qa3F.cjs +0 -1
- package/dist/SettingsApp-BE22l5UP.cjs +0 -1
- package/dist/SettingsApp-BTFtTFY_.js +0 -1228
- package/dist/SettingsMenuBar-CZE2evG2.cjs +0 -1
- package/dist/SettingsMenuBar-ktC0viTd.js +0 -42
- package/dist/UploaderApp-D_qD3O70.cjs +0 -1
- package/dist/VscIcon-BYb_Soyy.cjs +0 -1
- package/dist/buildBreadcrumbs-Ccd8i11b.cjs +0 -1
- package/dist/desktopStore-C1jR6Fdb.cjs +0 -1
- package/dist/imageViewerStore-Dfylg59V.cjs +0 -1
- package/dist/menuEditStore-CYwtfD6H.cjs +0 -1
- package/dist/notesStore-CrWTO6oB.cjs +0 -1
- package/dist/rolldown-runtime-CAFD8bLK.js +0 -11
- package/dist/settingsAppStore-DuYZNeFf.cjs +0 -1
- package/dist/useAdaptiveDimensions-3Lz4X0Tc.cjs +0 -1
- package/dist/useCloseInterceptor-CdX-09Ib.cjs +0 -1
- package/dist/useDynamicIcon-CK6SjEv5.cjs +0 -1
- package/dist/useOpenApp-D-FOY88T.cjs +0 -1
- package/dist/useResolvedUrl-B6x4xy0x.js +0 -29
- package/dist/useResolvedUrl-Bb39DpVy.cjs +0 -1
- /package/dist/{Colors-CuABn2W4.js → Colors-BIj4g0eH.js} +0 -0
- /package/dist/{Colors-CNJbU7oq.cjs → Colors-PNt4eyR6.cjs} +0 -0
- /package/dist/{DownloadProgress-DnVASsv5.js → DownloadProgress-DBFA58C5.js} +0 -0
- /package/dist/{imageViewerStore-COrD02Zu.js → imageViewerStore-C6UgceP-.js} +0 -0
- /package/dist/{menuEditStore-CxsgLiQu.js → menuEditStore-DPqViGva.js} +0 -0
- /package/dist/{notesStore-Dgah46U5.js → notesStore-KZDXN6zx.js} +0 -0
- /package/dist/{settingsAppStore-DHZhi6Rl.js → settingsAppStore-Y7x3r6pV.js} +0 -0
- /package/dist/{useMenuBarUtils-DAap0ukp.cjs → useMenuBarUtils-BOnQYtKU.cjs} +0 -0
- /package/dist/{useMenuBarUtils-ChAfI7OA.js → useMenuBarUtils-DTPFK0IN.js} +0 -0
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./NotesApp-BmQIBtJ2.cjs`),t=require(`./SettingsApp-BE22l5UP.cjs`),n=require(`./useOpenApp-D-FOY88T.cjs`),r=require(`./desktopStore-C1jR6Fdb.cjs`),i=require(`./useDynamicIcon-CK6SjEv5.cjs`),a=require(`./useAdaptiveDimensions-3Lz4X0Tc.cjs`),o=require(`./MenuEditApp-BHptoJbz.cjs`),s=require(`./AppIcon-C8vHUVcb.cjs`),c=require(`./useCloseInterceptor-CdX-09Ib.cjs`),l=require(`./VscIcon-BYb_Soyy.cjs`),u=require(`./AppMenuBar-CAlkNHjj.cjs`),d=require(`./FilesApp-BC4UPNuw.cjs`),f=require(`./buildBreadcrumbs-Ccd8i11b.cjs`),p=require(`./DeviceInfoApp-BXQ9uOwF.cjs`),m=require(`./useResolvedUrl-Bb39DpVy.cjs`),h=require(`./CalendarApp-Z0bCCYsK.cjs`),g=require(`./FilePickerApp-By6-vbag.cjs`),_=require(`./AppEmptyState-CLc00OOG.cjs`),v=require(`./Colors-CNJbU7oq.cjs`),y=require(`./ImageViewerApp-B1niWF75.cjs`),b=require(`./PdfApp-krW8UI97.cjs`),x=require(`./DownloadProgress-CkTGTf0z.cjs`),S=require(`./UploaderApp-D_qD3O70.cjs`),C=require(`./ColorPicker-CQRRwY-y.cjs`),w=require(`./useMenuBarUtils-DAap0ukp.cjs`),T=require(`./NotesMenuBar-BzojwMtH.cjs`),E=require(`./MenuEditMenuBar-CCOSPAUe.cjs`),D=require(`./SettingsMenuBar-CZE2evG2.cjs`),O=require(`./PdfMenuBar-DWD0Qa3F.cjs`),k=require(`./ImageViewerMenuBar-BgzgSF3v.cjs`),A=require(`./CreateItemApp-BkFFFdX1.cjs`);require(`@mantine/core/styles.css`),require(`@mantine/dates/styles.css`);let j=require(`react`);j=e.a(j);let M=require(`react/jsx-runtime`),N=require(`@mantine/core`),P=require(`@tanstack/react-query`),F=require(`zustand`),I=require(`framer-motion`),L=require(`react-i18next`),R=require(`i18next`);R=e.a(R);let z=require(`i18next-browser-languagedetector`);z=e.a(z);let ee=require(`react-rnd`),B=require(`zustand/react/shallow`),V=require(`react-icons/fc`),te=require(`@xterm/xterm`),H=require(`@xterm/addon-fit`),U=require(`@xterm/addon-clipboard`);require(`@xterm/xterm/css/xterm.css`);let ne=require(`uuid`);var W=(0,j.createContext)(void 0),re={borderRadius:`8px`,headerHeight:40,minWidth:400,minHeight:300,defaultWidth:800,defaultHeight:600,shadow:`0 8px 32px rgba(0, 0, 0, 0.2)`},ie={height:48,position:`bottom`,background:`rgba(0, 0, 0, 0.8)`,blur:!0},ae={light:{mode:`light`,colors:{desktop:`#f0f4f8`,taskbar:`rgba(255, 255, 255, 0.9)`,window:`#ffffff`,accent:`#339af0`},window:re,taskbar:ie,desktop:{background:`linear-gradient(135deg, #667eea 0%, #764ba2 100%)`,iconSize:64,iconSpacing:16}},dark:{mode:`dark`,colors:{desktop:`#1a1b1e`,taskbar:`rgba(26, 27, 30, 0.9)`,window:`#25262b`,accent:`#4dabf7`},window:re,taskbar:ie,desktop:{background:`linear-gradient(135deg, #1a1b1e 0%, #2d1f3d 100%)`,iconSize:64,iconSpacing:16}}};function oe({children:e,initialMode:t=`light`,mode:n,theme:r}){let[i,a]=(0,j.useState)(n??t),o=(0,j.useRef)(null);(0,j.useEffect)(()=>{n!==void 0&&n!==i&&a(n)},[n,i]);let s=(0,j.useCallback)(()=>{a(e=>e===`light`?`dark`:`light`)},[]),c=(0,j.useCallback)(e=>{o.current=e},[]),l=(0,j.useCallback)(()=>{let e=ae[i],t=o.current;return t?{...e,colors:{desktop:r?.colors?.desktop??e.colors.desktop,taskbar:t.taskbar,window:t.window,accent:t.accent},window:{...e.window,...r?.window},taskbar:{...e.taskbar,...r?.taskbar},desktop:{...e.desktop,...r?.desktop}}:r?{mode:r.mode??e.mode,colors:{desktop:r.colors?.desktop??e.colors.desktop,taskbar:r.colors?.taskbar??e.colors.taskbar,window:r.colors?.window??e.colors.window,accent:r.colors?.accent??e.colors.accent},window:{...e.window,...r.window},taskbar:{...e.taskbar,...r.taskbar},desktop:{...e.desktop,...r.desktop}}:e},[i,r]);(0,j.useEffect)(()=>{document.documentElement.style.setProperty(`color-scheme`,i),document.documentElement.setAttribute(`data-mantine-color-scheme`,i)},[i]);let u=(0,j.useMemo)(()=>({getTheme:l,setMode:a,toggle:s,setCustomColors:c}),[l,a,s,c]);return(0,M.jsx)(W.Provider,{value:u,children:e})}function se(){let e=(0,j.useContext)(W);if(!e)throw Error(`useTheme must be used within a ThemeProvider`);return e.getTheme()}function ce(){let e=(0,j.useContext)(W);if(!e)throw Error(`useThemeContext must be used within a ThemeProvider`);return e}var le={primaryColor:`blue`,other:{desktop:{backgroundColor:`#1a1a2e`},taskbar:{backgroundColor:`#16213e`,textColor:`#ffffff`},window:{backgroundColor:`#0f0f23`,textColor:`#ffffff`,borderRadius:`8px`},accent:`#339af0`}},ue=(0,j.createContext)(void 0),de=new P.QueryClient({defaultOptions:{queries:{staleTime:1/0,gcTime:1/0}}});function fe({children:e,fileSystem:n,isReady:r,error:i}){let a=se(),o=t.g(e=>e.setThemeMode),s=t.g(e=>e.toggleTheme),c=(0,j.useMemo)(()=>({fs:r?n:null,isReady:r,error:i,theme:a,setThemeMode:o,toggleTheme:s}),[n,r,i,a,o,s]);return(0,M.jsx)(ue.Provider,{value:c,children:e})}function pe({children:e,fileSystem:n,initialMode:r,theme:i,mantineTheme:a,fallback:o=null,onError:s,queryClient:c=de}){let[l,u]=(0,j.useState)(!1),[d,f]=(0,j.useState)(null),p=t.g(e=>e.theme.mode),m=t.g(e=>e.setThemeMode);(0,j.useEffect)(()=>{r&&m(r)},[]),(0,j.useEffect)(()=>{let e=!0;return(async()=>{try{await n.initialize(),e&&u(!0)}catch(t){let n=t instanceof Error?t:Error(String(t));e&&(f(n),s?.(n))}})(),()=>{e=!1}},[n,s]);let h=(0,j.useMemo)(()=>(0,N.createTheme)({...le,...a}),[a]);return d||!l?(0,M.jsx)(M.Fragment,{children:o}):(0,M.jsx)(P.QueryClientProvider,{client:c,children:(0,M.jsx)(N.MantineProvider,{theme:h,forceColorScheme:p,children:(0,M.jsx)(oe,{mode:p,theme:i,children:(0,M.jsx)(fe,{fileSystem:n,isReady:l,error:d,children:e})})})})}function me(){let e=(0,j.useContext)(ue);if(!e)throw Error(`useFdeContext must be used within an FdeProvider`);return e}var he=(0,j.createContext)(null),ge=({children:e})=>{let t=(0,j.useRef)(new Map);return(0,M.jsx)(he.Provider,{value:{register:(e,n)=>{t.current.set(e,n)},unregister:e=>{t.current.delete(e)},getRect:e=>t.current.get(e)},children:e})},_e=()=>{let e=(0,j.useContext)(he);if(!e)throw Error(`useWindowButtonRegistry must be used within WindowButtonRegistryProvider`);return e},ve={root:`_root_1z0nr_1`},ye=`linear-gradient(90deg, rgba(42, 123, 155, 1) 0%, rgba(87, 199, 133, 1) 50%, rgba(237, 221, 83, 1) 100%)`,be=({children:e,onContextMenu:t,wallpaper:n,backgroundColor:i})=>{let a=r.o(e=>e.setViewportSize),o=(0,j.useRef)(null);(0,j.useEffect)(()=>{let e=o.current;if(!e)return;let t=new ResizeObserver(e=>{let{width:t,height:n}=e[0]?.contentRect??{};t&&t>0&&n&&n>0&&a(t,n)});return t.observe(e),()=>t.disconnect()},[a]);let s=n?`url(${n})`:ye;return(0,M.jsx)(`div`,{ref:o,className:ve.root,"data-testid":`desktop-area`,style:{"--taskbar-height":`48px`,backgroundColor:i??`transparent`,backgroundImage:s,backgroundSize:`cover`,backgroundPosition:`center`},onContextMenu:t,children:e})},xe=e=>e.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}),Se=()=>{let[e,t]=(0,j.useState)(()=>xe(new Date));return(0,j.useEffect)(()=>{let e=setInterval(()=>t(xe(new Date)),1e3);return()=>clearInterval(e)},[]),e},Ce=-8,we=0,Te=()=>{let[e,t]=(0,j.useState)({activeMenu:null,position:{x:0,y:0},targetWindowId:null}),n=(0,j.useCallback)((e,n)=>{e.preventDefault(),e.stopPropagation(),t({activeMenu:`window`,position:{x:e.clientX,y:e.clientY+Ce},targetWindowId:n})},[]),r=(0,j.useCallback)(e=>{e.preventDefault(),t({activeMenu:`panel`,position:{x:e.clientX,y:e.clientY+Ce},targetWindowId:null})},[]),i=(0,j.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),t({activeMenu:`launcher`,position:{x:e.clientX,y:e.clientY+we},targetWindowId:null})},[]),a=(0,j.useCallback)(()=>{t(e=>({...e,activeMenu:null}))},[]);return{activeMenu:e.activeMenu,position:e.position,targetWindowId:e.targetWindowId,windowMenuOpened:e.activeMenu===`window`,panelMenuOpened:e.activeMenu===`panel`,launcherMenuOpened:e.activeMenu===`launcher`,openWindowMenu:n,openPanelMenu:r,openLauncherMenu:i,closeMenu:a}},Ee=()=>{let e=t.g(e=>e.animationDuration);return{duration:e,windowVariants:n.f(e),panelVariants:n.u(e),minimizeVariant:n.l(.3),restoreVariant:n.d(.3),maximizeTransition:n.c(.25),easeIn:n.o(e),easeOut:n.s(e)}},G={WELCOME:`welcome`,NOTEPAD:`notepad`,UPLOADER:`uploader`,FILES:`files`,SETTINGS:`settings`,PDF:`pdf`,CALENDAR:`calendar`,STORYBOOK:`storybook`,LINKEDIN:`linkedin`,GITHUB:`github`,IMAGE_VIEWER:`image-viewer`,DOS_EMULATOR:`dos-emulator`,DOOM:`doom`,TERMINAL:`terminal`,CODE_SERVER:`code-server`,DEVICE_INFO:`device-info`,MENUEDIT:`menuedit`},De={[G.FILES]:`filesApp`,[G.PDF]:`pdfViewer`,[G.IMAGE_VIEWER]:`imageViewer`,[G.DOS_EMULATOR]:`dosEmulator`,[G.CODE_SERVER]:`codeServer`,[G.DEVICE_INFO]:`deviceInfo`},Oe=[G.WELCOME,G.UPLOADER,G.TERMINAL,G.CODE_SERVER,G.STORYBOOK,G.SETTINGS,G.NOTEPAD,G.LINKEDIN,G.GITHUB,G.FILES,G.DOOM];function ke(e){let{t}=(0,L.useTranslation)(`apps`);return e?t(`names.${De[e]??e}`,e):``}function Ae(e,t,n){return(0,j.useMemo)(()=>{if(!t.trim())return e;let r=t.toLowerCase().trim();return e.filter(e=>{let t=n(e);return Array.isArray(t)?t.some(e=>e.toLowerCase().includes(r)):t.toLowerCase().includes(r)})},[e,t,n])}function je(e){let[t,n]=(0,j.useState)(e??new Set);return{expanded:t,toggle:(0,j.useCallback)(e=>{n(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),expand:(0,j.useCallback)(e=>{n(t=>{let n=new Set(t);return n.add(e),n})},[]),collapse:(0,j.useCallback)(e=>{n(t=>{let n=new Set(t);return n.delete(e),n})},[]),expandAll:(0,j.useCallback)(e=>{n(new Set(e))},[]),collapseAll:(0,j.useCallback)(()=>{n(new Set)},[]),reset:(0,j.useCallback)(()=>{n(new Set)},[]),isExpanded:(0,j.useCallback)(e=>t.has(e),[t])}}var Me={header:`_header_2d0oy_1`,iconContainer:`_iconContainer_2d0oy_20`,expandIcon:`_expandIcon_2d0oy_28`,icon:`_icon_2d0oy_20`,title:`_title_2d0oy_42`,content:`_content_2d0oy_48`},Ne=({title:e,fcIcon:t=`FcFolder`,expanded:n,onToggle:r,children:a,className:o,"aria-label":c})=>{let l=i.c(n?`VscRemove`:`VscAdd`,{size:14,className:Me.expandIcon});return(0,M.jsxs)(`div`,{className:o,children:[(0,M.jsxs)(N.UnstyledButton,{className:Me.header,onClick:r,"aria-expanded":n,"aria-label":c??e,children:[(0,M.jsx)(`span`,{className:Me.iconContainer,children:l}),(0,M.jsx)(`span`,{className:Me.icon,children:(0,M.jsx)(s.t,{fcIcon:t,size:16})}),(0,M.jsx)(N.Text,{size:`sm`,fw:500,className:Me.title,children:e})]}),n&&(0,M.jsx)(`div`,{className:Me.content,children:a})]})},K={trigger:`_trigger_4gumo_1`,panel:`_panel_4gumo_23`,searchContainer:`_searchContainer_4gumo_39`,searchInput:`_searchInput_4gumo_43`,scrollContainer:`_scrollContainer_4gumo_47`,appsSection:`_appsSection_4gumo_56`,appButton:`_appButton_4gumo_62`,appIcon:`_appIcon_4gumo_82`};function Pe(e){let t=e.icon,n=`fcIcon`in e?e.fcIcon:void 0,r=t?.startsWith(`Fc`)||t?.startsWith(`Fi`)||t?.startsWith(`Vsc`);return{id:e.id,name:e.name,fcIcon:n??(r?t:void 0),icon:r?void 0:t,iconUrl:`iconUrl`in e?e.iconUrl:void 0,iconColor:`iconColor`in e?e.iconColor:void 0}}var Fe=({app:e,onOpen:t})=>{let n=ke(e.id);return(0,M.jsxs)(`button`,{className:K.appButton,onClick:()=>t(e.id),role:`menuitem`,"aria-label":n,children:[(0,M.jsx)(`span`,{className:K.appIcon,children:(0,M.jsx)(s.t,{fcIcon:e.fcIcon,iconUrl:e.iconUrl,fallback:e.icon,color:e.iconColor})}),(0,M.jsx)(N.Text,{size:`sm`,children:n})]},e.id)},Ie=({folder:e,isExpanded:t,apps:n,onToggle:r,onOpen:i})=>(0,M.jsx)(Ne,{title:o.s(e),fcIcon:e.fcIcon,expanded:t,onToggle:r,children:n.map(e=>(0,M.jsx)(Fe,{app:e,onOpen:i},e.id))},e.id),Le=({fcIcon:e=`FcDebian`,onContextMenu:a})=>{let o=i.i(e,{size:22,style:{display:`block`}}),[s,c]=(0,j.useState)(!1),[l,u]=(0,j.useState)(``),d=n.t(),f=t.g(e=>e.theme.colors.taskbar),p=r.o(e=>e.launcherFolders),m=r.o(e=>e.customApps),{panelVariants:h}=Ee(),g=(0,j.useRef)(null),_=(0,j.useRef)(null),{expanded:v,toggle:y,reset:b}=je(new Set),x=(0,j.useMemo)(()=>[...r.st].sort((e,t)=>e.name.localeCompare(t.name)),[]),S=(0,j.useMemo)(()=>new Set(p.flatMap(e=>e.appIds)),[p]),C=Ae((0,j.useMemo)(()=>x.filter(e=>!S.has(e.id)),[x,S]),l,e=>[e.id,e.name]),w=(0,j.useMemo)(()=>{if(!l.trim())return[...p].sort((e,t)=>e.isPredefined===t.isPredefined?e.name.localeCompare(t.name):e.isPredefined?-1:1);let e=l.toLowerCase();return p.map(t=>({...t,appIds:t.appIds.filter(t=>{let n=x.find(e=>e.id===t);return n?n.id.toLowerCase().includes(e)||n.name.toLowerCase().includes(e):!1})})).filter(e=>e.appIds.length>0).sort((e,t)=>e.isPredefined===t.isPredefined?e.name.localeCompare(t.name):e.isPredefined?-1:1)},[p,l,x]),T=(0,j.useMemo)(()=>{if(!l.trim())return m;let e=l.toLowerCase();return m.filter(t=>t.id.toLowerCase().includes(e)||t.name.toLowerCase().includes(e))},[m,l]);(0,j.useEffect)(()=>{l.trim()&&s&&(w.map(e=>e.id).forEach(e=>{v.has(e)||y(e)}),T.length>0&&!v.has(`launcher-folder-custom-apps`)&&y(r.z))},[l,w,T,s,v,y]),(0,j.useEffect)(()=>{s||b()},[s,b]),(0,j.useEffect)(()=>{if(!s)return;let e=e=>{g.current&&!g.current.contains(e.target)&&(c(!1),u(``))},t=e=>{e.key===`Escape`&&(c(!1),u(``))};return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[s]);let E=e=>{if(e.preventDefault(),e.stopPropagation(),s){c(!1),u(``);return}a?.(e)};(0,j.useEffect)(()=>{s&&_.current&&_.current.focus()},[s]);let D=(0,j.useCallback)(e=>{d(e),c(!1),u(``)},[d]),O=(0,j.useCallback)(e=>{y(e)},[y]),k=i.i(`FcSearch`,{size:16}),A=(0,j.useCallback)(()=>{s?(c(!1),u(``)):c(!0)},[s]);return(0,M.jsxs)(`div`,{ref:g,children:[(0,M.jsx)(`button`,{className:K.trigger,onClick:A,onContextMenu:E,"aria-label":`Launcher`,"aria-expanded":s,children:o}),(0,M.jsx)(I.AnimatePresence,{children:s&&(0,M.jsxs)(I.motion.div,{className:K.panel,style:{background:f},role:`menu`,"aria-label":`App launcher`,initial:h.initial,animate:h.animate,exit:h.exit,children:[(0,M.jsx)(`div`,{className:K.searchContainer,children:(0,M.jsx)(N.TextInput,{ref:_,placeholder:`Search apps...`,value:l,onChange:e=>u(e.target.value),leftSection:k,size:`xs`,classNames:{input:K.searchInput},"aria-label":`Search apps`})}),(0,M.jsxs)(`div`,{className:K.scrollContainer,children:[w.map(e=>{let t=v.has(e.id);return e.id===`launcher-folder-custom-apps`?T.length===0?null:(0,M.jsx)(Ie,{folder:e,isExpanded:t,apps:T.map(Pe),onToggle:()=>O(e.id),onOpen:D},e.id):(0,M.jsx)(Ie,{folder:e,isExpanded:t,apps:e.appIds.map(e=>x.find(t=>t.id===e)).filter(e=>e!==void 0).sort((e,t)=>e.name.localeCompare(t.name)).map(Pe),onToggle:()=>O(e.id),onOpen:D},e.id)}),C.length>0&&(0,M.jsx)(`div`,{className:K.appsSection,children:C.map(e=>(0,M.jsx)(Fe,{app:Pe(e),onOpen:D},e.id))}),l&&C.length===0&&w.length===0&&T.length===0&&(0,M.jsx)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,mt:`md`,children:`No apps found`})]})]})})]})},Re=({x:e,y:t})=>(0,M.jsx)(N.Menu.Target,{children:(0,M.jsx)(`div`,{"aria-hidden":`true`,style:{position:`fixed`,left:e,top:t,width:0,height:0,pointerEvents:`none`}})}),ze=e=>{let t=(0,j.useRef)(null),[n,r]=(0,j.useState)(0);return(0,j.useLayoutEffect)(()=>{if(t.current&&e){let e=t.current.offsetHeight;r(e)}},[e]),{menuRef:t,menuHeight:n}},Be={menuItem:`_menuItem_18vno_1`},Ve=8,He=({windowMenuOpened:e,panelMenuOpened:t,launcherMenuOpened:a,menuPosition:o,targetWindowId:s,targetWindowState:c,onCloseWindow:l,onMinimizeWindow:u,onMaximizeWindow:d,onRestoreWindow:f,onClose:p})=>{let{t:m}=(0,L.useTranslation)(`contextMenu`),h={size:14,style:{display:`block`}},g=()=>i.i(`FcCancel`,h),_=()=>i.i(`FcMinus`,h),v=()=>i.i(`FcTemplate`,h),y=()=>i.i(`FcUndo`,h),b=()=>i.i(`FcSettings`,h),x=()=>i.i(`FcFolder`,h),S=n.t(),C=ke(`menuedit`),w=r.o(e=>e.openWindow),T=c===`minimized`,E=c===`maximized`,{menuRef:D,menuHeight:O}=ze(e),{menuRef:k,menuHeight:A}=ze(t),{menuRef:P,menuHeight:F}=ze(a),[I,R]=(0,j.useState)(!1),[z,ee]=(0,j.useState)(!1),[B,V]=(0,j.useState)(!1);(0,j.useLayoutEffect)(()=>{e||R(!1),e&&O>0&&R(!0)},[e,O]),(0,j.useLayoutEffect)(()=>{t||ee(!1),t&&A>0&&ee(!0)},[t,A]),(0,j.useLayoutEffect)(()=>{a||V(!1),a&&F>0&&V(!0)},[a,F]);let te=(0,j.useMemo)(()=>e?{height:O,ready:I}:t?{height:A,ready:z}:a?{height:F,ready:B}:{height:0,ready:!1},[e,t,a,O,A,F,I,z,B]),H=(0,j.useMemo)(()=>{let{x:e,y:t}=o,{height:n,ready:r}=te,i=t-Ve;return r&&n>0&&t>window.innerHeight-48-n-Ve&&(i=t-n+Ve),{x:e,y:i}},[o,te]),U=()=>{p(),w({title:C,content:`menuedit`,fcIcon:`FcFolder`,x:Math.min(o.x+10,window.innerWidth-800),y:Math.min(o.y+10,window.innerHeight-600),width:700,height:500,minWidth:500,minHeight:400})},ne=()=>{p(),S(`settings`)},W=e=>({opacity:e?1:0,transition:`opacity 0.05s ease`,zIndex:99999});return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(N.Menu,{opened:e,onClose:p,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,children:[(0,M.jsx)(Re,{x:H.x,y:H.y}),(0,M.jsxs)(N.Menu.Dropdown,{ref:D,style:W(I),children:[!T&&(0,M.jsx)(N.Menu.Item,{onClick:()=>{s&&u(s)},children:(0,M.jsxs)(`div`,{className:Be.menuItem,children:[(0,M.jsx)(_,{}),` `,m(`window.minimize`)]})}),T||E?(0,M.jsx)(N.Menu.Item,{onClick:()=>{s&&f(s)},children:(0,M.jsxs)(`div`,{className:Be.menuItem,children:[(0,M.jsx)(y,{}),` `,m(`window.restore`)]})}):(0,M.jsx)(N.Menu.Item,{onClick:()=>{s&&d(s)},children:(0,M.jsxs)(`div`,{className:Be.menuItem,children:[(0,M.jsx)(v,{}),` `,m(`window.maximize`)]})}),(0,M.jsx)(N.Menu.Divider,{}),(0,M.jsx)(N.Menu.Item,{onClick:()=>{s&&l(s)},children:(0,M.jsxs)(`div`,{className:Be.menuItem,children:[(0,M.jsx)(g,{}),` `,m(`window.close`)]})})]})]}),(0,M.jsxs)(N.Menu,{opened:t,onClose:p,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,children:[(0,M.jsx)(Re,{x:H.x,y:H.y}),(0,M.jsx)(N.Menu.Dropdown,{ref:k,style:W(z),children:(0,M.jsx)(N.Menu.Item,{onClick:()=>{S(`settings`)},children:(0,M.jsxs)(`div`,{className:Be.menuItem,children:[(0,M.jsx)(b,{}),` `,m(`apps:names.settings`)]})})})]}),(0,M.jsxs)(N.Menu,{opened:a,onClose:p,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,children:[(0,M.jsx)(Re,{x:H.x,y:H.y}),(0,M.jsxs)(N.Menu.Dropdown,{ref:P,style:W(B),children:[(0,M.jsx)(N.Menu.Label,{children:m(`launcher.title`)}),(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(x,{}),onClick:U,children:m(`launcher.editLauncher`)}),(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(b,{}),onClick:ne,children:m(`apps:names.settings`)})]})]})]})},Ue={actions:{save:`Save`,saveAs:`Save As`,cancel:`Cancel`,ok:`OK`,open:`Open`,close:`Close`,delete:`Delete`,create:`Create`,new:`New`,exit:`Exit`,apply:`Apply`,discard:`Discard`,reset:`Reset`,download:`Download`,upload:`Upload`,copy:`Copy`,cut:`Cut`,paste:`Paste`,undo:`Undo`,redo:`Redo`,createFolder:`Create folder`,createFile:`Create new file`,select:`Select`},buttons:{minimize:`Minimize`,maximize:`Maximize`,restore:`Restore`,close:`Close`,yes:`Yes`,no:`No`,confirm:`Confirm`,continue:`Continue`},labels:{name:`Name`,title:`Title`,filename:`Filename`,url:`URL`,file:`File`,folder:`Folder`,home:`Home`,type:`Type`,loading:`Loading...`,search:`Search`,searchIcons:`Search icons...`,unsavedChanges:`Unsaved Changes`,unsaved:`Unsaved changes`,workInProgress:`Work In Progress`},messages:{areYouSure:`Are you sure?`,cannotBeUndone:`This action cannot be undone.`,noFileSelected:`No file selected`,folderEmpty:`This folder is empty`,noMatchingFiles:`No matching files`,noSubfolders:`No subfolders`,replaceFile:`Replace file?`,replaceFileMessage:`A file named "{{name}}" already exists. Do you want to replace it?`,yesReplace:`Yes, replace`,forBetterExperience:`For a better experience use this app desktop OR horizontal mode`,turnYourDevice:`Turn your device`,continueVertically:`Continue vertically?`},theme:{light:`Light`,dark:`Dark`,system:`System`,custom:`Custom`,switchToLight:`Switch to light mode`,switchToDark:`Switch to dark mode`},status:{error:`error`,success:`success`},menu:{file:`File`,edit:`Edit`,view:`View`},filePicker:{folderTreeAria:`Folder tree`,filesAria:`Files`,foldersAria:`Folders`,cancelAria:`Cancel`,openSelectedAria:`Open selected file`,fileNameAria:`File name`},externalLink:{securityMessage:`blocks embedding in iframes for security reasons.`,goToProfile:`Click below to go to my {{name}} profile.`},taskbar:{ariaLabel:`Taskbar`},launcher:{label:`Launcher`,ariaLabel:`App launcher`,selectedIcon:`Selected: {{icon}}`}},We={names:{notepad:`Notepad`,terminal:`Terminal`,filesApp:`Files`,files:`Files`,uploader:`Uploader`,settings:`Settings`,pdfViewer:`PDF Viewer`,calendar:`Calendar`,storybook:`Storybook`,linkedin:`LinkedIn`,github:`GitHub`,imageViewer:`Image Viewer`,dosEmulator:`DOS Emulator`,doom:`DOOM`,deviceInfo:`Device Info`,welcome:`Welcome`,menuedit:`Edit Launcher`,codeServer:`VS Code`},folders:{socialLinks:`Social Links`,office:`Office and media`,programming:`Programming`,games:`Games`,customApps:`Custom Apps`},descriptions:{notepad:`Markdown editor with rich text toolbar`,terminal:`Terminal emulator`,filesApp:`File explorer`,settings:`System settings`,pdfViewer:`PDF document viewer`,calendar:`Calendar view`,storybook:`Storybook playground`,linkedin:`LinkedIn profile link`,github:`GitHub profile link`,imageViewer:`Image viewer with file picker`,dosEmulator:`DOS game and program emulator`,doom:`Play the classic DOOM game`},launcher:{label:`Launcher`,ariaLabel:`App launcher`},imageViewer:{noImage:`No image to display. Please open one.`,fitToWindow:`Fit to window`,zoom:`Zoom`},pdf:{viewer:`PDF viewer`},dosEmulator:{noBundle:`No DOS program loaded. Open a .jsdos bundle to start.`,loading:`Loading DOS emulator...`,controls:{pause:`Pause`,resume:`Resume`,restart:`Restart`,mute:`Mute`,unmute:`Unmute`,fullscreen:`Fullscreen`},menu:{file:`File`,open:`Open Bundle`,restart:`Restart`,exit:`Exit`,emulation:`Emulation`,pause:`Pause`,resume:`Resume`,audio:`Audio`,mute:`Mute`,unmute:`Unmute`,volume:`Volume`},errors:{failedToLoad:`Failed to load DOS bundle`,notSupported:`DOS emulation is not supported in this browser`}},uploader:{clickToUpload:`Click here to upload`,selectDestination:`Select destination folder`,fileInfo:`File: {{name}} ({{size}})`,uploading:`Uploading...`,uploadProgress:`Upload progress`,uploadComplete:`Upload complete!`,uploadFailed:`Upload wasn't successful for the following reason`,readyToUpload:`Ready to upload`,showFile:`Show in Files`,openFile:`Open file`,upload:`Upload`,stepSelect:`Select`,stepDestination:`Destination`,stepUpload:`Upload`,stepDone:`Done`,folderSelected:`Folder selected`,uploadTo:`Destination`,uploadToRoot:`Uploading to root folder`},terminal:{notAvailable:`Terminal Not Available`,notAvailableMessage:`The terminal cannot be used because this environment does not currently allow terminal access.`,dockerRequired:`Please run in Docker mode to use the terminal.`,offlineTitle:`Terminal Unavailable`,offlineMessage:`The terminal requires a Docker environment to function. It connects directly to the container's shell.`,offlineInstructions:`To use the terminal, run the application in Docker mode:`,dockerCommand:`docker compose up dev`,openWelcome:`Open Welcome App`,connecting:`Connecting...`,connected:`Connected`,disconnected:`Disconnected`,connectionError:`Connection error`,menu:{edit:`Edit`,copy:`Copy`,paste:`Paste`,clear:`Clear`,reset:`Reset`,reconnect:`Reconnect`,exit:`Exit`},scrollback:`Lines`,shell:`Shell`},codeServer:{notAvailable:`VS Code Not Available`,notAvailableMessage:`VS Code (code-server) cannot be used in browser mode.`,dockerRequired:`Please run in Docker to use VS Code.`}},Ge={sections:{wallpaper:{label:`Wallpaper`,description:`Change the desktop background image.`},appearance:{label:`Appearance`,description:`Switch between light and dark mode.`},launcher:{label:`Launcher`,description:`Choose the launcher button icon.`},font:{label:`Font`,description:`Select the system font family.`},reset:{label:`Reset to Default`,description:`Reset all settings and data to defaults.`},language:{label:`Language`,description:`Choose your preferred language.`}},wallpaper:{title:`Wallpaper`,wallpaperType:`Wallpaper Type`,staticImage:`Static Image`,chooseFromImages:`Choose from Images`,uploadFromDisk:`Upload from disk`,resetToDefault:`Reset to default`,orEnterUrl:`Or enter a URL`,wallpaperPreview:`Wallpaper preview`},appearance:{title:`Appearance`,description:`Choose whether the desktop uses a light or dark theme, or follows the system preference.`,taskbar:`Taskbar`,window:`Window`,accent:`Accent`,animationDuration:`Animation Duration`,animationDescription:`Controls the speed of window open/close animations (0.1s - 1.0s) must save to see changes.`},font:{title:`Font`,description:`Changes the font across the entire desktop interface. Fonts must be downloaded before use.`,download:`Download`,fontSize:`Font Size`,downloadByName:`Download a font by name`,fromGoogleFonts:`(From Google Fonts)`,downloadError:`Font didn't download successfully. Try again with the correct name`,downloadSuccess:`Downloaded successfully.`,systemDefault:`System Default`},reset:{title:`Reset to Default`,description:`Reset all settings and data to their default values. This action cannot be undone.`,resetButton:`⚠️ Reset app to defaults?`,modalTitle:`Are you sure?`,modalDescription:`This will erase all your data and settings.`,goBack:`Please go back! 🙏`,burnEverything:`Yes, burn everything! 🔥`,keepFiles:`Yes, but keep my files`},language:{title:`Language`,description:`Select your preferred language for the desktop interface.`,selectPlaceholder:`Select language`,english:`English`,spanish:`Español`},all:`All Settings`},Ke={window:{title:`Window`,minimize:`Minimize`,maximize:`Maximize`,restore:`Restore`,close:`Close`,ariaLabels:{minimize:`Minimize`,maximize:`Maximize`,restore:`Restore`,close:`Close`}},unsavedModal:{title:`Unsaved Changes`,message:`You have unsaved changes. What would you like to do?`,dontSave:`Don't Save`,save:`Save`},fileDialog:{openFile:`Open file`,saveFile:`Save file`,selectFile:`Select file {{name}}`,openFolder:`Open folder {{name}}`,selectFolder:`Select folder`,filename:`filename.md`}},qe={window:{minimize:`Minimize`,restore:`Restore`,maximize:`Maximize`,close:`Close window`},actions:{cut:`Cut`,copy:`Copy`,paste:`Paste`,pasteItems:`Paste ({{count}} items)`,delete:`Delete`,createFolder:`Create folder`,createFile:`Create new file`},createItem:{folderTitle:`Create Folder`,fileTitle:`Create File`,newFolder:`New Folder`,newFile:`New File`,nameError:`There is already a {{mode}} with that name`,clearNameAria:`Clear name`,customIcon:`Choose custom icon or color`,colorError:`Enter a valid hex color (e.g. #ff0000)`,changeLater:`You can change the icon later in folder properties.`},deleteConfirm:{title:`Delete "{{name}}"?`,message:`Are you sure you want to delete "{{name}}"? This action cannot be undone.`},app:{open:`Open {{name}}`,toggleTheme:`Toggle Theme`},sort:{title:`Sort Icons`,default:`Default`,nameAsc:`Name (A-Z)`,nameDesc:`Name (Z-A)`,byType:`By Type`},launcher:{title:`Launcher`,editLauncher:`Edit Launcher`}},Je={empty:{title:`There are no new notifications`,message:`For now`},taskbar:{showNotifications:`Show notifications`,hideNotifications:`Hide notifications`,clock:`clock`}},Ye={toolbar:{formatting:`Text formatting`,bold:`Bold`,italic:`Italic`,strikethrough:`Strikethrough`,inlineCode:`Inline code`,heading1:`Heading 1`,heading2:`Heading 2`,bulletList:`Bullet list`,orderedList:`Ordered list`,blockquote:`Blockquote`,codeBlock:`Code block`,horizontalRule:`Horizontal rule`},untitled:`untitled.md`},Xe={hero:{title:`Fullstack Developer & DevOps`,downloadCV:`Download CV`,contactMe:`Contact Me`},skills:{technical:`Technical Skills`,soft:`Soft Skills`},experience:`Professional Experience`,techStack:`Tech Stack`,languages:`Languages`},Ze={title:`Edit Launcher`,newFolder:`New Folder`,predefined:`Predefined`,rename:`Rename`,delete:`Delete`,predefinedFolders:`Predefined Folders`,customFolders:`Custom Folders`,availableApps:`Available Apps (drag and drop to add to folder)`,clickToAdd:`Click to add to first custom folder`,addFolder:`Add folder`,instructions:`Right-click an app in a folder to remove it. Click an available app to add it to the first custom folder.`,canCreateNewFolder:`You can create new folders if needed.`},Qe={actions:{save:`Guardar`,saveAs:`Guardar como`,cancel:`Cancelar`,ok:`Aceptar`,open:`Abrir`,close:`Cerrar`,delete:`Eliminar`,create:`Crear`,new:`Nuevo`,exit:`Salir`,apply:`Aplicar`,discard:`Descartar`,reset:`Restablecer`,download:`Descargar`,upload:`Subir`,copy:`Copiar`,cut:`Cortar`,paste:`Pegar`,undo:`Deshacer`,redo:`Rehacer`,createFolder:`Crear carpeta`,createFile:`Crear nuevo archivo`,select:`Seleccionar`},buttons:{minimize:`Minimizar`,maximize:`Maximizar`,restore:`Restaurar`,close:`Cerrar`,yes:`Sí`,no:`No`,confirm:`Confirmar`,continue:`Continuar`},labels:{name:`Nombre`,title:`Título`,filename:`Nombre de archivo`,url:`URL`,file:`Archivo`,folder:`Carpeta`,home:`Inicio`,type:`Tipo`,loading:`Cargando...`,search:`Buscar`,searchIcons:`Buscar iconos...`,unsavedChanges:`Cambios sin guardar`,unsaved:`Cambios sin guardar`,workInProgress:`Trabajo en progreso`},messages:{areYouSure:`¿Estás seguro?`,cannotBeUndone:`Esta acción no se puede deshacer.`,noFileSelected:`Ningún archivo seleccionado`,folderEmpty:`Esta carpeta está vacía`,noMatchingFiles:`No hay archivos coincidentes`,noSubfolders:`Sin subcarpetas`,replaceFile:`¿Reemplazar archivo?`,replaceFileMessage:`Ya existe un archivo llamado "{{name}}". ¿Deseas reemplazarlo?`,yesReplace:`Sí, reemplazar`,forBetterExperience:`Para una mejor experiencia usa esta aplicación en modo escritorio u horizontal`,turnYourDevice:`Gira tu dispositivo`,continueVertically:`¿Continuar verticalmente?`},theme:{light:`Claro`,dark:`Oscuro`,system:`Sistema`,custom:`Personalizado`,switchToLight:`Cambiar a modo claro`,switchToDark:`Cambiar a modo oscuro`},status:{error:`error`,success:`éxito`},menu:{file:`Archivo`,edit:`Editar`,view:`Ver`},filePicker:{folderTreeAria:`Árbol de carpetas`,filesAria:`Archivos`,foldersAria:`Carpetas`,cancelAria:`Cancelar`,openSelectedAria:`Abrir archivo seleccionado`,fileNameAria:`Nombre de archivo`},externalLink:{securityMessage:`bloquea la incrustación en iframes por razones de seguridad.`,goToProfile:`Haz clic abajo para ir a mi perfil de {{name}}.`},taskbar:{ariaLabel:`Barra de tareas`},launcher:{label:`Lanzador`,ariaLabel:`Lanzador de aplicaciones`,selectedIcon:`Seleccionado: {{icon}}`}},$e={names:{notepad:`Bloc de notas`,terminal:`Terminal`,filesApp:`Archivos`,files:`Archivos`,uploader:`Subida de archivos`,settings:`Ajustes`,pdfViewer:`Visor PDF`,calendar:`Calendario`,storybook:`Storybook`,linkedin:`LinkedIn`,github:`GitHub`,imageViewer:`Visor de imágenes`,dosEmulator:`Emulador DOS`,doom:`DOOM`,deviceInfo:`Info del dispositivo`,welcome:`Bienvenido`,menuedit:`Editar lanzador`,codeServer:`VS Code`},folders:{socialLinks:`Enlaces sociales`,office:`Oficina y medios`,programming:`Programación`,games:`Juegos`,customApps:`Aplicaciones personalizadas`},descriptions:{notepad:`Editor Markdown con barra de herramientas`,terminal:`Emulador de terminal`,filesApp:`Explorador de archivos`,settings:`Ajustes del sistema`,pdfViewer:`Visor de documentos PDF`,calendar:`Vista de calendario`,storybook:`Zona de pruebas Storybook`,linkedin:`Enlace al perfil de LinkedIn`,github:`Enlace al perfil de GitHub`,imageViewer:`Visor de imágenes con selector de archivos`,dosEmulator:`Emulador de juegos y programas DOS`,doom:`Juega al clásico DOOM`},launcher:{label:`Lanzador`,ariaLabel:`Lanzador de aplicaciones`},imageViewer:{noImage:`Sin imagen para mostrar. Por favor, abre una.`,fitToWindow:`Ajustar a ventana`,zoom:`Zoom`},pdf:{viewer:`Visor PDF`},dosEmulator:{noBundle:`Ningún programa DOS cargado. Abre un bundle .jsdos para comenzar.`,loading:`Cargando emulador DOS...`,controls:{pause:`Pausar`,resume:`Reanudar`,restart:`Reiniciar`,mute:`Silenciar`,unmute:`Activar sonido`,fullscreen:`Pantalla completa`},menu:{file:`Archivo`,open:`Abrir Bundle`,restart:`Reiniciar`,exit:`Salir`,emulation:`Emulación`,pause:`Pausar`,resume:`Reanudar`,audio:`Audio`,mute:`Silenciar`,unmute:`Activar sonido`,volume:`Volumen`},errors:{failedToLoad:`Error al cargar el bundle DOS`,notSupported:`La emulación DOS no está soportada en este navegador`}},uploader:{clickToUpload:`Haz clic aquí para subir`,selectDestination:`Seleccionar carpeta destino`,fileInfo:`Archivo: {{name}} ({{size}})`,uploading:`Subiendo...`,uploadProgress:`Progreso de subida`,uploadComplete:`¡Subida completada!`,uploadFailed:`La subida no fue exitosa por la siguiente razón`,readyToUpload:`Listo para subir`,showFile:`Mostrar en Archivos`,openFile:`Abrir archivo`,upload:`Subir`,stepSelect:`Seleccionar`,stepDestination:`Destino`,stepUpload:`Subir`,stepDone:`Listo`,folderSelected:`Carpeta seleccionada`,uploadTo:`Destino`,uploadToRoot:`Subiendo a la carpeta raíz`},terminal:{notAvailable:`Terminal no disponible`,notAvailableMessage:`La terminal no puede usarse porque este entorno no permite actualmente el acceso a terminal.`,dockerRequired:`Por favor, ejecuta en modo Docker para usar la terminal.`,offlineTitle:`Terminal no disponible`,offlineMessage:`La terminal requiere un entorno Docker para funcionar. Se conecta directamente al shell del contenedor.`,offlineInstructions:`Para usar la terminal, ejecuta la aplicación en modo Docker:`,dockerCommand:`docker compose up dev`,openWelcome:`Abrir Bienvenida`,connecting:`Conectando...`,connected:`Conectado`,disconnected:`Desconectado`,connectionError:`Error de conexión`,menu:{edit:`Editar`,copy:`Copiar`,paste:`Pegar`,clear:`Limpiar`,reset:`Reiniciar`,reconnect:`Reconectar`,exit:`Salir`},scrollback:`Líneas`,shell:`Shell`},codeServer:{notAvailable:`VS Code no disponible`,notAvailableMessage:`VS Code (code-server) no puede usarse en modo navegador.`,dockerRequired:`Por favor, ejecuta la aplicación en Docker para usar VS Code.`}},et={sections:{wallpaper:{label:`Fondo de pantalla`,description:`Cambia la imagen de fondo del escritorio.`},appearance:{label:`Apariencia`,description:`Cambia entre modo claro y oscuro.`},launcher:{label:`Lanzador`,description:`Elige el icono del botón del lanzador.`},font:{label:`Fuente`,description:`Selecciona la familia de fuentes del sistema.`},reset:{label:`Restablecer`,description:`Restaura todos los ajustes y datos a sus valores por defecto.`},language:{label:`Idioma`,description:`Elige tu idioma preferido.`}},wallpaper:{title:`Fondo de pantalla`,wallpaperType:`Tipo de fondo`,staticImage:`Imagen estática`,chooseFromImages:`Elegir de imágenes`,uploadFromDisk:`Subir desde disco`,resetToDefault:`Restablecer por defecto`,orEnterUrl:`O introduce una URL`,wallpaperPreview:`Vista previa del fondo`},appearance:{title:`Apariencia`,description:`Elige si el escritorio usa un tema claro u oscuro, o sigue la preferencia del sistema.`,taskbar:`Barra de tareas`,window:`Ventana`,accent:`Acento`,animationDuration:`Duración de animación`,animationDescription:`Controla la velocidad de las animaciones de abrir/cerrar ventanas (0.1s - 1.0s), debes guardar para ver los cambios.`},font:{title:`Fuente`,description:`Cambia la fuente en toda la interfaz del escritorio. Las fuentes deben descargarse antes de usar.`,download:`Descargar`,fontSize:`Tamaño de fuente`,downloadByName:`Descargar una fuente por nombre`,fromGoogleFonts:`(Desde Google Fonts)`,downloadError:`La fuente no se descargó correctamente. Intenta de nuevo con el nombre correcto`,downloadSuccess:`Descargada correctamente.`,systemDefault:`Sistema por defecto`},reset:{title:`Restablecer`,description:`Restaura todos los ajustes y datos a sus valores por defecto. Esta acción no se puede deshacer.`,resetButton:`⚠️ ¿Restablecer la app?`,modalTitle:`¿Estás seguro?`,modalDescription:`Esto borrará todos tus datos y ajustes.`,goBack:`¡Por favor vuelve atrás! 🙏`,burnEverything:`¡Sí, quémalo todo! 🔥`,keepFiles:`Sí, pero mantener mis archivos`},language:{title:`Idioma`,description:`Selecciona tu idioma preferido para la interfaz del escritorio.`,selectPlaceholder:`Selecciona idioma`,english:`English`,spanish:`Español`},all:`Todos los ajustes`},tt={window:{title:`Ventana`,minimize:`Minimizar`,maximize:`Maximizar`,restore:`Restaurar`,close:`Cerrar`,ariaLabels:{minimize:`Minimizar`,maximize:`Maximizar`,restore:`Restaurar`,close:`Cerrar`}},unsavedModal:{title:`Cambios sin guardar`,message:`Tienes cambios sin guardar. ¿Qué deseas hacer?`,dontSave:`No guardar`,save:`Guardar`},fileDialog:{openFile:`Abrir archivo`,saveFile:`Guardar archivo`,selectFile:`Seleccionar archivo {{name}}`,openFolder:`Abrir carpeta {{name}}`,selectFolder:`Seleccionar carpeta`,filename:`nombre.md`}},nt={window:{minimize:`Minimizar`,restore:`Restaurar`,maximize:`Maximizar`,close:`Cerrar ventana`},actions:{cut:`Cortar`,copy:`Copiar`,paste:`Pegar`,pasteItems:`Pegar ({{count}} elementos)`,delete:`Eliminar`,createFolder:`Crear carpeta`,createFile:`Crear nuevo archivo`},createItem:{folderTitle:`Crear Carpeta`,fileTitle:`Crear Archivo`,newFolder:`Nueva Carpeta`,newFile:`Nuevo Archivo`,nameError:`Ya existe un {{mode}} con ese nombre`,clearNameAria:`Limpiar nombre`,customIcon:`Elige icono o color personalizado`,colorError:`Introduce un color hexadecimal válido (ej. #ff0000)`,changeLater:`Puedes cambiar el icono más tarde en las propiedades de la carpeta.`},deleteConfirm:{title:`¿Eliminar "{{name}}"?`,message:`¿Estás seguro de que quieres eliminar "{{name}}"? Esta acción no se puede deshacer.`},app:{open:`Abrir {{name}}`,toggleTheme:`Cambiar Tema`},sort:{title:`Ordenar Iconos`,default:`Por defecto`,nameAsc:`Nombre (A-Z)`,nameDesc:`Nombre (Z-A)`,byType:`Por Tipo`},launcher:{title:`Launcher`,editLauncher:`Editar Launcher`}},rt={empty:{title:`No hay notificaciones nuevas`,message:`Por ahora`},taskbar:{showNotifications:`Mostrar notificaciones`,hideNotifications:`Ocultar notificaciones`,clock:`reloj`}},it={toolbar:{formatting:`Formato de texto`,bold:`Negrita`,italic:`Cursiva`,strikethrough:`Tachado`,inlineCode:`Código en línea`,heading1:`Título 1`,heading2:`Título 2`,bulletList:`Lista con viñetas`,orderedList:`Lista ordenada`,blockquote:`Cita`,codeBlock:`Bloque de código`,horizontalRule:`Línea horizontal`},untitled:`sin-titulo.md`},at={hero:{title:`Fullstack Developer & DevOps`,downloadCV:`Descargar CV`,contactMe:`Contactar`},skills:{technical:`Habilidades Técnicas`,soft:`Habilidades Blandas`},experience:`Experiencia Profesional`,techStack:`Stack Tecnológico`,languages:`Idiomas`},ot={newFolder:`Nueva Carpeta`,predefined:`Predefinida`,rename:`Renombrar`,delete:`Eliminar`,predefinedFolders:`Carpetas Predefinidas`,customFolders:`Carpetas Personalizadas`,availableApps:`Apps Disponibles (arrastrar y soltar para añadir a carpetas)`,clickToAdd:`Clic para añadir a la primera carpeta personalizada`,addFolder:`Añadir carpeta`,instructions:`Clic derecho en una app dentro de una carpeta para eliminarla. Clic en una app disponible para añadirla a la primera carpeta personalizada.`,canCreateNewFolder:`Puedes crear una nueva carpeta si lo necesitas.`},st=[`en`,`es`];R.default.use(z.default).use(L.initReactI18next).init({resources:{en:{common:Ue,apps:We,settings:Ge,window:Ke,contextMenu:qe,notifications:Je,notes:Ye,welcome:Xe,menuedit:Ze},es:{common:Qe,apps:$e,settings:et,window:tt,contextMenu:nt,notifications:rt,notes:it,welcome:at,menuedit:ot}},fallbackLng:`en`,supportedLngs:st,ns:[`common`,`apps`,`settings`,`window`,`contextMenu`,`notifications`,`notes`,`welcome`,`menuedit`],defaultNS:`common`,interpolation:{escapeValue:!1},detection:{order:[`localStorage`,`navigator`],lookupLocalStorage:`fde-desktop:language`,caches:[`localStorage`]}});var ct=R.default,q={root:`_root_17um1_1`,windowButton:`_windowButton_17um1_15`,systemTray:`_systemTray_17um1_44`,themeToggle:`_themeToggle_17um1_51`,clock:`_clock_17um1_70`,notifButton:`_notifButton_17um1_88`,langButton:`_langButton_17um1_109`},lt={en:`English`,es:`Español`},ut=()=>{let{t:e,i18n:n}=(0,L.useTranslation)(`settings`),r=t.g(e=>e.language),i=t.g(e=>e.setLanguage),[a,o]=(0,j.useState)(!1),s=(0,j.useCallback)(e=>{i(e),n.changeLanguage(e),localStorage.setItem(`fde-desktop:language`,e),o(!1)},[i,n]);return(0,M.jsxs)(N.Popover,{opened:a,onChange:o,position:`top-end`,shadow:`md`,withArrow:!0,children:[(0,M.jsx)(N.Popover.Target,{children:(0,M.jsx)(N.UnstyledButton,{className:q.langButton,onClick:()=>o(e=>!e),"aria-label":e(`language.selectPlaceholder`),"aria-expanded":a,children:(0,M.jsx)(t.m,{lang:r,size:16})})}),(0,M.jsx)(N.Popover.Dropdown,{children:(0,M.jsx)(N.Stack,{gap:`xs`,children:st.map(e=>(0,M.jsx)(N.UnstyledButton,{onClick:()=>s(e),"aria-label":lt[e],"aria-pressed":e===r,style:{padding:`8px 12px`,borderRadius:6,width:`100%`,background:e===r?`var(--mantine-primary-color-light)`:`transparent`,cursor:`pointer`},children:(0,M.jsxs)(N.Group,{gap:`sm`,children:[(0,M.jsx)(t.m,{lang:e,size:20}),(0,M.jsx)(N.Text,{size:`sm`,fw:e===r?600:400,children:lt[e]})]})},e))})})]})},dt=({win:e,onClick:t,onContextMenu:n})=>{let r=(0,j.useRef)(null),{register:i,unregister:a}=_e();return(0,j.useEffect)(()=>(r.current&&i(e.id,r.current.getBoundingClientRect()),()=>a(e.id)),[e.id,i,a]),(0,M.jsxs)(`button`,{ref:r,className:q.windowButton,"data-active":e.state===`minimized`?`false`:`true`,onClick:t,onContextMenu:n,"aria-label":e.title,children:[(0,M.jsx)(s.t,{fcIcon:e.fcIcon,iconUrl:e.iconUrl,fallback:e.icon,size:14,color:e.iconColor}),(0,M.jsx)(N.Text,{size:`xs`,truncate:!0,children:e.title})]})},ft=({calendarSlot:e})=>{let{t:n}=(0,L.useTranslation)(`notifications`),i=t.g(e=>e.theme.colors.taskbar),a=t.g(e=>e.theme.mode),o=t.g(e=>e.toggleTheme),c=t.g(e=>e.launcherIcon),l=r.o(e=>e.notifications),u=r.o(e=>e.removeNotification),d=r.o(e=>e.windows),f=r.o(e=>e.restoreWindow),p=r.o(e=>e.minimizeWindow),m=r.o(e=>e.focusWindow),h=r.o(e=>e.closeWindow),g=r.o(e=>e.maximizeWindow),_=Se(),[v,y]=(0,j.useState)(!1),[b,x]=(0,j.useState)(!1),{position:S,targetWindowId:C,windowMenuOpened:w,panelMenuOpened:T,launcherMenuOpened:E,openWindowMenu:D,openPanelMenu:O,openLauncherMenu:k,closeMenu:A}=Te(),P=C?d.find(e=>e.id===C)?.state??null:null,F=(0,j.useRef)(0);(0,j.useEffect)(()=>{l.length>F.current&&setTimeout(()=>x(!0),0),F.current=l.length},[l.length]);let I=d.filter(e=>e.isOpen),R=(e,t)=>{t===`minimized`?(f(e),m(e)):p(e)};return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`div`,{className:q.root,style:{background:i},role:`toolbar`,"aria-label":`Taskbar`,onContextMenu:O,children:[(0,M.jsx)(Le,{fcIcon:c,onContextMenu:k}),I.map(e=>(0,M.jsx)(dt,{win:e,onClick:()=>R(e.id,e.state),onContextMenu:t=>D(t,e.id)},e.id)),(0,M.jsxs)(`div`,{className:q.systemTray,"data-testid":`system-tray`,children:[(0,M.jsxs)(N.Popover,{opened:b,onChange:x,position:`top-end`,shadow:`md`,withArrow:!0,keepMounted:!0,children:[(0,M.jsx)(N.Popover.Target,{children:(0,M.jsx)(`button`,{className:q.notifButton,onClick:()=>x(e=>!e),"aria-label":n(b?`taskbar.hideNotifications`:`taskbar.showNotifications`),children:(0,M.jsx)(s.t,{fcIcon:b?`FcCollapse`:`FcExpand`,size:18})})}),(0,M.jsx)(N.Popover.Dropdown,{style:{background:`transparent`,border:`none`,padding:0},children:(0,M.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:8,minWidth:300},children:l.length===0?(0,M.jsx)(N.Notification,{title:n(`empty.title`),onClose:()=>x(!1),children:n(`empty.message`)}):l.map(e=>(0,M.jsx)(N.Notification,{withBorder:!0,icon:e.fcIcon?(0,M.jsx)(s.t,{fcIcon:e.fcIcon,size:18}):void 0,title:e.title,onClose:()=>{u(e.id),e.onClose?.()},children:e.message},e.id))})})]}),(0,M.jsx)(ut,{}),(0,M.jsx)(`button`,{className:q.themeToggle,onClick:o,"aria-label":n(a===`dark`?`theme.switchToLight`:`theme.switchToDark`,{ns:`common`}),title:n(a===`dark`?`theme.switchToLight`:`theme.switchToDark`,{ns:`common`}),children:a===`dark`?`☀️`:`🌙`}),(0,M.jsxs)(N.Popover,{opened:v,onChange:y,position:`top-end`,shadow:`md`,withArrow:!0,children:[(0,M.jsx)(N.Popover.Target,{children:(0,M.jsx)(`button`,{className:q.clock,onClick:()=>y(e=>!e),"aria-label":n(`taskbar.clock`),"aria-expanded":v,children:(0,M.jsx)(N.Text,{size:`xs`,children:_})})}),(0,M.jsx)(N.Popover.Dropdown,{children:e})]})]})]}),(0,M.jsx)(He,{windowMenuOpened:w,panelMenuOpened:T,launcherMenuOpened:E,menuPosition:S,targetWindowId:C,targetWindowState:P,onCloseWindow:h,onMinimizeWindow:p,onMaximizeWindow:g,onRestoreWindow:f,onClose:A})]})},pt=({message:e=`Loading...`,size:t=`lg`})=>(0,M.jsx)(N.Center,{style:{width:`100%`,height:`100%`},children:(0,M.jsxs)(N.Stack,{align:`center`,gap:`md`,children:[(0,M.jsx)(N.Loader,{size:t}),(0,M.jsx)(N.Text,{c:`dimmed`,children:e})]})}),mt=({progress:e,windowIcon:t})=>{let n=(0,N.useMantineTheme)(),r=()=>{switch(e.state){case`fetching`:return`Fetching app info...`;case`compiling`:return`Compiling app...`;case`loading`:return`Loading app...`;case`ready`:return`Ready!`;case`error`:return`Error loading app`;default:return`Loading...`}},i=()=>e.state===`error`?`red`:e.state===`ready`?`green`:n.primaryColor;return(0,M.jsx)(N.Center,{style:{width:`100%`,height:`100%`},"data-testid":`custom-app-loading`,children:(0,M.jsxs)(N.Stack,{align:`center`,gap:`lg`,p:`xl`,children:[t&&(0,M.jsx)(N.Text,{size:`3rem`,children:t}),(0,M.jsx)(N.Text,{size:`lg`,fw:700,children:e.appName||`App`}),(0,M.jsx)(N.Progress,{value:e.progress,size:`lg`,radius:`xl`,animated:e.state===`loading`||e.state===`compiling`,style:{minWidth:200},color:i()}),(0,M.jsx)(N.Text,{size:`sm`,c:`dimmed`,children:r()}),e.state===`error`&&(0,M.jsx)(N.Text,{size:`xs`,c:`red`,ta:`center`,children:e.error}),(0,M.jsxs)(N.Text,{size:`xs`,c:`gray`,children:[e.progress,`%`]})]})})},ht=({appId:e})=>(0,M.jsx)(N.Center,{style:{width:`100%`,height:`100%`},children:(0,M.jsxs)(N.Stack,{align:`center`,gap:`lg`,p:`xl`,maw:400,children:[(0,M.jsx)(N.Text,{size:`3rem`,children:(0,M.jsx)(V.FcDoNotInsert,{})}),(0,M.jsx)(N.Text,{size:`lg`,fw:700,ta:`center`,children:`Development Server Offline`}),(0,M.jsxs)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:[`The app "`,e,`" cannot be loaded because the development server is offline.`]}),(0,M.jsx)(N.Button,{variant:`light`,onClick:()=>{window.__FDE_API__?.openApp(`welcome`)},children:`Open Welcome App`}),(0,M.jsx)(N.Anchor,{href:`https://github.com/frannunpal/frannunpal.github.io/issues`,target:`_blank`,rel:`noopener noreferrer`,size:`sm`,children:`File an issue on GitHub`})]})}),gt=({appId:e})=>(0,M.jsx)(N.Center,{style:{width:`100%`,height:`100%`},children:(0,M.jsxs)(N.Stack,{align:`center`,gap:`lg`,p:`xl`,maw:400,children:[(0,M.jsx)(N.Text,{size:`3rem`,children:(0,M.jsx)(V.FcInfo,{})}),(0,M.jsx)(N.Text,{size:`lg`,fw:700,ta:`center`,children:`Custom Apps Not Available`}),(0,M.jsxs)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:[`The app "`,e,`" cannot be loaded because this environment does not currently allow creating your own apps.`]}),(0,M.jsx)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:`Please refer to the "Documentation" folder to learn more about it.`})]})}),_t=new Set,J=null,vt=null,yt=null,bt=!1,xt=0,St=null,Ct=!1,wt=!1;function Tt(){_t.clear(),J=null,vt=null,yt=null,bt=!1,xt=0,St=null,Ct=!1,wt=!1}var Et=1e4,Dt=2e3,Ot=5,kt=0;function At(){return`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/api/hmr`}async function jt(){try{let e=await fetch(`/api/hmr`,{method:`HEAD`});return e.status===426||e.status===400}catch{return!1}}function Mt(){vt&&=(clearTimeout(vt),null),yt&&=(clearTimeout(yt),null),bt=!1}function Nt(e){typeof BroadcastChannel>`u`||(St=new BroadcastChannel(`fde-custom-apps`),St.onmessage=t=>{let n=t.data;n._fromBroadcast=!0,e(n)})}function Pt(e){St?.postMessage(e)}async function Ft(){r.o.getState().isFsReady||await new Promise(e=>{let t=r.o.subscribe(n=>{n.isFsReady&&(t(),e())})});try{let e=r.v.getState().registeredApps,{added:t,removed:n}=await r.L(e);for(let e of t)r.v.getState().registerApp(e),r.o.getState().handleCustomAppRegistered?.(e);for(let e of n)r.v.getState().unregisterApp(e),r.o.getState().handleCustomAppUnregistered?.(e)}catch(e){console.warn(`[HMR] Failed to sync apps on connect:`,e)}}function It(e,t,n){if(bt||J&&J.readyState===WebSocket.OPEN)return J;let i=At(),a=++xt;return bt=!0,J=new WebSocket(i),yt=setTimeout(()=>{J&&J.readyState!==WebSocket.OPEN&&a===xt&&(console.warn(`[HMR] Initial connection timeout`),kt++,kt>=Ot?(console.warn(`[HMR] Max initial retries reached, marking server as offline`),t()):(J?.close(),vt=setTimeout(()=>{It(e,t,n)},Dt)))},Et),J.onopen=()=>{if(a!==xt){J?.close();return}console.log(`[HMR] Connected to server`),kt=0,bt=!1,r.v.getState().resetHmrRetry(),r.v.getState().setHmrConnected(!0),r.v.getState().setHmrError(null),r.v.getState().devServerOffline&&n(),r.v.getState().setDevServerOffline(!1),Mt(),Ft().catch(e=>{console.warn(`[HMR] Failed to sync apps:`,e)})},J.onmessage=t=>{try{let n=JSON.parse(t.data);console.log(`[HMR] Received ${n.type} for ${n.appId}`),e(n)}catch(e){console.error(`[HMR] Failed to parse message:`,e)}},J.onclose=i=>{a===xt&&(console.log(`[HMR] Disconnected from server (code: ${i.code})`),J=null,bt=!1,r.v.getState().setHmrConnected(!1),Mt(),vt=setTimeout(()=>{It(e,t,n)},Dt))},J.onerror=e=>{a===xt&&(console.error(`[HMR] WebSocket error:`,e),r.v.getState().setHmrError(`Connection failed`))},J}function Lt(){Mt(),J&&=(J.close(),null),St&&=(St.close(),null)}function Rt(e){let t=(0,j.useRef)(e),{notify:n}=d.r();(0,j.useEffect)(()=>{t.current=e},[e]);let i=(0,j.useCallback)(e=>{switch(e.type){case`reload`:{let t=e.appId,n=r.v.getState().mountedApps[t];if(n?.instance&&typeof n.instance.unmount==`function`)try{n.instance.unmount()}catch(e){console.warn(`[HMR] Error unmounting ${t}:`,e)}let i=document.getElementById(`app-container-${t}`);i&&(i.innerHTML=``),r.v.getState().setAppLoading(t),_t.forEach(e=>{try{e.onReload(t)}catch(e){console.error(`[HMR] Callback error:`,e)}});break}case`app-registered`:if(e.manifest){console.log(`[HMR] App registered: ${e.manifest.id}`);let t=!!r.v.getState().registeredApps[e.manifest.id];r.O(),r.R(e.manifest),r.v.getState().registerApp(e.manifest),r.o.getState().handleCustomAppRegistered?.(e.manifest),t||n(`New App Available`,`${e.manifest.name} is now available`,{fcIcon:`FcApproval`}),e._fromBroadcast||Pt(e)}break;case`app-unregistered`:{let t=e.appId;console.log(`[HMR] App unregistered: ${t}`),r.O(),r.I(t),r.v.getState().unregisterApp(t),r.o.getState().handleCustomAppUnregistered?.(t),e._fromBroadcast||Pt(e);break}case`app-error`:console.error(`[HMR] App error: ${e.appId} - ${e.error}`),n(`App Error`,e.error||`Unknown error`,{fcIcon:`FcCancel`});break}},[n]),a=(0,j.useCallback)(()=>{r.v.getState().setDevServerOffline(!0),n(`Development Server Offline`,`HMR is disabled. Changes will not be applied until the server reconnects.`,{fcIcon:`FcDoNotInsert`})},[n]),o=(0,j.useCallback)(()=>{n(`HMR Reconnected`,`Hot module replacement is now active`,{fcIcon:`FcApproval`})},[n]);(0,j.useEffect)(()=>{if(r.H()===`browser`){console.log(`[HMR] Skipping: not running in Docker`);return}if(!r.G()||!r.W())return;let e=!1;return _t.add(t.current),!wt&&!Ct&&(Ct=!0,jt().then(t=>{if(Ct=!1,e||!t){t||console.warn(`[HMR] HMR endpoint not available, skipping WebSocket connection`);return}wt=!0,Nt(i),It(i,a,o)}).catch(()=>{Ct=!1})),()=>{e=!0,_t.delete(t.current),_t.size===0&&(wt=!1,Lt())}},[i,a,o])}function zt(){let{notify:e}=d.r();Rt({onReload:()=>{},onRegistered:(0,j.useCallback)(t=>{r.o.getState().handleCustomAppRegistered?.(t),e(`New App Available`,`${t.name} is now available`,{fcIcon:`FcApproval`})},[e]),onUnregistered:(0,j.useCallback)(e=>{r.o.getState().handleCustomAppUnregistered?.(e)},[])})}function Bt(e,t=5e3){return new Promise((n,r)=>{let i=Date.now(),a=null,o=null,s=()=>{o&&=(clearInterval(o),null),a&&=(clearTimeout(a),null)},c=()=>{let a=document.getElementById(e);if(a){s(),n(a);return}if(Date.now()-i>=t){s(),r(Error(`Container #${e} not found after ${t}ms`));return}};c(),o=setInterval(c,1e3),a=setTimeout(()=>{s(),r(Error(`Container #${e} not found after ${t}ms`))},t)})}var Vt={state:`idle`,progress:0,appName:``},Ht=1e4,Ut=({appId:e,windowIcon:t,notifyReady:n})=>{let[i,a]=(0,j.useState)({...Vt,appName:e}),[o,s]=(0,j.useState)(!1),[c,l]=(0,j.useState)(null),[u,f]=(0,j.useState)(!1),[p,m]=(0,j.useState)(0),h=(0,j.useRef)(null),g=(0,j.useRef)(!0),_=(0,j.useRef)(!1),v=(0,j.useRef)(null),y=(0,j.useRef)(null),b=r.v(e=>e.devServerOffline),x=r.v(t=>t.mountedApps[e]),S=r.v(e=>e.setAppLoading),C=r.v(e=>e.setAppLoaded),w=r.v(e=>e.setAppError),T=r.v(e=>e.clearApp),{notify:E}=d.r(),D=r.G(),O=(0,j.useCallback)(()=>{y.current&&=(clearTimeout(y.current),null)},[]),k=(0,j.useCallback)(()=>{v.current&&=(clearInterval(v.current),null)},[]),A=(0,j.useCallback)(()=>{let e=x?.instance;if(e&&typeof e.unmount==`function`)try{e.unmount()}catch{}},[x?.instance]),N=(0,j.useCallback)(async()=>{if(g.current&&!_.current){_.current=!0;try{a(e=>({...e,state:`fetching`,progress:10})),S(e),l(null),r.O();let t=await r.A(!0);if(!t)throw Error(`Apps manifest not found. Make sure apps are built.`);let i=t.apps.find(t=>t.id===e);if(!i)throw Error(`App '${e}' not found in manifest. Available apps: ${t.apps.map(e=>e.id).join(`, `)}`);a(e=>({...e,state:`loading`,progress:30,appName:i.name})),v.current=setInterval(()=>{if(!g.current){k();return}a(e=>({...e,progress:Math.min(e.progress+5,90)}))},100);try{await Bt(`app-container-${e}`,5e3)}catch{throw Error(`Container #app-container-${e} not found`)}if(await import(`/dist-apps/${i.entry}?t=${Date.now()}`),k(),C(e),await new Promise(t=>{O();let n=()=>{if(r.v.getState().mountedApps[e]?.isReady){t();return}y.current=setTimeout(n,500)};if(r.v.getState().mountedApps[e]?.isReady){t();return}y.current=setTimeout(()=>{console.warn(`[${e}] App did not call appReady() within ${Ht}ms`),E(`Warning`,`App ${e} took too long to initialize`,{fcIcon:`FcInfo`}),f(!0),r.v.getState().setAppReady(e),t()},Ht),n()}),a(e=>({...e,state:`ready`,progress:100})),s(!0),!g.current)return;setTimeout(()=>{n?.()},50)}catch(t){k(),O(),_.current=!1;let n=t instanceof Error?t.message:`Unknown error`;a(e=>({...e,state:`error`,error:n,progress:0})),w(e,n),l(n),console.error(`[CustomAppLoader] Error loading app ${e}:`,t)}}},[e,n,S,C,w,O,k,E]);if(Rt({onReload:(0,j.useCallback)(t=>{t===e&&(_.current=!1,A(),T(e),s(!1),a({...Vt,appName:e}),l(null),m(e=>e+1))},[e,T,A])}),(0,j.useEffect)(()=>{if(!_.current)return g.current=!0,N(),()=>{g.current=!1,k(),O()}},[N,p,k,O]),!D)return(0,M.jsx)(gt,{appId:e});if(b&&!x?.isLoaded&&!c)return(0,M.jsx)(ht,{appId:e});let P=i.state===`error`,F=o&&x?.isReady&&!u,I=i.state===`ready`&&o&&u,L=I&&!x?.instance,R=P||L||!(F||I);return L?(0,M.jsx)(mt,{progress:{...i,state:`error`,error:`App '${e}' loaded but did not mount. Check the browser console for errors.`},windowIcon:t}):(0,M.jsxs)(M.Fragment,{children:[R&&(0,M.jsx)(mt,{progress:i,windowIcon:t}),(0,M.jsx)(`div`,{ref:h,id:`app-container-${e}`,"data-testid":`custom-app-container-${e}`,style:{all:`initial`,display:P?`none`:`block`,width:`100%`,height:`100%`,overflow:`auto`,visibility:F||I?`visible`:`hidden`,boxSizing:`border-box`,fontFamily:`sans-serif`}})]})},Wt=(0,j.createContext)({notifyReady:()=>{},getContentData:()=>void 0}),Gt=()=>(0,j.useContext)(Wt),Kt=({children:e})=>{let t=(0,j.useRef)(void 0),n=(0,j.useCallback)(e=>{e!==void 0&&(t.current=e)},[]),r=(0,j.useCallback)(()=>t.current,[]);return(0,M.jsx)(Wt.Provider,{value:{notifyReady:n,getContentData:r},children:e})},Y={root:`_root_1vtes_1`,titleBar:`_titleBar_1vtes_12`,windowButtons:`_windowButtons_1vtes_31`,title:`_title_1vtes_12`,content:`_content_1vtes_41`,focusOverlay:`_focusOverlay_1vtes_48`},qt=({win:e,isFocused:t,focusWindow:i})=>{let{notifyReady:a,getContentData:o}=Gt(),s=r.v(t=>e.content in t.registeredApps),c=(0,j.useMemo)(()=>n.x(e.content),[e.content]),l=(0,j.useMemo)(()=>n.C(e.content),[e.content]),d=(0,j.useMemo)(()=>n.w(e.content),[e.content]),f=(0,j.useMemo)(()=>n.D(e.content),[e.content]),p=(0,j.useMemo)(()=>n.S(e.content),[e.content]),m=r.o(e=>e.closeWindow),h=o()??e.contentData,g={...e,contentData:h},_=l?l(g):void 0;if(s)return(0,M.jsx)(Ut,{appId:e.content,windowIcon:e.icon,notifyReady:a});let v=f?(0,M.jsx)(j.Suspense,{fallback:(0,M.jsx)(pt,{message:p?`Loading ${p}...`:void 0}),children:(0,j.createElement)(c,{window:e,notifyReady:a})}):(0,j.createElement)(c,{window:e,notifyReady:a});return(0,M.jsxs)(M.Fragment,{children:[d?(0,M.jsx)(j.Suspense,{fallback:null,children:(0,j.createElement)(d,{windowId:e.id,contentData:h,onExit:()=>m(e.id)})}):_&&_.length>0?(0,M.jsx)(u.t,{elements:_}):null,(0,M.jsxs)(`div`,{className:Y.content,children:[!t&&(0,M.jsx)(`div`,{"data-testid":`focus-overlay`,className:Y.focusOverlay,onMouseDown:t=>{t.stopPropagation(),i(e.id)}}),v]})]})},Jt=({window:e})=>{let{t:i}=(0,L.useTranslation)(`window`),a=r.o(t=>t.windows.find(t=>t.id===e.id))??e,o=ke(a.content),{focusWindow:u,closeWindow:d,minimizeWindow:f,maximizeWindow:p,restoreWindow:m,moveWindow:h,resizeWindow:g}=r.o((0,B.useShallow)(e=>({focusWindow:e.focusWindow,closeWindow:e.closeWindow,minimizeWindow:e.minimizeWindow,maximizeWindow:e.maximizeWindow,restoreWindow:e.restoreWindow,moveWindow:e.moveWindow,resizeWindow:e.resizeWindow}))),_=t.g(e=>e.theme.colors.window),v=c.a(e=>e.isOpen),y=c.a(e=>e.windowId),b=c.a(e=>e.onSave),x=c.a(e=>e.onDiscard),S=c.a(e=>e.closeModal),{windowVariants:C,easeIn:w}=Ee(),T=r.o(e=>{let t=e.windows.find(e=>e.id===a.id);if(!t)return!0;let n=t.alwaysOnTop??!1,r=e.windows.filter(e=>e.isOpen&&e.state!==`minimized`&&(e.alwaysOnTop??!1)===n);return r.length===0?!0:Math.max(...r.map(e=>e.zIndex))===t.zIndex}),{getRect:E}=_e(),D=(0,I.useAnimationControls)(),O=(0,j.useRef)(a.state);(0,j.useEffect)(()=>{D.start(`visible`)},[D]),(0,j.useEffect)(()=>{if(O.current===`minimized`&&a.state!==`minimized`){let e=E(a.id);if(e){let t=a.x+a.width/2,r=a.y+a.height/2,i=e.left+e.width/2,o=e.top+e.height/2;D.start(n.v(i-t,o-r))}else D.set({x:0,y:0,scale:1,opacity:1}),D.start(`visible`)}O.current=a.state},[a.state,D,E,a.id,a.x,a.y,a.width,a.height]);let k=(0,j.useCallback)(e=>{e.preventDefault(),r.st.find(e=>e.id===a.content)?.hasContextMenu||e.stopPropagation()},[a.content]);if(!a.isOpen)return null;let A=a.state===`minimized`,P=a.state===`maximized`,F=a.canMaximize!==!1,R=v&&y===a.id,z=async()=>{let e=E(a.id);if(e){let t=a.x+a.width/2,r=a.y+a.height/2,i=e.left+e.width/2,o=e.top+e.height/2;await D.start(n.m(i-t,o-r))}else await D.start({...C.exit,transition:w});f(a.id)},V=async()=>{let e=c.t(a.id);e&&!e()||(await D.start({...C.exit,transition:w}),d(a.id))},te=()=>{b?.(),S()},H=()=>{x?.(),S();let e=a.id;e&&d(e)},U=()=>{S()};return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(ee.Rnd,{position:P?{x:0,y:0}:{x:a.x,y:a.y},size:P?{width:`100vw`,height:`100vh`}:{width:a.width,height:a.height},minWidth:a.minWidth??0,minHeight:a.minHeight??0,style:{zIndex:a.zIndex,visibility:A?`hidden`:`visible`,pointerEvents:A?`none`:`auto`},dragHandleClassName:Y.titleBar,disableDragging:P||A,enableResizing:!P&&!A,onMouseDown:()=>u(a.id),onDragStop:(e,t)=>h(a.id,t.x,t.y),onResizeStop:(e,t,n,r,i)=>{g(a.id,n.offsetWidth,n.offsetHeight),h(a.id,i.x,i.y)},children:(0,M.jsxs)(I.motion.div,{className:Y.root,"data-testid":`window-${a.content}`,style:{background:_},variants:C,initial:`hidden`,animate:D,exit:`exit`,layout:!0,transition:n.p,onContextMenu:k,children:[(0,M.jsxs)(`div`,{className:Y.titleBar,children:[(0,M.jsx)(s.t,{fcIcon:a.fcIcon,iconUrl:a.iconUrl,fallback:a.icon,size:14,color:a.iconColor}),(0,M.jsx)(N.Text,{size:`sm`,fw:500,truncate:!0,className:Y.title,children:o}),(0,M.jsxs)(N.Group,{gap:2,wrap:`nowrap`,className:Y.windowButtons,children:[(0,M.jsx)(N.ActionIcon,{size:`lg`,variant:`subtle`,"aria-label":i(`window.ariaLabels.minimize`),onClick:z,children:(0,M.jsx)(l.t,{name:`VscChromeMinimize`})}),F&&(0,M.jsx)(N.ActionIcon,{size:`lg`,variant:`subtle`,"aria-label":i(P?`window.ariaLabels.restore`:`window.ariaLabels.maximize`),onClick:()=>P?m(a.id):p(a.id),children:P?(0,M.jsx)(l.t,{name:`VscChromeRestore`}):(0,M.jsx)(l.t,{name:`VscChromeMaximize`})}),(0,M.jsx)(N.ActionIcon,{size:`lg`,variant:`subtle`,color:`red`,"aria-label":i(`window.ariaLabels.close`),onClick:V,children:(0,M.jsx)(l.t,{name:`VscChromeClose`})})]})]}),(0,M.jsx)(Kt,{children:(0,M.jsx)(qt,{win:a,isFocused:T,focusWindow:u})})]})}),(0,M.jsxs)(N.Modal,{opened:R,onClose:U,title:i(`unsavedModal.title`),centered:!0,withinPortal:!0,children:[(0,M.jsx)(N.Text,{size:`sm`,mb:`lg`,children:i(`unsavedModal.message`)}),(0,M.jsx)(N.Button,{variant:`default`,onClick:H,children:i(`unsavedModal.dontSave`)}),(0,M.jsx)(N.Button,{onClick:te,ml:`sm`,children:i(`unsavedModal.save`)})]})]})},Yt={root:`_root_1f7p3_1`,iconImage:`_iconImage_1f7p3_21`,label:`_label_1f7p3_26`},Xt=({icon:e,onDoubleClick:t,onContextMenu:n})=>{let i=r.st.find(t=>t.id===e.appId),a=e.iconName!==void 0,o=e.nodeId!==void 0,c=e.icon===`📁`,l=e.appId===`pdf`,u=(0,j.useRef)(0),d=ke(e.appId),p=e.appId&&!o&&i?d:e.name,m=(0,j.useCallback)(t=>{if(t.preventDefault(),e.nodeId){t.stopPropagation(),n?.(t,e.nodeId);return}e.appId&&!i?.hasContextMenu&&t.stopPropagation()},[e.nodeId,e.appId,i?.hasContextMenu,n]),h=()=>a?(0,M.jsx)(f.n,{type:`folder`,name:e.name,folderNode:{id:e.id,name:e.name,type:`folder`,parentId:null,children:[],iconName:e.iconName,iconColor:e.iconColor,createdAt:new Date,updatedAt:new Date},size:32}):c&&o?(0,M.jsx)(f.n,{type:`folder`,name:e.name,size:32}):o||l?(0,M.jsx)(f.n,{type:`file`,name:e.name,size:32}):(0,M.jsx)(s.t,{fcIcon:i?.fcIcon,iconUrl:i?.iconUrl,fallback:e.icon,size:32,color:i?.iconColor});return(0,M.jsxs)(`div`,{className:Yt.root,style:{left:e.x,top:e.y},onDoubleClick:()=>t(e.appId??``,e.nodeId),onTouchEnd:n=>{n.preventDefault();let r=Date.now();r-u.current<300&&t(e.appId??``,e.nodeId),u.current=r},onContextMenu:m,role:`button`,"aria-label":p,tabIndex:0,onKeyDown:n=>n.key===`Enter`&&t(e.appId??``,e.nodeId),children:[(0,M.jsx)(`span`,{className:Yt.iconImage,"aria-hidden":`true`,children:h()}),(0,M.jsx)(N.Text,{size:`xs`,className:Yt.label,truncate:!0,children:p})]})},Zt=({x:e,y:t})=>(0,M.jsx)(N.Menu.Target,{children:(0,M.jsx)(`div`,{"aria-hidden":`true`,style:{position:`fixed`,left:e,top:t,width:0,height:0,pointerEvents:`none`}})}),Qt=({owner:e,parentId:t,currentPath:i})=>{let{t:a}=(0,L.useTranslation)(`contextMenu`),o=r.o(e=>e.contextMenu),c=r.o(e=>e.closeContextMenu),u=r.o(e=>e.copyToClipboard),d=r.o(e=>e.cutToClipboard),f=r.o(e=>e.clipboard),p=r.o(e=>e.clearClipboard),m=r.o(e=>e.fsNodes),h=r.o(e=>e.addNotification),g=r.o(e=>e.openWindow),_=r.o(e=>e.desktopSortMode),v=r.o(e=>e.filesSortMode),y=r.o(e=>e.setDesktopSortMode),b=r.o(e=>e.setFilesSortMode),x=r.o(e=>e.setFsNodes),S=r.o(e=>e.syncIcons),C=e===`files`?v:_,w=e===`files`?b:y,[T,E]=(0,j.useState)({opened:!1,pending:null}),[D,O]=(0,j.useState)({opened:!1,nodeId:null,nodeName:``}),k=o.owner===e,A=o.targetNodeId,P=A?m.find(e=>e.id===A):void 0,F=e=>{c();let{x:r,y:o}=n._();g({title:a(e===`folder`?`createItem.folderTitle`:`createItem.fileTitle`),content:`createItem`,icon:e===`folder`?`📁`:`📄`,fcIcon:e===`folder`?`FcNewFolder`:`FcFile`,x:r,y:o,width:400,height:300,minWidth:350,minHeight:250,canMaximize:!1,alwaysOnTop:!0,contentData:{mode:e,parentId:t,currentPath:i}})},I=()=>{A&&P&&O({opened:!0,nodeId:A,nodeName:P.name}),c()},R=async e=>{if(e&&D.nodeId)try{await r.n.delete(D.nodeId),x(r.n.getAllNodes()),S()}catch(e){h({id:`delete-error-${Date.now()}`,title:a(`common:errors.deleteFailed`),message:e instanceof Error?e.message:`Unknown error`,fcIcon:`FcHighPriority`})}O({opened:!1,nodeId:null,nodeName:``})},z=()=>{P&&d([P]),c()},ee=()=>{P&&u([P]),c()},B=(e,t)=>m.find(n=>n.name===e&&n.parentId===t),V=async(e,t)=>{let n=await r.n.createFolder(e.name,t,e.iconName,e.iconColor),i=r.n.getChildren(e.id);for(let e of i)e.type===`folder`?await V(e,n.id):await r.n.createFile(e.name,e.content||``,n.id)},te=async(e,n)=>{if(t){if(f.action===`cut`)try{await r.n.move(e.id,t),x(r.n.getAllNodes()),S()}catch(e){h({id:`move-error-${Date.now()}`,title:`Move Failed`,message:e instanceof Error?e.message:`Unknown error`,fcIcon:`FcHighPriority`});return}else if(f.action===`copy`){if(e.type===`folder`){let i=B(e.name,t);i&&n&&await r.n.delete(i.id),(!i||n)&&(await V(e,t),x(r.n.getAllNodes()),S())}else if(e.type===`file`){let i=B(e.name,t);if(i&&n&&await r.n.delete(i.id),!i||n)try{await r.n.createFile(e.name,e.content||``,t),x(r.n.getAllNodes()),S()}catch(e){h({id:`create-error-${Date.now()}`,title:`Create File Failed`,message:e instanceof Error?e.message:`Unknown error`,fcIcon:`FcHighPriority`})}}}f.action===`cut`&&p()}},H=async()=>{if(f.content.length===0||!t)return;let e=f.content[0];B(e.name,t)?E({opened:!0,pending:{node:e,originalName:e.name}}):(await te(e,!1),c())},U=e=>{T.pending&&te(T.pending.node,e),E({opened:!1,pending:null}),c()},ne=f.content.length>0&&t!==null,W=f.content.length>1?a(`actions.pasteItems`,{count:f.content.length}):a(`actions.paste`),re=e=>{w(e),c()},ie=[{mode:`default`,icon:`FcDatabase`,label:a(`sort.default`)},{mode:`name-asc`,icon:`FcAlphabeticalSortingAz`,label:a(`sort.nameAsc`)},{mode:`name-desc`,icon:`FcAlphabeticalSortingZa`,label:a(`sort.nameDesc`)},{mode:`type`,icon:`FcFile`,label:a(`sort.byType`)}];return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(N.Menu,{opened:k,onClose:c,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,position:`bottom-start`,children:[(0,M.jsx)(Zt,{x:o.x,y:o.y}),(0,M.jsx)(N.Menu.Dropdown,{children:P?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(N.Menu.Label,{children:P.name}),(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(l.t,{name:`VscFiles`,size:14}),onClick:z,children:a(`actions.cut`)}),(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(l.t,{name:`VscClippy`,size:14}),onClick:ee,children:a(`actions.copy`)}),ne&&(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(l.t,{name:`VscCopy`,size:14}),onClick:H,children:W}),(0,M.jsx)(N.Menu.Divider,{}),(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(l.t,{name:`VscTrash`,size:14}),color:`red`,onClick:I,children:a(`actions.delete`)})]}):(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(l.t,{name:`VscNewFolder`,size:14}),onClick:()=>F(`folder`),children:a(`actions.createFolder`)}),(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(l.t,{name:`VscNewFile`,size:14}),onClick:()=>F(`file`),children:a(`actions.createFile`)}),ne&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(N.Menu.Divider,{}),(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(l.t,{name:`VscCopy`,size:14}),onClick:H,children:W})]}),e===`desktop`||e===`files`?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(N.Menu.Divider,{}),(0,M.jsx)(N.Menu.Label,{children:a(`sort.title`)}),ie.map(e=>(0,M.jsx)(N.Menu.Item,{leftSection:(0,M.jsx)(s.t,{fcIcon:e.icon,size:14}),onClick:()=>re(e.mode),style:C===e.mode?{fontWeight:600}:void 0,"data-testid":C===e.mode?`sort-option-selected`:void 0,children:e.label},e.mode))]}):null]})})]}),(0,M.jsxs)(N.Modal,{opened:T.opened,onClose:()=>U(!1),title:(0,M.jsx)(N.Text,{fw:600,children:a(`common:messages.replaceFile`)}),centered:!0,size:`sm`,children:[(0,M.jsx)(N.Text,{size:`sm`,mb:`md`,children:a(`common:messages.replaceFileMessage`,{name:T.pending?.originalName})}),(0,M.jsxs)(N.Group,{justify:`flex-end`,children:[(0,M.jsx)(N.Button,{variant:`default`,size:`sm`,onClick:()=>U(!1),leftSection:(0,M.jsx)(l.t,{name:`VscClose`,size:14}),children:a(`common:buttons.no`)}),(0,M.jsx)(N.Button,{size:`sm`,onClick:()=>U(!0),leftSection:(0,M.jsx)(l.t,{name:`VscCheck`,size:14}),children:a(`common:messages.yesReplace`)})]})]}),(0,M.jsxs)(N.Modal,{opened:D.opened,onClose:()=>R(!1),title:(0,M.jsx)(N.Text,{fw:600,children:a(`deleteConfirm.title`,{name:D.nodeName})}),centered:!0,size:`sm`,children:[(0,M.jsx)(N.Text,{size:`sm`,mb:`md`,children:a(`deleteConfirm.message`,{name:D.nodeName})}),(0,M.jsxs)(N.Group,{justify:`flex-end`,children:[(0,M.jsx)(N.Button,{variant:`default`,size:`sm`,onClick:()=>R(!1),leftSection:(0,M.jsx)(l.t,{name:`VscClose`,size:14}),children:a(`common:actions.cancel`)}),(0,M.jsx)(N.Button,{color:`red`,size:`sm`,onClick:()=>R(!0),leftSection:(0,M.jsx)(l.t,{name:`VscTrash`,size:14}),children:a(`common:actions.delete`)})]})]})]})},$t={overlay:`_overlay_34o9z_1`,content:`_content_34o9z_12`,phoneIcon:`_phoneIcon_34o9z_22`,rotatePhone:`_rotatePhone_34o9z_1`,title:`_title_34o9z_50`,message:`_message_34o9z_54`,button:`_button_34o9z_58`},en=({onDismiss:e})=>{let{isPortrait:t,shouldShowWarning:n}=p.r();return!n||!t?null:(0,M.jsx)(`div`,{className:$t.overlay,children:(0,M.jsxs)(`div`,{className:$t.content,children:[(0,M.jsx)(`div`,{className:$t.phoneIcon,children:(0,M.jsxs)(`svg`,{width:`64`,height:`64`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,children:[(0,M.jsx)(`rect`,{x:`5`,y:`2`,width:`14`,height:`20`,rx:`2`}),(0,M.jsx)(`line`,{x1:`12`,y1:`18`,x2:`12`,y2:`18.01`,strokeWidth:`2`,strokeLinecap:`round`})]})}),(0,M.jsx)(N.Text,{size:`lg`,fw:500,className:$t.title,children:`Turn your device`}),(0,M.jsx)(N.Text,{size:`sm`,c:`dimmed`,className:$t.message,children:`For a better experience use this app desktop OR horizontal mode`}),(0,M.jsx)(N.Button,{variant:`subtle`,onClick:e,className:$t.button,children:`Continue vertically?`})]})})},tn=()=>typeof window<`u`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`,nn=()=>{let e=t.g(e=>e.applySystemTheme),n=t.g(e=>e.themeSetManually);(0,j.useEffect)(()=>{if(typeof window>`u`)return;n||e(tn());let r=window.matchMedia(`(prefers-color-scheme: dark)`),i=n=>{t.g.getState().themeSetManually||e(n.matches?`dark`:`light`)};return r.addEventListener(`change`,i),()=>r.removeEventListener(`change`,i)},[e,n])},rn=(e,t)=>{let n=e=>e.replace(/^v/,``).split(`.`).map(Number),r=n(e),i=n(t),a=Math.max(r.length,i.length);for(let e=0;e<a;e++){let t=r[e]??0,n=i[e]??0;if(t>n)return!0;if(t<n)return!1}return!1},an=`frannunpal/frannunpal.github.io`,on=`https://api.github.com/repos/${an}/releases/latest`,sn=async()=>{let e=await fetch(on);if(!e.ok)throw Error(`GitHub API error: ${e.status}`);return e.json()},cn=`fde-desktop:version`,ln=!1,un=()=>{let e=r.o(e=>e.mergeSeed),t=r.o(e=>e.mergeDesktopApps),n=r.o(e=>e.reorderDesktopApps),{notify:i}=d.r();(0,j.useEffect)(()=>{typeof window>`u`||ln||(ln=!0,r.K()?dn(i):fn(e,t,n,i))},[e,t,n,i])},dn=async e=>{try{let t=await sn(),n=t.tag_name;if(!rn(n,__APP_VERSION__))return;e(`Update ${n} available!`,`Click close to open the download page.`,{fcIcon:`FcEngineering`,onClose:()=>window.open(t.html_url,`_blank`)})}catch{ln=!1}},fn=async(e,t,n,i)=>{try{let a=localStorage.getItem(cn),o=a?JSON.parse(a):null,s=await fetch(r.g(`version.json`)).then(e=>e.json());if(o?.sha===s.sha)return;let c=await r.t();if(!c)return;e(c),t(r.ct),n(r.ct),localStorage.setItem(cn,JSON.stringify(s)),i(`New version available!`,`Close this notification to install it.`,{fcIcon:`FcEngineering`,onClose:()=>window.location.reload()})}catch{ln=!1}},pn=e=>`https://fonts.googleapis.com/css2?family=${e.replace(/\s+/g,`+`)}&display=swap`,mn=e=>{let n=t.p[e];if(!n||document.head.querySelector(`link[data-font="${e}"]`))return;let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=n,r.setAttribute(`data-font`,e),document.head.appendChild(r)},hn=()=>{let e=t.g(e=>e.font),n=t.g(e=>e.fontSize),r=t.g(e=>e.downloadedFonts);(0,j.useEffect)(()=>{r.forEach(e=>{t.p[e]||(t.p[e]=pn(e)),mn(e)})},[r]),(0,j.useEffect)(()=>{let i=t.d.map(e=>e.value).includes(e);!i&&r.includes(e)&&(t.p[e]||(t.p[e]=pn(e)),mn(e));let a;a=i?t.f[e]??t.f[`system-ui`]:r.includes(e)?`"${e}", sans-serif`:t.f[`system-ui`],document.documentElement.style.setProperty(`font-family`,a),document.documentElement.style.setProperty(`--mantine-font-family`,a),document.documentElement.style.setProperty(`font-size`,`${n}px`)},[e,n,r])};function gn(){let{i18n:e}=(0,L.useTranslation)(),n=t.g(e=>e.language);(0,j.useEffect)(()=>{n&&e.language!==n&&(e.changeLanguage(n),localStorage.setItem(`fde-desktop:language`,n))},[n,e]),(0,j.useEffect)(()=>{let e=localStorage.getItem(`fde-desktop:language`);n&&!e&&localStorage.setItem(`fde-desktop:language`,n)},[n])}var _n=`fran-desktop`,vn=`fde-desktop`,yn=1,bn=`fde-desktop:migration-version`,xn=!1,Sn=null;async function Cn(e,t){return new Promise(n=>{let r=indexedDB.open(e);r.onerror=()=>{n(!1)},r.onsuccess=async()=>{let i=r.result,a=Array.from(i.objectStoreNames);if(a.length===0){i.close(),n(!1);return}let o=indexedDB.open(t,i.version);o.onerror=()=>{i.close(),n(!1)},o.onupgradeneeded=e=>{let t=e.target.result;for(let e of a)t.objectStoreNames.contains(e)||t.createObjectStore(e)},o.onsuccess=async()=>{let t=o.result;try{for(let e of a){let n=i.transaction(e,`readonly`).objectStore(e).getAll();await new Promise((r,i)=>{n.onsuccess=()=>{let a=n.result;if(a&&a.length>0){let n=t.transaction(e,`readwrite`),o=n.objectStore(e);for(let e of a)o.put(e);n.oncomplete=()=>r(),n.onerror=()=>i(n.error)}else r()},n.onerror=()=>i(n.error)})}i.close(),t.close(),await new Promise(t=>{let n=indexedDB.deleteDatabase(e);n.onsuccess=()=>t(),n.onerror=()=>t()}),n(!0)}catch{i.close(),t.close(),n(!1)}}}})}function wn(){let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&(n===_n||n.startsWith(`${_n}:`))&&e.push(n)}for(let t of e){let e=t.replace(_n,vn),n=localStorage.getItem(t);n!==null&&(localStorage.getItem(e)===null&&localStorage.setItem(e,n),localStorage.removeItem(t))}return{keysMigrated:e.length}}async function Tn(){return xn?{indexedDB:{fs:!1,blobs:!1},localStorage:{keysMigrated:0},version:yn}:Sn||(Sn=(async()=>{if(console.log(`[Migration] Starting storage migration...`),localStorage.getItem(bn)===String(yn))return console.log(`[Migration] Already migrated, skipping.`),xn=!0,{indexedDB:{fs:!1,blobs:!1},localStorage:{keysMigrated:0},version:yn};let e=!1,t=!1;try{e=await Cn(`fran-desktop-fs`,`fde-desktop-fs`),e&&console.log(`[Migration] Migrated IndexedDB: fran-desktop-fs → fde-desktop-fs`)}catch(e){console.warn(`[Migration] Failed to migrate fran-desktop-fs:`,e)}try{t=await Cn(`fran-desktop-blobs`,`fde-desktop-blobs`),t&&console.log(`[Migration] Migrated IndexedDB: fran-desktop-blobs → fde-desktop-blobs`)}catch(e){console.warn(`[Migration] Failed to migrate fran-desktop-blobs:`,e)}let{keysMigrated:n}=wn();return n>0&&console.log(`[Migration] Migrated ${n} localStorage keys`),localStorage.setItem(bn,String(yn)),console.log(`[Migration] Storage migration complete.`),xn=!0,{indexedDB:{fs:e,blobs:t},localStorage:{keysMigrated:n},version:yn}})(),Sn)}var En=[],Dn=!1;function On(){if(En.length===0){Dn=!1;return}Dn=!0;let e=En.shift();e&&e.loader().catch(()=>{}).finally(()=>{`requestIdleCallback`in window?requestIdleCallback(On,{timeout:2e3}):setTimeout(On,100)})}function kn(e,t){En.some(t=>t.id===e)||(En.push({id:e,loader:t}),An())}function An(){Dn||(`requestIdleCallback`in window?requestIdleCallback(On,{timeout:2e3}):setTimeout(On,100))}function jn(e){e.forEach(e=>{kn(e.id,e.loader)})}var Mn=null,Nn=new Map;function Pn(){let{windows:e}=r.o.getState(),t=e.filter(e=>e.isOpen&&e.state!==`minimized`);return t.length===0?null:t.reduce((e,t)=>t.zIndex>(e?.zIndex??-1)?t:e,null)?.id??null}function X(e,t){let n=Nn.get(e);n&&n.forEach(n=>{try{n(t)}catch(t){console.error(`[FdeApi] Error in subscriber for ${e}:`,t)}})}var Fn={width:800,height:600},In={x:100,y:100};function Ln(){if(Mn){console.warn(`[FdeApi] Already initialized`);return}Mn={openApp:(e,t)=>{let n=r.o.getState().openWindow,i=r.st.find(t=>t.id===e);n({content:e,title:t?.title??i?.name??e,icon:t?.icon??i?.icon??`📦`,fcIcon:i?.fcIcon,iconUrl:i?.iconUrl,iconColor:i?.iconColor,width:t?.size?.width??i?.defaultWidth??Fn.width,height:t?.size?.height??i?.defaultHeight??Fn.height,x:t?.position?.x??In.x,y:t?.position?.y??In.y,minWidth:i?.minWidth===!1?void 0:i?.minWidth,minHeight:i?.minHeight===!1?void 0:i?.minHeight,canMaximize:i?.canMaximize??!0,alwaysOnTop:i?.alwaysOnTop??!1,contentData:t?.contentData}),X(`window-opened`,{windowId:r.o.getState().windows[r.o.getState().windows.length-1]?.id??``,content:e})},closeWindow:e=>{let t=e??Pn();t&&(r.o.getState().closeWindow(t),X(`window-closed`,{windowId:t}))},minimizeWindow:e=>{let t=e??Pn();t&&(r.o.getState().minimizeWindow(t),X(`window-minimized`,{windowId:t}))},maximizeWindow:e=>{let t=e??Pn();t&&(r.o.getState().maximizeWindow(t),X(`window-maximized`,{windowId:t}))},restoreWindow:e=>{let t=e??Pn();t&&r.o.getState().restoreWindow(t)},focusWindow:e=>{let t=e??Pn();t&&(r.o.getState().focusWindow(t),X(`window-focused`,{windowId:t}))},openFile:(e,t)=>{r.o.getState().openWindow({content:`files`,contentData:{initialPath:e},title:`Files`,icon:`📁`,fcIcon:`FcOpenedFolder`,width:Fn.width,height:Fn.height,x:In.x,y:In.y}),X(`file-opened`,{path:e,appId:t})},openFileDialog:async()=>(console.warn(`[FdeApi] openFileDialog not yet implemented`),null),saveFile:async()=>(console.warn(`[FdeApi] saveFile not yet implemented`),!1),saveFileDialog:async()=>(console.warn(`[FdeApi] saveFileDialog not yet implemented`),null),getTheme:()=>t.g.getState().theme,setTheme:e=>{let n=e;n.taskbar&&n.window&&n.accent&&(t.g.getState().setCustomThemeColors(n),X(`theme-changed`,{theme:JSON.stringify(e)}))},showNotification:e=>{let t=r.ot();return r.o.getState().addNotification({id:t,title:e.title,message:e.message,fcIcon:e.type===`error`?`FcCancel`:e.type===`success`?`FcCheckmark`:`FcInfo`}),X(`notification-shown`,{notificationId:t}),t},hideNotification:e=>{r.o.getState().removeNotification(e)},getWindows:()=>r.o.getState().windows,getActiveWindow:()=>{let e=r.o.getState().windows,t=Pn();return t?e.find(e=>e.id===t)??null:null},getWindowById:e=>r.o.getState().windows.find(t=>t.id===e)??null,on:(e,t)=>(Nn.has(e)||Nn.set(e,new Set),Nn.get(e).add(t),()=>{Nn.get(e)?.delete(t)}),off:(e,t)=>{Nn.get(e)?.delete(t)},fs:r.n,appReady:e=>{r.v.getState().setAppReady(e)},registerAppInstance:(e,t)=>{r.v.getState().setAppReady(e,t)}},window.__FDE_API__=Mn,console.log(`[FdeApi] Initialized`)}function Rn(){if(!Mn)throw Error(`[FdeApi] API not initialized. Call initializeFdeApi() first.`);return Mn}function zn(){return Mn!==null}var Bn=new P.QueryClient({defaultOptions:{queries:{staleTime:1/0,gcTime:1/0}}}),Vn=!1;function Hn({defaultWallpaper:e,initialApp:i,prefetchLoaders:a}){let o=m.t(t.g(e=>e.wallpaper)??void 0),s=r.o(e=>e.windows),c=r.o(e=>e.icons),l=r.o(e=>e.initFs),u=r.o(e=>e.isFsReady),f=r.o(e=>e.fsNodes),h=r.o(e=>e.openContextMenu),g=r.o(e=>e.filesCurrentFolderId),_=r.o(e=>e.desktopFolderId),v=n.t(),{shouldShowWarning:y}=p.r(),{notify:b}=d.r(),[x,S]=(0,j.useState)(!1);nn(),un(),hn(),gn(),zt(),(0,j.useEffect)(()=>{zn()||Ln()},[]),(0,j.useEffect)(()=>{if(!u)return;let e=document.getElementById(`initial-loader`);e&&(e.classList.add(`hidden`),setTimeout(()=>e.remove(),200))},[u]),(0,j.useEffect)(()=>{if(!a?.length)return;let e=setTimeout(()=>{jn(a)},3e3);return()=>clearTimeout(e)},[a]),(0,j.useEffect)(()=>{Vn||(Vn=!0,Tn().finally(()=>{l(),i&&v(i)}))},[l,v,i]);let C=(0,j.useCallback)(e=>{e.preventDefault(),h(e.clientX,e.clientY,`desktop`)},[h]),w=(0,j.useCallback)((e,t)=>{e.preventDefault(),e.stopPropagation(),h(e.clientX,e.clientY,`desktop`,t)},[h]),T=(0,j.useCallback)((e,t)=>{let n;if(t){let i=f.find(e=>e.id===t);if(i?.type===`folder`)n={initialFolderId:t};else if(i?.type===`file`){let t=r.x(i);if(!t){b(`Unsupported file type`,`The type of file you are trying to open is not supported currently`,{fcIcon:`FcDeleteRow`});return}t.appId!==e&&b(`File type mismatch`,`Opening "${i.name}" as ${t.appId} instead of ${e}`,{fcIcon:`FcDeleteRow`}),v(t.appId,{contentData:t.contentData});return}}v(e,{contentData:n})},[v,f,b]);return u?(0,M.jsxs)(M.Fragment,{children:[y&&!x&&(0,M.jsx)(en,{onDismiss:()=>S(!0)}),(0,M.jsxs)(be,{wallpaper:o??e,onContextMenu:C,children:[c.map(e=>(0,M.jsx)(Xt,{icon:e,onDoubleClick:T,onContextMenu:w},e.id)),(0,M.jsx)(I.AnimatePresence,{children:s.map(e=>(0,M.jsx)(Jt,{window:e},e.id))})]}),(0,M.jsx)(ft,{}),(0,M.jsx)(Qt,{owner:`desktop`,parentId:_,currentPath:`/home`}),(0,M.jsx)(Qt,{owner:`files`,parentId:g,currentPath:(()=>{let e=[`/home`],t=g,n=[];for(;t!==null;){let e=f.find(e=>e.id===t);if(!e)break;n.unshift(e.name),t=e.parentId}return[...e,...n].join(`/`)})()})]}):null}function Un({children:e,isReady:n,error:r,defaultWallpaper:i,initialApp:a,prefetchLoaders:o}){let s=se(),c=t.g(e=>e.setThemeMode),l=t.g(e=>e.toggleTheme),u=(0,j.useMemo)(()=>({fs:null,isReady:n,error:r,theme:s,setThemeMode:c,toggleTheme:l}),[n,r,s,c,l]);return e?(0,M.jsx)(ge,{children:(0,M.jsx)(ue.Provider,{value:u,children:e})}):(0,M.jsx)(ge,{children:(0,M.jsx)(ue.Provider,{value:u,children:(0,M.jsx)(Hn,{defaultWallpaper:i,initialApp:a,prefetchLoaders:o})})})}function Wn({children:e,fallback:i=null,theme:a,mantineTheme:o,fileSystem:s,initialMode:c,customApps:l,appEntries:u,onError:d,defaultWallpaper:f,initialApp:p,prefetchLoaders:m,queryClient:h=Bn}){let[g,_]=(0,j.useState)(!1),[v,y]=(0,j.useState)(null),b=t.g(e=>e.theme.mode),[x]=(0,j.useState)(c),S=x??b;(0,j.useEffect)(()=>{let e=!0;return(async()=>{try{if(n.T(),u&&r.lt(u),l){let e={...l};if(u)for(let t of u){let n=e[t.id];n&&(e[t.id]={...n,appName:n.appName??t.name,singleWindow:n.singleWindow??t.singleWindow,defaultWidth:n.defaultWidth??t.defaultWidth,defaultHeight:n.defaultHeight??t.defaultHeight,minWidth:n.minWidth??t.minWidth,minHeight:n.minHeight??t.minHeight,canMaximize:n.canMaximize??t.canMaximize,alwaysOnTop:n.alwaysOnTop??t.alwaysOnTop,icon:n.icon??t.icon,fcIcon:n.fcIcon??t.fcIcon,iconUrl:n.iconUrl??t.iconUrl,iconColor:n.iconColor??t.iconColor})}n.O(e)}}catch(e){console.error(`[FdeDesktop] Failed to initialize core registry:`,e)}if(!s){e&&_(!0);return}try{await s.initialize(),e&&_(!0)}catch(t){let n=t instanceof Error?t:Error(String(t));e&&(y(n),d?.(n))}})(),()=>{e=!1}},[s,u,l,d]);let C=(0,j.useMemo)(()=>(0,N.createTheme)({...le,...o}),[o]);return v||!g?(0,M.jsx)(M.Fragment,{children:i}):(0,M.jsx)(P.QueryClientProvider,{client:h,children:(0,M.jsx)(N.MantineProvider,{theme:C,forceColorScheme:S,children:(0,M.jsx)(oe,{mode:S,theme:a,children:(0,M.jsx)(Un,{isReady:g,error:v,defaultWallpaper:f,initialApp:p,prefetchLoaders:m,children:e})})})})}var Gn=({component:e,windowId:t,contentData:n,onExit:r})=>e?(0,M.jsx)(e,{windowId:t,contentData:n,onExit:r}):null,Kn=r.st.filter(e=>e.id!==`settings`),qn=({opened:e,position:t,onClose:n,onOpenApp:r,onToggleTheme:i})=>(0,M.jsxs)(N.Menu,{opened:e,onClose:n,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,children:[(0,M.jsx)(Zt,{x:t.x,y:t.y}),(0,M.jsxs)(N.Menu.Dropdown,{children:[Kn.map(e=>(0,M.jsxs)(N.Menu.Item,{onClick:()=>r(e.id),children:[`Open `,e.name]},e.id)),(0,M.jsx)(N.Menu.Divider,{}),(0,M.jsx)(N.Menu.Item,{onClick:i,children:`Toggle Theme`})]})]}),Jn={frame:`_frame_13ufi_1`},Yn=`https://frannunpal.github.io/storybook/`,Xn=()=>(0,M.jsx)(`iframe`,{src:Yn,className:Jn.frame,title:`Storybook`,"aria-label":`Storybook component explorer`}),Z={scrollback:5e3,shell:`/bin/zsh`},Zn=(0,F.create)((e,t)=>({states:{},getScrollback:e=>t().states[e]?.scrollback??Z.scrollback,getShell:e=>t().states[e]?.shell??Z.shell,setScrollback:(t,n)=>e(e=>({states:{...e.states,[t]:{...e.states[t]??Z,scrollback:n}}})),setShell:(t,n)=>e(e=>({states:{...e.states,[t]:{...e.states[t]??Z,shell:n}}})),reset:t=>e(e=>({states:{...e.states,[t]:{...Z}}}))})),Qn=e=>Zn(t=>t.states[e]?.scrollback??Z.scrollback),$n=e=>Zn(t=>t.states[e]?.shell??Z.shell),Q={terminalContainer:`_terminalContainer_15s96_1`,terminalWrapper:`_terminalWrapper_15s96_9`,terminal:`_terminal_15s96_1`,statusBar:`_statusBar_15s96_33`,statusIndicator:`_statusIndicator_15s96_45`,statusText:`_statusText_15s96_70`,reconnectButton:`_reconnectButton_15s96_74`},er=5,tr=1e3,nr=({shell:e,scrollback:t,onTerminalReady:n,onConnectionChange:r})=>{let i=(0,j.useRef)(null),a=(0,j.useRef)(null),o=(0,j.useRef)(null),s=(0,j.useRef)(null),c=(0,j.useRef)(null),l=(0,j.useRef)(0),u=(0,j.useRef)(!1),d=(0,j.useRef)(!1),f=(0,j.useRef)(e),p=(0,j.useRef)(null),m=(0,j.useRef)(!1),[h,g]=(0,j.useState)(`idle`),[_,v]=(0,j.useState)(!1),y=(0,j.useRef)(n),b=(0,j.useRef)(r);(0,j.useEffect)(()=>{y.current=n},[n]),(0,j.useEffect)(()=>{b.current=r},[r]),(0,j.useEffect)(()=>{f.current=e},[e]);let x=(0,j.useCallback)(e=>{u.current&&(g(e),b.current?.(e))},[]),S=(0,j.useCallback)(()=>{p.current?.abort(),p.current=null;let e=c.current;if(e&&(c.current=null,e.readyState===WebSocket.OPEN||e.readyState===WebSocket.CONNECTING)){try{e.send(JSON.stringify({type:`kill`}))}catch{}e.close()}d.current=!1},[]),C=(0,j.useCallback)(()=>{if(!u.current||d.current||c.current?.readyState===WebSocket.OPEN)return;d.current=!0;let e=new AbortController;p.current=e;let t=`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/api/pty`;console.log(`[XTermTerminal] Connecting (attempt ${l.current+1}/${er})`),x(`connecting`);let n=new WebSocket(t);c.current=n,n.onopen=()=>{u.current&&console.log(`[XTermTerminal] WebSocket opened`)},n.onmessage=e=>{if(u.current&&typeof e.data==`string`)try{let t=JSON.parse(e.data);switch(t.type){case`ready`:console.log(`[XTermTerminal] Server ready, sending start`),n.send(JSON.stringify({type:`start`,shell:f.current,cwd:`/app/workspace`,cols:a.current?.cols||80,rows:a.current?.rows||24}));break;case`started`:console.log(`[XTermTerminal] PTY started`),l.current=0,d.current=!1,v(!1),x(`connected`);break;case`exit`:console.log(`[XTermTerminal] PTY exited:`,t.code),c.current=null,d.current=!1,x(`disconnected`),v(!0);break;case`error`:console.error(`[XTermTerminal] Server error:`,t.message),d.current=!1,x(`error`),v(!0);break}}catch{a.current&&a.current.write(e.data)}},n.onclose=()=>{if(!(!u.current||e.signal.aborted))if(console.log(`[XTermTerminal] WebSocket closed`),c.current=null,d.current=!1,l.current<er){l.current++;let t=tr*2**(l.current-1);console.log(`[XTermTerminal] Retrying in ${t}ms`),setTimeout(()=>{u.current&&!c.current&&!e.signal.aborted&&C()},t)}else x(`disconnected`),v(!0)},n.onerror=()=>{u.current&&(console.error(`[XTermTerminal] WebSocket error`),d.current=!1,n.close(),x(`error`),v(!0))}},[x]);(0,j.useEffect)(()=>{if(m.current||(m.current=!0,u.current=!0,!i.current))return;let e=new te.Terminal({fontFamily:`'Operator Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace`,fontSize:14,theme:{background:`#1e1e1e`,foreground:`#d4d4d4`,cursor:`#ffffff`,selectionBackground:`#264f78`},cursorStyle:`underline`,cursorBlink:!0,scrollback:t}),n=new H.FitAddon,r=new U.ClipboardAddon;return e.loadAddon(n),e.loadAddon(r),e.open(i.current),n.fit(),a.current=e,o.current=n,s.current=r,e.onData(e=>{c.current?.readyState===WebSocket.OPEN&&c.current.send(JSON.stringify({type:`input`,data:e}))}),e.onResize(({cols:e,rows:t})=>{c.current?.readyState===WebSocket.OPEN&&c.current.send(JSON.stringify({type:`resize`,cols:e,rows:t}))}),y.current?.({clear:()=>e.clear(),reset:()=>e.reset(),write:t=>e.write(t),copy:async()=>{let t=e.getSelection();if(console.log(`[XTermTerminal] Copy called, selection length:`,t?.length??0),!t){console.log(`[XTermTerminal] No selection to copy`);return}try{if(!navigator.clipboard){console.warn(`[XTermTerminal] Clipboard API not available (non-secure context?)`),rr(t);return}await navigator.clipboard.writeText(t),console.log(`[XTermTerminal] Copied to clipboard successfully`)}catch(e){console.error(`[XTermTerminal] Clipboard write failed:`,e),rr(t)}},paste:async()=>{console.log(`[XTermTerminal] Paste called`);try{if(!navigator.clipboard){console.warn(`[XTermTerminal] Clipboard API not available`);return}let t=await navigator.clipboard.readText();console.log(`[XTermTerminal] Paste text length:`,t.length),e.paste(t)}catch(e){console.error(`[XTermTerminal] Paste failed:`,e)}},reconnect:w}),requestAnimationFrame(()=>{u.current&&C()}),()=>{console.log(`[XTermTerminal] Cleanup`),u.current=!1,p.current?.abort(),p.current=null,a.current&&a.current.clear(),S(),e.dispose(),a.current=null,o.current=null}},[]);let w=(0,j.useCallback)(()=>{console.log(`[XTermTerminal] Reconnect triggered`),l.current=0,v(!1),S(),setTimeout(()=>C(),100)},[S,C]);return(0,j.useEffect)(()=>{a.current&&(a.current.options.scrollback=t)},[t]),(0,j.useEffect)(()=>{if(!i.current)return;let e=new ResizeObserver(()=>{o.current?.fit()});return e.observe(i.current),()=>e.disconnect()},[]),(0,M.jsxs)(`div`,{className:Q.terminalContainer,children:[(0,M.jsx)(`div`,{className:Q.terminalWrapper,children:(0,M.jsx)(`div`,{ref:i,className:Q.terminal,"data-testid":`xterm-terminal`})}),(0,M.jsxs)(`div`,{className:Q.statusBar,children:[(0,M.jsxs)(`span`,{className:Q.statusIndicator,"data-status":h,children:[h===`idle`&&`○`,h===`connecting`&&`●`,h===`connected`&&`●`,h===`disconnected`&&`○`,h===`error`&&`●`]}),(0,M.jsxs)(`span`,{className:Q.statusText,children:[h===`idle`&&`Idle`,h===`connecting`&&`Connecting...`,h===`connected`&&`Connected`,h===`disconnected`&&`Disconnected`,h===`error`&&`Error`]}),_&&(0,M.jsx)(`button`,{onClick:w,className:Q.reconnectButton,children:`Reconnect`})]})]})};function rr(e){let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.left=`-9999px`,t.style.opacity=`0`,document.body.appendChild(t),t.select(),t.setSelectionRange(0,e.length);try{let e=document.execCommand(`copy`);console.log(`[XTermTerminal] Fallback copy result:`,e?`success`:`failed`)}catch(e){console.error(`[XTermTerminal] Fallback copy failed:`,e)}finally{document.body.removeChild(t)}}var ir=()=>{let{t:e}=(0,L.useTranslation)(`apps`);return(0,M.jsx)(N.Center,{"data-testid":`terminal-not-supported`,style:{width:`100%`,height:`100%`},children:(0,M.jsxs)(N.Stack,{align:`center`,gap:`lg`,p:`xl`,maw:400,children:[(0,M.jsx)(N.Text,{size:`3rem`,children:(0,M.jsx)(V.FcInfo,{})}),(0,M.jsx)(N.Text,{size:`lg`,fw:700,ta:`center`,children:e(`terminal.notAvailable`)}),(0,M.jsx)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:e(`terminal.notAvailableMessage`)}),(0,M.jsx)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:e(`terminal.dockerRequired`)})]})})},ar=({window:e,notifyReady:t})=>{let n=e,i=n?.id??``,a=r.H(),o=Qn(i),s=$n(i),{setScrollback:c,setShell:l,reset:u}=Zn(),d=(0,j.useRef)(null),f=(0,j.useRef)(!1),p=(0,j.useRef)(!1),[m,h]=(0,j.useState)(`idle`),[g,_]=(0,j.useState)(null);(0,j.useEffect)(()=>{a!==`docker`||p.current||(p.current=!0,(async()=>{try{let e=await fetch(`/api/shell`);if(e.ok){let t=await e.json();_(t),(!s||s===`/bin/zsh`)&&l(i,t.default)}}catch(e){console.error(`[TerminalApp] Failed to fetch shell info:`,e),s||l(i,`/bin/zsh`)}})())},[a,s,l,i]),(0,j.useEffect)(()=>{u(i)},[i,u]);let v=(0,j.useCallback)(e=>{d.current=e},[]),y=(0,j.useCallback)(e=>{h(e)},[]);return(0,j.useEffect)(()=>{!f.current&&t&&(f.current=!0,t({...n?.contentData??{},clear:()=>d.current?.clear(),reset:()=>d.current?.reset(),copy:()=>d.current?.copy(),paste:()=>d.current?.paste(),reconnect:()=>d.current?.reconnect(),setScrollback:e=>c(i,e),setShell:e=>l(i,e),connectionStatus:m}))},[t,c,l,i,n?.contentData,m]),(0,j.useEffect)(()=>{f.current&&t&&t({...n?.contentData??{},connectionStatus:m})},[m,t,n?.contentData]),a===`docker`?(0,M.jsx)(nr,{shell:s||g?.default||`/bin/zsh`,scrollback:o,onTerminalReady:v,onConnectionChange:y}):(0,M.jsx)(ir,{})},or=()=>{let{t:e}=(0,L.useTranslation)(`apps`);return(0,M.jsx)(N.Center,{"data-testid":`code-server-not-supported`,style:{width:`100%`,height:`100%`},children:(0,M.jsxs)(N.Stack,{align:`center`,gap:`lg`,p:`xl`,maw:400,children:[(0,M.jsx)(N.Text,{size:`3rem`,children:(0,M.jsx)(V.FcInfo,{})}),(0,M.jsx)(N.Text,{size:`lg`,fw:700,ta:`center`,children:e(`codeServer.notAvailable`)}),(0,M.jsx)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:e(`codeServer.notAvailableMessage`)}),(0,M.jsx)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:e(`codeServer.dockerRequired`)})]})})},$={container:`_container_1ypq1_1`,loading:`_loading_1ypq1_9`,spinner:`_spinner_1ypq1_19`,spin:`_spin_1ypq1_19`,error:`_error_1ypq1_39`,retryButton:`_retryButton_1ypq1_63`,iframe:`_iframe_1ypq1_79`},sr=({window:e,notifyReady:t})=>{let n=e,[r,i]=(0,j.useState)({status:`idle`,url:null,error:null}),a=(0,j.useRef)(!1),o=(0,j.useRef)(!1),s=(0,j.useCallback)(async()=>{if(!o.current){o.current=!0,i(e=>({...e,status:`starting`,error:null}));try{let e=await(await fetch(`/api/code-server/start`,{method:`POST`})).json();e.success&&e.url?i({status:`running`,url:e.url,error:null}):i({status:`error`,url:null,error:e.error||`Failed to start code-server`})}catch(e){i({status:`error`,url:null,error:e instanceof Error?e.message:`Failed to start code-server`})}finally{o.current=!1}}},[]),c=(0,j.useCallback)(async()=>{try{await fetch(`/api/code-server/stop`,{method:`POST`})}catch(e){console.error(`[CodeServerApp] Error stopping code-server:`,e)}},[]);return(0,j.useEffect)(()=>(s(),()=>{c()}),[s,c]),(0,j.useEffect)(()=>{!a.current&&t&&(a.current=!0,t({...n?.contentData??{},status:r.status,restart:s}))},[t,r.status,s,n?.contentData]),(0,j.useEffect)(()=>{a.current&&t&&t({...n?.contentData??{},status:r.status})},[r.status,t,n?.contentData]),r.status===`idle`||r.status===`starting`?(0,M.jsx)(`div`,{className:$.container,children:(0,M.jsxs)(`div`,{className:$.loading,children:[(0,M.jsx)(`div`,{className:$.spinner}),(0,M.jsx)(`p`,{children:`Starting VS Code...`})]})}):r.status===`error`?(0,M.jsx)(`div`,{className:$.container,children:(0,M.jsxs)(`div`,{className:$.error,children:[(0,M.jsx)(`h3`,{children:`Failed to start VS Code`}),(0,M.jsx)(`p`,{children:r.error}),(0,M.jsx)(`button`,{onClick:s,className:$.retryButton,children:`Retry`})]})}):(0,M.jsx)(`div`,{className:$.container,children:(0,M.jsx)(`iframe`,{src:r.url||``,className:$.iframe,title:`VS Code`,allow:`clipboard-read; clipboard-write`})})},cr=e=>r.G()?(0,M.jsx)(sr,{...e}):(0,M.jsx)(or,{}),lr=[{value:`/bin/sh`,label:`sh`},{value:`/bin/zsh`,label:`zsh`}];function ur(e){let{windowId:t,onExit:n,clear:r,reset:i,copy:a,paste:o,reconnect:s,connectionStatus:c=`idle`}=e,{t:l}=(0,L.useTranslation)(`common`),{t:u}=(0,L.useTranslation)(`apps`),d=Qn(t),f=$n(t),p=Zn(e=>e.setScrollback),m=Zn(e=>e.setShell),h=(0,j.useCallback)(e=>p(t,e),[t,p]),g=(0,j.useCallback)(e=>m(t,e),[t,m]),_=c===`connected`;return(0,j.useMemo)(()=>{let e=[{type:`item`,label:u(`terminal.menu.copy`),icon:`FcCopy`,onClick:a??(()=>{}),disabled:!_},{type:`item`,label:u(`terminal.menu.paste`),icon:`FcPaste`,onClick:o??(()=>{}),disabled:!_},{type:`divider`},{type:`item`,label:u(`terminal.menu.clear`),icon:`FcClear`,onClick:r??(()=>{}),disabled:!_},{type:`item`,label:u(`terminal.menu.reset`),icon:`FcSynchronize`,onClick:i??(()=>{}),disabled:!_}];return!_&&s&&(e.push({type:`divider`}),e.push({type:`item`,label:u(`terminal.menu.reconnect`),icon:`FcSynchronize`,onClick:s})),e.push({type:`divider`}),e.push({type:`item`,label:l(`actions.exit`),icon:`FcLeave`,onClick:n}),[{type:`menu`,label:l(`menu.edit`),items:e},{type:`number-input`,label:u(`terminal.scrollback`),value:d,onChange:h,min:100,max:5e4,step:100,placeholder:`5000`},{type:`select`,label:u(`terminal.shell`),options:lr,value:f,onChange:g}]},[l,u,n,r,i,a,o,s,_,d,f,h,g])}var dr=(0,j.memo)(({windowId:e,contentData:t,onExit:n})=>(0,M.jsx)(u.t,{elements:ur({windowId:e,onExit:n,clear:t?.clear,reset:t?.reset,copy:t?.copy,paste:t?.paste,reconnect:t?.reconnect,connectionStatus:t?.connectionStatus})}));dr.displayName=`TerminalMenuBar`;var fr={container:`_container_1br66_1`},pr=({notifyReady:e,window:t,config:n})=>{let r=(0,j.useRef)(!1),a=`${n.title} blocks embedding in iframes for security reasons.`;(0,j.useEffect)(()=>{r.current||(r.current=!0,e?.({...t?.contentData??{},openInBrowser:()=>{globalThis.window.open(n.url,`_blank`,`noopener,noreferrer`)}}))},[e,t,n.url]);let o=()=>{globalThis.window.open(n.url,`_blank`,`noopener,noreferrer`)},s=i.o(n.icon,{size:48,color:n.iconColor}),c=i.o(n.icon,{size:16,color:n.iconColor});return(0,M.jsx)(N.Center,{className:fr.container,children:(0,M.jsxs)(N.Stack,{align:`center`,gap:`md`,children:[s,(0,M.jsx)(N.Text,{size:`lg`,fw:500,children:n.title}),(0,M.jsxs)(N.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:[n.description??a,(0,M.jsx)(`br`,{}),`Click below to go to my `,n.title,` profile.`]}),(0,M.jsx)(N.Button,{leftSection:c,onClick:o,children:n.buttonLabel})]})})},mr=(e=0,t)=>{let[n,i]=(0,j.useState)(!1),[a,o]=(0,j.useState)({x:0,y:0});return{opened:n,position:a,open:(0,j.useCallback)((n,a)=>{if(n.preventDefault(),t&&!r.st.find(e=>e.id===t)?.hasContextMenu){n.stopPropagation();return}o({x:n.clientX,y:n.clientY+(a??e)}),i(!0)},[e,t]),close:(0,j.useCallback)(()=>i(!1),[])}};function hr({snapshotRef:t,getCurrentState:n,initialSnapshot:r,onChange:i,appId:a}){let[o,s]=(0,j.useState)(!1),c=(0,j.useRef)(i);return(0,j.useEffect)(()=>{c.current=i},[i]),(0,j.useEffect)(()=>{if(t.current===null){if(a){let n=e.r.getState().getSnapshot(a);if(n!==null){t.current=n;return}}r!==void 0&&(t.current=r)}},[t,r,a]),(0,j.useEffect)(()=>{let e=n();if(t.current===null)return;let r=JSON.stringify(e)!==JSON.stringify(t.current);s(r),c.current&&c.current(r)},[n,t]),{isDirty:o,takeSnapshot:(0,j.useCallback)(()=>{let r=n();t.current=r,s(!1),a&&e.r.getState().setSnapshot(a,r),c.current&&c.current(!1)},[t,n,a]),reset:(0,j.useCallback)(()=>{s(!1),c.current&&c.current(!1)},[])}}function gr(){return(0,j.useMemo)(()=>zn()?Rn():(console.warn(`[useFdeApi] API not initialized. Make sure initializeFdeApi() is called.`),null),[])}var _r={status:`idle`,loaded:0,total:null,percent:null,error:null},vr=()=>{let[e,t]=(0,j.useState)(_r),n=(0,j.useCallback)(()=>t(_r),[]),r=(0,j.useCallback)(async e=>{t({status:`downloading`,loaded:0,total:null,percent:null,error:null});try{let n=await fetch(e);if(!n.ok)return t(e=>({...e,status:`error`,error:`HTTP ${n.status}: ${n.statusText}`})),null;let r=n.headers.get(`Content-Length`),i=r?parseInt(r,10):null;if(!n.body){let e=await n.text();return t({status:`done`,loaded:e.length,total:e.length,percent:100,error:null}),e}let a=n.body.getReader(),o=[],s=0;for(;;){let{done:e,value:n}=await a.read();if(e)break;o.push(n),s+=n.byteLength;let r=i?Math.round(s/i*100):null;t({status:`downloading`,loaded:s,total:i,percent:r,error:null})}let c=new Uint8Array(s),l=0;for(let e of o)c.set(e,l),l+=e.byteLength;let u=new TextDecoder().decode(c);return t({status:`done`,loaded:s,total:i??s,percent:100,error:null}),u}catch(e){let n=e instanceof Error?e.message:`Unknown error`;return t(e=>({...e,status:`error`,error:n})),null}},[]);return{...e,download:r,reset:n}},yr={light:{mode:`light`,desktop:`#f0f4f8`,taskbar:`rgba(255, 255, 255, 0.9)`,window:`#ffffff`,accent:`#339af0`},dark:{mode:`dark`,desktop:`#1a1b1e`,taskbar:`rgba(26, 27, 30, 0.9)`,window:`#25262b`,accent:`#4dabf7`}},br=typeof __APP_VERSION__==`string`?__APP_VERSION__:`0.4.0`,xr=()=>`${br}-${typeof __PROD__==`boolean`&&__PROD__?`prod`:`dev`}-${typeof window<`u`&&window.__FDE_IN_DOCKER__?`docker`:`web`}`,Sr=()=>typeof __PROD__==`boolean`&&__PROD__?`prod`:`dev`,Cr=()=>typeof window>`u`?`web`:window.__FDE_IN_DOCKER__?`docker`:/Electron/i.test(navigator.userAgent)?`electron`:`web`,wr=e=>({primaryColor:`blue`,other:{desktop:e.desktop,taskbar:e.taskbar,window:e.window,accent:e.accent}});exports.ANIMATION_DURATION=n.n,exports.APPS=r.st,exports.APP_IDS=G,exports.APP_ID_TO_TRANSLATION_KEY=De,exports.APP_VERSION=br,exports.AVAILABLE_FONTS=t.d,exports.AppEmptyState=_.t,exports.AppIcon=s.t,exports.AppLoading=pt,exports.AppMenuBar=u.t,exports.AppReadyProvider=Kt,exports.BREAKPOINTS=r.p,exports.CORE_APPS=r.dt,exports.CORE_APP_IDS=r.ft,exports.CORE_REGISTRY=n.b,exports.CUSTOM_APPS_FOLDER_ID=r.z,exports.CalendarApp=h.t,exports.CalendarAppLazy=n.k,exports.CodeServerApp=cr,exports.CollapsibleSection=Ne,exports.ColorPicker=C.t,exports.ContextMenu=qn,exports.ContextMenuAnchor=Re,exports.CreateItemApp=A.t,exports.CreateItemAppLazy=n.A,exports.CreateItemContextMenu=Qt,exports.CustomAppLoader=Ut,exports.CustomAppLoadingScreen=mt,exports.CustomAppNotSupported=gt,exports.CustomAppOffline=ht,exports.DEFAULT_FDE_THEME=ae,exports.DEFAULT_LANGUAGE=t.a,exports.DEFAULT_LAUNCHER_FOLDERS=r.B,exports.DEFAULT_THEME_COLORS=yr,exports.DEFAULT_VIEWPORT_HEIGHT=r.s,exports.DEFAULT_VIEWPORT_WIDTH=r.c,exports.DEFAULT_WINDOW_DIMENSIONS=r.pt,exports.DESKTOP_APPS=Oe,exports.DESKTOP_APPS_ORDER=r.ct,exports.DefaultThemeProvider=t._,exports.Desktop=be,exports.DesktopIcon=Xt,exports.DeviceInfoApp=p.t,exports.DeviceInfoAppLazy=n.j,exports.DirtyIndicator=u.n,exports.DockerFileSystemAdapter=r.q,exports.DownloadProgress=x.t,exports.DragDropProvider=o.o,exports.DynamicMenuBarRenderer=Gn,exports.EASE_IN=n.r,exports.EASE_OUT=n.i,exports.ExternalLinkApp=pr,exports.FONT_STACKS=t.f,exports.FdeDesktop=Wn,exports.FdeProvider=pe,exports.FileIcon=f.n,exports.FilePickerApp=g.t,exports.FilePickerModal=g.n,exports.FilesApp=d.t,exports.FilesAppLazy=n.M,exports.FolderPicker=g.a,exports.GITHUB_LATEST_RELEASE_URL=on,exports.GITHUB_RELEASES_REPO=an,exports.GOOGLE_FONTS_HREF=t.p,exports.ICON_COLUMN_WIDTH=r.l,exports.ICON_MARGIN=r.u,exports.ICON_ROW_HEIGHT=r.d,exports.IMAGE_MIME_TYPES=r.y,exports.IconColorPicker=A.r,exports.ImageViewerApp=y.t,exports.ImageViewerAppLazy=n.N,exports.ImageViewerMenuBar=k.t,exports.ImageViewerMenuBarLazy=n.P,exports.IndexedDBFileSystem=r.Y,exports.LanguageFlag=t.m,exports.LanguageSelector=ut,exports.Launcher=Le,exports.MenuEditApp=o.t,exports.MenuEditAppLazy=n.F,exports.MenuEditMenuBar=E.t,exports.MenuEditMenuBarLazy=n.I,exports.NotesApp=e.t,exports.NotesAppLazy=n.L,exports.NotesMenuBar=T.t,exports.NotesMenuBarLazy=n.R,exports.PREDEFINED_LAUNCHER_FOLDERS=r.V,exports.PRESET_COLORS=v.t,exports.PRESET_ICONS=A.i,exports.PROFILE=t.r,exports.PdfApp=b.t,exports.PdfAppLazy=n.z,exports.PdfMenuBar=O.t,exports.PdfMenuBarLazy=n.B,Object.defineProperty(exports,`QueryClient`,{enumerable:!0,get:function(){return P.QueryClient}}),exports.SETTINGS_SECTIONS=t.u,exports.SUPPORTED_LANGUAGES=t.o,exports.SettingsApp=t.t,exports.SettingsAppLazy=n.V,exports.SettingsMenuBar=D.t,exports.SettingsMenuBarLazy=n.H,exports.SettingsSectionComponent=t.l,exports.SortOptions=r.C,exports.StorybookApp=Xn,exports.TASKBAR_HEIGHT=r.f,exports.TEXT_MIME_TYPES=r.b,exports.Taskbar=ft,exports.TaskbarContextMenu=He,exports.TerminalApp=ar,exports.TerminalMenuBar=dr,exports.ThemeProvider=oe,exports.UploaderApp=S.t,exports.UploaderAppLazy=n.U,exports.VscIcon=l.t,exports.Window=Jt,exports.WindowButtonRegistryProvider=ge,exports.WindowManagerAdapter=r.Q,exports.appendDirtyIndicator=w.t,exports.buildBreadcrumbs=f.t,exports.centerWindowPosition=n.a,exports.checkHMREndpointExists=jt,exports.clearBrowserData=t.i,exports.clearManifestCache=r.O,exports.convertToAppEntry=r.k,exports.createDesktopIcon=r.it,exports.createEaseIn=n.o,exports.createEaseOut=n.s,exports.createFile=r.$,exports.createFolder=r.et,exports.createLauncherFolder=r.tt,exports.createMaximizeTransition=n.c,exports.createMinimizeVariant=n.l,exports.createPanelVariants=n.u,exports.createPredefinedLauncherFolder=r.nt,exports.createRestoreVariant=n.d,exports.createWindow=r.at,exports.createWindowVariants=n.f,exports.fetchAppManifest=r.A,exports.fileSystem=r.n,exports.formatBytes=S.r,exports.generateUUID=r.ot,exports.getAppComponent=n.x,exports.getAppIdForMime=r.x,exports.getAppName=n.S,exports.getBaseUrl=r.m,exports.getCachedManifest=r.j,exports.getCloseInterceptor=c.t,exports.getCustomAppById=r.M,exports.getCustomApps=r.N,exports.getEnvironment=Sr,exports.getFdeApi=Rn,exports.getFileExtension=f.r,exports.getFourRandomColors=_.n,exports.getMenuBarBuilder=n.C,exports.getMenuBarComponent=n.w,exports.getMimeTypeFromExtension=r.Z,exports.getPersistedThemeMode=t.h,exports.getReleaseType=Cr,exports.getRuntime=r.H,exports.getVersionString=xr,exports.hashBlob=r.X,exports.i18n=ct,exports.initRegistry=n.E,exports.initializeFdeApi=Ln,exports.injectFontLink=t.c,exports.isBrowser=r.U,exports.isCustomApp=r.P,exports.isDev=r.W,exports.isDocker=r.G,exports.isElectron=r.K,exports.isFdeApiInitialized=zn,exports.isLazyApp=n.D,exports.isNewerVersion=rn,exports.maximizeTransition=n.p,exports.mergeAppsWithCustomApps=r.F,exports.migrateStorage=Tn,exports.minimizeVariant=n.m,exports.openVariants=n.h,exports.panelVariants=n.g,exports.prefetchApps=jn,exports.randomWindowPosition=n._,exports.registerAppFileHandler=r.S,exports.registerCloseInterceptor=c.n,exports.registerComponents=n.O,exports.registerCustomApps=r.lt,exports.registerDesktopApps=r.ut,exports.removeFromManifestCache=r.I,exports.resetBaseUrlCache=r.h,exports.resetFileSystem=r.r,exports.resetHMRState=Tt,exports.resetWindowManager=r.i,exports.resolveFileUrl=r.a,exports.resolveUrl=r.g,exports.restoreVariant=n.v,exports.setApiBaseUrl=r.J,exports.setTestBaseUrl=r._,exports.sortDesktopIcons=r.w,exports.sortDesktopIconsByMode=r.T,exports.sortNodes=r.E,exports.sortNodesByMode=r.D,exports.syncWithServer=r.L,exports.toMantineTheme=wr,exports.unregisterCloseInterceptor=c.r,exports.updateLauncherFolder=r.rt,exports.updateManifestCache=r.R,exports.useAdaptiveDimensions=a.t,exports.useAnimationDuration=Ee,exports.useAppName=ke,exports.useAppReady=Gt,exports.useAppTempMemoryStore=e.r,exports.useAppUpdate=un,exports.useApplyFont=hn,exports.useClock=Se,exports.useCloseInterceptor=c.i,exports.useCloseModalStore=c.a,exports.useCollapsible=je,exports.useContextMenu=mr,exports.useCustomAppHMR=Rt,exports.useCustomAppLifecycle=zt,exports.useCustomAppStore=r.v,exports.useDesktopStore=r.o,exports.useDeviceDetection=p.r,exports.useDownload=vr,exports.useDragDropState=o.r,exports.useDraggableItem=o.a,exports.useDroppableArea=o.i,exports.useDynamicIcon=i.t,exports.useDynamicIconElement=i.n,exports.useFcIcon=i.r,exports.useFcIconElement=i.i,exports.useFdeApi=gr,exports.useFdeContext=me,exports.useFiIcon=i.a,exports.useFiIconElement=i.o,exports.useFolderName=o.s,exports.useFontDownload=t.s,exports.useIsDirty=hr,exports.useLanguageSync=gn,exports.useNotifications=d.r,exports.useOpenApp=n.t,exports.useResolvedUrl=m.t,exports.useSearchFilter=Ae,exports.useSettingsStore=t.g,exports.useSystemTheme=nn,exports.useTaskbarContextMenu=Te,exports.useTaskbarHeight=ze,exports.useTheme=se,exports.useThemeContext=ce,exports.useVscIcon=i.s,exports.useVscIconElement=i.c,exports.useWindowButtonRegistry=_e,Object.defineProperty(exports,`uuidv4`,{enumerable:!0,get:function(){return ne.v4}}),exports.waitForContainer=Bt,exports.windowVariants=n.y;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./AppTempMemory-DAC62jiS.cjs`),t=require(`./i18nConstants-DgbKSBIK.cjs`),n=require(`./useResolvedUrl-Dz2AhrDV.cjs`),r=require(`./useOpenApp-BBZ_B7Pr.cjs`),i=require(`./desktopStore-LSQweOqZ.cjs`),a=require(`./useDynamicIcon-Cg3B_Aeq.cjs`),o=require(`./useAdaptiveDimensions-BDZxP4E3.cjs`),s=require(`./useDragDrop-Bdwzk6VO.cjs`),c=require(`./AppIcon-Czrtau6A.cjs`),l=require(`./useCloseInterceptor-AzfjUZgz.cjs`),u=require(`./VscIcon-CeELixwP.cjs`),d=require(`./AppMenuBar-38QtFTPk.cjs`),f=require(`./useNotifications-rwLmJ7fI.cjs`),p=require(`./buildBreadcrumbs-C2c2a4R3.cjs`),m=require(`./useDeviceDetection-CnxnQWIq.cjs`),h=require(`./AppEmptyState-Z8_Cviti.cjs`),g=require(`./Colors-PNt4eyR6.cjs`),_=require(`./ColorPicker-BZqsPh3X.cjs`),v=require(`./DownloadProgress-CpJguS8g.cjs`),y=require(`./FilePickerApp-ClmPw6lk.cjs`),b=require(`./IconColorPicker-7rWNAiNQ.cjs`),x=require(`./useMenuBarUtils-BOnQYtKU.cjs`),S=require(`./formatBytes-Bv1bQPKQ.cjs`);require(`@mantine/core/styles.css`),require(`@mantine/dates/styles.css`);let C=require(`react`);C=e.n(C);let w=require(`react/jsx-runtime`),T=require(`@mantine/core`),E=require(`@tanstack/react-query`),D=require(`zustand`),O=require(`framer-motion`),k=require(`react-i18next`),A=require(`i18next`);A=e.n(A);let j=require(`i18next-browser-languagedetector`);j=e.n(j);let M=require(`react-rnd`),N=require(`zustand/react/shallow`),P=require(`react-icons/fc`),F=require(`@xterm/xterm`),I=require(`@xterm/addon-fit`),L=require(`@xterm/addon-clipboard`);require(`@xterm/xterm/css/xterm.css`);let R=require(`uuid`);var z=(0,C.createContext)(void 0),ee={borderRadius:`8px`,headerHeight:40,minWidth:400,minHeight:300,defaultWidth:800,defaultHeight:600,shadow:`0 8px 32px rgba(0, 0, 0, 0.2)`},B={height:48,position:`bottom`,background:`rgba(0, 0, 0, 0.8)`,blur:!0},V={light:{mode:`light`,colors:{desktop:`#f0f4f8`,taskbar:`rgba(255, 255, 255, 0.9)`,window:`#ffffff`,accent:`#339af0`},window:ee,taskbar:B,desktop:{background:`linear-gradient(135deg, #667eea 0%, #764ba2 100%)`,iconSize:64,iconSpacing:16}},dark:{mode:`dark`,colors:{desktop:`#1a1b1e`,taskbar:`rgba(26, 27, 30, 0.9)`,window:`#25262b`,accent:`#4dabf7`},window:ee,taskbar:B,desktop:{background:`linear-gradient(135deg, #1a1b1e 0%, #2d1f3d 100%)`,iconSize:64,iconSpacing:16}}};function H({children:e,initialMode:t=`light`,mode:n,theme:r}){let[i,a]=(0,C.useState)(t),o=(0,C.useRef)(null),s=n??i,c=(0,C.useCallback)(()=>{a(e=>e===`light`?`dark`:`light`)},[]),l=(0,C.useCallback)(e=>{a(e)},[]),u=(0,C.useCallback)(e=>{o.current=e},[]),d=(0,C.useCallback)(()=>{let e=V[s],t=o.current;return t?{...e,colors:{desktop:r?.colors?.desktop??e.colors.desktop,taskbar:t.taskbar,window:t.window,accent:t.accent},window:{...e.window,...r?.window},taskbar:{...e.taskbar,...r?.taskbar},desktop:{...e.desktop,...r?.desktop}}:r?{mode:r.mode??e.mode,colors:{desktop:r.colors?.desktop??e.colors.desktop,taskbar:r.colors?.taskbar??e.colors.taskbar,window:r.colors?.window??e.colors.window,accent:r.colors?.accent??e.colors.accent},window:{...e.window,...r.window},taskbar:{...e.taskbar,...r.taskbar},desktop:{...e.desktop,...r.desktop}}:e},[s,r]);(0,C.useEffect)(()=>{document.documentElement.style.setProperty(`color-scheme`,s),document.documentElement.setAttribute(`data-mantine-color-scheme`,s)},[s]);let f=(0,C.useMemo)(()=>({getTheme:d,setMode:l,toggle:c,setCustomColors:u}),[d,l,c,u]);return(0,w.jsx)(z.Provider,{value:f,children:e})}function U(){let e=(0,C.useContext)(z);if(!e)throw Error(`useTheme must be used within a ThemeProvider`);return e.getTheme()}function te(){let e=(0,C.useContext)(z);if(!e)throw Error(`useThemeContext must be used within a ThemeProvider`);return e}var ne={primaryColor:`blue`,other:{desktop:{backgroundColor:`#1a1a2e`},taskbar:{backgroundColor:`#16213e`,textColor:`#ffffff`},window:{backgroundColor:`#0f0f23`,textColor:`#ffffff`,borderRadius:`8px`},accent:`#339af0`}},W=(0,C.createContext)(void 0),re=new E.QueryClient({defaultOptions:{queries:{staleTime:1/0,gcTime:1/0}}});function ie({children:e,fileSystem:n,isReady:r,error:i}){let a=U(),o=t._(e=>e.setThemeMode),s=t._(e=>e.toggleTheme),c=(0,C.useMemo)(()=>({fs:r?n:null,isReady:r,error:i,theme:a,setThemeMode:o,toggleTheme:s}),[n,r,i,a,o,s]);return(0,w.jsx)(W.Provider,{value:c,children:e})}function ae({children:e,fileSystem:n,initialMode:r,theme:i,mantineTheme:a,fallback:o=null,onError:s,queryClient:c=re}){let[l,u]=(0,C.useState)(!1),[d,f]=(0,C.useState)(null),p=t._(e=>e.theme.mode),m=t._(e=>e.setThemeMode);(0,C.useEffect)(()=>{r&&m(r)},[]),(0,C.useEffect)(()=>{let e=!0;return(async()=>{try{await n.initialize(),e&&u(!0)}catch(t){let n=t instanceof Error?t:Error(String(t));e&&(f(n),s?.(n))}})(),()=>{e=!1}},[n,s]);let h=(0,C.useMemo)(()=>(0,T.createTheme)({...ne,...a}),[a]);return d||!l?(0,w.jsx)(w.Fragment,{children:o}):(0,w.jsx)(E.QueryClientProvider,{client:c,children:(0,w.jsx)(T.MantineProvider,{theme:h,forceColorScheme:p,children:(0,w.jsx)(H,{mode:p,theme:i,children:(0,w.jsx)(ie,{fileSystem:n,isReady:l,error:d,children:e})})})})}function oe(){let e=(0,C.useContext)(W);if(!e)throw Error(`useFdeContext must be used within an FdeProvider`);return e}var se=(0,C.createContext)(null),ce=({children:e})=>{let t=(0,C.useRef)(new Map);return(0,w.jsx)(se.Provider,{value:{register:(e,n)=>{t.current.set(e,n)},unregister:e=>{t.current.delete(e)},getRect:e=>t.current.get(e)},children:e})},le=()=>{let e=(0,C.useContext)(se);if(!e)throw Error(`useWindowButtonRegistry must be used within WindowButtonRegistryProvider`);return e},ue={root:`_root_hze7e_1`,background:`_background_hze7e_10`,noiseOverlay:`_noiseOverlay_hze7e_19`},de=({children:e,onContextMenu:n,wallpaper:r,wallpaperModule:a,backgroundColor:o})=>{let s=i.o(e=>e.setViewportSize),c=(0,C.useRef)(null),l=t._(e=>e.wallpaperHasNoise),u=t._(e=>e.wallpaperNoiseOpacity),{backgroundImage:d,noiseImageUrl:f}=(0,C.useMemo)(()=>{if(a===`gradient`){let e=r??``,t=e.match(/url\(data:image\/png;base64,[^)]+\)/);return{backgroundImage:e,noiseImageUrl:t?t[0].replace(/url\((.*)\)/,`$1`):``}}return{backgroundImage:r?`url(${r})`:``,noiseImageUrl:``}},[r,a]),p=u/100;(0,C.useEffect)(()=>{let e=c.current;if(!e)return;let t=new ResizeObserver(e=>{let{width:t,height:n}=e[0]?.contentRect??{};t&&t>0&&n&&n>0&&s(t,n)});return t.observe(e),()=>t.disconnect()},[s]);let m={"--taskbar-height":`48px`,"--noise-tile-size":`128px`};return(0,w.jsxs)(`div`,{ref:c,className:ue.root,"data-testid":`desktop-area`,style:m,onContextMenu:n,children:[(0,w.jsx)(`div`,{className:ue.background,style:{backgroundImage:d,backgroundSize:`cover`,backgroundPosition:`center`,backgroundColor:o??`transparent`}}),l&&f&&(0,w.jsx)(`div`,{className:ue.noiseOverlay,style:{backgroundImage:`url(${f})`,opacity:p}}),e]})},fe=e=>e.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}),pe=()=>{let[e,t]=(0,C.useState)(()=>fe(new Date));return(0,C.useEffect)(()=>{let e=setInterval(()=>t(fe(new Date)),1e3);return()=>clearInterval(e)},[]),e},me=-8,he=0,ge=()=>{let[e,t]=(0,C.useState)({activeMenu:null,position:{x:0,y:0},targetWindowId:null}),n=(0,C.useCallback)((e,n)=>{e.preventDefault(),e.stopPropagation(),t({activeMenu:`window`,position:{x:e.clientX,y:e.clientY+me},targetWindowId:n})},[]),r=(0,C.useCallback)(e=>{e.preventDefault(),t({activeMenu:`panel`,position:{x:e.clientX,y:e.clientY+me},targetWindowId:null})},[]),i=(0,C.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),t({activeMenu:`launcher`,position:{x:e.clientX,y:e.clientY+he},targetWindowId:null})},[]),a=(0,C.useCallback)(()=>{t(e=>({...e,activeMenu:null}))},[]);return{activeMenu:e.activeMenu,position:e.position,targetWindowId:e.targetWindowId,windowMenuOpened:e.activeMenu===`window`,panelMenuOpened:e.activeMenu===`panel`,launcherMenuOpened:e.activeMenu===`launcher`,openWindowMenu:n,openPanelMenu:r,openLauncherMenu:i,closeMenu:a}},_e=()=>{let e=t._(e=>e.animationDuration);return{duration:e,windowVariants:r.f(e),panelVariants:r.u(e),minimizeVariant:r.l(.3),restoreVariant:r.d(.3),maximizeTransition:r.c(.25),easeIn:r.o(e),easeOut:r.s(e)}},G={WELCOME:`welcome`,NOTEPAD:`notepad`,UPLOADER:`uploader`,FILES:`files`,SETTINGS:`settings`,PDF:`pdf`,CALENDAR:`calendar`,STORYBOOK:`storybook`,LINKEDIN:`linkedin`,GITHUB:`github`,IMAGE_VIEWER:`image-viewer`,DOS_EMULATOR:`dos-emulator`,DOOM:`doom`,TERMINAL:`terminal`,CODE_SERVER:`code-server`,DEVICE_INFO:`device-info`,MENUEDIT:`menuedit`},ve={[G.FILES]:`filesApp`,[G.PDF]:`pdfViewer`,[G.IMAGE_VIEWER]:`imageViewer`,[G.DOS_EMULATOR]:`dosEmulator`,[G.CODE_SERVER]:`codeServer`,[G.DEVICE_INFO]:`deviceInfo`},ye=[G.WELCOME,G.UPLOADER,G.TERMINAL,G.CODE_SERVER,G.STORYBOOK,G.SETTINGS,G.NOTEPAD,G.LINKEDIN,G.GITHUB,G.FILES,G.DOOM];function be(e){let{t}=(0,k.useTranslation)(`apps`);return e?t(`names.${ve[e]??e}`,e):``}function xe(e,t,n){return(0,C.useMemo)(()=>{if(!t.trim())return e;let r=t.toLowerCase().trim();return e.filter(e=>{let t=n(e);return Array.isArray(t)?t.some(e=>e.toLowerCase().includes(r)):t.toLowerCase().includes(r)})},[e,t,n])}function Se(e){let[t,n]=(0,C.useState)(e??new Set);return{expanded:t,toggle:(0,C.useCallback)(e=>{n(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),expand:(0,C.useCallback)(e=>{n(t=>{let n=new Set(t);return n.add(e),n})},[]),collapse:(0,C.useCallback)(e=>{n(t=>{let n=new Set(t);return n.delete(e),n})},[]),expandAll:(0,C.useCallback)(e=>{n(new Set(e))},[]),collapseAll:(0,C.useCallback)(()=>{n(new Set)},[]),reset:(0,C.useCallback)(()=>{n(new Set)},[]),isExpanded:(0,C.useCallback)(e=>t.has(e),[t])}}var Ce={header:`_header_2d0oy_1`,iconContainer:`_iconContainer_2d0oy_20`,expandIcon:`_expandIcon_2d0oy_28`,icon:`_icon_2d0oy_20`,title:`_title_2d0oy_42`,content:`_content_2d0oy_48`},we=({title:e,fcIcon:t=`FcFolder`,expanded:n,onToggle:r,children:i,className:o,"aria-label":s})=>{let l=a.c(n?`VscRemove`:`VscAdd`,{size:14,className:Ce.expandIcon});return(0,w.jsxs)(`div`,{className:o,children:[(0,w.jsxs)(T.UnstyledButton,{className:Ce.header,onClick:r,"aria-expanded":n,"aria-label":s??e,children:[(0,w.jsx)(`span`,{className:Ce.iconContainer,children:l}),(0,w.jsx)(`span`,{className:Ce.icon,children:(0,w.jsx)(c.t,{fcIcon:t,size:16})}),(0,w.jsx)(T.Text,{size:`sm`,fw:500,className:Ce.title,children:e})]}),n&&(0,w.jsx)(`div`,{className:Ce.content,children:i})]})},K={trigger:`_trigger_4gumo_1`,panel:`_panel_4gumo_23`,searchContainer:`_searchContainer_4gumo_39`,searchInput:`_searchInput_4gumo_43`,scrollContainer:`_scrollContainer_4gumo_47`,appsSection:`_appsSection_4gumo_56`,appButton:`_appButton_4gumo_62`,appIcon:`_appIcon_4gumo_82`};function Te(e){let t=e.icon,n=`fcIcon`in e?e.fcIcon:void 0,r=t?.startsWith(`Fc`)||t?.startsWith(`Fi`)||t?.startsWith(`Vsc`);return{id:e.id,name:e.name,fcIcon:n??(r?t:void 0),icon:r?void 0:t,iconUrl:`iconUrl`in e?e.iconUrl:void 0,iconColor:`iconColor`in e?e.iconColor:void 0}}var Ee=({app:e,onOpen:t})=>{let n=be(e.id);return(0,w.jsxs)(`button`,{className:K.appButton,onClick:()=>t(e.id),role:`menuitem`,"aria-label":n,children:[(0,w.jsx)(`span`,{className:K.appIcon,children:(0,w.jsx)(c.t,{fcIcon:e.fcIcon,iconUrl:e.iconUrl,fallback:e.icon,color:e.iconColor})}),(0,w.jsx)(T.Text,{size:`sm`,children:n})]},e.id)},De=({folder:e,isExpanded:t,apps:n,onToggle:r,onOpen:i})=>(0,w.jsx)(we,{title:s.s(e),fcIcon:e.fcIcon,expanded:t,onToggle:r,children:n.map(e=>(0,w.jsx)(Ee,{app:e,onOpen:i},e.id))},e.id),Oe=({fcIcon:e=`FcDebian`,onContextMenu:n})=>{let o=a.i(e,{size:22,style:{display:`block`}}),[s,c]=(0,C.useState)(!1),[l,u]=(0,C.useState)(``),d=r.t(),f=t._(e=>e.theme.colors.taskbar),p=i.o(e=>e.launcherFolders),m=i.o(e=>e.customApps),{panelVariants:h}=_e(),g=(0,C.useRef)(null),_=(0,C.useRef)(null),{expanded:v,toggle:y,reset:b}=Se(new Set),x=(0,C.useMemo)(()=>[...i.st].sort((e,t)=>e.name.localeCompare(t.name)),[]),S=(0,C.useMemo)(()=>new Set(p.flatMap(e=>e.appIds)),[p]),E=xe((0,C.useMemo)(()=>x.filter(e=>!S.has(e.id)),[x,S]),l,e=>[e.id,e.name]),D=(0,C.useMemo)(()=>{let e=p.map(e=>({...e,appIds:e.appIds.filter(t=>{if(e.id===`launcher-folder-custom-apps`)return!0;let n=x.some(e=>e.id===t),r=m.some(e=>e.id===t);return n||r})})).filter(e=>e.id===`launcher-folder-custom-apps`?m.length>0:e.appIds.length>0);if(!l.trim())return[...e].sort((e,t)=>e.isPredefined===t.isPredefined?e.name.localeCompare(t.name):e.isPredefined?-1:1);let t=l.toLowerCase();return e.map(e=>({...e,appIds:e.appIds.filter(e=>{let n=x.find(t=>t.id===e)??m.find(t=>t.id===e);return n&&(n.id.toLowerCase().includes(t)||n.name.toLowerCase().includes(t))})})).filter(e=>e.appIds.length>0).sort((e,t)=>e.isPredefined===t.isPredefined?e.name.localeCompare(t.name):e.isPredefined?-1:1)},[p,l,x,m]),k=(0,C.useMemo)(()=>{if(!l.trim())return m;let e=l.toLowerCase();return m.filter(t=>t.id.toLowerCase().includes(e)||t.name.toLowerCase().includes(e))},[m,l]);(0,C.useEffect)(()=>{l.trim()&&s&&(D.map(e=>e.id).forEach(e=>{v.has(e)||y(e)}),k.length>0&&!v.has(`launcher-folder-custom-apps`)&&y(i.z))},[l,D,k,s,v,y]),(0,C.useEffect)(()=>{s||b()},[s,b]),(0,C.useEffect)(()=>{if(!s)return;let e=e=>{g.current&&!g.current.contains(e.target)&&(c(!1),u(``))},t=e=>{e.key===`Escape`&&(c(!1),u(``))};return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[s]);let A=e=>{if(e.preventDefault(),e.stopPropagation(),s){c(!1),u(``);return}n?.(e)};(0,C.useEffect)(()=>{s&&_.current&&_.current.focus()},[s]);let j=(0,C.useCallback)(e=>{d(e),c(!1),u(``)},[d]),M=(0,C.useCallback)(e=>{y(e)},[y]),N=a.i(`FcSearch`,{size:16}),P=(0,C.useCallback)(()=>{s?(c(!1),u(``)):c(!0)},[s]);return(0,w.jsxs)(`div`,{ref:g,children:[(0,w.jsx)(`button`,{className:K.trigger,onClick:P,onContextMenu:A,"aria-label":`Launcher`,"aria-expanded":s,children:o}),(0,w.jsx)(O.AnimatePresence,{children:s&&(0,w.jsxs)(O.motion.div,{className:K.panel,style:{background:f},role:`menu`,"aria-label":`App launcher`,initial:h.initial,animate:h.animate,exit:h.exit,children:[(0,w.jsx)(`div`,{className:K.searchContainer,children:(0,w.jsx)(T.TextInput,{ref:_,placeholder:`Search apps...`,value:l,onChange:e=>u(e.target.value),leftSection:N,size:`xs`,classNames:{input:K.searchInput},"aria-label":`Search apps`})}),(0,w.jsxs)(`div`,{className:K.scrollContainer,children:[D.map(e=>{let t=v.has(e.id);return e.id===`launcher-folder-custom-apps`?k.length===0?null:(0,w.jsx)(De,{folder:e,isExpanded:t,apps:k.map(Te),onToggle:()=>M(e.id),onOpen:j},e.id):(0,w.jsx)(De,{folder:e,isExpanded:t,apps:e.appIds.map(e=>x.find(t=>t.id===e)).filter(e=>e!==void 0).sort((e,t)=>e.name.localeCompare(t.name)).map(Te),onToggle:()=>M(e.id),onOpen:j},e.id)}),E.length>0&&(0,w.jsx)(`div`,{className:K.appsSection,children:E.map(e=>(0,w.jsx)(Ee,{app:Te(e),onOpen:j},e.id))}),l&&E.length===0&&D.length===0&&k.length===0&&(0,w.jsx)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,mt:`md`,children:`No apps found`})]})]})})]})},ke=({x:e,y:t})=>(0,w.jsx)(T.Menu.Target,{children:(0,w.jsx)(`div`,{"aria-hidden":`true`,style:{position:`fixed`,left:e,top:t,width:0,height:0,pointerEvents:`none`}})}),Ae=e=>{let t=(0,C.useRef)(null),[n,r]=(0,C.useState)(0);return(0,C.useLayoutEffect)(()=>{if(t.current&&e){let e=t.current.offsetHeight;r(e)}},[e]),{menuRef:t,menuHeight:n}},je={menuItem:`_menuItem_18vno_1`},Me=8,Ne=({windowMenuOpened:e,panelMenuOpened:t,launcherMenuOpened:n,menuPosition:o,targetWindowId:s,targetWindowState:c,onCloseWindow:l,onMinimizeWindow:u,onMaximizeWindow:d,onRestoreWindow:f,onClose:p})=>{let{t:m}=(0,k.useTranslation)(`contextMenu`),h={size:14,style:{display:`block`}},g=()=>a.i(`FcCancel`,h),_=()=>a.i(`FcMinus`,h),v=()=>a.i(`FcTemplate`,h),y=()=>a.i(`FcUndo`,h),b=()=>a.i(`FcSettings`,h),x=()=>a.i(`FcFolder`,h),S=r.t(),E=be(`menuedit`),D=i.o(e=>e.openWindow),O=c===`minimized`,A=c===`maximized`,{menuRef:j,menuHeight:M}=Ae(e),{menuRef:N,menuHeight:P}=Ae(t),{menuRef:F,menuHeight:I}=Ae(n),[L,R]=(0,C.useState)(!1),[z,ee]=(0,C.useState)(!1),[B,V]=(0,C.useState)(!1);(0,C.useLayoutEffect)(()=>{e||R(!1),e&&M>0&&R(!0)},[e,M]),(0,C.useLayoutEffect)(()=>{t||ee(!1),t&&P>0&&ee(!0)},[t,P]),(0,C.useLayoutEffect)(()=>{n||V(!1),n&&I>0&&V(!0)},[n,I]);let H=(0,C.useMemo)(()=>e?{height:M,ready:L}:t?{height:P,ready:z}:n?{height:I,ready:B}:{height:0,ready:!1},[e,t,n,M,P,I,L,z,B]),U=(0,C.useMemo)(()=>{let{x:e,y:t}=o,{height:n,ready:r}=H,i=t-Me;return r&&n>0&&t>window.innerHeight-48-n-Me&&(i=t-n+Me),{x:e,y:i}},[o,H]),te=()=>{p(),D({title:E,content:`menuedit`,fcIcon:`FcFolder`,x:Math.min(o.x+10,window.innerWidth-800),y:Math.min(o.y+10,window.innerHeight-600),width:700,height:500,minWidth:500,minHeight:400})},ne=()=>{p(),S(`settings`)},W=e=>({opacity:e?1:0,transition:`opacity 0.05s ease`,zIndex:99999});return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(T.Menu,{opened:e,onClose:p,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,children:[(0,w.jsx)(ke,{x:U.x,y:U.y}),(0,w.jsxs)(T.Menu.Dropdown,{ref:j,style:W(L),children:[!O&&(0,w.jsx)(T.Menu.Item,{onClick:()=>{s&&u(s)},children:(0,w.jsxs)(`div`,{className:je.menuItem,children:[(0,w.jsx)(_,{}),` `,m(`window.minimize`)]})}),O||A?(0,w.jsx)(T.Menu.Item,{onClick:()=>{s&&f(s)},children:(0,w.jsxs)(`div`,{className:je.menuItem,children:[(0,w.jsx)(y,{}),` `,m(`window.restore`)]})}):(0,w.jsx)(T.Menu.Item,{onClick:()=>{s&&d(s)},children:(0,w.jsxs)(`div`,{className:je.menuItem,children:[(0,w.jsx)(v,{}),` `,m(`window.maximize`)]})}),(0,w.jsx)(T.Menu.Divider,{}),(0,w.jsx)(T.Menu.Item,{onClick:()=>{s&&l(s)},children:(0,w.jsxs)(`div`,{className:je.menuItem,children:[(0,w.jsx)(g,{}),` `,m(`window.close`)]})})]})]}),(0,w.jsxs)(T.Menu,{opened:t,onClose:p,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,children:[(0,w.jsx)(ke,{x:U.x,y:U.y}),(0,w.jsx)(T.Menu.Dropdown,{ref:N,style:W(z),children:(0,w.jsx)(T.Menu.Item,{onClick:()=>{S(`settings`)},children:(0,w.jsxs)(`div`,{className:je.menuItem,children:[(0,w.jsx)(b,{}),` `,m(`apps:names.settings`)]})})})]}),(0,w.jsxs)(T.Menu,{opened:n,onClose:p,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,children:[(0,w.jsx)(ke,{x:U.x,y:U.y}),(0,w.jsxs)(T.Menu.Dropdown,{ref:F,style:W(B),children:[(0,w.jsx)(T.Menu.Label,{children:m(`launcher.title`)}),(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(x,{}),onClick:te,children:m(`launcher.editLauncher`)}),(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(b,{}),onClick:ne,children:m(`apps:names.settings`)})]})]})]})},Pe={actions:{save:`Save`,saveAs:`Save As`,cancel:`Cancel`,ok:`OK`,open:`Open`,close:`Close`,delete:`Delete`,create:`Create`,new:`New`,exit:`Exit`,apply:`Apply`,discard:`Discard`,reset:`Reset`,download:`Download`,upload:`Upload`,copy:`Copy`,cut:`Cut`,paste:`Paste`,undo:`Undo`,redo:`Redo`,createFolder:`Create folder`,createFile:`Create new file`,select:`Select`},buttons:{minimize:`Minimize`,maximize:`Maximize`,restore:`Restore`,close:`Close`,yes:`Yes`,no:`No`,confirm:`Confirm`,continue:`Continue`},labels:{name:`Name`,title:`Title`,filename:`Filename`,url:`URL`,file:`File`,folder:`Folder`,home:`Home`,type:`Type`,loading:`Loading...`,search:`Search`,searchIcons:`Search icons...`,unsavedChanges:`Unsaved Changes`,unsaved:`Unsaved changes`,workInProgress:`Work In Progress`},messages:{areYouSure:`Are you sure?`,cannotBeUndone:`This action cannot be undone.`,noFileSelected:`No file selected`,folderEmpty:`This folder is empty`,noMatchingFiles:`No matching files`,noSubfolders:`No subfolders`,replaceFile:`Replace file?`,replaceFileMessage:`A file named "{{name}}" already exists. Do you want to replace it?`,yesReplace:`Yes, replace`,forBetterExperience:`For a better experience use this app desktop OR horizontal mode`,turnYourDevice:`Turn your device`,continueVertically:`Continue vertically?`},theme:{light:`Light`,dark:`Dark`,system:`System`,custom:`Custom`,switchToLight:`Switch to light mode`,switchToDark:`Switch to dark mode`},status:{error:`error`,success:`success`},menu:{file:`File`,edit:`Edit`,view:`View`},filePicker:{folderTreeAria:`Folder tree`,filesAria:`Files`,foldersAria:`Folders`,cancelAria:`Cancel`,openSelectedAria:`Open selected file`,fileNameAria:`File name`},externalLink:{securityMessage:`blocks embedding in iframes for security reasons.`,goToProfile:`Click below to go to my {{name}} profile.`},taskbar:{ariaLabel:`Taskbar`},launcher:{label:`Launcher`,ariaLabel:`App launcher`,selectedIcon:`Selected: {{icon}}`}},Fe={names:{notepad:`Notepad`,terminal:`Terminal`,filesApp:`Files`,files:`Files`,uploader:`Uploader`,settings:`Settings`,pdfViewer:`PDF Viewer`,calendar:`Calendar`,storybook:`Storybook`,linkedin:`LinkedIn`,github:`GitHub`,imageViewer:`Image Viewer`,dosEmulator:`DOS Emulator`,doom:`DOOM`,deviceInfo:`Device Info`,welcome:`Welcome`,menuedit:`Edit Launcher`,codeServer:`VS Code`},folders:{socialLinks:`Social Links`,office:`Office and media`,programming:`Programming`,games:`Games`,customApps:`Custom Apps`},descriptions:{notepad:`Markdown editor with rich text toolbar`,terminal:`Terminal emulator`,filesApp:`File explorer`,settings:`System settings`,pdfViewer:`PDF document viewer`,calendar:`Calendar view`,storybook:`Storybook playground`,linkedin:`LinkedIn profile link`,github:`GitHub profile link`,imageViewer:`Image viewer with file picker`,dosEmulator:`DOS game and program emulator`,doom:`Play the classic DOOM game`},launcher:{label:`Launcher`,ariaLabel:`App launcher`},imageViewer:{noImage:`No image to display. Please open one.`,fitToWindow:`Fit to window`,zoom:`Zoom`},pdf:{viewer:`PDF viewer`},dosEmulator:{noBundle:`No DOS program loaded. Open a .jsdos bundle to start.`,loading:`Loading DOS emulator...`,controls:{pause:`Pause`,resume:`Resume`,restart:`Restart`,mute:`Mute`,unmute:`Unmute`,fullscreen:`Fullscreen`},menu:{file:`File`,open:`Open Bundle`,restart:`Restart`,exit:`Exit`,emulation:`Emulation`,pause:`Pause`,resume:`Resume`,audio:`Audio`,mute:`Mute`,unmute:`Unmute`,volume:`Volume`},errors:{failedToLoad:`Failed to load DOS bundle`,notSupported:`DOS emulation is not supported in this browser`}},uploader:{clickToUpload:`Click here to upload`,selectDestination:`Select destination folder`,fileInfo:`File: {{name}} ({{size}})`,uploading:`Uploading...`,uploadProgress:`Upload progress`,uploadComplete:`Upload complete!`,uploadFailed:`Upload wasn't successful for the following reason`,readyToUpload:`Ready to upload`,showFile:`Show in Files`,openFile:`Open file`,upload:`Upload`,stepSelect:`Select`,stepDestination:`Destination`,stepUpload:`Upload`,stepDone:`Done`,folderSelected:`Folder selected`,uploadTo:`Destination`,uploadToRoot:`Uploading to root folder`},terminal:{notAvailable:`Terminal Not Available`,notAvailableMessage:`The terminal cannot be used because this environment does not currently allow terminal access.`,dockerRequired:`Please run in Docker mode to use the terminal.`,offlineTitle:`Terminal Unavailable`,offlineMessage:`The terminal requires a Docker environment to function. It connects directly to the container's shell.`,offlineInstructions:`To use the terminal, run the application in Docker mode:`,dockerCommand:`docker compose up dev`,openWelcome:`Open Welcome App`,connecting:`Connecting...`,connected:`Connected`,disconnected:`Disconnected`,connectionError:`Connection error`,menu:{edit:`Edit`,copy:`Copy`,paste:`Paste`,clear:`Clear`,reset:`Reset`,reconnect:`Reconnect`,exit:`Exit`},scrollback:`Lines`,shell:`Shell`},codeServer:{notAvailable:`VS Code Not Available`,notAvailableMessage:`VS Code (code-server) cannot be used in browser mode.`,dockerRequired:`Please run in Docker to use VS Code.`}},Ie={sections:{wallpaper:{label:`Wallpaper`,description:`Change the desktop background image.`},appearance:{label:`Appearance`,description:`Switch between light and dark mode.`},launcher:{label:`Launcher`,description:`Choose the launcher button icon.`},font:{label:`Font`,description:`Select the system font family.`},reset:{label:`Reset to Default`,description:`Reset all settings and data to defaults.`},language:{label:`Language`,description:`Choose your preferred language.`}},wallpaper:{title:`Wallpaper`,wallpaperType:`Wallpaper Type`,staticImage:`Static Image`,gradient:`Gradient`,gradientType:`Gradient Type`,gradientPreset:`Preset`,gradientPosition:`Position {index}`,addColor:`Add color`,removeColor:`Remove`,linear:`Linear`,radial:`Radial`,conic:`Conic`,angle:`Angle`,chooseFromImages:`Choose from Images`,uploadFromDisk:`Upload from disk`,resetToDefault:`Reset to default`,orEnterUrl:`Or enter a URL`,wallpaperPreview:`Wallpaper preview`,gradientPreview:`Gradient preview`,addNoise:`Add noise texture`,noiseOpacity:`Noise opacity`},appearance:{title:`Appearance`,description:`Choose whether the desktop uses a light or dark theme, or follows the system preference.`,taskbar:`Taskbar`,window:`Window`,accent:`Accent`,animationDuration:`Animation Duration`,animationDescription:`Controls the speed of window open/close animations (0.1s - 1.0s) must save to see changes.`},font:{title:`Font`,description:`Changes the font across the entire desktop interface. Fonts must be downloaded before use.`,download:`Download`,fontSize:`Font Size`,downloadByName:`Download a font by name`,fromGoogleFonts:`(From Google Fonts)`,downloadError:`Font didn't download successfully. Try again with the correct name`,downloadSuccess:`Downloaded successfully.`,systemDefault:`System Default`},reset:{title:`Reset to Default`,description:`Reset all settings and data to their default values. This action cannot be undone.`,resetButton:`⚠️ Reset app to defaults?`,modalTitle:`Are you sure?`,modalDescription:`This will erase all your data and settings.`,goBack:`Please go back! 🙏`,burnEverything:`Yes, burn everything! 🔥`,keepFiles:`Yes, but keep my files`},language:{title:`Language`,description:`Select your preferred language for the desktop interface.`,selectPlaceholder:`Select language`,english:`English`,spanish:`Español`},all:`All Settings`},Le={window:{title:`Window`,minimize:`Minimize`,maximize:`Maximize`,restore:`Restore`,close:`Close`,ariaLabels:{minimize:`Minimize`,maximize:`Maximize`,restore:`Restore`,close:`Close`}},unsavedModal:{title:`Unsaved Changes`,message:`You have unsaved changes. What would you like to do?`,dontSave:`Don't Save`,save:`Save`},fileDialog:{openFile:`Open file`,saveFile:`Save file`,selectFile:`Select file {{name}}`,openFolder:`Open folder {{name}}`,selectFolder:`Select folder`,filename:`filename.md`}},Re={window:{minimize:`Minimize`,restore:`Restore`,maximize:`Maximize`,close:`Close window`},actions:{cut:`Cut`,copy:`Copy`,paste:`Paste`,pasteItems:`Paste ({{count}} items)`,delete:`Delete`,createFolder:`Create folder`,createFile:`Create new file`},createItem:{folderTitle:`Create Folder`,fileTitle:`Create File`,newFolder:`New Folder`,newFile:`New File`,nameError:`There is already a {{mode}} with that name`,clearNameAria:`Clear name`,customIcon:`Choose custom icon or color`,colorError:`Enter a valid hex color (e.g. #ff0000)`,changeLater:`You can change the icon later in folder properties.`},deleteConfirm:{title:`Delete "{{name}}"?`,message:`Are you sure you want to delete "{{name}}"? This action cannot be undone.`},app:{open:`Open {{name}}`,toggleTheme:`Toggle Theme`},sort:{title:`Sort Icons`,default:`Default`,nameAsc:`Name (A-Z)`,nameDesc:`Name (Z-A)`,byType:`By Type`},launcher:{title:`Launcher`,editLauncher:`Edit Launcher`}},ze={empty:{title:`There are no new notifications`,message:`For now`},taskbar:{showNotifications:`Show notifications`,hideNotifications:`Hide notifications`,clock:`clock`}},Be={toolbar:{formatting:`Text formatting`,bold:`Bold`,italic:`Italic`,strikethrough:`Strikethrough`,inlineCode:`Inline code`,heading1:`Heading 1`,heading2:`Heading 2`,bulletList:`Bullet list`,orderedList:`Ordered list`,blockquote:`Blockquote`,codeBlock:`Code block`,horizontalRule:`Horizontal rule`},untitled:`untitled.md`},Ve={hero:{title:`Fullstack Developer & DevOps`,downloadCV:`Download CV`,contactMe:`Contact Me`},skills:{technical:`Technical Skills`,soft:`Soft Skills`},experience:`Professional Experience`,techStack:`Tech Stack`,languages:`Languages`},He={title:`Edit Launcher`,newFolder:`New Folder`,predefined:`Predefined`,rename:`Rename`,delete:`Delete`,predefinedFolders:`Predefined Folders`,customFolders:`Custom Folders`,availableApps:`Available Apps (drag and drop to add to folder)`,clickToAdd:`Click to add to first custom folder`,addFolder:`Add folder`,instructions:`Right-click an app in a folder to remove it. Click an available app to add it to the first custom folder.`,canCreateNewFolder:`You can create new folders if needed.`},Ue={actions:{save:`Guardar`,saveAs:`Guardar como`,cancel:`Cancelar`,ok:`Aceptar`,open:`Abrir`,close:`Cerrar`,delete:`Eliminar`,create:`Crear`,new:`Nuevo`,exit:`Salir`,apply:`Aplicar`,discard:`Descartar`,reset:`Restablecer`,download:`Descargar`,upload:`Subir`,copy:`Copiar`,cut:`Cortar`,paste:`Pegar`,undo:`Deshacer`,redo:`Rehacer`,createFolder:`Crear carpeta`,createFile:`Crear nuevo archivo`,select:`Seleccionar`},buttons:{minimize:`Minimizar`,maximize:`Maximizar`,restore:`Restaurar`,close:`Cerrar`,yes:`Sí`,no:`No`,confirm:`Confirmar`,continue:`Continuar`},labels:{name:`Nombre`,title:`Título`,filename:`Nombre de archivo`,url:`URL`,file:`Archivo`,folder:`Carpeta`,home:`Inicio`,type:`Tipo`,loading:`Cargando...`,search:`Buscar`,searchIcons:`Buscar iconos...`,unsavedChanges:`Cambios sin guardar`,unsaved:`Cambios sin guardar`,workInProgress:`Trabajo en progreso`},messages:{areYouSure:`¿Estás seguro?`,cannotBeUndone:`Esta acción no se puede deshacer.`,noFileSelected:`Ningún archivo seleccionado`,folderEmpty:`Esta carpeta está vacía`,noMatchingFiles:`No hay archivos coincidentes`,noSubfolders:`Sin subcarpetas`,replaceFile:`¿Reemplazar archivo?`,replaceFileMessage:`Ya existe un archivo llamado "{{name}}". ¿Deseas reemplazarlo?`,yesReplace:`Sí, reemplazar`,forBetterExperience:`Para una mejor experiencia usa esta aplicación en modo escritorio u horizontal`,turnYourDevice:`Gira tu dispositivo`,continueVertically:`¿Continuar verticalmente?`},theme:{light:`Claro`,dark:`Oscuro`,system:`Sistema`,custom:`Personalizado`,switchToLight:`Cambiar a modo claro`,switchToDark:`Cambiar a modo oscuro`},status:{error:`error`,success:`éxito`},menu:{file:`Archivo`,edit:`Editar`,view:`Ver`},filePicker:{folderTreeAria:`Árbol de carpetas`,filesAria:`Archivos`,foldersAria:`Carpetas`,cancelAria:`Cancelar`,openSelectedAria:`Abrir archivo seleccionado`,fileNameAria:`Nombre de archivo`},externalLink:{securityMessage:`bloquea la incrustación en iframes por razones de seguridad.`,goToProfile:`Haz clic abajo para ir a mi perfil de {{name}}.`},taskbar:{ariaLabel:`Barra de tareas`},launcher:{label:`Lanzador`,ariaLabel:`Lanzador de aplicaciones`,selectedIcon:`Seleccionado: {{icon}}`}},We={names:{notepad:`Bloc de notas`,terminal:`Terminal`,filesApp:`Archivos`,files:`Archivos`,uploader:`Subida de archivos`,settings:`Ajustes`,pdfViewer:`Visor PDF`,calendar:`Calendario`,storybook:`Storybook`,linkedin:`LinkedIn`,github:`GitHub`,imageViewer:`Visor de imágenes`,dosEmulator:`Emulador DOS`,doom:`DOOM`,deviceInfo:`Info del dispositivo`,welcome:`Bienvenido`,menuedit:`Editar lanzador`,codeServer:`VS Code`},folders:{socialLinks:`Enlaces sociales`,office:`Oficina y medios`,programming:`Programación`,games:`Juegos`,customApps:`Aplicaciones personalizadas`},descriptions:{notepad:`Editor Markdown con barra de herramientas`,terminal:`Emulador de terminal`,filesApp:`Explorador de archivos`,settings:`Ajustes del sistema`,pdfViewer:`Visor de documentos PDF`,calendar:`Vista de calendario`,storybook:`Zona de pruebas Storybook`,linkedin:`Enlace al perfil de LinkedIn`,github:`Enlace al perfil de GitHub`,imageViewer:`Visor de imágenes con selector de archivos`,dosEmulator:`Emulador de juegos y programas DOS`,doom:`Juega al clásico DOOM`},launcher:{label:`Lanzador`,ariaLabel:`Lanzador de aplicaciones`},imageViewer:{noImage:`Sin imagen para mostrar. Por favor, abre una.`,fitToWindow:`Ajustar a ventana`,zoom:`Zoom`},pdf:{viewer:`Visor PDF`},dosEmulator:{noBundle:`Ningún programa DOS cargado. Abre un bundle .jsdos para comenzar.`,loading:`Cargando emulador DOS...`,controls:{pause:`Pausar`,resume:`Reanudar`,restart:`Reiniciar`,mute:`Silenciar`,unmute:`Activar sonido`,fullscreen:`Pantalla completa`},menu:{file:`Archivo`,open:`Abrir Bundle`,restart:`Reiniciar`,exit:`Salir`,emulation:`Emulación`,pause:`Pausar`,resume:`Reanudar`,audio:`Audio`,mute:`Silenciar`,unmute:`Activar sonido`,volume:`Volumen`},errors:{failedToLoad:`Error al cargar el bundle DOS`,notSupported:`La emulación DOS no está soportada en este navegador`}},uploader:{clickToUpload:`Haz clic aquí para subir`,selectDestination:`Seleccionar carpeta destino`,fileInfo:`Archivo: {{name}} ({{size}})`,uploading:`Subiendo...`,uploadProgress:`Progreso de subida`,uploadComplete:`¡Subida completada!`,uploadFailed:`La subida no fue exitosa por la siguiente razón`,readyToUpload:`Listo para subir`,showFile:`Mostrar en Archivos`,openFile:`Abrir archivo`,upload:`Subir`,stepSelect:`Seleccionar`,stepDestination:`Destino`,stepUpload:`Subir`,stepDone:`Listo`,folderSelected:`Carpeta seleccionada`,uploadTo:`Destino`,uploadToRoot:`Subiendo a la carpeta raíz`},terminal:{notAvailable:`Terminal no disponible`,notAvailableMessage:`La terminal no puede usarse porque este entorno no permite actualmente el acceso a terminal.`,dockerRequired:`Por favor, ejecuta en modo Docker para usar la terminal.`,offlineTitle:`Terminal no disponible`,offlineMessage:`La terminal requiere un entorno Docker para funcionar. Se conecta directamente al shell del contenedor.`,offlineInstructions:`Para usar la terminal, ejecuta la aplicación en modo Docker:`,dockerCommand:`docker compose up dev`,openWelcome:`Abrir Bienvenida`,connecting:`Conectando...`,connected:`Conectado`,disconnected:`Desconectado`,connectionError:`Error de conexión`,menu:{edit:`Editar`,copy:`Copiar`,paste:`Pegar`,clear:`Limpiar`,reset:`Reiniciar`,reconnect:`Reconectar`,exit:`Salir`},scrollback:`Líneas`,shell:`Shell`},codeServer:{notAvailable:`VS Code no disponible`,notAvailableMessage:`VS Code (code-server) no puede usarse en modo navegador.`,dockerRequired:`Por favor, ejecuta la aplicación en Docker para usar VS Code.`}},Ge={sections:{wallpaper:{label:`Fondo de pantalla`,description:`Cambia la imagen de fondo del escritorio.`},appearance:{label:`Apariencia`,description:`Cambia entre modo claro y oscuro.`},launcher:{label:`Lanzador`,description:`Elige el icono del botón del lanzador.`},font:{label:`Fuente`,description:`Selecciona la familia de fuentes del sistema.`},reset:{label:`Restablecer`,description:`Restaura todos los ajustes y datos a sus valores por defecto.`},language:{label:`Idioma`,description:`Elige tu idioma preferido.`}},wallpaper:{title:`Fondo de pantalla`,wallpaperType:`Tipo de fondo`,staticImage:`Imagen estática`,gradient:`Degradado`,gradientType:`Tipo de degradado`,gradientPreset:`Preset`,gradientPosition:`Posición {index}`,addColor:`Añadir color`,removeColor:`Quitar`,linear:`Lineal`,radial:`Radial`,conic:`Cónico`,angle:`Ángulo`,chooseFromImages:`Elegir de imágenes`,uploadFromDisk:`Subir desde disco`,resetToDefault:`Restablecer por defecto`,orEnterUrl:`O introduce una URL`,wallpaperPreview:`Vista previa del fondo`,gradientPreview:`Vista previa del degradado`,addNoise:`Añadir textura de ruido`,noiseOpacity:`Opacidad del ruido`},appearance:{title:`Apariencia`,description:`Elige si el escritorio usa un tema claro u oscuro, o sigue la preferencia del sistema.`,taskbar:`Barra de tareas`,window:`Ventana`,accent:`Acento`,animationDuration:`Duración de animación`,animationDescription:`Controla la velocidad de las animaciones de abrir/cerrar ventanas (0.1s - 1.0s), debes guardar para ver los cambios.`},font:{title:`Fuente`,description:`Cambia la fuente en toda la interfaz del escritorio. Las fuentes deben descargarse antes de usar.`,download:`Descargar`,fontSize:`Tamaño de fuente`,downloadByName:`Descargar una fuente por nombre`,fromGoogleFonts:`(Desde Google Fonts)`,downloadError:`La fuente no se descargó correctamente. Intenta de nuevo con el nombre correcto`,downloadSuccess:`Descargada correctamente.`,systemDefault:`Sistema por defecto`},reset:{title:`Restablecer`,description:`Restaura todos los ajustes y datos a sus valores por defecto. Esta acción no se puede deshacer.`,resetButton:`⚠️ ¿Restablecer la app?`,modalTitle:`¿Estás seguro?`,modalDescription:`Esto borrará todos tus datos y ajustes.`,goBack:`¡Por favor vuelve atrás! 🙏`,burnEverything:`¡Sí, quémalo todo! 🔥`,keepFiles:`Sí, pero mantener mis archivos`},language:{title:`Idioma`,description:`Selecciona tu idioma preferido para la interfaz del escritorio.`,selectPlaceholder:`Selecciona idioma`,english:`English`,spanish:`Español`},all:`Todos los ajustes`},Ke={window:{title:`Ventana`,minimize:`Minimizar`,maximize:`Maximizar`,restore:`Restaurar`,close:`Cerrar`,ariaLabels:{minimize:`Minimizar`,maximize:`Maximizar`,restore:`Restaurar`,close:`Cerrar`}},unsavedModal:{title:`Cambios sin guardar`,message:`Tienes cambios sin guardar. ¿Qué deseas hacer?`,dontSave:`No guardar`,save:`Guardar`},fileDialog:{openFile:`Abrir archivo`,saveFile:`Guardar archivo`,selectFile:`Seleccionar archivo {{name}}`,openFolder:`Abrir carpeta {{name}}`,selectFolder:`Seleccionar carpeta`,filename:`nombre.md`}},qe={window:{minimize:`Minimizar`,restore:`Restaurar`,maximize:`Maximizar`,close:`Cerrar ventana`},actions:{cut:`Cortar`,copy:`Copiar`,paste:`Pegar`,pasteItems:`Pegar ({{count}} elementos)`,delete:`Eliminar`,createFolder:`Crear carpeta`,createFile:`Crear nuevo archivo`},createItem:{folderTitle:`Crear Carpeta`,fileTitle:`Crear Archivo`,newFolder:`Nueva Carpeta`,newFile:`Nuevo Archivo`,nameError:`Ya existe un {{mode}} con ese nombre`,clearNameAria:`Limpiar nombre`,customIcon:`Elige icono o color personalizado`,colorError:`Introduce un color hexadecimal válido (ej. #ff0000)`,changeLater:`Puedes cambiar el icono más tarde en las propiedades de la carpeta.`},deleteConfirm:{title:`¿Eliminar "{{name}}"?`,message:`¿Estás seguro de que quieres eliminar "{{name}}"? Esta acción no se puede deshacer.`},app:{open:`Abrir {{name}}`,toggleTheme:`Cambiar Tema`},sort:{title:`Ordenar Iconos`,default:`Por defecto`,nameAsc:`Nombre (A-Z)`,nameDesc:`Nombre (Z-A)`,byType:`Por Tipo`},launcher:{title:`Launcher`,editLauncher:`Editar Launcher`}},Je={empty:{title:`No hay notificaciones nuevas`,message:`Por ahora`},taskbar:{showNotifications:`Mostrar notificaciones`,hideNotifications:`Ocultar notificaciones`,clock:`reloj`}},Ye={toolbar:{formatting:`Formato de texto`,bold:`Negrita`,italic:`Cursiva`,strikethrough:`Tachado`,inlineCode:`Código en línea`,heading1:`Título 1`,heading2:`Título 2`,bulletList:`Lista con viñetas`,orderedList:`Lista ordenada`,blockquote:`Cita`,codeBlock:`Bloque de código`,horizontalRule:`Línea horizontal`},untitled:`sin-titulo.md`},Xe={hero:{title:`Fullstack Developer & DevOps`,downloadCV:`Descargar CV`,contactMe:`Contactar`},skills:{technical:`Habilidades Técnicas`,soft:`Habilidades Blandas`},experience:`Experiencia Profesional`,techStack:`Stack Tecnológico`,languages:`Idiomas`},Ze={newFolder:`Nueva Carpeta`,predefined:`Predefinida`,rename:`Renombrar`,delete:`Eliminar`,predefinedFolders:`Carpetas Predefinidas`,customFolders:`Carpetas Personalizadas`,availableApps:`Apps Disponibles (arrastrar y soltar para añadir a carpetas)`,clickToAdd:`Clic para añadir a la primera carpeta personalizada`,addFolder:`Añadir carpeta`,instructions:`Clic derecho en una app dentro de una carpeta para eliminarla. Clic en una app disponible para añadirla a la primera carpeta personalizada.`,canCreateNewFolder:`Puedes crear una nueva carpeta si lo necesitas.`},Qe=[`en`,`es`];A.default.use(j.default).use(k.initReactI18next).init({resources:{en:{common:Pe,apps:Fe,settings:Ie,window:Le,contextMenu:Re,notifications:ze,notes:Be,welcome:Ve,menuedit:He},es:{common:Ue,apps:We,settings:Ge,window:Ke,contextMenu:qe,notifications:Je,notes:Ye,welcome:Xe,menuedit:Ze}},fallbackLng:`en`,supportedLngs:Qe,ns:[`common`,`apps`,`settings`,`window`,`contextMenu`,`notifications`,`notes`,`welcome`,`menuedit`],defaultNS:`common`,interpolation:{escapeValue:!1},detection:{order:[`localStorage`,`navigator`],lookupLocalStorage:`fde-desktop:language`,caches:[`localStorage`]}});var $e=A.default,q={root:`_root_17um1_1`,windowButton:`_windowButton_17um1_15`,systemTray:`_systemTray_17um1_44`,themeToggle:`_themeToggle_17um1_51`,clock:`_clock_17um1_70`,notifButton:`_notifButton_17um1_88`,langButton:`_langButton_17um1_109`},et={en:`English`,es:`Español`},tt=()=>{let{t:e,i18n:n}=(0,k.useTranslation)(`settings`),r=t._(e=>e.language),i=t._(e=>e.setLanguage),[a,o]=(0,C.useState)(!1),s=(0,C.useCallback)(e=>{i(e),n.changeLanguage(e),localStorage.setItem(`fde-desktop:language`,e),o(!1)},[i,n]);return(0,w.jsxs)(T.Popover,{opened:a,onChange:o,position:`top-end`,shadow:`md`,withArrow:!0,children:[(0,w.jsx)(T.Popover.Target,{children:(0,w.jsx)(T.UnstyledButton,{className:q.langButton,onClick:()=>o(e=>!e),"aria-label":e(`language.selectPlaceholder`),"aria-expanded":a,children:(0,w.jsx)(t.p,{lang:r,size:16})})}),(0,w.jsx)(T.Popover.Dropdown,{children:(0,w.jsx)(T.Stack,{gap:`xs`,children:Qe.map(e=>(0,w.jsx)(T.UnstyledButton,{onClick:()=>s(e),"aria-label":et[e],"aria-pressed":e===r,style:{padding:`8px 12px`,borderRadius:6,width:`100%`,background:e===r?`var(--mantine-primary-color-light)`:`transparent`,cursor:`pointer`},children:(0,w.jsxs)(T.Group,{gap:`sm`,children:[(0,w.jsx)(t.p,{lang:e,size:20}),(0,w.jsx)(T.Text,{size:`sm`,fw:e===r?600:400,children:et[e]})]})},e))})})]})},nt=({win:e,onClick:t,onContextMenu:n})=>{let r=(0,C.useRef)(null),{register:i,unregister:a}=le();return(0,C.useEffect)(()=>(r.current&&i(e.id,r.current.getBoundingClientRect()),()=>a(e.id)),[e.id,i,a]),(0,w.jsxs)(`button`,{ref:r,className:q.windowButton,"data-active":e.state===`minimized`?`false`:`true`,onClick:t,onContextMenu:n,"aria-label":e.title,children:[(0,w.jsx)(c.t,{fcIcon:e.fcIcon,iconUrl:e.iconUrl,fallback:e.icon,size:14,color:e.iconColor}),(0,w.jsx)(T.Text,{size:`xs`,truncate:!0,children:e.title})]})},rt=({calendarSlot:e})=>{let{t:n}=(0,k.useTranslation)(`notifications`),r=t._(e=>e.theme.colors.taskbar),a=t._(e=>e.theme.mode),o=t._(e=>e.toggleTheme),s=t._(e=>e.launcherIcon),l=i.o(e=>e.notifications),u=i.o(e=>e.removeNotification),d=i.o(e=>e.windows),f=i.o(e=>e.restoreWindow),p=i.o(e=>e.minimizeWindow),m=i.o(e=>e.focusWindow),h=i.o(e=>e.closeWindow),g=i.o(e=>e.maximizeWindow),_=pe(),[v,y]=(0,C.useState)(!1),[b,x]=(0,C.useState)(!1),{position:S,targetWindowId:E,windowMenuOpened:D,panelMenuOpened:O,launcherMenuOpened:A,openWindowMenu:j,openPanelMenu:M,openLauncherMenu:N,closeMenu:P}=ge(),F=E?d.find(e=>e.id===E)?.state??null:null,I=(0,C.useRef)(0);(0,C.useEffect)(()=>{l.length>I.current&&setTimeout(()=>x(!0),0),I.current=l.length},[l.length]);let L=d.filter(e=>e.isOpen),R=(e,t)=>{t===`minimized`?(f(e),m(e)):p(e)};return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:q.root,style:{background:r},role:`toolbar`,"aria-label":`Taskbar`,onContextMenu:M,children:[(0,w.jsx)(Oe,{fcIcon:s,onContextMenu:N}),L.map(e=>(0,w.jsx)(nt,{win:e,onClick:()=>R(e.id,e.state),onContextMenu:t=>j(t,e.id)},e.id)),(0,w.jsxs)(`div`,{className:q.systemTray,"data-testid":`system-tray`,children:[(0,w.jsxs)(T.Popover,{opened:b,onChange:x,position:`top-end`,shadow:`md`,withArrow:!0,keepMounted:!0,children:[(0,w.jsx)(T.Popover.Target,{children:(0,w.jsx)(`button`,{className:q.notifButton,onClick:()=>x(e=>!e),"aria-label":n(b?`taskbar.hideNotifications`:`taskbar.showNotifications`),children:(0,w.jsx)(c.t,{fcIcon:b?`FcCollapse`:`FcExpand`,size:18})})}),(0,w.jsx)(T.Popover.Dropdown,{style:{background:`transparent`,border:`none`,padding:0},children:(0,w.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:8,minWidth:300},children:l.length===0?(0,w.jsx)(T.Notification,{title:n(`empty.title`),onClose:()=>x(!1),children:n(`empty.message`)}):l.map(e=>(0,w.jsx)(T.Notification,{withBorder:!0,icon:e.fcIcon?(0,w.jsx)(c.t,{fcIcon:e.fcIcon,size:18}):void 0,title:e.title,onClose:()=>{u(e.id),e.onClose?.()},children:e.message},e.id))})})]}),(0,w.jsx)(tt,{}),(0,w.jsx)(`button`,{className:q.themeToggle,onClick:o,"aria-label":n(a===`dark`?`theme.switchToLight`:`theme.switchToDark`,{ns:`common`}),title:n(a===`dark`?`theme.switchToLight`:`theme.switchToDark`,{ns:`common`}),children:a===`dark`?`☀️`:`🌙`}),(0,w.jsxs)(T.Popover,{opened:v,onChange:y,position:`top-end`,shadow:`md`,withArrow:!0,children:[(0,w.jsx)(T.Popover.Target,{children:(0,w.jsx)(`button`,{className:q.clock,onClick:()=>y(e=>!e),"aria-label":n(`taskbar.clock`),"aria-expanded":v,children:(0,w.jsx)(T.Text,{size:`xs`,children:_})})}),(0,w.jsx)(T.Popover.Dropdown,{children:e})]})]})]}),(0,w.jsx)(Ne,{windowMenuOpened:D,panelMenuOpened:O,launcherMenuOpened:A,menuPosition:S,targetWindowId:E,targetWindowState:F,onCloseWindow:h,onMinimizeWindow:p,onMaximizeWindow:g,onRestoreWindow:f,onClose:P})]})},it=({message:e=`Loading...`,size:t=`lg`})=>(0,w.jsx)(T.Center,{style:{width:`100%`,height:`100%`},children:(0,w.jsxs)(T.Stack,{align:`center`,gap:`md`,children:[(0,w.jsx)(T.Loader,{size:t}),(0,w.jsx)(T.Text,{c:`dimmed`,children:e})]})}),at=({progress:e,windowIcon:t})=>{let n=(0,T.useMantineTheme)(),r=()=>{switch(e.state){case`fetching`:return`Fetching app info...`;case`compiling`:return`Compiling app...`;case`loading`:return`Loading app...`;case`ready`:return`Ready!`;case`error`:return`Error loading app`;default:return`Loading...`}},i=()=>e.state===`error`?`red`:e.state===`ready`?`green`:n.primaryColor;return(0,w.jsx)(T.Center,{style:{width:`100%`,height:`100%`},"data-testid":`custom-app-loading`,children:(0,w.jsxs)(T.Stack,{align:`center`,gap:`lg`,p:`xl`,children:[t&&(0,w.jsx)(T.Text,{size:`3rem`,children:t}),(0,w.jsx)(T.Text,{size:`lg`,fw:700,children:e.appName||`App`}),(0,w.jsx)(T.Progress,{value:e.progress,size:`lg`,radius:`xl`,animated:e.state===`loading`||e.state===`compiling`,style:{minWidth:200},color:i()}),(0,w.jsx)(T.Text,{size:`sm`,c:`dimmed`,children:r()}),e.state===`error`&&(0,w.jsx)(T.Text,{size:`xs`,c:`red`,ta:`center`,children:e.error}),(0,w.jsxs)(T.Text,{size:`xs`,c:`gray`,children:[e.progress,`%`]})]})})},ot=({appId:e})=>(0,w.jsx)(T.Center,{style:{width:`100%`,height:`100%`},children:(0,w.jsxs)(T.Stack,{align:`center`,gap:`lg`,p:`xl`,maw:400,children:[(0,w.jsx)(T.Text,{size:`3rem`,children:(0,w.jsx)(P.FcDoNotInsert,{})}),(0,w.jsx)(T.Text,{size:`lg`,fw:700,ta:`center`,children:`Development Server Offline`}),(0,w.jsxs)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:[`The app "`,e,`" cannot be loaded because the development server is offline.`]}),(0,w.jsx)(T.Button,{variant:`light`,onClick:()=>{window.__FDE_API__?.openApp(`welcome`)},children:`Open Welcome App`}),(0,w.jsx)(T.Anchor,{href:`https://github.com/frannunpal/frannunpal.github.io/issues`,target:`_blank`,rel:`noopener noreferrer`,size:`sm`,children:`File an issue on GitHub`})]})}),st=({appId:e})=>(0,w.jsx)(T.Center,{style:{width:`100%`,height:`100%`},children:(0,w.jsxs)(T.Stack,{align:`center`,gap:`lg`,p:`xl`,maw:400,children:[(0,w.jsx)(T.Text,{size:`3rem`,children:(0,w.jsx)(P.FcInfo,{})}),(0,w.jsx)(T.Text,{size:`lg`,fw:700,ta:`center`,children:`Custom Apps Not Available`}),(0,w.jsxs)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:[`The app "`,e,`" cannot be loaded because this environment does not currently allow creating your own apps.`]}),(0,w.jsx)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:`Please refer to the "Documentation" folder to learn more about it.`})]})}),ct=new Set,J=null,lt=null,ut=null,dt=!1,ft=0,pt=null,mt=!1,ht=!1;function gt(){ct.clear(),J=null,lt=null,ut=null,dt=!1,ft=0,pt=null,mt=!1,ht=!1}var _t=1e4,vt=2e3,yt=5,bt=0;function xt(){return`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/api/hmr`}async function St(){try{let e=await fetch(`/api/hmr`,{method:`HEAD`});return e.status===426||e.status===400}catch{return!1}}function Ct(){lt&&=(clearTimeout(lt),null),ut&&=(clearTimeout(ut),null),dt=!1}function wt(e){typeof BroadcastChannel>`u`||(pt=new BroadcastChannel(`fde-custom-apps`),pt.onmessage=t=>{let n=t.data;n._fromBroadcast=!0,e(n)})}function Tt(e){pt?.postMessage(e)}async function Et(){i.o.getState().isFsReady||await new Promise(e=>{let t=i.o.subscribe(n=>{n.isFsReady&&(t(),e())})});try{let e=i.v.getState().registeredApps,{added:t,removed:n}=await i.L(e);for(let e of t)i.v.getState().registerApp(e),i.o.getState().handleCustomAppRegistered?.(e);for(let e of n)i.v.getState().unregisterApp(e),i.o.getState().handleCustomAppUnregistered?.(e)}catch(e){console.warn(`[HMR] Failed to sync apps on connect:`,e)}}function Dt(e,t,n){if(dt||J&&J.readyState===WebSocket.OPEN)return J;let r=xt(),a=++ft;return dt=!0,J=new WebSocket(r),ut=setTimeout(()=>{J&&J.readyState!==WebSocket.OPEN&&a===ft&&(console.warn(`[HMR] Initial connection timeout`),bt++,bt>=yt?(console.warn(`[HMR] Max initial retries reached, marking server as offline`),t()):(J?.close(),lt=setTimeout(()=>{Dt(e,t,n)},vt)))},_t),J.onopen=()=>{if(a!==ft){J?.close();return}console.log(`[HMR] Connected to server`),bt=0,dt=!1,i.v.getState().resetHmrRetry(),i.v.getState().setHmrConnected(!0),i.v.getState().setHmrError(null),i.v.getState().devServerOffline&&n(),i.v.getState().setDevServerOffline(!1),Ct(),Et().catch(e=>{console.warn(`[HMR] Failed to sync apps:`,e)})},J.onmessage=t=>{try{let n=JSON.parse(t.data);console.log(`[HMR] Received ${n.type} for ${n.appId}`),e(n)}catch(e){console.error(`[HMR] Failed to parse message:`,e)}},J.onclose=r=>{a===ft&&(console.log(`[HMR] Disconnected from server (code: ${r.code})`),J=null,dt=!1,i.v.getState().setHmrConnected(!1),Ct(),lt=setTimeout(()=>{Dt(e,t,n)},vt))},J.onerror=e=>{a===ft&&(console.error(`[HMR] WebSocket error:`,e),i.v.getState().setHmrError(`Connection failed`))},J}function Ot(){Ct(),J&&=(J.close(),null),pt&&=(pt.close(),null)}function kt(e){let t=(0,C.useRef)(e),{notify:n}=f.t();(0,C.useEffect)(()=>{t.current=e},[e]);let r=(0,C.useCallback)(e=>{switch(e.type){case`reload`:{let t=e.appId,n=i.v.getState().mountedApps[t];if(n?.instance&&typeof n.instance.unmount==`function`)try{n.instance.unmount()}catch(e){console.warn(`[HMR] Error unmounting ${t}:`,e)}let r=document.getElementById(`app-container-${t}`);r&&(r.innerHTML=``),i.v.getState().setAppLoading(t),ct.forEach(e=>{try{e.onReload(t)}catch(e){console.error(`[HMR] Callback error:`,e)}});break}case`app-registered`:if(e.manifest){console.log(`[HMR] App registered: ${e.manifest.id}`);let t=!!i.v.getState().registeredApps[e.manifest.id];i.O(),i.R(e.manifest),i.v.getState().registerApp(e.manifest),i.o.getState().handleCustomAppRegistered?.(e.manifest),t||n(`New App Available`,`${e.manifest.name} is now available`,{fcIcon:`FcApproval`}),e._fromBroadcast||Tt(e)}break;case`app-unregistered`:{let t=e.appId;console.log(`[HMR] App unregistered: ${t}`),i.O(),i.I(t),i.v.getState().unregisterApp(t),i.o.getState().handleCustomAppUnregistered?.(t),e._fromBroadcast||Tt(e);break}case`app-error`:console.error(`[HMR] App error: ${e.appId} - ${e.error}`),n(`App Error`,e.error||`Unknown error`,{fcIcon:`FcCancel`});break}},[n]),a=(0,C.useCallback)(()=>{i.v.getState().setDevServerOffline(!0),n(`Development Server Offline`,`HMR is disabled. Changes will not be applied until the server reconnects.`,{fcIcon:`FcDoNotInsert`})},[n]),o=(0,C.useCallback)(()=>{n(`HMR Reconnected`,`Hot module replacement is now active`,{fcIcon:`FcApproval`})},[n]);(0,C.useEffect)(()=>{if(i.H()===`browser`){console.log(`[HMR] Skipping: not running in Docker`);return}if(!i.G()||!i.W())return;let e=!1;return ct.add(t.current),!ht&&!mt&&(mt=!0,St().then(t=>{if(mt=!1,e||!t){t||console.warn(`[HMR] HMR endpoint not available, skipping WebSocket connection`);return}ht=!0,wt(r),Dt(r,a,o)}).catch(()=>{mt=!1})),()=>{e=!0,ct.delete(t.current),ct.size===0&&(ht=!1,Ot())}},[r,a,o])}function At(){let{notify:e}=f.t();kt({onReload:()=>{},onRegistered:(0,C.useCallback)(t=>{i.o.getState().handleCustomAppRegistered?.(t),e(`New App Available`,`${t.name} is now available`,{fcIcon:`FcApproval`})},[e]),onUnregistered:(0,C.useCallback)(e=>{i.o.getState().handleCustomAppUnregistered?.(e)},[])})}function jt(e,t=5e3){return new Promise((n,r)=>{let i=Date.now(),a=null,o=null,s=()=>{o&&=(clearInterval(o),null),a&&=(clearTimeout(a),null)},c=()=>{let a=document.getElementById(e);if(a){s(),n(a);return}if(Date.now()-i>=t){s(),r(Error(`Container #${e} not found after ${t}ms`));return}};c(),o=setInterval(c,1e3),a=setTimeout(()=>{s(),r(Error(`Container #${e} not found after ${t}ms`))},t)})}var Mt={state:`idle`,progress:0,appName:``},Nt=1e4,Pt=({appId:e,windowIcon:t,notifyReady:n})=>{let[r,a]=(0,C.useState)({...Mt,appName:e}),[o,s]=(0,C.useState)(!1),[c,l]=(0,C.useState)(null),[u,d]=(0,C.useState)(!1),[p,m]=(0,C.useState)(0),h=(0,C.useRef)(null),g=(0,C.useRef)(!0),_=(0,C.useRef)(!1),v=(0,C.useRef)(null),y=(0,C.useRef)(null),b=i.v(e=>e.devServerOffline),x=i.v(t=>t.mountedApps[e]),S=i.v(e=>e.setAppLoading),T=i.v(e=>e.setAppLoaded),E=i.v(e=>e.setAppError),D=i.v(e=>e.clearApp),{notify:O}=f.t(),k=i.G(),A=(0,C.useCallback)(()=>{y.current&&=(clearTimeout(y.current),null)},[]),j=(0,C.useCallback)(()=>{v.current&&=(clearInterval(v.current),null)},[]),M=(0,C.useCallback)(()=>{let e=x?.instance;if(e&&typeof e.unmount==`function`)try{e.unmount()}catch{}},[x?.instance]),N=(0,C.useCallback)(async()=>{if(g.current&&!_.current){_.current=!0;try{a(e=>({...e,state:`fetching`,progress:10})),S(e),l(null),i.O();let t=await i.A(!0);if(!t)throw Error(`Apps manifest not found. Make sure apps are built.`);let r=t.apps.find(t=>t.id===e);if(!r)throw Error(`App '${e}' not found in manifest. Available apps: ${t.apps.map(e=>e.id).join(`, `)}`);a(e=>({...e,state:`loading`,progress:30,appName:r.name})),v.current=setInterval(()=>{if(!g.current){j();return}a(e=>({...e,progress:Math.min(e.progress+5,90)}))},100);try{await jt(`app-container-${e}`,5e3)}catch{throw Error(`Container #app-container-${e} not found`)}if(await import(`/dist-apps/${r.entry}?t=${Date.now()}`),j(),T(e),await new Promise(t=>{A();let n=()=>{if(i.v.getState().mountedApps[e]?.isReady){t();return}y.current=setTimeout(n,500)};if(i.v.getState().mountedApps[e]?.isReady){t();return}y.current=setTimeout(()=>{console.warn(`[${e}] App did not call appReady() within ${Nt}ms`),O(`Warning`,`App ${e} took too long to initialize`,{fcIcon:`FcInfo`}),d(!0),i.v.getState().setAppReady(e),t()},Nt),n()}),a(e=>({...e,state:`ready`,progress:100})),s(!0),!g.current)return;setTimeout(()=>{n?.()},50)}catch(t){j(),A(),_.current=!1;let n=t instanceof Error?t.message:`Unknown error`;a(e=>({...e,state:`error`,error:n,progress:0})),E(e,n),l(n),console.error(`[CustomAppLoader] Error loading app ${e}:`,t)}}},[e,n,S,T,E,A,j,O]);if(kt({onReload:(0,C.useCallback)(t=>{t===e&&(_.current=!1,M(),D(e),s(!1),a({...Mt,appName:e}),l(null),m(e=>e+1))},[e,D,M])}),(0,C.useEffect)(()=>{if(!_.current)return g.current=!0,N(),()=>{g.current=!1,j(),A()}},[N,p,j,A]),!k)return(0,w.jsx)(st,{appId:e});if(b&&!x?.isLoaded&&!c)return(0,w.jsx)(ot,{appId:e});let P=r.state===`error`,F=o&&x?.isReady&&!u,I=r.state===`ready`&&o&&u,L=I&&!x?.instance,R=P||L||!(F||I);return L?(0,w.jsx)(at,{progress:{...r,state:`error`,error:`App '${e}' loaded but did not mount. Check the browser console for errors.`},windowIcon:t}):(0,w.jsxs)(w.Fragment,{children:[R&&(0,w.jsx)(at,{progress:r,windowIcon:t}),(0,w.jsx)(`div`,{ref:h,id:`app-container-${e}`,"data-testid":`custom-app-container-${e}`,style:{all:`initial`,display:P?`none`:`block`,width:`100%`,height:`100%`,overflow:`auto`,visibility:F||I?`visible`:`hidden`,boxSizing:`border-box`,fontFamily:`sans-serif`}})]})},Ft=(0,C.createContext)({notifyReady:()=>{},getContentData:()=>void 0}),It=()=>(0,C.useContext)(Ft),Lt=({children:e})=>{let t=(0,C.useRef)(void 0),n=(0,C.useCallback)(e=>{e!==void 0&&(t.current=e)},[]),r=(0,C.useCallback)(()=>t.current,[]);return(0,w.jsx)(Ft.Provider,{value:{notifyReady:n,getContentData:r},children:e})},Y={root:`_root_1vtes_1`,titleBar:`_titleBar_1vtes_12`,windowButtons:`_windowButtons_1vtes_31`,title:`_title_1vtes_12`,content:`_content_1vtes_41`,focusOverlay:`_focusOverlay_1vtes_48`},Rt=({win:e,isFocused:t,focusWindow:n})=>{let{notifyReady:a,getContentData:o}=It(),s=i.v(t=>e.content in t.registeredApps),c=(0,C.useMemo)(()=>r.x(e.content),[e.content]),l=(0,C.useMemo)(()=>r.C(e.content),[e.content]),u=(0,C.useMemo)(()=>r.w(e.content),[e.content]),f=(0,C.useMemo)(()=>r.D(e.content),[e.content]),p=(0,C.useMemo)(()=>r.S(e.content),[e.content]),m=i.o(e=>e.closeWindow),h=o()??e.contentData,g={...e,contentData:h},_=l?l(g):void 0;if(s)return(0,w.jsx)(Pt,{appId:e.content,windowIcon:e.icon,notifyReady:a});let v=f?(0,w.jsx)(C.Suspense,{fallback:(0,w.jsx)(it,{message:p?`Loading ${p}...`:void 0}),children:(0,C.createElement)(c,{window:e,notifyReady:a})}):(0,C.createElement)(c,{window:e,notifyReady:a});return(0,w.jsxs)(w.Fragment,{children:[u?(0,w.jsx)(C.Suspense,{fallback:null,children:(0,C.createElement)(u,{windowId:e.id,contentData:h,onExit:()=>m(e.id)})}):_&&_.length>0?(0,w.jsx)(d.t,{elements:_}):null,(0,w.jsxs)(`div`,{className:Y.content,children:[!t&&(0,w.jsx)(`div`,{"data-testid":`focus-overlay`,className:Y.focusOverlay,onMouseDown:t=>{t.stopPropagation(),n(e.id)}}),v]})]})},zt=({window:e})=>{let{t:n}=(0,k.useTranslation)(`window`),a=i.o(t=>t.windows.find(t=>t.id===e.id))??e,o=be(a.content),{focusWindow:s,closeWindow:d,minimizeWindow:f,maximizeWindow:p,restoreWindow:m,moveWindow:h,resizeWindow:g}=i.o((0,N.useShallow)(e=>({focusWindow:e.focusWindow,closeWindow:e.closeWindow,minimizeWindow:e.minimizeWindow,maximizeWindow:e.maximizeWindow,restoreWindow:e.restoreWindow,moveWindow:e.moveWindow,resizeWindow:e.resizeWindow}))),_=t._(e=>e.theme.colors.window),v=l.a(e=>e.isOpen),y=l.a(e=>e.windowId),b=l.a(e=>e.onSave),x=l.a(e=>e.onDiscard),S=l.a(e=>e.closeModal),{windowVariants:E,easeIn:D}=_e(),A=i.o(e=>{let t=e.windows.find(e=>e.id===a.id);if(!t)return!0;let n=t.alwaysOnTop??!1,r=e.windows.filter(e=>e.isOpen&&e.state!==`minimized`&&(e.alwaysOnTop??!1)===n);return r.length===0?!0:Math.max(...r.map(e=>e.zIndex))===t.zIndex}),{getRect:j}=le(),P=(0,O.useAnimationControls)(),F=(0,C.useRef)(a.state);(0,C.useEffect)(()=>{P.start(`visible`)},[P]),(0,C.useEffect)(()=>{if(F.current===`minimized`&&a.state!==`minimized`){let e=j(a.id);if(e){let t=a.x+a.width/2,n=a.y+a.height/2,i=e.left+e.width/2,o=e.top+e.height/2;P.start(r.v(i-t,o-n))}else P.set({x:0,y:0,scale:1,opacity:1}),P.start(`visible`)}F.current=a.state},[a.state,P,j,a.id,a.x,a.y,a.width,a.height]);let I=(0,C.useCallback)(e=>{e.preventDefault(),i.st.find(e=>e.id===a.content)?.hasContextMenu||e.stopPropagation()},[a.content]);if(!a.isOpen)return null;let L=a.state===`minimized`,R=a.state===`maximized`,z=a.canMaximize!==!1,ee=v&&y===a.id,B=async()=>{let e=j(a.id);if(e){let t=a.x+a.width/2,n=a.y+a.height/2,i=e.left+e.width/2,o=e.top+e.height/2;await P.start(r.m(i-t,o-n))}else await P.start({...E.exit,transition:D});f(a.id)},V=async()=>{let e=l.t(a.id);e&&!e()||(await P.start({...E.exit,transition:D}),d(a.id))},H=()=>{b?.(),S()},U=()=>{x?.(),S();let e=a.id;e&&d(e)},te=()=>{S()};return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(M.Rnd,{position:R?{x:0,y:0}:{x:a.x,y:a.y},size:R?{width:`100vw`,height:`100vh`}:{width:a.width,height:a.height},minWidth:a.minWidth??0,minHeight:a.minHeight??0,style:{zIndex:a.zIndex,visibility:L?`hidden`:`visible`,pointerEvents:L?`none`:`auto`},dragHandleClassName:Y.titleBar,disableDragging:R||L,enableResizing:!R&&!L,onMouseDown:()=>s(a.id),onDragStop:(e,t)=>h(a.id,t.x,t.y),onResizeStop:(e,t,n,r,i)=>{g(a.id,n.offsetWidth,n.offsetHeight),h(a.id,i.x,i.y)},children:(0,w.jsxs)(O.motion.div,{className:Y.root,"data-testid":`window-${a.content}`,style:{background:_},variants:E,initial:`hidden`,animate:P,exit:`exit`,layout:!0,transition:r.p,onContextMenu:I,children:[(0,w.jsxs)(`div`,{className:Y.titleBar,children:[(0,w.jsx)(c.t,{fcIcon:a.fcIcon,iconUrl:a.iconUrl,fallback:a.icon,size:14,color:a.iconColor}),(0,w.jsx)(T.Text,{size:`sm`,fw:500,truncate:!0,className:Y.title,children:o}),(0,w.jsxs)(T.Group,{gap:2,wrap:`nowrap`,className:Y.windowButtons,children:[(0,w.jsx)(T.ActionIcon,{size:`lg`,variant:`subtle`,"aria-label":n(`window.ariaLabels.minimize`),onClick:B,children:(0,w.jsx)(u.t,{name:`VscChromeMinimize`})}),z&&(0,w.jsx)(T.ActionIcon,{size:`lg`,variant:`subtle`,"aria-label":n(R?`window.ariaLabels.restore`:`window.ariaLabels.maximize`),onClick:()=>R?m(a.id):p(a.id),children:R?(0,w.jsx)(u.t,{name:`VscChromeRestore`}):(0,w.jsx)(u.t,{name:`VscChromeMaximize`})}),(0,w.jsx)(T.ActionIcon,{size:`lg`,variant:`subtle`,color:`red`,"aria-label":n(`window.ariaLabels.close`),onClick:V,children:(0,w.jsx)(u.t,{name:`VscChromeClose`})})]})]}),(0,w.jsx)(Lt,{children:(0,w.jsx)(Rt,{win:a,isFocused:A,focusWindow:s})})]})}),(0,w.jsxs)(T.Modal,{opened:ee,onClose:te,title:n(`unsavedModal.title`),centered:!0,withinPortal:!0,children:[(0,w.jsx)(T.Text,{size:`sm`,mb:`lg`,children:n(`unsavedModal.message`)}),(0,w.jsx)(T.Button,{variant:`default`,onClick:U,children:n(`unsavedModal.dontSave`)}),(0,w.jsx)(T.Button,{onClick:H,ml:`sm`,children:n(`unsavedModal.save`)})]})]})},Bt={root:`_root_1f7p3_1`,iconImage:`_iconImage_1f7p3_21`,label:`_label_1f7p3_26`},Vt=({icon:e,onDoubleClick:t,onContextMenu:n})=>{let r=i.st.find(t=>t.id===e.appId),a=e.iconName!==void 0,o=e.nodeId!==void 0,s=e.icon===`📁`,l=e.appId===`pdf`,u=(0,C.useRef)(0),d=be(e.appId),f=e.appId&&!o&&r?d:e.name,m=(0,C.useCallback)(t=>{if(t.preventDefault(),e.nodeId){t.stopPropagation(),n?.(t,e.nodeId);return}e.appId&&!r?.hasContextMenu&&t.stopPropagation()},[e.nodeId,e.appId,r?.hasContextMenu,n]),h=()=>a?(0,w.jsx)(p.n,{type:`folder`,name:e.name,folderNode:{id:e.id,name:e.name,type:`folder`,parentId:null,children:[],iconName:e.iconName,iconColor:e.iconColor,createdAt:new Date,updatedAt:new Date},size:32}):s&&o?(0,w.jsx)(p.n,{type:`folder`,name:e.name,size:32}):o||l?(0,w.jsx)(p.n,{type:`file`,name:e.name,size:32}):(0,w.jsx)(c.t,{fcIcon:r?.fcIcon,iconUrl:r?.iconUrl,fallback:e.icon,size:32,color:r?.iconColor});return(0,w.jsxs)(`div`,{className:Bt.root,style:{left:e.x,top:e.y},onDoubleClick:()=>t(e.appId??``,e.nodeId),onTouchEnd:n=>{n.preventDefault();let r=Date.now();r-u.current<300&&t(e.appId??``,e.nodeId),u.current=r},onContextMenu:m,role:`button`,"aria-label":f,tabIndex:0,onKeyDown:n=>n.key===`Enter`&&t(e.appId??``,e.nodeId),children:[(0,w.jsx)(`span`,{className:Bt.iconImage,"aria-hidden":`true`,children:h()}),(0,w.jsx)(T.Text,{size:`xs`,className:Bt.label,truncate:!0,children:f})]})},Ht=({x:e,y:t})=>(0,w.jsx)(T.Menu.Target,{children:(0,w.jsx)(`div`,{"aria-hidden":`true`,style:{position:`fixed`,left:e,top:t,width:0,height:0,pointerEvents:`none`}})}),Ut=({owner:e,parentId:t,currentPath:n})=>{let{t:a}=(0,k.useTranslation)(`contextMenu`),o=i.o(e=>e.contextMenu),s=i.o(e=>e.closeContextMenu),l=i.o(e=>e.copyToClipboard),d=i.o(e=>e.cutToClipboard),f=i.o(e=>e.clipboard),p=i.o(e=>e.clearClipboard),m=i.o(e=>e.fsNodes),h=i.o(e=>e.addNotification),g=i.o(e=>e.openWindow),_=i.o(e=>e.desktopSortMode),v=i.o(e=>e.filesSortMode),y=i.o(e=>e.setDesktopSortMode),b=i.o(e=>e.setFilesSortMode),x=i.o(e=>e.setFsNodes),S=i.o(e=>e.syncIcons),E=e===`files`?v:_,D=e===`files`?b:y,[O,A]=(0,C.useState)({opened:!1,pending:null}),[j,M]=(0,C.useState)({opened:!1,nodeId:null,nodeName:``}),N=o.owner===e,P=o.targetNodeId,F=P?m.find(e=>e.id===P):void 0,I=e=>{s();let{x:i,y:o}=r._();g({title:a(e===`folder`?`createItem.folderTitle`:`createItem.fileTitle`),content:`createItem`,icon:e===`folder`?`📁`:`📄`,fcIcon:e===`folder`?`FcNewFolder`:`FcFile`,x:i,y:o,width:400,height:300,minWidth:350,minHeight:250,canMaximize:!1,alwaysOnTop:!0,contentData:{mode:e,parentId:t,currentPath:n}})},L=()=>{P&&F&&M({opened:!0,nodeId:P,nodeName:F.name}),s()},R=async e=>{if(e&&j.nodeId)try{await i.n.delete(j.nodeId),x(i.n.getAllNodes()),S()}catch(e){h({id:`delete-error-${Date.now()}`,title:a(`common:errors.deleteFailed`),message:e instanceof Error?e.message:`Unknown error`,fcIcon:`FcHighPriority`})}M({opened:!1,nodeId:null,nodeName:``})},z=()=>{F&&d([F]),s()},ee=()=>{F&&l([F]),s()},B=(e,t)=>m.find(n=>n.name===e&&n.parentId===t),V=async(e,t)=>{let n=await i.n.createFolder(e.name,t,e.iconName,e.iconColor),r=i.n.getChildren(e.id);for(let e of r)e.type===`folder`?await V(e,n.id):await i.n.createFile(e.name,e.content||``,n.id)},H=async(e,n)=>{if(t){if(f.action===`cut`)try{await i.n.move(e.id,t),x(i.n.getAllNodes()),S()}catch(e){h({id:`move-error-${Date.now()}`,title:`Move Failed`,message:e instanceof Error?e.message:`Unknown error`,fcIcon:`FcHighPriority`});return}else if(f.action===`copy`){if(e.type===`folder`){let r=B(e.name,t);r&&n&&await i.n.delete(r.id),(!r||n)&&(await V(e,t),x(i.n.getAllNodes()),S())}else if(e.type===`file`){let r=B(e.name,t);if(r&&n&&await i.n.delete(r.id),!r||n)try{await i.n.createFile(e.name,e.content||``,t),x(i.n.getAllNodes()),S()}catch(e){h({id:`create-error-${Date.now()}`,title:`Create File Failed`,message:e instanceof Error?e.message:`Unknown error`,fcIcon:`FcHighPriority`})}}}f.action===`cut`&&p()}},U=async()=>{if(f.content.length===0||!t)return;let e=f.content[0];B(e.name,t)?A({opened:!0,pending:{node:e,originalName:e.name}}):(await H(e,!1),s())},te=e=>{O.pending&&H(O.pending.node,e),A({opened:!1,pending:null}),s()},ne=f.content.length>0&&t!==null,W=f.content.length>1?a(`actions.pasteItems`,{count:f.content.length}):a(`actions.paste`),re=e=>{D(e),s()},ie=[{mode:`default`,icon:`FcDatabase`,label:a(`sort.default`)},{mode:`name-asc`,icon:`FcAlphabeticalSortingAz`,label:a(`sort.nameAsc`)},{mode:`name-desc`,icon:`FcAlphabeticalSortingZa`,label:a(`sort.nameDesc`)},{mode:`type`,icon:`FcFile`,label:a(`sort.byType`)}];return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(T.Menu,{opened:N,onClose:s,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,position:`bottom-start`,children:[(0,w.jsx)(Ht,{x:o.x,y:o.y}),(0,w.jsx)(T.Menu.Dropdown,{children:F?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(T.Menu.Label,{children:F.name}),(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(u.t,{name:`VscFiles`,size:14}),onClick:z,children:a(`actions.cut`)}),(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(u.t,{name:`VscClippy`,size:14}),onClick:ee,children:a(`actions.copy`)}),ne&&(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(u.t,{name:`VscCopy`,size:14}),onClick:U,children:W}),(0,w.jsx)(T.Menu.Divider,{}),(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(u.t,{name:`VscTrash`,size:14}),color:`red`,onClick:L,children:a(`actions.delete`)})]}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(u.t,{name:`VscNewFolder`,size:14}),onClick:()=>I(`folder`),children:a(`actions.createFolder`)}),(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(u.t,{name:`VscNewFile`,size:14}),onClick:()=>I(`file`),children:a(`actions.createFile`)}),ne&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(T.Menu.Divider,{}),(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(u.t,{name:`VscCopy`,size:14}),onClick:U,children:W})]}),e===`desktop`||e===`files`?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(T.Menu.Divider,{}),(0,w.jsx)(T.Menu.Label,{children:a(`sort.title`)}),ie.map(e=>(0,w.jsx)(T.Menu.Item,{leftSection:(0,w.jsx)(c.t,{fcIcon:e.icon,size:14}),onClick:()=>re(e.mode),style:E===e.mode?{fontWeight:600}:void 0,"data-testid":E===e.mode?`sort-option-selected`:void 0,children:e.label},e.mode))]}):null]})})]}),(0,w.jsxs)(T.Modal,{opened:O.opened,onClose:()=>te(!1),title:(0,w.jsx)(T.Text,{fw:600,children:a(`common:messages.replaceFile`)}),centered:!0,size:`sm`,children:[(0,w.jsx)(T.Text,{size:`sm`,mb:`md`,children:a(`common:messages.replaceFileMessage`,{name:O.pending?.originalName})}),(0,w.jsxs)(T.Group,{justify:`flex-end`,children:[(0,w.jsx)(T.Button,{variant:`default`,size:`sm`,onClick:()=>te(!1),leftSection:(0,w.jsx)(u.t,{name:`VscClose`,size:14}),children:a(`common:buttons.no`)}),(0,w.jsx)(T.Button,{size:`sm`,onClick:()=>te(!0),leftSection:(0,w.jsx)(u.t,{name:`VscCheck`,size:14}),children:a(`common:messages.yesReplace`)})]})]}),(0,w.jsxs)(T.Modal,{opened:j.opened,onClose:()=>R(!1),title:(0,w.jsx)(T.Text,{fw:600,children:a(`deleteConfirm.title`,{name:j.nodeName})}),centered:!0,size:`sm`,children:[(0,w.jsx)(T.Text,{size:`sm`,mb:`md`,children:a(`deleteConfirm.message`,{name:j.nodeName})}),(0,w.jsxs)(T.Group,{justify:`flex-end`,children:[(0,w.jsx)(T.Button,{variant:`default`,size:`sm`,onClick:()=>R(!1),leftSection:(0,w.jsx)(u.t,{name:`VscClose`,size:14}),children:a(`common:actions.cancel`)}),(0,w.jsx)(T.Button,{color:`red`,size:`sm`,onClick:()=>R(!0),leftSection:(0,w.jsx)(u.t,{name:`VscTrash`,size:14}),children:a(`common:actions.delete`)})]})]})]})},Wt={overlay:`_overlay_34o9z_1`,content:`_content_34o9z_12`,phoneIcon:`_phoneIcon_34o9z_22`,rotatePhone:`_rotatePhone_34o9z_1`,title:`_title_34o9z_50`,message:`_message_34o9z_54`,button:`_button_34o9z_58`},Gt=({onDismiss:e})=>{let{isPortrait:t,shouldShowWarning:n}=m.t();return!n||!t?null:(0,w.jsx)(`div`,{className:Wt.overlay,children:(0,w.jsxs)(`div`,{className:Wt.content,children:[(0,w.jsx)(`div`,{className:Wt.phoneIcon,children:(0,w.jsxs)(`svg`,{width:`64`,height:`64`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,children:[(0,w.jsx)(`rect`,{x:`5`,y:`2`,width:`14`,height:`20`,rx:`2`}),(0,w.jsx)(`line`,{x1:`12`,y1:`18`,x2:`12`,y2:`18.01`,strokeWidth:`2`,strokeLinecap:`round`})]})}),(0,w.jsx)(T.Text,{size:`lg`,fw:500,className:Wt.title,children:`Turn your device`}),(0,w.jsx)(T.Text,{size:`sm`,c:`dimmed`,className:Wt.message,children:`For a better experience use this app desktop OR horizontal mode`}),(0,w.jsx)(T.Button,{variant:`subtle`,onClick:e,className:Wt.button,children:`Continue vertically?`})]})})},Kt=()=>typeof window<`u`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`,qt=()=>{let e=t._(e=>e.applySystemTheme),n=t._(e=>e.themeSetManually);(0,C.useEffect)(()=>{if(typeof window>`u`)return;n||e(Kt());let r=window.matchMedia(`(prefers-color-scheme: dark)`),i=n=>{t._.getState().themeSetManually||e(n.matches?`dark`:`light`)};return r.addEventListener(`change`,i),()=>r.removeEventListener(`change`,i)},[e,n])},Jt=(e,t)=>{let n=e=>e.replace(/^v/,``).split(`.`).map(Number),r=n(e),i=n(t),a=Math.max(r.length,i.length);for(let e=0;e<a;e++){let t=r[e]??0,n=i[e]??0;if(t>n)return!0;if(t<n)return!1}return!1},Yt=`frannunpal/frannunpal.github.io`,Xt=`https://api.github.com/repos/${Yt}/releases/latest`,Zt=async()=>{let e=await fetch(Xt);if(!e.ok)throw Error(`GitHub API error: ${e.status}`);return e.json()},Qt=typeof __APP_VERSION__==`string`?__APP_VERSION__:`0.4.0`,$t=()=>`${Qt}-${typeof __PROD__==`boolean`&&__PROD__?`prod`:`dev`}-${typeof window<`u`&&window.__FDE_IN_DOCKER__?`docker`:`web`}`,en=()=>typeof __PROD__==`boolean`&&__PROD__?`prod`:`dev`,tn=()=>typeof window>`u`?`web`:window.__FDE_IN_DOCKER__?`docker`:/Electron/i.test(navigator.userAgent)?`electron`:`web`,nn=`fde-desktop:version`,rn=!1,an=()=>{let e=i.o(e=>e.mergeSeed),t=i.o(e=>e.mergeDesktopApps),n=i.o(e=>e.reorderDesktopApps),{notify:r}=f.t();(0,C.useEffect)(()=>{typeof window>`u`||rn||(rn=!0,i.K()?on(r):sn(e,t,n,r))},[e,t,n,r])},on=async e=>{try{let t=await Zt(),n=t.tag_name;if(!Jt(n,Qt))return;e(`Update ${n} available!`,`Click close to open the download page.`,{fcIcon:`FcEngineering`,onClose:()=>window.open(t.html_url,`_blank`)})}catch{rn=!1}},sn=async(e,t,n,r)=>{try{let a=localStorage.getItem(nn),o=a?JSON.parse(a):null,s=await fetch(i.g(`version.json`)).then(e=>e.json());if(o?.sha===s.sha)return;let c=await i.t();if(!c)return;e(c),t(i.ct),n(i.ct),localStorage.setItem(nn,JSON.stringify(s)),r(`New version available!`,`Close this notification to install it.`,{fcIcon:`FcEngineering`,onClose:()=>window.location.reload()})}catch{rn=!1}},cn=e=>`https://fonts.googleapis.com/css2?family=${e.replace(/\s+/g,`+`)}&display=swap`,ln=e=>{let n=t.f[e];if(!n||document.head.querySelector(`link[data-font="${e}"]`))return;let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=n,r.setAttribute(`data-font`,e),document.head.appendChild(r)},un=()=>{let e=t._(e=>e.font),n=t._(e=>e.fontSize),r=t._(e=>e.downloadedFonts);(0,C.useEffect)(()=>{r.forEach(e=>{t.f[e]||(t.f[e]=cn(e)),ln(e)})},[r]),(0,C.useEffect)(()=>{let i=t.u.map(e=>e.value).includes(e);!i&&r.includes(e)&&(t.f[e]||(t.f[e]=cn(e)),ln(e));let a;a=i?t.d[e]??t.d[`system-ui`]:r.includes(e)?`"${e}", sans-serif`:t.d[`system-ui`],document.documentElement.style.setProperty(`font-family`,a),document.documentElement.style.setProperty(`--mantine-font-family`,a),document.documentElement.style.setProperty(`font-size`,`${n}px`)},[e,n,r])};function dn(){let{i18n:e}=(0,k.useTranslation)(),n=t._(e=>e.language);(0,C.useEffect)(()=>{n&&e.language!==n&&(e.changeLanguage(n),localStorage.setItem(`fde-desktop:language`,n))},[n,e]),(0,C.useEffect)(()=>{let e=localStorage.getItem(`fde-desktop:language`);n&&!e&&localStorage.setItem(`fde-desktop:language`,n)},[n])}var fn=`fran-desktop`,pn=`fde-desktop`,mn=1,hn=`fde-desktop:migration-version`,gn=!1,_n=null;async function vn(e,t){return new Promise(n=>{let r=indexedDB.open(e);r.onerror=()=>{n(!1)},r.onsuccess=async()=>{let i=r.result,a=Array.from(i.objectStoreNames);if(a.length===0){i.close(),n(!1);return}let o=indexedDB.open(t,i.version);o.onerror=()=>{i.close(),n(!1)},o.onupgradeneeded=e=>{let t=e.target.result;for(let e of a)t.objectStoreNames.contains(e)||t.createObjectStore(e)},o.onsuccess=async()=>{let t=o.result;try{for(let e of a){let n=i.transaction(e,`readonly`).objectStore(e).getAll();await new Promise((r,i)=>{n.onsuccess=()=>{let a=n.result;if(a&&a.length>0){let n=t.transaction(e,`readwrite`),o=n.objectStore(e);for(let e of a)o.put(e);n.oncomplete=()=>r(),n.onerror=()=>i(n.error)}else r()},n.onerror=()=>i(n.error)})}i.close(),t.close(),await new Promise(t=>{let n=indexedDB.deleteDatabase(e);n.onsuccess=()=>t(),n.onerror=()=>t()}),n(!0)}catch{i.close(),t.close(),n(!1)}}}})}function yn(){let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&(n===fn||n.startsWith(`${fn}:`))&&e.push(n)}for(let t of e){let e=t.replace(fn,pn),n=localStorage.getItem(t);n!==null&&(localStorage.getItem(e)===null&&localStorage.setItem(e,n),localStorage.removeItem(t))}return{keysMigrated:e.length}}async function bn(){return gn?{indexedDB:{fs:!1,blobs:!1},localStorage:{keysMigrated:0},version:mn}:_n||(_n=(async()=>{if(console.log(`[Migration] Starting storage migration...`),localStorage.getItem(hn)===String(mn))return console.log(`[Migration] Already migrated, skipping.`),gn=!0,{indexedDB:{fs:!1,blobs:!1},localStorage:{keysMigrated:0},version:mn};let e=!1,t=!1;try{e=await vn(`fran-desktop-fs`,`fde-desktop-fs`),e&&console.log(`[Migration] Migrated IndexedDB: fran-desktop-fs → fde-desktop-fs`)}catch(e){console.warn(`[Migration] Failed to migrate fran-desktop-fs:`,e)}try{t=await vn(`fran-desktop-blobs`,`fde-desktop-blobs`),t&&console.log(`[Migration] Migrated IndexedDB: fran-desktop-blobs → fde-desktop-blobs`)}catch(e){console.warn(`[Migration] Failed to migrate fran-desktop-blobs:`,e)}let{keysMigrated:n}=yn();return n>0&&console.log(`[Migration] Migrated ${n} localStorage keys`),localStorage.setItem(hn,String(mn)),console.log(`[Migration] Storage migration complete.`),gn=!0,{indexedDB:{fs:e,blobs:t},localStorage:{keysMigrated:n},version:mn}})(),_n)}var xn=[],Sn=!1;function Cn(){if(xn.length===0){Sn=!1;return}Sn=!0;let e=xn.shift();e&&e.loader().catch(()=>{}).finally(()=>{`requestIdleCallback`in window?requestIdleCallback(Cn,{timeout:2e3}):setTimeout(Cn,100)})}function wn(e,t){xn.some(t=>t.id===e)||(xn.push({id:e,loader:t}),Tn())}function Tn(){Sn||(`requestIdleCallback`in window?requestIdleCallback(Cn,{timeout:2e3}):setTimeout(Cn,100))}function En(e){e.forEach(e=>{wn(e.id,e.loader)})}var Dn=null,On=new Map;function kn(){let{windows:e}=i.o.getState(),t=e.filter(e=>e.isOpen&&e.state!==`minimized`);return t.length===0?null:t.reduce((e,t)=>t.zIndex>(e?.zIndex??-1)?t:e,null)?.id??null}function X(e,t){let n=On.get(e);n&&n.forEach(n=>{try{n(t)}catch(t){console.error(`[FdeApi] Error in subscriber for ${e}:`,t)}})}var An={width:800,height:600},jn={x:100,y:100};function Mn(){if(Dn){console.warn(`[FdeApi] Already initialized`);return}Dn={openApp:(e,t)=>{let n=i.o.getState().openWindow,r=i.st.find(t=>t.id===e);n({content:e,title:t?.title??r?.name??e,icon:t?.icon??r?.icon??`📦`,fcIcon:r?.fcIcon,iconUrl:r?.iconUrl,iconColor:r?.iconColor,width:t?.size?.width??r?.defaultWidth??An.width,height:t?.size?.height??r?.defaultHeight??An.height,x:t?.position?.x??jn.x,y:t?.position?.y??jn.y,minWidth:r?.minWidth===!1?void 0:r?.minWidth,minHeight:r?.minHeight===!1?void 0:r?.minHeight,canMaximize:r?.canMaximize??!0,alwaysOnTop:r?.alwaysOnTop??!1,contentData:t?.contentData}),X(`window-opened`,{windowId:i.o.getState().windows[i.o.getState().windows.length-1]?.id??``,content:e})},closeWindow:e=>{let t=e??kn();t&&(i.o.getState().closeWindow(t),X(`window-closed`,{windowId:t}))},minimizeWindow:e=>{let t=e??kn();t&&(i.o.getState().minimizeWindow(t),X(`window-minimized`,{windowId:t}))},maximizeWindow:e=>{let t=e??kn();t&&(i.o.getState().maximizeWindow(t),X(`window-maximized`,{windowId:t}))},restoreWindow:e=>{let t=e??kn();t&&i.o.getState().restoreWindow(t)},focusWindow:e=>{let t=e??kn();t&&(i.o.getState().focusWindow(t),X(`window-focused`,{windowId:t}))},openFile:(e,t)=>{i.o.getState().openWindow({content:`files`,contentData:{initialPath:e},title:`Files`,icon:`📁`,fcIcon:`FcOpenedFolder`,width:An.width,height:An.height,x:jn.x,y:jn.y}),X(`file-opened`,{path:e,appId:t})},openFileDialog:async()=>(console.warn(`[FdeApi] openFileDialog not yet implemented`),null),saveFile:async()=>(console.warn(`[FdeApi] saveFile not yet implemented`),!1),saveFileDialog:async()=>(console.warn(`[FdeApi] saveFileDialog not yet implemented`),null),getTheme:()=>t._.getState().theme,setTheme:e=>{let n=e;n.taskbar&&n.window&&n.accent&&(t._.getState().setCustomThemeColors(n),X(`theme-changed`,{theme:JSON.stringify(e)}))},showNotification:e=>{let t=i.ot();return i.o.getState().addNotification({id:t,title:e.title,message:e.message,fcIcon:e.type===`error`?`FcCancel`:e.type===`success`?`FcCheckmark`:`FcInfo`}),X(`notification-shown`,{notificationId:t}),t},hideNotification:e=>{i.o.getState().removeNotification(e)},getWindows:()=>i.o.getState().windows,getActiveWindow:()=>{let e=i.o.getState().windows,t=kn();return t?e.find(e=>e.id===t)??null:null},getWindowById:e=>i.o.getState().windows.find(t=>t.id===e)??null,on:(e,t)=>(On.has(e)||On.set(e,new Set),On.get(e).add(t),()=>{On.get(e)?.delete(t)}),off:(e,t)=>{On.get(e)?.delete(t)},fs:i.n,appReady:e=>{i.v.getState().setAppReady(e)},registerAppInstance:(e,t)=>{i.v.getState().setAppReady(e,t)}},window.__FDE_API__=Dn,console.log(`[FdeApi] Initialized`)}function Nn(){if(!Dn)throw Error(`[FdeApi] API not initialized. Call initializeFdeApi() first.`);return Dn}function Pn(){return Dn!==null}var Fn=new E.QueryClient({defaultOptions:{queries:{staleTime:1/0,gcTime:1/0}}}),In=!1;function Ln({defaultWallpaper:e,initialApp:a,prefetchLoaders:o}){let s=t._(e=>e.wallpaper),c=t._(e=>e.wallpaperModule),l=n.t(s??void 0),u=c===`gradient`?s??void 0:l??e??n.r,d=i.o(e=>e.windows),p=i.o(e=>e.icons),h=i.o(e=>e.initFs),g=i.o(e=>e.isFsReady),_=i.o(e=>e.fsNodes),v=i.o(e=>e.openContextMenu),y=i.o(e=>e.filesCurrentFolderId),b=i.o(e=>e.desktopFolderId),x=r.t(),{shouldShowWarning:S}=m.t(),{notify:T}=f.t(),[E,D]=(0,C.useState)(!1);qt(),an(),un(),dn(),At(),(0,C.useEffect)(()=>{Pn()||Mn()},[]),(0,C.useEffect)(()=>{if(!g)return;let e=document.getElementById(`initial-loader`);e&&(e.classList.add(`hidden`),setTimeout(()=>e.remove(),200))},[g]),(0,C.useEffect)(()=>{if(!o?.length)return;let e=setTimeout(()=>{En(o)},3e3);return()=>clearTimeout(e)},[o]),(0,C.useEffect)(()=>{In||(In=!0,bn().finally(()=>{h(),a&&x(a)}))},[h,x,a]);let k=(0,C.useCallback)(e=>{e.preventDefault(),v(e.clientX,e.clientY,`desktop`)},[v]),A=(0,C.useCallback)((e,t)=>{e.preventDefault(),e.stopPropagation(),v(e.clientX,e.clientY,`desktop`,t)},[v]),j=(0,C.useCallback)((e,t)=>{let n;if(t){let r=_.find(e=>e.id===t);if(r?.type===`folder`)n={initialFolderId:t};else if(r?.type===`file`){let t=i.x(r);if(!t){T(`Unsupported file type`,`The type of file you are trying to open is not supported currently`,{fcIcon:`FcDeleteRow`});return}t.appId!==e&&T(`File type mismatch`,`Opening "${r.name}" as ${t.appId} instead of ${e}`,{fcIcon:`FcDeleteRow`}),x(t.appId,{contentData:t.contentData});return}}x(e,{contentData:n})},[x,_,T]);return g?(0,w.jsxs)(w.Fragment,{children:[S&&!E&&(0,w.jsx)(Gt,{onDismiss:()=>D(!0)}),(0,w.jsxs)(de,{wallpaper:u,wallpaperModule:c,onContextMenu:k,children:[p.map(e=>(0,w.jsx)(Vt,{icon:e,onDoubleClick:j,onContextMenu:A},e.id)),(0,w.jsx)(O.AnimatePresence,{children:d.map(e=>(0,w.jsx)(zt,{window:e},e.id))})]}),(0,w.jsx)(rt,{}),(0,w.jsx)(Ut,{owner:`desktop`,parentId:b,currentPath:`/home`}),(0,w.jsx)(Ut,{owner:`files`,parentId:y,currentPath:(()=>{let e=[`/home`],t=y,n=[];for(;t!==null;){let e=_.find(e=>e.id===t);if(!e)break;n.unshift(e.name),t=e.parentId}return[...e,...n].join(`/`)})()})]}):null}function Rn({children:e,isReady:n,error:r,defaultWallpaper:i,initialApp:a,prefetchLoaders:o}){let s=U(),c=t._(e=>e.setThemeMode),l=t._(e=>e.toggleTheme),u=(0,C.useMemo)(()=>({fs:null,isReady:n,error:r,theme:s,setThemeMode:c,toggleTheme:l}),[n,r,s,c,l]);return e?(0,w.jsx)(ce,{children:(0,w.jsx)(W.Provider,{value:u,children:e})}):(0,w.jsx)(ce,{children:(0,w.jsx)(W.Provider,{value:u,children:(0,w.jsx)(Ln,{defaultWallpaper:i,initialApp:a,prefetchLoaders:o})})})}function zn({children:e,fallback:n=null,theme:a,mantineTheme:o,fileSystem:s,initialMode:c,customApps:l,appEntries:u,onError:d,defaultWallpaper:f,initialApp:p,prefetchLoaders:m,queryClient:h=Fn}){let[g,_]=(0,C.useState)(!1),[v,y]=(0,C.useState)(null),b=t._(e=>e.theme.mode),[x]=(0,C.useState)(c),S=x??b;(0,C.useEffect)(()=>{let e=!0;return(async()=>{try{if(r.T(),u&&i.lt(u),l){let e={...l};if(u)for(let t of u){let n=e[t.id];n&&(e[t.id]={...n,appName:n.appName??t.name,singleWindow:n.singleWindow??t.singleWindow,defaultWidth:n.defaultWidth??t.defaultWidth,defaultHeight:n.defaultHeight??t.defaultHeight,minWidth:n.minWidth??t.minWidth,minHeight:n.minHeight??t.minHeight,canMaximize:n.canMaximize??t.canMaximize,alwaysOnTop:n.alwaysOnTop??t.alwaysOnTop,icon:n.icon??t.icon,fcIcon:n.fcIcon??t.fcIcon,iconUrl:n.iconUrl??t.iconUrl,iconColor:n.iconColor??t.iconColor})}r.O(e)}}catch(e){console.error(`[FdeDesktop] Failed to initialize core registry:`,e)}if(!s){e&&_(!0);return}try{await s.initialize(),e&&_(!0)}catch(t){let n=t instanceof Error?t:Error(String(t));e&&(y(n),d?.(n))}})(),()=>{e=!1}},[s,u,l,d]);let D=(0,C.useMemo)(()=>(0,T.createTheme)({...ne,...o}),[o]);return v||!g?(0,w.jsx)(w.Fragment,{children:n}):(0,w.jsx)(E.QueryClientProvider,{client:h,children:(0,w.jsx)(T.MantineProvider,{theme:D,forceColorScheme:S,children:(0,w.jsx)(H,{mode:S,theme:a,children:(0,w.jsx)(Rn,{isReady:g,error:v,defaultWallpaper:f,initialApp:p,prefetchLoaders:m,children:e})})})})}var Bn=({component:e,windowId:t,contentData:n,onExit:r})=>e?(0,w.jsx)(e,{windowId:t,contentData:n,onExit:r}):null,Vn=i.st.filter(e=>e.id!==`settings`),Hn=({opened:e,position:t,onClose:n,onOpenApp:r,onToggleTheme:i})=>(0,w.jsxs)(T.Menu,{opened:e,onClose:n,closeOnClickOutside:!0,closeOnEscape:!0,closeOnItemClick:!0,withinPortal:!0,children:[(0,w.jsx)(Ht,{x:t.x,y:t.y}),(0,w.jsxs)(T.Menu.Dropdown,{children:[Vn.map(e=>(0,w.jsxs)(T.Menu.Item,{onClick:()=>r(e.id),children:[`Open `,e.name]},e.id)),(0,w.jsx)(T.Menu.Divider,{}),(0,w.jsx)(T.Menu.Item,{onClick:i,children:`Toggle Theme`})]})]}),Un={frame:`_frame_13ufi_1`},Wn=`https://frannunpal.github.io/storybook/`,Gn=()=>(0,w.jsx)(`iframe`,{src:Wn,className:Un.frame,title:`Storybook`,"aria-label":`Storybook component explorer`}),Z={scrollback:5e3,shell:`/bin/zsh`},Kn=(0,D.create)((e,t)=>({states:{},getScrollback:e=>t().states[e]?.scrollback??Z.scrollback,getShell:e=>t().states[e]?.shell??Z.shell,setScrollback:(t,n)=>e(e=>({states:{...e.states,[t]:{...e.states[t]??Z,scrollback:n}}})),setShell:(t,n)=>e(e=>({states:{...e.states,[t]:{...e.states[t]??Z,shell:n}}})),reset:t=>e(e=>({states:{...e.states,[t]:{...Z}}}))})),qn=e=>Kn(t=>t.states[e]?.scrollback??Z.scrollback),Jn=e=>Kn(t=>t.states[e]?.shell??Z.shell),Q={terminalContainer:`_terminalContainer_15s96_1`,terminalWrapper:`_terminalWrapper_15s96_9`,terminal:`_terminal_15s96_1`,statusBar:`_statusBar_15s96_33`,statusIndicator:`_statusIndicator_15s96_45`,statusText:`_statusText_15s96_70`,reconnectButton:`_reconnectButton_15s96_74`},Yn=5,Xn=1e3,Zn=({shell:e,scrollback:t,onTerminalReady:n,onConnectionChange:r})=>{let i=(0,C.useRef)(null),a=(0,C.useRef)(null),o=(0,C.useRef)(null),s=(0,C.useRef)(null),c=(0,C.useRef)(null),l=(0,C.useRef)(0),u=(0,C.useRef)(!1),d=(0,C.useRef)(!1),f=(0,C.useRef)(e),p=(0,C.useRef)(null),m=(0,C.useRef)(!1),[h,g]=(0,C.useState)(`idle`),[_,v]=(0,C.useState)(!1),y=(0,C.useRef)(n),b=(0,C.useRef)(r);(0,C.useEffect)(()=>{y.current=n},[n]),(0,C.useEffect)(()=>{b.current=r},[r]),(0,C.useEffect)(()=>{f.current=e},[e]);let x=(0,C.useCallback)(e=>{u.current&&(g(e),b.current?.(e))},[]),S=(0,C.useCallback)(()=>{p.current?.abort(),p.current=null;let e=c.current;if(e&&(c.current=null,e.readyState===WebSocket.OPEN||e.readyState===WebSocket.CONNECTING)){try{e.send(JSON.stringify({type:`kill`}))}catch{}e.close()}d.current=!1},[]),T=(0,C.useCallback)(()=>{if(!u.current||d.current||c.current?.readyState===WebSocket.OPEN)return;d.current=!0;let e=new AbortController;p.current=e;let t=`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/api/pty`;console.log(`[XTermTerminal] Connecting (attempt ${l.current+1}/${Yn})`),x(`connecting`);let n=new WebSocket(t);c.current=n,n.onopen=()=>{u.current&&console.log(`[XTermTerminal] WebSocket opened`)},n.onmessage=e=>{if(u.current&&typeof e.data==`string`)try{let t=JSON.parse(e.data);switch(t.type){case`ready`:console.log(`[XTermTerminal] Server ready, sending start`),n.send(JSON.stringify({type:`start`,shell:f.current,cwd:`/app/workspace`,cols:a.current?.cols||80,rows:a.current?.rows||24}));break;case`started`:console.log(`[XTermTerminal] PTY started`),l.current=0,d.current=!1,v(!1),x(`connected`);break;case`exit`:console.log(`[XTermTerminal] PTY exited:`,t.code),c.current=null,d.current=!1,x(`disconnected`),v(!0);break;case`error`:console.error(`[XTermTerminal] Server error:`,t.message),d.current=!1,x(`error`),v(!0);break}}catch{a.current&&a.current.write(e.data)}},n.onclose=()=>{if(!(!u.current||e.signal.aborted))if(console.log(`[XTermTerminal] WebSocket closed`),c.current=null,d.current=!1,l.current<Yn){l.current++;let t=Xn*2**(l.current-1);console.log(`[XTermTerminal] Retrying in ${t}ms`),setTimeout(()=>{u.current&&!c.current&&!e.signal.aborted&&T()},t)}else x(`disconnected`),v(!0)},n.onerror=()=>{u.current&&(console.error(`[XTermTerminal] WebSocket error`),d.current=!1,n.close(),x(`error`),v(!0))}},[x]);(0,C.useEffect)(()=>{if(m.current||(m.current=!0,u.current=!0,!i.current))return;let e=new F.Terminal({fontFamily:`'Operator Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace`,fontSize:14,theme:{background:`#1e1e1e`,foreground:`#d4d4d4`,cursor:`#ffffff`,selectionBackground:`#264f78`},cursorStyle:`underline`,cursorBlink:!0,scrollback:t}),n=new I.FitAddon,r=new L.ClipboardAddon;return e.loadAddon(n),e.loadAddon(r),e.open(i.current),n.fit(),a.current=e,o.current=n,s.current=r,e.onData(e=>{c.current?.readyState===WebSocket.OPEN&&c.current.send(JSON.stringify({type:`input`,data:e}))}),e.onResize(({cols:e,rows:t})=>{c.current?.readyState===WebSocket.OPEN&&c.current.send(JSON.stringify({type:`resize`,cols:e,rows:t}))}),y.current?.({clear:()=>e.clear(),reset:()=>e.reset(),write:t=>e.write(t),copy:async()=>{let t=e.getSelection();if(console.log(`[XTermTerminal] Copy called, selection length:`,t?.length??0),!t){console.log(`[XTermTerminal] No selection to copy`);return}try{if(!navigator.clipboard){console.warn(`[XTermTerminal] Clipboard API not available (non-secure context?)`),Qn(t);return}await navigator.clipboard.writeText(t),console.log(`[XTermTerminal] Copied to clipboard successfully`)}catch(e){console.error(`[XTermTerminal] Clipboard write failed:`,e),Qn(t)}},paste:async()=>{console.log(`[XTermTerminal] Paste called`);try{if(!navigator.clipboard){console.warn(`[XTermTerminal] Clipboard API not available`);return}let t=await navigator.clipboard.readText();console.log(`[XTermTerminal] Paste text length:`,t.length),e.paste(t)}catch(e){console.error(`[XTermTerminal] Paste failed:`,e)}},reconnect:E}),requestAnimationFrame(()=>{u.current&&T()}),()=>{console.log(`[XTermTerminal] Cleanup`),u.current=!1,p.current?.abort(),p.current=null,a.current&&a.current.clear(),S(),e.dispose(),a.current=null,o.current=null}},[]);let E=(0,C.useCallback)(()=>{console.log(`[XTermTerminal] Reconnect triggered`),l.current=0,v(!1),S(),setTimeout(()=>T(),100)},[S,T]);return(0,C.useEffect)(()=>{a.current&&(a.current.options.scrollback=t)},[t]),(0,C.useEffect)(()=>{if(!i.current)return;let e=new ResizeObserver(()=>{o.current?.fit()});return e.observe(i.current),()=>e.disconnect()},[]),(0,w.jsxs)(`div`,{className:Q.terminalContainer,children:[(0,w.jsx)(`div`,{className:Q.terminalWrapper,children:(0,w.jsx)(`div`,{ref:i,className:Q.terminal,"data-testid":`xterm-terminal`})}),(0,w.jsxs)(`div`,{className:Q.statusBar,children:[(0,w.jsxs)(`span`,{className:Q.statusIndicator,"data-status":h,children:[h===`idle`&&`○`,h===`connecting`&&`●`,h===`connected`&&`●`,h===`disconnected`&&`○`,h===`error`&&`●`]}),(0,w.jsxs)(`span`,{className:Q.statusText,children:[h===`idle`&&`Idle`,h===`connecting`&&`Connecting...`,h===`connected`&&`Connected`,h===`disconnected`&&`Disconnected`,h===`error`&&`Error`]}),_&&(0,w.jsx)(`button`,{onClick:E,className:Q.reconnectButton,children:`Reconnect`})]})]})};function Qn(e){let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.left=`-9999px`,t.style.opacity=`0`,document.body.appendChild(t),t.select(),t.setSelectionRange(0,e.length);try{let e=document.execCommand(`copy`);console.log(`[XTermTerminal] Fallback copy result:`,e?`success`:`failed`)}catch(e){console.error(`[XTermTerminal] Fallback copy failed:`,e)}finally{document.body.removeChild(t)}}var $n=()=>{let{t:e}=(0,k.useTranslation)(`apps`);return(0,w.jsx)(T.Center,{"data-testid":`terminal-not-supported`,style:{width:`100%`,height:`100%`},children:(0,w.jsxs)(T.Stack,{align:`center`,gap:`lg`,p:`xl`,maw:400,children:[(0,w.jsx)(T.Text,{size:`3rem`,children:(0,w.jsx)(P.FcInfo,{})}),(0,w.jsx)(T.Text,{size:`lg`,fw:700,ta:`center`,children:e(`terminal.notAvailable`)}),(0,w.jsx)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:e(`terminal.notAvailableMessage`)}),(0,w.jsx)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:e(`terminal.dockerRequired`)})]})})},er=({window:e,notifyReady:t})=>{let n=e,r=n?.id??``,a=i.H(),o=qn(r),s=Jn(r),{setScrollback:c,setShell:l,reset:u}=Kn(),d=(0,C.useRef)(null),f=(0,C.useRef)(!1),p=(0,C.useRef)(!1),[m,h]=(0,C.useState)(`idle`),[g,_]=(0,C.useState)(null);(0,C.useEffect)(()=>{a!==`docker`||p.current||(p.current=!0,(async()=>{try{let e=await fetch(`/api/shell`);if(e.ok){let t=await e.json();_(t),(!s||s===`/bin/zsh`)&&l(r,t.default)}}catch(e){console.error(`[TerminalApp] Failed to fetch shell info:`,e),s||l(r,`/bin/zsh`)}})())},[a,s,l,r]),(0,C.useEffect)(()=>{u(r)},[r,u]);let v=(0,C.useCallback)(e=>{d.current=e},[]),y=(0,C.useCallback)(e=>{h(e)},[]);return(0,C.useEffect)(()=>{!f.current&&t&&(f.current=!0,t({...n?.contentData??{},clear:()=>d.current?.clear(),reset:()=>d.current?.reset(),copy:()=>d.current?.copy(),paste:()=>d.current?.paste(),reconnect:()=>d.current?.reconnect(),setScrollback:e=>c(r,e),setShell:e=>l(r,e),connectionStatus:m}))},[t,c,l,r,n?.contentData,m]),(0,C.useEffect)(()=>{f.current&&t&&t({...n?.contentData??{},connectionStatus:m})},[m,t,n?.contentData]),a===`docker`?(0,w.jsx)(Zn,{shell:s||g?.default||`/bin/zsh`,scrollback:o,onTerminalReady:v,onConnectionChange:y}):(0,w.jsx)($n,{})},tr=()=>{let{t:e}=(0,k.useTranslation)(`apps`);return(0,w.jsx)(T.Center,{"data-testid":`code-server-not-supported`,style:{width:`100%`,height:`100%`},children:(0,w.jsxs)(T.Stack,{align:`center`,gap:`lg`,p:`xl`,maw:400,children:[(0,w.jsx)(T.Text,{size:`3rem`,children:(0,w.jsx)(P.FcInfo,{})}),(0,w.jsx)(T.Text,{size:`lg`,fw:700,ta:`center`,children:e(`codeServer.notAvailable`)}),(0,w.jsx)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:e(`codeServer.notAvailableMessage`)}),(0,w.jsx)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:e(`codeServer.dockerRequired`)})]})})},$={container:`_container_1ypq1_1`,loading:`_loading_1ypq1_9`,spinner:`_spinner_1ypq1_19`,spin:`_spin_1ypq1_19`,error:`_error_1ypq1_39`,retryButton:`_retryButton_1ypq1_63`,iframe:`_iframe_1ypq1_79`},nr=({window:e,notifyReady:t})=>{let n=e,[r,i]=(0,C.useState)({status:`idle`,url:null,error:null}),a=(0,C.useRef)(!1),o=(0,C.useRef)(!1),s=(0,C.useCallback)(async()=>{if(!o.current){o.current=!0,i(e=>({...e,status:`starting`,error:null}));try{let e=await(await fetch(`/api/code-server/start`,{method:`POST`})).json();e.success&&e.url?i({status:`running`,url:e.url,error:null}):i({status:`error`,url:null,error:e.error||`Failed to start code-server`})}catch(e){i({status:`error`,url:null,error:e instanceof Error?e.message:`Failed to start code-server`})}finally{o.current=!1}}},[]),c=(0,C.useCallback)(async()=>{try{await fetch(`/api/code-server/stop`,{method:`POST`})}catch(e){console.error(`[CodeServerApp] Error stopping code-server:`,e)}},[]);return(0,C.useEffect)(()=>(s(),()=>{c()}),[s,c]),(0,C.useEffect)(()=>{!a.current&&t&&(a.current=!0,t({...n?.contentData??{},status:r.status,restart:s}))},[t,r.status,s,n?.contentData]),(0,C.useEffect)(()=>{a.current&&t&&t({...n?.contentData??{},status:r.status})},[r.status,t,n?.contentData]),r.status===`idle`||r.status===`starting`?(0,w.jsx)(`div`,{className:$.container,children:(0,w.jsxs)(`div`,{className:$.loading,children:[(0,w.jsx)(`div`,{className:$.spinner}),(0,w.jsx)(`p`,{children:`Starting VS Code...`})]})}):r.status===`error`?(0,w.jsx)(`div`,{className:$.container,children:(0,w.jsxs)(`div`,{className:$.error,children:[(0,w.jsx)(`h3`,{children:`Failed to start VS Code`}),(0,w.jsx)(`p`,{children:r.error}),(0,w.jsx)(`button`,{onClick:s,className:$.retryButton,children:`Retry`})]})}):(0,w.jsx)(`div`,{className:$.container,children:(0,w.jsx)(`iframe`,{src:r.url||``,className:$.iframe,title:`VS Code`,allow:`clipboard-read; clipboard-write`})})},rr=e=>i.G()?(0,w.jsx)(nr,{...e}):(0,w.jsx)(tr,{}),ir=[{value:`/bin/sh`,label:`sh`},{value:`/bin/zsh`,label:`zsh`}];function ar(e){let{windowId:t,onExit:n,clear:r,reset:i,copy:a,paste:o,reconnect:s,connectionStatus:c=`idle`}=e,{t:l}=(0,k.useTranslation)(`common`),{t:u}=(0,k.useTranslation)(`apps`),d=qn(t),f=Jn(t),p=Kn(e=>e.setScrollback),m=Kn(e=>e.setShell),h=(0,C.useCallback)(e=>p(t,e),[t,p]),g=(0,C.useCallback)(e=>m(t,e),[t,m]),_=c===`connected`;return(0,C.useMemo)(()=>{let e=[{type:`item`,label:u(`terminal.menu.copy`),icon:`FcCopy`,onClick:a??(()=>{}),disabled:!_},{type:`item`,label:u(`terminal.menu.paste`),icon:`FcPaste`,onClick:o??(()=>{}),disabled:!_},{type:`divider`},{type:`item`,label:u(`terminal.menu.clear`),icon:`FcClear`,onClick:r??(()=>{}),disabled:!_},{type:`item`,label:u(`terminal.menu.reset`),icon:`FcSynchronize`,onClick:i??(()=>{}),disabled:!_}];return!_&&s&&(e.push({type:`divider`}),e.push({type:`item`,label:u(`terminal.menu.reconnect`),icon:`FcSynchronize`,onClick:s})),e.push({type:`divider`}),e.push({type:`item`,label:l(`actions.exit`),icon:`FcLeave`,onClick:n}),[{type:`menu`,label:l(`menu.edit`),items:e},{type:`number-input`,label:u(`terminal.scrollback`),value:d,onChange:h,min:100,max:5e4,step:100,placeholder:`5000`},{type:`select`,label:u(`terminal.shell`),options:ir,value:f,onChange:g}]},[l,u,n,r,i,a,o,s,_,d,f,h,g])}var or=(0,C.memo)(({windowId:e,contentData:t,onExit:n})=>(0,w.jsx)(d.t,{elements:ar({windowId:e,onExit:n,clear:t?.clear,reset:t?.reset,copy:t?.copy,paste:t?.paste,reconnect:t?.reconnect,connectionStatus:t?.connectionStatus})}));or.displayName=`TerminalMenuBar`;var sr={container:`_container_1br66_1`},cr=({notifyReady:e,window:t,config:n})=>{let r=(0,C.useRef)(!1),i=`${n.title} blocks embedding in iframes for security reasons.`;(0,C.useEffect)(()=>{r.current||(r.current=!0,e?.({...t?.contentData??{},openInBrowser:()=>{globalThis.window.open(n.url,`_blank`,`noopener,noreferrer`)}}))},[e,t,n.url]);let o=()=>{globalThis.window.open(n.url,`_blank`,`noopener,noreferrer`)},s=a.o(n.icon,{size:48,color:n.iconColor}),c=a.o(n.icon,{size:16,color:n.iconColor});return(0,w.jsx)(T.Center,{className:sr.container,children:(0,w.jsxs)(T.Stack,{align:`center`,gap:`md`,children:[s,(0,w.jsx)(T.Text,{size:`lg`,fw:500,children:n.title}),(0,w.jsxs)(T.Text,{size:`sm`,c:`dimmed`,ta:`center`,children:[n.description??i,(0,w.jsx)(`br`,{}),`Click below to go to my `,n.title,` profile.`]}),(0,w.jsx)(T.Button,{leftSection:c,onClick:o,children:n.buttonLabel})]})})},lr=(e=0,t)=>{let[n,r]=(0,C.useState)(!1),[a,o]=(0,C.useState)({x:0,y:0});return{opened:n,position:a,open:(0,C.useCallback)((n,a)=>{if(n.preventDefault(),t&&!i.st.find(e=>e.id===t)?.hasContextMenu){n.stopPropagation();return}o({x:n.clientX,y:n.clientY+(a??e)}),r(!0)},[e,t]),close:(0,C.useCallback)(()=>r(!1),[])}};function ur({snapshotRef:t,getCurrentState:n,initialSnapshot:r,onChange:i,appId:a}){let[o,s]=(0,C.useState)(!1),c=(0,C.useRef)(i);return(0,C.useEffect)(()=>{c.current=i},[i]),(0,C.useEffect)(()=>{if(t.current===null){if(a){let n=e.t.getState().getSnapshot(a);if(n!==null){t.current=n;return}}r!==void 0&&(t.current=r)}},[t,r,a]),(0,C.useEffect)(()=>{let e=n();if(t.current===null)return;let r=JSON.stringify(e)!==JSON.stringify(t.current);s(r),c.current&&c.current(r)},[n,t]),{isDirty:o,takeSnapshot:(0,C.useCallback)(()=>{let r=n();t.current=r,s(!1),a&&e.t.getState().setSnapshot(a,r),c.current&&c.current(!1)},[t,n,a]),reset:(0,C.useCallback)(()=>{s(!1),c.current&&c.current(!1)},[])}}function dr(){return(0,C.useMemo)(()=>Pn()?Nn():(console.warn(`[useFdeApi] API not initialized. Make sure initializeFdeApi() is called.`),null),[])}var fr={status:`idle`,loaded:0,total:null,percent:null,error:null},pr=()=>{let[e,t]=(0,C.useState)(fr),n=(0,C.useCallback)(()=>t(fr),[]),r=(0,C.useCallback)(async e=>{t({status:`downloading`,loaded:0,total:null,percent:null,error:null});try{let n=await fetch(e);if(!n.ok)return t(e=>({...e,status:`error`,error:`HTTP ${n.status}: ${n.statusText}`})),null;let r=n.headers.get(`Content-Length`),i=r?parseInt(r,10):null;if(!n.body){let e=await n.text();return t({status:`done`,loaded:e.length,total:e.length,percent:100,error:null}),e}let a=n.body.getReader(),o=[],s=0;for(;;){let{done:e,value:n}=await a.read();if(e)break;o.push(n),s+=n.byteLength;let r=i?Math.round(s/i*100):null;t({status:`downloading`,loaded:s,total:i,percent:r,error:null})}let c=new Uint8Array(s),l=0;for(let e of o)c.set(e,l),l+=e.byteLength;let u=new TextDecoder().decode(c);return t({status:`done`,loaded:s,total:i??s,percent:100,error:null}),u}catch(e){let n=e instanceof Error?e.message:`Unknown error`;return t(e=>({...e,status:`error`,error:n})),null}},[]);return{...e,download:r,reset:n}},mr={light:{mode:`light`,desktop:`#f0f4f8`,taskbar:`rgba(255, 255, 255, 0.9)`,window:`#ffffff`,accent:`#339af0`},dark:{mode:`dark`,desktop:`#1a1b1e`,taskbar:`rgba(26, 27, 30, 0.9)`,window:`#25262b`,accent:`#4dabf7`}},hr=e=>({primaryColor:`blue`,other:{desktop:e.desktop,taskbar:e.taskbar,window:e.window,accent:e.accent}});exports.ANIMATION_DURATION=r.n,exports.APPS=i.st,exports.APP_IDS=G,exports.APP_ID_TO_TRANSLATION_KEY=ve,exports.APP_VERSION=Qt,exports.AVAILABLE_FONTS=t.u,exports.AppEmptyState=h.t,exports.AppIcon=c.t,exports.AppLoading=it,exports.AppMenuBar=d.t,exports.AppReadyProvider=Lt,exports.BREAKPOINTS=i.p,exports.CORE_APPS=i.dt,exports.CORE_APP_IDS=i.ft,exports.CORE_REGISTRY=r.b,exports.CUSTOM_APPS_FOLDER_ID=i.z,exports.CalendarApp=i.pt,exports.CalendarAppLazy=r.k,exports.CodeServerApp=rr,exports.CollapsibleSection=we,exports.ColorPicker=_.t,exports.ContextMenu=Hn,exports.ContextMenuAnchor=ke,exports.CreateItemAppLazy=r.A,exports.CreateItemContextMenu=Ut,exports.CustomAppLoader=Pt,exports.CustomAppLoadingScreen=at,exports.CustomAppNotSupported=st,exports.CustomAppOffline=ot,exports.DEFAULT_FDE_THEME=V,exports.DEFAULT_GRADIENT_CSS=n.n,exports.DEFAULT_LANGUAGE=t.t,exports.DEFAULT_LAUNCHER_FOLDERS=i.B,exports.DEFAULT_THEME_COLORS=mr,exports.DEFAULT_VIEWPORT_HEIGHT=i.s,exports.DEFAULT_VIEWPORT_WIDTH=i.c,exports.DEFAULT_WALLPAPER_URL=n.r,exports.DEFAULT_WINDOW_DIMENSIONS=i.mt,exports.DESKTOP_APPS=ye,exports.DESKTOP_APPS_ORDER=i.ct,exports.DefaultThemeProvider=t.v,exports.Desktop=de,exports.DesktopIcon=Vt,exports.DeviceInfoAppLazy=r.j,exports.DirtyIndicator=d.n,exports.DockerFileSystemAdapter=i.q,exports.DownloadProgress=v.t,exports.DragDropProvider=s.o,exports.DynamicMenuBarRenderer=Bn,exports.EASE_IN=r.r,exports.EASE_OUT=r.i,exports.ExternalLinkApp=cr,exports.FONT_STACKS=t.d,exports.FdeDesktop=zn,exports.FdeProvider=ae,exports.FileIcon=p.n,exports.FilePickerApp=y.t,exports.FilePickerModal=y.n,exports.FilesAppLazy=r.M,exports.FolderPicker=y.a,exports.GITHUB_LATEST_RELEASE_URL=Xt,exports.GITHUB_RELEASES_REPO=Yt,exports.GOOGLE_FONTS_HREF=t.f,exports.GRADIENT_PRESETS=n.i,exports.ICON_COLUMN_WIDTH=i.l,exports.ICON_MARGIN=i.u,exports.ICON_ROW_HEIGHT=i.d,exports.IMAGE_MIME_TYPES=i.y,exports.IconColorPicker=b.t,exports.ImageViewerAppLazy=r.N,exports.ImageViewerMenuBarLazy=r.P,exports.IndexedDBFileSystem=i.Y,exports.LanguageFlag=t.p,exports.LanguageSelector=tt,exports.Launcher=Oe,exports.MenuEditAppLazy=r.F,exports.MenuEditMenuBarLazy=r.I,exports.NotesAppLazy=r.L,exports.NotesMenuBarLazy=r.R,exports.PREDEFINED_LAUNCHER_FOLDERS=i.V,exports.PRESET_COLORS=g.t,exports.PRESET_ICONS=b.n,exports.PROFILE=t.r,exports.PdfAppLazy=r.z,exports.PdfMenuBarLazy=r.B,Object.defineProperty(exports,`QueryClient`,{enumerable:!0,get:function(){return E.QueryClient}}),exports.SETTINGS_SECTIONS=t.l,exports.SUNSET_CONFIG=n.a,exports.SUPPORTED_LANGUAGES=t.n,exports.SettingsAppLazy=r.V,exports.SettingsMenuBarLazy=r.H,exports.SettingsSectionComponent=t.s,exports.SortOptions=i.C,exports.StorybookApp=Gn,exports.TASKBAR_HEIGHT=i.f,exports.TEXT_MIME_TYPES=i.b,exports.Taskbar=rt,exports.TaskbarContextMenu=Ne,exports.TerminalApp=er,exports.TerminalMenuBar=or,exports.ThemeProvider=H,exports.UploaderAppLazy=r.U,exports.VscIcon=u.t,exports.Window=zt,exports.WindowButtonRegistryProvider=ce,exports.WindowManagerAdapter=i.Q,exports.appendDirtyIndicator=x.t,exports.buildBreadcrumbs=p.t,exports.buildGradientCSS=n.c,exports.centerWindowPosition=r.a,exports.checkHMREndpointExists=St,exports.clearBrowserData=t.i,exports.clearManifestCache=i.O,exports.convertToAppEntry=i.k,exports.createDesktopIcon=i.it,exports.createEaseIn=r.o,exports.createEaseOut=r.s,exports.createFile=i.$,exports.createFolder=i.et,exports.createLauncherFolder=i.tt,exports.createMaximizeTransition=r.c,exports.createMinimizeVariant=r.l,exports.createNoiseDataUrl=n.p,exports.createPanelVariants=r.u,exports.createPredefinedLauncherFolder=i.nt,exports.createRestoreVariant=r.d,exports.createWindow=i.at,exports.createWindowVariants=r.f,exports.fetchAppManifest=i.A,exports.fileSystem=i.n,exports.formatBytes=S.t,exports.generateUUID=i.ot,exports.getAppComponent=r.x,exports.getAppIdForMime=i.x,exports.getAppName=r.S,exports.getBaseUrl=i.m,exports.getCachedManifest=i.j,exports.getCloseInterceptor=l.t,exports.getCustomAppById=i.M,exports.getCustomApps=i.N,exports.getEnvironment=en,exports.getFdeApi=Nn,exports.getFileExtension=p.r,exports.getFourRandomColors=h.n,exports.getMenuBarBuilder=r.C,exports.getMenuBarComponent=r.w,exports.getMimeTypeFromExtension=i.Z,exports.getPersistedThemeMode=t.m,exports.getPresets=n.s,exports.getReleaseType=tn,exports.getRuntime=i.H,exports.getVersionString=$t,exports.getWallpaperBackgroundStyle=n.l,exports.hashBlob=i.X,exports.i18n=$e,exports.initRegistry=r.E,exports.initializeFdeApi=Mn,exports.injectFontLink=t.o,exports.isBrowser=i.U,exports.isCSSGradient=n.u,exports.isCustomApp=i.P,exports.isDev=i.W,exports.isDocker=i.G,exports.isElectron=i.K,exports.isFdeApiInitialized=Pn,exports.isLazyApp=r.D,exports.isNewerVersion=Jt,exports.maximizeTransition=r.p,exports.mergeAppsWithCustomApps=i.F,exports.migrateStorage=bn,exports.minimizeVariant=r.m,exports.openVariants=r.h,exports.panelVariants=r.g,exports.parseGradientCSS=n.d,exports.prefetchApps=En,exports.randomWindowPosition=r._,exports.registerAppFileHandler=i.S,exports.registerCloseInterceptor=l.n,exports.registerComponents=r.O,exports.registerCustomApps=i.lt,exports.registerDesktopApps=i.ut,exports.removeFromManifestCache=i.I,exports.resetBaseUrlCache=i.h,exports.resetFileSystem=i.r,exports.resetHMRState=gt,exports.resetWindowManager=i.i,exports.resolveFileUrl=i.a,exports.resolveUrl=i.g,exports.restoreVariant=r.v,exports.setApiBaseUrl=i.J,exports.setTestBaseUrl=i._,exports.sortDesktopIcons=i.w,exports.sortDesktopIconsByMode=i.T,exports.sortNodes=i.E,exports.sortNodesByMode=i.D,exports.syncWithServer=i.L,exports.toMantineTheme=hr,exports.unregisterCloseInterceptor=l.r,exports.updateLauncherFolder=i.rt,exports.updateManifestCache=i.R,exports.useAdaptiveDimensions=o.t,exports.useAnimationDuration=_e,exports.useAppName=be,exports.useAppReady=It,exports.useAppTempMemoryStore=e.t,exports.useAppUpdate=an,exports.useApplyFont=un,exports.useClock=pe,exports.useCloseInterceptor=l.i,exports.useCloseModalStore=l.a,exports.useCollapsible=Se,exports.useContextMenu=lr,exports.useCustomAppHMR=kt,exports.useCustomAppLifecycle=At,exports.useCustomAppStore=i.v,exports.useDesktopStore=i.o,exports.useDeviceDetection=m.t,exports.useDownload=pr,exports.useDragDropState=s.r,exports.useDraggableItem=s.a,exports.useDroppableArea=s.i,exports.useDynamicIcon=a.t,exports.useDynamicIconElement=a.n,exports.useFcIcon=a.r,exports.useFcIconElement=a.i,exports.useFdeApi=dr,exports.useFdeContext=oe,exports.useFiIcon=a.a,exports.useFiIconElement=a.o,exports.useFolderName=s.s,exports.useFontDownload=t.a,exports.useIsDirty=ur,exports.useLanguageSync=dn,exports.useNotifications=f.t,exports.useOpenApp=r.t,exports.useResolvedUrl=n.t,exports.useSearchFilter=xe,exports.useSettingsStore=t._,exports.useSystemTheme=qt,exports.useTaskbarContextMenu=ge,exports.useTaskbarHeight=Ae,exports.useTheme=U,exports.useThemeContext=te,exports.useVscIcon=a.s,exports.useVscIconElement=a.c,exports.useWindowButtonRegistry=le,Object.defineProperty(exports,`uuidv4`,{enumerable:!0,get:function(){return R.v4}}),exports.validateGradientConfig=n.f,exports.waitForContainer=jt,exports.windowVariants=r.y;
|