merge main #11

Merged
Zacharias-Brohn merged 10 commits from main into settingsWindow 2026-02-23 18:16:25 +01:00
100 changed files with 4595 additions and 1166 deletions
Showing only changes of commit 33423f68c3 - Show all commits
+5
View File
@@ -5,3 +5,8 @@
build/
compile_commands.json
testpython
pkg/
*.tar.*
uv.lock
.qtcreator/
dist/
-6
View File
@@ -1,6 +0,0 @@
{
"$schema": "https://download.qt.io/official_releases/qtcreator/latest/installer_source/jsonschemas/project.json",
"files.exclude": [
".qtcreator/project.json.user"
]
}
-204
View File
@@ -1,204 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 18.0.2, 2026-02-05T15:11:49. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{ec8acdf5-a16b-4fc5-819b-8b986eb013bb}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoDetect">true</value>
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<value type="bool" key="AutoTest.ApplyFilter">false</value>
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">10</value>
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
<value type="int" key="RcSync">0</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="bool" key="HasPerBcDcs">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{6f820de3-bb35-4a43-a7c9-dfd1617a8619}</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/zach/GitProjects/z-bar-qt/build</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Default</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">WorkspaceProject.BuildConfiguration</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">1</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>
+26 -15
View File
@@ -5,6 +5,7 @@ import QtQuick.Effects
import Quickshell
import Quickshell.Wayland
import Quickshell.Hyprland
import qs.Daemons
import qs.Components
import qs.Modules
import qs.Modules.Bar
@@ -26,7 +27,17 @@ Variants {
WlrLayershell.namespace: "ZShell-Bar"
WlrLayershell.exclusionMode: ExclusionMode.Ignore
WlrLayershell.keyboardFocus: visibilities.launcher ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
WlrLayershell.keyboardFocus: visibilities.launcher || visibilities.sidebar || visibilities.dashboard ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
contentItem.focus: true
contentItem.Keys.onEscapePressed: {
if ( Config.barConfig.autoHide )
visibilities.bar = false;
visibilities.sidebar = false;
visibilities.dashboard = false;
}
PanelWindow {
id: exclusionZone
WlrLayershell.namespace: "ZShell-Bar-Exclusion"
@@ -55,13 +66,12 @@ Variants {
y: Config.barConfig.autoHide && !visibilities.bar ? 4 : 34
property list<Region> nullRegions: []
property bool hcurrent: ( panels.popouts.hasCurrent && panels.popouts.currentName.startsWith("traymenu") ) || visibilities.sidebar || visibilities.dashboard
width: hcurrent ? 0 : bar.width
height: hcurrent ? 0 : bar.screen.height - backgroundRect.implicitHeight
width: bar.width
height: bar.screen.height - backgroundRect.implicitHeight
intersection: Intersection.Xor
regions: hcurrent ? nullRegions : popoutRegions.instances
regions: popoutRegions.instances
}
Variants {
@@ -82,21 +92,14 @@ Variants {
HyprlandFocusGrab {
id: focusGrab
active: visibilities.launcher
active: visibilities.launcher || visibilities.sidebar || visibilities.dashboard || ( panels.popouts.hasCurrent && panels.popouts.currentName.startsWith( "traymenu" ))
windows: [bar]
onCleared: {
visibilities.launcher = false;
visibilities.sidebar = false;
visibilities.dashboard = false;
visibilities.osd = false;
}
}
CustomShortcut {
name: "toggle-nc"
onPressed: {
visibilities.sidebar = !visibilities.sidebar
panels.popouts.hasCurrent = false;
}
}
@@ -108,10 +111,18 @@ Variants {
property bool bar
property bool osd
property bool launcher
property bool notif: NotifServer.popups.length > 0
Component.onCompleted: Visibilities.load(scope.modelData, this)
}
Binding {
target: visibilities
property: "bar"
value: visibilities.sidebar || visibilities.dashboard || visibilities.osd || visibilities.notif
when: Config.barConfig.autoHide
}
Item {
anchors.fill: parent
opacity: Appearance.transparency.enabled ? DynamicColors.transparency.base : 1
@@ -150,7 +161,7 @@ Variants {
visibilities: visibilities
}
Rectangle {
CustomRect {
id: backgroundRect
property Wrapper popouts: panels.popouts
anchors.top: parent.top
+2 -1
View File
@@ -7,10 +7,11 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(ENABLE_MODULES "plugin" CACHE STRING "Modules to build/install")
set(ENABLE_MODULES "plugin;shell" CACHE STRING "Modules to build/install")
set(INSTALL_LIBDIR "usr/lib/ZShell" CACHE STRING "Library install dir")
set(INSTALL_QMLDIR "usr/lib/qt6/qml" CACHE STRING "QML install dir")
set(INSTALL_QSCONFDIR "etc/xdg/quickshell/zshell" CACHE STRING "Quickshell config install dir")
add_compile_options(
-Wall -Wextra -Wpedantic -Wshadow -Wconversion
+11 -4
View File
@@ -7,6 +7,8 @@ Slider {
id: root
required property real peak
property color nonPeakColor: DynamicColors.tPalette.m3primary
property color peakColor: DynamicColors.palette.m3primary
background: Item {
CustomRect {
@@ -16,9 +18,9 @@ Slider {
anchors.topMargin: root.implicitHeight / 3
anchors.bottomMargin: root.implicitHeight / 3
implicitWidth: root.handle.x - root.implicitHeight / 6
implicitWidth: root.handle.x - root.implicitHeight
color: DynamicColors.palette.m3primaryContainer
color: root.nonPeakColor
radius: 1000
topRightRadius: root.implicitHeight / 15
bottomRightRadius: root.implicitHeight / 15
@@ -33,7 +35,7 @@ Slider {
topRightRadius: root.implicitHeight / 15
bottomRightRadius: root.implicitHeight / 15
color: DynamicColors.palette.m3primary
color: root.peakColor
Behavior on implicitWidth {
Anim { duration: 50 }
@@ -48,7 +50,12 @@ Slider {
anchors.topMargin: root.implicitHeight / 3
anchors.bottomMargin: root.implicitHeight / 3
implicitWidth: parent.width - root.handle.x - root.handle.implicitWidth - root.implicitHeight / 6
implicitWidth: root.implicitWidth - root.handle.x - root.handle.implicitWidth - root.implicitHeight
Component.onCompleted: {
console.log(root.handle.x, implicitWidth)
}
color: DynamicColors.tPalette.m3surfaceContainer
radius: 1000
+6 -10
View File
@@ -11,30 +11,26 @@ Slider {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.topMargin: root.implicitHeight / 3
anchors.bottomMargin: root.implicitHeight / 3
implicitWidth: root.handle.x - root.implicitHeight / 6
implicitWidth: root.handle.x - root.implicitHeight / 2
color: DynamicColors.palette.m3primary
radius: 1000
topRightRadius: root.implicitHeight / 15
bottomRightRadius: root.implicitHeight / 15
topRightRadius: root.implicitHeight / 6
bottomRightRadius: root.implicitHeight / 6
}
CustomRect {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.topMargin: root.implicitHeight / 3
anchors.bottomMargin: root.implicitHeight / 3
implicitWidth: parent.width - root.handle.x - root.handle.implicitWidth - root.implicitHeight / 6
implicitWidth: parent.width - root.handle.x - root.handle.implicitWidth - root.implicitHeight / 2
color: DynamicColors.tPalette.m3surfaceContainer
radius: 1000
topLeftRadius: root.implicitHeight / 15
bottomLeftRadius: root.implicitHeight / 15
topLeftRadius: root.implicitHeight / 6
bottomLeftRadius: root.implicitHeight / 6
}
}
+11 -1
View File
@@ -5,6 +5,7 @@ import Quickshell.Io
import ZShell
import QtQuick
import qs.Modules as Modules
import qs.Helpers
import qs.Paths
Singleton {
@@ -122,7 +123,14 @@ Singleton {
return {
logo: general.logo,
wallpaperPath: general.wallpaperPath,
wallust: general.wallust,
color: {
wallust: general.color.wallust,
mode: general.color.mode,
schemeGeneration: general.color.schemeGeneration,
scheduleDarkStart: general.color.scheduleDarkStart,
scheduleDarkEnd: general.color.scheduleDarkEnd,
neovimColors: general.color.neovimColors
},
apps: {
terminal: general.apps.terminal,
audio: general.apps.audio,
@@ -231,6 +239,7 @@ Singleton {
hideDelay: osd.hideDelay,
enableBrightness: osd.enableBrightness,
enableMicrophone: osd.enableMicrophone,
allMonBrightness: osd.allMonBrightness,
sizes: {
sliderWidth: osd.sizes.sliderWidth,
sliderHeight: osd.sizes.sliderHeight
@@ -328,6 +337,7 @@ Singleton {
}
onLoaded: {
ModeScheduler.checkStartup();
try {
JSON.parse(text());
const elapsed = timer.elapsedMs();
+1 -1
View File
@@ -61,7 +61,7 @@ Singleton {
if (!isPreview) {
root.scheme = scheme.name;
flavour = scheme.flavour;
flavour = scheme.flavor;
currentLight = scheme.mode === "light";
} else {
previewLight = scheme.mode === "light";
+12 -3
View File
@@ -4,15 +4,24 @@ import Quickshell
JsonObject {
property string logo: ""
property string wallpaperPath: Quickshell.env("HOME") + "/Pictures/Wallpapers"
property bool wallust: false
property Color color: Color {}
property Apps apps: Apps {}
property Idle idle: Idle {}
component Color: JsonObject {
property bool wallust: false
property bool schemeGeneration: true
property string mode: "dark"
property int scheduleDarkStart: 0
property int scheduleDarkEnd: 0
property bool neovimColors: false
}
component Apps: JsonObject {
property list<string> terminal: ["foot"]
property list<string> terminal: ["kitty"]
property list<string> audio: ["pavucontrol"]
property list<string> playback: ["mpv"]
property list<string> explorer: ["thunar"]
property list<string> explorer: ["dolphin"]
}
component Idle: JsonObject {
+1
View File
@@ -5,6 +5,7 @@ JsonObject {
property int hideDelay: 3000
property bool enableBrightness: true
property bool enableMicrophone: true
property bool allMonBrightness: false
property Sizes sizes: Sizes {}
component Sizes: JsonObject {
+48 -120
View File
@@ -1,6 +1,8 @@
pragma Singleton
import qs.Config
import ZShell.Services
import ZShell
import Quickshell
import Quickshell.Services.Pipewire
import QtQuick
@@ -17,15 +19,20 @@ Singleton {
acc.sinks.push(node);
else if (node.audio)
acc.sources.push(node);
} else if (node.isStream && node.audio) {
// Application streams (output streams)
acc.streams.push(node);
}
return acc;
}, {
sources: [],
sinks: []
sinks: [],
streams: []
})
readonly property list<PwNode> sinks: nodes.sinks
readonly property list<PwNode> sources: nodes.sources
readonly property list<PwNode> streams: nodes.streams
readonly property PwNode sink: Pipewire.defaultAudioSink
readonly property PwNode source: Pipewire.defaultAudioSource
@@ -39,31 +46,31 @@ Singleton {
function setVolume(newVolume: real): void {
if (sink?.ready && sink?.audio) {
sink.audio.muted = false;
sink.audio.volume = Math.max(0, Math.min(100, newVolume));
sink.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume));
}
}
function incrementVolume(amount: real): void {
setVolume(volume + (amount || 5));
setVolume(volume + (amount || Config.services.audioIncrement));
}
function decrementVolume(amount: real): void {
setVolume(volume - (amount || 5));
setVolume(volume - (amount || Config.services.audioIncrement));
}
function setSourceVolume(newVolume: real): void {
if (source?.ready && source?.audio) {
source.audio.muted = false;
source.audio.volume = Math.max(0, Math.min(100, newVolume));
source.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume));
}
}
function incrementSourceVolume(amount: real): void {
setSourceVolume(sourceVolume + (amount || 5));
setSourceVolume(sourceVolume + (amount || Config.services.audioIncrement));
}
function decrementSourceVolume(amount: real): void {
setSourceVolume(sourceVolume - (amount || 5));
setSourceVolume(sourceVolume - (amount || Config.services.audioIncrement));
}
function setAudioSink(newSink: PwNode): void {
@@ -74,12 +81,33 @@ Singleton {
Pipewire.preferredDefaultAudioSource = newSource;
}
function setAppAudioVolume(appStream: PwNode, newVolume: real): void {
if ( appStream?.ready && appStream?.audio ) {
appStream.audio.muted = false;
appStream.audio.volume = Math.max(0, Math.min(100, newVolume));
}
}
function setStreamVolume(stream: PwNode, newVolume: real): void {
if (stream?.ready && stream?.audio) {
stream.audio.muted = false;
stream.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume));
}
}
function setStreamMuted(stream: PwNode, muted: bool): void {
if (stream?.ready && stream?.audio) {
stream.audio.muted = muted;
}
}
function getStreamVolume(stream: PwNode): real {
return stream?.audio?.volume ?? 0;
}
function getStreamMuted(stream: PwNode): bool {
return !!stream?.audio?.muted;
}
function getStreamName(stream: PwNode): string {
if (!stream)
return qsTr("Unknown");
// Try application name first, then description, then name
return stream.applicationName || stream.description || stream.name || qsTr("Unknown Application");
}
onSinkChanged: {
if (!sink?.ready)
@@ -87,6 +115,9 @@ Singleton {
const newSinkName = sink.description || sink.name || qsTr("Unknown Device");
if (previousSinkName && previousSinkName !== newSinkName && Config.utilities.toasts.audioOutputChanged)
Toaster.toast(qsTr("Audio output changed"), qsTr("Now using: %1").arg(newSinkName), "volume_up");
previousSinkName = newSinkName;
}
@@ -96,6 +127,9 @@ Singleton {
const newSourceName = source.description || source.name || qsTr("Unknown Device");
if (previousSourceName && previousSourceName !== newSourceName && Config.utilities.toasts.audioInputChanged)
Toaster.toast(qsTr("Audio input changed"), qsTr("Now using: %1").arg(newSourceName), "mic");
previousSourceName = newSourceName;
}
@@ -105,112 +139,6 @@ Singleton {
}
PwObjectTracker {
objects: [...root.sinks, ...root.sources]
objects: [...root.sinks, ...root.sources, ...root.streams]
}
PwNodeLinkTracker {
id: sinkLinkTracker
node: root.sink
}
PwObjectTracker {
objects: root.appStreams
}
readonly property var appStreams: {
var defaultSink = root.sink;
var defaultSinkId = defaultSink.id;
var connectedStreamIds = {};
var connectedStreams = [];
if ( !sinkLinkTracker.linkGroups ) {
return [];
}
var linkGroupsCount = 0;
if (sinkLinkTracker.linkGroups.length !== undefined) {
linkGroupsCount = sinkLinkTracker.linkGroups.length;
} else if (sinkLinkTracker.linkGroups.count !== undefined) {
linkGroupsCount = sinkLinkTracker.linkGroups.count;
} else {
return [];
}
if ( linkGroupsCount === 0 ) {
return [];
}
var intermediateNodeIds = {};
var nodesToCheck = [];
for (var i = 0; i < linkGroupsCount; i++) {
var linkGroup;
if (sinkLinkTracker.linkGroups.get) {
linkGroup = sinkLinkTracker.linkGroups.get(i);
} else {
linkGroup = sinkLinkTracker.linkGroups[i];
}
if (!linkGroup || !linkGroup.source) {
continue;
}
var sourceNode = linkGroup.source;
if (sourceNode.isStream && sourceNode.audio) {
if (!connectedStreamIds[sourceNode.id]) {
connectedStreamIds[sourceNode.id] = true;
connectedStreams.push(sourceNode);
}
} else {
intermediateNodeIds[sourceNode.id] = true;
nodesToCheck.push(sourceNode);
}
}
if (nodesToCheck.length > 0 || connectedStreams.length === 0) {
try {
var allNodes = [];
if (Pipewire.nodes) {
if (Pipewire.nodes.count !== undefined) {
var nodeCount = Pipewire.nodes.count;
for (var n = 0; n < nodeCount; n++) {
var node;
if (Pipewire.nodes.get) {
node = Pipewire.nodes.get(n);
} else {
node = Pipewire.nodes[n];
}
if (node)
allNodes.push(node);
}
} else if (Pipewire.nodes.values) {
allNodes = Pipewire.nodes.values;
}
}
for (var j = 0; j < allNodes.length; j++) {
var node = allNodes[j];
if (!node || !node.isStream || !node.audio) {
continue;
}
var streamId = node.id;
if (connectedStreamIds[streamId]) {
continue;
}
if (Object.keys(intermediateNodeIds).length > 0) {
connectedStreamIds[streamId] = true;
connectedStreams.push(node);
} else if (connectedStreams.length === 0) {
connectedStreamIds[streamId] = true;
connectedStreams.push(node);
}
}
} catch (e)
{}
}
return connectedStreams;
}
}
+1 -1
View File
@@ -177,7 +177,7 @@ Singleton {
property list<var> actions
readonly property Timer timer: Timer {
property int totalTime: 5000
property int totalTime: Config.notifs.defaultExpireTimeout
property int remainingTime: totalTime
property bool paused: false
+22 -10
View File
@@ -53,15 +53,15 @@ CustomMouseArea {
anchors.fill: parent
hoverEnabled: true
onPressed: event => {
if ( root.popouts.hasCurrent && !inTopPanel( root.popouts, event.x, event.y )) {
root.popouts.hasCurrent = false;
} else if (root.visibilities.sidebar && !inRightPanel( panels.sidebar, event.x, event.y )) {
root.visibilities.sidebar = false;
} else if (root.visibilities.dashboard && !inTopPanel( panels.dashboard, event.x, event.y )) {
root.visibilities.dashboard = false;
}
}
// onPressed: event => {
// if ( root.popouts.hasCurrent && !inTopPanel( root.popouts, event.x, event.y )) {
// root.popouts.hasCurrent = false;
// } else if (root.visibilities.sidebar && !inRightPanel( panels.sidebar, event.x, event.y )) {
// root.visibilities.sidebar = false;
// } else if (root.visibilities.dashboard && !inTopPanel( panels.dashboard, event.x, event.y )) {
// root.visibilities.dashboard = false;
// }
// }
onContainsMouseChanged: {
if (!containsMouse) {
@@ -71,7 +71,7 @@ CustomMouseArea {
root.panels.osd.hovered = false;
}
if (!popouts.currentName.startsWith("traymenu") || (popouts.current?.depth ?? 0) <= 1) {
if (!popouts.currentName.startsWith("traymenu")) {
popouts.hasCurrent = false;
}
@@ -223,6 +223,13 @@ CustomMouseArea {
}
}
function onSidebarChanged() {
if ( root.visibilities.sidebar ) {
root.visibilities.dashboard = false;
root.popouts.hasCurrent = false;
}
}
function onDashboardChanged() {
if (root.visibilities.dashboard) {
// Dashboard became visible, immediately check if this should be shortcut mode
@@ -230,9 +237,14 @@ CustomMouseArea {
if (!inDashboardArea) {
root.dashboardShortcutActive = true;
}
root.visibilities.sidebar = false;
root.popouts.hasCurrent = false;
} else {
// Dashboard hidden, clear shortcut flag
root.dashboardShortcutActive = false;
// root.visibilities.bar = false;
}
}
+4 -1
View File
@@ -29,7 +29,10 @@ Item {
anchors.fill: parent
// anchors.margins: 8
anchors.topMargin: bar.implicitHeight
anchors.topMargin: Config.barConfig.autoHide && !visibilities.bar ? 0 : bar.implicitHeight
Behavior on anchors.topMargin {
Modules.Anim {}
}
Osd.Wrapper {
id: osd
+16
View File
@@ -48,6 +48,22 @@ Scope {
}
}
IpcHandler {
target: "picker"
function open(): void {
root.freeze = false;
root.closing = false;
root.activeAsync = true;
}
function openFreeze(): void {
root.freeze = true;
root.closing = false;
root.activeAsync = true;
}
}
CustomShortcut {
name: "screenshot"
onPressed: {
+1 -1
View File
@@ -201,7 +201,7 @@ Singleton {
if (isAppleDisplay)
Quickshell.execDetached(["asdbctl", "set", rounded]);
else if (isDdc)
Quickshell.execDetached(["ddcutil", "-b", busNum, "setvcp", "10", rounded]);
Quickshell.execDetached(["ddcutil", "--disable-dynamic-sleep", "--sleep-multiplier", ".1", "--skip-ddc-checks", "-b", busNum, "setvcp", "10", rounded]);
else
Quickshell.execDetached(["brightnessctl", "s", `${rounded}%`]);
+86
View File
@@ -0,0 +1,86 @@
pragma Singleton
import Quickshell
import QtQuick
import qs.Modules
import qs.Helpers
import qs.Config
import qs.Paths
Singleton {
id: root
readonly property int darkStart: Config.general.color.scheduleDarkStart
readonly property int darkEnd: Config.general.color.scheduleDarkEnd
Timer {
id: darkModeTimer
interval: 5000
running: true
repeat: true
onTriggered: {
if ( darkStart === darkEnd )
return;
var now = new Date();
if ( now.getHours() >= darkStart || now.getHours() < darkEnd ) {
if ( DynamicColors.light )
applyDarkMode();
} else {
if ( !DynamicColors.light )
applyLightMode();
}
}
}
function applyDarkMode() {
if ( Config.general.color.schemeGeneration ) {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--image-path", `${WallpaperPath.currentWallpaperPath}`, "--thumbnail-path", `${Paths.cache}/imagecache/thumbnail.jpg`, "--output", `${Paths.state}/scheme.json`, "--scheme", `${Config.colors.schemeType}`, "--mode", "dark"]);
} else {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--preset", `${DynamicColors.scheme}:${DynamicColors.flavour}`, "--output", `${Paths.state}/scheme.json`, "--mode", "dark"]);
}
Config.general.color.mode = "dark";
Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", "'prefer-dark'"])
Quickshell.execDetached(["sh", "-c", `sed -i 's/color_scheme_path=\\(.*\\)Light.colors/color_scheme_path=\\1Dark.colors/' ${Paths.home}/.config/qt6ct/qt6ct.conf`])
Quickshell.execDetached(["sed", "-i", "'s/\\(vim.cmd.colorscheme \\).*/\\1\"tokyodark\"/'", "~/.config/nvim/lua/config/load-colorscheme.lua"])
if( Config.general.color.wallust )
Wallust.generateColors(WallpaperPath.currentWallpaperPath);
}
function applyLightMode() {
if ( Config.general.color.neovimColors ) {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--image-path", `${WallpaperPath.currentWallpaperPath}`, "--thumbnail-path", `${Paths.cache}/imagecache/thumbnail.jpg`, "--output", `${Paths.state}/scheme.json`, "--scheme", `${Config.colors.schemeType}`, "--mode", "light"]);
} else {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--preset", `${DynamicColors.scheme}:${DynamicColors.flavour}`, "--output", `${Paths.state}/scheme.json`, "--mode", "light"]);
}
Config.general.color.mode = "light";
Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", "'prefer-light'"])
Quickshell.execDetached(["sh", "-c", `sed -i 's/color_scheme_path=\\(.*\\)Dark.colors/color_scheme_path=\\1Light.colors/' ${Paths.home}/.config/qt6ct/qt6ct.conf`])
if ( Config.general.color.neovimColors )
Quickshell.execDetached(["sed", "-i", "'s/\\(vim.cmd.colorscheme \\).*/\\1\"onelight\"/'", "~/.config/nvim/lua/config/load-colorscheme.lua"])
if( Config.general.color.wallust )
Wallust.generateColors(WallpaperPath.currentWallpaperPath);
}
function checkStartup() {
if ( darkStart === darkEnd )
return;
var now = new Date();
if ( now.getHours() >= darkStart || now.getHours() < darkEnd ) {
applyDarkMode();
} else {
applyLightMode();
}
}
}
+1 -1
View File
@@ -246,7 +246,7 @@ MouseArea {
color: "transparent"
radius: root.realRounding > 0 ? root.realRounding + root.realBorderWidth : 0
border.width: root.realBorderWidth
border.color: Config.accentColor.accents.primary
border.color: DynamicColors.palette.m3primary
x: selectionRect.x - root.realBorderWidth
y: selectionRect.y - root.realBorderWidth
+15 -4
View File
@@ -19,19 +19,22 @@ Searcher {
function setWallpaper(path: string): void {
actualCurrent = path;
WallpaperPath.currentWallpaperPath = path;
Wallust.generateColors(WallpaperPath.currentWallpaperPath);
Quickshell.execDetached(["sh", "-c", `python3 ${Quickshell.shellPath("scripts/LockScreenBg.py")} --input_image=${root.actualCurrent} --output_path=${Paths.state}/lockscreen_bg.png --blur_amount=${Config.lock.blurAmount}`]);
if ( Config.general.color.wallust )
Wallust.generateColors(WallpaperPath.currentWallpaperPath);
Quickshell.execDetached(["sh", "-c", `zshell-cli wallpaper lockscreen --input-image=${root.actualCurrent} --output-path=${Paths.state}/lockscreen_bg.png --blur-amount=${Config.lock.blurAmount}`]);
}
function preview(path: string): void {
previewPath = path;
Quickshell.execDetached(["sh", "-c", `python3 ${Quickshell.shellPath("scripts/SchemeColorGen.py")} --path=${previewPath} --thumbnail=${Paths.cache}/imagecache/thumbnail.jpg --output=${Paths.state}/scheme.json --scheme=${Config.colors.schemeType}`]);
if ( Config.general.color.schemeGeneration )
Quickshell.execDetached(["sh", "-c", `zshell-cli scheme generate --image-path ${previewPath} --thumbnail-path ${Paths.cache}/imagecache/thumbnail.jpg --output ${Paths.state}/scheme.json --scheme ${Config.colors.schemeType} --mode ${Config.general.color.mode}`]);
showPreview = true;
}
function stopPreview(): void {
showPreview = false;
Quickshell.execDetached(["sh", "-c", `python3 ${Quickshell.shellPath("scripts/SchemeColorGen.py")} --path=${root.actualCurrent} --thumbnail=${Paths.cache}/imagecache/thumbnail.jpg --output=${Paths.state}/scheme.json --scheme=${Config.colors.schemeType}`]);
if ( Config.general.color.schemeGeneration )
Quickshell.execDetached(["sh", "-c", `zshell-cli scheme generate --image-path ${root.actualCurrent} --thumbnail-path ${Paths.cache}/imagecache/thumbnail.jpg --output ${Paths.state}/scheme.json --scheme ${Config.colors.schemeType} --mode ${Config.general.color.mode}`]);
}
list: wallpapers.entries
@@ -41,6 +44,14 @@ Searcher {
forward: false
})
IpcHandler {
target: "wallpaper"
function set(path: string): void {
root.setWallpaper(path);
}
}
FileSystemModel {
id: wallpapers
+674
View File
@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
+151 -217
View File
@@ -14,8 +14,11 @@ import qs.Helpers
Item {
id: root
implicitWidth: layout.implicitWidth + 10 * 2
implicitHeight: layout.implicitHeight + 10 * 2
implicitWidth: layout.implicitWidth + 5 * 2
implicitHeight: layout.implicitHeight + 5 * 2
readonly property int topMargin: 0
readonly property int rounding: 6
required property var wrapper
@@ -38,7 +41,7 @@ Item {
Layout.fillWidth: true
Layout.preferredHeight: tabBar.tabHeight
color: stack.currentIndex === 0 ? DynamicColors.tPalette.m3primaryContainer : "transparent"
color: stack.currentIndex === 0 ? DynamicColors.palette.m3primary : DynamicColors.tPalette.m3surfaceContainer
StateLayer {
@@ -49,6 +52,7 @@ Item {
CustomText {
text: qsTr("Volumes")
anchors.centerIn: parent
color: stack.currentIndex === 0 ? DynamicColors.palette.m3onPrimary : DynamicColors.palette.m3primary
}
}
}
@@ -58,7 +62,7 @@ Item {
Layout.fillWidth: true
Layout.preferredHeight: tabBar.tabHeight
color: stack.currentIndex === 1 ? DynamicColors.tPalette.m3primaryContainer : "transparent"
color: stack.currentIndex === 1 ? DynamicColors.palette.m3primary : DynamicColors.tPalette.m3surfaceContainer
StateLayer {
@@ -69,6 +73,7 @@ Item {
CustomText {
text: qsTr("Devices")
anchors.centerIn: parent
color: stack.currentIndex === 1 ? DynamicColors.palette.m3onPrimary : DynamicColors.palette.m3primary
}
}
}
@@ -126,113 +131,143 @@ Item {
component VolumesTab: ColumnLayout {
spacing: 12
RowLayout {
Layout.topMargin: 10
spacing: 15
Rectangle {
Layout.preferredWidth: 40
Layout.preferredHeight: 40
Layout.alignment: Qt.AlignVCenter
color: DynamicColors.tPalette.m3primaryContainer
radius: 1000
MaterialIcon {
anchors.centerIn: parent
color: DynamicColors.palette.m3onPrimaryContainer
text: "volume_up"
font.pointSize: 22
CustomRect {
Layout.topMargin: root.topMargin
Layout.preferredHeight: 42 + Appearance.spacing.smaller * 2
Layout.fillWidth: true
color: DynamicColors.tPalette.m3surfaceContainer
radius: root.rounding
RowLayout {
id: outputVolume
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: Appearance.spacing.smaller
spacing: 15
CustomRect {
Layout.preferredWidth: 40
Layout.preferredHeight: 40
Layout.alignment: Qt.AlignVCenter
color: DynamicColors.palette.m3primary
radius: 1000
MaterialIcon {
anchors.centerIn: parent
color: DynamicColors.palette.m3onPrimary
text: "speaker"
font.pointSize: 22
}
}
}
ColumnLayout {
Layout.fillWidth: true
RowLayout {
ColumnLayout {
Layout.fillWidth: true
CustomText {
text: "Output Volume"
RowLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
CustomText {
text: "Output Volume"
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
}
CustomText {
text: qsTr("%1").arg(Audio.muted ? qsTr("Muted") : `${Math.round(Audio.volume * 100)}%`);
font.bold: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
}
}
CustomText {
text: qsTr("%1").arg(Audio.muted ? qsTr("Muted") : `${Math.round(Audio.volume * 100)}%`);
font.bold: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
}
}
CustomMouseArea {
Layout.fillWidth: true
Layout.preferredHeight: 10
Layout.bottomMargin: 5
CustomMouseArea {
Layout.fillWidth: true
Layout.preferredHeight: 10
Layout.bottomMargin: 5
CustomSlider {
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: 10
value: Audio.volume
onMoved: Audio.setVolume(value)
CustomSlider {
anchors.fill: parent
value: Audio.volume
onMoved: Audio.setVolume(value)
Behavior on value { Anim {} }
Behavior on value { Anim {} }
}
}
}
}
}
RowLayout {
Layout.topMargin: 10
spacing: 15
Rectangle {
Layout.preferredWidth: 40
Layout.preferredHeight: 40
Layout.alignment: Qt.AlignVCenter
color: DynamicColors.tPalette.m3primaryContainer
radius: 1000
MaterialIcon {
anchors.centerIn: parent
anchors.alignWhenCentered: false
color: DynamicColors.palette.m3onPrimaryContainer
text: "mic"
font.pointSize: 22
CustomRect {
Layout.topMargin: root.topMargin
Layout.fillWidth: true
Layout.preferredHeight: 42 + Appearance.spacing.smaller * 2
color: DynamicColors.tPalette.m3surfaceContainer
radius: root.rounding
RowLayout {
id: inputVolume
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: Appearance.spacing.smaller
spacing: 15
Rectangle {
Layout.preferredWidth: 40
Layout.preferredHeight: 40
Layout.alignment: Qt.AlignVCenter
color: DynamicColors.palette.m3primary
radius: 1000
MaterialIcon {
anchors.centerIn: parent
anchors.alignWhenCentered: false
color: DynamicColors.palette.m3onPrimary
text: "mic"
font.pointSize: 22
}
}
}
ColumnLayout {
Layout.fillWidth: true
RowLayout {
ColumnLayout {
Layout.fillWidth: true
Layout.fillHeight: true
CustomText {
text: "Input Volume"
RowLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
Layout.fillHeight: true
CustomText {
text: "Input Volume"
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
}
CustomText {
text: qsTr("%1").arg(Audio.sourceMuted ? qsTr("Muted") : `${Math.round(Audio.sourceVolume * 100)}%`);
font.bold: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
}
}
CustomText {
text: qsTr("%1").arg(Audio.sourceMuted ? qsTr("Muted") : `${Math.round(Audio.sourceVolume * 100)}%`);
font.bold: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
}
}
CustomMouseArea {
Layout.fillWidth: true
Layout.bottomMargin: 5
implicitHeight: 10
CustomMouseArea {
Layout.fillWidth: true
Layout.bottomMargin: 5
implicitHeight: 10
CustomSlider {
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: 10
value: Audio.sourceVolume
onMoved: Audio.setSourceVolume(value)
CustomSlider {
anchors.fill: parent
value: Audio.sourceVolume
onMoved: Audio.setSourceVolume(value)
Behavior on value { Anim {} }
Behavior on value { Anim {} }
}
}
}
}
}
Rectangle {
Layout.topMargin: 10
Layout.topMargin: root.topMargin
Layout.fillWidth: true
Layout.preferredHeight: 1
@@ -240,147 +275,47 @@ Item {
}
Repeater {
model: Audio.appStreams
model: Audio.streams.filter(s => s.isSink)
Item {
CustomRect {
id: appBox
Layout.topMargin: 10
Layout.topMargin: root.topMargin
Layout.fillWidth: true
Layout.preferredHeight: 42
visible: !isCaptureStream
required property PwNode modelData
Layout.preferredHeight: 42 + Appearance.spacing.smaller * 2
color: DynamicColors.tPalette.m3surfaceContainer
function isValidMatch(searchTerm, entry) {
if (!entry)
return false;
var search = searchTerm.toLowerCase();
var id = (entry.id || "").toLowerCase();
var name = (entry.name || "").toLowerCase();
var icon = (entry.icon || "").toLowerCase();
// Match is valid if search term appears in entry or entry appears in search
return id.includes(search) || name.includes(search) || icon.includes(search) || search.includes(id.split('.').pop()) || search.includes(name.replace(/\s+/g, ''));
}
radius: root.rounding
readonly property string appName: {
if (!modelData)
return "Unknown App";
var props = modelData.properties;
var desc = modelData.description || "";
var name = modelData.name || "";
var mediaName = props["media.name"] || "";
if ( mediaName !== "playStream" ) {
return mediaName;
}
if (!props) {
if (desc)
return desc;
if (name) {
var nameParts = name.split(/[-_]/);
if (nameParts.length > 0 && nameParts[0])
return nameParts[0].charAt(0).toUpperCase() + nameParts[0].slice(1);
return name;
}
return "Unknown App";
}
var binaryName = props["application.process.binary"] || "";
// Try binary name first (fixes Electron apps like vesktop)
if (binaryName) {
var binParts = binaryName.split("/");
if (binParts.length > 0) {
var binName = binParts[binParts.length - 1].toLowerCase();
var entry = ThemeIcons.findAppEntry(binName);
// Only use entry if it's actually related to binary name
if (entry && entry.name && isValidMatch(binName, entry))
return entry.name;
}
}
var computedAppName = props["application.name"] || "";
var mediaName = props["media.name"] || "";
var appId = props["application.id"] || "";
if (appId) {
var entry = ThemeIcons.findAppEntry(appId);
if (entry && entry.name && isValidMatch(appId, entry))
return entry.name;
if (!computedAppName) {
var parts = appId.split(".");
if (parts.length > 0 && parts[0])
computedAppName = parts[0].charAt(0).toUpperCase() + parts[0].slice(1);
}
}
if (!computedAppName && binaryName) {
var binParts = binaryName.split("/");
if (binParts.length > 0 && binParts[binParts.length - 1])
computedAppName = binParts[binParts.length - 1].charAt(0).toUpperCase() + binParts[binParts.length - 1].slice(1);
}
var result = computedAppName || mediaTitle || mediaName || binaryName || desc || name;
if (!result || result === "" || result === "Unknown App") {
if (name) {
var nameParts = name.split(/[-_]/);
if (nameParts.length > 0 && nameParts[0])
result = nameParts[0].charAt(0).toUpperCase() + nameParts[0].slice(1);
}
}
return result || "Unknown App";
}
PwObjectTracker {
objects: appBox.modelData ? [appBox.modelData] : []
}
PwNodePeakMonitor {
id: peak
node: appBox.modelData
}
readonly property bool isCaptureStream: {
if (!modelData || !modelData.properties)
return false;
const props = modelData.properties;
// Exclude capture streams - check for stream.capture.sink property
if (props["stream.capture.sink"] !== undefined) {
return true;
}
const mediaClass = props["media.class"] || "";
// Exclude Stream/Input (capture) but allow Stream/Output (playback)
if (mediaClass.includes("Capture") || mediaClass === "Stream/Input" || mediaClass === "Stream/Input/Audio") {
return true;
}
const mediaRole = props["media.role"] || "";
if (mediaRole === "Capture") {
return true;
}
return false;
}
required property var modelData
required property int index
RowLayout {
id: layoutVolume
anchors.fill: parent
anchors.margins: Appearance.spacing.smaller
spacing: 15
IconImage {
id: icon
property string iconPath1: Quickshell.iconPath(DesktopEntries.byId(appBox.modelData.name).icon);
property string iconPath2: Quickshell.iconPath(DesktopEntries.byId(appBox.appName).icon);
source: iconPath1 !== "" ? iconPath1 : iconPath2
Layout.alignment: Qt.AlignVCenter
implicitSize: 42
StateLayer {
radius: 1000
onClicked: {
appBox.modelData.audio.muted = !appBox.modelData.audio.muted;
CustomRect {
Layout.preferredWidth: 40
Layout.preferredHeight: 40
Layout.alignment: Qt.AlignVCenter
color: DynamicColors.palette.m3primary
radius: 1000
MaterialIcon {
id: icon
anchors.centerIn: parent
text: "volume_up"
font.pointSize: 22
color: DynamicColors.palette.m3onPrimary
StateLayer {
radius: 1000
onClicked: {
appBox.modelData.audio.muted = !appBox.modelData.audio.muted;
}
}
}
}
@@ -391,7 +326,7 @@ Item {
TextMetrics {
id: metrics
text: appBox.appName
text: Audio.getStreamName(appBox.modelData)
elide: Text.ElideRight
elideWidth: root.width - 50
}
@@ -419,15 +354,14 @@ Item {
Layout.fillWidth: true
Layout.fillHeight: true
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
Layout.bottomMargin: 5
implicitHeight: 10
CustomAudioSlider {
anchors.fill: parent
CustomSlider {
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: 10
value: appBox.modelData.audio.volume
peak: peak.peak
onMoved: {
Audio.setAppAudioVolume(appBox.modelData, value)
console.log(icon.iconPath1, icon.iconPath2)
Audio.setStreamVolume(appBox.modelData, value)
}
}
}
+10 -17
View File
@@ -2,6 +2,7 @@ import QtQuick
import QtQuick.Layouts
import Quickshell.Io
import Quickshell.Services.Pipewire
import qs.Daemons
import qs.Modules
import qs.Config
import qs.Components
@@ -13,7 +14,7 @@ Item {
anchors.bottom: parent.bottom
property bool expanded: false
property color textColor: DynamicColors.palette.m3tertiaryFixed
property color textColor: DynamicColors.palette.m3onSurface
property color barColor: DynamicColors.palette.m3primary
Behavior on implicitWidth {
@@ -23,14 +24,6 @@ Item {
}
}
PwObjectTracker {
objects: [ Pipewire.defaultAudioSink ]
}
PwObjectTracker {
objects: [ Pipewire.defaultAudioSource ]
}
Rectangle {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
@@ -63,8 +56,8 @@ Item {
MaterialIcon {
Layout.alignment: Qt.AlignVCenter
font.pixelSize: 18
text: "volume_up"
color: Pipewire.defaultAudioSink?.audio.muted ? DynamicColors.palette.m3error : root.textColor
text: Audio.muted ? "volume_off" : "volume_up"
color: Audio.muted ? DynamicColors.palette.m3error : root.textColor
}
Rectangle {
@@ -82,9 +75,9 @@ Item {
bottom: parent.bottom
}
implicitWidth: parent.width * ( Pipewire.defaultAudioSink?.audio.volume ?? 0 )
implicitWidth: parent.width * ( Audio.volume ?? 0 )
radius: parent.radius
color: Pipewire.defaultAudioSink?.audio.muted ? DynamicColors.palette.m3error : root.barColor
color: Audio.muted ? DynamicColors.palette.m3error : root.barColor
Behavior on color {
CAnim {}
}
@@ -94,8 +87,8 @@ Item {
MaterialIcon {
Layout.alignment: Qt.AlignVCenter
font.pixelSize: 18
text: Pipewire.defaultAudioSource?.audio.muted ? "mic_off" : "mic"
color: ( Pipewire.defaultAudioSource?.audio.muted ?? false ) ? DynamicColors.palette.m3error : root.textColor
text: Audio.sourceMuted ? "mic_off" : "mic"
color: ( Audio.sourceMuted ?? false ) ? DynamicColors.palette.m3error : root.textColor
}
Rectangle {
@@ -113,9 +106,9 @@ Item {
bottom: parent.bottom
}
implicitWidth: parent.width * ( Pipewire.defaultAudioSource?.audio.volume ?? 0 )
implicitWidth: parent.width * ( Audio.sourceVolume ?? 0 )
radius: parent.radius
color: ( Pipewire.defaultAudioSource?.audio.muted ?? false ) ? DynamicColors.palette.m3error : root.barColor
color: ( Audio.sourceMuted ?? false ) ? DynamicColors.palette.m3error : root.barColor
Behavior on color {
CAnim {}
+2 -10
View File
@@ -7,6 +7,7 @@ import qs.Helpers as Helpers
import qs.Components
Item {
id: root
required property PersistentProperties visibilities
required property Wrapper popouts
required property RowLayout loader
@@ -27,7 +28,7 @@ Item {
anchors.centerIn: parent
text: Time.dateStr
color: DynamicColors.palette.m3tertiary
color: DynamicColors.palette.m3onSurface
Behavior on color {
CAnim {}
@@ -38,15 +39,6 @@ Item {
acceptedButtons: Qt.LeftButton
onClicked: {
root.visibilities.dashboard = !root.visibilities.dashboard;
if ( root.visibilities.sidebar || root.popouts.hasCurrent ) {
// Helpers.Calendar.displayYear = new Date().getFullYear();
// Helpers.Calendar.displayMonth = new Date().getMonth();
// root.popouts.currentName = "calendar";
// root.popouts.currentCenter = Qt.binding( () => item.mapToItem( root.loader, root.implicitWidth / 2, 0 ).x );
// root.popouts.hasCurrent = true;
root.popouts.hasCurrent = false;
root.visibilities.sidebar = false;
}
}
}
}
-144
View File
@@ -1,144 +0,0 @@
pragma Singleton
import qs.Config
import ZShell.Services
import ZShell
import Quickshell
import Quickshell.Services.Pipewire
import QtQuick
Singleton {
id: root
property string previousSinkName: ""
property string previousSourceName: ""
readonly property var nodes: Pipewire.nodes.values.reduce((acc, node) => {
if (!node.isStream) {
if (node.isSink)
acc.sinks.push(node);
else if (node.audio)
acc.sources.push(node);
} else if (node.isStream && node.audio) {
// Application streams (output streams)
acc.streams.push(node);
}
return acc;
}, {
sources: [],
sinks: [],
streams: []
})
readonly property list<PwNode> sinks: nodes.sinks
readonly property list<PwNode> sources: nodes.sources
readonly property list<PwNode> streams: nodes.streams
readonly property PwNode sink: Pipewire.defaultAudioSink
readonly property PwNode source: Pipewire.defaultAudioSource
readonly property bool muted: !!sink?.audio?.muted
readonly property real volume: sink?.audio?.volume ?? 0
readonly property bool sourceMuted: !!source?.audio?.muted
readonly property real sourceVolume: source?.audio?.volume ?? 0
readonly property alias beatTracker: beatTracker
function setVolume(newVolume: real): void {
if (sink?.ready && sink?.audio) {
sink.audio.muted = false;
sink.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume));
}
}
function incrementVolume(amount: real): void {
setVolume(volume + (amount || Config.services.audioIncrement));
}
function decrementVolume(amount: real): void {
setVolume(volume - (amount || Config.services.audioIncrement));
}
function setSourceVolume(newVolume: real): void {
if (source?.ready && source?.audio) {
source.audio.muted = false;
source.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume));
}
}
function incrementSourceVolume(amount: real): void {
setSourceVolume(sourceVolume + (amount || Config.services.audioIncrement));
}
function decrementSourceVolume(amount: real): void {
setSourceVolume(sourceVolume - (amount || Config.services.audioIncrement));
}
function setAudioSink(newSink: PwNode): void {
Pipewire.preferredDefaultAudioSink = newSink;
}
function setAudioSource(newSource: PwNode): void {
Pipewire.preferredDefaultAudioSource = newSource;
}
function setStreamVolume(stream: PwNode, newVolume: real): void {
if (stream?.ready && stream?.audio) {
stream.audio.muted = false;
stream.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume));
}
}
function setStreamMuted(stream: PwNode, muted: bool): void {
if (stream?.ready && stream?.audio) {
stream.audio.muted = muted;
}
}
function getStreamVolume(stream: PwNode): real {
return stream?.audio?.volume ?? 0;
}
function getStreamMuted(stream: PwNode): bool {
return !!stream?.audio?.muted;
}
function getStreamName(stream: PwNode): string {
if (!stream)
return qsTr("Unknown");
// Try application name first, then description, then name
return stream.applicationName || stream.description || stream.name || qsTr("Unknown Application");
}
onSinkChanged: {
if (!sink?.ready)
return;
const newSinkName = sink.description || sink.name || qsTr("Unknown Device");
previousSinkName = newSinkName;
}
onSourceChanged: {
if (!source?.ready)
return;
const newSourceName = source.description || source.name || qsTr("Unknown Device");
previousSourceName = newSourceName;
}
Component.onCompleted: {
previousSinkName = sink?.description || sink?.name || qsTr("Unknown Device");
previousSourceName = source?.description || source?.name || qsTr("Unknown Device");
}
PwObjectTracker {
objects: [...root.sinks, ...root.sources, ...root.streams]
}
BeatTracker {
id: beatTracker
}
}
+1
View File
@@ -1,6 +1,7 @@
import ZShell.Services
import QtQuick
import QtQuick.Shapes
import qs.Daemons
import qs.Components
import qs.Config
import qs.Helpers
+3 -3
View File
@@ -32,19 +32,19 @@ Row {
Resource {
icon: "gamepad"
value: SystemUsage.gpuPerc
color: DynamicColors.palette.m3primaryFixed
color: DynamicColors.palette.m3tertiary
}
Resource {
icon: "host"
value: SystemUsage.gpuMemUsed
color: DynamicColors.palette.m3secondaryFixed
color: DynamicColors.palette.m3primary
}
Resource {
icon: "hard_disk"
value: SystemUsage.storagePerc
color: DynamicColors.palette.m3tertiary
color: DynamicColors.palette.m3secondary
}
component Resource: Item {
+9
View File
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Wayland
import Quickshell.Hyprland
import Quickshell.Io
import QtQuick
import QtQuick.Effects
import qs.Components
@@ -33,6 +34,14 @@ Scope {
lock: lock
}
IpcHandler {
target: "lock"
function lock() {
return lock.locked = true;
}
}
CustomShortcut {
name: "lock"
description: "Lock the current session"
+1 -5
View File
@@ -26,7 +26,7 @@ Item {
anchors.centerIn: parent
property color iconColor: DynamicColors.palette.m3tertiaryFixed
property color iconColor: DynamicColors.palette.m3onSurface
text: HasNotifications.hasNotifications ? "\uf4fe" : "\ue7f4"
font.family: "Material Symbols Rounded"
@@ -42,10 +42,6 @@ Item {
cursorShape: Qt.PointingHandCursor
onClicked: {
root.visibilities.sidebar = !root.visibilities.sidebar;
if ( root.visibilities.dashboard || root.popouts.hasCurrent ) {
root.popouts.hasCurrent = false;
root.visibilities.dashboard = false;
}
}
}
}
+3 -1
View File
@@ -18,8 +18,10 @@ ShapePath {
readonly property real utilsWidthDiff: panels.utilities.width - wrapper.width
readonly property real utilsRoundingX: utilsWidthDiff < rounding * 2 ? utilsWidthDiff / 2 : rounding
readonly property bool flatten: wrapper.width < rounding * 2
strokeWidth: -1
fillColor: DynamicColors.palette.m3surface
fillColor: flatten ? "transparent" : DynamicColors.palette.m3surface
PathLine {
relativeX: -root.wrapper.width - root.notifsRoundingX
+11 -2
View File
@@ -5,7 +5,7 @@ import QtQuick.Layouts
import qs.Components
import qs.Helpers
import qs.Config
import qs.Modules.Dashboard.Dash
import qs.Daemons
import qs.Modules as Modules
Item {
@@ -47,6 +47,7 @@ Item {
icon: Icons.getVolumeIcon(value, root.muted)
value: root.volume
to: Config.services.maxVolume
color: Audio.muted ? DynamicColors.palette.m3error : DynamicColors.palette.m3secondary
onMoved: Audio.setVolume(value)
}
}
@@ -101,7 +102,15 @@ Item {
icon: `brightness_${(Math.round(value * 6) + 1)}`
value: root.brightness
onMoved: root.monitor?.setBrightness(value)
onMoved: {
if ( Config.osd.allMonBrightness ) {
root.monitor?.setBrightness(value)
} else {
for (const mon of Brightness.monitors) {
mon.setBrightness(value)
}
}
}
}
}
}
+1 -9
View File
@@ -6,7 +6,7 @@ import qs.Components
import qs.Helpers
import qs.Config
import qs.Modules as Modules
import qs.Modules.Dashboard.Dash
import qs.Daemons
Item {
id: root
@@ -105,14 +105,6 @@ Item {
}
}
CustomShortcut {
name: "show-osd"
onPressed: {
root.show();
}
}
Timer {
id: timer
+3 -2
View File
@@ -15,8 +15,9 @@ Item {
implicitWidth: resourceRowLayout.x < 0 ? 0 : resourceRowLayout.implicitWidth
implicitHeight: 22
property bool warning: percentage * 100 >= warningThreshold
property color usageColor: warning ? DynamicColors.palette.m3error : DynamicColors.palette.m3primary
property color borderColor: warning ? DynamicColors.palette.m3onError : DynamicColors.palette.m3onPrimary
required property color mainColor
property color usageColor: warning ? DynamicColors.palette.m3error : mainColor
property color borderColor: warning ? DynamicColors.palette.m3onError : mainColor
Behavior on percentage {
NumberAnimation {
+1 -1
View File
@@ -69,7 +69,7 @@ Item {
Layout.alignment: Qt.AlignLeft
text: root.details
font.pointSize: 10
color: "#cccccc"
color: root.textColor
}
}
}
+8 -5
View File
@@ -13,7 +13,6 @@ Item {
id: root
implicitWidth: rowLayout.implicitWidth + rowLayout.anchors.leftMargin + rowLayout.anchors.rightMargin
implicitHeight: 34
property color textColor: DynamicColors.palette.m3tertiaryFixed
clip: true
Rectangle {
@@ -41,46 +40,50 @@ Item {
Layout.alignment: Qt.AlignVCenter
font.pixelSize: 18
text: "memory_alt"
color: root.textColor
color: DynamicColors.palette.m3onSurface
}
Resource {
percentage: ResourceUsage.memoryUsedPercentage
warningThreshold: 95
mainColor: DynamicColors.palette.m3primary
}
MaterialIcon {
Layout.alignment: Qt.AlignVCenter
font.pixelSize: 18
text: "memory"
color: root.textColor
color: DynamicColors.palette.m3onSurface
}
Resource {
percentage: ResourceUsage.cpuUsage
warningThreshold: 80
mainColor: DynamicColors.palette.m3secondary
}
MaterialIcon {
Layout.alignment: Qt.AlignVCenter
font.pixelSize: 18
text: "gamepad"
color: root.textColor
color: DynamicColors.palette.m3onSurface
}
Resource {
percentage: ResourceUsage.gpuUsage
mainColor: DynamicColors.palette.m3tertiary
}
MaterialIcon {
Layout.alignment: Qt.AlignVCenter
font.pixelSize: 18
text: "developer_board"
color: root.textColor
color: DynamicColors.palette.m3onSurface
}
Resource {
percentage: ResourceUsage.gpuMemUsage
mainColor: DynamicColors.palette.m3primary
}
}
}
+19
View File
@@ -10,6 +10,7 @@ Scope {
property bool launcherInterrupted
readonly property bool hasFullscreen: Hypr.focusedWorkspace?.toplevels.values.some(t => t.lastIpcObject.fullscreen === 2) ?? false
CustomShortcut {
name: "toggle-launcher"
description: "Toggle launcher"
@@ -22,4 +23,22 @@ Scope {
root.launcherInterrupted = false;
}
}
CustomShortcut {
name: "toggle-nc"
onPressed: {
const visibilities = Visibilities.getForActive()
visibilities.sidebar = !visibilities.sidebar
}
}
CustomShortcut {
name: "show-osd"
onPressed: {
const visibilities = Visibilities.getForActive()
visibilities.osd = !visibilities.osd
}
}
}
+25 -15
View File
@@ -39,21 +39,31 @@ Item {
}
}
Image {
id: icon
ColoredIcon {
id: icon
property bool batteryHDPI: root.bar.screen.x < 0 && root.item.icon.includes("battery")
property bool nmHDPI: root.bar.screen.x < 0 && root.item.icon.includes("nm-")
anchors.centerIn: parent
source: root.item.icon
implicitSize: 22
color: DynamicColors.palette.m3onSurface
layer.enabled: DynamicColors.light
}
anchors.centerIn: parent
width: batteryHDPI ? 26 : ( nmHDPI ? 25 : 22 )
height: batteryHDPI ? 26 : ( nmHDPI ? 25 : 22 )
source: root.item.icon
mipmap: true
smooth: ( batteryHDPI || nmHDPI ) ? false : true
asynchronous: true
sourceSize.width: ( batteryHDPI || nmHDPI ) ? 16 : 22
sourceSize.height: ( batteryHDPI || nmHDPI ) ? 16 : 22
fillMode: Image.PreserveAspectFit
}
// Image {
// id: icon
//
// property bool batteryHDPI: root.bar.screen.x < 0 && root.item.icon.includes("battery")
// property bool nmHDPI: root.bar.screen.x < 0 && root.item.icon.includes("nm-")
//
// anchors.centerIn: parent
// width: batteryHDPI ? 26 : ( nmHDPI ? 25 : 22 )
// height: batteryHDPI ? 26 : ( nmHDPI ? 25 : 22 )
// source: root.item.icon
// mipmap: true
// smooth: ( batteryHDPI || nmHDPI ) ? false : true
// asynchronous: true
// sourceSize.width: ( batteryHDPI || nmHDPI ) ? 16 : 22
// sourceSize.height: ( batteryHDPI || nmHDPI ) ? 16 : 22
// fillMode: Image.PreserveAspectFit
// }
}
+1 -1
View File
@@ -9,7 +9,7 @@ Item {
implicitWidth: textMetrics.width + contentRow.spacing + 30
anchors.top: parent.top
anchors.bottom: parent.bottom
property color textColor: DynamicColors.palette.m3tertiaryFixed
property color textColor: DynamicColors.palette.m3onSurface
Rectangle {
anchors.left: parent.left
+4 -1
View File
@@ -3,11 +3,14 @@ pragma Singleton
import Quickshell
import Quickshell.Io
import QtQuick
import qs.Config
Singleton {
id: root
property var args
readonly property string mode: Config.general.color.mode
readonly property string threshold: mode === "dark" ? "--threshold=9" : "--dynamic-threshold"
function generateColors(wallpaperPath) {
root.args = wallpaperPath;
@@ -16,7 +19,7 @@ Singleton {
Process {
id: wallustProc
command: ["wallust", "run", root.args, "--palette=dark", "--ignore-sequence=cursor", "--threshold=9" ]
command: ["wallust", "run", root.args, `--palette=${root.mode}`, "--ignore-sequence=cursor", `${root.threshold}` ]
running: false
}
}
+42 -25
View File
@@ -1,9 +1,10 @@
<div align="center">
<img src="/images/shell.png">
</div>
# ZShell
A feature-rich desktop shell for Hyprland built with [Quickshell](https://quickshell.outfoxxed.me/) and Qt6/QML. Provides a modern, Material Design 3 inspired status bar, application launcher, notification center, wallpaper manager with dynamic color theming, and lock screen.
A feature-rich desktop shell for [Hyprland](https://hypr.land/) built with [Quickshell](https://quickshell.outfoxxed.me/) and Qt6/QML. Provides a modern, Material Design 3 inspired status bar, application launcher, notification center, wallpaper manager with dynamic color theming, and lock screen.
## Features
@@ -22,9 +23,16 @@ A feature-rich desktop shell for Hyprland built with [Quickshell](https://quicks
- [Hyprland](https://hyprland.org/)
- Python 3 with `materialyoucolor` and `Pillow` (for dynamic color generation)
- PipeWire (for audio)
- Aubio
- DDCUtil
- Mpris
## Installation
### Arch Linux
For arch-based distros, there is a pkgbuild available at
```bash
cmake -B build -G Ninja
ninja -C build
@@ -95,38 +103,38 @@ Now you can add z-bar-qt as a nixpkgs in environment.systemPackages (or optional
}
```
You can now run ```zshell``` to run the bar.
You can now run `zshell` to run the bar.
## Configuration
Configuration is stored in `~/.config/z-bar/config.json`. Options include:
| Option | Description |
| --------------------------------- | ----------------------------------------------------------- |
| `appCount` | Max apps shown in launcher |
| `wallpaperPath` | Directory containing wallpapers |
| `baseBgColor` / `baseBorderColor` | Fallback colors when dynamic colors disabled |
| `accentColor` | Custom accent color override |
| `useDynamicColors` | Enable Material Design 3 theming from wallpaper |
| `barConfig` | Enable/disable widgets and configure popouts |
| `transparency` | UI transparency levels |
| `baseFont` | System font |
| `animScale` | Animation speed multiplier |
| `gpuType` | GPU type for resource monitoring (`amd`, `nvidia`, `intel`) |
| Option | Description |
| :-------------------------------: | :---------------------------------------------------------: |
| `appCount` | Max apps shown in launcher |
| `wallpaperPath` | Directory containing wallpapers |
| `baseBgColor` / `baseBorderColor` | Fallback colors when dynamic colors disabled |
| `accentColor` | Custom accent color override |
| `useDynamicColors` | Enable Material Design 3 theming from wallpaper |
| `barConfig` | Enable/disable widgets and configure popouts |
| `transparency` | UI transparency levels |
| `baseFont` | System font |
| `animScale` | Animation speed multiplier |
| `gpuType` | GPU type for resource monitoring (`amd`, `nvidia`, `intel`) |
## Launcher Search Prefixes
| Prefix | Filter |
| ------ | ------------------- |
| `>i` | App ID |
| `>c` | Categories |
| `>d` | Description/comment |
| `>e` | Exec command |
| `>w` | WM class |
| `>g` | Generic name |
| `>k` | Keywords |
| `>t` | Terminal apps only |
| `> ` | Wallpaper picker |
| Prefix | Filter |
| ------------- | ------------------- |
| `>i` | App ID |
| `>c` | Categories |
| `>d` | Description/comment |
| `>e` | Exec command |
| `>w` | WM class |
| `>g` | Generic name |
| `>k` | Keywords |
| `>t` | Terminal apps only |
| `>wallpaper ` | Wallpaper picker |
## Project Structure
@@ -143,6 +151,15 @@ Configuration is stored in `~/.config/z-bar/config.json`. Options include:
└── scripts/ # Helper scripts (color generation, fuzzy search)
```
## Inspiration and Acknowledgements
This project was inspired by the following repositories and resources, which helped me learn both Quickshell and QML:
- [Caelestia](https://github.com/caelestia-dots/shell)
- [end-4 dots-hyprland](https://github.com/end-4/dots-hyprland)
Thank you to the maintainers and contributors of these projects for sharing their work.
## License
See repository for license information.
Executable
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
cd "$(dirname $0)/../src" || exit
python3 -m zshell "$@"
+27
View File
@@ -0,0 +1,27 @@
[build-system]
requires = ["hatchling >= 1.26"]
build-backend = "hatchling.build"
[project]
name = "zshell"
requires-python = ">=3.13"
version = "0.1.0"
dependencies = [
"typer",
"pillow",
"materialyoucolor"
]
[project.scripts]
zshell-cli = "zshell:main"
[tool.hatch.version]
source = "vcs"
[tool.hatch.build.targets.sdist]
only-include = [
"src",
]
[tool.ruff]
line-length = 120
+14
View File
@@ -0,0 +1,14 @@
from __future__ import annotations
import typer
from zshell.subcommands import shell, scheme, screenshot, wallpaper
app = typer.Typer()
app.add_typer(shell.app, name="shell")
app.add_typer(scheme.app, name="scheme")
app.add_typer(screenshot.app, name="screenshot")
app.add_typer(wallpaper.app, name="wallpaper")
def main() -> None:
app()
+4
View File
@@ -0,0 +1,4 @@
from . import main
if __name__ == "__main__":
main()
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,110 @@
primary_paletteKeyColor 6674ac
secondary_paletteKeyColor 71768e
tertiary_paletteKeyColor 9a6593
neutral_paletteKeyColor 77767b
neutral_variant_paletteKeyColor 757680
background 131317
onBackground e4e1e7
surface 131317
surfaceDim 131317
surfaceBright 39393d
surfaceContainerLowest 0d0e12
surfaceContainerLow 1b1b1f
surfaceContainer 1f1f23
surfaceContainerHigh 292a2e
surfaceContainerHighest 343438
onSurface e4e1e7
surfaceVariant 45464f
onSurfaceVariant c6c5d1
inverseSurface e4e1e7
inverseOnSurface 303034
outline 8f909a
outlineVariant 45464f
shadow 000000
scrim 000000
surfaceTint b7c4ff
primary b7c4ff
onPrimary 1e2d60
primaryContainer 6674ac
onPrimaryContainer ffffff
inversePrimary 4e5c92
secondary c1c5e0
onSecondary 2a2f44
secondaryContainer 41465c
onSecondaryContainer afb4ce
tertiary f1b3e6
onTertiary 4c1f49
tertiaryContainer b67fae
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed dce1ff
primaryFixedDim b7c4ff
onPrimaryFixed 05164b
onPrimaryFixedVariant 364478
secondaryFixed dde1fd
secondaryFixedDim c1c5e0
onSecondaryFixed 151b2e
onSecondaryFixedVariant 41465c
tertiaryFixed ffd7f5
tertiaryFixedDim f1b3e6
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 353434
term1 9a7bff
term2 44def5
term3 ffdcf2
term4 92acd6
term5 a9a2ed
term6 9dceff
term7 e8d3de
term8 ac9fa9
term9 b299ff
term10 89ecff
term11 fff0f6
term12 b1c2db
term13 c1b7f7
term14 bae0ff
term15 ffffff
rosewater f5eff9
flamingo e5def4
pink dcd9ff
mauve b5bbff
red b5a9ff
maroon c1b7ef
peach e0c2f9
yellow ffecf3
green c8e3ff
teal cee1ff
sky cadcff
sapphire aec7ff
blue a6baff
lavender bfcaff
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text e4e1e7
subtext1 c6c5d1
subtext0 8f909a
overlay2 7d7d86
overlay1 6a6a72
overlay0 585960
surface2 48484e
surface1 37373d
surface0 25252a
base 131317
mantle 131317
crust 121216
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 417da2
secondary_paletteKeyColor 657a8a
tertiary_paletteKeyColor 92689d
neutral_paletteKeyColor 75777a
neutral_variant_paletteKeyColor 71787f
background f8f9fc
onBackground 191c1e
surface f8f9fc
surfaceDim d9dadd
surfaceBright f8f9fc
surfaceContainerLowest ffffff
surfaceContainerLow f2f3f7
surfaceContainer edeef1
surfaceContainerHigh e7e8eb
surfaceContainerHighest e1e2e6
onSurface 191c1e
surfaceVariant dce3eb
onSurfaceVariant 41484e
inverseSurface 2e3133
inverseOnSurface eff1f4
outline 6e757c
outlineVariant c0c7ce
shadow 000000
scrim 000000
surfaceTint 236488
primary 3e7b9f
onPrimary ffffff
primaryContainer 417da2
onPrimaryContainer 00060c
inversePrimary 93cdf6
secondary 4c6170
onSecondary ffffff
secondaryContainer cfe5f8
onSecondaryContainer 526776
tertiary 8f659a
onTertiary ffffff
tertiaryContainer 8f659a
onTertiaryContainer ffffff
error ba1a1a
onError ffffff
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed c7e7ff
primaryFixedDim 93cdf6
onPrimaryFixed 001e2e
onPrimaryFixedVariant 004c6d
secondaryFixed cfe5f8
secondaryFixedDim b4c9db
onSecondaryFixed 071e2b
onSecondaryFixedVariant 354958
tertiaryFixed fad7ff
tertiaryFixedDim e6b6f1
onTertiaryFixed 2e0a3b
onTertiaryFixedVariant 5e3869
term0 9a9b9b
term1 005bcc
term2 008ca5
term3 7e61b0
term4 009993
term5 006ac4
term6 3389ae
term7 202225
term8 0f0f0f
term9 0071fa
term10 00afce
term11 9a7cce
term12 3fbdb6
term13 1e85ec
term14 59a9d1
term15 27282b
rosewater 7d76b1
flamingo 6470bd
pink 057ee6
mauve 005791
red 003ee0
maroon 2751f9
peach 8a4dff
yellow 008f68
green 007991
teal 007195
sky 0082b6
sapphire 037ba6
blue 005e90
lavender 0077b7
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 191c1e
subtext1 41484e
subtext0 6e757c
overlay2 7f858b
overlay1 91979d
overlay0 a4a8ae
surface2 b7babf
surface1 cbced2
surface0 e1e3e7
base f8f9fc
mantle eff1f4
crust e9ebef
success 4F6354
onSuccess FFFFFF
successContainer D1E8D5
onSuccessContainer 0C1F13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 6a73ac
secondary_paletteKeyColor 72758e
tertiary_paletteKeyColor 9b6592
neutral_paletteKeyColor 77767b
neutral_variant_paletteKeyColor 767680
background 131317
onBackground e4e1e7
surface 131317
surfaceDim 131317
surfaceBright 39393d
surfaceContainerLowest 0e0e12
surfaceContainerLow 1b1b1f
surfaceContainer 1f1f23
surfaceContainerHigh 2a2a2e
surfaceContainerHighest 353438
onSurface e4e1e7
surfaceVariant 46464f
onSurfaceVariant c6c5d1
inverseSurface e4e1e7
inverseOnSurface 303034
outline 90909a
outlineVariant 46464f
shadow 000000
scrim 000000
surfaceTint bac3ff
primary bac3ff
onPrimary 232c60
primaryContainer 6a73ac
onPrimaryContainer ffffff
inversePrimary 525b92
secondary c3c5e0
onSecondary 2c2f44
secondaryContainer 42455c
onSecondaryContainer b1b3ce
tertiary f1b3e5
onTertiary 4c1f48
tertiaryContainer b77ead
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed dee0ff
primaryFixedDim bac3ff
onPrimaryFixed 0b154b
onPrimaryFixedVariant 3a4378
secondaryFixed dfe1fd
secondaryFixedDim c3c5e0
onSecondaryFixed 171a2e
onSecondaryFixedVariant 42455c
tertiaryFixed ffd7f4
tertiaryFixedDim f1b3e5
onTertiaryFixed 340831
onTertiaryFixedVariant 66365f
term0 353434
term1 a178ff
term2 44def5
term3 ffdcf2
term4 94abd7
term5 ada0ed
term6 9dceff
term7 e8d3de
term8 ac9fa9
term9 b797ff
term10 89ecff
term11 fff0f6
term12 b2c2dc
term13 c4b6f6
term14 bae0ff
term15 ffffff
rosewater f6eff9
flamingo e7def4
pink ded8ff
mauve b9baff
red b9a8ff
maroon c4b7ee
peach e0c2f9
yellow ffecf3
green c8e3ff
teal d0e0ff
sky ccdbff
sapphire b1c6ff
blue aab9ff
lavender c2c9ff
klink 6a84d1
klinkSelection 6a84d1
kvisited 7775dc
kvisitedSelection 7775dc
knegative 946dff
knegativeSelection 946dff
kneutral c794ff
kneutralSelection c794ff
kpositive 5daeff
kpositiveSelection 5eaeff
text e4e1e7
subtext1 c6c5d1
subtext0 90909a
overlay2 7d7d86
overlay1 6a6a72
overlay0 595960
surface2 48484e
surface1 37373d
surface0 25252a
base 131317
mantle 131317
crust 121216
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 7171ac
secondary_paletteKeyColor 76758e
tertiary_paletteKeyColor 9e648e
neutral_paletteKeyColor 78767b
neutral_variant_paletteKeyColor 777680
background 131317
onBackground e5e1e7
surface 131317
surfaceDim 131317
surfaceBright 39393d
surfaceContainerLowest 0e0e12
surfaceContainerLow 1c1b1f
surfaceContainer 201f23
surfaceContainerHigh 2a292e
surfaceContainerHighest 353438
onSurface e5e1e7
surfaceVariant 47464f
onSurfaceVariant c8c5d1
inverseSurface e5e1e7
inverseOnSurface 313034
outline 918f9a
outlineVariant 47464f
shadow 000000
scrim 000000
surfaceTint c2c1ff
primary c2c1ff
onPrimary 2a2a60
primaryContainer 7171ac
onPrimaryContainer ffffff
inversePrimary 595992
secondary c6c4e0
onSecondary 2e2e44
secondaryContainer 45455c
onSecondaryContainer b4b2ce
tertiary f5b2e0
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed e2dfff
primaryFixedDim c2c1ff
onPrimaryFixed 14134a
onPrimaryFixedVariant 414178
secondaryFixed e2e0fd
secondaryFixedDim c6c4e0
onSecondaryFixed 19192e
onSecondaryFixedVariant 45455c
tertiaryFixed ffd7f0
tertiaryFixedDim f5b2e0
onTertiaryFixed 35082e
onTertiaryFixedVariant 68355c
term0 353434
term1 ac73ff
term2 44def5
term3 ffdcf2
term4 99aad8
term5 b49fea
term6 9dceff
term7 e8d3de
term8 ac9fa9
term9 c093ff
term10 89ecff
term11 fff0f6
term12 b5c1dd
term13 c9b5f4
term14 bae0ff
term15 ffffff
rosewater f7eff9
flamingo e9def3
pink e2d7ff
mauve bfb8ff
red c1a5fd
maroon c9b5ed
peach e0c2f9
yellow ffecf3
green c8e3ff
teal d3dfff
sky d0daff
sapphire b7c5ff
blue b0b8ff
lavender c7c8ff
klink 7382d2
klinkSelection 7382d2
kvisited 8172da
kvisitedSelection 8172da
knegative a167ff
knegativeSelection a167ff
kneutral ca92ff
kneutralSelection c992ff
kpositive 60adff
kpositiveSelection 60adff
text e5e1e7
subtext1 c8c5d1
subtext0 918f9a
overlay2 7e7c86
overlay1 6b6972
overlay0 595860
surface2 48474e
surface1 37373d
surface0 25252a
base 131317
mantle 131317
crust 121216
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 33653E
secondary_paletteKeyColor 1B4E2A
tertiary_paletteKeyColor 376942
neutral_paletteKeyColor 1E1E26
neutral_variant_paletteKeyColor 23252D
background 23262D
onBackground F5F5F6
surface 050505
surfaceDim 1E1E24
surfaceBright 1E1E24
surfaceContainerLowest 0a0a0b
surfaceContainerLow 0a0a0b
surfaceContainer 0a0a0b
surfaceContainerHigh 050505
surfaceContainerHighest 0f1210
onSurface F5F5F6
surfaceVariant 0a0a0b
onSurfaceVariant c9c9c9
inverseSurface 0a0a0b
inverseOnSurface ACACAC
outline 838383
outlineVariant 1E1E25
shadow 000000
scrim 000000
surfaceTint 24BD5C
primary 24BD5C
onPrimary 091f11
primaryContainer 0f1210
onPrimaryContainer 24BD5C
inversePrimary 24BD5C
secondary 24BD5C
onSecondary 043a14
secondaryContainer 0f1210
onSecondaryContainer F4F3F5
tertiary 32653E
onTertiary F5F4F6
tertiaryContainer 1E1E25
onTertiaryContainer F5F5F6
error c66e73
onError F5F4F6
errorContainer 893034
onErrorContainer F5F4F6
primaryFixed 24BD5C
primaryFixedDim 24BD5C
onPrimaryFixed F5F4F6
onPrimaryFixedVariant F5F4F6
secondaryFixed 24BD5C
secondaryFixedDim 24BD5C
onSecondaryFixed F5F4F6
onSecondaryFixedVariant F5F4F6
tertiaryFixed 24BD5C
tertiaryFixedDim 24BD5C
onTertiaryFixed F5F4F6
onTertiaryFixedVariant F5F4F6
term0 343434
term1 23B65A
term2 43ff88
term3 7cfcab
term4 78c19f
term5 7ae9a7
term6 80deb2
term7 ccdcd6
term8 9aa59f
term9 cdff9e
term10 00f608
term11 c9fff3
term12 a4c7cd
term13 a5f7a2
term14 87f1b5
term15 ffffff
rosewater f4f0fa
flamingo dfe0f5
pink bdffd4
mauve 73fa90
red 8affab
maroon abf0c5
peach a9daac
yellow d0f9f4
green 8af797
teal a0f9aa
sky cefb97
sapphire 85ef77
blue 65eea0
lavender 90f79e
klink 65eea0
klinkSelection 65eea0
kvisited 73fa90
kvisitedSelection 73fa90
knegative 8affab
knegativeSelection 8affab
kneutral d0f9f4
kneutralSelection d0f9f4
kpositive 8af797
kpositiveSelection 8af797
text e0e3e4
subtext1 bec8cc
subtext0 889296
overlay2 767f83
overlay1 646c6f
overlay0 535a5d
surface2 43494b
surface1 33383a
surface0 212627
base 101415
mantle 101415
crust 0f1314
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 33653E
secondary_paletteKeyColor 1B4E2A
tertiary_paletteKeyColor 376942
neutral_paletteKeyColor 1E1E26
neutral_variant_paletteKeyColor 23252D
background 23262D
onBackground F5F5F6
surface 1E1E24
surfaceDim 1E1E24
surfaceBright 1E1E24
surfaceContainerLowest 23262C
surfaceContainerLow 23262C
surfaceContainer 23262C
surfaceContainerHigh 1b1d22
surfaceContainerHighest 232C29
onSurface F5F5F6
surfaceVariant 23262C
onSurfaceVariant c9c9c9
inverseSurface 23262C
inverseOnSurface ACACAC
outline 979797
outlineVariant 1E1E25
shadow 000000
scrim 000000
surfaceTint 24BD5C
primary 24BD5C
onPrimary 091f11
primaryContainer 232c29
onPrimaryContainer 24BD5C
inversePrimary 24BD5C
secondary 24BD5C
onSecondary 043a14
secondaryContainer 232c29
onSecondaryContainer F4F3F5
tertiary 32653E
onTertiary F5F4F6
tertiaryContainer 1E1E25
onTertiaryContainer F5F5F6
error c66e73
onError F5F4F6
errorContainer 893034
onErrorContainer F5F4F6
primaryFixed 24BD5C
primaryFixedDim 24BD5C
onPrimaryFixed F5F4F6
onPrimaryFixedVariant F5F4F6
secondaryFixed 24BD5C
secondaryFixedDim 24BD5C
onSecondaryFixed F5F4F6
onSecondaryFixedVariant F5F4F6
tertiaryFixed 24BD5C
tertiaryFixedDim 24BD5C
onTertiaryFixed F5F4F6
onTertiaryFixedVariant F5F4F6
term0 343434
term1 23B65A
term2 43ff88
term3 7cfcab
term4 78c19f
term5 7ae9a7
term6 80deb2
term7 ccdcd6
term8 9aa59f
term9 cdff9e
term10 00f608
term11 c9fff3
term12 a4c7cd
term13 a5f7a2
term14 87f1b5
term15 ffffff
rosewater f4f0fa
flamingo dfe0f5
pink bdffd4
mauve 73fa90
red 8affab
maroon abf0c5
peach a9daac
yellow d0f9f4
green 8af797
teal a0f9aa
sky cefb97
sapphire 85ef77
blue 65eea0
lavender 90f79e
klink 65eea0
klinkSelection 65eea0
kvisited 73fa90
kvisitedSelection 73fa90
knegative 8affab
knegativeSelection 8affab
kneutral d0f9f4
kneutralSelection d0f9f4
kpositive 8af797
kpositiveSelection 8af797
text e0e3e4
subtext1 bec8cc
subtext0 889296
overlay2 767f83
overlay1 646c6f
overlay0 535a5d
surface2 43494b
surface1 33383a
surface0 212627
base 101415
mantle 101415
crust 0f1314
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor BD93F9
secondary_paletteKeyColor 50FA7B
tertiary_paletteKeyColor FF79C6
neutral_paletteKeyColor 282A36
neutral_variant_paletteKeyColor 44475A
background 282A36
onBackground F8F8F2
surface 343746
surfaceDim 21222C
surfaceBright 4D4F66
surfaceContainerLowest 191A21
surfaceContainerLow 3C3F4E
surfaceContainer 3E4153
surfaceContainerHigh 4D4F66
surfaceContainerHighest 565970
onSurface F8F8F2
surfaceVariant 3E4153
onSurfaceVariant F8F8F2
inverseSurface F8F8F2
inverseOnSurface 282A36
outline 6272A4
outlineVariant 4D4F66
shadow 000000
scrim 000000
surfaceTint BD93F9
primary BD93F9
onPrimary 282A36
primaryContainer 4D4F66
onPrimaryContainer BD93F9
inversePrimary 9D73D9
secondary 50FA7B
onSecondary 282A36
secondaryContainer 4D4F66
onSecondaryContainer 50FA7B
tertiary FF79C6
onTertiary 282A36
tertiaryContainer 4D4F66
onTertiaryContainer FF79C6
error FF5555
onError 282A36
errorContainer 4C3743
onErrorContainer FF5555
primaryFixed BD93F9
primaryFixedDim 9D73D9
onPrimaryFixed 282A36
onPrimaryFixedVariant 3E4153
secondaryFixed 50FA7B
secondaryFixedDim 30DA5B
onSecondaryFixed 282A36
onSecondaryFixedVariant 3E4153
tertiaryFixed FF79C6
tertiaryFixedDim DF59A6
onTertiaryFixed 282A36
onTertiaryFixedVariant 3E4153
term0 282A36
term1 FF5555
term2 50FA7B
term3 F1FA8C
term4 BD93F9
term5 FF79C6
term6 8BE9FD
term7 F8F8F2
term8 6272A4
term9 FF6E6E
term10 69FF94
term11 FFFFA5
term12 D6ACFF
term13 FF92DF
term14 A4FFFF
term15 FFFFFF
rosewater F8F8F2
flamingo FFB86C
pink FF79C6
mauve BD93F9
red FF5555
maroon FF6E6E
peach FFB86C
yellow F1FA8C
green 50FA7B
teal 8BE9FD
sky 8BE9FD
sapphire 8BE9FD
blue BD93F9
lavender BD93F9
klink BD93F9
klinkSelection BD93F9
kvisited FF79C6
kvisitedSelection FF79C6
knegative FF5555
knegativeSelection FF5555
kneutral F1FA8C
kneutralSelection F1FA8C
kpositive 50FA7B
kpositiveSelection 50FA7B
text F8F8F2
subtext1 F8F8F2
subtext0 E6E6E6
overlay2 A0A0A0
overlay1 8A8A8A
overlay0 6272A4
surface2 3E4153
surface1 343746
surface0 282A36
base 282A36
mantle 21222C
crust 191A21
success 50FA7B
onSuccess 282A36
successContainer 4D4F66
onSuccessContainer F8F8F2
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8CCFB0
secondary_paletteKeyColor E5C76B
tertiary_paletteKeyColor E5A5C5
neutral_paletteKeyColor 2D3139
neutral_variant_paletteKeyColor 3A3F4B
background 141B1E
onBackground E8E8E8
surface 232A2D
surfaceDim 0F1416
surfaceBright 3A4145
surfaceContainerLowest 0A0E10
surfaceContainerLow 2A3235
surfaceContainer 2E3538
surfaceContainerHigh 3A4145
surfaceContainerHighest 434A4E
onSurface E8E8E8
surfaceVariant 2E3538
onSurfaceVariant B3B9BE
inverseSurface E8E8E8
inverseOnSurface 141B1E
outline 8A8F94
outlineVariant 3A4145
shadow 000000
scrim 000000
surfaceTint 8CCFB0
primary 8CCFB0
onPrimary 141B1E
primaryContainer 3A4145
onPrimaryContainer 8CCFB0
inversePrimary 6FA98C
secondary E5C76B
onSecondary 141B1E
secondaryContainer 3A4145
onSecondaryContainer E5C76B
tertiary E5A5C5
onTertiary 141B1E
tertiaryContainer 3A4145
onTertiaryContainer E5A5C5
error E57474
onError 141B1E
errorContainer 4A2C2C
onErrorContainer E57474
primaryFixed 8CCFB0
primaryFixedDim 6FA98C
onPrimaryFixed 141B1E
onPrimaryFixedVariant 3A3F4B
secondaryFixed E5C76B
secondaryFixedDim C4A855
onSecondaryFixed 141B1E
onSecondaryFixedVariant 3A3F4B
tertiaryFixed E5A5C5
tertiaryFixedDim C888A4
onTertiaryFixed 141B1E
onTertiaryFixedVariant 3A3F4B
term0 141B1E
term1 E57474
term2 8CCFB0
term3 E5C76B
term4 67B0E8
term5 C47FD5
term6 6CBFBF
term7 E8E8E8
term8 8A8F94
term9 E57474
term10 8CCFB0
term11 E5C76B
term12 67B0E8
term13 C47FD5
term14 6CBFBF
term15 E8E8E8
rosewater E8E8E8
flamingo E5A5C5
pink E5A5C5
mauve C47FD5
red E57474
maroon E57474
peach E59A84
yellow E5C76B
green 8CCFB0
teal 6CBFBF
sky 67B0E8
sapphire 67B0E8
blue 67B0E8
lavender 67B0E8
klink 67B0E8
klinkSelection 67B0E8
kvisited C47FD5
kvisitedSelection C47FD5
knegative E57474
knegativeSelection E57474
kneutral E5C76B
kneutralSelection E5C76B
kpositive 8CCFB0
kpositiveSelection 8CCFB0
text E8E8E8
subtext1 B3B9BE
subtext0 8A8F94
overlay2 7A7F84
overlay1 6A6F74
overlay0 5A5F64
surface2 2E3538
surface1 232A2D
surface0 1A2023
base 141B1E
mantle 0F1416
crust 0A0E10
success 8CCFB0
onSuccess 141B1E
successContainer 3A4145
onSuccessContainer E8E8E8
@@ -0,0 +1,110 @@
primary_paletteKeyColor 7FBBB3
secondary_paletteKeyColor 83C092
tertiary_paletteKeyColor A7C080
neutral_paletteKeyColor 2E383C
neutral_variant_paletteKeyColor 374145
background 1E2326
onBackground D3C6AA
surface 252B2E
surfaceDim 15191C
surfaceBright 343E43
surfaceContainerLowest 11161A
surfaceContainerLow 2A3338
surfaceContainer 2E383C
surfaceContainerHigh 343E43
surfaceContainerHighest 3A4448
onSurface D3C6AA
surfaceVariant 374145
onSurfaceVariant 9DA9A0
inverseSurface D3C6AA
inverseOnSurface 1E2326
outline 859289
outlineVariant 414B50
shadow 000000
scrim 000000
surfaceTint 7FBBB3
primary 7FBBB3
onPrimary 1E2326
primaryContainer 414B50
onPrimaryContainer A7C080
inversePrimary 5A9A8F
secondary 83C092
onSecondary 1E2326
secondaryContainer 414B50
onSecondaryContainer A7C080
tertiary A7C080
onTertiary 1E2326
tertiaryContainer 414B50
onTertiaryContainer D3C6AA
error E67E80
onError 1E2326
errorContainer 4C3743
onErrorContainer E67E80
primaryFixed 7FBBB3
primaryFixedDim 5A9A8F
onPrimaryFixed 1E2326
onPrimaryFixedVariant 374145
secondaryFixed 83C092
secondaryFixedDim 5F8C6F
onSecondaryFixed 1E2326
onSecondaryFixedVariant 374145
tertiaryFixed A7C080
tertiaryFixedDim 7F9D5F
onTertiaryFixed 1E2326
onTertiaryFixedVariant 374145
term0 1E2326
term1 E67E80
term2 A7C080
term3 DBBC7F
term4 7FBBB3
term5 D699B6
term6 83C092
term7 D3C6AA
term8 859289
term9 E67E80
term10 A7C080
term11 DBBC7F
term12 7FBBB3
term13 D699B6
term14 83C092
term15 D3C6AA
rosewater D3C6AA
flamingo D699B6
pink D699B6
mauve D699B6
red E67E80
maroon E67E80
peach E69875
yellow DBBC7F
green A7C080
teal 83C092
sky 7FBBB3
sapphire 7FBBB3
blue 7FBBB3
lavender 7FBBB3
klink 7FBBB3
klinkSelection 7FBBB3
kvisited 83C092
kvisitedSelection 83C092
knegative E67E80
knegativeSelection E67E80
kneutral DBBC7F
kneutralSelection DBBC7F
kpositive A7C080
kpositiveSelection A7C080
text D3C6AA
subtext1 9DA9A0
subtext0 859289
overlay2 7A8478
overlay1 6F7A6F
overlay0 5F6A5F
surface2 2E383C
surface1 252B2E
surface0 1E2326
base 1E2326
mantle 15191C
crust 11161A
success A7C080
onSuccess 1E2326
successContainer 414B50
onSuccessContainer D3C6AA
@@ -0,0 +1,110 @@
primary_paletteKeyColor 7FBBB3
secondary_paletteKeyColor 83C092
tertiary_paletteKeyColor A7C080
neutral_paletteKeyColor 2E383C
neutral_variant_paletteKeyColor 374145
background 2D353B
onBackground D3C6AA
surface 343F44
surfaceDim 232A2E
surfaceBright 475258
surfaceContainerLowest 1E2326
surfaceContainerLow 3B474E
surfaceContainer 3D484D
surfaceContainerHigh 475258
surfaceContainerHighest 4C5258
onSurface D3C6AA
surfaceVariant 3D484D
onSurfaceVariant 9DA9A0
inverseSurface D3C6AA
inverseOnSurface 2D353B
outline 859289
outlineVariant 475258
shadow 000000
scrim 000000
surfaceTint 7FBBB3
primary 7FBBB3
onPrimary 2D353B
primaryContainer 475258
onPrimaryContainer A7C080
inversePrimary 5A9A8F
secondary 83C092
onSecondary 2D353B
secondaryContainer 475258
onSecondaryContainer A7C080
tertiary A7C080
onTertiary 2D353B
tertiaryContainer 475258
onTertiaryContainer D3C6AA
error E67E80
onError 2D353B
errorContainer 4C3743
onErrorContainer E67E80
primaryFixed 7FBBB3
primaryFixedDim 5A9A8F
onPrimaryFixed 2D353B
onPrimaryFixedVariant 374145
secondaryFixed 83C092
secondaryFixedDim 5F8C6F
onSecondaryFixed 2D353B
onSecondaryFixedVariant 374145
tertiaryFixed A7C080
tertiaryFixedDim 7F9D5F
onTertiaryFixed 2D353B
onTertiaryFixedVariant 374145
term0 2D353B
term1 E67E80
term2 A7C080
term3 DBBC7F
term4 7FBBB3
term5 D699B6
term6 83C092
term7 D3C6AA
term8 859289
term9 E67E80
term10 A7C080
term11 DBBC7F
term12 7FBBB3
term13 D699B6
term14 83C092
term15 D3C6AA
rosewater D3C6AA
flamingo D699B6
pink D699B6
mauve D699B6
red E67E80
maroon E67E80
peach E69875
yellow DBBC7F
green A7C080
teal 83C092
sky 7FBBB3
sapphire 7FBBB3
blue 7FBBB3
lavender 7FBBB3
klink 7FBBB3
klinkSelection 7FBBB3
kvisited 83C092
kvisitedSelection 83C092
knegative E67E80
knegativeSelection E67E80
kneutral DBBC7F
kneutralSelection DBBC7F
kpositive A7C080
kpositiveSelection A7C080
text D3C6AA
subtext1 9DA9A0
subtext0 859289
overlay2 7A8478
overlay1 6F7A6F
overlay0 5F6A5F
surface2 3D484D
surface1 343F44
surface0 2D353B
base 2D353B
mantle 232A2E
crust 1E2326
success A7C080
onSuccess 2D353B
successContainer 475258
onSuccessContainer D3C6AA
@@ -0,0 +1,110 @@
primary_paletteKeyColor 3A94C5
secondary_paletteKeyColor 35A77C
tertiary_paletteKeyColor 8DA101
neutral_paletteKeyColor E6E2CC
neutral_variant_paletteKeyColor E0DCC7
background FDF6E3
onBackground 5C6A72
surface F3EAD3
surfaceDim FDF6E3
surfaceBright FFFBF0
surfaceContainerLowest FFFBF0
surfaceContainerLow FDF6E3
surfaceContainer F3EAD3
surfaceContainerHigh EAE4CA
surfaceContainerHighest E0DCC7
onSurface 5C6A72
surfaceVariant EAE4CA
onSurfaceVariant 6F7C84
inverseSurface 5C6A72
inverseOnSurface FDF6E3
outline 939F91
outlineVariant E0DCC7
shadow 000000
scrim 000000
surfaceTint 3A94C5
primary 3A94C5
onPrimary FFFBF0
primaryContainer E0DCC7
onPrimaryContainer 8DA101
inversePrimary 5FAFD7
secondary 35A77C
onSecondary FFFBF0
secondaryContainer E0DCC7
onSecondaryContainer 8DA101
tertiary 8DA101
onTertiary FFFBF0
tertiaryContainer E0DCC7
onTertiaryContainer 5C6A72
error F85552
onError FFFBF0
errorContainer E6E2CC
onErrorContainer F85552
primaryFixed 3A94C5
primaryFixedDim 5FAFD7
onPrimaryFixed FFFBF0
onPrimaryFixedVariant E0DCC7
secondaryFixed 35A77C
secondaryFixedDim 5FC198
onSecondaryFixed FFFBF0
onSecondaryFixedVariant E0DCC7
tertiaryFixed 8DA101
tertiaryFixedDim A7C080
onTertiaryFixed FFFBF0
onTertiaryFixedVariant E0DCC7
term0 5C6A72
term1 F85552
term2 8DA101
term3 DFA000
term4 3A94C5
term5 DF69BA
term6 35A77C
term7 5C6A72
term8 939F91
term9 F85552
term10 8DA101
term11 DFA000
term12 3A94C5
term13 DF69BA
term14 35A77C
term15 5C6A72
rosewater 5C6A72
flamingo DF69BA
pink DF69BA
mauve DF69BA
red F85552
maroon F85552
peach E66868
yellow DFA000
green 8DA101
teal 35A77C
sky 3A94C5
sapphire 3A94C5
blue 3A94C5
lavender 3A94C5
klink 3A94C5
klinkSelection 3A94C5
kvisited 35A77C
kvisitedSelection 35A77C
knegative F85552
knegativeSelection F85552
kneutral DFA000
kneutralSelection DFA000
kpositive 8DA101
kpositiveSelection 8DA101
text 5C6A72
subtext1 6F7C84
subtext0 939F91
overlay2 A6B0A0
overlay1 B9C0B0
overlay0 CCD3C2
surface2 EAE4CA
surface1 F3EAD3
surface0 FDF6E3
base FDF6E3
mantle FFFBF0
crust FFFEF9
success 8DA101
onSuccess FFFBF0
successContainer E0DCC7
onSuccessContainer 5C6A72
@@ -0,0 +1,110 @@
primary_paletteKeyColor 7FBBB3
secondary_paletteKeyColor 83C092
tertiary_paletteKeyColor A7C080
neutral_paletteKeyColor 2E383C
neutral_variant_paletteKeyColor 374145
background 323C41
onBackground D3C6AA
surface 3A454A
surfaceDim 282F34
surfaceBright 4D585D
surfaceContainerLowest 232A2E
surfaceContainerLow 414D54
surfaceContainer 434E53
surfaceContainerHigh 4D585D
surfaceContainerHighest 525C61
onSurface D3C6AA
surfaceVariant 434E53
onSurfaceVariant 9DA9A0
inverseSurface D3C6AA
inverseOnSurface 323C41
outline 859289
outlineVariant 4D585D
shadow 000000
scrim 000000
surfaceTint 7FBBB3
primary 7FBBB3
onPrimary 323C41
primaryContainer 4D585D
onPrimaryContainer A7C080
inversePrimary 5A9A8F
secondary 83C092
onSecondary 323C41
secondaryContainer 4D585D
onSecondaryContainer A7C080
tertiary A7C080
onTertiary 323C41
tertiaryContainer 4D585D
onTertiaryContainer D3C6AA
error E67E80
onError 323C41
errorContainer 4C3743
onErrorContainer E67E80
primaryFixed 7FBBB3
primaryFixedDim 5A9A8F
onPrimaryFixed 323C41
onPrimaryFixedVariant 374145
secondaryFixed 83C092
secondaryFixedDim 5F8C6F
onSecondaryFixed 323C41
onSecondaryFixedVariant 374145
tertiaryFixed A7C080
tertiaryFixedDim 7F9D5F
onTertiaryFixed 323C41
onTertiaryFixedVariant 374145
term0 323C41
term1 E67E80
term2 A7C080
term3 DBBC7F
term4 7FBBB3
term5 D699B6
term6 83C092
term7 D3C6AA
term8 859289
term9 E67E80
term10 A7C080
term11 DBBC7F
term12 7FBBB3
term13 D699B6
term14 83C092
term15 D3C6AA
rosewater D3C6AA
flamingo D699B6
pink D699B6
mauve D699B6
red E67E80
maroon E67E80
peach E69875
yellow DBBC7F
green A7C080
teal 83C092
sky 7FBBB3
sapphire 7FBBB3
blue 7FBBB3
lavender 7FBBB3
klink 7FBBB3
klinkSelection 7FBBB3
kvisited 83C092
kvisitedSelection 83C092
knegative E67E80
knegativeSelection E67E80
kneutral DBBC7F
kneutralSelection DBBC7F
kpositive A7C080
kpositiveSelection A7C080
text D3C6AA
subtext1 9DA9A0
subtext0 859289
overlay2 7A8478
overlay1 6F7A6F
overlay0 5F6A5F
surface2 434E53
surface1 3A454A
surface0 323C41
base 323C41
mantle 282F34
crust 232A2E
success A7C080
onSuccess 323C41
successContainer 4D585D
onSuccessContainer D3C6AA
@@ -0,0 +1,110 @@
primary_paletteKeyColor 2d8194
secondary_paletteKeyColor 607b83
tertiary_paletteKeyColor 8e69a1
neutral_paletteKeyColor 747879
neutral_variant_paletteKeyColor 6f797c
background 101415
onBackground e0e3e4
surface 101415
surfaceDim 101415
surfaceBright 363a3b
surfaceContainerLowest 0b0f10
surfaceContainerLow 181c1d
surfaceContainer 1c2021
surfaceContainerHigh 272b2c
surfaceContainerHighest 323537
onSurface e0e3e4
surfaceVariant 3f484b
onSurfaceVariant bec8cc
inverseSurface e0e3e4
inverseOnSurface 2d3132
outline 889296
outlineVariant 3f484b
shadow 000000
scrim 000000
surfaceTint 85d2e7
primary 85d2e7
onPrimary 003640
primaryContainer 2d8194
onPrimaryContainer 000609
inversePrimary 00687a
secondary aecbd4
onSecondary 18343b
secondaryContainer 304b52
onSecondaryContainer 9dbac3
tertiary e1b7f5
onTertiary 432255
tertiaryContainer a982bc
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed acedff
primaryFixedDim 85d2e7
onPrimaryFixed 001f26
onPrimaryFixedVariant 004e5c
secondaryFixed cae7f1
secondaryFixedDim aecbd4
onSecondaryFixed 011f26
onSecondaryFixedVariant 304b52
tertiaryFixed f5d9ff
tertiaryFixedDim e1b7f5
onTertiaryFixed 2c0b3f
onTertiaryFixedVariant 5b396d
term0 343434
term1 8383ff
term2 40e1df
term3 75fcdd
term4 78b4c1
term5 7aaee9
term6 80d7de
term7 ccdcd6
term8 9aa59f
term9 a29eff
term10 00f6f5
term11 c9fff3
term12 a4c7cd
term13 a2c0f7
term14 87ebf1
term15 ffffff
rosewater f4f0fa
flamingo dfe0f5
pink bde1ff
mauve 73cafa
red 8ab5ff
maroon abbef0
peach a9daac
yellow d0f9f4
green 8af0f7
teal a0ecf9
sky 97e7fb
sapphire 77d4ef
blue 65c9ee
lavender 90d6f7
klink 0093b4
klinkSelection 0093b3
kvisited 0089bf
kvisitedSelection 0089be
knegative 607eff
knegativeSelection 607eff
kneutral 34c359
kneutralSelection 34c359
kpositive 00bbc7
kpositiveSelection 00bbc7
text e0e3e4
subtext1 bec8cc
subtext0 889296
overlay2 767f83
overlay1 646c6f
overlay0 535a5d
surface2 43494b
surface1 33383a
surface0 212627
base 101415
mantle 101415
crust 0f1314
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 7d7a2e
secondary_paletteKeyColor 7b7956
tertiary_paletteKeyColor 57824d
neutral_paletteKeyColor 79776f
neutral_variant_paletteKeyColor 7a7868
background fdf9ef
onBackground 1c1c16
surface fdf9ef
surfaceDim dddad0
surfaceBright fdf9ef
surfaceContainerLowest ffffff
surfaceContainerLow f7f3e9
surfaceContainer f2eee4
surfaceContainerHigh ece8de
surfaceContainerHighest e6e2d8
onSurface 1c1c16
surfaceVariant e7e3d0
onSurfaceVariant 494739
inverseSurface 32312a
inverseOnSurface f5f0e6
outline 777565
outlineVariant cac7b4
shadow 000000
scrim 000000
surfaceTint 636116
primary 636116
onPrimary ffffff
primaryContainer 7a772c
onPrimaryContainer fffbff
inversePrimary ceca75
secondary 62603e
onSecondary ffffff
secondaryContainer e8e4ba
onSecondaryContainer 686644
tertiary 547f4a
onTertiary ffffff
tertiaryContainer 547f4a
onTertiaryContainer ffffff
error ba1a1a
onError ffffff
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed ebe68e
primaryFixedDim ceca75
onPrimaryFixed 1e1d00
onPrimaryFixedVariant 4b4900
secondaryFixed e8e4ba
secondaryFixedDim ccc89f
onSecondaryFixed 1d1c03
onSecondaryFixedVariant 4a4829
tertiaryFixed bff0b0
tertiaryFixedDim a4d396
onTertiaryFixed 002201
onTertiaryFixedVariant 275021
term0 9d9a95
term1 795d00
term2 808606
term3 846e00
term4 948b22
term5 8b6300
term6 6e893e
term7 27211d
term8 0f0f0f
term9 967300
term10 a1a62e
term11 a38918
term12 b9ae43
term13 ac7b00
term14 8daa5b
term15 2e2723
rosewater 937b2d
flamingo 917200
pink a37500
mauve 8f3b00
red 695100
maroon 7d6200
peach 8c7400
yellow 907e00
green 6d7400
teal 587027
sky 4b882e
sapphire 5d7c2e
blue 00664e
lavender 00816c
klink 559652
klinkSelection 559652
kvisited c06b00
kvisitedSelection c06b00
knegative a78300
knegativeSelection a78300
kneutral c7a900
kneutralSelection c7a900
kpositive a0b31d
kpositiveSelection a1b31c
text 1c1c16
subtext1 494739
subtext0 777565
overlay2 878576
overlay1 999788
overlay0 aba89a
surface2 bdbaad
surface1 d1cec2
surface0 e7e3d8
base fdf9ef
mantle f4f1e5
crust efebdf
success 4F6354
onSuccess FFFFFF
successContainer D1E8D5
onSuccessContainer 0C1F13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 28828e
secondary_paletteKeyColor 5f7c81
tertiary_paletteKeyColor 8a6aa3
neutral_paletteKeyColor 747879
neutral_variant_paletteKeyColor 6e797b
background 101415
onBackground e0e3e4
surface 101415
surfaceDim 101415
surfaceBright 363a3b
surfaceContainerLowest 0b0f10
surfaceContainerLow 181c1d
surfaceContainer 1c2021
surfaceContainerHigh 272b2b
surfaceContainerHighest 313536
onSurface e0e3e4
surfaceVariant 3e494a
onSurfaceVariant bec8ca
inverseSurface e0e3e4
inverseOnSurface 2d3132
outline 889394
outlineVariant 3e494a
shadow 000000
scrim 000000
surfaceTint 81d3e0
primary 81d3e0
onPrimary 00363d
primaryContainer 28828e
onPrimaryContainer 000608
inversePrimary 006874
secondary adccd1
onSecondary 173539
secondaryContainer 2f4b50
onSecondaryContainer 9cbac0
tertiary ddb9f7
onTertiary 402357
tertiaryContainer a584bf
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed 9eeffd
primaryFixedDim 81d3e0
onPrimaryFixed 001f24
onPrimaryFixedVariant 004f57
secondaryFixed c9e8ee
secondaryFixedDim adccd1
onSecondaryFixed 001f24
onSecondaryFixedVariant 2f4b50
tertiaryFixed f2daff
tertiaryFixedDim ddb9f7
onTertiaryFixed 290c41
onTertiaryFixedVariant 573a6f
term0 343434
term1 8383ff
term2 44e1d5
term3 75fcdd
term4 76b4bd
term5 7aaee9
term6 80d8d8
term7 ccdcd6
term8 9aa59f
term9 a29eff
term10 13f7ea
term11 c9fff3
term12 a3c7ca
term13 a2c0f7
term14 87ecea
term15 ffffff
rosewater f1f3e5
flamingo dfe0f5
pink bae2ff
mauve 6cccf4
red 8ab5ff
maroon abbef0
peach a9daac
yellow d1faf1
green 8af0f0
teal 9fecf4
sky 94e8f6
sapphire 74d5e9
blue 5fcae8
lavender 8cd7f3
klink 0094ac
klinkSelection 0094ab
kvisited 008bb6
kvisitedSelection 008bb5
knegative 607eff
knegativeSelection 607eff
kneutral 34c359
kneutralSelection 34c359
kpositive 00bcbf
kpositiveSelection 00bcbd
text e0e3e4
subtext1 bec8ca
subtext0 889394
overlay2 768081
overlay1 646c6e
overlay0 535b5c
surface2 434a4b
surface1 33383a
surface0 212627
base 101415
mantle 101415
crust 0f1314
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 857829
secondary_paletteKeyColor 7f7753
tertiary_paletteKeyColor 5f8146
neutral_paletteKeyColor 7a776f
neutral_variant_paletteKeyColor 7b7767
background fef9ee
onBackground 1d1c15
surface fef9ee
surfaceDim dfd9cf
surfaceBright fef9ee
surfaceContainerLowest ffffff
surfaceContainerLow f9f3e9
surfaceContainer f3ede3
surfaceContainerHigh ede8dd
surfaceContainerHighest e7e2d8
onSurface 1d1c15
surfaceVariant e9e2cf
onSurfaceVariant 4a4738
inverseSurface 32302a
inverseOnSurface f6f0e6
outline 797564
outlineVariant ccc6b3
shadow 000000
scrim 000000
surfaceTint 6b5f10
primary 6b5f10
onPrimary ffffff
primaryContainer 827526
onPrimaryContainer fffbff
inversePrimary d7c76f
secondary 655f3c
onSecondary ffffff
secondaryContainer ede3b7
onSecondaryContainer 6c6542
tertiary 5c7e43
onTertiary ffffff
tertiaryContainer 5c7e43
onTertiaryContainer ffffff
error ba1a1a
onError ffffff
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed f4e388
primaryFixedDim d7c76f
onPrimaryFixed 201c00
onPrimaryFixedVariant 514700
secondaryFixed ede3b7
secondaryFixedDim d0c79d
onSecondaryFixed 201c02
onSecondaryFixedVariant 4d4727
tertiaryFixed c7eea8
tertiaryFixedDim acd28e
onTertiaryFixed 0b2000
onTertiaryFixedVariant 304f1a
term0 9d9a95
term1 7e5a00
term2 898300
term3 8a6b00
term4 9c881c
term5 8f6100
term6 768737
term7 27211d
term8 0f0f0e
term9 9c7000
term10 aaa425
term11 aa8616
term12 c1ab3e
term13 b17900
term14 96a854
term15 2e2723
rosewater 98792c
flamingo 976f00
pink a87300
mauve 8f3b00
red 6d4f00
maroon 836000
peach 927100
yellow 967b00
green 757200
teal 5f6f20
sky 4b882e
sapphire 657b26
blue 00664e
lavender 00816c
klink 559652
klinkSelection 559652
kvisited c06b00
kvisitedSelection c06b00
knegative ae8000
knegativeSelection ae8000
kneutral d1a500
kneutralSelection d0a500
kpositive adaf00
kpositiveSelection adaf00
text 1d1c15
subtext1 4a4738
subtext0 797564
overlay2 898575
overlay1 9b9787
overlay0 ada899
surface2 bfbaac
surface1 d2cec1
surface0 e8e3d7
base fef9ee
mantle f6f1e4
crust f0ebde
success 4F6354
onSuccess FFFFFF
successContainer D1E8D5
onSuccessContainer 0C1F13
@@ -0,0 +1,110 @@
primary_paletteKeyColor a46a32
secondary_paletteKeyColor 907156
tertiary_paletteKeyColor 767c33
neutral_paletteKeyColor 7e756f
neutral_variant_paletteKeyColor 847468
background 18120e
onBackground ece0d9
surface 18120e
surfaceDim 18120e
surfaceBright 3f3833
surfaceContainerLowest 120d09
surfaceContainerLow 201a16
surfaceContainer 241e1a
surfaceContainerHigh 2f2924
surfaceContainerHighest 3a332e
onSurface ece0d9
surfaceVariant 52443a
onSurfaceVariant d6c3b5
inverseSurface ece0d9
inverseOnSurface 362f2a
outline 9f8e81
outlineVariant 52443a
shadow 000000
scrim 000000
surfaceTint ffb878
primary ffb878
onPrimary 4c2700
primaryContainer c28349
onPrimaryContainer 0d0400
inversePrimary 87521c
secondary e5bfa1
onSecondary 432b16
secondaryContainer 5c412a
onSecondaryContainer d3ae90
tertiary c6cc7a
onTertiary 2f3300
tertiaryContainer 90964a
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed ffdcc1
primaryFixedDim ffb878
onPrimaryFixed 2e1500
onPrimaryFixedVariant 6b3b04
secondaryFixed ffdcc1
secondaryFixedDim e5bfa1
onSecondaryFixed 2b1704
onSecondaryFixedVariant 5c412a
tertiaryFixed e2e993
tertiaryFixedDim c6cc7a
onTertiaryFixed 1b1d00
onTertiaryFixedVariant 454a03
term0 353433
term1 e17300
term2 ffc071
term3 ffe0c6
term4 b9ab66
term5 ed9562
term6 f4c16d
term7 ebd4c1
term8 b29f91
term9 ff8a20
term10 ffd6a8
term11 fff2e8
term12 d7be91
term13 fcad7e
term14 ffd497
term15 ffffff
rosewater ffeee5
flamingo fedbc7
pink ffd4c1
mauve ffac8e
red fe9c5e
maroon f5af83
peach ffc18f
yellow ffeee1
green ffdaa5
teal ffdb92
sky e1df87
sapphire b3d27e
blue ffa2bd
lavender ffbcbb
klink bf6ba0
klinkSelection bf6ba0
kvisited cc6232
kvisitedSelection cc6232
knegative d66a00
knegativeSelection d66900
kneutral ff8d00
kneutralSelection ff8d06
kpositive de9d00
kpositiveSelection df9d00
text ece0d9
subtext1 d6c3b5
subtext0 9f8e81
overlay2 8b7b70
overlay1 76685e
overlay0 63574e
surface2 51463f
surface1 3f362f
surface0 2b241f
base 18120e
mantle 18120e
crust 17110d
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 887627
secondary_paletteKeyColor 817753
tertiary_paletteKeyColor 628043
neutral_paletteKeyColor 7b776f
neutral_variant_paletteKeyColor 7d7766
background fff9ee
onBackground 1d1b15
surface fff9ee
surfaceDim dfd9cf
surfaceBright fff9ee
surfaceContainerLowest ffffff
surfaceContainerLow f9f3e8
surfaceContainer f3ede3
surfaceContainerHigh eee7dd
surfaceContainerHighest e8e2d8
onSurface 1d1b15
surfaceVariant eae2ce
onSurfaceVariant 4b4738
inverseSurface 333029
inverseOnSurface f6f0e6
outline 7a7464
outlineVariant cdc6b3
shadow 000000
scrim 000000
surfaceTint 6e5d0e
primary 867425
onPrimary ffffff
primaryContainer 887627
onPrimaryContainer 070500
inversePrimary dcc66e
secondary 675e3c
onSecondary ffffff
secondaryContainer efe2b7
onSecondaryContainer 6d6441
tertiary 5f7d41
onTertiary ffffff
tertiaryContainer 5f7d41
onTertiaryContainer ffffff
error ba1a1a
onError ffffff
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed f9e287
primaryFixedDim dcc66e
onPrimaryFixed 221b00
onPrimaryFixedVariant 544600
secondaryFixed efe2b7
secondaryFixedDim d3c69c
onSecondaryFixed 211b02
onSecondaryFixedVariant 4f4726
tertiaryFixed cbeea5
tertiaryFixedDim b0d18b
onTertiaryFixed 0e2000
onTertiaryFixedVariant 334e17
term0 9e9a95
term1 815900
term2 8d8200
term3 8d6a00
term4 a0871a
term5 926000
term6 7a8734
term7 27211d
term8 0f0f0e
term9 9f6f00
term10 afa220
term11 ae8516
term12 c5aa3c
term13 b47700
term14 9aa751
term15 2e2723
rosewater 9b782c
flamingo 9a6e00
pink ab7100
mauve 8f3b00
red 6f4e00
maroon 855f00
peach 957000
yellow 9a7a00
green 797100
teal 636e1c
sky 4b882e
sapphire 6a7a22
blue 00664e
lavender c2484e
klink 559652
klinkSelection 559652
kvisited c06b00
kvisitedSelection c06b00
knegative b27f00
knegativeSelection b27f00
kneutral d5a300
kneutralSelection d5a300
kpositive b3ae00
kpositiveSelection b3ae00
text 1d1b15
subtext1 4b4738
subtext0 7a7464
overlay2 8a8475
overlay1 9c9687
overlay0 aea899
surface2 c0baac
surface1 d3cdc0
surface0 e9e3d7
base fff9ee
mantle f7f1e4
crust f1ebde
success 4F6354
onSuccess FFFFFF
successContainer D1E8D5
onSuccessContainer 0C1F13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 88C0D0
secondary_paletteKeyColor 81A1C1
tertiary_paletteKeyColor 5E81AC
neutral_paletteKeyColor 3B4252
neutral_variant_paletteKeyColor 434C5E
background 2E3440
onBackground ECEFF4
surface 3B4252
surfaceDim 242933
surfaceBright 4C566A
surfaceContainerLowest 1F232C
surfaceContainerLow 424A5E
surfaceContainer 434C5E
surfaceContainerHigh 4C566A
surfaceContainerHighest 55606E
onSurface ECEFF4
surfaceVariant 434C5E
onSurfaceVariant D8DEE9
inverseSurface ECEFF4
inverseOnSurface 2E3440
outline 616E88
outlineVariant 4C566A
shadow 000000
scrim 000000
surfaceTint 88C0D0
primary 88C0D0
onPrimary 2E3440
primaryContainer 4C566A
onPrimaryContainer 88C0D0
inversePrimary 6FA3B3
secondary 81A1C1
onSecondary 2E3440
secondaryContainer 4C566A
onSecondaryContainer 81A1C1
tertiary 5E81AC
onTertiary 2E3440
tertiaryContainer 4C566A
onTertiaryContainer 5E81AC
error BF616A
onError 2E3440
errorContainer 4C3743
onErrorContainer BF616A
primaryFixed 88C0D0
primaryFixedDim 6FA3B3
onPrimaryFixed 2E3440
onPrimaryFixedVariant 434C5E
secondaryFixed 81A1C1
secondaryFixedDim 6A84A4
onSecondaryFixed 2E3440
onSecondaryFixedVariant 434C5E
tertiaryFixed 5E81AC
tertiaryFixedDim 4A6A8F
onTertiaryFixed 2E3440
onTertiaryFixedVariant 434C5E
term0 3B4252
term1 BF616A
term2 A3BE8C
term3 EBCB8B
term4 81A1C1
term5 B48EAD
term6 88C0D0
term7 E5E9F0
term8 4C566A
term9 BF616A
term10 A3BE8C
term11 EBCB8B
term12 81A1C1
term13 B48EAD
term14 8FBCBB
term15 ECEFF4
rosewater ECEFF4
flamingo B48EAD
pink B48EAD
mauve B48EAD
red BF616A
maroon BF616A
peach D08770
yellow EBCB8B
green A3BE8C
teal 8FBCBB
sky 88C0D0
sapphire 81A1C1
blue 5E81AC
lavender 5E81AC
klink 88C0D0
klinkSelection 88C0D0
kvisited 81A1C1
kvisitedSelection 81A1C1
knegative BF616A
knegativeSelection BF616A
kneutral EBCB8B
kneutralSelection EBCB8B
kpositive A3BE8C
kpositiveSelection A3BE8C
text ECEFF4
subtext1 D8DEE9
subtext0 616E88
overlay2 5A677E
overlay1 4F5B73
overlay0 434C5E
surface2 434C5E
surface1 3B4252
surface0 2E3440
base 2E3440
mantle 242933
crust 1F232C
success A3BE8C
onSuccess 2E3440
successContainer 4C566A
onSuccessContainer ECEFF4
@@ -0,0 +1,110 @@
primary_paletteKeyColor 5a77ab
secondary_paletteKeyColor 6d778e
tertiary_paletteKeyColor 966699
neutral_paletteKeyColor 76777b
neutral_variant_paletteKeyColor 747780
background 121317
onBackground e3e2e7
surface 121317
surfaceDim 121317
surfaceBright 38393d
surfaceContainerLowest 0d0e11
surfaceContainerLow 1a1b1f
surfaceContainer 1e2023
surfaceContainerHigh 292a2e
surfaceContainerHighest 343538
onSurface e3e2e7
surfaceVariant 43474f
onSurfaceVariant c4c6d0
inverseSurface e3e2e7
inverseOnSurface 2f3034
outline 8e909a
outlineVariant 43474f
shadow 000000
scrim 000000
surfaceTint aac7ff
primary aac7ff
onPrimary 0b3060
primaryContainer 5a77ab
onPrimaryContainer ffffff
inversePrimary 415e91
secondary bcc7df
onSecondary 263144
secondaryContainer 3d475b
onSecondaryContainer abb5ce
tertiary ecb4ed
onTertiary 49204e
tertiaryContainer b280b4
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed d7e3ff
primaryFixedDim aac7ff
onPrimaryFixed 001b3e
onPrimaryFixedVariant 284777
secondaryFixed d8e2fc
secondaryFixedDim bcc7df
onSecondaryFixed 111c2e
onSecondaryFixedVariant 3d475b
tertiaryFixed ffd6fd
tertiaryFixedDim ecb4ed
onTertiaryFixed 310938
onTertiaryFixedVariant 623766
term0 353434
term1 8881ff
term2 44def5
term3 ffdcf2
term4 8badd4
term5 9ea5ef
term6 95d0fb
term7 e8d3de
term8 ac9fa9
term9 a39eff
term10 89ecff
term11 c9fff3
term12 aec3da
term13 b7baf8
term14 b7e0ff
term15 ffffff
rosewater f4f0fa
flamingo e2dff5
pink d7dbff
mauve abbeff
red a9adff
maroon b9baf1
peach e0c2f9
yellow d0f9f4
green c3e4ff
teal c8e2ff
sky c4ddff
sapphire a4caff
blue 9abdff
lavender b7ccff
klink 5689ce
klinkSelection 5689ce
kvisited 5f7bdd
kvisitedSelection 5f7bdd
knegative 7877ff
knegativeSelection 7878ff
kneutral c794ff
kneutralSelection c794ff
kpositive 13b3ff
kpositiveSelection 0db3ff
text e3e2e7
subtext1 c4c6d0
subtext0 8e909a
overlay2 7c7d86
overlay1 686a72
overlay0 575960
surface2 46484e
surface1 36373d
surface0 24252a
base 121317
mantle 121317
crust 111216
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 5878ab
secondary_paletteKeyColor 6c778d
tertiary_paletteKeyColor 966799
neutral_paletteKeyColor 76777b
neutral_variant_paletteKeyColor 747780
background 121317
onBackground e3e2e7
surface 121317
surfaceDim 121317
surfaceBright 38393d
surfaceContainerLowest 0d0e11
surfaceContainerLow 1a1c1f
surfaceContainer 1e2023
surfaceContainerHigh 292a2d
surfaceContainerHighest 333538
onSurface e3e2e7
surfaceVariant 43474f
onSurfaceVariant c3c6d0
inverseSurface e3e2e7
inverseOnSurface 2f3034
outline 8d919a
outlineVariant 43474f
shadow 000000
scrim 000000
surfaceTint a8c8ff
primary a8c8ff
onPrimary 05305f
primaryContainer 7292c6
onPrimaryContainer 000513
inversePrimary 3e5f90
secondary bbc7df
onSecondary 253144
secondaryContainer 3c475b
onSecondaryContainer aab5cd
tertiary ebb5ec
onTertiary 48204e
tertiaryContainer b180b4
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed d5e3ff
primaryFixedDim a8c8ff
onPrimaryFixed 001b3c
onPrimaryFixedVariant 254777
secondaryFixed d7e3fc
secondaryFixedDim bbc7df
onSecondaryFixed 101c2e
onSecondaryFixedVariant 3c475b
tertiaryFixed ffd6fe
tertiaryFixedDim ebb5ec
onTertiaryFixed 310937
onTertiaryFixedVariant 613766
term0 343434
term1 8483ff
term2 44def5
term3 ffdcf2
term4 8aaed3
term5 9ca5ef
term6 94d0fa
term7 e8d3de
term8 ac9fa9
term9 a29eff
term10 89ecff
term11 c9fff3
term12 adc4d9
term13 b5baf8
term14 b6e1ff
term15 ffffff
rosewater f4f0fa
flamingo e2e0f5
pink d6dbff
mauve a9bfff
red a6aeff
maroon b7baf1
peach e0c2f9
yellow d0f9f4
green c1e4ff
teal c7e3ff
sky c2deff
sapphire a1caff
blue 97beff
lavender b5cdff
klink 5389ce
klinkSelection 5489ce
kvisited 5b7cdd
kvisitedSelection 5c7bdd
knegative 7479ff
knegativeSelection 7578ff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b4fd
kpositiveSelection 00b4fe
text e3e2e7
subtext1 c3c6d0
subtext0 8d919a
overlay2 7b7e86
overlay1 686b72
overlay0 575960
surface2 46484e
surface1 36373d
surface0 24252a
base 121317
mantle 121317
crust 111216
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8b7526
secondary_paletteKeyColor 827652
tertiary_paletteKeyColor 667f40
neutral_paletteKeyColor 7b776f
neutral_variant_paletteKeyColor 7e7766
background fff8f0
onBackground 1e1b15
surface fff8f0
surfaceDim e0d9cf
surfaceBright fff8f0
surfaceContainerLowest ffffff
surfaceContainerLow faf3e8
surfaceContainer f4ede3
surfaceContainerHigh eee7dd
surfaceContainerHighest e8e2d7
onSurface 1e1b15
surfaceVariant ebe2ce
onSurfaceVariant 4c4638
inverseSurface 333029
inverseOnSurface f7f0e5
outline 7b7464
outlineVariant cec6b3
shadow 000000
scrim 000000
surfaceTint 715c0d
primary 897324
onPrimary ffffff
primaryContainer 8b7526
onPrimaryContainer 070500
inversePrimary e0c56d
secondary 695e3b
onSecondary ffffff
secondaryContainer f1e2b6
onSecondaryContainer 6f6441
tertiary 647d3e
onTertiary ffffff
tertiaryContainer 647d3e
onTertiaryContainer ffffff
error ba1a1a
onError ffffff
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed fde186
primaryFixedDim e0c56d
onPrimaryFixed 231b00
onPrimaryFixedVariant 564500
secondaryFixed f1e2b6
secondaryFixedDim d5c69c
onSecondaryFixed 221b02
onSecondaryFixedVariant 504626
tertiaryFixed d0eda2
tertiaryFixedDim b4d088
onTertiaryFixed 121f00
onTertiaryFixedVariant 374d14
term0 9e9a95
term1 835800
term2 908100
term3 906900
term4 a38618
term5 945e00
term6 7d8631
term7 27211d
term8 100f0e
term9 a26e00
term10 b3a11d
term11 b08416
term12 c8a93b
term13 b77600
term14 9da74e
term15 2e2723
rosewater 9d772d
flamingo 9c6d00
pink ae7000
mauve 8f3b00
red 714d00
maroon 885e00
peach 986f00
yellow 9d7900
green 7b7000
teal 666d19
sky 4b882e
sapphire 6d791e
blue 00664e
lavender c2484e
klink 559652
klinkSelection 559652
kvisited c06b00
kvisitedSelection c06b00
knegative b47d00
knegativeSelection b57d00
kneutral d8a200
kneutralSelection d9a200
kpositive b7ac00
kpositiveSelection b8ac00
text 1e1b15
subtext1 4c4638
subtext0 7b7464
overlay2 8b8475
overlay1 9d9688
overlay0 aea79a
surface2 c0b9ae
surface1 d4cdc2
surface0 e9e2d9
base fff8f0
mantle f7f0e6
crust f2eae0
success 4F6354
onSuccess FFFFFF
successContainer D1E8D5
onSuccessContainer 0C1F13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 786fab
secondary_paletteKeyColor 79748e
tertiary_paletteKeyColor a1638a
neutral_paletteKeyColor 79767b
neutral_variant_paletteKeyColor 787580
background 141317
onBackground e5e1e7
surface 141317
surfaceDim 141317
surfaceBright 3a383d
surfaceContainerLowest 0e0e11
surfaceContainerLow 1c1b1f
surfaceContainer 201f23
surfaceContainerHigh 2b292e
surfaceContainerHighest 363438
onSurface e5e1e7
surfaceVariant 48454f
onSurfaceVariant c9c4d0
inverseSurface e5e1e7
inverseOnSurface 313034
outline 938f9a
outlineVariant 48454f
shadow 000000
scrim 000000
surfaceTint c9bfff
primary c9bfff
onPrimary 31285f
primaryContainer 786fab
onPrimaryContainer ffffff
inversePrimary 5f5791
secondary c9c3e0
onSecondary 312e44
secondaryContainer 48445b
onSecondaryContainer b7b1ce
tertiary f9b1dc
onTertiary 501d41
tertiaryContainer be7ca5
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed e5deff
primaryFixedDim c9bfff
onPrimaryFixed 1b1149
onPrimaryFixedVariant 473f77
secondaryFixed e5dffc
secondaryFixedDim c9c3e0
onSecondaryFixed 1c192e
onSecondaryFixedVariant 48445b
tertiaryFixed ffd8ec
tertiaryFixedDim f9b1dc
onTertiaryFixed 37072b
onTertiaryFixedVariant 6a3458
term0 353434
term1 b96cff
term2 ffbac2
term3 ffdcf2
term4 9da8d8
term5 bb9de8
term6 9dceff
term7 e8d3de
term8 ac9fa9
term9 cb8fff
term10 ffd2d5
term11 fff0f6
term12 b7c0dd
term13 cfb3f2
term14 bae0ff
term15 ffffff
rosewater f8eff8
flamingo ebddf2
pink e6d6ff
mauve c6b6ff
red c9a3fa
maroon ceb4eb
peach e5c1f6
yellow ffecf3
green c8e3ff
teal d7dfff
sky d3d9ff
sapphire bdc3ff
blue b7b6ff
lavender ccc6ff
klink 7b80d1
klinkSelection 7b80d1
kvisited 8a6fd7
kvisitedSelection 8a6fd7
knegative ac62fa
knegativeSelection ac62fa
kneutral d48dff
kneutralSelection d48eff
kpositive 60adff
kpositiveSelection 60adff
text e5e1e7
subtext1 c9c4d0
subtext0 938f9a
overlay2 807c86
overlay1 6c6972
overlay0 5b5860
surface2 4a474e
surface1 39373d
surface0 262529
base 141317
mantle 141317
crust 131216
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 7670ac
secondary_paletteKeyColor 78748e
tertiary_paletteKeyColor a1638b
neutral_paletteKeyColor 78767b
neutral_variant_paletteKeyColor 787680
background 141317
onBackground e5e1e7
surface 141317
surfaceDim 141317
surfaceBright 3a383d
surfaceContainerLowest 0e0e11
surfaceContainerLow 1c1b1f
surfaceContainer 201f23
surfaceContainerHigh 2a292e
surfaceContainerHighest 353438
onSurface e5e1e7
surfaceVariant 47454f
onSurfaceVariant c9c5d0
inverseSurface e5e1e7
inverseOnSurface 313034
outline 928f9a
outlineVariant 47454f
shadow 000000
scrim 000000
surfaceTint c6bfff
primary c6bfff
onPrimary 2e2960
primaryContainer 7670ac
onPrimaryContainer 040025
inversePrimary 5d5791
secondary c8c3e0
onSecondary 302e44
secondaryContainer 47445c
onSecondaryContainer b6b2ce
tertiary f9b1dd
onTertiary 501d41
tertiaryContainer be7ca6
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed e4dfff
primaryFixedDim c6bfff
onPrimaryFixed 19124a
onPrimaryFixedVariant 454078
secondaryFixed e4dffd
secondaryFixedDim c8c3e0
onSecondaryFixed 1b192e
onSecondaryFixedVariant 47445c
tertiaryFixed ffd8ed
tertiaryFixedDim f9b1dd
onTertiaryFixed 37072b
onTertiaryFixedVariant 6a3459
term0 353434
term1 b56eff
term2 ffbac2
term3 ffdcf2
term4 9ca9d8
term5 b89de9
term6 9dceff
term7 e8d3de
term8 ac9fa9
term9 c791ff
term10 89ecff
term11 fff0f6
term12 b7c0dd
term13 cdb4f3
term14 bae0ff
term15 ffffff
rosewater f8eff8
flamingo eaddf3
pink e4d7ff
mauve c4b7ff
red c6a4fb
maroon ccb4eb
peach e4c1f7
yellow ffecf3
green c8e3ff
teal d5dfff
sky d2d9ff
sapphire bbc4ff
blue b5b6ff
lavender cbc7ff
klink 7880d1
klinkSelection 7881d1
kvisited 8770d8
kvisitedSelection 8770d8
knegative a964fd
knegativeSelection a864fd
kneutral d08fff
kneutralSelection d090ff
kpositive 60adff
kpositiveSelection 60adff
text e5e1e7
subtext1 c9c5d0
subtext0 928f9a
overlay2 7f7c86
overlay1 6c6972
overlay0 5a5860
surface2 49474e
surface1 38373c
surface0 262529
base 141317
mantle 141317
crust 131216
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 6f72ac
secondary_paletteKeyColor 75758e
tertiary_paletteKeyColor 9d648f
neutral_paletteKeyColor 78767b
neutral_variant_paletteKeyColor 777680
background 131317
onBackground e5e1e7
surface 131317
surfaceDim 131317
surfaceBright 39393d
surfaceContainerLowest 0e0e11
surfaceContainerLow 1b1b1f
surfaceContainer 1f1f23
surfaceContainerHigh 2a292e
surfaceContainerHighest 353438
onSurface e5e1e7
surfaceVariant 46464f
onSurfaceVariant c7c5d1
inverseSurface e5e1e7
inverseOnSurface 303034
outline 918f9a
outlineVariant 46464f
shadow 000000
scrim 000000
surfaceTint bfc1ff
primary bfc1ff
onPrimary 282b60
primaryContainer 6f72ac
onPrimaryContainer 000028
inversePrimary 565992
secondary c5c4e0
onSecondary 2e2f44
secondaryContainer 44455c
onSecondaryContainer b3b3ce
tertiary f4b2e2
onTertiary 4e1e45
tertiaryContainer ba7eaa
onTertiaryContainer 000000
error ffb4ab
onError 690005
errorContainer 93000a
onErrorContainer ffdad6
primaryFixed e0e0ff
primaryFixedDim bfc1ff
onPrimaryFixed 12144a
onPrimaryFixedVariant 3e4278
secondaryFixed e1e0fd
secondaryFixedDim c5c4e0
onSecondaryFixed 191a2e
onSecondaryFixedVariant 44455c
tertiaryFixed ffd7f1
tertiaryFixedDim f4b2e2
onTertiaryFixed 35082f
onTertiaryFixedVariant 67355d
term0 353434
term1 a875ff
term2 44def5
term3 ffdcf2
term4 97aad7
term5 b29feb
term6 9dceff
term7 e8d3de
term8 ac9fa9
term9 bd95ff
term10 89ecff
term11 fff0f6
term12 b4c1dc
term13 c8b5f5
term14 bae0ff
term15 ffffff
rosewater f7eff9
flamingo e8def3
pink e1d8ff
mauve bdb9ff
red bfa6fe
maroon c7b6ed
peach e0c2f9
yellow ffecf3
green c8e3ff
teal d2e0ff
sky cedaff
sapphire b5c5ff
blue aeb8ff
lavender c6c8ff
klink 7083d2
klinkSelection 6f83d2
kvisited 7e73db
kvisitedSelection 7d73db
knegative 9d69ff
knegativeSelection 9b6aff
kneutral c794ff
kneutralSelection c794ff
kpositive 60adff
kpositiveSelection 60adff
text e5e1e7
subtext1 c7c5d1
subtext0 918f9a
overlay2 7e7c86
overlay1 6b6972
overlay0 595860
surface2 48474e
surface1 37373d
surface0 25252a
base 131317
mantle 131317
crust 121216
success B5CCBA
onSuccess 213528
successContainer 374B3E
onSuccessContainer D1E9D6
@@ -0,0 +1,110 @@
primary_paletteKeyColor 268BD2
secondary_paletteKeyColor 2AA198
tertiary_paletteKeyColor 6C71C4
neutral_paletteKeyColor 002B36
neutral_variant_paletteKeyColor 073642
background 002B36
onBackground FDF6E3
surface 073642
surfaceDim 001F29
surfaceBright 0D4250
surfaceContainerLowest 00151D
surfaceContainerLow 0A404E
surfaceContainer 094B59
surfaceContainerHigh 0D4250
surfaceContainerHighest 11505E
onSurface FDF6E3
surfaceVariant 094B59
onSurfaceVariant 93A1A1
inverseSurface FDF6E3
inverseOnSurface 002B36
outline 586E75
outlineVariant 0D4250
shadow 000000
scrim 000000
surfaceTint 268BD2
primary 268BD2
onPrimary 002B36
primaryContainer 0D4250
onPrimaryContainer 268BD2
inversePrimary 2075B2
secondary 2AA198
onSecondary 002B36
secondaryContainer 0D4250
onSecondaryContainer 2AA198
tertiary 6C71C4
onTertiary 002B36
tertiaryContainer 0D4250
onTertiaryContainer 6C71C4
error DC322F
onError 002B36
errorContainer 4C3743
onErrorContainer DC322F
primaryFixed 268BD2
primaryFixedDim 2075B2
onPrimaryFixed 002B36
onPrimaryFixedVariant 094B59
secondaryFixed 2AA198
secondaryFixedDim 228178
onSecondaryFixed 002B36
onSecondaryFixedVariant 094B59
tertiaryFixed 6C71C4
tertiaryFixedDim 5C61A4
onTertiaryFixed 002B36
onTertiaryFixedVariant 094B59
term0 002B36
term1 DC322F
term2 859900
term3 B58900
term4 268BD2
term5 D33682
term6 2AA198
term7 EEE8D5
term8 586E75
term9 CB4B16
term10 859900
term11 B58900
term12 268BD2
term13 6C71C4
term14 2AA198
term15 FDF6E3
rosewater FDF6E3
flamingo EEE8D5
pink D33682
mauve 6C71C4
red DC322F
maroon CB4B16
peach CB4B16
yellow B58900
green 859900
teal 2AA198
sky 2AA198
sapphire 268BD2
blue 268BD2
lavender 6C71C4
klink 268BD2
klinkSelection 268BD2
kvisited 6C71C4
kvisitedSelection 6C71C4
knegative DC322F
knegativeSelection DC322F
kneutral B58900
kneutralSelection B58900
kpositive 859900
kpositiveSelection 859900
text FDF6E3
subtext1 93A1A1
subtext0 839496
overlay2 657B83
overlay1 586E75
overlay0 073642
surface2 094B59
surface1 073642
surface0 002B36
base 002B36
mantle 001F29
crust 00151D
success 859900
onSuccess 002B36
successContainer 0D4250
onSuccessContainer FDF6E3
@@ -0,0 +1,110 @@
primary_paletteKeyColor 7AA2F7
secondary_paletteKeyColor 9ECE6A
tertiary_paletteKeyColor BB9AF7
neutral_paletteKeyColor 1A1B26
neutral_variant_paletteKeyColor 292E42
background 1A1B26
onBackground C0CAF5
surface 24283B
surfaceDim 16161E
surfaceBright 3B4261
surfaceContainerLowest 0F0F14
surfaceContainerLow 2B3048
surfaceContainer 2A2F41
surfaceContainerHigh 3B4261
surfaceContainerHighest 414868
onSurface C0CAF5
surfaceVariant 2A2F41
onSurfaceVariant A9B1D6
inverseSurface C0CAF5
inverseOnSurface 1A1B26
outline 565F89
outlineVariant 3B4261
shadow 000000
scrim 000000
surfaceTint 7AA2F7
primary 7AA2F7
onPrimary 1A1B26
primaryContainer 3B4261
onPrimaryContainer 7AA2F7
inversePrimary 5A7FD7
secondary 9ECE6A
onSecondary 1A1B26
secondaryContainer 3B4261
onSecondaryContainer 9ECE6A
tertiary BB9AF7
onTertiary 1A1B26
tertiaryContainer 3B4261
onTertiaryContainer BB9AF7
error F7768E
onError 1A1B26
errorContainer 4C3743
onErrorContainer F7768E
primaryFixed 7AA2F7
primaryFixedDim 5A7FD7
onPrimaryFixed 1A1B26
onPrimaryFixedVariant 2A2F41
secondaryFixed 9ECE6A
secondaryFixedDim 7EAE4A
onSecondaryFixed 1A1B26
onSecondaryFixedVariant 2A2F41
tertiaryFixed BB9AF7
tertiaryFixedDim 9B7AD7
onTertiaryFixed 1A1B26
onTertiaryFixedVariant 2A2F41
term0 1A1B26
term1 F7768E
term2 9ECE6A
term3 E0AF68
term4 7AA2F7
term5 BB9AF7
term6 7DCFFF
term7 C0CAF5
term8 565F89
term9 F7768E
term10 9ECE6A
term11 E0AF68
term12 7AA2F7
term13 BB9AF7
term14 7DCFFF
term15 C0CAF5
rosewater C0CAF5
flamingo BB9AF7
pink F7768E
mauve BB9AF7
red F7768E
maroon E0AF68
peach FF9E64
yellow E0AF68
green 9ECE6A
teal 1ABC9C
sky 7DCFFF
sapphire 2AC3DE
blue 7AA2F7
lavender 7DCFFF
klink 7AA2F7
klinkSelection 7AA2F7
kvisited BB9AF7
kvisitedSelection BB9AF7
knegative F7768E
knegativeSelection F7768E
kneutral E0AF68
kneutralSelection E0AF68
kpositive 9ECE6A
kpositiveSelection 9ECE6A
text C0CAF5
subtext1 A9B1D6
subtext0 9AA5CE
overlay2 787C99
overlay1 696D85
overlay0 565F89
surface2 2A2F41
surface1 24283B
surface0 1A1B26
base 1A1B26
mantle 16161E
crust 0F0F14
success 9ECE6A
onSuccess 1A1B26
successContainer 3B4261
onSuccessContainer C0CAF5
+139
View File
@@ -0,0 +1,139 @@
from typing import Annotated, Optional
import typer
import json
from zshell.utils.schemepalettes import PRESETS
from pathlib import Path
from PIL import Image
from materialyoucolor.quantize import QuantizeCelebi
from materialyoucolor.score.score import Score
from materialyoucolor.dynamiccolor.material_dynamic_colors import MaterialDynamicColors
from materialyoucolor.hct.hct import Hct
app = typer.Typer()
@app.command()
def generate(
# image inputs (optional - used for image mode)
image_path: Optional[Path] = typer.Option(
None, help="Path to source image. Required for image mode."),
thumbnail_path: Optional[Path] = typer.Option(
Path("thumb.jpg"), help="Path to temporary thumbnail (image mode)."),
scheme: Optional[str] = typer.Option(
"fruit-salad", help="Color scheme algorithm to use for image mode. Ignored in preset mode."),
# preset inputs (optional - used for preset mode)
preset: Optional[str] = typer.Option(
None, help="Name of a premade scheme in this format: <preset_name>:<preset_flavor>"),
mode: str = typer.Option(
"dark", help="Mode of the preset scheme (dark or light)."),
# output (required)
output: Path = typer.Option(..., help="Output JSON path.")
):
if preset is None and image_path is None:
raise typer.BadParameter(
"Either --image-path or --preset must be provided.")
if preset is not None and image_path is not None:
raise typer.BadParameter(
"Use either --image-path or --preset, not both.")
match scheme:
case "fruit-salad":
from materialyoucolor.scheme.scheme_fruit_salad import SchemeFruitSalad as Scheme
case 'expressive':
from materialyoucolor.scheme.scheme_expressive import SchemeExpressive as Scheme
case 'monochrome':
from materialyoucolor.scheme.scheme_monochrome import SchemeMonochrome as Scheme
case 'rainbow':
from materialyoucolor.scheme.scheme_rainbow import SchemeRainbow as Scheme
case 'tonal-spot':
from materialyoucolor.scheme.scheme_tonal_spot import SchemeTonalSpot as Scheme
case 'neutral':
from materialyoucolor.scheme.scheme_neutral import SchemeNeutral as Scheme
case 'fidelity':
from materialyoucolor.scheme.scheme_fidelity import SchemeFidelity as Scheme
case 'content':
from materialyoucolor.scheme.scheme_content import SchemeContent as Scheme
case 'vibrant':
from materialyoucolor.scheme.scheme_vibrant import SchemeVibrant as Scheme
case _:
from materialyoucolor.scheme.scheme_fruit_salad import SchemeFruitSalad as Scheme
def generate_thumbnail(image_path, thumbnail_path, size=(128, 128)):
thumbnail_file = Path(thumbnail_path)
image = Image.open(image_path)
image = image.convert("RGB")
image.thumbnail(size, Image.NEAREST)
thumbnail_file.parent.mkdir(parents=True, exist_ok=True)
image.save(thumbnail_path, "JPEG")
def seed_from_image(image_path: Path) -> Hct:
image = Image.open(image_path)
pixel_len = image.width * image.height
image_data = image.getdata()
quality = 1
pixel_array = [image_data[_] for _ in range(0, pixel_len, quality)]
result = QuantizeCelebi(pixel_array, 128)
return Hct.from_int(Score.score(result)[0])
def seed_from_preset(name: str) -> Hct:
try:
return PRESETS[name].primary
except KeyError:
raise typer.BadParameter(
f"Preset '{name}' not found. Available presets: {', '.join(PRESETS.keys())}")
def generate_color_scheme(seed: Hct, mode: str) -> dict[str, str]:
is_dark = mode.lower() == "dark"
scheme = Scheme(
seed,
is_dark,
0.0
)
color_dict = {}
for color in vars(MaterialDynamicColors).keys():
color_name = getattr(MaterialDynamicColors, color)
if hasattr(color_name, "get_hct"):
color_int = color_name.get_hct(scheme).to_int()
color_dict[color] = int_to_hex(color_int)
return color_dict
def int_to_hex(argb_int):
return "#{:06X}".format(argb_int & 0xFFFFFF)
try:
if preset:
seed = seed_from_preset(preset)
colors = generate_color_scheme(seed, mode)
name, flavor = preset.split(":")
else:
generate_thumbnail(image_path, str(thumbnail_path))
seed = seed_from_image(thumbnail_path)
colors = generate_color_scheme(seed, mode)
name = "dynamic"
flavor = "default"
output_dict = {
"name": name,
"flavor": flavor,
"mode": mode,
"variant": scheme,
"colors": colors
}
output.parent.mkdir(parents=True, exist_ok=True)
with open(output, "w") as f:
json.dump(output_dict, f, indent=4)
except Exception as e:
print(f"Error: {e}")
# with open(output, "w") as f:
# f.write(f"Error: {e}")
+18
View File
@@ -0,0 +1,18 @@
import subprocess
import typer
args = ["qs", "-c", "zshell"]
app = typer.Typer()
@app.command()
def start():
subprocess.run(args + ["ipc"] + ["call"] +
["picker"] + ["open"], check=True)
@app.command()
def start_freeze():
subprocess.run(args + ["ipc"] + ["call"] +
["picker"] + ["openFreeze"], check=True)
+37
View File
@@ -0,0 +1,37 @@
import subprocess
import typer
args = ["qs", "-c", "zshell"]
app = typer.Typer()
@app.command()
def kill():
subprocess.run(args + ["kill"], check=True)
@app.command()
def start(no_daemon: bool = False):
subprocess.run(args + ["-n"] + ([] if no_daemon else ["-d"]), check=True)
@app.command()
def show():
subprocess.run(args + ["ipc"] + ["show"], check=True)
@app.command()
def log():
subprocess.run(args + ["log"], check=True)
@app.command()
def lock():
subprocess.run(args + ["ipc"] + ["call"] + ["lock"] + ["lock"], check=True)
@app.command()
def call(target: str, method: str, method_args: list[str] = typer.Argument(None)):
subprocess.run(args + ["ipc"] + ["call"] + [target] +
[method] + method_args, check=True)
+40
View File
@@ -0,0 +1,40 @@
import subprocess
import typer
from typing import Annotated
from PIL import Image, ImageFilter
from pathlib import Path
args = ["qs", "-c", "zshell"]
app = typer.Typer()
@app.command()
def set(wallpaper: Path):
subprocess.run(args + ["ipc"] + ["call"] +
["wallpaper"] + ["set"] + [wallpaper], check=True)
@app.command()
def lockscreen(
input_image: Annotated[
Path,
typer.Option(),
],
output_path: Annotated[
Path,
typer.Option(),
],
blur_amount: int = 20
):
img = Image.open(input_image)
size = img.size
if (size[0] < 3840 or size[1] < 2160):
img = img.resize((size[0] // 2, size[1] // 2), Image.NEAREST)
else:
img = img.resize((size[0] // 4, size[1] // 4), Image.NEAREST)
img = img.filter(ImageFilter.GaussianBlur(blur_amount))
img.save(output_path, "PNG")
+30
View File
@@ -0,0 +1,30 @@
from dataclasses import dataclass
from materialyoucolor.hct.hct import Hct
from typing import Mapping
@dataclass(frozen=True)
class SeedPalette:
primary: Hct
secondary: Hct
tertiary: Hct
neutral: Hct
neutral_variant: Hct
error: Hct | None = None
def hex_to_hct(hex_: str) -> Hct:
return Hct.from_int(int(f"0xFF{hex_}", 16))
CATPPUCCIN_MACCHIATO = SeedPalette(
primary=hex_to_hct("C6A0F6"),
secondary=hex_to_hct("7DC4E4"),
tertiary=hex_to_hct("F5BDE6"),
neutral=hex_to_hct("24273A"),
neutral_variant=hex_to_hct("363A4F"),
)
PRESETS: Mapping[str, SeedPalette] = {
"catppuccin:macchiato": CATPPUCCIN_MACCHIATO,
}
Generated
+7 -7
View File
@@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1770197578,
"narHash": "sha256-AYqlWrX09+HvGs8zM6ebZ1pwUqjkfpnv8mewYwAo+iM=",
"lastModified": 1771369470,
"narHash": "sha256-0NBlEBKkN3lufyvFegY4TYv5mCNHbi5OmBDrzihbBMQ=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "00c21e4c93d963c50d4c0c89bfa84ed6e0694df2",
"rev": "0182a361324364ae3f436a63005877674cf45efb",
"type": "github"
},
"original": {
@@ -23,11 +23,11 @@
]
},
"locked": {
"lastModified": 1769593411,
"narHash": "sha256-WW00FaBiUmQyxvSbefvgxIjwf/WmRrEGBbwMHvW/7uQ=",
"lastModified": 1770693276,
"narHash": "sha256-ngXnN5YXu+f45+QGYNN/VEBMQmcBCYGRCqwaK8cxY1s=",
"ref": "refs/heads/master",
"rev": "1e4d804e7f3fa7465811030e8da2bf10d544426a",
"revCount": 732,
"rev": "dacfa9de829ac7cb173825f593236bf2c21f637e",
"revCount": 735,
"type": "git",
"url": "https://git.outfoxxed.me/outfoxxed/quickshell"
},
+34 -22
View File
@@ -18,37 +18,49 @@
in {
formatter = forAllSystems (pkgs: pkgs.nixfmt);
packages = forAllSystems (pkgs: let
pythonEnv = pkgs.python3.withPackages (ps: [
ps.pillow
ps.materialyoucolor
]);
in rec {
zshell = pkgs.callPackage ./nix {
rev = self.rev or self.dirtyRev;
stdenv = pkgs.clangStdenv;
quickshell = inputs.quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default.override {
withX11 = false;
withI3 = false;
packages = forAllSystems (
pkgs: let
pythonEnv = pkgs.python3.withPackages (ps: [
ps.pillow
ps.materialyoucolor
]);
in rec {
zshell-cli = pkgs.callPackage ./nix/zshell-cli.nix {};
zshell = pkgs.callPackage ./nix {
rev = self.rev or self.dirtyRev;
stdenv = pkgs.clangStdenv;
quickshell = inputs.quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default.override {
withX11 = false;
withI3 = false;
};
app2unit = pkgs.callPackage ./nix/app2unit.nix {};
inherit pythonEnv zshell-cli;
};
app2unit = pkgs.callPackage ./nix/app2unit.nix {inherit pkgs;};
inherit pythonEnv;
};
default = zshell;
});
default = zshell;
}
);
devShells = forAllSystems (pkgs: {
default = let
shell = self.packages.${pkgs.stdenv.hostPlatform.system}.zshell;
system = pkgs.stdenv.hostPlatform.system;
shellPkg = self.packages.${system}.zshell;
cliPkg = self.packages.${system}.zshell-cli;
in
pkgs.mkShell.override {stdenv = shell.stdenv;} {
pkgs.mkShell.override {stdenv = shellPkg.stdenv;} {
inputsFrom = [
shell
shell.Plugins
shellPkg
shellPkg.plugin
];
packages = with pkgs; [
shellPkg
cliPkg
material-symbols
rubik
nerd-fonts.caskaydia-cove
+2 -1
View File
@@ -22,6 +22,7 @@
ninja,
pkg-config,
pythonEnv,
zshell-cli,
}: let
version = "1.0.0";
@@ -100,7 +101,7 @@ in
qt6.qtbase
qt6.qtwayland
];
propagatedBuildInputs = runtimeDeps;
propagatedBuildInputs = runtimeDeps ++ [zshell-cli];
cmakeFlags =
[
+27
View File
@@ -0,0 +1,27 @@
{
python3,
installShellFiles,
}:
python3.pkgs.buildPythonApplication {
pname = "zshell-cli";
version = "0.1.0";
src = ../cli;
pyproject = true;
build-system = with python3.pkgs; [
hatch-vcs
hatchling
];
dependencies = with python3.pkgs; [
materialyoucolor
pillow
typer
];
pythonImportsCheck = ["zshell"];
nativeBuildInputs = [installShellFiles];
SETUPTOOLS_SCM_PRETEND_VERSION = 1;
}
+3 -3
View File
@@ -2,10 +2,10 @@
- [x] Media showing; what song/media is playing?
- [x] Brightness control for Laptops.
- [ ] Battery icon for Laptops. Broken?
- [x] Battery icon for Laptops. Broken?
- [ ] Change volume for `$BROWSER` environment variable? Most general media source apart from separate music/video players.
- [ ] Quick toggle for BT, WiFi (modules in the tray do this too)
- [x] Auto hide unless on mouse hover. Also implement bar changes to mute/volume to show notif or show bar for a couple seconds.
- [x] Maybe already possible; have keybinds to show certain menus. I do not want to touch my mouse to see notifications for example. Not everything in the bar needs this, but some would be good to have.
- [ ] Pressing ESC or some obvious button to close nc.
- [ ] Another branch for development, hold off big changes so that a working bar or if there are big config changes.
- [x] Pressing ESC or some obvious button to close nc.
- [x] Another branch for development, hold off big changes so that a working bar or if there are big config changes.
-22
View File
@@ -1,22 +0,0 @@
from PIL import Image, ImageFilter
import argparse
def gen_blurred_image(input_image, output_path, blur_amount):
img = Image.open(input_image)
size = img.size
img = img.resize((size[0] // 2, size[1] // 2), Image.NEAREST)
img = img.filter(ImageFilter.GaussianBlur(blur_amount))
# img = img.resize(size, Image.LANCZOS)
img.save(output_path, "PNG")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Generate a blurred lock screen background image.")
parser.add_argument("--input_image", type=str)
parser.add_argument("--output_path", type=str)
parser.add_argument("--blur_amount", type=int)
args = parser.parse_args()
gen_blurred_image(args.input_image, args.output_path, args.blur_amount)
-123
View File
@@ -1,123 +0,0 @@
import json
import argparse
from pathlib import Path
from PIL import Image
from materialyoucolor.quantize import QuantizeCelebi
from materialyoucolor.score.score import Score
from materialyoucolor.dynamiccolor.material_dynamic_colors import MaterialDynamicColors
from materialyoucolor.hct.hct import Hct
parser = argparse.ArgumentParser(
description="Generate color scheme from wallpaper image"
)
parser.add_argument(
"--path",
required=True,
help="Path to the wallpaper image"
)
parser.add_argument(
"--output",
required=True,
help="Path to save the color scheme JSON file"
)
parser.add_argument(
"--thumbnail",
required=True,
help="Path to save the thumbnail image"
)
parser.add_argument(
"--scheme",
required=False,
type=str,
default="vibrant",
)
args = parser.parse_args()
if args.scheme == 'fruit-salad':
from materialyoucolor.scheme.scheme_fruit_salad import SchemeFruitSalad as Scheme
elif args.scheme == 'expressive':
from materialyoucolor.scheme.scheme_expressive import SchemeExpressive as Scheme
elif args.scheme == 'monochrome':
from materialyoucolor.scheme.scheme_monochrome import SchemeMonochrome as Scheme
elif args.scheme == 'rainbow':
from materialyoucolor.scheme.scheme_rainbow import SchemeRainbow as Scheme
elif args.scheme == 'tonal-spot':
from materialyoucolor.scheme.scheme_tonal_spot import SchemeTonalSpot as Scheme
elif args.scheme == 'neutral':
from materialyoucolor.scheme.scheme_neutral import SchemeNeutral as Scheme
elif args.scheme == 'fidelity':
from materialyoucolor.scheme.scheme_fidelity import SchemeFidelity as Scheme
elif args.scheme == 'content':
from materialyoucolor.scheme.scheme_content import SchemeContent as Scheme
elif args.scheme == 'vibrant':
from materialyoucolor.scheme.scheme_vibrant import SchemeVibrant as Scheme
else:
from materialyoucolor.scheme.scheme_tonal_spot import SchemeTonalSpot as Scheme
def generate_thumbnail(image_path, thumbnail_path, size=(128, 128)):
thumbnail_file = Path(thumbnail_path)
image = Image.open(image_path)
image = image.convert("RGB")
image.thumbnail(size, Image.NEAREST)
thumbnail_file.parent.mkdir(parents=True, exist_ok=True)
image.save(thumbnail_path, "JPEG")
def generate_color_scheme(thumbnail_path, output_path):
image = Image.open(thumbnail_path)
pixel_len = image.width * image.height
image_data = image.getdata()
quality = 1
pixel_array = [image_data[_] for _ in range(0, pixel_len, quality)]
result = QuantizeCelebi(pixel_array, 128)
score = Score.score(result)[0]
scheme = Scheme(
Hct.from_int(score),
True,
0.0
)
color_dict = {}
for color in vars(MaterialDynamicColors).keys():
color_name = getattr(MaterialDynamicColors, color)
if hasattr(color_name, "get_hct"):
color_int = color_name.get_hct(scheme).to_int()
color_dict[color] = int_to_hex(color_int)
output_dict = {
"name": "dynamic",
"flavour": "default",
"mode": "dark",
"variant": "tonalspot",
"colors": color_dict
}
output_file = Path(output_path)
output_file.parent.mkdir(parents=True, exist_ok=True)
with open(output_file, "w") as f:
json.dump(output_dict, f, indent=4)
def int_to_hex(argb_int):
return "#{:06X}".format(argb_int & 0xFFFFFF)
try:
generate_thumbnail(args.path, str(args.thumbnail))
generate_color_scheme(str(args.thumbnail), args.output)
except Exception as e:
print(f"Error: {e}")
with open(args.output, "w") as f:
f.write(f"Error: {e}")
-103
View File
@@ -1,103 +0,0 @@
#!/usr/bin/env python3
"""
Calendar cache generator for z-bar-qt
Generates a JSON file containing date numbers for all 52 weeks of 3 years (last, current, next)
Structure: { "2024": { "week_0": [1,2,3,4,5,6,7], ... }, "2025": {...}, ... }
"""
import json
import sys
from datetime import datetime, timedelta
from pathlib import Path
def get_week_start_day():
"""Returns the first day of the week (0=Sunday, 1=Monday, etc.) - hardcoded to Monday"""
return 1 # Monday
def get_weeks_for_year(year, week_start_day=1):
"""
Generate week data for a given year.
Returns a dict with 52 weeks, each containing 7 date numbers.
"""
weeks = {}
# Find the first day of the year
jan_1 = datetime(year, 1, 1)
# Find the first week's start date (adjust based on week_start_day)
first_date = jan_1 - timedelta(days=(jan_1.weekday() - week_start_day) % 7)
# Generate 52 weeks
for week_num in range(52):
week_dates = []
week_start = first_date + timedelta(weeks=week_num)
for day_offset in range(7):
current_date = week_start + timedelta(days=day_offset)
week_dates.append(current_date.day)
weeks[f"week_{week_num}"] = week_dates
return weeks
def generate_calendar_cache(year=None):
"""Generate cache for last year, current year, and next year"""
if year is None:
year = datetime.now().year
cache = {}
for offset_year in [-1, 0, 1]:
target_year = year + offset_year
cache[str(target_year)] = get_weeks_for_year(target_year)
return cache
def write_cache_file(cache_data):
"""Write cache to the same location as Paths.cache in QML"""
import os
# Use XDG_CACHE_HOME or ~/.cache, then add /zshell (matching Paths singleton)
xdg_cache_home = os.environ.get("XDG_CACHE_HOME")
if xdg_cache_home:
cache_dir = Path(xdg_cache_home) / "zshell"
else:
cache_dir = Path.home() / ".cache" / "zshell"
cache_dir.mkdir(parents=True, exist_ok=True)
cache_file = cache_dir / "calendar_cache.json"
with open(cache_file, "w") as f:
json.dump(cache_data, f, indent=2)
print(f"Calendar cache written to: {cache_file}")
return cache_file
def main():
try:
# Generate cache for current year and ±1 year
cache = generate_calendar_cache()
# Write to file
cache_file = write_cache_file(cache)
print("Cache structure:")
print(" - Keys: year (e.g., '2024', '2025', '2026')")
print(" - Values: dict with 52 weeks")
print(" - Each week: array of 7 date numbers")
print(f"\nExample (first week of 2025):")
print(f" {cache['2025']['week_0']}")
return 0
except Exception as e:
print(f"Error generating calendar cache: {e}", file=sys.stderr)
return 1
if __name__ == "__main__":
sys.exit(main())
View File
-22
View File
@@ -1,22 +0,0 @@
#!/usr/bin/env bash
QML_ROOT=/home/zach/GitProjects/z-bar-qt/scripts/..
LOCK=false
main() {
local OPTARG OPTIND opt
while getopts "l" opt; do
case "$opt" in
l) LOCK=true ;;
*) fatal 'bad option' ;;
esac
done
if [[ "$LOCK" = "true" ]]; then
hyprctl dispatch global zshell:lock
else
qs -n -d -p "$QML_ROOT/shell.qml"
fi
}
main "$@"
-22
View File
@@ -1,22 +0,0 @@
#!/usr/bin/env bash
QML_ROOT=/home/zach/GitProjects/z-bar-qt/scripts/..
LOCK=false
main() {
local OPTARG OPTIND opt
while getopts "l" opt; do
case "$opt" in
l) LOCK=true ;;
*) fatal 'bad option' ;;
esac
done
if [[ "$LOCK" = "true" ]]; then
hyprctl dispatch global zshell:lock
else
qs -n -d -p "$QML_ROOT/shell.qml"
fi
}
main "$@"