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/)**
|
**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.
|
> 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
|
### Preview
|
||||||
|
|
||||||
<img src="public/media/screenshots/Screenshot1.png"/>
|
<img src="public/media/screenshots/screenshot-1.png"/>
|
||||||
|
|
||||||
## Support ProzillaOS
|
## Support ProzillaOS
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@
|
||||||
"react-app/jest"
|
"react-app/jest"
|
||||||
],
|
],
|
||||||
"plugins": [
|
"plugins": [
|
||||||
|
"react",
|
||||||
"jsdoc"
|
"jsdoc"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
|
|
@ -55,6 +56,7 @@
|
||||||
"double"
|
"double"
|
||||||
],
|
],
|
||||||
"default-case": "off",
|
"default-case": "off",
|
||||||
|
"no-multi-comp": "off",
|
||||||
"jsdoc/no-undefined-types": "warn",
|
"jsdoc/no-undefined-types": "warn",
|
||||||
"jsdoc/require-param": "warn",
|
"jsdoc/require-param": "warn",
|
||||||
"jsdoc/check-tag-names": "warn",
|
"jsdoc/check-tag-names": "warn",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<options>
|
<options>
|
||||||
<wallpaper>/media/wallpapers/Wallpaper6.png</wallpaper>
|
<wallpaper>/media/wallpapers/wallpaper-6.png</wallpaper>
|
||||||
</options>
|
</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
|
# Info
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,14 +19,14 @@
|
||||||
<meta property="og:site_name" content="ProzillaOS"/>
|
<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: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:type" content="website"/>
|
||||||
<meta property="og:image" content="%PUBLIC_URL%/media/Banner2.png"/>
|
<meta property="og:image" content="%PUBLIC_URL%/media/banner.png"/>
|
||||||
|
|
||||||
<!-- Fonts -->
|
<!-- 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-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-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-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/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/roboto-mono/RobotoMono-VariableFont_wght.ttf" as="font" type="font/ttf" crossorigin>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<noscript>You need to enable JavaScript to run ProzillaOS.</noscript>
|
<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 styles from "./App.module.css";
|
||||||
import { Taskbar } from "./components/task-bar/TaskBar.jsx";
|
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 { 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 { 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 { ModalsView } from "./components/modals/ModalsView.jsx";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
import { useState } from "react";
|
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 styles from "./FileExplorer.module.css";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
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 { 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 { VirtualFile } from "../../../features/virtual-drive/virtualFile.js";
|
||||||
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js";
|
||||||
import utilStyles from "../../../styles/utils.module.css";
|
import utilStyles from "../../../styles/utils.module.css";
|
||||||
// import { useContextMenu } from "../../../hooks/modals/ContextMenu.js";
|
// 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";
|
import { ModalsView } from "../../modals/ModalsView.jsx";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { VirtualFile } from "../../../features/virtual-drive/virtual-file.js";
|
import { VirtualFile } from "../../../features/virtual-drive/virtualFile.js";
|
||||||
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js";
|
||||||
import styles from "./MediaViewer.module.css";
|
import styles from "./MediaViewer.module.css";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@ import { Button } from "../../utils/Button.jsx";
|
||||||
import styles from "./Settings.module.css";
|
import styles from "./Settings.module.css";
|
||||||
import utilStyles from "../../../styles/utils.module.css";
|
import utilStyles from "../../../styles/utils.module.css";
|
||||||
import Vector2 from "../../../features/math/vector2.js";
|
import Vector2 from "../../../features/math/vector2.js";
|
||||||
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js";
|
||||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||||
|
|
||||||
export function AboutSettings() {
|
export function AboutSettings() {
|
||||||
const windowsManager = useWindowsManager();
|
const windowsManager = useWindowsManager();
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { useEffect, useState } from "react";
|
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 styles from "./Settings.module.css";
|
||||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||||
import { useSettingsManager } from "../../../hooks/settings/SettingsContext.js";
|
import { useSettingsManager } from "../../../hooks/settings/settingsManagerContext.js";
|
||||||
|
|
||||||
export function AppearanceSettings() {
|
export function AppearanceSettings() {
|
||||||
const virtualRoot = useVirtualRoot();
|
const virtualRoot = useVirtualRoot();
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ import utilStyles from "../../../styles/utils.module.css";
|
||||||
import { round } from "../../../features/math/round.js";
|
import { round } from "../../../features/math/round.js";
|
||||||
import { ProgressBar } from "../../utils/ProgressBar.jsx";
|
import { ProgressBar } from "../../utils/ProgressBar.jsx";
|
||||||
import { Button } from "../../utils/Button.jsx";
|
import { Button } from "../../utils/Button.jsx";
|
||||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js";
|
||||||
import { StorageManager } from "../../../features/storage/storage.js";
|
import { StorageManager } from "../../../features/storage/storageManager.js";
|
||||||
|
|
||||||
export function StorageTab() {
|
export function StorageTab() {
|
||||||
const virtualRoot = useVirtualRoot();
|
const virtualRoot = useVirtualRoot();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import styles from "./Terminal.module.css";
|
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 { Command } from "../../../features/applications/terminal/commands.js";
|
||||||
import { clamp } from "../../../features/math/clamp.js";
|
import { clamp } from "../../../features/math/clamp.js";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import React, { useEffect, useState } from "react";
|
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 styles from "./TextEditor.module.css";
|
||||||
import { HeaderMenu } from "../.common/HeaderMenu.jsx";
|
import { HeaderMenu } from "../.common/HeaderMenu.jsx";
|
||||||
import Markdown from "markdown-to-jsx";
|
import Markdown from "markdown-to-jsx";
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { SettingsManager } from "../../features/settings/settings.js";
|
import { SettingsManager } from "../../features/settings/settingsManager.js";
|
||||||
import { useSettingsManager } from "../../hooks/settings/SettingsContext.js";
|
import { useSettingsManager } from "../../hooks/settings/settingsManagerContext.js";
|
||||||
import styles from "./Desktop.module.css";
|
import styles from "./Desktop.module.css";
|
||||||
import { useEffect } from "react";
|
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 { ModalsView } from "../modals/ModalsView.jsx";
|
||||||
import { useWindowsManager } from "../../hooks/windows/WindowsManagerContext.js";
|
import { useWindowsManager } from "../../hooks/windows/windowsManagerContext.js";
|
||||||
import { useContextMenu } from "../../hooks/modals/ContextMenu.js";
|
import { useContextMenu } from "../../hooks/modals/contextMenu.js";
|
||||||
|
|
||||||
export function Desktop() {
|
export function Desktop() {
|
||||||
const settingsManager = useSettingsManager();
|
const settingsManager = useSettingsManager();
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ import styles from "./TaskBar.module.css";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { faSearch } from "@fortawesome/free-solid-svg-icons";
|
import { faSearch } from "@fortawesome/free-solid-svg-icons";
|
||||||
import ApplicationsManager from "../../features/applications/applications.js";
|
import ApplicationsManager from "../../features/applications/applications.js";
|
||||||
import { useWindows } from "../../hooks/windows/WindowsContext.js";
|
import { useWindows } from "../../hooks/windows/windowsContext.js";
|
||||||
import { useWindowsManager } from "../../hooks/windows/WindowsManagerContext.js";
|
import { useWindowsManager } from "../../hooks/windows/windowsManagerContext.js";
|
||||||
import { ReactSVG } from "react-svg";
|
import { ReactSVG } from "react-svg";
|
||||||
import Application from "../../features/applications/application.js";
|
import Application from "../../features/applications/application.js";
|
||||||
import { HomeMenu } from "./menus/HomeMenu.jsx";
|
import { HomeMenu } from "./menus/HomeMenu.jsx";
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import styles from "./HomeMenu.module.css";
|
import styles from "./HomeMenu.module.css";
|
||||||
import appStyles from "./AppList.module.css";
|
import appStyles from "./AppList.module.css";
|
||||||
import { faCircleInfo, faFileLines, faGear, faImage, faPowerOff } from "@fortawesome/free-solid-svg-icons";
|
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 ApplicationsManager from "../../../features/applications/applications.js";
|
||||||
import { ReactSVG } from "react-svg";
|
import { ReactSVG } from "react-svg";
|
||||||
import { closeTab } from "../../../features/utils/browser.js";
|
import { closeTab } from "../../../features/utils/browser.js";
|
||||||
import { useKeyboardListener } from "../../../hooks/utils/keyboard.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 { useEffect, useState } from "react";
|
||||||
import Vector2 from "../../../features/math/vector2.js";
|
import Vector2 from "../../../features/math/vector2.js";
|
||||||
import utilStyles from "../../../styles/utils.module.css";
|
import utilStyles from "../../../styles/utils.module.css";
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import styles from "./SearchMenu.module.css";
|
import styles from "./SearchMenu.module.css";
|
||||||
import appStyles from "./AppList.module.css";
|
import appStyles from "./AppList.module.css";
|
||||||
import ApplicationsManager from "../../../features/applications/applications.js";
|
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 { ReactSVG } from "react-svg";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,16 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import styles from "./WindowView.module.css";
|
import styles from "./WindowView.module.css";
|
||||||
import { faMinus, faWindowMaximize as fasWindowMaximize, faXmark } from "@fortawesome/free-solid-svg-icons";
|
import { faMinus, faWindowMaximize as fasWindowMaximize, faXmark } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { ReactSVG } from "react-svg";
|
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 Draggable from "react-draggable";
|
||||||
import { memo, useEffect, useRef, useState } from "react";
|
import { memo, useEffect, useRef, useState } from "react";
|
||||||
import Application from "../../features/applications/application.js";
|
import Application from "../../features/applications/application.js";
|
||||||
import Vector2 from "../../features/math/vector2.js";
|
import Vector2 from "../../features/math/vector2.js";
|
||||||
import { faWindowMaximize } from "@fortawesome/free-regular-svg-icons";
|
import { faWindowMaximize } from "@fortawesome/free-regular-svg-icons";
|
||||||
import utilStyles from "../../styles/utils.module.css";
|
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 { ModalsView } from "../modals/ModalsView.jsx";
|
||||||
import { useContextMenu } from "../../hooks/modals/ContextMenu.js";
|
import { useContextMenu } from "../../hooks/modals/contextMenu.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {object} props
|
* @param {object} props
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { useWindows } from "../../hooks/windows/WindowsContext.js";
|
import { useWindows } from "../../hooks/windows/windowsContext.js";
|
||||||
import { useWindowsManager } from "../../hooks/windows/WindowsManagerContext.js";
|
import { useWindowsManager } from "../../hooks/windows/windowsManagerContext.js";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { WindowView } from "./WindowView.jsx";
|
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 { START_DATE } from "../../../index.js";
|
||||||
import { formatRelativeTime } from "../../utils/date.js";
|
import { formatRelativeTime } from "../../utils/date.js";
|
||||||
import ApplicationsManager from "../applications.js";
|
import ApplicationsManager from "../applications.js";
|
||||||
|
|
||||||
export const ASCII_LOGO = `
|
|
||||||
:.
|
|
||||||
-==.
|
|
||||||
.=====:
|
|
||||||
---::..:=======-.
|
|
||||||
:===+=----------::..
|
|
||||||
=+=---------------:..
|
|
||||||
--------------------:.
|
|
||||||
.:-+=----*###*--*####=---.
|
|
||||||
:==+----#%+-+%#-##%*+----:.
|
|
||||||
.=----#%+-+%#-*+-%#+---:.
|
|
||||||
==----*###*--*###*----.
|
|
||||||
==+-------------------:.
|
|
||||||
...::---------------:.
|
|
||||||
.::---------::..
|
|
||||||
....::... `;
|
|
||||||
|
|
||||||
export class Command {
|
export class Command {
|
||||||
/**
|
/**
|
||||||
* @param {string} name
|
* @param {string} name
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
|
import { VirtualFile } from "../virtual-drive/virtualFile.js";
|
||||||
import { VirtualFile } from "../virtual-drive/virtual-file.js";
|
import { VirtualRoot } from "../virtual-drive/virtualRoot.js";
|
||||||
|
|
||||||
import { VirtualRoot } from "../virtual-drive/virtual-root.js";
|
|
||||||
|
|
||||||
export class Settings {
|
export class Settings {
|
||||||
xmlDoc = null;
|
xmlDoc = null;
|
||||||
|
|
@ -119,42 +117,4 @@ export class Settings {
|
||||||
|
|
||||||
await this.write();
|
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 { EventEmitter } from "../utils/events.js";
|
||||||
|
|
||||||
import { VirtualRoot } from "./virtual-root.js";
|
import { VirtualRoot } from "./virtualRoot.js";
|
||||||
|
|
||||||
export class VirtualBase extends EventEmitter {
|
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
|
* A virtual file that can be stored inside a folder
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { removeFromArray } from "../utils/array.js";
|
import { removeFromArray } from "../utils/array.js";
|
||||||
import { VirtualBase } from "./virtual-base.js";
|
import { VirtualBase } from "./virtualBase.js";
|
||||||
import { VirtualFile } from "./virtual-file.js";
|
import { VirtualFile } from "./virtualFile.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A virtual folder that can contains files and sub-folders
|
* A virtual folder that can contains files and sub-folders
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
import { StorageManager } from "../storage/storage.js";
|
import { WALLPAPER_COUNT } from "../../constants/virtualDrive.js";
|
||||||
import { VirtualFile } from "./virtual-file.js";
|
import { StorageManager } from "../storage/storageManager.js";
|
||||||
import { VirtualFolder } from "./virtual-folder.js";
|
import { VirtualFile } from "./virtualFile.js";
|
||||||
|
import { VirtualFolder } from "./virtualFolder.js";
|
||||||
export const WALLPAPER_COUNT = 8;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A virtual folder that serves as the root folder
|
* A virtual folder that serves as the root folder
|
||||||
|
|
@ -55,7 +54,7 @@ export class VirtualRoot extends VirtualFolder {
|
||||||
.createFolder("Images", (folder) => {
|
.createFolder("Images", (folder) => {
|
||||||
for (let i = 0; i < WALLPAPER_COUNT; i++) {
|
for (let i = 0; i < WALLPAPER_COUNT; i++) {
|
||||||
folder.createFile(`Wallpaper${i + 1}`, "png", (file) => {
|
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
|
* Adds a shortcut to a file or folder
|
||||||
* @param {string} name
|
* @param {string} name
|
||||||
* @param {VirtualFile|VirtualFolder} destination
|
* @param {VirtualFile | VirtualFolder} destination
|
||||||
* @returns {VirtualRoot}
|
* @returns {VirtualRoot}
|
||||||
*/
|
*/
|
||||||
addShortcut(name, destination) {
|
addShortcut(name, destination) {
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import ApplicationsManager from "../applications/applications.js";
|
import ApplicationsManager from "../applications/applications.js";
|
||||||
import { randomRange } from "../math/random.js";
|
import { randomRange } from "../math/random.js";
|
||||||
import Vector2 from "../math/vector2.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 SCREEN_MARGIN = 32;
|
||||||
export const TASKBAR_HEIGHT = 48;
|
export const TASKBAR_HEIGHT = 48;
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { createContext, useContext } from "react";
|
import { createContext, useContext } from "react";
|
||||||
import { SettingsManager } from "../../features/settings/settings.js";
|
import { SettingsManager } from "../../features/settings/settingsManager.js";
|
||||||
import { useVirtualRoot } from "../virtual-drive/VirtualRootContext.js";
|
import { useVirtualRoot } from "../virtual-drive/virtualRootContext.js";
|
||||||
|
|
||||||
const SettingsContext = createContext();
|
const SettingsContext = createContext();
|
||||||
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { createContext, useContext } from "react";
|
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();
|
const VirtualRootContext = createContext();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { createContext, useContext } from "react";
|
import { createContext, useContext } from "react";
|
||||||
import WindowsManager from "../../features/windows/windows.js";
|
import WindowsManager from "../../features/windows/windowsManager.js";
|
||||||
import { WindowsProvider } from "./WindowsContext.js";
|
import { WindowsProvider } from "./windowsContext.js";
|
||||||
|
|
||||||
const WindowsManagerContext = createContext();
|
const WindowsManagerContext = createContext();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import ReactDOM from "react-dom/client";
|
||||||
import "./styles/global.css";
|
import "./styles/global.css";
|
||||||
import App from "./App";
|
import App from "./App";
|
||||||
import reportWebVitals from "./reportWebVitals";
|
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();
|
export const START_DATE = new Date();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,62 +7,62 @@
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Poppins";
|
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-weight: 100;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Poppins";
|
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-weight: 200;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Poppins";
|
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-weight: 300;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Poppins";
|
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-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Poppins";
|
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-weight: 500;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Poppins";
|
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-weight: 600;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Poppins";
|
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-weight: 700;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Poppins";
|
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-weight: 800;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Roboto Mono";
|
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;
|
font-display: swap;
|
||||||
}
|
}
|
||||||