From 3c579d0e275cdaf6f2c9589abade94bde7905c82 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 26 Apr 2025 22:36:23 +1000 Subject: clean Remove everything --- .gitignore | 3 - .vscode/settings.json | 3 - app.tsx | 132 --- .../icons/caelestia-bluetooth-device-symbolic.svg | 6 - assets/icons/caelestia-consecutive-symbolic.svg | 5 - assets/icons/caelestia-feishin-symbolic.svg | 4 - assets/icons/caelestia-media-generic-symbolic.svg | 2 - assets/icons/caelestia-media-none-symbolic.svg | 19 - .../icons/caelestia-mozilla-firefox-symbolic.svg | 4 - assets/icons/caelestia-no-repeat-symbolic.svg | 6 - assets/icons/caelestia-pause-symbolic.svg | 8 - assets/icons/caelestia-play-symbolic.svg | 5 - assets/icons/caelestia-repeat-one-symbolic.svg | 5 - assets/icons/caelestia-repeat-symbolic.svg | 5 - assets/icons/caelestia-shuffle-symbolic.svg | 5 - assets/icons/caelestia-skip-next-symbolic.svg | 8 - assets/icons/caelestia-skip-previous-symbolic.svg | 8 - assets/icons/caelestia-spotify-symbolic.svg | 21 - env.d.ts | 4 - package-lock.json | 616 ----------- package.json | 11 - run.fish | 17 - scss/_font.scss | 21 - scss/_lib.scss | 47 - scss/bar.scss | 394 ------- scss/common.scss | 68 -- scss/launcher.scss | 332 ------ scss/mediadisplay.scss | 139 --- scss/navbar.scss | 65 -- scss/notifpopups.scss | 51 - scss/osds.scss | 51 - scss/scheme/_default.scss | 31 - scss/session.scss | 58 - scss/sidebar.scss | 1118 -------------------- scss/widgets.scss | 136 --- src/config/defaults.ts | 183 ---- src/config/funcs.ts | 124 --- src/config/index.ts | 26 - src/config/literals.ts | 336 ------ src/config/types.ts | 93 -- src/modules/bar.tsx | 703 ------------ src/modules/launcher/actions.tsx | 522 --------- src/modules/launcher/index.tsx | 144 --- src/modules/launcher/modes.tsx | 225 ---- src/modules/launcher/util.tsx | 19 - src/modules/mediadisplay/index.tsx | 188 ---- src/modules/mediadisplay/visualiser.tsx | 71 -- src/modules/navbar.tsx | 203 ---- src/modules/notifpopups.tsx | 72 -- src/modules/osds.tsx | 327 ------ src/modules/screencorners.tsx | 51 - src/modules/session.tsx | 44 - src/modules/sidebar/alerts.tsx | 11 - src/modules/sidebar/audio.tsx | 13 - src/modules/sidebar/connectivity.tsx | 10 - src/modules/sidebar/dashboard.tsx | 132 --- src/modules/sidebar/index.tsx | 87 -- src/modules/sidebar/modules/bluetooth.tsx | 127 --- src/modules/sidebar/modules/calendar.tsx | 252 ----- src/modules/sidebar/modules/deviceselector.tsx | 126 --- src/modules/sidebar/modules/headlines.tsx | 204 ---- src/modules/sidebar/modules/hwresources.tsx | 67 -- src/modules/sidebar/modules/media.tsx | 168 --- src/modules/sidebar/modules/networks.tsx | 151 --- src/modules/sidebar/modules/news.tsx | 113 -- src/modules/sidebar/modules/notifications.tsx | 90 -- src/modules/sidebar/modules/streams.tsx | 110 -- src/modules/sidebar/modules/upcoming.tsx | 99 -- src/modules/sidebar/modules/updates.tsx | 109 -- src/modules/sidebar/packages.tsx | 11 - src/modules/sidebar/time.tsx | 24 - src/services/apps.ts | 3 - src/services/calendar.ts | 228 ---- src/services/cpu.ts | 49 - src/services/gpu.ts | 63 -- src/services/math.ts | 155 --- src/services/memory.ts | 64 -- src/services/monitors.ts | 127 --- src/services/news.ts | 153 --- src/services/palette.ts | 298 ------ src/services/players.ts | 148 --- src/services/schemes.ts | 109 -- src/services/storage.ts | 65 -- src/services/updates.ts | 191 ---- src/services/wallpapers.ts | 127 --- src/services/weather.ts | 388 ------- src/utils/icons.ts | 158 --- src/utils/mpris.ts | 16 - src/utils/strings.ts | 18 - src/utils/system.ts | 111 -- src/utils/thumbnailer.ts | 80 -- src/utils/types.ts | 35 - src/utils/widgets.ts | 82 -- src/widgets/notification.tsx | 179 ---- src/widgets/popupwindow.ts | 75 -- src/widgets/screencorner.tsx | 49 - src/widgets/slider.tsx | 64 -- style.scss | 25 - tsconfig.json | 21 - 99 files changed, 11724 deletions(-) delete mode 100644 .gitignore delete mode 100644 .vscode/settings.json delete mode 100644 app.tsx delete mode 100644 assets/icons/caelestia-bluetooth-device-symbolic.svg delete mode 100644 assets/icons/caelestia-consecutive-symbolic.svg delete mode 100644 assets/icons/caelestia-feishin-symbolic.svg delete mode 100644 assets/icons/caelestia-media-generic-symbolic.svg delete mode 100644 assets/icons/caelestia-media-none-symbolic.svg delete mode 100644 assets/icons/caelestia-mozilla-firefox-symbolic.svg delete mode 100644 assets/icons/caelestia-no-repeat-symbolic.svg delete mode 100644 assets/icons/caelestia-pause-symbolic.svg delete mode 100644 assets/icons/caelestia-play-symbolic.svg delete mode 100644 assets/icons/caelestia-repeat-one-symbolic.svg delete mode 100644 assets/icons/caelestia-repeat-symbolic.svg delete mode 100644 assets/icons/caelestia-shuffle-symbolic.svg delete mode 100644 assets/icons/caelestia-skip-next-symbolic.svg delete mode 100644 assets/icons/caelestia-skip-previous-symbolic.svg delete mode 100644 assets/icons/caelestia-spotify-symbolic.svg delete mode 100644 env.d.ts delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100755 run.fish delete mode 100644 scss/_font.scss delete mode 100644 scss/_lib.scss delete mode 100644 scss/bar.scss delete mode 100644 scss/common.scss delete mode 100644 scss/launcher.scss delete mode 100644 scss/mediadisplay.scss delete mode 100644 scss/navbar.scss delete mode 100644 scss/notifpopups.scss delete mode 100644 scss/osds.scss delete mode 100644 scss/scheme/_default.scss delete mode 100644 scss/session.scss delete mode 100644 scss/sidebar.scss delete mode 100644 scss/widgets.scss delete mode 100644 src/config/defaults.ts delete mode 100644 src/config/funcs.ts delete mode 100644 src/config/index.ts delete mode 100644 src/config/literals.ts delete mode 100644 src/config/types.ts delete mode 100644 src/modules/bar.tsx delete mode 100644 src/modules/launcher/actions.tsx delete mode 100644 src/modules/launcher/index.tsx delete mode 100644 src/modules/launcher/modes.tsx delete mode 100644 src/modules/launcher/util.tsx delete mode 100644 src/modules/mediadisplay/index.tsx delete mode 100644 src/modules/mediadisplay/visualiser.tsx delete mode 100644 src/modules/navbar.tsx delete mode 100644 src/modules/notifpopups.tsx delete mode 100644 src/modules/osds.tsx delete mode 100644 src/modules/screencorners.tsx delete mode 100644 src/modules/session.tsx delete mode 100644 src/modules/sidebar/alerts.tsx delete mode 100644 src/modules/sidebar/audio.tsx delete mode 100644 src/modules/sidebar/connectivity.tsx delete mode 100644 src/modules/sidebar/dashboard.tsx delete mode 100644 src/modules/sidebar/index.tsx delete mode 100644 src/modules/sidebar/modules/bluetooth.tsx delete mode 100644 src/modules/sidebar/modules/calendar.tsx delete mode 100644 src/modules/sidebar/modules/deviceselector.tsx delete mode 100644 src/modules/sidebar/modules/headlines.tsx delete mode 100644 src/modules/sidebar/modules/hwresources.tsx delete mode 100644 src/modules/sidebar/modules/media.tsx delete mode 100644 src/modules/sidebar/modules/networks.tsx delete mode 100644 src/modules/sidebar/modules/news.tsx delete mode 100644 src/modules/sidebar/modules/notifications.tsx delete mode 100644 src/modules/sidebar/modules/streams.tsx delete mode 100644 src/modules/sidebar/modules/upcoming.tsx delete mode 100644 src/modules/sidebar/modules/updates.tsx delete mode 100644 src/modules/sidebar/packages.tsx delete mode 100644 src/modules/sidebar/time.tsx delete mode 100644 src/services/apps.ts delete mode 100644 src/services/calendar.ts delete mode 100644 src/services/cpu.ts delete mode 100644 src/services/gpu.ts delete mode 100644 src/services/math.ts delete mode 100644 src/services/memory.ts delete mode 100644 src/services/monitors.ts delete mode 100644 src/services/news.ts delete mode 100644 src/services/palette.ts delete mode 100644 src/services/players.ts delete mode 100644 src/services/schemes.ts delete mode 100644 src/services/storage.ts delete mode 100644 src/services/updates.ts delete mode 100644 src/services/wallpapers.ts delete mode 100644 src/services/weather.ts delete mode 100644 src/utils/icons.ts delete mode 100644 src/utils/mpris.ts delete mode 100644 src/utils/strings.ts delete mode 100644 src/utils/system.ts delete mode 100644 src/utils/thumbnailer.ts delete mode 100644 src/utils/types.ts delete mode 100644 src/utils/widgets.ts delete mode 100644 src/widgets/notification.tsx delete mode 100644 src/widgets/popupwindow.ts delete mode 100644 src/widgets/screencorner.tsx delete mode 100644 src/widgets/slider.tsx delete mode 100644 style.scss delete mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 89341d4..0000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -@girs/ -node_modules/ -scss/scheme/_index.scss diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 72446f4..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "node_modules/typescript/lib" -} diff --git a/app.tsx b/app.tsx deleted file mode 100644 index dcc93d8..0000000 --- a/app.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import Bar from "@/modules/bar"; -import Launcher from "@/modules/launcher"; -import MediaDisplay from "@/modules/mediadisplay"; -import NavBar from "@/modules/navbar"; -import NotifPopups from "@/modules/notifpopups"; -import Osds from "@/modules/osds"; -import ScreenCorners, { BarScreenCorners } from "@/modules/screencorners"; -import Session from "@/modules/session"; -import SideBar from "@/modules/sidebar"; -import Calendar from "@/services/calendar"; -import Monitors from "@/services/monitors"; -import Palette from "@/services/palette"; -import Players from "@/services/players"; -import Schemes from "@/services/schemes"; -import Wallpapers from "@/services/wallpapers"; -import { execAsync, idle, timeout, writeFileAsync } from "astal"; -import { App } from "astal/gtk3"; -import { style } from "config"; -import { initConfig, updateConfig } from "config/funcs"; - -const isLayer = (name: string) => - ["base", "mantle", "crust"].includes(name) || name.startsWith("surface") || name.startsWith("overlay"); - -const applyTransparency = (name: string, hex: string) => { - const mode = style.transparency.get(); - if (mode === "off" || !isLayer(name)) return hex; - let amount = 0.78; - if (mode === "low") amount = 0.88; - else if (mode === "high") amount = 0.58; - return `color.change(${hex}, $alpha: ${amount})`; -}; - -const applyVibrancy = (hex: string) => (style.vibrant.get() ? `color.scale(${hex}, $saturation: 40%)` : hex); - -const getVars = () => { - const vars = { light: Palette.get_default().mode === "light", borders: style.borders.get() }; - return Object.entries(vars) - .map(([k, v]) => `$${k}: ${v}`) - .join(";"); -}; - -const styleLoader = new (class { - #running = false; - #dirty = false; - - async run() { - this.#dirty = true; - if (this.#running) return; - this.#running = true; - while (this.#dirty) { - this.#dirty = false; - await this.#run(); - } - this.#running = false; - } - - async #run() { - const schemeColours = Object.entries(Palette.get_default().colours) - .map(([name, hex]) => `$${name}: ${applyVibrancy(applyTransparency(name, hex))};`) - .join("\n"); - await writeFileAsync(`${SRC}/scss/scheme/_index.scss`, `@use "sass:color";\n${getVars()};\n${schemeColours}`); - App.apply_css(await execAsync(`sass ${SRC}/style.scss`), true); - } -})(); - -export const loadStyleAsync = () => styleLoader.run(); - -App.start({ - instanceName: "caelestia", - icons: "assets/icons", - async main() { - try { - const now = Date.now(); - - await initConfig(); - - loadStyleAsync().catch(console.error); - Palette.get_default().connect("notify::colours", () => loadStyleAsync().catch(console.error)); - Palette.get_default().connect("notify::mode", () => loadStyleAsync().catch(console.error)); - - ; - ; - ; - Monitors.get_default().forEach(m => ); - Monitors.get_default().forEach(m => ); - Monitors.get_default().forEach(m => ); - Monitors.get_default().forEach(m => ); - Monitors.get_default().forEach(m => ); - Monitors.get_default().forEach(m => ); - Monitors.get_default().forEach(m => ); - - // Init services - timeout(5000, () => { - idle(() => Schemes.get_default()); - idle(() => Wallpapers.get_default()); - idle(() => Calendar.get_default()); - }); - - console.log(`Caelestia started in ${Date.now() - now}ms`); - } catch (e) { - console.error(e); - } - }, - requestHandler(request, res) { - if (request === "reload-css") loadStyleAsync().catch(console.error); - else if (request === "reload-config") updateConfig(); - else if (request.startsWith("show")) App.get_window(request.split(" ")[1])?.show(); - else if (request.startsWith("toggle")) - App.toggle_window(request.split(" ")[1] + Monitors.get_default().active.id); - else if (request === "media play-pause") Players.get_default().lastPlayer?.play_pause(); - else if (request === "media next") Players.get_default().lastPlayer?.next(); - else if (request === "media previous") Players.get_default().lastPlayer?.previous(); - else if (request === "media stop") Players.get_default().lastPlayer?.stop(); - else if (request.startsWith("media")) { - const player = Players.get_default().lastPlayer; - const key = request.split(" ")[1]; - if (player === null) return res("No media"); - if (key in player) return res(player[key as keyof typeof player]); - return res(`Invalid key: ${key}`); - } else if (request.startsWith("brightness")) { - const value = request.split(" ")[1]; - const num = parseFloat(value) / (value.includes("%") ? 100 : 1); - if (isNaN(num)) return res("Syntax: brightness [%][+ | -]"); - if (value.includes("+")) Monitors.get_default().active.brightness += num; - else if (value.includes("-")) Monitors.get_default().active.brightness -= num; - else Monitors.get_default().active.brightness = num; - } else return res("Unknown command: " + request); - - console.log(`Request handled: ${request}`); - res("OK"); - }, -}); diff --git a/assets/icons/caelestia-bluetooth-device-symbolic.svg b/assets/icons/caelestia-bluetooth-device-symbolic.svg deleted file mode 100644 index 86b126f..0000000 --- a/assets/icons/caelestia-bluetooth-device-symbolic.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-consecutive-symbolic.svg b/assets/icons/caelestia-consecutive-symbolic.svg deleted file mode 100644 index 5b18fd2..0000000 --- a/assets/icons/caelestia-consecutive-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-feishin-symbolic.svg b/assets/icons/caelestia-feishin-symbolic.svg deleted file mode 100644 index f1524cc..0000000 --- a/assets/icons/caelestia-feishin-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/icons/caelestia-media-generic-symbolic.svg b/assets/icons/caelestia-media-generic-symbolic.svg deleted file mode 100644 index 8ff60ed..0000000 --- a/assets/icons/caelestia-media-generic-symbolic.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/assets/icons/caelestia-media-none-symbolic.svg b/assets/icons/caelestia-media-none-symbolic.svg deleted file mode 100644 index 20ea19a..0000000 --- a/assets/icons/caelestia-media-none-symbolic.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-mozilla-firefox-symbolic.svg b/assets/icons/caelestia-mozilla-firefox-symbolic.svg deleted file mode 100644 index 3ae6589..0000000 --- a/assets/icons/caelestia-mozilla-firefox-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-no-repeat-symbolic.svg b/assets/icons/caelestia-no-repeat-symbolic.svg deleted file mode 100644 index f878db7..0000000 --- a/assets/icons/caelestia-no-repeat-symbolic.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/icons/caelestia-pause-symbolic.svg b/assets/icons/caelestia-pause-symbolic.svg deleted file mode 100644 index 8012654..0000000 --- a/assets/icons/caelestia-pause-symbolic.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-play-symbolic.svg b/assets/icons/caelestia-play-symbolic.svg deleted file mode 100644 index 8745847..0000000 --- a/assets/icons/caelestia-play-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-repeat-one-symbolic.svg b/assets/icons/caelestia-repeat-one-symbolic.svg deleted file mode 100644 index ee38bb6..0000000 --- a/assets/icons/caelestia-repeat-one-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-repeat-symbolic.svg b/assets/icons/caelestia-repeat-symbolic.svg deleted file mode 100644 index fc514b7..0000000 --- a/assets/icons/caelestia-repeat-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-shuffle-symbolic.svg b/assets/icons/caelestia-shuffle-symbolic.svg deleted file mode 100644 index 232eaac..0000000 --- a/assets/icons/caelestia-shuffle-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-skip-next-symbolic.svg b/assets/icons/caelestia-skip-next-symbolic.svg deleted file mode 100644 index 1d4721c..0000000 --- a/assets/icons/caelestia-skip-next-symbolic.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-skip-previous-symbolic.svg b/assets/icons/caelestia-skip-previous-symbolic.svg deleted file mode 100644 index 10d0e59..0000000 --- a/assets/icons/caelestia-skip-previous-symbolic.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/assets/icons/caelestia-spotify-symbolic.svg b/assets/icons/caelestia-spotify-symbolic.svg deleted file mode 100644 index bf01823..0000000 --- a/assets/icons/caelestia-spotify-symbolic.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/env.d.ts b/env.d.ts deleted file mode 100644 index 435553f..0000000 --- a/env.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const HOME: string; -declare const CACHE: string; -declare const STATE: string; -declare const SRC: string; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index d0a50f8..0000000 --- a/package-lock.json +++ /dev/null @@ -1,616 +0,0 @@ -{ - "name": "shell", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "fuzzysort": "^3.1.0", - "ical.js": "^2.1.0", - "mathjs": "^14.0.1" - }, - "devDependencies": { - "esbuild": "^0.25.2", - "typescript": "5.7.3" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", - "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", - "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", - "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", - "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", - "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", - "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", - "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", - "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", - "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", - "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", - "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", - "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", - "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", - "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", - "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", - "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", - "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", - "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", - "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/complex.js": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.4.2.tgz", - "integrity": "sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", - "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.2", - "@esbuild/android-arm": "0.25.2", - "@esbuild/android-arm64": "0.25.2", - "@esbuild/android-x64": "0.25.2", - "@esbuild/darwin-arm64": "0.25.2", - "@esbuild/darwin-x64": "0.25.2", - "@esbuild/freebsd-arm64": "0.25.2", - "@esbuild/freebsd-x64": "0.25.2", - "@esbuild/linux-arm": "0.25.2", - "@esbuild/linux-arm64": "0.25.2", - "@esbuild/linux-ia32": "0.25.2", - "@esbuild/linux-loong64": "0.25.2", - "@esbuild/linux-mips64el": "0.25.2", - "@esbuild/linux-ppc64": "0.25.2", - "@esbuild/linux-riscv64": "0.25.2", - "@esbuild/linux-s390x": "0.25.2", - "@esbuild/linux-x64": "0.25.2", - "@esbuild/netbsd-arm64": "0.25.2", - "@esbuild/netbsd-x64": "0.25.2", - "@esbuild/openbsd-arm64": "0.25.2", - "@esbuild/openbsd-x64": "0.25.2", - "@esbuild/sunos-x64": "0.25.2", - "@esbuild/win32-arm64": "0.25.2", - "@esbuild/win32-ia32": "0.25.2", - "@esbuild/win32-x64": "0.25.2" - } - }, - "node_modules/escape-latex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", - "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", - "license": "MIT" - }, - "node_modules/fraction.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.2.2.tgz", - "integrity": "sha512-uXBDv5knpYmv/2gLzWQ5mBHGBRk9wcKTeWu6GLTUEQfjCxO09uM/mHDrojlL+Q1mVGIIFo149Gba7od1XPgSzQ==", - "license": "MIT", - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fuzzysort": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz", - "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==", - "license": "MIT" - }, - "node_modules/ical.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.1.0.tgz", - "integrity": "sha512-BOVfrH55xQ6kpS3muGvIXIg2l7p+eoe12/oS7R5yrO3TL/j/bLsR0PR+tYQESFbyTbvGgPHn9zQ6tI4FWyuSaQ==", - "license": "MPL-2.0" - }, - "node_modules/javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", - "license": "MIT" - }, - "node_modules/mathjs": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-14.4.0.tgz", - "integrity": "sha512-CpoYDhNENefjIG9wU9epr+0pBHzlaySfpWcblZdAf5qXik/j/U8eSmx/oNbmXO0F5PyfwPGVD/wK4VWsTho1SA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.26.10", - "complex.js": "^2.2.5", - "decimal.js": "^10.4.3", - "escape-latex": "^1.2.0", - "fraction.js": "^5.2.1", - "javascript-natural-sort": "^0.7.1", - "seedrandom": "^3.0.5", - "tiny-emitter": "^2.1.0", - "typed-function": "^4.2.1" - }, - "bin": { - "mathjs": "bin/cli.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "license": "MIT" - }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "license": "MIT" - }, - "node_modules/typed-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz", - "integrity": "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 1c6d73e..0000000 --- a/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "dependencies": { - "fuzzysort": "^3.1.0", - "ical.js": "^2.1.0", - "mathjs": "^14.0.1" - }, - "devDependencies": { - "esbuild": "^0.25.2", - "typescript": "5.7.3" - } -} diff --git a/run.fish b/run.fish deleted file mode 100755 index 6f2b072..0000000 --- a/run.fish +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/fish - -cd (dirname (status filename)) || exit 1 - -set -q XDG_RUNTIME_DIR && set -l bundle_dir $XDG_RUNTIME_DIR || set -l bundle_dir /tmp -set -q XDG_CACHE_HOME && set -l cache_dir $XDG_CACHE_HOME/caelestia || set -l cache_dir $HOME/.cache/caelestia -set -q XDG_STATE_HOME && set -l state_dir $XDG_STATE_HOME/caelestia || set -l state_dir $HOME/.local/state/caelestia - -mkdir -p $cache_dir - -set -q DEBUG || set -l minify --minify-identifiers - -./node_modules/.bin/esbuild app.tsx --bundle --minify-whitespace $minify --outfile=$bundle_dir/caelestia.js \ - --external:console --external:system --external:cairo --external:gettext --external:'file://*' --external:'gi://*' --external:'resource://*' \ - --define:HOME=\"$HOME\" --define:CACHE=\"$cache_dir\" --define:STATE=\"$state_dir\" --define:SRC=\"(pwd)\" --format=esm --platform=neutral --main-fields=module,main - -gjs -m $bundle_dir/caelestia.js diff --git a/scss/_font.scss b/scss/_font.scss deleted file mode 100644 index 405a850..0000000 --- a/scss/_font.scss +++ /dev/null @@ -1,21 +0,0 @@ -@mixin title { - font-family: "Gabarito", "Poppins", "Readex Pro", "Lexend", sans-serif; -} - -@mixin main { - font-family: "Rubik", "Geist", "AR One Sans", "Reddit Sans", "Inter", "Roboto", "Ubuntu", "Noto Sans", sans-serif; -} - -@mixin icon { - font-family: "Material Symbols Rounded", "MaterialSymbolsRounded", "Material Symbols Outlined", - "Material Symbols Sharp"; -} - -@mixin mono { - font-family: "JetBrains Mono NF", "JetBrains Mono Nerd Font", "JetBrains Mono NL", "SpaceMono NF", - "SpaceMono Nerd Font", monospace; -} - -@mixin reading { - font-family: "Readex Pro", "Lexend", "Noto Sans", sans-serif; -} diff --git a/scss/_lib.scss b/scss/_lib.scss deleted file mode 100644 index ef8cc8d..0000000 --- a/scss/_lib.scss +++ /dev/null @@ -1,47 +0,0 @@ -@use "sass:color"; -@use "scheme"; -@use "font"; - -$scale: 0.068rem; -@function s($value: 1) { - @return $value * $scale; -} - -@mixin rounded($all, $tl: $all, $tr: $all, $br: $all, $bl: $all) { - border-radius: s($tl) s($tr) s($br) s($bl); - -gtk-outline-radius: s($tl) s($tr) s($br) s($bl); -} - -@mixin border($colour, $alpha: 1, $width: 1, $style: solid, $force: false) { - @if $force or scheme.$borders { - border: s($width) $style color.change($colour, $alpha: $alpha); - } -} - -@mixin shadow($colour: black, $alpha: 0.64, $x: 0, $y: 0, $blur: 3, $spread: 0) { - box-shadow: s($x) s($y) s($blur) s($spread) color.change($colour, $alpha: $alpha); -} - -@mixin spacing($val: 5, $vertical: false) { - $dir: if($vertical, bottom, right); - - & > *:not(:last-child) { - margin-#{$dir}: s($val); - } -} - -@mixin element-decel($duration: 200ms) { - transition: $duration cubic-bezier(0, 0.55, 0.45, 1); -} - -@mixin fluent-decel($duration: 200ms) { - transition: $duration cubic-bezier(0.1, 1, 0, 1); -} - -@mixin overshot { - transition-timing-function: cubic-bezier(0.05, 0.9, 0.1, 1.1); -} - -@mixin ease-in-out { - transition-timing-function: cubic-bezier(0.85, 0, 0.15, 1); -} diff --git a/scss/bar.scss b/scss/bar.scss deleted file mode 100644 index b14ceeb..0000000 --- a/scss/bar.scss +++ /dev/null @@ -1,394 +0,0 @@ -@use "sass:color"; -@use "lib"; -@use "scheme"; -@use "font"; - -@mixin bar-spacing($vertical: false) { - @include lib.spacing(10, $vertical); - - & > * { - @include lib.spacing(10, $vertical); - } -} - -.bar { - @include font.mono; - - font-size: lib.s(14); - - label.icon { - font-size: lib.s(18); - } - - .screen-corner { - background-color: transparent; - } - - .os-icon { - color: scheme.$yellow; - } - - .active-window { - color: scheme.$pink; - } - - .media-playing { - color: scheme.$lavender; - - icon { - font-size: lib.s(16); - } - } - - .workspaces { - & > button { - @include lib.rounded(100); - @include lib.element-decel; - - font-size: lib.s(13); - font-weight: bold; - - &.focused { - background-color: scheme.$mauve; - } - } - - &:not(.labels-shown) > button { - min-width: lib.s(8); - min-height: lib.s(8); - background-color: scheme.$surface1; - - &.occupied { - background-color: scheme.$overlay1; - } - - &.focused { - background-color: scheme.$mauve; - } - } - - &.labels-shown > button { - color: color.change(scheme.$overlay1, $alpha: 1); - - .icon { - font-size: lib.s(13); - color: color.change(scheme.$subtext0, $alpha: 1); - } - - &.occupied { - color: color.mix(scheme.$text, scheme.$mauve, 50%); - } - - &.focused { - color: color.change(scheme.$base, $alpha: 1); - - .icon { - color: color.change(scheme.$surface0, $alpha: 1); - } - } - } - } - - .tray { - font-size: lib.s(15); - color: scheme.$text; - } - - .status-icons { - color: scheme.$rosewater; - } - - .pkg-updates { - color: scheme.$blue; - } - - .notif-count { - color: scheme.$mauve; - } - - .battery { - color: scheme.$teal; - - &.charging { - color: scheme.$success; - } - - &.low { - color: scheme.$error; - } - } - - .date-time { - color: scheme.$peach; - } - - .power { - @include lib.element-decel; - @include font.icon; - - color: scheme.$red; - font-weight: bold; - font-size: lib.s(16); - - &:hover, - &:focus { - color: color.change(scheme.$red, $alpha: 0.8); - } - - &:active { - color: color.change(scheme.$red, $alpha: 0.6); - } - } - - &.horizontal { - margin: 10px 10px 0 10px; - - .module { - padding: lib.s(5) lib.s(10); - - @include lib.spacing; - } - - .os-icon { - padding-right: lib.s(14); - } - - .media-playing { - @include lib.spacing(8); - } - - .workspaces { - @include lib.spacing(10); - - & > .focused { - min-width: lib.s(30); - } - - &.labels-shown > button { - padding: lib.s(3) lib.s(8); - - &.focused { - min-width: 0; - padding-left: lib.s(20); - padding-right: lib.s(20); - } - - .icon { - margin-left: lib.s(5); - - &:nth-child(2) { - margin-left: lib.s(12); - } - } - } - } - - .tray { - @include lib.spacing(10); - } - - .status-icons .bluetooth { - @include lib.spacing(10); - - // The spacing doesn't look right for some reason so this - & > :first-child:not(:last-child) { - margin-right: lib.s(5); - } - } - } - - &.vertical { - margin: 10px 0 10px 10px; - - .module { - padding: lib.s(8); - - @include lib.spacing($vertical: true); - } - - .os-icon > * { - margin-left: lib.s(-5); - } - - .media-playing { - @include lib.spacing(8, true); - } - - .workspaces { - @include lib.spacing(10, true); - - & > .focused { - min-height: lib.s(30); - } - - &.labels-shown > button { - padding: lib.s(3) lib.s(8); - - &.focused { - min-height: 0; - padding-top: lib.s(15); - padding-bottom: lib.s(15); - } - - .icon { - margin-top: lib.s(2); - - &:nth-child(2) { - margin-top: lib.s(3); - } - } - } - } - - .tray { - @include lib.spacing(10, true); - } - - .status-icons .bluetooth { - @include lib.spacing(10, true); - } - } - - &.gaps { - padding-right: lib.s(3); - - .module { - @include lib.rounded(8); - - background-color: scheme.$base; - } - - .screen-corner { - background-color: transparent; - } - - .os-icon { - @include lib.border(scheme.$yellow); - - @if not scheme.$borders { - @include lib.shadow; - - background-color: scheme.$yellow; - color: scheme.$base; - } - } - - .power { - @include lib.border(scheme.$red); - - @if not scheme.$borders { - @include lib.shadow; - - background-color: scheme.$red; - color: scheme.$base; - } - } - - &.horizontal { - @include bar-spacing; - - .workspaces { - padding: lib.s(6) lib.s(15); - } - } - - &.vertical { - @include bar-spacing(true); - - .workspaces { - padding: lib.s(15) lib.s(6); - } - } - } - - &.panel { - @include lib.rounded(20); - @include lib.border(scheme.$primary, 0.5, 2); - - background-color: scheme.$base; - - .os-icon { - font-size: lib.s(16); - } - - &.horizontal { - padding: lib.s(5) lib.s(10); - } - - &.vertical { - padding: lib.s(10) lib.s(5); - - .os-icon > * { - margin-left: lib.s(-7); - } - } - } - - &.embedded { - $-rounding: 23; - - margin: 0; - - .module { - background-color: scheme.$base; - } - - .screen-corner { - @include lib.rounded($-rounding); - - background-color: scheme.$base; - } - - &.horizontal { - .module { - padding: lib.s(10) lib.s(10); - padding-left: lib.s(15); - } - - .before-spacer { - border-bottom-right-radius: lib.s($-rounding); - padding-right: lib.s(15); - } - - .after-spacer { - border-bottom-left-radius: lib.s($-rounding); - } - - .workspaces.odd { - margin-right: -1px; - } - - .last { - padding-right: lib.s(12); - } - } - - &.vertical { - .module { - padding: lib.s(8) lib.s(10); - } - - .before-spacer { - border-bottom-right-radius: lib.s($-rounding); - padding-bottom: lib.s(15); - } - - .after-spacer { - border-top-right-radius: lib.s($-rounding); - padding-top: lib.s(15); - } - - .workspaces.odd { - margin-bottom: -1px; - } - - .first { - padding-top: lib.s(12); - } - - .last { - padding-bottom: lib.s(12); - } - } - } -} diff --git a/scss/common.scss b/scss/common.scss deleted file mode 100644 index d0fb799..0000000 --- a/scss/common.scss +++ /dev/null @@ -1,68 +0,0 @@ -@use "scheme"; -@use "lib"; -@use "font"; - -label.icon { - @include font.icon; -} - -.screen-corner { - @include lib.rounded(15); - - background-color: scheme.$base; -} - -.notification { - .inner { - @include font.main; - - color: scheme.$text; - padding: lib.s(10) lib.s(12); - - @include lib.spacing($vertical: true); - } - - .header, - .content { - padding: 0 lib.s(5); - } - - .header { - @include font.mono; - @include lib.spacing(8); - } - - .content { - @include lib.spacing(10); - } - - .app-icon { - font-size: lib.s(18); - } - - .image { - @include lib.rounded(10); - - background-size: cover; - background-position: center; - margin-top: lib.s(3); - min-width: lib.s(64); - min-height: lib.s(64); - - &.small { - min-width: lib.s(48); - min-height: lib.s(48); - } - } - - .summary { - @include font.title; - - font-size: lib.s(16); - } - - .body { - font-size: lib.s(14); - color: scheme.$subtext0; - } -} diff --git a/scss/launcher.scss b/scss/launcher.scss deleted file mode 100644 index ff2c422..0000000 --- a/scss/launcher.scss +++ /dev/null @@ -1,332 +0,0 @@ -@use "sass:color"; -@use "scheme"; -@use "lib"; -@use "font"; - -@mixin launcher($mode, $colour) { - &.#{$mode} { - @include lib.border($colour, 0.7, 2); - - label.icon { - color: $colour; - } - - .separator { - background-color: color.change($colour, $alpha: 0.7); - } - - .result:focus { - color: $colour; - - .sublabel { - color: color.mix(scheme.$subtext0, $colour, 60%); - } - } - - &.lines { - .search-bar { - .mode { - @include lib.border($colour, $width: 2, $force: true); - } - - .entry { - border-bottom: lib.s(2) solid $colour; - } - } - - .mode-switcher .mode { - &.selected { - border-top: lib.s(2) solid $colour; - } - - &:hover, - &:focus { - color: $colour; - } - - &:active { - color: color.mix($colour, scheme.$base, 80%); - } - } - - .result:focus { - border-bottom: lib.s(2) solid $colour; - } - } - - &.round { - .search-bar .mode { - background-color: $colour; - } - - .mode-switcher .mode.selected { - color: $colour; - } - } - } -} - -.launcher { - @include lib.rounded(10); - @include lib.element-decel; - @include lib.shadow; - @include font.mono; - - background-color: scheme.$base; - color: scheme.$text; - padding: lib.s(14); - font-size: lib.s(16); - min-width: lib.s(700); - min-height: lib.s(420); - - @include launcher(apps, scheme.$primary); - @include launcher(files, scheme.$secondary); - @include launcher(math, scheme.$tertiary); - - .search-bar { - margin-bottom: lib.s(15); - - @include lib.spacing(10); - - .mode { - @include lib.rounded(5); - @include lib.element-decel; - - padding: lib.s(5) lib.s(10); - - @include lib.spacing(3); - - .icon { - font-size: lib.s(20); - } - } - } - - .mode-switcher .mode { - @include lib.element-decel; - - padding-top: lib.s(10); - - .icon { - font-size: lib.s(24); - } - - & > box { - @include lib.spacing(10); - } - } - - .result { - @include lib.element-decel; - - padding-left: lib.s(10); - - .icon { - font-size: lib.s(32); - } - - .has-sublabel { - padding: lib.s(3) 0; - } - - .sublabel { - @include lib.element-decel; - - color: scheme.$subtext0; - font-size: lib.s(14); - } - - & > box { - @include lib.spacing(10); - } - - &.italic { - font-style: italic; - } - - &:hover { - background-color: scheme.$surface0; - } - - &:active { - background-color: color.mix(scheme.$surface0, scheme.$surface1, 70%); - } - } - - .math { - .preview > * { - margin-bottom: lib.s(10); - } - - .result { - @include lib.spacing(10); - } - } - - .swatches { - margin-bottom: lib.s(5); - - @include lib.spacing(3); - } - - .swatch { - @include lib.rounded(100); - - min-width: lib.s(16); - min-height: lib.s(16); - - &.big { - min-height: lib.s(32); - - &.left { - @include lib.border(scheme.$overlay0, 0.3, $force: true); - - border-right: none; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - - &.right { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - } - } - - .wallpaper { - .thumbnail { - background-size: cover; - background-position: center; - } - - &.compact .thumbnail { - @include lib.rounded(100); - - min-width: lib.s(32); - min-height: lib.s(32); - } - - &:not(.compact) { - @include lib.spacing(3, true); - - .thumbnail { - @include lib.rounded(10); - - & > * { - background-size: cover; - background-position: center; - - &:first-child { - @include lib.rounded(10, $tr: 0, $br: 0); - } - - &:last-child { - @include lib.rounded(10, $tl: 0, $bl: 0); - } - } - } - } - - &.medium .thumbnail { - min-height: lib.s(96); - } - - &.large .thumbnail { - min-height: lib.s(160); - } - } - - &.lines { - .mode-switcher .mode { - border-top: lib.s(2) solid transparent; - } - - .result { - border-bottom: lib.s(2) solid transparent; - } - - .wallpaper { - padding-top: lib.s(5); - - &.compact { - padding-top: lib.s(3); - padding-bottom: lib.s(3); - } - } - } - - &.round { - .search-bar { - .mode { - @include lib.rounded(10); - - color: color.change(scheme.$base, $alpha: 1); - - .icon { - color: color.change(scheme.$base, $alpha: 1); - } - } - - .entry { - @include lib.rounded(10); - - padding: lib.s(5) lib.s(10); - background-color: color.mix(scheme.$base, scheme.$surface0, 30%); - } - } - - .mode-switcher { - padding-top: lib.s(10); - - @include lib.spacing(10); - - .mode { - @include lib.rounded(10); - - padding: lib.s(5); - background-color: color.mix(scheme.$base, scheme.$surface0, 50%); - - &:not(.selected) .icon { - color: scheme.$text; - } - - &:hover, - &:focus { - background-color: scheme.$surface0; - } - - &:active { - background-color: color.mix(scheme.$surface0, scheme.$surface1, 70%); - } - } - } - - .result { - @include lib.rounded(10); - - padding-right: lib.s(10); - margin-bottom: lib.s(5); - margin-right: lib.s(5); - - &:focus { - background-color: scheme.$surface0; - } - } - - .math .preview .result { - @include lib.rounded(20); - - background-color: scheme.$surface0; - padding: lib.s(5) lib.s(10); - } - - .wallpaper-container { - padding-right: 0; - - .wallpaper:not(.compact) { - padding-top: lib.s(8); - padding-bottom: lib.s(3); - } - } - } -} diff --git a/scss/mediadisplay.scss b/scss/mediadisplay.scss deleted file mode 100644 index a167133..0000000 --- a/scss/mediadisplay.scss +++ /dev/null @@ -1,139 +0,0 @@ -@use "sass:color"; -@use "scheme"; -@use "lib"; -@use "font"; - -.mediadisplay { - @include font.mono; - - background-color: scheme.$base; - color: scheme.$text; - padding: lib.s(20); - min-height: lib.s(200); - - .visualiser { - background-color: scheme.$primary; // Visualiser colour - margin-right: lib.s(5); // Gaps between bars - min-width: lib.s(10); // Bar width - color: scheme.$error; - font-size: lib.s(24); - font-weight: bold; - } - - .cover-art { - @include lib.rounded(10); - @include lib.element-decel; - - background-position: center; - background-repeat: no-repeat; - background-size: cover; - min-width: lib.s(196); - min-height: lib.s(196); - font-size: lib.s(96); - font-weight: bold; - background-color: scheme.$surface0; - color: scheme.$subtext0; - } - - .details { - @include font.title; - - font-size: lib.s(14); - margin-top: lib.s(5); - margin-left: lib.s(15); - - .title { - font-size: lib.s(28); - font-weight: 500; - color: scheme.$text; - } - - .artist { - font-size: lib.s(18); - color: scheme.$secondary; - } - - .controls { - @include lib.rounded(1000); - @include font.icon; - - margin-top: lib.s(10); - background-color: color.change(scheme.$overlay0, $alpha: 0.4); - font-size: lib.s(28); - padding: lib.s(3) lib.s(8); - - @include lib.spacing(10); - - & > button { - @include lib.element-decel; - - &:hover, - &:focus { - color: color.mix(scheme.$subtext1, scheme.$subtext0, 50%); - } - - &:active { - color: scheme.$subtext0; - } - - &:disabled { - color: scheme.$subtext0; - } - } - } - } - - .center-module { - @include lib.rounded(20); - margin: 0 lib.s(40); - background-color: color.change(scheme.$surface1, $alpha: 0.4); - } - - .selector { - @include lib.rounded(15); - @include lib.element-decel; - - background-color: color.change(scheme.$overlay0, $alpha: 0.4); - padding: lib.s(8) lib.s(15); - - .identity { - @include lib.spacing(8); - } - - button { - @include lib.element-decel; - - &:hover, - &:focus { - color: color.mix(scheme.$subtext1, scheme.$subtext0, 50%); - } - - &:active { - color: scheme.$subtext0; - } - } - - .list > button { - margin-top: lib.s(5); - color: scheme.$subtext1; - - &:hover, - &:focus { - color: color.mix(scheme.$subtext1, scheme.$subtext0, 50%); - } - - &:active { - color: scheme.$subtext0; - } - } - } - - .time { - @include lib.rounded(1000); - - font-size: lib.s(16); - background-color: color.change(scheme.$overlay0, $alpha: 0.4); - padding: lib.s(5) lib.s(10); - margin-bottom: lib.s(10); - } -} diff --git a/scss/navbar.scss b/scss/navbar.scss deleted file mode 100644 index 72ace59..0000000 --- a/scss/navbar.scss +++ /dev/null @@ -1,65 +0,0 @@ -@use "sass:color"; -@use "scheme"; -@use "lib"; -@use "font"; - -.navbar { - @include font.mono; - - background-color: scheme.$base; - - button { - color: scheme.$subtext1; - - &:hover, - &:focus { - color: scheme.$subtext0; - } - - &:active { - color: color.change(scheme.$overlay2, $alpha: 1); - } - - &.current { - .nav-button { - background-color: scheme.$primary; - color: color.change(scheme.$base, $alpha: 1); - } - - &:hover .nav-button, - &:focus .nav-button { - background-color: color.mix(scheme.$primary, scheme.$base, 80%); - } - - &:active .nav-button { - background-color: color.mix(scheme.$primary, scheme.$base, 70%); - } - } - - &:first-child .nav-button { - margin-top: lib.s(10); - } - - &:last-child .nav-button { - margin-bottom: lib.s(10); - } - } - - .nav-button { - @include lib.rounded(20); - @include lib.element-decel; - - padding: lib.s(10) lib.s(8); - margin: lib.s(5) lib.s(8); - min-width: lib.s(40); - - .icon { - font-size: lib.s(28); - } - - .label { - font-size: lib.s(12); - margin-bottom: lib.s(5); - } - } -} diff --git a/scss/notifpopups.scss b/scss/notifpopups.scss deleted file mode 100644 index 92d2760..0000000 --- a/scss/notifpopups.scss +++ /dev/null @@ -1,51 +0,0 @@ -@use "sass:color"; -@use "scheme"; -@use "lib"; -@use "font"; - -@mixin popup($colour) { - .separator { - background-color: $colour; - } - - .image { - @include lib.border($colour, 0.05); - } -} - -.notifpopups { - min-width: lib.s(425); - padding-left: lib.s(10); // So notifications can overshoot for init animation - padding-right: lib.s(5); - padding-top: lib.s(5); - - .notification { - .wrapper { - padding: lib.s(5); // For shadow - } - - .inner { - @include lib.rounded(10); - @include lib.shadow; - - background-color: scheme.$base; - - &.low { - @include popup(scheme.$overlay0); - } - - &.normal { - @include popup(scheme.$primary); - } - - &.critical { - @include lib.border(scheme.$error, 0.5); - @include popup(scheme.$error); - - @if not scheme.$borders { - background-color: color.mix(scheme.$base, scheme.$error, 95%); - } - } - } - } -} diff --git a/scss/osds.scss b/scss/osds.scss deleted file mode 100644 index d7afd24..0000000 --- a/scss/osds.scss +++ /dev/null @@ -1,51 +0,0 @@ -@use "scheme"; -@use "lib"; -@use "font"; - -.brightness, -.volume { - @include lib.rounded(8); - @include lib.border(scheme.$overlay0, 0.1); - @include lib.shadow; - @include font.mono; - - background-color: scheme.$base; - font-size: lib.s(16); - padding: lib.s(3); - - .inner { - @include lib.fluent-decel(1000ms); - - min-width: lib.s(300); - min-height: lib.s(32); - background-color: scheme.$teal; - } -} - -.volume .inner.mute { - background-color: scheme.$overlay0; -} - -.lock { - @include lib.rounded(10); - @include lib.border(scheme.$overlay0, 0.1); - @include lib.shadow; - @include lib.element-decel; - @include font.mono; - - min-width: lib.s(80); - min-height: lib.s(80); - padding: lib.s(10); - background-color: scheme.$base; - color: scheme.$overlay0; - font-size: lib.s(16); - font-weight: bold; - - &.enabled { - color: scheme.$text; - } - - .icon { - font-size: lib.s(48); - } -} diff --git a/scss/scheme/_default.scss b/scss/scheme/_default.scss deleted file mode 100644 index 71ea197..0000000 --- a/scss/scheme/_default.scss +++ /dev/null @@ -1,31 +0,0 @@ -$rosewater: #edcbc5; -$flamingo: #d3a4a4; -$pink: #d792c6; -$mauve: #c678dd; -$red: #be5046; -$maroon: #e06c75; -$peach: #d19a66; -$yellow: #e5c07b; -$green: #98c379; -$teal: #56b6c2; -$sky: #90ccd7; -$sapphire: #389dcc; -$blue: #61afef; -$lavender: #8e98d9; -$text: #abb2bf; -$subtext1: #95a0b5; -$subtext0: #838b9c; -$overlay2: #767f8f; -$overlay1: #666e7c; -$overlay0: #5c6370; -$surface2: #4b5263; -$surface1: #3c414f; -$surface0: #30343e; -$base: #282c34; -$mantle: #21242b; -$crust: #1e2126; -$success: #98c379; -$error: #be5046; -$primary: #d19a66; -$secondary: #61afef; -$tertiary: #98c379; diff --git a/scss/session.scss b/scss/session.scss deleted file mode 100644 index 69c8b33..0000000 --- a/scss/session.scss +++ /dev/null @@ -1,58 +0,0 @@ -@use "sass:color"; -@use "scheme"; -@use "lib"; -@use "font"; - -.session { - background-color: rgba(0, 0, 0, 0.3); - - .inner { - @include lib.rounded(10); - @include lib.border(scheme.$flamingo, 0.5, 2); - @include lib.shadow; - @include font.mono; - - background-color: scheme.$mantle; - color: scheme.$text; - padding: lib.s(18) lib.s(20); - - @include lib.spacing(10, true); - - & > * { - @include lib.spacing(20); - } - - .item { - font-size: lib.s(14); - - @include lib.spacing($vertical: true); - - button { - @include lib.rounded(100); - @include lib.element-decel(300ms); - - background-color: color.change(scheme.$surface0, $alpha: 0.4); - min-width: lib.s(100); - min-height: lib.s(100); - font-size: lib.s(32); - - &:hover { - background-color: color.change(scheme.$surface1, $alpha: 0.4); - } - - &:focus { - background-color: color.mix(scheme.$flamingo, scheme.$base, 70%); - color: color.change(scheme.$base, $alpha: 1); - } - - &:active { - background-color: color.mix(scheme.$flamingo, scheme.$base, 50%); - } - } - - .label { - font-weight: 500; - } - } - } -} diff --git a/scss/sidebar.scss b/scss/sidebar.scss deleted file mode 100644 index d82ad7f..0000000 --- a/scss/sidebar.scss +++ /dev/null @@ -1,1118 +0,0 @@ -@use "sass:color"; -@use "sass:list"; -@use "scheme"; -@use "lib"; -@use "font"; - -@mixin notification($accent) { - .separator { - background-color: $accent; - } - - .image { - @include lib.border($accent, 0.05); - } -} - -@mixin button { - @include lib.element-decel; - - background-color: color.change(scheme.$surface1, $alpha: 0.5); - - &:hover, - &:focus { - background-color: color.change(scheme.$surface2, $alpha: 0.5); - } - - &:active { - background-color: color.change(scheme.$overlay0, $alpha: 0.5); - } - - &:disabled { - color: scheme.$subtext0; - } -} - -@mixin button-active { - @include lib.element-decel; - - background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.5); - - &:hover, - &:focus { - background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 30%), $alpha: 0.5); - } - - &:active { - background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 20%), $alpha: 0.5); - } -} - -@mixin media-button { - @include lib.element-decel; - - &:disabled { - color: color.change(scheme.$overlay2, $alpha: 1); - } - - &:hover, - &:focus { - color: color.mix(scheme.$subtext1, scheme.$subtext0, 50%); - } - - &:active { - color: scheme.$subtext0; - } -} - -.sidebar { - @include font.mono; - - background-color: scheme.$base; - color: scheme.$text; - padding: lib.s(18) lib.s(20); - min-width: lib.s(380); - - .pane { - @include lib.spacing(20, true); - } - - .separator { - background-color: if(scheme.$light, scheme.$surface1, scheme.$overlay0); - margin: 0 lib.s(10); - } - - .header-bar { - margin-bottom: lib.s(10); - - @include lib.spacing; - - & > :not(button) { - font-weight: bold; - font-size: lib.s(16); - } - - & > button { - @include lib.element-decel; - @include lib.rounded(10); - - padding: lib.s(3) lib.s(8); - - &:disabled { - color: color.change(scheme.$overlay0, $alpha: 1); - } - - &:hover, - &:focus { - color: scheme.$subtext0; - } - - &:active { - color: color.change(scheme.$overlay2, $alpha: 1); - } - - &.enabled { - $-base: color.change(scheme.$base, $alpha: 1); - - background-color: scheme.$primary; - color: $-base; - - &:hover, - &:focus { - background-color: color.mix(scheme.$primary, $-base, 80%); - } - - &:active { - background-color: color.mix(scheme.$primary, $-base, 70%); - } - } - } - } - - .empty { - color: scheme.$subtext0; - font-size: lib.s(18); - - .icon { - font-size: lib.s(48); - } - } - - .user { - @include lib.spacing(15); - - .face { - @include lib.rounded(10); - - background-position: center; - background-repeat: no-repeat; - background-size: cover; - min-width: lib.s(96); - min-height: lib.s(96); - font-size: lib.s(48); - font-weight: bold; - background-color: scheme.$base; - } - - .details { - font-size: lib.s(14); - - @include lib.spacing(8, true); - - .name { - font-size: lib.s(18); - color: scheme.$text; - margin-bottom: lib.s(10); - } - - $-colours: scheme.$yellow, scheme.$blue; - @for $i from 1 through list.length($-colours) { - :nth-child(#{$i + 1}) { - color: list.nth($-colours, $i); - } - } - } - } - - .media { - @include lib.spacing(15); - - .cover-art { - @include lib.rounded(10); - @include lib.element-decel; - - background-position: center; - background-repeat: no-repeat; - background-size: cover; - min-width: lib.s(128); - min-height: lib.s(128); - font-size: lib.s(64); - font-weight: bold; - background-color: scheme.$base; - color: scheme.$subtext0; - } - - .details { - font-size: lib.s(14); - - .title { - font-size: lib.s(16); - color: scheme.$text; - } - - .artist { - color: scheme.$green; - } - - .controls { - margin-top: lib.s(20); - margin-bottom: lib.s(5); - font-size: lib.s(24); - - & > button { - @include media-button; - } - } - - .slider { - @include lib.rounded(5); - @include lib.fluent-decel(1000ms); - - min-height: lib.s(8); - background-color: scheme.$overlay0; - color: scheme.$subtext1; - } - - .time { - margin-top: lib.s(5); - font-size: lib.s(13); - color: scheme.$subtext0; - } - } - } - - .notification { - .wrapper { - padding-bottom: lib.s(10); - } - - .inner { - @include lib.rounded(20); - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - - &.low { - @include notification(if(scheme.$light, scheme.$surface1, scheme.$overlay0)); - - @if not scheme.$borders { - background-color: color.change(scheme.$surface0, $alpha: 0.4); - } - } - - &.normal { - @include lib.border(scheme.$primary, if(scheme.$light, 0.5, 0.3)); - @include notification(scheme.$primary); - } - - &.critical { - @include lib.border(scheme.$error, 0.8); - @include notification(scheme.$error); - - @if not scheme.$borders { - background-color: color.change(color.mix(scheme.$surface1, scheme.$error, 80%), $alpha: 0.4); - } - } - } - - .actions { - @include lib.spacing; - - & > button { - @include button; - @include lib.rounded(10); - - padding: lib.s(5) lib.s(10); - } - } - } - - .upcoming { - .list { - min-height: lib.s(300); - } - - .day { - @include lib.spacing($vertical: true); - - &:not(:first-child) { - margin-top: lib.s(20); - } - - .date { - margin-left: lib.s(10); - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - .events { - @include lib.rounded(20); - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(10) lib.s(15); - - @include lib.spacing(10, true); - } - - .event { - @include lib.spacing(8); - } - - .calendar-indicator { - @include lib.rounded(5); - - min-width: lib.s(1); - - $-colours: scheme.$red, scheme.$sapphire, scheme.$flamingo, scheme.$maroon, scheme.$pink, scheme.$sky, - scheme.$peach, scheme.$yellow, scheme.$green, scheme.$rosewater, scheme.$mauve, scheme.$teal, - scheme.$blue; - @for $i from 1 through list.length($-colours) { - &.calendar-#{$i} { - background-color: list.nth($-colours, $i); - } - } - } - } - } - - .players { - .player { - @include lib.spacing(40, true); - - .cover-art { - @include lib.rounded(10); - @include lib.element-decel; - @include lib.shadow(scheme.$mantle, $blur: 5, $spread: 2); - - background-position: center; - background-repeat: no-repeat; - background-size: cover; - min-width: lib.s(256); - min-height: lib.s(256); - font-size: lib.s(96); - font-weight: bold; - background-color: scheme.$base; - color: scheme.$subtext0; - margin-top: lib.s(20); - } - - .progress { - margin: 0 lib.s(40); - - .slider { - @include lib.rounded(8); - @include lib.fluent-decel(1000ms); - - min-height: lib.s(15); - background-color: scheme.$overlay0; - color: scheme.$subtext1; - } - - .time { - margin-top: lib.s(5); - font-size: lib.s(13); - color: scheme.$subtext1; - } - } - - .details { - font-size: lib.s(14); - margin-top: lib.s(20); - - @include lib.spacing(3, true); - - .title { - font-size: lib.s(18); - color: scheme.$text; - font-weight: bold; - } - - .artist { - color: scheme.$green; - } - - .album { - color: scheme.$subtext0; - } - } - - .controls { - margin-top: lib.s(-20); - margin-bottom: lib.s(5); - - button { - @include media-button; - - // Cause some nerd font icons don't have the correct width - &.needs-adjustment { - padding-right: lib.s(5); - } - } - - .playback { - font-size: lib.s(32); - - @include lib.spacing(40); - } - - .options { - margin: 0 lib.s(40); - margin-top: lib.s(-10); - font-size: lib.s(20); - - @include lib.spacing(20); - } - } - } - - .indicators { - @include lib.spacing(10); - - & > button { - @include lib.rounded(1000); - @include lib.element-decel; - - min-width: lib.s(10); - min-height: lib.s(10); - - background-color: color.change(scheme.$overlay0, $alpha: 0.5); - - &:hover, - &:focus { - background-color: color.change(scheme.$overlay1, $alpha: 0.5); - } - - &:active { - background-color: color.change(scheme.$overlay2, $alpha: 0.5); - } - - &.active { - background-color: color.change(scheme.$primary, $alpha: 0.9); - - &:hover, - &:focus { - background-color: color.change(scheme.$primary, $alpha: 0.7); - } - - &:active { - background-color: color.change(scheme.$primary, $alpha: 0.6); - } - } - } - } - } - - .no-wp-prompt { - font-size: lib.s(16); - color: scheme.$error; - margin-top: lib.s(8); - } - - .streams { - .list { - @include lib.spacing(10, true); - } - - .stream { - @include lib.rounded(20); - @include lib.element-decel; - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(10) lib.s(15); - - @include lib.spacing(5); - - &.playing { - background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.4); - } - - .icon { - font-size: lib.s(28); - margin-right: lib.s(12); - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - trough { - @include lib.rounded(10); - - min-width: lib.s(100); - min-height: lib.s(10); - background-color: color.change(scheme.$error, $alpha: 0.3); - - fill { - @include lib.rounded(10); - - background-color: color.change(scheme.$overlay0, $alpha: 1); - } - - highlight { - @include lib.rounded(10); - - background-color: scheme.$subtext1; - } - } - - & > button { - @include media-button; - - font-size: lib.s(18); - min-width: lib.s(20); - min-height: lib.s(20); - } - } - } - - .device-selector { - @include lib.spacing(10, true); - - .selector { - @include lib.rounded(20); - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(10) lib.s(15); - - .icon { - font-size: lib.s(20); - } - - .separator { - margin-bottom: lib.s(8); - margin-top: lib.s(5); - background-color: if(scheme.$light, scheme.$overlay1, scheme.$overlay0); - } - - .list { - color: scheme.$subtext0; - - @include lib.spacing(3, true); - } - - .device { - @include lib.spacing; - } - - .selected { - color: scheme.$text; - - @include lib.spacing(10); - - .icon { - font-size: lib.s(32); - } - - .sublabel { - color: scheme.$subtext0; - } - } - - button { - @include lib.element-decel; - - &:hover, - &:focus { - color: scheme.$subtext1; - } - - &:active { - color: scheme.$text; - } - } - } - - .stream { - @include lib.rounded(20); - @include lib.element-decel; - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(10) lib.s(15); - - @include lib.spacing(5); - - &.playing { - background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.4); - } - - .icon { - font-size: lib.s(28); - margin-right: lib.s(12); - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - trough { - @include lib.rounded(10); - - min-width: lib.s(100); - min-height: lib.s(10); - background-color: color.change(scheme.$error, $alpha: 0.3); - - fill { - @include lib.rounded(10); - - background-color: color.change(scheme.$overlay0, $alpha: 1); - } - - highlight { - @include lib.rounded(10); - - background-color: scheme.$subtext1; - } - } - - & > button { - @include media-button; - - font-size: lib.s(18); - min-width: lib.s(20); - min-height: lib.s(20); - } - } - } - - .networks { - .list { - @include lib.spacing(10, true); - } - - .network { - @include lib.rounded(20); - @include lib.element-decel; - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(10) lib.s(15); - - @include lib.spacing(5); - - &.connected { - background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.4); - - & > button { - @include button-active; - } - } - - .icon { - font-size: lib.s(28); - margin-right: lib.s(12); - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - & > button { - @include button; - @include lib.rounded(1000); - @include font.icon; - - font-size: lib.s(18); - min-width: lib.s(30); - min-height: lib.s(30); - } - } - } - - .bluetooth { - .list { - @include lib.spacing(10, true); - } - - .device { - @include lib.rounded(20); - @include lib.element-decel; - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(10) lib.s(15); - - @include lib.spacing(5); - - &.connected { - background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.4); - - & > button { - @include button-active; - } - } - - .icon { - font-size: lib.s(28); - margin-right: lib.s(12); - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - & > button { - @include button; - @include lib.rounded(1000); - @include font.icon; - - font-size: lib.s(18); - min-width: lib.s(30); - min-height: lib.s(30); - } - } - } - - .updates { - .list { - @include lib.spacing(10, true); - } - - .repo { - @include lib.rounded(20); - @include lib.element-decel; - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(10) lib.s(15); - - @include lib.spacing(5); - - .icon { - font-size: lib.s(28); - - &:not(:last-child) { - margin-right: lib.s(12); - } - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - .body { - margin-top: lib.s(10); - font-size: lib.s(14); - } - } - } - - .news { - min-height: lib.s(200); - - .empty { - margin-top: lib.s(40); - } - - .list { - @include lib.spacing(10, true); - } - - .article { - @include lib.rounded(20); - @include lib.element-decel; - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(10) lib.s(15); - - @include lib.spacing(5); - - .icon { - font-size: lib.s(28); - - &:not(:last-child) { - margin-right: lib.s(12); - } - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - .body { - margin-top: lib.s(10); - font-size: lib.s(14); - } - } - } - - .headlines { - min-height: lib.s(200); - - .empty { - margin-top: lib.s(40); - } - - .list { - @include lib.spacing(10, true); - } - - .category { - @include lib.rounded(20); - @include lib.element-decel; - - background-color: color.change(scheme.$surface0, $alpha: 0.5); - padding: lib.s(10) lib.s(15); - - @include lib.spacing(5); - - .icon { - font-size: lib.s(28); - - &:not(:last-child) { - margin-right: lib.s(12); - } - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - .body { - margin-top: lib.s(10); - font-size: lib.s(14); - - @include lib.spacing(8, true); - } - } - - .article { - @include lib.rounded(20); - @include lib.element-decel; - - background-color: color.change(scheme.$surface1, $alpha: 0.3); - padding: lib.s(10) lib.s(15); - - .article-body { - @include font.reading; - @include lib.element-decel; - - font-size: lib.s(15); - margin-top: lib.s(10); - color: scheme.$subtext1; - - & > :last-child { - margin-top: lib.s(8); - } - - .title { - @include font.title; - - font-size: lib.s(18); - font-weight: 500; - margin-bottom: lib.s(3); - } - } - - button:hover .article-body, - button:focus .article-body { - color: color.mix(scheme.$subtext0, scheme.$blue, 60%); - } - } - } - - .time-date { - padding: lib.s(12) lib.s(8); - font-size: lib.s(48); - font-weight: bold; - color: scheme.$primary; - - & > * { - @include lib.spacing(3); - } - - .ampm { - font-size: lib.s(24); - font-weight: normal; - margin-top: lib.s(18); - color: scheme.$secondary; - } - - .date { - font-size: lib.s(20); - color: scheme.$tertiary; - } - } - - .calendar { - @include lib.rounded(20); - - background-color: color.change(scheme.$surface1, $alpha: 0.4); - padding: lib.s(15); - - .calendar-view { - @include lib.spacing(10, true); - - .header { - @include lib.spacing(10); - - & > button { - @include lib.rounded(1000); - @include lib.element-decel; - - background-color: color.change(scheme.$surface2, $alpha: 0.4); - min-width: lib.s(28); - min-height: lib.s(28); - font-size: lib.s(18); - - &:first-child { - padding: 0 lib.s(10); - } - - &:hover, - &:focus { - background-color: color.change(scheme.$surface2, $alpha: 0.6); - } - - &:active { - background-color: color.change(scheme.$surface2, $alpha: 0.8); - } - } - } - - .weekdays { - @include lib.spacing(10); - - & > label { - min-width: lib.s(40); - font-weight: bold; - color: scheme.$subtext1; - } - } - - .month { - @include lib.spacing(10, true); - } - - .week { - @include lib.spacing(10); - } - - .day { - @include lib.rounded(1000); - @include lib.element-decel; - - min-width: lib.s(40); - min-height: lib.s(40); - - &.dim { - color: scheme.$subtext0; - } - - &.today:not(.dim) { - background-color: scheme.$primary; - color: color.change(scheme.$base, $alpha: 1); - } - - &:hover, - &:focus { - color: scheme.$subtext0; - } - - &:active { - color: color.change(scheme.$overlay2, $alpha: 1); - } - - &.dim { - color: scheme.$subtext0; - - &:hover, - &:focus { - color: color.change(scheme.$overlay2, $alpha: 1); - } - - &:active { - color: color.change(scheme.$overlay1, $alpha: 1); - } - } - - &.today:not(.dim) { - background-color: scheme.$primary; - color: color.change(scheme.$base, $alpha: 1); - - &:hover, - &:focus { - background-color: color.mix(scheme.$primary, scheme.$base, 80%); - } - - &:active { - background-color: color.mix(scheme.$primary, scheme.$base, 70%); - } - } - - label { - margin-top: lib.s(8); - } - - .indicator { - @include lib.rounded(10); - @include lib.element-decel; - - min-height: lib.s(3); - margin: 0 lib.s(8); - } - - $-max: 5; - @for $i from 1 through $-max { - &.events-#{$i} { - $-colour: color.mix(scheme.$red, scheme.$green, calc(100% / $-max) * $i); - - .indicator { - background-color: $-colour; - } - - &:hover .indicator, - &:focus .indicator { - background-color: color.mix($-colour, scheme.$base, 80%); - } - - &:active .indicator { - background-color: color.mix($-colour, scheme.$base, 70%); - } - - &.dim .indicator { - background-color: color.mix($-colour, scheme.$base, 60%); - } - - &.today:not(.dim) { - $-colour: color.mix($-colour, color.complement(scheme.$primary), 50%); - - .indicator { - background-color: $-colour; - } - - &:hover .indicator, - &:focus .indicator { - background-color: color.mix($-colour, scheme.$base, 80%); - } - - &:active .indicator { - background-color: color.mix($-colour, scheme.$base, 70%); - } - } - } - } - } - } - - .events { - @include lib.spacing(10, true); - - .header { - font-weight: bold; - - @include lib.spacing(10); - - & > button { - @include lib.rounded(1000); - @include lib.element-decel; - - min-width: lib.s(24); - min-height: lib.s(24); - - &:hover, - &:focus { - color: scheme.$subtext0; - } - - &:active { - color: color.change(scheme.$overlay2, $alpha: 1); - } - } - } - - scrollable { - min-height: lib.s(315); - } - - .date { - margin-left: lib.s(10); - } - - .sublabel { - font-size: lib.s(14); - color: scheme.$subtext0; - } - - .list { - padding: lib.s(5); - - @include lib.spacing(10, true); - } - - .event { - @include lib.spacing(8); - } - - .calendar-indicator { - @include lib.rounded(5); - - min-width: lib.s(1); - - $-colours: scheme.$red, scheme.$sapphire, scheme.$flamingo, scheme.$maroon, scheme.$pink, scheme.$sky, - scheme.$peach, scheme.$yellow, scheme.$green, scheme.$rosewater, scheme.$mauve, scheme.$teal, - scheme.$blue; - @for $i from 1 through list.length($-colours) { - &.calendar-#{$i} { - background-color: list.nth($-colours, $i); - } - } - } - } - } -} diff --git a/scss/widgets.scss b/scss/widgets.scss deleted file mode 100644 index 719e82c..0000000 --- a/scss/widgets.scss +++ /dev/null @@ -1,136 +0,0 @@ -@use "sass:color"; -@use "scheme"; -@use "lib"; -@use "font"; - -separator, -.separator { - @include lib.rounded(2); - - min-width: lib.s(0.5); - min-height: lib.s(0.5); -} - -@keyframes appear { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@mixin -appear($duration: 100ms) { - animation-name: appear; - animation-duration: $duration; - animation-timing-function: ease-out; - animation-iteration-count: 1; -} - -menu { - @include -appear; - @include lib.rounded(10); - @include lib.border(scheme.$blue, 0.4); - @include font.mono; - - padding: lib.s(8); - background-color: scheme.$surface0; - color: scheme.$text; - font-size: lib.s(14); - - & > menuitem { - @include lib.element-decel; - @include lib.rounded(8); - - padding: lib.s(5) lib.s(8); - - &:hover, - &:focus { - background-color: scheme.$surface1; - } - - &:active { - background-color: scheme.$surface2; - } - - &:disabled { - color: scheme.$subtext0; - } - - & > arrow { - @include lib.rounded(1000); - - min-width: lib.s(5); - min-height: lib.s(5); - background-color: scheme.$blue; - - &.right { - margin-left: lib.s(12); - } - - &.left { - margin-right: lib.s(12); - } - } - } - - & > separator { - background-color: color.mix(scheme.$blue, scheme.$surface0, 70%); - margin: lib.s(5) 0; - } -} - -tooltip, -.tooltip { - @include lib.rounded(10); - @include lib.border(scheme.$primary, 0.7); - @include font.mono; - - background-color: scheme.$surface0; - color: scheme.$text; - padding: lib.s(5) lib.s(10); -} - -tooltip { - @include -appear(200ms); -} - -.tooltip { - @include lib.shadow; - - margin: lib.s(3); -} - -scrollbar { - slider { - @include lib.rounded(1000); - @include lib.element-decel; - - min-width: lib.s(3); - min-height: lib.s(30); - background-color: color.change(scheme.$overlay0, $alpha: 0.6); - - &:hover, - &:focus { - min-width: lib.s(6); - background-color: color.change(scheme.$overlay0, $alpha: 0.7); - } - - &:active { - background-color: color.change(scheme.$overlay1, $alpha: 0.8); - } - } -} - -popover { - @include -appear; - @include lib.rounded(10); - @include lib.border(scheme.$yellow, 0.4); - @include font.mono; - - padding: lib.s(8); - background-color: color.mix(scheme.$base, scheme.$yellow, 90%); - color: scheme.$text; - font-size: lib.s(14); -} diff --git a/src/config/defaults.ts b/src/config/defaults.ts deleted file mode 100644 index a5ebbbc..0000000 --- a/src/config/defaults.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { Astal } from "astal/gtk3"; - -export default { - style: { - transparency: "normal", // One of "off", "low", "normal", "high" - borders: true, - vibrant: false, // Extra saturation - }, - config: { - notifyOnError: true, - }, - // Modules - bar: { - vertical: true, - style: "gaps", // One of "gaps", "panel", "embedded" - layout: { - type: "centerbox", // One of "centerbox", "flowbox" - centerbox: { - start: ["osIcon", "activeWindow", "mediaPlaying", "brightnessSpacer"], - center: ["workspaces"], - end: [ - "volumeSpacer", - "tray", - "statusIcons", - "pkgUpdates", - "notifCount", - "battery", - "dateTime", - "power", - ], - }, - flowbox: [ - "osIcon", - "workspaces", - "brightnessSpacer", - "activeWindow", - "volumeSpacer", - "dateTime", - "tray", - "battery", - "statusIcons", - "notifCount", - "power", - ], - }, - modules: { - workspaces: { - shown: 5, - showLabels: false, - labels: ["󰮯", "󰮯", "󰮯", "󰮯", "󰮯"], - xalign: -1, - showWindows: false, - }, - dateTime: { - format: "%d/%m/%y %R", - detailedFormat: "%c", - }, - }, - }, - launcher: { - style: "lines", // One of "lines", "round" - actionPrefix: ">", // Prefix for launcher actions - apps: { - maxResults: 30, // Actual max results, -1 for infinite - }, - files: { - maxResults: 40, // Actual max results, -1 for infinite - fdOpts: ["-a", "-t", "f"], // Options to pass to `fd` - shortenThreshold: 30, // Threshold to shorten paths in characters - }, - math: { - maxResults: 40, // Actual max results, -1 for infinite - }, - todo: { - notify: true, - }, - wallpaper: { - maxResults: 20, // Actual max results, -1 for infinite - showAllEmpty: true, // Show all wallpapers when search is empty - style: "medium", // One of "compact", "medium", "large" - }, - disabledActions: ["logout", "shutdown", "reboot", "hibernate"], // Actions to hide, see launcher/actions.tsx for available actions - }, - notifpopups: { - maxPopups: -1, - expire: false, - agoTime: true, // Whether to show time in ago format, e.g. 10 mins ago, or raw time, e.g. 10:42 - }, - osds: { - volume: { - position: Astal.WindowAnchor.RIGHT, // Top = 2, Right = 4, Left = 8, Bottom = 16 - margin: 20, - hideDelay: 1500, - showValue: true, - }, - brightness: { - position: Astal.WindowAnchor.LEFT, // Top = 2, Right = 4, Left = 8, Bottom = 16 - margin: 20, - hideDelay: 1500, - showValue: true, - }, - lock: { - spacing: 5, - caps: { - hideDelay: 1000, - }, - num: { - hideDelay: 1000, - }, - }, - }, - sidebar: { - showOnStartup: false, - modules: { - headlines: { - enabled: true, - }, - }, - }, - navbar: { - persistent: false, // Whether to show all the time or only on hover - appearWidth: 10, // The width in pixels of the hover area for the navbar to show up - showLabels: false, // Whether to show labels for active buttons - }, - // Services - math: { - maxHistory: 100, - }, - updates: { - interval: 900000, - }, - weather: { - interval: 600000, - apiKey: "", // An API key from https://weatherapi.com for accessing weather data - location: "", // Location as a string or empty to autodetect - imperial: false, - }, - cpu: { - interval: 2000, - }, - gpu: { - interval: 2000, - }, - memory: { - interval: 5000, - }, - storage: { - interval: 5000, - }, - wallpapers: { - paths: [ - { - recursive: true, // Whether to search recursively - path: "~/Pictures/Wallpapers", // Path to search - threshold: 0.8, // The threshold to filter wallpapers by size (e.g. 0.8 means wallpaper must be at least 80% of the screen size), 0 to disable - }, - ], - }, - calendar: { - webcals: [] as string[], // An array of urls to ICS files which you can curl - upcomingDays: 7, // Number of days which count as upcoming - notify: true, - }, - thumbnailer: { - maxAttempts: 5, - timeBetweenAttempts: 300, - defaults: { - width: 100, - height: 100, - exact: true, - }, - }, - news: { - apiKey: "", // An API key from https://newsdata.io for accessing news - countries: ["current"], // A list of country codes or "current" for the current location - categories: ["business", "top", "technology", "world"], // A list of news categories to filter by - languages: ["en"], // A list of languages codes to filter by - domains: [] as string[], // A list of news domains to pull from, see https://newsdata.io/news-sources for available domains - excludeDomains: ["news.google.com"], // A list of news domains to exclude, e.g. bbc.co.uk - timezone: "", // A timezone to filter by, e.g. "America/New_York", see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - pages: 3, // Number of pages to pull (each page is 10 articles) - }, -}; diff --git a/src/config/funcs.ts b/src/config/funcs.ts deleted file mode 100644 index 77ee8dd..0000000 --- a/src/config/funcs.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { notify } from "@/utils/system"; -import { Gio, GLib, monitorFile, readFileAsync, Variable, writeFileAsync } from "astal"; -import config from "."; -import { loadStyleAsync } from "../../app"; -import defaults from "./defaults"; -import types from "./types"; - -type Settings = { [P in keyof T]: T[P] extends object & { length?: never } ? Settings : Variable }; - -const CONFIG = `${GLib.get_user_config_dir()}/caelestia/shell.json`; - -const warn = (msg: string) => { - console.warn(`[CONFIG] ${msg}`); - if (config.config.notifyOnError.get()) - notify({ - summary: "Invalid config", - body: msg, - icon: "dialog-error-symbolic", - urgency: "critical", - }); -}; - -const isObject = (o: any): o is object => typeof o === "object" && o !== null && !Array.isArray(o); - -const isCorrectType = (v: any, type: string | string[] | number[], path: string) => { - if (Array.isArray(type)) { - // type is array of valid values - if (!type.includes(v as never)) { - warn(`Invalid value for ${path}: ${v} != ${type.map(v => `"${v}"`).join(" | ")}`); - return false; - } - } else if (type.startsWith("array of ")) { - // Array of ... - if (Array.isArray(v)) { - // Remove invalid items but always return true - const arrType = type.slice(9); - try { - // Recursively check type - const type = JSON.parse(arrType); - if (Array.isArray(type)) { - v.splice(0, v.length, ...v.filter((item, i) => isCorrectType(item, type, `${path}[${i}]`))); - } else { - const valid = v.filter((item, i) => - Object.entries(type).every(([k, t]) => { - if (!item.hasOwnProperty(k)) { - warn(`Invalid shape for ${path}[${i}]: ${JSON.stringify(item)} != ${arrType}`); - return false; - } - return isCorrectType(item[k], t as any, `${path}[${i}].${k}`); - }) - ); - v.splice(0, v.length, ...valid); // In-place filter - } - } catch { - const valid = v.filter((item, i) => { - if (typeof item !== arrType) { - warn(`Invalid type for ${path}[${i}]: ${typeof item} != ${arrType}`); - return false; - } - return true; - }); - v.splice(0, v.length, ...valid); // In-place filter - } - } else { - // Type is array but value is not - warn(`Invalid type for ${path}: ${typeof v} != ${type}`); - return false; - } - } else if (typeof v !== type) { - // Value is not correct type - warn(`Invalid type for ${path}: ${typeof v} != ${type}`); - return false; - } - - return true; -}; - -const deepMerge = (a: T, b: U, path = ""): T & U => { - const merged: { [k: string]: any } = { ...b }; - for (const [k, v] of Object.entries(a)) { - if (b.hasOwnProperty(k)) { - const bv = b[k as keyof U]; - if (isObject(v) && isObject(bv)) merged[k] = deepMerge(v, bv, `${path}${k}.`); - else if (!isCorrectType(bv, types[path + k], path + k)) merged[k] = v; - } else merged[k] = v; - } - return merged as any; -}; - -export const convertSettings = (obj: T): Settings => - Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, isObject(v) ? convertSettings(v) : Variable(v)])) as any; - -const updateSection = (from: { [k: string]: any }, to: { [k: string]: any }, path = "") => { - for (const [k, v] of Object.entries(from)) { - if (to.hasOwnProperty(k)) { - if (isObject(v)) updateSection(v, to[k], `${path}${k}.`); - else if (!Array.isArray(v) || JSON.stringify(to[k].get()) !== JSON.stringify(v)) to[k].set(v); - } else warn(`Unknown config key: ${path}${k}`); - } -}; - -export const updateConfig = async () => { - if (GLib.file_test(CONFIG, GLib.FileTest.EXISTS)) - updateSection(deepMerge(defaults, JSON.parse(await readFileAsync(CONFIG))), config); - else updateSection(defaults, config); - await loadStyleAsync(); - console.log("[LOG] Config updated"); -}; - -export const initConfig = async () => { - monitorFile(CONFIG, (_, e) => { - if (e === Gio.FileMonitorEvent.CHANGES_DONE_HINT || e === Gio.FileMonitorEvent.DELETED) - updateConfig().catch(warn); - }); - await updateConfig().catch(warn); -}; - -export const setConfig = async (path: string, value: any) => { - const conf = JSON.parse(await readFileAsync(CONFIG)); - let obj = conf; - for (const p of path.split(".").slice(0, -1)) obj = obj[p]; - obj[path.split(".").at(-1)!] = value; - await writeFileAsync(CONFIG, JSON.stringify(conf, null, 4)); -}; diff --git a/src/config/index.ts b/src/config/index.ts deleted file mode 100644 index 80b4dc4..0000000 --- a/src/config/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import defaults from "./defaults"; -import { convertSettings } from "./funcs"; - -const config = convertSettings(defaults); - -export const { - style, - bar, - launcher, - notifpopups, - osds, - sidebar, - navbar, - math, - updates, - weather, - cpu, - gpu, - memory, - storage, - wallpapers, - calendar, - thumbnailer, - news, -} = config; -export default config; diff --git a/src/config/literals.ts b/src/config/literals.ts deleted file mode 100644 index 1908c71..0000000 --- a/src/config/literals.ts +++ /dev/null @@ -1,336 +0,0 @@ -export const BAR_MODULES = [ - "osIcon", - "activeWindow", - "mediaPlaying", - "brightnessSpacer", - "workspaces", - "volumeSpacer", - "tray", - "statusIcons", - "pkgUpdates", - "notifCount", - "battery", - "dateTime", - "power", -]; - -export const NEWS_COUNTRIES = [ - "af", // Afghanistan - "al", // Albania - "dz", // Algeria - "ad", // Andorra - "ao", // Angola - "ar", // Argentina - "am", // Armenia - "au", // Australia - "at", // Austria - "az", // Azerbaijan - "bs", // Bahamas - "bh", // Bahrain - "bd", // Bangladesh - "bb", // Barbados - "by", // Belarus - "be", // Belgium - "bz", // Belize - "bj", // Benin - "bm", // Bermuda - "bt", // Bhutan - "bo", // Bolivia - "ba", // Bosnia And Herzegovina - "bw", // Botswana - "br", // Brazil - "bn", // Brunei - "bg", // Bulgaria - "bf", // Burkina fasco - "bi", // Burundi - "kh", // Cambodia - "cm", // Cameroon - "ca", // Canada - "cv", // Cape Verde - "ky", // Cayman Islands - "cf", // Central African Republic - "td", // Chad - "cl", // Chile - "cn", // China - "co", // Colombia - "km", // Comoros - "cg", // Congo - "ck", // Cook islands - "cr", // Costa Rica - "hr", // Croatia - "cu", // Cuba - "cw", // Curaçao - "cy", // Cyprus - "cz", // Czech republic - "dk", // Denmark - "dj", // Djibouti - "dm", // Dominica - "do", // Dominican republic - "cd", // DR Congo - "ec", // Ecuador - "eg", // Egypt - "sv", // El Salvador - "gq", // Equatorial Guinea - "er", // Eritrea - "ee", // Estonia - "sz", // Eswatini - "et", // Ethiopia - "fj", // Fiji - "fi", // Finland - "fr", // France - "pf", // French polynesia - "ga", // Gabon - "gm", // Gambia - "ge", // Georgia - "de", // Germany - "gh", // Ghana - "gi", // Gibraltar - "gr", // Greece - "gd", // Grenada - "gt", // Guatemala - "gn", // Guinea - "gy", // Guyana - "ht", // Haiti - "hn", // Honduras - "hk", // Hong kong - "hu", // Hungary - "is", // Iceland - "in", // India - "id", // Indonesia - "ir", // Iran - "iq", // Iraq - "ie", // Ireland - "il", // Israel - "it", // Italy - "ci", // Ivory Coast - "jm", // Jamaica - "jp", // Japan - "je", // Jersey - "jo", // Jordan - "kz", // Kazakhstan - "ke", // Kenya - "ki", // Kiribati - "xk", // Kosovo - "kw", // Kuwait - "kg", // Kyrgyzstan - "la", // Laos - "lv", // Latvia - "lb", // Lebanon - "ls", // Lesotho - "lr", // Liberia - "ly", // Libya - "li", // Liechtenstein - "lt", // Lithuania - "lu", // Luxembourg - "mo", // Macau - "mk", // Macedonia - "mg", // Madagascar - "mw", // Malawi - "my", // Malaysia - "mv", // Maldives - "ml", // Mali - "mt", // Malta - "mh", // Marshall Islands - "mr", // Mauritania - "mu", // Mauritius - "mx", // Mexico - "fm", // Micronesia - "md", // Moldova - "mc", // Monaco - "mn", // Mongolia - "me", // Montenegro - "ma", // Morocco - "mz", // Mozambique - "mm", // Myanmar - "na", // Namibia - "nr", // Nauru - "np", // Nepal - "nl", // Netherland - "nc", // New caledonia - "nz", // New zealand - "ni", // Nicaragua - "ne", // Niger - "ng", // Nigeria - "kp", // North korea - "no", // Norway - "om", // Oman - "pk", // Pakistan - "pw", // Palau - "ps", // Palestine - "pa", // Panama - "pg", // Papua New Guinea - "py", // Paraguay - "pe", // Peru - "ph", // Philippines - "pl", // Poland - "pt", // Portugal - "pr", // Puerto rico - "qa", // Qatar - "ro", // Romania - "ru", // Russia - "rw", // Rwanda - "lc", // Saint lucia - "sx", // Saint martin(dutch) - "ws", // Samoa - "sm", // San Marino - "st", // Sao tome and principe - "sa", // Saudi arabia - "sn", // Senegal - "rs", // Serbia - "sc", // Seychelles - "sl", // Sierra Leone - "sg", // Singapore - "sk", // Slovakia - "si", // Slovenia - "sb", // Solomon Islands - "so", // Somalia - "za", // South africa - "kr", // South korea - "es", // Spain - "lk", // Sri Lanka - "sd", // Sudan - "sr", // Suriname - "se", // Sweden - "ch", // Switzerland - "sy", // Syria - "tw", // Taiwan - "tj", // Tajikistan - "tz", // Tanzania - "th", // Thailand - "tl", // Timor-Leste - "tg", // Togo - "to", // Tonga - "tt", // Trinidad and tobago - "tn", // Tunisia - "tr", // Turkey - "tm", // Turkmenistan - "tv", // Tuvalu - "ug", // Uganda - "ua", // Ukraine - "ae", // United arab emirates - "gb", // United kingdom - "us", // United states of america - "uy", // Uruguay - "uz", // Uzbekistan - "vu", // Vanuatu - "va", // Vatican - "ve", // Venezuela - "vi", // Vietnam - "vg", // Virgin Islands (British) - "wo", // World - "ye", // Yemen - "zm", // Zambia - "zw", // Zimbabwe -]; - -export const NEWS_CATEGORIES = [ - "business", - "crime", - "domestic", - "education", - "entertainment", - "environment", - "food", - "health", - "lifestyle", - "other", - "politics", - "science", - "sports", - "technology", - "top", - "tourism", - "world", -]; - -export const NEWS_LANGUAGES = [ - "af", // Afrikaans - "sq", // Albanian - "am", // Amharic - "ar", // Arabic - "hy", // Armenian - "as", // Assamese - "az", // Azerbaijani - "bm", // Bambara - "eu", // Basque - "be", // Belarusian - "bn", // Bengali - "bs", // Bosnian - "bg", // Bulgarian - "my", // Burmese - "ca", // Catalan - "ckb", // Central Kurdish - "zh", // Chinese - "hr", // Croatian - "cs", // Czech - "da", // Danish - "nl", // Dutch - "en", // English - "et", // Estonian - "pi", // Filipino - "fi", // Finnish - "fr", // French - "gl", // Galician - "ka", // Georgian - "de", // German - "el", // Greek - "gu", // Gujarati - "ha", // Hausa - "he", // Hebrew - "hi", // Hindi - "hu", // Hungarian - "is", // Icelandic - "id", // Indonesian - "it", // Italian - "jp", // Japanese - "kn", // Kannada - "kz", // Kazakh - "kh", // Khmer - "rw", // Kinyarwanda - "ko", // Korean - "ku", // Kurdish - "lv", // Latvian - "lt", // Lithuanian - "lb", // Luxembourgish - "mk", // Macedonian - "ms", // Malay - "ml", // Malayalam - "mt", // Maltese - "mi", // Maori - "mr", // Marathi - "mn", // Mongolian - "ne", // Nepali - "no", // Norwegian - "or", // Oriya - "ps", // Pashto - "fa", // Persian - "pl", // Polish - "pt", // Portuguese - "pa", // Punjabi - "ro", // Romanian - "ru", // Russian - "sm", // Samoan - "sr", // Serbian - "sn", // Shona - "sd", // Sindhi - "si", // Sinhala - "sk", // Slovak - "sl", // Slovenian - "so", // Somali - "es", // Spanish - "sw", // Swahili - "sv", // Swedish - "tg", // Tajik - "ta", // Tamil - "te", // Telugu - "th", // Thai - "zht", // Traditional chinese - "tr", // Turkish - "tk", // Turkmen - "uk", // Ukrainian - "ur", // Urdu - "uz", // Uzbek - "vi", // Vietnamese - "cy", // Welsh - "zu", // Zulu -]; diff --git a/src/config/types.ts b/src/config/types.ts deleted file mode 100644 index c8fb9b4..0000000 --- a/src/config/types.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { BAR_MODULES, NEWS_CATEGORIES, NEWS_COUNTRIES, NEWS_LANGUAGES } from "./literals"; - -const BOOL = "boolean"; -const STR = "string"; -const NUM = "number"; -const ARR = (type: string | string[]) => `array of ${typeof type === "string" ? type : JSON.stringify(type)}`; -const OBJ_ARR = (shape: object) => ARR(JSON.stringify(shape)); - -export default { - "style.transparency": ["off", "low", "normal", "high"], - "style.borders": BOOL, - "style.vibrant": BOOL, - "config.notifyOnError": BOOL, - // Bar - "bar.vertical": BOOL, - "bar.style": ["gaps", "panel", "embedded"], - "bar.layout.type": ["centerbox", "flowbox"], - "bar.layout.centerbox.start": ARR(BAR_MODULES), - "bar.layout.centerbox.center": ARR(BAR_MODULES), - "bar.layout.centerbox.end": ARR(BAR_MODULES), - "bar.layout.flowbox": ARR(BAR_MODULES), - "bar.modules.workspaces.shown": NUM, - "bar.modules.workspaces.showLabels": BOOL, - "bar.modules.workspaces.labels": ARR(STR), - "bar.modules.workspaces.xalign": NUM, - "bar.modules.workspaces.showWindows": BOOL, - "bar.modules.dateTime.format": STR, - "bar.modules.dateTime.detailedFormat": STR, - // Launcher - "launcher.style": ["lines", "round"], - "launcher.actionPrefix": STR, - "launcher.apps.maxResults": NUM, - "launcher.files.maxResults": NUM, - "launcher.files.fdOpts": ARR(STR), - "launcher.files.shortenThreshold": NUM, - "launcher.math.maxResults": NUM, - "launcher.todo.notify": BOOL, - "launcher.wallpaper.maxResults": NUM, - "launcher.wallpaper.showAllEmpty": BOOL, - "launcher.wallpaper.style": ["compact", "medium", "large"], - "launcher.disabledActions": ARR(STR), - // Notif popups - "notifpopups.maxPopups": NUM, - "notifpopups.expire": BOOL, - "notifpopups.agoTime": BOOL, - // OSDs - "osds.volume.position": [2, 4, 8, 16], - "osds.volume.margin": NUM, - "osds.volume.hideDelay": NUM, - "osds.volume.showValue": BOOL, - "osds.brightness.position": [2, 4, 8, 16], - "osds.brightness.margin": NUM, - "osds.brightness.hideDelay": NUM, - "osds.brightness.showValue": BOOL, - "osds.lock.spacing": NUM, - "osds.lock.caps.hideDelay": NUM, - "osds.lock.num.hideDelay": NUM, - // Sidebar - "sidebar.showOnStartup": BOOL, - "sidebar.modules.headlines.enabled": BOOL, - // Navbar - "navbar.persistent": BOOL, - "navbar.appearWidth": NUM, - "navbar.showLabels": BOOL, - // Services - "math.maxHistory": NUM, - "updates.interval": NUM, - "weather.interval": NUM, - "weather.apiKey": STR, - "weather.location": STR, - "weather.imperial": BOOL, - "cpu.interval": NUM, - "gpu.interval": NUM, - "memory.interval": NUM, - "storage.interval": NUM, - "wallpapers.paths": OBJ_ARR({ recursive: BOOL, path: STR, threshold: NUM }), - "calendar.webcals": ARR(STR), - "calendar.upcomingDays": NUM, - "calendar.notify": BOOL, - "thumbnailer.maxAttempts": NUM, - "thumbnailer.timeBetweenAttempts": NUM, - "thumbnailer.defaults.width": NUM, - "thumbnailer.defaults.height": NUM, - "thumbnailer.defaults.exact": BOOL, - "news.apiKey": STR, - "news.countries": ARR(NEWS_COUNTRIES), - "news.categories": ARR(NEWS_CATEGORIES), - "news.languages": ARR(NEWS_LANGUAGES), - "news.domains": ARR(STR), - "news.excludeDomains": ARR(STR), - "news.timezone": STR, - "news.pages": NUM, -} as { [k: string]: string | string[] | number[] }; diff --git a/src/modules/bar.tsx b/src/modules/bar.tsx deleted file mode 100644 index c131029..0000000 --- a/src/modules/bar.tsx +++ /dev/null @@ -1,703 +0,0 @@ -import type { Monitor } from "@/services/monitors"; -import Players from "@/services/players"; -import Updates from "@/services/updates"; -import { getAppCategoryIcon } from "@/utils/icons"; -import { bindCurrentTime, osIcon } from "@/utils/system"; -import type { AstalWidget } from "@/utils/types"; -import { setupCustomTooltip } from "@/utils/widgets"; -import ScreenCorner from "@/widgets/screencorner"; -import { execAsync, GLib, Variable } from "astal"; -import { bind, kebabify } from "astal/binding"; -import { App, Astal, Gtk, Widget } from "astal/gtk3"; -import { bar as config } from "config"; -import AstalBattery from "gi://AstalBattery"; -import AstalBluetooth from "gi://AstalBluetooth"; -import AstalHyprland from "gi://AstalHyprland"; -import AstalNetwork from "gi://AstalNetwork"; -import AstalNotifd from "gi://AstalNotifd"; -import AstalTray from "gi://AstalTray"; -import AstalWp from "gi://AstalWp"; -import { switchPane } from "./sidebar"; - -interface ClassNameProps { - beforeSpacer: boolean; - afterSpacer: boolean; - first: boolean; - last: boolean; -} - -interface ModuleProps extends ClassNameProps { - monitor: Monitor; -} - -const hyprland = AstalHyprland.get_default(); - -const getBatteryIcon = (perc: number) => { - if (perc < 0.1) return "󰁺"; - if (perc < 0.2) return "󰁻"; - if (perc < 0.3) return "󰁼"; - if (perc < 0.4) return "󰁽"; - if (perc < 0.5) return "󰁾"; - if (perc < 0.6) return "󰁿"; - if (perc < 0.7) return "󰂀"; - if (perc < 0.8) return "󰂁"; - if (perc < 0.9) return "󰂂"; - return "󰁹"; -}; - -const formatSeconds = (sec: number) => { - if (sec >= 3600) { - const hours = Math.floor(sec / 3600); - let str = `${hours} hour${hours === 1 ? "" : "s"}`; - const mins = Math.floor((sec % 3600) / 60); - if (mins > 0) str += ` ${mins} minute${mins === 1 ? "" : "s"}`; - return str; - } else if (sec >= 60) { - const mins = Math.floor(sec / 60); - return `${mins} minute${mins === 1 ? "" : "s"}`; - } else return `${sec} second${sec === 1 ? "" : "s"}`; -}; - -const hookFocusedClientProp = ( - self: AstalWidget, - prop: keyof AstalHyprland.Client, - callback: (c: AstalHyprland.Client | null) => void -) => { - let id: number | null = null; - let lastClient: AstalHyprland.Client | null = null; - self.hook(hyprland, "notify::focused-client", () => { - if (id) lastClient?.disconnect(id); - lastClient = hyprland.focusedClient; // Can be null - id = lastClient?.connect(`notify::${kebabify(prop)}`, () => callback(lastClient)); - callback(lastClient); - }); - self.connect("destroy", () => id && lastClient?.disconnect(id)); - callback(lastClient); -}; - -const getClassName = ({ beforeSpacer, afterSpacer, first, last }: ClassNameProps) => - `${beforeSpacer ? "before-spacer" : ""} ${afterSpacer ? "after-spacer" : ""}` + - ` ${first ? "first" : ""} ${last ? "last" : ""}`; - -const getModule = (module: string) => { - module = module.toLowerCase(); - if (module === "osicon") return OSIcon; - if (module === "activewindow") return ActiveWindow; - if (module === "mediaplaying") return MediaPlaying; - if (module === "workspaces") return Workspaces; - if (module === "tray") return Tray; - if (module === "statusicons") return StatusIcons; - if (module === "pkgupdates") return PkgUpdates; - if (module === "notifcount") return NotifCount; - if (module === "battery") return Battery; - if (module === "datetime") return DateTime; - if (module === "power") return Power; - if (module === "brightnessspacer") return BrightnessSpacer; - if (module === "volumespacer") return VolumeSpacer; - return () => null; -}; - -const isSpacer = (module?: string) => module?.toLowerCase().endsWith("spacer") ?? false; - -const OSIcon = ({ monitor, ...props }: ModuleProps) => ( - -); - -const ActiveWindow = ({ monitor, ...props }: ModuleProps) => ( - { - const title = Variable(""); - const updateTooltip = (c: AstalHyprland.Client | null) => - title.set(c?.class && c?.title ? `${c.class}: ${c.title}` : ""); - hookFocusedClientProp(self, "class", updateTooltip); - hookFocusedClientProp(self, "title", updateTooltip); - updateTooltip(hyprland.focusedClient); - - const window = setupCustomTooltip(self, bind(title)); - if (window) { - self.hook(title, (_, v) => !v && window.hide()); - self.hook(window, "map", () => !title.get() && window.hide()); - } - }} - > - -); - -const MediaPlaying = ({ monitor, ...props }: ModuleProps) => { - const players = Players.get_default(); - const getLabel = (fallback = "") => - players.lastPlayer ? `${players.lastPlayer.title} - ${players.lastPlayer.artist}` : fallback; - return ( - - ); -}; - -const Workspace = ({ idx }: { idx: number }) => { - const wsId = Variable.derive([bind(hyprland, "focusedWorkspace"), config.modules.workspaces.shown], (f, s) => - f ? Math.floor((f.id - 1) / s) * s + idx : idx - ); - - const label = ( -