Upgrade to Agsv2 + Astal (#533)

* migrate to astal

* Reorganize project structure.

* progress

* Migrate Dashboard and Window Title modules.

* Migrate clock and notification bar modules.

* Remove unused code

* Media menu

* Rework network and volume modules

* Finish custom modules.

* Migrate battery bar module.

* Update battery module and organize helpers.

* Migrate workspace module.

* Wrap up bar modules.

* Checkpoint before I inevitbly blow something up.

* Updates

* Fix event propagation logic.

* Type fixes

* More type fixes

* Fix padding for event boxes.

* Migrate volume menu and refactor scroll event handlers.

* network module WIP

* Migrate network service.

* Migrate bluetooth menu

* Updates

* Migrate notifications

* Update scrolling behavior for custom modules.

* Improve popup notifications and add timer functionality.

* Migration notifications menu header/controls.

* Migrate notifications menu and consolidate notifications menu code.

* Migrate power menu.

* Dashboard progress

* Migrate dashboard

* Migrate media menu.

* Reduce media menu nesting.

* Finish updating media menu bindings to navigate active player.

* Migrate battery menu

* Consolidate code

* Migrate calendar menu

* Fix workspace logic to update on client add/change/remove and consolidate code.

* Migrate osd

* Consolidate hyprland service connections.

* Implement startup dropdown menu position allocation.

* Migrate settings menu (WIP)

* Settings dialo menu fixes

* Finish Dashboard menu

* Type updates

* update submoldule for types

* update github ci

* ci

* Submodule update

* Ci updates

* Remove type checking for now.

* ci fix

* Fix a bunch of stuff, losing track... need rest. Brb coffee

* Validate dropdown menu before render.

* Consolidate code and add auto-hide functionality.

* Improve auto-hide behavior.

* Consolidate audio menu code

* Organize bluetooth code

* Improve active player logic

* Properly dismiss a notification on action button resolution.

* Implement CLI command engine and migrate CLI commands.

* Handle variable disposal

* Bar component fixes and add hyprland startup rules.

* Handle potentially null bindings network and bluetooth bindings.

* Handle potentially null wired adapter.

* Fix GPU stats

* Handle poller for GPU

* Fix gpu bar logic.

* Clean up logic for stat bars.

* Handle wifi and wired bar icon bindings.

* Fix battery percentages

* Fix switch behavior

* Wifi staging fixes

* Reduce redundant hyprland service calls.

* Code cleanup

* Document the option code and reduce redundant calls to optimize performance.

* Remove outdated comment.

* Add JSDocs

* Add meson to build hyprpanel

* Consistency updates

* Organize commands

* Fix images not showing up on notifications.

* Remove todo

* Move hyprpanel configuration to the ~/.config/hyprpanel directory and add utility commands.

* Handle SRC directory for the bundled/built hyprpanel.

* Add namespaces to all windows

* Migrate systray

* systray updates

* Update meson to include ts, tsx and scss files.

* Remove log from meson

* Fix file choose path and make it float.

* Added a command to check the dependency status

* Update dep names.

* Get scale directly from env

* Add todo
This commit is contained in:
Jas Singh
2024-12-20 18:10:10 -08:00
committed by GitHub
parent 955eed6c60
commit 2ffd602910
605 changed files with 19543 additions and 15999 deletions

118
src/scss/style.ts Normal file
View File

@@ -0,0 +1,118 @@
import options from '../options';
import { bash, dependencies } from '../lib/utils';
import { MatugenColors, RecursiveOptionsObject } from '../lib/types/options';
import { initializeTrackers } from './optionsTrackers';
import { generateMatugenColors, getMatugenHex, replaceHexValues } from '../services/matugen/index';
import { isHexColor } from '../globals/variables';
import { readFile, writeFile } from 'astal/file';
import { App } from 'astal/gtk3';
import { initializeHotReload } from './utils/hotReload';
import { defaultFile } from 'src/lib/option';
const deps = ['font', 'theme', 'bar.flatButtons', 'bar.position', 'bar.battery.charging', 'bar.battery.blocks'];
function extractVariables(theme: RecursiveOptionsObject, prefix = '', matugenColors?: MatugenColors): string[] {
let result = [] as string[];
for (const key in theme) {
if (!theme.hasOwnProperty(key)) {
continue;
}
const themeValue = theme[key];
const newPrefix = prefix ? `${prefix}-${key}` : key;
const replacedValue =
isHexColor(themeValue.value) && matugenColors !== undefined
? replaceHexValues(themeValue.value, matugenColors)
: themeValue.value;
if (typeof themeValue === 'function') {
result.push(`$${newPrefix}: ${replacedValue};`);
continue;
}
if (typeof themeValue !== 'object' || themeValue === null || Array.isArray(themeValue)) continue;
if (typeof themeValue.value !== 'undefined') {
result.push(`$${newPrefix}: ${replacedValue};`);
} else {
result = result.concat(extractVariables(themeValue, newPrefix, matugenColors));
}
}
return result;
}
async function extractMatugenizedVariables(matugenColors: MatugenColors): Promise<string[]> {
try {
const result = [] as string[];
const defaultFileContent = JSON.parse(readFile(defaultFile) || '{}');
for (const key in defaultFileContent) {
if (key.startsWith('theme.') === false) {
continue;
}
const configValue = defaultFileContent[key];
if (!isHexColor(configValue) && matugenColors !== undefined) {
result.push(`$${key.replace('theme.', '').split('.').join('-')}: ${configValue};`);
continue;
}
const matugenColor = getMatugenHex(configValue, matugenColors);
result.push(`$${key.replace('theme.', '').split('.').join('-')}: ${matugenColor};`);
}
return result;
} catch (error) {
console.error(error);
return [];
}
}
export const resetCss = async (): Promise<void> => {
if (!dependencies('sass')) return;
let variables: string[] = [];
try {
const matugenColors = await generateMatugenColors();
if (options.theme.matugen.get() && matugenColors) {
variables = await extractMatugenizedVariables(matugenColors);
} else {
variables = extractVariables(options.theme as RecursiveOptionsObject, '', undefined);
}
const vars = `${TMP}/variables.scss`;
const css = `${TMP}/main.css`;
const scss = `${TMP}/entry.scss`;
const localScss = `${SRC_DIR}/src/scss/main.scss`;
const themeVariables = variables;
const integratedVariables = themeVariables;
const imports = [vars].map((f) => `@import '${f}';`);
writeFile(vars, integratedVariables.join('\n'));
let mainScss = readFile(localScss);
mainScss = `${imports}\n${mainScss}`;
writeFile(scss, mainScss);
await bash(`sass --load-path=${SRC_DIR}/src/scss ${scss} ${css}`);
App.apply_css(css, true);
} catch (error) {
console.error(error);
}
};
initializeTrackers(resetCss);
initializeHotReload();
options.handler(deps, resetCss);
await resetCss();