Refactored project
|
|
@ -6,7 +6,7 @@ ProzillaOS is a web-based operating system inspired by Ubuntu Linux and Windows
|
|||
|
||||
**Live demo: [os.prozilla.dev](https://os.prozilla.dev/)**
|
||||
|
||||
<img src="public/media/Banner2.png"/>
|
||||
<img src="public/media/banner.png"/>
|
||||
|
||||
> Please note that ProzillaOS is a WIP and far from complete. Many additional features will be added in the near future.
|
||||
|
||||
|
|
@ -30,7 +30,7 @@ ProzillaOS was designed in Figma by Prozilla. You can view the design file [here
|
|||
|
||||
### Preview
|
||||
|
||||
<img src="public/media/screenshots/Screenshot1.png"/>
|
||||
<img src="public/media/screenshots/screenshot-1.png"/>
|
||||
|
||||
## Support ProzillaOS
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
"react-app/jest"
|
||||
],
|
||||
"plugins": [
|
||||
"react",
|
||||
"jsdoc"
|
||||
],
|
||||
"rules": {
|
||||
|
|
@ -55,6 +56,7 @@
|
|||
"double"
|
||||
],
|
||||
"default-case": "off",
|
||||
"no-multi-comp": "off",
|
||||
"jsdoc/no-undefined-types": "warn",
|
||||
"jsdoc/require-param": "warn",
|
||||
"jsdoc/check-tag-names": "warn",
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0"?>
|
||||
<options>
|
||||
<wallpaper>/media/wallpapers/Wallpaper6.png</wallpaper>
|
||||
<wallpaper>/media/wallpapers/wallpaper-6.png</wallpaper>
|
||||
</options>
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
<img src="/media/Banner2.png" width="1440" height="700" style="aspect-ratio: 3 / 1; width: 100%; height: auto; object-fit: cover;" alt="Banner with ProzillaOS' name and logo"/>
|
||||
<img src="/media/banner.png" width="1440" height="700" style="aspect-ratio: 3 / 1; width: 100%; height: auto; object-fit: cover;" alt="Banner with ProzillaOS' name and logo"/>
|
||||
|
||||
# Info
|
||||
|
||||
|
|
|
|||
|
|
@ -19,14 +19,14 @@
|
|||
<meta property="og:site_name" content="ProzillaOS"/>
|
||||
<meta property="og:description" content="ProzillaOS is an open-source web-based operating system inspired by Ubuntu Linux and Windows made with React.js by Prozilla."/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:image" content="%PUBLIC_URL%/media/Banner2.png"/>
|
||||
<meta property="og:image" content="%PUBLIC_URL%/media/banner.png"/>
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/Poppins/Poppins-Light.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/Poppins/Poppins-Regular.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/Poppins/Poppins-SemiBold.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/Poppins/Poppins-Bold.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/Roboto Mono/RobotoMono-VariableFont_wght.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/poppins/Poppins-Light.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/poppins/Poppins-Regular.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/poppins/Poppins-SemiBold.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/poppins/Poppins-Bold.ttf" as="font" type="font/ttf" crossorigin>
|
||||
<link rel="preload" href="%PUBLIC_URL%/media/fonts/roboto-mono/RobotoMono-VariableFont_wght.ttf" as="font" type="font/ttf" crossorigin>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run ProzillaOS.</noscript>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 237 KiB |
|
Before Width: | Height: | Size: 237 KiB |
|
|
@ -1,3 +0,0 @@
|
|||
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.32233 7.32233C17.0854 -2.44078 32.9146 -2.44078 42.6777 7.32233L100 64.6447L157.322 7.32233C167.085 -2.44078 182.915 -2.44078 192.678 7.32233C202.441 17.0854 202.441 32.9146 192.678 42.6777L135.355 100L192.678 157.322C202.441 167.085 202.441 182.915 192.678 192.678C182.915 202.441 167.085 202.441 157.322 192.678L100 135.355L42.6777 192.678C32.9146 202.441 17.0854 202.441 7.32233 192.678C-2.44078 182.915 -2.44078 167.085 7.32233 157.322L64.6447 100L7.32233 42.6777C-2.44078 32.9146 -2.44078 17.0854 7.32233 7.32233Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 654 B |
|
|
@ -1,3 +0,0 @@
|
|||
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M42 0C18.804 0 0 18.804 0 42V158C0 181.196 18.804 200 42 200H158C181.196 200 200 181.196 200 158V42C200 18.804 181.196 0 158 0H42ZM158 63C158 51.402 148.598 42 137 42H63C51.402 42 42 51.402 42 63V137C42 148.598 51.402 158 63 158H137C148.598 158 158 148.598 158 137V63Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 441 B |
|
|
@ -1,3 +0,0 @@
|
|||
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 100C0 112.703 8.95431 123 20 123H180C191.046 123 200 112.703 200 100C200 87.2975 191.046 77 180 77H20C8.95431 77 0 87.2975 0 100Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 265 B |
|
|
@ -1,4 +0,0 @@
|
|||
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M133.182 80C133.182 113.325 107.343 139 77.0909 139C46.8391 139 21 113.325 21 80C21 46.6752 46.8391 21 77.0909 21C107.343 21 133.182 46.6752 133.182 80Z" stroke="white" stroke-width="42"/>
|
||||
<path d="M120 120L175 175" stroke="white" stroke-width="42" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 390 B |
|
Before Width: | Height: | Size: 752 KiB |
|
Before Width: | Height: | Size: 696 KiB |
|
Before Width: | Height: | Size: 819 KiB After Width: | Height: | Size: 819 KiB |
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 197 KiB |
|
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 219 KiB After Width: | Height: | Size: 219 KiB |
|
|
@ -1,10 +1,10 @@
|
|||
import styles from "./App.module.css";
|
||||
import { Taskbar } from "./components/task-bar/TaskBar.jsx";
|
||||
import { WindowsManagerProvider } from "./hooks/windows/WindowsManagerContext.js";
|
||||
import { WindowsManagerProvider } from "./hooks/windows/windowsManagerContext.js";
|
||||
import { WindowsView } from "./components/windows/WindowsView.jsx";
|
||||
import { VirtualRootProvider } from "./hooks/virtual-drive/VirtualRootContext.js";
|
||||
import { VirtualRootProvider } from "./hooks/virtual-drive/virtualRootContext.js";
|
||||
import { Desktop } from "./components/desktop/Desktop.jsx";
|
||||
import { SettingsManagerProvider } from "./hooks/settings/SettingsContext.js";
|
||||
import { SettingsManagerProvider } from "./hooks/settings/settingsManagerContext.js";
|
||||
import { ModalsView } from "./components/modals/ModalsView.jsx";
|
||||
import { useEffect } from "react";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
import { useState } from "react";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||
import styles from "./FileExplorer.module.css";
|
||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||
import { faArrowUp, faCaretLeft, faCaretRight, faCog, faDesktop, faFile, faFileLines, faFolder, faHouse, faImage, faPlus, faSearch } from "@fortawesome/free-solid-svg-icons";
|
||||
import { VirtualFile } from "../../../features/virtual-drive/virtual-file.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
||||
import { VirtualFile } from "../../../features/virtual-drive/virtualFile.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js";
|
||||
import utilStyles from "../../../styles/utils.module.css";
|
||||
// import { useContextMenu } from "../../../hooks/modals/ContextMenu.js";
|
||||
import { useModals } from "../../../hooks/modals/Modals.js";
|
||||
import { useModals } from "../../../hooks/modals/modals.js";
|
||||
import { ModalsView } from "../../modals/ModalsView.jsx";
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
import { useEffect } from "react";
|
||||
import { VirtualFile } from "../../../features/virtual-drive/virtual-file.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
||||
import { VirtualFile } from "../../../features/virtual-drive/virtualFile.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js";
|
||||
import styles from "./MediaViewer.module.css";
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@ import { Button } from "../../utils/Button.jsx";
|
|||
import styles from "./Settings.module.css";
|
||||
import utilStyles from "../../../styles/utils.module.css";
|
||||
import Vector2 from "../../../features/math/vector2.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||
|
||||
export function AboutSettings() {
|
||||
const windowsManager = useWindowsManager();
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { useEffect, useState } from "react";
|
||||
import { SettingsManager } from "../../../features/settings/settings.js";
|
||||
import { SettingsManager } from "../../../features/settings/settingsManager.js";
|
||||
import styles from "./Settings.module.css";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
||||
import { useSettingsManager } from "../../../hooks/settings/SettingsContext.js";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||
import { useSettingsManager } from "../../../hooks/settings/settingsManagerContext.js";
|
||||
|
||||
export function AppearanceSettings() {
|
||||
const virtualRoot = useVirtualRoot();
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ import utilStyles from "../../../styles/utils.module.css";
|
|||
import { round } from "../../../features/math/round.js";
|
||||
import { ProgressBar } from "../../utils/ProgressBar.jsx";
|
||||
import { Button } from "../../utils/Button.jsx";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
||||
import { StorageManager } from "../../../features/storage/storage.js";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||
import { StorageManager } from "../../../features/storage/storageManager.js";
|
||||
|
||||
export function StorageTab() {
|
||||
const virtualRoot = useVirtualRoot();
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { useEffect, useRef, useState } from "react";
|
||||
import styles from "./Terminal.module.css";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||
import { Command } from "../../../features/applications/terminal/commands.js";
|
||||
import { clamp } from "../../../features/math/clamp.js";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import React, { useEffect, useState } from "react";
|
||||
import { VirtualFile } from "../../../features/virtual-drive/virtual-file.js";
|
||||
import { VirtualFile } from "../../../features/virtual-drive/virtualFile.js";
|
||||
import styles from "./TextEditor.module.css";
|
||||
import { HeaderMenu } from "../.common/HeaderMenu.jsx";
|
||||
import Markdown from "markdown-to-jsx";
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import { useState } from "react";
|
||||
import { SettingsManager } from "../../features/settings/settings.js";
|
||||
import { useSettingsManager } from "../../hooks/settings/SettingsContext.js";
|
||||
import { SettingsManager } from "../../features/settings/settingsManager.js";
|
||||
import { useSettingsManager } from "../../hooks/settings/settingsManagerContext.js";
|
||||
import styles from "./Desktop.module.css";
|
||||
import { useEffect } from "react";
|
||||
import { useModals } from "../../hooks/modals/Modals.js";
|
||||
import { useModals } from "../../hooks/modals/modals.js";
|
||||
import { ModalsView } from "../modals/ModalsView.jsx";
|
||||
import { useWindowsManager } from "../../hooks/windows/WindowsManagerContext.js";
|
||||
import { useContextMenu } from "../../hooks/modals/ContextMenu.js";
|
||||
import { useWindowsManager } from "../../hooks/windows/windowsManagerContext.js";
|
||||
import { useContextMenu } from "../../hooks/modals/contextMenu.js";
|
||||
|
||||
export function Desktop() {
|
||||
const settingsManager = useSettingsManager();
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ import styles from "./TaskBar.module.css";
|
|||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||
import { faSearch } from "@fortawesome/free-solid-svg-icons";
|
||||
import ApplicationsManager from "../../features/applications/applications.js";
|
||||
import { useWindows } from "../../hooks/windows/WindowsContext.js";
|
||||
import { useWindowsManager } from "../../hooks/windows/WindowsManagerContext.js";
|
||||
import { useWindows } from "../../hooks/windows/windowsContext.js";
|
||||
import { useWindowsManager } from "../../hooks/windows/windowsManagerContext.js";
|
||||
import { ReactSVG } from "react-svg";
|
||||
import Application from "../../features/applications/application.js";
|
||||
import { HomeMenu } from "./menus/HomeMenu.jsx";
|
||||
|
|
|
|||
|
|
@ -2,12 +2,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|||
import styles from "./HomeMenu.module.css";
|
||||
import appStyles from "./AppList.module.css";
|
||||
import { faCircleInfo, faFileLines, faGear, faImage, faPowerOff } from "@fortawesome/free-solid-svg-icons";
|
||||
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js";
|
||||
import ApplicationsManager from "../../../features/applications/applications.js";
|
||||
import { ReactSVG } from "react-svg";
|
||||
import { closeTab } from "../../../features/utils/browser.js";
|
||||
import { useKeyboardListener } from "../../../hooks/utils/keyboard.js";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||
import { useEffect, useState } from "react";
|
||||
import Vector2 from "../../../features/math/vector2.js";
|
||||
import utilStyles from "../../../styles/utils.module.css";
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import styles from "./SearchMenu.module.css";
|
||||
import appStyles from "./AppList.module.css";
|
||||
import ApplicationsManager from "../../../features/applications/applications.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
||||
import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js";
|
||||
import { ReactSVG } from "react-svg";
|
||||
import { useEffect } from "react";
|
||||
import { useState } from "react";
|
||||
|
|
|
|||
|
|
@ -2,16 +2,16 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|||
import styles from "./WindowView.module.css";
|
||||
import { faMinus, faWindowMaximize as fasWindowMaximize, faXmark } from "@fortawesome/free-solid-svg-icons";
|
||||
import { ReactSVG } from "react-svg";
|
||||
import { useWindowsManager } from "../../hooks/windows/WindowsManagerContext.js";
|
||||
import { useWindowsManager } from "../../hooks/windows/windowsManagerContext.js";
|
||||
import Draggable from "react-draggable";
|
||||
import { memo, useEffect, useRef, useState } from "react";
|
||||
import Application from "../../features/applications/application.js";
|
||||
import Vector2 from "../../features/math/vector2.js";
|
||||
import { faWindowMaximize } from "@fortawesome/free-regular-svg-icons";
|
||||
import utilStyles from "../../styles/utils.module.css";
|
||||
import { useModals } from "../../hooks/modals/Modals.js";
|
||||
import { useModals } from "../../hooks/modals/modals.js";
|
||||
import { ModalsView } from "../modals/ModalsView.jsx";
|
||||
import { useContextMenu } from "../../hooks/modals/ContextMenu.js";
|
||||
import { useContextMenu } from "../../hooks/modals/contextMenu.js";
|
||||
|
||||
/**
|
||||
* @param {object} props
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { useWindows } from "../../hooks/windows/WindowsContext.js";
|
||||
import { useWindowsManager } from "../../hooks/windows/WindowsManagerContext.js";
|
||||
import { useWindows } from "../../hooks/windows/windowsContext.js";
|
||||
import { useWindowsManager } from "../../hooks/windows/windowsManagerContext.js";
|
||||
import { useEffect, useState } from "react";
|
||||
import { WindowView } from "./WindowView.jsx";
|
||||
|
||||
|
|
|
|||
18
src/constants/branding.js
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
export const NAME = "ProzillaOS";
|
||||
|
||||
export const ASCII_LOGO = `
|
||||
:.
|
||||
-==.
|
||||
.=====:
|
||||
---::..:=======-.
|
||||
:===+=----------::..
|
||||
=+=---------------:..
|
||||
--------------------:.
|
||||
.:-+=----*###*--*####=---.
|
||||
:==+----#%+-+%#-##%*+----:.
|
||||
.=----#%+-+%#-*+-%#+---:.
|
||||
==----*###*--*###*----.
|
||||
==+-------------------:.
|
||||
...::---------------:.
|
||||
.::---------::..
|
||||
....::... `;
|
||||
1
src/constants/virtualDrive.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
export const WALLPAPER_COUNT = 8;
|
||||
|
|
@ -1,24 +1,8 @@
|
|||
import { ASCII_LOGO } from "../../../constants/branding.js";
|
||||
import { START_DATE } from "../../../index.js";
|
||||
import { formatRelativeTime } from "../../utils/date.js";
|
||||
import ApplicationsManager from "../applications.js";
|
||||
|
||||
export const ASCII_LOGO = `
|
||||
:.
|
||||
-==.
|
||||
.=====:
|
||||
---::..:=======-.
|
||||
:===+=----------::..
|
||||
=+=---------------:..
|
||||
--------------------:.
|
||||
.:-+=----*###*--*####=---.
|
||||
:==+----#%+-+%#-##%*+----:.
|
||||
.=----#%+-+%#-*+-%#+---:.
|
||||
==----*###*--*###*----.
|
||||
==+-------------------:.
|
||||
...::---------------:.
|
||||
.::---------::..
|
||||
....::... `;
|
||||
|
||||
export class Command {
|
||||
/**
|
||||
* @param {string} name
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
|
||||
import { VirtualFile } from "../virtual-drive/virtual-file.js";
|
||||
|
||||
import { VirtualRoot } from "../virtual-drive/virtual-root.js";
|
||||
import { VirtualFile } from "../virtual-drive/virtualFile.js";
|
||||
import { VirtualRoot } from "../virtual-drive/virtualRoot.js";
|
||||
|
||||
export class Settings {
|
||||
xmlDoc = null;
|
||||
|
|
@ -119,42 +117,4 @@ export class Settings {
|
|||
|
||||
await this.write();
|
||||
}
|
||||
}
|
||||
|
||||
export class SettingsManager {
|
||||
/**
|
||||
* @type {Object<string, string>}
|
||||
*/
|
||||
static VIRTUAL_PATHS = {
|
||||
"desktop": "~/.config/desktop.xml"
|
||||
};
|
||||
|
||||
/**
|
||||
* @type {Object<string, Settings>}
|
||||
*/
|
||||
#pathToSettings = {};
|
||||
|
||||
/**
|
||||
* @type {VirtualRoot}
|
||||
*/
|
||||
#virtualRoot = null;
|
||||
|
||||
/**
|
||||
* @param {VirtualRoot} virtualRoot
|
||||
*/
|
||||
constructor(virtualRoot) {
|
||||
this.#virtualRoot = virtualRoot;
|
||||
|
||||
Object.values(SettingsManager.VIRTUAL_PATHS).forEach((path) => {
|
||||
this.#pathToSettings[path] = new Settings(this.#virtualRoot, path);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} path
|
||||
* @returns {Settings}
|
||||
*/
|
||||
get(path) {
|
||||
return this.#pathToSettings[path];
|
||||
}
|
||||
}
|
||||
40
src/features/settings/settingsManager.js
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
import { VirtualRoot } from "../virtual-drive/virtualRoot.js";
|
||||
import { Settings } from "./settings.js";
|
||||
|
||||
export class SettingsManager {
|
||||
/**
|
||||
* @type {Object<string, string>}
|
||||
*/
|
||||
static VIRTUAL_PATHS = {
|
||||
"desktop": "~/.config/desktop.xml"
|
||||
};
|
||||
|
||||
/**
|
||||
* @type {Object<string, Settings>}
|
||||
*/
|
||||
#pathToSettings = {};
|
||||
|
||||
/**
|
||||
* @type {VirtualRoot}
|
||||
*/
|
||||
#virtualRoot = null;
|
||||
|
||||
/**
|
||||
* @param {VirtualRoot} virtualRoot
|
||||
*/
|
||||
constructor(virtualRoot) {
|
||||
this.#virtualRoot = virtualRoot;
|
||||
|
||||
Object.values(SettingsManager.VIRTUAL_PATHS).forEach((path) => {
|
||||
this.#pathToSettings[path] = new Settings(this.#virtualRoot, path);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} path
|
||||
* @returns {Settings}
|
||||
*/
|
||||
get(path) {
|
||||
return this.#pathToSettings[path];
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import { EventEmitter } from "../utils/events.js";
|
||||
|
||||
import { VirtualRoot } from "./virtual-root.js";
|
||||
import { VirtualRoot } from "./virtualRoot.js";
|
||||
|
||||
export class VirtualBase extends EventEmitter {
|
||||
/**
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
import { VirtualBase } from "./virtual-base.js";
|
||||
import { VirtualBase } from "./virtualBase.js";
|
||||
|
||||
/**
|
||||
* A virtual file that can be stored inside a folder
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import { removeFromArray } from "../utils/array.js";
|
||||
import { VirtualBase } from "./virtual-base.js";
|
||||
import { VirtualFile } from "./virtual-file.js";
|
||||
import { VirtualBase } from "./virtualBase.js";
|
||||
import { VirtualFile } from "./virtualFile.js";
|
||||
|
||||
/**
|
||||
* A virtual folder that can contains files and sub-folders
|
||||
|
|
@ -1,8 +1,7 @@
|
|||
import { StorageManager } from "../storage/storage.js";
|
||||
import { VirtualFile } from "./virtual-file.js";
|
||||
import { VirtualFolder } from "./virtual-folder.js";
|
||||
|
||||
export const WALLPAPER_COUNT = 8;
|
||||
import { WALLPAPER_COUNT } from "../../constants/virtualDrive.js";
|
||||
import { StorageManager } from "../storage/storageManager.js";
|
||||
import { VirtualFile } from "./virtualFile.js";
|
||||
import { VirtualFolder } from "./virtualFolder.js";
|
||||
|
||||
/**
|
||||
* A virtual folder that serves as the root folder
|
||||
|
|
@ -55,7 +54,7 @@ export class VirtualRoot extends VirtualFolder {
|
|||
.createFolder("Images", (folder) => {
|
||||
for (let i = 0; i < WALLPAPER_COUNT; i++) {
|
||||
folder.createFile(`Wallpaper${i + 1}`, "png", (file) => {
|
||||
file.setSource(`/media/wallpapers/Wallpaper${i + 1}.png`);
|
||||
file.setSource(`/media/wallpapers/wallpaper-${i + 1}.png`);
|
||||
});
|
||||
}
|
||||
})
|
||||
|
|
@ -172,7 +171,7 @@ export class VirtualRoot extends VirtualFolder {
|
|||
/**
|
||||
* Adds a shortcut to a file or folder
|
||||
* @param {string} name
|
||||
* @param {VirtualFile|VirtualFolder} destination
|
||||
* @param {VirtualFile | VirtualFolder} destination
|
||||
* @returns {VirtualRoot}
|
||||
*/
|
||||
addShortcut(name, destination) {
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
import ApplicationsManager from "../applications/applications.js";
|
||||
import { randomRange } from "../math/random.js";
|
||||
import Vector2 from "../math/vector2.js";
|
||||
import { VirtualFile } from "../virtual-drive/virtual-file.js";
|
||||
import { VirtualFile } from "../virtual-drive/virtualFile.js";
|
||||
|
||||
export const SCREEN_MARGIN = 32;
|
||||
export const TASKBAR_HEIGHT = 48;
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import { createContext, useContext } from "react";
|
||||
import { SettingsManager } from "../../features/settings/settings.js";
|
||||
import { useVirtualRoot } from "../virtual-drive/VirtualRootContext.js";
|
||||
import { SettingsManager } from "../../features/settings/settingsManager.js";
|
||||
import { useVirtualRoot } from "../virtual-drive/virtualRootContext.js";
|
||||
|
||||
const SettingsContext = createContext();
|
||||
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
import { createContext, useContext } from "react";
|
||||
import { VirtualRoot } from "../../features/virtual-drive/virtual-root.js";
|
||||
import { VirtualRoot } from "../../features/virtual-drive/virtualRoot.js";
|
||||
|
||||
const VirtualRootContext = createContext();
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { createContext, useContext } from "react";
|
||||
import WindowsManager from "../../features/windows/windows.js";
|
||||
import { WindowsProvider } from "./WindowsContext.js";
|
||||
import WindowsManager from "../../features/windows/windowsManager.js";
|
||||
import { WindowsProvider } from "./windowsContext.js";
|
||||
|
||||
const WindowsManagerContext = createContext();
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import ReactDOM from "react-dom/client";
|
|||
import "./styles/global.css";
|
||||
import App from "./App";
|
||||
import reportWebVitals from "./reportWebVitals";
|
||||
import { ASCII_LOGO } from "./features/applications/terminal/commands.js";
|
||||
import { ASCII_LOGO } from "./constants/branding.js";
|
||||
|
||||
export const START_DATE = new Date();
|
||||
|
||||
|
|
|
|||
|
|
@ -7,62 +7,62 @@
|
|||
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("/public/media/fonts/Poppins/Poppins-Thin.ttf");
|
||||
src: url("/public/media/fonts/poppins/Poppins-Thin.ttf");
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("/public/media/fonts/Poppins/Poppins-ExtraLight.ttf");
|
||||
src: url("/public/media/fonts/poppins/Poppins-ExtraLight.ttf");
|
||||
font-weight: 200;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("/public/media/fonts/Poppins/Poppins-Light.ttf");
|
||||
src: url("/public/media/fonts/poppins/Poppins-Light.ttf");
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("/public/media/fonts/Poppins/Poppins-Regular.ttf");
|
||||
src: url("/public/media/fonts/poppins/Poppins-Regular.ttf");
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("/public/media/fonts/Poppins/Poppins-SemiBold.ttf");
|
||||
src: url("/public/media/fonts/poppins/Poppins-SemiBold.ttf");
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("/public/media/fonts/Poppins/Poppins-Bold.ttf");
|
||||
src: url("/public/media/fonts/poppins/Poppins-Bold.ttf");
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("/public/media/fonts/Poppins/Poppins-ExtraBold.ttf");
|
||||
src: url("/public/media/fonts/poppins/Poppins-ExtraBold.ttf");
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("/public/media/fonts/Poppins/Poppins-Black.ttf");
|
||||
src: url("/public/media/fonts/poppins/Poppins-Black.ttf");
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Roboto Mono";
|
||||
src: url("/public/media/fonts/Roboto_Mono/RobotoMono-VariableFont_wght.ttf");
|
||||
src: url("/public/media/fonts/roboto-mono/RobotoMono-VariableFont_wght.ttf");
|
||||
font-display: swap;
|
||||
}
|
||||