Refactored taskbar
This commit is contained in:
parent
1e993fb632
commit
30cb42ce4a
13 changed files with 62 additions and 52 deletions
|
|
@ -8,13 +8,13 @@ import { useWindowsManager } from "../../hooks/windows/WindowsManagerContext.js"
|
||||||
import { ReactSVG } from "react-svg";
|
import { ReactSVG } from "react-svg";
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
import Application from "../../features/applications/application.js";
|
import Application from "../../features/applications/application.js";
|
||||||
import { HomeMenu } from "./HomeMenu.jsx";
|
import { HomeMenu } from "./menus/HomeMenu.jsx";
|
||||||
import OutsideClickListener from "../../hooks/utils/outsideClick.js";
|
import OutsideClickListener from "../../hooks/utils/outsideClick.js";
|
||||||
import { Battery } from "./Battery.jsx";
|
import { Battery } from "./indicators/Battery.jsx";
|
||||||
import { Network } from "./Network.jsx";
|
import { Network } from "./indicators/Network.jsx";
|
||||||
import { Volume } from "./Volume.jsx";
|
import { Volume } from "./indicators/Volume.jsx";
|
||||||
import { SearchMenu } from "./SearchMenu.jsx";
|
import { SearchMenu } from "./menus/SearchMenu.jsx";
|
||||||
import { Calendar } from "./Calendar.jsx";
|
import { Calendar } from "./indicators/Calendar.jsx";
|
||||||
import { useScrollWithShadow } from "../../hooks/utils/scrollWithShadows.js";
|
import { useScrollWithShadow } from "../../hooks/utils/scrollWithShadows.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import { useEffect, useState } from "react";
|
||||||
import styles from "./Battery.module.css";
|
import styles from "./Battery.module.css";
|
||||||
|
|
||||||
export function Battery() {
|
export function Battery() {
|
||||||
const [isCharging, setIsCharging] = useState(false);
|
const [isCharging, setIsCharging] = useState(true);
|
||||||
const [percentage, setPercentage] = useState(100);
|
const [percentage, setPercentage] = useState(100);
|
||||||
// const [chargingTime, setChargingTime] = useState(0);
|
// const [chargingTime, setChargingTime] = useState(0);
|
||||||
// const [dischargingTime, setDischargingTime] = useState(0);
|
// const [dischargingTime, setDischargingTime] = useState(0);
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
.App-list {
|
.App-list {
|
||||||
--scrollbar-color: rgba(0, 0, 0, 25%);
|
--scrollbar-color: rgba(0, 0, 0, 25%);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.App-button {
|
.App-button {
|
||||||
|
|
@ -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";
|
||||||
|
|
||||||
export function HomeMenu({ active, setActive, search }) {
|
export function HomeMenu({ active, setActive, search }) {
|
||||||
const windowsManager = useWindowsManager();
|
const windowsManager = useWindowsManager();
|
||||||
|
|
@ -8,13 +8,20 @@
|
||||||
|
|
||||||
.Container-inner {
|
.Container-inner {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
display: flex;
|
||||||
|
min-width: 16rem;
|
||||||
|
max-width: 32rem;
|
||||||
background-color: rgba(25, 25, 25, 75%);
|
background-color: rgba(25, 25, 25, 75%);
|
||||||
|
border-top-left-radius: 0.5rem;
|
||||||
|
border-top-right-radius: 0.5rem;
|
||||||
|
border-bottom-right-radius: 0.5rem;
|
||||||
backdrop-filter: blur(15px);
|
backdrop-filter: blur(15px);
|
||||||
transform: none;
|
transform: none;
|
||||||
transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;
|
transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;
|
||||||
|
overflow: hidden;
|
||||||
|
resize: horizontal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.Container-outer:not(.Active) {
|
.Container-outer:not(.Active) {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
@ -24,17 +31,6 @@
|
||||||
transform: translateY(100px);
|
transform: translateY(100px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.Container-inner {
|
|
||||||
display: flex;
|
|
||||||
min-width: 16rem;
|
|
||||||
max-width: 32rem;
|
|
||||||
border-top-left-radius: 0.5rem;
|
|
||||||
border-top-right-radius: 0.5rem;
|
|
||||||
border-bottom-right-radius: 0.5rem;
|
|
||||||
overflow: hidden;
|
|
||||||
resize: horizontal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Buttons {
|
.Buttons {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
|
|
@ -1,34 +1,48 @@
|
||||||
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";
|
||||||
|
|
||||||
export function SearchMenu({ active, setActive, searchQuery, setSearchQuery, inputRef }) {
|
export function SearchMenu({ active, setActive, searchQuery, setSearchQuery, inputRef }) {
|
||||||
const windowsManager = useWindowsManager();
|
const windowsManager = useWindowsManager();
|
||||||
|
const [apps, setApps] = useState(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (inputRef.current)
|
if (inputRef.current)
|
||||||
inputRef.current.focus();
|
inputRef.current.focus();
|
||||||
}, [inputRef]);
|
}, [inputRef]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setApps(ApplicationsManager.APPLICATIONS.filter(({ name }) =>
|
||||||
|
name.toLowerCase().includes(searchQuery.toLowerCase().trim())
|
||||||
|
));
|
||||||
|
}, [searchQuery]);
|
||||||
|
|
||||||
const onChange = (event) => {
|
const onChange = (event) => {
|
||||||
const value = event.target.value;
|
const value = event.target.value;
|
||||||
setSearchQuery(value);
|
setSearchQuery(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
const classNames = [styles["Container-outer"]];
|
const classNames = [styles["Container-outer"]];
|
||||||
if (active)
|
if (active && apps)
|
||||||
classNames.push(styles.Active);
|
classNames.push(styles.Active);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames.join(" ")}>
|
<div className={classNames.join(" ")}>
|
||||||
<div className={styles["Container-inner"]}>
|
<div className={styles["Container-inner"]}>
|
||||||
|
<input
|
||||||
|
ref={inputRef}
|
||||||
|
className={styles.Input}
|
||||||
|
value={searchQuery}
|
||||||
|
onChange={onChange}
|
||||||
|
spellCheck={false}
|
||||||
|
autoFocus
|
||||||
|
/>
|
||||||
<div className={appStyles["App-list"]}>
|
<div className={appStyles["App-list"]}>
|
||||||
{ApplicationsManager.APPLICATIONS.filter(({ name }) =>
|
{apps?.map(({ name, id }) =>
|
||||||
name.toLowerCase().includes(searchQuery.toLowerCase().trim())
|
|
||||||
).map(({ name, id }) =>
|
|
||||||
<button
|
<button
|
||||||
key={id}
|
key={id}
|
||||||
className={appStyles["App-button"]}
|
className={appStyles["App-button"]}
|
||||||
|
|
@ -43,14 +57,6 @@ export function SearchMenu({ active, setActive, searchQuery, setSearchQuery, inp
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<input
|
|
||||||
ref={inputRef}
|
|
||||||
className={styles.Input}
|
|
||||||
value={searchQuery}
|
|
||||||
onChange={onChange}
|
|
||||||
spellCheck={false}
|
|
||||||
autoFocus
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
@ -1,17 +1,31 @@
|
||||||
.Container-outer {
|
.Container-outer {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
left: 0;
|
left: 0;
|
||||||
bottom: 100%;
|
bottom: 100%;
|
||||||
height: auto !important;
|
height: auto !important;
|
||||||
|
max-height: 20rem;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Container-inner {
|
.Container-inner {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
display: flex;
|
||||||
|
gap: 0.5rem;
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
min-width: 13rem;
|
||||||
|
max-width: 19rem;
|
||||||
|
padding: 0.5rem;
|
||||||
background-color: rgba(25, 25, 25, 75%);
|
background-color: rgba(25, 25, 25, 75%);
|
||||||
|
border-top-left-radius: 0.5rem;
|
||||||
|
border-top-right-radius: 0.5rem;
|
||||||
|
border-bottom-right-radius: 0.5rem;
|
||||||
backdrop-filter: blur(15px);
|
backdrop-filter: blur(15px);
|
||||||
transform: none;
|
transform: none;
|
||||||
transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;
|
transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;
|
||||||
|
overflow: hidden;
|
||||||
|
resize: horizontal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Container-outer:not(.Active) {
|
.Container-outer:not(.Active) {
|
||||||
|
|
@ -23,18 +37,8 @@
|
||||||
transform: translateY(100px);
|
transform: translateY(100px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.Container-inner {
|
.Container-inner > div {
|
||||||
display: flex;
|
margin-top: auto;
|
||||||
flex-direction: column;
|
|
||||||
min-width: 13rem;
|
|
||||||
max-width: 29rem;
|
|
||||||
max-height: 20rem;
|
|
||||||
padding: 0.5rem;
|
|
||||||
border-top-left-radius: 0.5rem;
|
|
||||||
border-top-right-radius: 0.5rem;
|
|
||||||
border-bottom-right-radius: 0.5rem;
|
|
||||||
overflow: hidden;
|
|
||||||
resize: horizontal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.Input {
|
.Input {
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
export function closeTab() {
|
export function closeTab() {
|
||||||
// The following method only works in some browsers
|
if (window.confirm("Are you sure you want to shut down ProzillaOS?")) {
|
||||||
window.close();
|
window.open("about:blank", "_self");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in a new issue