QOL improvements + SEO
This commit is contained in:
parent
7df82a7ae5
commit
0f62e00141
7 changed files with 77 additions and 12 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
|
|
||||||
|
import { useEffect } from "react";
|
||||||
import { VirtualFile } from "../../../features/virtual-drive/virtual-file.js";
|
import { VirtualFile } from "../../../features/virtual-drive/virtual-file.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";
|
||||||
|
|
@ -7,10 +8,16 @@ import styles from "./MediaViewer.module.css";
|
||||||
* @param {object} props
|
* @param {object} props
|
||||||
* @param {VirtualFile} props.file
|
* @param {VirtualFile} props.file
|
||||||
* @param {Function} props.close
|
* @param {Function} props.close
|
||||||
|
* @param {Function} props.setTitle
|
||||||
*/
|
*/
|
||||||
export function MediaViewer({ file, close }) {
|
export function MediaViewer({ file, close, setTitle }) {
|
||||||
const windowsManager = useWindowsManager();
|
const windowsManager = useWindowsManager();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (file != null)
|
||||||
|
setTitle(file.id);
|
||||||
|
}, [file, setTitle]);
|
||||||
|
|
||||||
if (file == null) {
|
if (file == null) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
windowsManager.open("file-explorer", { startPath: "~/Images" });
|
windowsManager.open("file-explorer", { startPath: "~/Images" });
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import styles from "./Settings.module.css";
|
import styles from "./Settings.module.css";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { faHardDrive, faPalette } from "@fortawesome/free-solid-svg-icons";
|
import { faCircleInfo, faHardDrive, faPalette } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
import { useVirtualRoot } from "../../../hooks/virtual-drive/VirtualRootContext.js";
|
||||||
import { useSettings } from "../../../hooks/settings/SettingsContext.js";
|
import { useSettings } from "../../../hooks/settings/SettingsContext.js";
|
||||||
import { SettingsManager } from "../../../features/settings/settings.js";
|
import { SettingsManager } from "../../../features/settings/settings.js";
|
||||||
|
|
@ -11,6 +11,8 @@ import { round } from "../../../features/math/round.js";
|
||||||
import { Button } from "../../utils/Button.jsx";
|
import { Button } from "../../utils/Button.jsx";
|
||||||
import { ProgressBar } from "../../utils/ProgressBar.jsx";
|
import { ProgressBar } from "../../utils/ProgressBar.jsx";
|
||||||
import utilStyles from "../../../styles/utils.module.css";
|
import utilStyles from "../../../styles/utils.module.css";
|
||||||
|
import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.js";
|
||||||
|
import Vector2 from "../../../features/math/vector2.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {object} props
|
* @param {object} props
|
||||||
|
|
@ -75,21 +77,57 @@ function StorageTab({ virtualRoot }) {
|
||||||
</>);
|
</>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function AboutTab({ windowsManager, virtualRoot }) {
|
||||||
|
return (<>
|
||||||
|
<div className={styles["Option"]}>
|
||||||
|
<p className={styles["Label"]}>About ProzillaOS</p>
|
||||||
|
<p className={utilStyles["Text-light"]}>ProzillaOS is a web-based operating system inspired by Ubuntu Linux and Windows made with React.js by Prozilla.</p>
|
||||||
|
<Button
|
||||||
|
className={`${styles.Button} ${utilStyles["Text-bold"]}`}
|
||||||
|
onClick={(event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
windowsManager.open("text-editor", {
|
||||||
|
mode: "view",
|
||||||
|
file: virtualRoot.navigate("~/Documents").findFile("info", "md"),
|
||||||
|
size: new Vector2(575, 675),
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Open info.md
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
className={`${styles.Button} ${utilStyles["Text-bold"]}`}
|
||||||
|
onClick={(event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
window.open("https://github.com/Prozilla/prozilla-os");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
View source
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</>);
|
||||||
|
}
|
||||||
|
|
||||||
export function Settings() {
|
export function Settings() {
|
||||||
const [tabIndex, setTabIndex] = useState(0);
|
const [tabIndex, setTabIndex] = useState(0);
|
||||||
const virtualRoot = useVirtualRoot();
|
const virtualRoot = useVirtualRoot();
|
||||||
const settingsManager = useSettings();
|
const settingsManager = useSettings();
|
||||||
|
const windowsManager = useWindowsManager();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.Container}>
|
<div className={styles.Container}>
|
||||||
<div className={styles.Tabs}>
|
<div className={styles.Tabs}>
|
||||||
<button title="Appearance" className={`${styles["Tab-button"]} ${utilStyles["Text-semibold"]}`} onClick={() => { setTabIndex(0); }}>
|
<button title="Appearance" className={styles["Tab-button"]} onClick={() => { setTabIndex(0); }}>
|
||||||
<FontAwesomeIcon icon={faPalette}/>
|
<FontAwesomeIcon icon={faPalette}/>
|
||||||
Appearance
|
<p className={utilStyles["Text-semibold"]}>Appearance</p>
|
||||||
</button>
|
</button>
|
||||||
<button title="Storage" className={`${styles["Tab-button"]} ${utilStyles["Text-semibold"]}`} onClick={() => { setTabIndex(1); }}>
|
<button title="Storage" className={styles["Tab-button"]} onClick={() => { setTabIndex(1); }}>
|
||||||
<FontAwesomeIcon icon={faHardDrive}/>
|
<FontAwesomeIcon icon={faHardDrive}/>
|
||||||
Storage
|
<p className={utilStyles["Text-semibold"]}>Storage</p>
|
||||||
|
</button>
|
||||||
|
<button title="Storage" className={styles["Tab-button"]} onClick={() => { setTabIndex(2); }}>
|
||||||
|
<FontAwesomeIcon icon={faCircleInfo}/>
|
||||||
|
<p className={utilStyles["Text-semibold"]}>About</p>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles["Tab-panel"]}>
|
<div className={styles["Tab-panel"]}>
|
||||||
|
|
@ -97,7 +135,9 @@ export function Settings() {
|
||||||
? <AppearanceTab virtualRoot={virtualRoot} settingsManager={settingsManager}/>
|
? <AppearanceTab virtualRoot={virtualRoot} settingsManager={settingsManager}/>
|
||||||
: tabIndex === 1
|
: tabIndex === 1
|
||||||
? <StorageTab virtualRoot={virtualRoot}/>
|
? <StorageTab virtualRoot={virtualRoot}/>
|
||||||
: null
|
: tabIndex === 2
|
||||||
|
? <AboutTab virtualRoot={virtualRoot} windowsManager={windowsManager}/>
|
||||||
|
: null
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -40,11 +40,15 @@
|
||||||
background-color: rgba(255, 255, 255, 10%);
|
background-color: rgba(255, 255, 255, 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.Tab-button svg {
|
.Tab-button > svg {
|
||||||
height: 1.35rem;
|
height: 1.35rem;
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.Tab-button > p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.Tab-panel {
|
.Tab-panel {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
@ -57,6 +61,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.Option {
|
.Option {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
text-align: start;
|
text-align: start;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
@ -102,6 +110,7 @@
|
||||||
.Button {
|
.Button {
|
||||||
--hover-color: var(--background-color-b);
|
--hover-color: var(--background-color-b);
|
||||||
|
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
padding: 0.5rem 1rem;
|
padding: 0.5rem 1rem;
|
||||||
color: var(--foreground-color-a);
|
color: var(--foreground-color-a);
|
||||||
background-color: var(--background-color-a);
|
background-color: var(--background-color-a);
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,7 @@ function AppButton({ app }) {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setActive(windowsManager.isAppActive(app.id));
|
setActive(windowsManager.isAppActive(app.id));
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
}, [app.id, windows, windowsManager]);
|
||||||
}, [windows]);
|
|
||||||
|
|
||||||
const classNames = [styles["App-icon"]];
|
const classNames = [styles["App-icon"]];
|
||||||
if (active)
|
if (active)
|
||||||
|
|
|
||||||
|
|
@ -64,5 +64,5 @@
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ import { useWindowsManager } from "../../../hooks/windows/WindowsManagerContext.
|
||||||
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";
|
||||||
|
import { useKeyboardListener } from "../../../hooks/utils/keyboard.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {object} props
|
* @param {object} props
|
||||||
|
|
@ -43,6 +44,15 @@ export function SearchMenu({ active, setActive, searchQuery, setSearchQuery, inp
|
||||||
if (active && apps)
|
if (active && apps)
|
||||||
classNames.push(styles.Active);
|
classNames.push(styles.Active);
|
||||||
|
|
||||||
|
const onKeyDown = (event) => {
|
||||||
|
if (event.key === "f" && event.ctrlKey) {
|
||||||
|
event.preventDefault();
|
||||||
|
setActive(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useKeyboardListener({ onKeyDown });
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames.join(" ")}>
|
<div className={classNames.join(" ")}>
|
||||||
<div className={styles["Container-inner"]}>
|
<div className={styles["Container-inner"]}>
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import Vector2 from "../math/vector2.js";
|
||||||
|
|
||||||
export default class ApplicationsManager {
|
export default class ApplicationsManager {
|
||||||
static APPLICATIONS = [
|
static APPLICATIONS = [
|
||||||
new Application("Terminal", "terminal", Terminal),
|
new Application("Commands", "terminal", Terminal),
|
||||||
new Application("Settings", "settings", Settings),
|
new Application("Settings", "settings", Settings),
|
||||||
// new Application("Browser", "browser"),
|
// new Application("Browser", "browser"),
|
||||||
// new Application("Calculator", "calculator", Calculator, { size: new Vector2(400, 600) }),
|
// new Application("Calculator", "calculator", Calculator, { size: new Vector2(400, 600) }),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue