port new components to greeter
This commit is contained in:
@@ -4,10 +4,9 @@ import Quickshell
|
||||
|
||||
Singleton {
|
||||
readonly property AppearanceConf.Anim anim: Config.appearance.anim
|
||||
readonly property AppearanceConf.Deform deform: Config.appearance.deform
|
||||
readonly property AppearanceConf.FontStuff font: Config.appearance.font
|
||||
readonly property AppearanceConf.Padding padding: Config.appearance.padding
|
||||
// Literally just here to shorten accessing stuff :woe:
|
||||
// Also kinda so I can keep accessing it with `Appearance.xxx` instead of `Conf.appearance.xxx`
|
||||
readonly property AppearanceConf.Rounding rounding: Config.appearance.rounding
|
||||
readonly property AppearanceConf.Spacing spacing: Config.appearance.spacing
|
||||
readonly property AppearanceConf.Transparency transparency: Config.appearance.transparency
|
||||
|
||||
@@ -3,6 +3,8 @@ import Quickshell.Io
|
||||
JsonObject {
|
||||
property Anim anim: Anim {
|
||||
}
|
||||
property Deform deform: Deform {
|
||||
}
|
||||
property FontStuff font: FontStuff {
|
||||
}
|
||||
property Padding padding: Padding {
|
||||
@@ -26,9 +28,13 @@ JsonObject {
|
||||
property list<real> emphasized: [0.05, 0, 2 / 15, 0.06, 1 / 6, 0.4, 5 / 24, 0.82, 0.25, 1, 1, 1]
|
||||
property list<real> emphasizedAccel: [0.3, 0, 0.8, 0.15, 1, 1]
|
||||
property list<real> emphasizedDecel: [0.05, 0.7, 0.1, 1, 1, 1]
|
||||
property list<real> expressiveDefaultEffects: [0.34, 0.8, 0.34, 1, 1, 1]
|
||||
property list<real> expressiveDefaultSpatial: [0.38, 1.21, 0.22, 1, 1, 1]
|
||||
property list<real> expressiveEffects: [0.34, 0.8, 0.34, 1, 1, 1]
|
||||
property list<real> expressiveFastEffects: [0.31, 0.94, 0.34, 1, 1, 1]
|
||||
property list<real> expressiveFastSpatial: [0.42, 1.67, 0.21, 0.9, 1, 1]
|
||||
property list<real> expressiveSlowEffects: [0.34, 0.88, 0.34, 1, 1, 1]
|
||||
property list<real> expressiveSlowSpatial: [0.39, 1.29, 0.35, 0.98, 1, 1]
|
||||
property list<real> standard: [0.2, 0, 0, 1, 1, 1]
|
||||
property list<real> standardAccel: [0.3, 0, 1, 1, 1, 1]
|
||||
property list<real> standardDecel: [0, 0, 0, 1, 1, 1]
|
||||
@@ -36,13 +42,18 @@ JsonObject {
|
||||
component AnimDurations: JsonObject {
|
||||
property int expressiveDefaultSpatial: 500 * scale
|
||||
property int expressiveEffects: 200 * scale
|
||||
property int expressiveFastEffects: 150 * scale
|
||||
property int expressiveFastSpatial: 350 * scale
|
||||
property int expressiveSlowEffects: 300 * scale
|
||||
property int extraLarge: 1000 * scale
|
||||
property int large: 600 * scale
|
||||
property int normal: 400 * scale
|
||||
property real scale: 1
|
||||
property int small: 200 * scale
|
||||
}
|
||||
component Deform: JsonObject {
|
||||
property real scale: 1
|
||||
}
|
||||
component FontFamily: JsonObject {
|
||||
property string clock: "Rubik"
|
||||
property string material: "Material Symbols Rounded"
|
||||
@@ -52,7 +63,8 @@ JsonObject {
|
||||
component FontSize: JsonObject {
|
||||
property int extraLarge: 28 * scale
|
||||
property int large: 18 * scale
|
||||
property int larger: 15 * scale
|
||||
property int larger: 16 * scale
|
||||
property int medium: 14 * scale
|
||||
property int normal: 13 * scale
|
||||
property real scale: 1
|
||||
property int small: 11 * scale
|
||||
@@ -65,28 +77,33 @@ JsonObject {
|
||||
}
|
||||
}
|
||||
component Padding: JsonObject {
|
||||
property int large: 15 * scale
|
||||
property int extraLargeIncreased: 32 * scale
|
||||
property int extraSmall: 4 * scale
|
||||
property int large: 16 * scale
|
||||
property int larger: 12 * scale
|
||||
property int normal: 10 * scale
|
||||
property int normal: 8 * scale
|
||||
property real scale: 1
|
||||
property int small: 5 * scale
|
||||
property int smaller: 7 * scale
|
||||
property int smallest: 2 * scale
|
||||
}
|
||||
component Rounding: JsonObject {
|
||||
property int extraSmall: 4 * scale
|
||||
property int full: 1000 * scale
|
||||
property int large: 25 * scale
|
||||
property int normal: 17 * scale
|
||||
property int large: 24 * scale
|
||||
property int medium: 16 * scale
|
||||
property int normal: 18 * scale
|
||||
property real scale: 1
|
||||
property int small: 12 * scale
|
||||
property int smallest: 8 * scale
|
||||
}
|
||||
component Spacing: JsonObject {
|
||||
property int extraSmall: 4 * scale
|
||||
property int large: 20 * scale
|
||||
property int larger: 15 * scale
|
||||
property int larger: 16 * scale
|
||||
property int normal: 12 * scale
|
||||
property real scale: 1
|
||||
property int small: 7 * scale
|
||||
property int small: 8 * scale
|
||||
property int smaller: 10 * scale
|
||||
}
|
||||
component Transparency: JsonObject {
|
||||
|
||||
@@ -4,4 +4,11 @@ import qs.Config
|
||||
JsonObject {
|
||||
property bool enabled: true
|
||||
property int wallFadeDuration: MaterialEasing.standardTime
|
||||
property real alignX: 0.5
|
||||
property real alignY: 0.5
|
||||
property real zoom: 1.0
|
||||
property real sourceClipX: 0
|
||||
property real sourceClipY: 0
|
||||
property real sourceClipW: 0
|
||||
property real sourceClipH: 0
|
||||
}
|
||||
|
||||
@@ -8,10 +8,6 @@ JsonObject {
|
||||
id: "workspaces",
|
||||
enabled: true
|
||||
},
|
||||
{
|
||||
id: "audio",
|
||||
enabled: true
|
||||
},
|
||||
{
|
||||
id: "media",
|
||||
enabled: true
|
||||
@@ -24,10 +20,6 @@ JsonObject {
|
||||
id: "updates",
|
||||
enabled: true
|
||||
},
|
||||
{
|
||||
id: "dash",
|
||||
enabled: true
|
||||
},
|
||||
{
|
||||
id: "spacer",
|
||||
enabled: true
|
||||
@@ -41,12 +33,12 @@ JsonObject {
|
||||
enabled: true
|
||||
},
|
||||
{
|
||||
id: "tray",
|
||||
id: "hyprsunset",
|
||||
enabled: true
|
||||
},
|
||||
{
|
||||
id: "upower",
|
||||
enabled: false
|
||||
id: "tray",
|
||||
enabled: true
|
||||
},
|
||||
{
|
||||
id: "network",
|
||||
@@ -62,9 +54,13 @@ JsonObject {
|
||||
},
|
||||
]
|
||||
property int height: 34
|
||||
property bool hideWhenNotif: false
|
||||
property Popouts popouts: Popouts {
|
||||
}
|
||||
property int rounding: 8
|
||||
property int smoothing: 32
|
||||
property Tray tray: Tray {
|
||||
}
|
||||
|
||||
component Popouts: JsonObject {
|
||||
property bool activeWindow: true
|
||||
@@ -75,4 +71,7 @@ JsonObject {
|
||||
property bool tray: true
|
||||
property bool upower: true
|
||||
}
|
||||
component Tray: JsonObject {
|
||||
property int trayIconSize: 24
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
import Quickshell.Io
|
||||
|
||||
JsonObject {
|
||||
property Presets presets: Presets {
|
||||
}
|
||||
property string schemeType: "vibrant"
|
||||
|
||||
component Presets: JsonObject {
|
||||
property string accent: ""
|
||||
property string name: ""
|
||||
property string variant: ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,6 @@ import Quickshell
|
||||
import Quickshell.Io
|
||||
import ZShell
|
||||
import QtQuick
|
||||
import qs.Helpers
|
||||
import qs.Paths
|
||||
|
||||
Singleton {
|
||||
id: root
|
||||
@@ -23,6 +21,7 @@ Singleton {
|
||||
property alias osd: adapter.osd
|
||||
property alias overview: adapter.overview
|
||||
property bool recentlySaved: false
|
||||
property alias screenshot: adapter.screenshot
|
||||
property alias services: adapter.services
|
||||
property alias sidebar: adapter.sidebar
|
||||
property alias utilities: adapter.utilities
|
||||
@@ -48,6 +47,9 @@ Singleton {
|
||||
padding: {
|
||||
scale: appearance.padding.scale
|
||||
},
|
||||
deform: {
|
||||
scale: appearance.deform.scale
|
||||
},
|
||||
font: {
|
||||
family: {
|
||||
sans: appearance.font.family.sans,
|
||||
@@ -77,16 +79,28 @@ Singleton {
|
||||
function serializeBackground(): var {
|
||||
return {
|
||||
wallFadeDuration: background.wallFadeDuration,
|
||||
enabled: background.enabled
|
||||
enabled: background.enabled,
|
||||
alignX: background.alignX,
|
||||
sourceClipX: background.sourceClipX,
|
||||
sourceClipY: background.sourceClipY,
|
||||
sourceClipW: background.sourceClipW,
|
||||
sourceClipH: background.sourceClipH,
|
||||
alignY: background.alignY,
|
||||
zoom: background.zoom
|
||||
};
|
||||
}
|
||||
|
||||
function serializeBar(): var {
|
||||
return {
|
||||
autoHide: barConfig.autoHide,
|
||||
hideWhenNotif: barConfig.hideWhenNotif,
|
||||
rounding: barConfig.rounding,
|
||||
border: barConfig.border,
|
||||
smoothing: barConfig.smoothing,
|
||||
height: barConfig.height,
|
||||
tray: {
|
||||
trayIconSize: barConfig.tray.trayIconSize
|
||||
},
|
||||
popouts: {
|
||||
tray: barConfig.popouts.tray,
|
||||
audio: barConfig.popouts.audio,
|
||||
@@ -102,7 +116,12 @@ Singleton {
|
||||
|
||||
function serializeColors(): var {
|
||||
return {
|
||||
schemeType: colors.schemeType
|
||||
schemeType: colors.schemeType,
|
||||
presets: {
|
||||
name: colors.presets.name,
|
||||
variant: colors.presets.variant,
|
||||
accent: colors.presets.accent
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -121,7 +140,8 @@ Singleton {
|
||||
background: serializeBackground(),
|
||||
launcher: serializeLauncher(),
|
||||
colors: serializeColors(),
|
||||
dock: serializeDock()
|
||||
dock: serializeDock(),
|
||||
screenshot: serializeScreenshot()
|
||||
};
|
||||
}
|
||||
|
||||
@@ -172,11 +192,16 @@ Singleton {
|
||||
return {
|
||||
logo: general.logo,
|
||||
wallpaperPath: general.wallpaperPath,
|
||||
username: general.username,
|
||||
desktopIcons: general.desktopIcons,
|
||||
dateFormat: general.dateFormat,
|
||||
color: {
|
||||
mode: general.color.mode,
|
||||
smart: general.color.smart,
|
||||
scheduleDark: general.color.scheduleDark,
|
||||
scheduleHyprsunset: general.color.scheduleHyprsunset,
|
||||
scheduleHyprsunsetStart: general.color.scheduleHyprsunsetStart,
|
||||
hyprsunsetTemp: general.color.hyprsunsetTemp,
|
||||
scheduleHyprsunsetEnd: general.color.scheduleHyprsunsetEnd,
|
||||
schemeGeneration: general.color.schemeGeneration,
|
||||
scheduleDarkStart: general.color.scheduleDarkStart,
|
||||
scheduleDarkEnd: general.color.scheduleDarkEnd,
|
||||
@@ -190,6 +215,10 @@ Singleton {
|
||||
},
|
||||
idle: {
|
||||
timeouts: general.idle.timeouts
|
||||
},
|
||||
battery: {
|
||||
popupThresholds: general.battery.popupThresholds,
|
||||
critPerc: general.battery.critPerc
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -198,6 +227,7 @@ Singleton {
|
||||
return {
|
||||
maxAppsShown: launcher.maxAppsShown,
|
||||
maxWallpapers: launcher.maxWallpapers,
|
||||
uwsm: launcher.uwsm,
|
||||
actionPrefix: launcher.actionPrefix,
|
||||
specialPrefix: launcher.specialPrefix,
|
||||
useFuzzy: {
|
||||
@@ -221,6 +251,8 @@ Singleton {
|
||||
return {
|
||||
recolorLogo: lock.recolorLogo,
|
||||
enableFprint: lock.enableFprint,
|
||||
showNotifContent: lock.showNotifContent,
|
||||
showNotifIcon: lock.showNotifIcon,
|
||||
maxFprintTries: lock.maxFprintTries,
|
||||
blurAmount: lock.blurAmount,
|
||||
sizes: {
|
||||
@@ -262,9 +294,24 @@ Singleton {
|
||||
};
|
||||
}
|
||||
|
||||
function serializeScreenshot(): var {
|
||||
return {
|
||||
enable_pp: screenshot.enable_pp,
|
||||
mode: screenshot.mode,
|
||||
radius: screenshot.radius,
|
||||
shadow: screenshot.shadow,
|
||||
rounding: screenshot.rounding,
|
||||
shadow_blur: screenshot.shadow_blur,
|
||||
shadow_color: screenshot.shadow_color,
|
||||
shadow_offset_x: screenshot.shadow_offset_x,
|
||||
shadow_offset_y: screenshot.shadow_offset_y
|
||||
};
|
||||
}
|
||||
|
||||
function serializeServices(): var {
|
||||
return {
|
||||
weatherLocation: services.weatherLocation,
|
||||
updates: services.updates,
|
||||
useFahrenheit: services.useFahrenheit,
|
||||
ddcutilService: services.ddcutilService,
|
||||
useTwelveHourClock: services.useTwelveHourClock,
|
||||
@@ -317,7 +364,6 @@ Singleton {
|
||||
|
||||
ElapsedTimer {
|
||||
id: timer
|
||||
|
||||
}
|
||||
|
||||
Timer {
|
||||
@@ -415,6 +461,8 @@ Singleton {
|
||||
}
|
||||
property Overview overview: Overview {
|
||||
}
|
||||
property Screenshot screenshot: Screenshot {
|
||||
}
|
||||
property Services services: Services {
|
||||
}
|
||||
property SidebarConfig sidebar: SidebarConfig {
|
||||
|
||||
@@ -29,9 +29,10 @@ Singleton {
|
||||
readonly property alias wallLuminance: analyser.luminance
|
||||
|
||||
function alterColor(c: color, a: real, layer: int): color {
|
||||
const luminance = getLuminance(c);
|
||||
const initLuminance = getLuminance(c);
|
||||
const luminance = Math.max(initLuminance, 0.001);
|
||||
|
||||
const offset = (!light || layer == 1 ? 1 : -layer / 2) * (light ? 0.2 : 0.3) * (1 - transparency.base) * (1 + wallLuminance * (light ? (layer == 1 ? 3 : 1) : 2.5));
|
||||
const offset = (!light || layer == 1 ? 1 : -layer / 2) * (light ? 0.2 : 0.3) * (0.2 + 0.3 * (1 - transparency.base)) * (1 + wallLuminance * (light ? (layer == 1 ? 3 : 1) : 2.5));
|
||||
const scale = (luminance + offset) / luminance;
|
||||
const r = Math.max(0, Math.min(1, c.r * scale));
|
||||
const g = Math.max(0, Math.min(1, c.g * scale));
|
||||
@@ -84,6 +85,10 @@ Singleton {
|
||||
Config.save();
|
||||
}
|
||||
|
||||
function swapRG(c: color): color {
|
||||
return Qt.rgba(c.g, c.r, c.b, c.a);
|
||||
}
|
||||
|
||||
FileView {
|
||||
path: "/etc/zshell-greeter/scheme.json"
|
||||
watchChanges: true
|
||||
@@ -95,69 +100,9 @@ Singleton {
|
||||
ImageAnalyser {
|
||||
id: analyser
|
||||
|
||||
source: WallpaperPath.currentWallpaperPath
|
||||
source: WallpaperPath.lockscreenBg
|
||||
}
|
||||
|
||||
component M3MaccchiatoPalette: QtObject {
|
||||
property color m3background: "#131317"
|
||||
property color m3error: "#ffb4ab"
|
||||
property color m3errorContainer: "#93000a"
|
||||
property color m3inverseOnSurface: "#303034"
|
||||
property color m3inversePrimary: "#525b92"
|
||||
property color m3inverseSurface: "#e4e1e7"
|
||||
property color m3neutral_paletteKeyColor: "#77767b"
|
||||
property color m3neutral_variant_paletteKeyColor: "#767680"
|
||||
property color m3onBackground: "#e4e1e7"
|
||||
property color m3onError: "#690005"
|
||||
property color m3onErrorContainer: "#ffdad6"
|
||||
property color m3onPrimary: "#232c60"
|
||||
property color m3onPrimaryContainer: "#ffffff"
|
||||
property color m3onPrimaryFixed: "#0b154b"
|
||||
property color m3onPrimaryFixedVariant: "#3a4378"
|
||||
property color m3onSecondary: "#2c2f44"
|
||||
property color m3onSecondaryContainer: "#b1b3ce"
|
||||
property color m3onSecondaryFixed: "#171a2e"
|
||||
property color m3onSecondaryFixedVariant: "#42455c"
|
||||
property color m3onSuccess: "#213528"
|
||||
property color m3onSuccessContainer: "#D1E9D6"
|
||||
property color m3onSurface: "#e4e1e7"
|
||||
property color m3onSurfaceVariant: "#c6c5d1"
|
||||
property color m3onTertiary: "#4c1f48"
|
||||
property color m3onTertiaryContainer: "#000000"
|
||||
property color m3onTertiaryFixed: "#340831"
|
||||
property color m3onTertiaryFixedVariant: "#66365f"
|
||||
property color m3outline: "#90909a"
|
||||
property color m3outlineVariant: "#46464f"
|
||||
property color m3primary: "#bac3ff"
|
||||
property color m3primaryContainer: "#6a73ac"
|
||||
property color m3primaryFixed: "#dee0ff"
|
||||
property color m3primaryFixedDim: "#bac3ff"
|
||||
property color m3primary_paletteKeyColor: "#6a73ac"
|
||||
property color m3scrim: "#000000"
|
||||
property color m3secondary: "#c3c5e0"
|
||||
property color m3secondaryContainer: "#42455c"
|
||||
property color m3secondaryFixed: "#dfe1fd"
|
||||
property color m3secondaryFixedDim: "#c3c5e0"
|
||||
property color m3secondary_paletteKeyColor: "#72758e"
|
||||
property color m3shadow: "#000000"
|
||||
property color m3success: "#B5CCBA"
|
||||
property color m3successContainer: "#374B3E"
|
||||
property color m3surface: "#131317"
|
||||
property color m3surfaceBright: "#39393d"
|
||||
property color m3surfaceContainer: "#1f1f23"
|
||||
property color m3surfaceContainerHigh: "#2a2a2e"
|
||||
property color m3surfaceContainerHighest: "#353438"
|
||||
property color m3surfaceContainerLow: "#1b1b1f"
|
||||
property color m3surfaceContainerLowest: "#0e0e12"
|
||||
property color m3surfaceDim: "#131317"
|
||||
property color m3surfaceTint: "#bac3ff"
|
||||
property color m3surfaceVariant: "#46464f"
|
||||
property color m3tertiary: "#f1b3e5"
|
||||
property color m3tertiaryContainer: "#b77ead"
|
||||
property color m3tertiaryFixed: "#ffd7f4"
|
||||
property color m3tertiaryFixedDim: "#f1b3e5"
|
||||
property color m3tertiary_paletteKeyColor: "#9b6592"
|
||||
}
|
||||
component M3Palette: QtObject {
|
||||
property color m3background: "#191114"
|
||||
property color m3error: "#ffb4ab"
|
||||
@@ -279,8 +224,11 @@ Singleton {
|
||||
readonly property color m3tertiary_paletteKeyColor: root.layer(root.palette.m3tertiary_paletteKeyColor)
|
||||
}
|
||||
component Transparency: QtObject {
|
||||
readonly property real base: Appearance.transparency.base - (root.light ? 0.1 : 0)
|
||||
readonly property real base: Math.max(0, Math.min(1, Appearance.transparency.base - (root.light ? 0.1 : 0)))
|
||||
readonly property bool enabled: Appearance.transparency.enabled
|
||||
readonly property real layers: Appearance.transparency.layers
|
||||
|
||||
onBaseChanged: debounceTimer.restart()
|
||||
onEnabledChanged: debounceTimer.restart()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,13 +4,15 @@ import Quickshell
|
||||
JsonObject {
|
||||
property Apps apps: Apps {
|
||||
}
|
||||
property Battery battery: Battery {
|
||||
}
|
||||
property Color color: Color {
|
||||
}
|
||||
property string dateFormat: "ddd d MMM - hh:mm:ss"
|
||||
property bool desktopIcons: false
|
||||
property Idle idle: Idle {
|
||||
}
|
||||
property string logo: ""
|
||||
property string username: ""
|
||||
property string wallpaperPath: Quickshell.env("HOME") + "/Pictures/Wallpapers"
|
||||
|
||||
component Apps: JsonObject {
|
||||
@@ -19,11 +21,27 @@ JsonObject {
|
||||
property list<string> playback: ["mpv"]
|
||||
property list<string> terminal: ["kitty"]
|
||||
}
|
||||
component Battery: JsonObject {
|
||||
property int critPerc: 5
|
||||
property list<var> popupThresholds: [
|
||||
{
|
||||
perc: 20,
|
||||
name: qsTr("Low battery"),
|
||||
message: qsTr("Battery is low"),
|
||||
icon: "battery_android_frame_2"
|
||||
},
|
||||
]
|
||||
}
|
||||
component Color: JsonObject {
|
||||
property int hyprsunsetTemp: 5000
|
||||
property string mode: "dark"
|
||||
property bool neovimColors: false
|
||||
property bool scheduleDark: false
|
||||
property int scheduleDarkEnd: 0
|
||||
property int scheduleDarkStart: 0
|
||||
property bool scheduleHyprsunset: false
|
||||
property int scheduleHyprsunsetEnd: 0
|
||||
property int scheduleHyprsunsetStart: 0
|
||||
property bool schemeGeneration: true
|
||||
property bool smart: false
|
||||
}
|
||||
|
||||
@@ -91,6 +91,7 @@ JsonObject {
|
||||
property string specialPrefix: "@"
|
||||
property UseFuzzy useFuzzy: UseFuzzy {
|
||||
}
|
||||
property bool uwsm: true
|
||||
|
||||
component Sizes: JsonObject {
|
||||
property int itemHeight: 50
|
||||
|
||||
@@ -5,6 +5,8 @@ JsonObject {
|
||||
property bool enableFprint: true
|
||||
property int maxFprintTries: 3
|
||||
property bool recolorLogo: false
|
||||
property bool showNotifContent: false
|
||||
property bool showNotifIcon: true
|
||||
property Sizes sizes: Sizes {
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import Quickshell.Io
|
||||
|
||||
JsonObject {
|
||||
property bool enable_pp: true
|
||||
property string mode: "manual"
|
||||
property real radius: 12.0
|
||||
property bool rounding: false
|
||||
property bool shadow: true
|
||||
property real shadow_blur: 22.0
|
||||
property list<int> shadow_color: [0, 0, 0, 160]
|
||||
property real shadow_offset_x: 5.0
|
||||
property real shadow_offset_y: 5.0
|
||||
}
|
||||
@@ -14,6 +14,7 @@ JsonObject {
|
||||
"to": "YT Music"
|
||||
}
|
||||
]
|
||||
property bool updates: true
|
||||
property bool useFahrenheit: false
|
||||
property bool useTwelveHourClock: Qt.locale().timeFormat(Locale.ShortFormat).toLowerCase().includes("a")
|
||||
property int visualizerBars: 30
|
||||
|
||||
Reference in New Issue
Block a user