Merge branch 'master' into master
This commit is contained in:
1
package-lock.json
generated
1
package-lock.json
generated
@@ -25,6 +25,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"../../../../usr/share/astal/gjs": {
|
"../../../../usr/share/astal/gjs": {
|
||||||
|
"name": "astal",
|
||||||
"license": "LGPL-2.1"
|
"license": "LGPL-2.1"
|
||||||
},
|
},
|
||||||
"node_modules/@eslint-community/eslint-utils": {
|
"node_modules/@eslint-community/eslint-utils": {
|
||||||
|
|||||||
@@ -8,7 +8,13 @@ export const BarGeneral = (): JSX.Element => {
|
|||||||
<scrollable name={'General'} className="bar-theme-page paged-container" vscroll={Gtk.PolicyType.AUTOMATIC}>
|
<scrollable name={'General'} className="bar-theme-page paged-container" vscroll={Gtk.PolicyType.AUTOMATIC}>
|
||||||
<box vertical>
|
<box vertical>
|
||||||
<Header title="General Settings" />
|
<Header title="General Settings" />
|
||||||
<Option opt={options.theme.font.name} title="Font" type="font" />
|
<Option
|
||||||
|
opt={options.theme.font.name}
|
||||||
|
fontLabel={options.theme.font.label}
|
||||||
|
fontStyle={options.theme.font.style}
|
||||||
|
title="Font"
|
||||||
|
type="font"
|
||||||
|
/>
|
||||||
<Option opt={options.theme.font.size} title="Font Size" type="string" />
|
<Option opt={options.theme.font.size} title="Font Size" type="string" />
|
||||||
<Option
|
<Option
|
||||||
opt={options.theme.font.weight}
|
opt={options.theme.font.weight}
|
||||||
|
|||||||
@@ -100,19 +100,6 @@ export const filterConfigForNonTheme = (config: Config): Config => {
|
|||||||
* @param themeOnly - A flag indicating whether to save only theme-related properties.
|
* @param themeOnly - A flag indicating whether to save only theme-related properties.
|
||||||
*/
|
*/
|
||||||
export const saveFileDialog = (filePath: string, themeOnly: boolean): void => {
|
export const saveFileDialog = (filePath: string, themeOnly: boolean): void => {
|
||||||
const original_file_path = filePath;
|
|
||||||
|
|
||||||
const file = Gio.File.new_for_path(original_file_path);
|
|
||||||
const [success, content] = file.load_contents(null);
|
|
||||||
|
|
||||||
if (!success) {
|
|
||||||
console.error(`Could not find 'config.json' at ${TMP}`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const jsonString = new TextDecoder('utf-8').decode(content);
|
|
||||||
const jsonObject = JSON.parse(jsonString);
|
|
||||||
|
|
||||||
const filterHexColorPairs = (jsonObject: Config): Config => {
|
const filterHexColorPairs = (jsonObject: Config): Config => {
|
||||||
const filteredObject: Config = {};
|
const filteredObject: Config = {};
|
||||||
|
|
||||||
@@ -145,9 +132,6 @@ export const saveFileDialog = (filePath: string, themeOnly: boolean): void => {
|
|||||||
return filteredObject;
|
return filteredObject;
|
||||||
};
|
};
|
||||||
|
|
||||||
const filteredJsonObject = themeOnly ? filterHexColorPairs(jsonObject) : filterOutHexColorPairs(jsonObject);
|
|
||||||
const filteredContent = JSON.stringify(filteredJsonObject, null, 2);
|
|
||||||
|
|
||||||
const dialog = new Gtk.FileChooserDialog({
|
const dialog = new Gtk.FileChooserDialog({
|
||||||
title: `Save Hyprpanel ${themeOnly ? 'Theme' : 'Config'}`,
|
title: `Save Hyprpanel ${themeOnly ? 'Theme' : 'Config'}`,
|
||||||
action: Gtk.FileChooserAction.SAVE,
|
action: Gtk.FileChooserAction.SAVE,
|
||||||
@@ -160,6 +144,23 @@ export const saveFileDialog = (filePath: string, themeOnly: boolean): void => {
|
|||||||
|
|
||||||
const response = dialog.run();
|
const response = dialog.run();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const original_file_path = filePath;
|
||||||
|
|
||||||
|
const file = Gio.File.new_for_path(original_file_path);
|
||||||
|
const [success, content] = file.load_contents(null);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
console.error(`Could not find 'config.json' at ${TMP}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const jsonString = new TextDecoder('utf-8').decode(content);
|
||||||
|
const jsonObject = JSON.parse(jsonString);
|
||||||
|
|
||||||
|
const filteredJsonObject = themeOnly ? filterHexColorPairs(jsonObject) : filterOutHexColorPairs(jsonObject);
|
||||||
|
const filteredContent = JSON.stringify(filteredJsonObject, null, 2);
|
||||||
|
|
||||||
if (response === Gtk.ResponseType.ACCEPT) {
|
if (response === Gtk.ResponseType.ACCEPT) {
|
||||||
const file_path = dialog.get_filename();
|
const file_path = dialog.get_filename();
|
||||||
console.info(`Original file path: ${file_path}`);
|
console.info(`Original file path: ${file_path}`);
|
||||||
@@ -209,6 +210,16 @@ export const saveFileDialog = (filePath: string, themeOnly: boolean): void => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dialog.destroy();
|
dialog.destroy();
|
||||||
|
} catch (error) {
|
||||||
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
||||||
|
dialog.destroy();
|
||||||
|
|
||||||
|
Notify({
|
||||||
|
summary: `${themeOnly ? 'Theme' : 'Config'} Export Failed`,
|
||||||
|
body: errorMessage ?? 'An unknown error occurred.',
|
||||||
|
iconName: icons.ui.warning,
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -231,6 +242,7 @@ export const importFiles = (themeOnly: boolean = false): void => {
|
|||||||
|
|
||||||
const response = dialog.run();
|
const response = dialog.run();
|
||||||
|
|
||||||
|
try {
|
||||||
if (response === Gtk.ResponseType.CANCEL) {
|
if (response === Gtk.ResponseType.CANCEL) {
|
||||||
dialog.destroy();
|
dialog.destroy();
|
||||||
return;
|
return;
|
||||||
@@ -290,4 +302,14 @@ export const importFiles = (themeOnly: boolean = false): void => {
|
|||||||
}
|
}
|
||||||
dialog.destroy();
|
dialog.destroy();
|
||||||
bash(restartCommand.get());
|
bash(restartCommand.get());
|
||||||
|
} catch (error) {
|
||||||
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
||||||
|
dialog.destroy();
|
||||||
|
|
||||||
|
Notify({
|
||||||
|
summary: `${themeOnly ? 'Theme' : 'Config'} Import Failed`,
|
||||||
|
body: errorMessage ?? 'An unknown error occurred.',
|
||||||
|
iconName: icons.ui.warning,
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import { Gtk } from 'astal/gtk3';
|
|||||||
|
|
||||||
const InputField = <T extends string | number | boolean | object>({
|
const InputField = <T extends string | number | boolean | object>({
|
||||||
opt,
|
opt,
|
||||||
|
fontStyle,
|
||||||
|
fontLabel,
|
||||||
type = typeof opt.get() as RowProps<T>['type'],
|
type = typeof opt.get() as RowProps<T>['type'],
|
||||||
enums = [],
|
enums = [],
|
||||||
disabledBinding,
|
disabledBinding,
|
||||||
@@ -44,7 +46,7 @@ const InputField = <T extends string | number | boolean | object>({
|
|||||||
case 'wallpaper':
|
case 'wallpaper':
|
||||||
return <WallpaperInputter opt={opt} />;
|
return <WallpaperInputter opt={opt} />;
|
||||||
case 'font':
|
case 'font':
|
||||||
return <FontInputter opt={opt} />;
|
return <FontInputter fontFamily={opt} fontLabel={fontLabel} fontStyle={fontStyle} />;
|
||||||
case 'color':
|
case 'color':
|
||||||
return <ColorInputter opt={opt} />;
|
return <ColorInputter opt={opt} />;
|
||||||
|
|
||||||
@@ -55,6 +57,8 @@ const InputField = <T extends string | number | boolean | object>({
|
|||||||
|
|
||||||
export const Inputter = <T extends string | number | boolean | object>({
|
export const Inputter = <T extends string | number | boolean | object>({
|
||||||
opt,
|
opt,
|
||||||
|
fontStyle,
|
||||||
|
fontLabel,
|
||||||
type = typeof opt.get() as RowProps<T>['type'],
|
type = typeof opt.get() as RowProps<T>['type'],
|
||||||
enums,
|
enums,
|
||||||
disabledBinding,
|
disabledBinding,
|
||||||
@@ -71,6 +75,8 @@ export const Inputter = <T extends string | number | boolean | object>({
|
|||||||
<InputField
|
<InputField
|
||||||
type={type}
|
type={type}
|
||||||
opt={opt}
|
opt={opt}
|
||||||
|
fontStyle={fontStyle}
|
||||||
|
fontLabel={fontLabel}
|
||||||
enums={enums}
|
enums={enums}
|
||||||
disabledBinding={disabledBinding}
|
disabledBinding={disabledBinding}
|
||||||
dependencies={dependencies}
|
dependencies={dependencies}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ export const SettingInput = <T extends string | number | boolean | object>({
|
|||||||
return (
|
return (
|
||||||
<Inputter
|
<Inputter
|
||||||
opt={props.opt}
|
opt={props.opt}
|
||||||
|
fontStyle={props.fontStyle}
|
||||||
|
fontLabel={props.fontLabel}
|
||||||
type={props.type}
|
type={props.type}
|
||||||
enums={props.enums}
|
enums={props.enums}
|
||||||
disabledBinding={props.disabledBinding}
|
disabledBinding={props.disabledBinding}
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
import FontButton from 'src/components/shared/FontButton';
|
|
||||||
import { Opt } from 'src/lib/option';
|
|
||||||
|
|
||||||
export const FontInputter = <T extends string | number | boolean | object>({
|
|
||||||
opt,
|
|
||||||
}: FontInputterProps<T>): JSX.Element => {
|
|
||||||
return (
|
|
||||||
<FontButton
|
|
||||||
showSize={false}
|
|
||||||
useSize={false}
|
|
||||||
setup={(self) => {
|
|
||||||
self.font = opt.get() as string;
|
|
||||||
|
|
||||||
self.hook(opt, () => (self.font = opt.get() as string));
|
|
||||||
self.connect('font-set', ({ font }) => opt.set(font!.split(' ').slice(0, -1).join(' ') as T));
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
interface FontInputterProps<T> {
|
|
||||||
opt: Opt<T>;
|
|
||||||
}
|
|
||||||
43
src/components/settings/shared/inputs/font/index.tsx
Normal file
43
src/components/settings/shared/inputs/font/index.tsx
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import FontButton from 'src/components/shared/FontButton';
|
||||||
|
import { Opt } from 'src/lib/option';
|
||||||
|
import { styleToString } from './utils';
|
||||||
|
|
||||||
|
export const FontInputter = <T extends string | number | boolean | object>({
|
||||||
|
fontFamily,
|
||||||
|
fontStyle,
|
||||||
|
fontLabel,
|
||||||
|
}: FontInputterProps<T>): JSX.Element => (
|
||||||
|
<FontButton
|
||||||
|
showSize={false}
|
||||||
|
useSize={false}
|
||||||
|
setup={(self) => {
|
||||||
|
self.font = fontLabel?.get() ?? (fontFamily.get() as string);
|
||||||
|
|
||||||
|
if (fontLabel) {
|
||||||
|
self.hook(fontLabel, () => {
|
||||||
|
self.font = fontLabel.get() as string;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.hook(fontFamily, () => {
|
||||||
|
self.font = fontFamily.get() as string;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
self.connect('font-set', ({ fontDesc, font }) => {
|
||||||
|
const selectedFontFamily = fontDesc.get_family();
|
||||||
|
const selectedFontStyle = styleToString(fontDesc.get_style());
|
||||||
|
|
||||||
|
fontFamily.set(selectedFontFamily as T);
|
||||||
|
|
||||||
|
fontStyle?.set(selectedFontStyle);
|
||||||
|
fontLabel?.set(font.split(' ').slice(0, -1).join(' '));
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
interface FontInputterProps<T> {
|
||||||
|
fontFamily: Opt<T>;
|
||||||
|
fontStyle?: Opt<string>;
|
||||||
|
fontLabel?: Opt<string>;
|
||||||
|
}
|
||||||
72
src/components/settings/shared/inputs/font/utils.ts
Normal file
72
src/components/settings/shared/inputs/font/utils.ts
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import Pango from 'gi://Pango?version=1.0';
|
||||||
|
|
||||||
|
export type FontStyle = 'normal' | 'italic' | 'oblique';
|
||||||
|
export type FontVariant = 'normal' | 'small-caps';
|
||||||
|
export type FontWeight =
|
||||||
|
| 'thin'
|
||||||
|
| 'ultralight'
|
||||||
|
| 'light'
|
||||||
|
| 'semilight'
|
||||||
|
| 'book'
|
||||||
|
| 'normal'
|
||||||
|
| 'medium'
|
||||||
|
| 'semibold'
|
||||||
|
| 'bold'
|
||||||
|
| 'ultrabold'
|
||||||
|
| 'heavy';
|
||||||
|
|
||||||
|
const DEFAULT_FONT_STYLE: FontStyle = 'normal';
|
||||||
|
const DEFAULT_FONT_VARIANT: FontVariant = 'normal';
|
||||||
|
const DEFAULT_FONT_WEIGHT: FontWeight = 'normal';
|
||||||
|
|
||||||
|
const styleMap: Record<Pango.Style, FontStyle> = {
|
||||||
|
[Pango.Style.NORMAL]: 'normal',
|
||||||
|
[Pango.Style.ITALIC]: 'italic',
|
||||||
|
[Pango.Style.OBLIQUE]: 'oblique',
|
||||||
|
};
|
||||||
|
|
||||||
|
const variantMap: Record<Pango.Variant, FontVariant> = {
|
||||||
|
[Pango.Variant.NORMAL]: 'normal',
|
||||||
|
[Pango.Variant.SMALL_CAPS]: 'small-caps',
|
||||||
|
};
|
||||||
|
|
||||||
|
const weightMap: Record<Pango.Weight, FontWeight> = {
|
||||||
|
[Pango.Weight.THIN]: 'thin',
|
||||||
|
[Pango.Weight.ULTRALIGHT]: 'ultralight',
|
||||||
|
[Pango.Weight.LIGHT]: 'light',
|
||||||
|
[Pango.Weight.SEMILIGHT]: 'semilight',
|
||||||
|
[Pango.Weight.BOOK]: 'book',
|
||||||
|
[Pango.Weight.NORMAL]: 'normal',
|
||||||
|
[Pango.Weight.MEDIUM]: 'medium',
|
||||||
|
[Pango.Weight.SEMIBOLD]: 'semibold',
|
||||||
|
[Pango.Weight.BOLD]: 'bold',
|
||||||
|
[Pango.Weight.ULTRABOLD]: 'ultrabold',
|
||||||
|
[Pango.Weight.HEAVY]: 'heavy',
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a Pango.Style enum to a FontStyle string.
|
||||||
|
* @param styleEnum - The Pango.Style enum value.
|
||||||
|
* @returns The corresponding FontStyle string.
|
||||||
|
*/
|
||||||
|
export function styleToString(styleEnum: Pango.Style): FontStyle {
|
||||||
|
return styleMap[styleEnum] ?? DEFAULT_FONT_STYLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a Pango.Variant enum to a FontVariant string.
|
||||||
|
* @param variantEnum - The Pango.Variant enum value.
|
||||||
|
* @returns The corresponding FontVariant string.
|
||||||
|
*/
|
||||||
|
export function variantToString(variantEnum: Pango.Variant): FontVariant {
|
||||||
|
return variantMap[variantEnum] ?? DEFAULT_FONT_VARIANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a Pango.Weight enum to a FontWeight string.
|
||||||
|
* @param weightEnum - The Pango.Weight enum value.
|
||||||
|
* @returns The corresponding FontWeight string.
|
||||||
|
*/
|
||||||
|
export function weightToString(weightEnum: Pango.Weight): FontWeight {
|
||||||
|
return weightMap[weightEnum] ?? DEFAULT_FONT_WEIGHT;
|
||||||
|
}
|
||||||
2
src/lib/types/options.d.ts
vendored
2
src/lib/types/options.d.ts
vendored
@@ -104,6 +104,8 @@ export interface RowProps<T> {
|
|||||||
subtitleLink?: string;
|
subtitleLink?: string;
|
||||||
dependencies?: string[];
|
dependencies?: string[];
|
||||||
increment?: number;
|
increment?: number;
|
||||||
|
fontStyle?: Opt<string>;
|
||||||
|
fontLabel?: Opt<string>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type OSDOrientation = 'horizontal' | 'vertical';
|
export type OSDOrientation = 'horizontal' | 'vertical';
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { FontStyle } from './components/settings/shared/inputs/font/utils';
|
||||||
import { opt, mkOptions } from './lib/option';
|
import { opt, mkOptions } from './lib/option';
|
||||||
import { NetstatLabelType, RateUnit, ResourceLabelType } from './lib/types/bar';
|
import { NetstatLabelType, RateUnit, ResourceLabelType } from './lib/types/bar';
|
||||||
import { KbLabelType } from './lib/types/customModules/kbLayout';
|
import { KbLabelType } from './lib/types/customModules/kbLayout';
|
||||||
@@ -104,6 +105,8 @@ const options = mkOptions(CONFIG, {
|
|||||||
font: {
|
font: {
|
||||||
size: opt('1.2rem'),
|
size: opt('1.2rem'),
|
||||||
name: opt('Ubuntu Nerd Font'),
|
name: opt('Ubuntu Nerd Font'),
|
||||||
|
style: opt<FontStyle>('normal'),
|
||||||
|
label: opt('Ubuntu Nerd Font'),
|
||||||
weight: opt(600),
|
weight: opt(600),
|
||||||
},
|
},
|
||||||
notification: {
|
notification: {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
* {
|
* {
|
||||||
all: unset;
|
all: unset;
|
||||||
font-family: $font-name;
|
font-family: $font-name;
|
||||||
|
font-style: $font-style;
|
||||||
font-size: $font-size;
|
font-size: $font-size;
|
||||||
font-weight: $font-weight;
|
font-weight: $font-weight;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,12 @@
|
|||||||
@import "colors";
|
@import 'colors';
|
||||||
|
|
||||||
* {
|
html,
|
||||||
color: $default_fg;
|
body {
|
||||||
font-family: "JetBrainsMono NF";
|
|
||||||
font-size: 0.9rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
html, body {
|
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
background-color: $primary_bg;
|
background-color: $primary_bg;
|
||||||
}
|
}
|
||||||
|
|
||||||
// scrollbar {
|
|
||||||
// background-color: red;
|
|
||||||
// min-width: 5em;
|
|
||||||
// }
|
|
||||||
|
|
||||||
.code {
|
.code {
|
||||||
background: $light-background;
|
background: $light-background;
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
@@ -44,47 +34,47 @@ html, body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$languages-map: (
|
$languages-map: (
|
||||||
arduino: "",
|
arduino: '',
|
||||||
armasm: "",
|
armasm: '',
|
||||||
avrasm: "",
|
avrasm: '',
|
||||||
bash: "",
|
bash: '',
|
||||||
c: "",
|
c: '',
|
||||||
clojure: "",
|
clojure: '',
|
||||||
coffeescript: "",
|
coffeescript: '',
|
||||||
cpp: "",
|
cpp: '',
|
||||||
csharp: "",
|
csharp: '',
|
||||||
css: "",
|
css: '',
|
||||||
dockerfile: "",
|
dockerfile: '',
|
||||||
go: "",
|
go: '',
|
||||||
gradle: "",
|
gradle: '',
|
||||||
haskell: "",
|
haskell: '',
|
||||||
html: "",
|
html: '',
|
||||||
java: "",
|
java: '',
|
||||||
javascript: "",
|
javascript: '',
|
||||||
json: "",
|
json: '',
|
||||||
latex: "",
|
latex: '',
|
||||||
lua: "",
|
lua: '',
|
||||||
makefile: "",
|
makefile: '',
|
||||||
markdown: "",
|
markdown: '',
|
||||||
mipsasm: "",
|
mipsasm: '',
|
||||||
nginx: "",
|
nginx: '',
|
||||||
nix: "",
|
nix: '',
|
||||||
php: "",
|
php: '',
|
||||||
prolog: "",
|
prolog: '',
|
||||||
python: "",
|
python: '',
|
||||||
r: "",
|
r: '',
|
||||||
ruby: "",
|
ruby: '',
|
||||||
rust: "",
|
rust: '',
|
||||||
scss: "",
|
scss: '',
|
||||||
shell: "",
|
shell: '',
|
||||||
typescript: "",
|
typescript: '',
|
||||||
wasm: "",
|
wasm: '',
|
||||||
x86asm: "",
|
x86asm: '',
|
||||||
xml: "",
|
xml: '',
|
||||||
);
|
);
|
||||||
|
|
||||||
@each $lang, $content in $languages-map {
|
@each $lang, $content in $languages-map {
|
||||||
[data-language="#{$lang}"]:before {
|
[data-language='#{$lang}']:before {
|
||||||
content: $content;
|
content: $content;
|
||||||
font-size: 1.1rem;
|
font-size: 1.1rem;
|
||||||
color: $primary_fg;
|
color: $primary_fg;
|
||||||
@@ -218,5 +208,3 @@ code {
|
|||||||
background: rgba(243, 139, 168, 0.15);
|
background: rgba(243, 139, 168, 0.15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { resetCss } from '../style';
|
|||||||
|
|
||||||
export const initializeHotReload = async (): Promise<void> => {
|
export const initializeHotReload = async (): Promise<void> => {
|
||||||
const monitorList = [
|
const monitorList = [
|
||||||
|
`${SRC_DIR}/src/scss/main.scss`,
|
||||||
`${SRC_DIR}/src/scss/style/bar`,
|
`${SRC_DIR}/src/scss/style/bar`,
|
||||||
`${SRC_DIR}/src/scss/style/common`,
|
`${SRC_DIR}/src/scss/style/common`,
|
||||||
`${SRC_DIR}/src/scss/style/menus`,
|
`${SRC_DIR}/src/scss/style/menus`,
|
||||||
|
|||||||
Reference in New Issue
Block a user