49 Commits

Author SHA1 Message Date
zach ad23da4eda initial commit, primitive loading of QML code outside of shell directory 2026-05-25 13:32:06 +02:00
zach 06ebc4ffbf remove irrelevant settings options plus bugfixes 2026-05-25 11:51:16 +02:00
zach f2f9fa1302 fix opening links on non-uwsm and disable file watcher when shell is installed 2026-05-25 11:01:01 +02:00
zach b4020438f9 Merge pull request 'Tune transparency scale impact on luminance scaling' (#98) from fix/transparency-luminance-scaling into main
Reviewed-on: #98
Reviewed-by: AramJonghu <2+aramjonghu@noreply.git.zach-dev.cc>
2026-05-24 22:37:03 +02:00
zach 184ab20d11 Merge branch 'main' into fix/transparency-luminance-scaling
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 12s
Python / lint-format (pull_request) Successful in 26s
Python / test (pull_request) Successful in 42s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m45s
2026-05-24 22:36:52 +02:00
zach 5097e30a77 fix anchors used in Layouts 2026-05-24 19:33:06 +02:00
zach ef71ae8afd button to install colorscheme and wallpaper to greeter in settings 2026-05-24 19:28:02 +02:00
AramJonghu 6533533936 Merge branch 'main' into fix/transparency-luminance-scaling
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 12s
Python / lint-format (pull_request) Successful in 23s
Python / test (pull_request) Successful in 51s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m47s
2026-05-24 18:53:39 +02:00
zach 9688072e93 record.py 2026-05-24 18:48:03 +02:00
AramJonghu 9c36f0de5b pycache in cache removal 2026-05-24 18:28:32 +02:00
zach 9ca46967d9 Merge pull request 'hotfix(cli): replace raw subprocess tracebacks with styled error messages and fix restart race condition' (#96) from hotfix-restart-race-condition into main
Reviewed-on: #96
Reviewed-by: zach <zach@brohn.se>
2026-05-24 18:23:43 +02:00
zach 16e84ca998 fixed region selection for recording, plus cache file cleanup
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 12s
Lint & Format (Python) / lint-format (pull_request) Successful in 18s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m34s
2026-05-24 18:21:37 +02:00
AramJonghu c30128cf95 check every 50ms -> 250ms for restart
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 11s
Python / lint-format (pull_request) Successful in 30s
Python / test (pull_request) Successful in 46s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m44s
2026-05-24 18:03:32 +02:00
zach ba9926af18 Increased floor and decreased ceiling of offset for brightening darker colors in dark mode/darkening brighter colors in light mode
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 13s
Python / lint-format (pull_request) Successful in 28s
Python / test (pull_request) Successful in 43s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m45s
2026-05-24 11:40:44 +02:00
AramJonghu 78fcf33b3a refactor(cli): clean shell start/restart, drop redundant ipc check
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 11s
Python / lint-format (pull_request) Successful in 24s
Python / test (pull_request) Successful in 48s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m44s
2026-05-24 03:09:19 +02:00
AramJonghu 5e9b373405 tests did not match changed code logic
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 11s
Python / lint-format (pull_request) Successful in 25s
Python / test (pull_request) Successful in 50s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m46s
2026-05-23 20:54:35 +02:00
AramJonghu b49165e7ea minor typer adjustments to use typer in error/exception throws
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 14s
Python / lint-format (pull_request) Successful in 34s
Python / test (pull_request) Failing after 53s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m48s
2026-05-23 20:48:51 +02:00
AramJonghu d0cda51639 wait for instance to fully terminate before restart 2026-05-23 20:31:48 +02:00
zach ad57764636 Merge pull request '#73 dynamic color scheme presets from .txt palettes + shell restart command' (#92) from 73-colorscheme-options into main
Reviewed-on: #92
2026-05-23 20:15:30 +02:00
zach 96afbdb30b Settings UI for color scheme presets
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 12s
Python / lint-format (pull_request) Successful in 25s
Python / test (pull_request) Successful in 53s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m52s
2026-05-23 20:14:12 +02:00
AramJonghu 5df46160f6 documentation in README.md added
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 12s
Python / lint-format (pull_request) Successful in 23s
Python / test (pull_request) Successful in 50s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m50s
2026-05-23 17:53:16 +02:00
AramJonghu d118c02e75 README: document scheme CLI and shell subcommands 2026-05-23 17:52:06 +02:00
AramJonghu 21ed178bbc scheme: add --json flag to list-presets, --accent flag, drop :accent from preset spec
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 13s
Python / lint-format (pull_request) Successful in 25s
Python / test (pull_request) Successful in 44s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m48s
- list-presets --json outputs structured JSON with variants,
  modes, accents, and default_accent for accent-aware schemes
- --accent flag replaces :accent shorthand in preset string
- Validate --accent against variant's available accents
- resolve_preset returns tuple[str, str] (scheme + variant only)
- Update tests for new signature
2026-05-23 17:42:58 +02:00
AramJonghu 2934d863ca --accent removed. Accidental inclusion
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 12s
Python / lint-format (pull_request) Successful in 22s
Python / test (pull_request) Successful in 46s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m46s
2026-05-23 00:51:14 +02:00
AramJonghu 7c29921a6b removal of plans package/directory (we have project board now)
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 11s
Python / lint-format (pull_request) Successful in 22s
Python / test (pull_request) Successful in 49s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m45s
2026-05-23 00:42:25 +02:00
AramJonghu 0309fde3aa format check and lint resolved
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 11s
Python / lint-format (pull_request) Successful in 19s
Python / test (pull_request) Successful in 46s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m50s
2026-05-22 23:26:33 +02:00
AramJonghu f147969f37 added workflow running python tests
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 11s
Python / lint-format (pull_request) Failing after 24s
Python / test (pull_request) Successful in 50s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m48s
2026-05-22 22:56:03 +02:00
AramJonghu 90a1954658 cache 2026-05-22 22:53:36 +02:00
AramJonghu 2b550763e7 ruff unused import 2026-05-22 22:46:02 +02:00
AramJonghu 3037cfab53 cache 2026-05-22 22:38:56 +02:00
AramJonghu 5f92b6f6de shell: add restart command, fix call None arg, add tests 2026-05-22 22:38:35 +02:00
AramJonghu 67ae693d0c Color preset schemes now exposed for use.
- Catppuccin txt colors extracted from dankmaterialyou and created txt
  files for each.
- Preset is now an option and are exposed.
- Tests test presets, might add workflow to run tests.
2026-05-22 22:32:31 +02:00
zach fd620e7487 prep for replay 2026-05-22 20:42:51 +02:00
zach 0ec426e0f0 Record module added to sidebar, file list and buttons. Region recording is broken 2026-05-22 12:51:06 +02:00
zach ec5e6d3995 add typer command 2026-05-22 11:06:17 +02:00
zach 41a129bb90 init commit 2026-05-22 11:04:54 +02:00
Inorishio 8c48ddbbe7 Merge branch 'main' of git.zach-dev.cc:zach/z-bar-qt 2026-05-21 23:58:49 +02:00
Inorishio 625d766719 added escape to lock + greeter 2026-05-21 23:58:24 +02:00
zach 88526b9e98 show notif icon true by default 2026-05-21 23:43:27 +02:00
zach a0d56b965c toggle to show notif icon on lockscreen 2026-05-21 23:29:49 +02:00
zach 2342edcf66 apply button, wheel doesn't zoom 2026-05-21 23:12:01 +02:00
zach 9e75b593f4 scale slider for crop tool 2026-05-21 19:14:29 +02:00
zach 4663c7d683 better wallpaper preview positioning 2026-05-21 17:55:31 +02:00
zach 80683800eb crop region now restores correctly 2026-05-21 16:52:12 +02:00
zach 57836f974c remove residue test files 2026-05-21 15:52:43 +02:00
zach 8dbb88e136 crop region now correct 2026-05-21 15:51:42 +02:00
zach 06c402c050 better crop region handling, but coordinate math is wrong 2026-05-20 23:16:55 +02:00
zach e425a1701b small fix for wallpaper grid 2026-05-20 14:34:11 +02:00
zach 41666d0150 Merge pull request 'hyprland lua support' (#91) from hypr-plugin into main
Reviewed-on: #91
2026-05-20 14:08:30 +02:00
144 changed files with 10094 additions and 2033 deletions
+32 -1
View File
@@ -1,4 +1,4 @@
name: Lint & Format (Python)
name: Python
on:
pull_request:
@@ -32,3 +32,34 @@ jobs:
run: |
. .venv/bin/activate
ruff check .
test:
runs-on: alpine
container: node:26-alpine
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install tools
run: |
apk add --no-cache \
git \
python3 \
py3-pip \
py3-pillow \
build-base
python3 -m venv .venv
. .venv/bin/activate
pip install --no-cache-dir \
typer \
pillow \
materialyoucolor \
jinja2 \
pytest
- name: Test
run: |
. .venv/bin/activate
cd cli
python -m pytest tests/ -v
+8 -1
View File
@@ -31,6 +31,13 @@ if("shell" IN_LIST ENABLE_MODULES)
foreach(dir assets scripts Components Config Modules Daemons Drawers Effects Helpers Paths)
install(DIRECTORY ${dir} DESTINATION "${INSTALL_QSCONFDIR}")
endforeach()
install(FILES shell.qml DESTINATION "${INSTALL_QSCONFDIR}")
# Disable watching for changes
file(READ shell.qml SHELL_QML)
string(REPLACE "settings.watchFiles: true" "settings.watchFiles: false" SHELL_QML "${SHELL_QML}")
file(WRITE "${CMAKE_BINARY_DIR}/qml/shell.qml" "${SHELL_QML}")
install(FILES "${CMAKE_BINARY_DIR}/qml/shell.qml" DESTINATION "${INSTALL_QSCONFDIR}")
# Greeter
install(DIRECTORY Greeter/ DESTINATION "${INSTALL_GREETERCONFDIR}")
endif()
+16 -2
View File
@@ -8,20 +8,34 @@ Item {
id: root
property alias active: splitButton.active
property alias buttonAlias: splitButton
property bool enabled: true
property alias expanded: splitButton.expanded
property int expandedZ: 100
required property string label
property alias menuItems: splitButton.menuItems
property bool shouldBeActive: true
property alias type: splitButton.type
signal selected(item: MenuItem)
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
anchors.left: parent.left
anchors.right: parent.right
clip: false
implicitHeight: row.implicitHeight + Appearance.padding.smaller * 2
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
z: root.expanded ? expandedZ : -1
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
RowLayout {
id: row
+1
View File
@@ -15,6 +15,7 @@ Text {
color: DynamicColors.palette.m3onSurface
font.family: Appearance.font.family.sans
font.pointSize: Appearance.font.size.normal
linkColor: DynamicColors.palette.m3onPrimaryFixedVariant
renderType: Text.NativeRendering
textFormat: Text.PlainText
+8
View File
@@ -1,5 +1,13 @@
import Quickshell.Io
JsonObject {
property Presets presets: Presets {
}
property string schemeType: "vibrant"
component Presets: JsonObject {
property string accent: ""
property string name: ""
property string variant: ""
}
}
+19 -2
View File
@@ -22,6 +22,7 @@ Singleton {
property alias notifs: adapter.notifs
property alias osd: adapter.osd
property alias overview: adapter.overview
property alias plugins: adapter.plugins
property bool recentlySaved: false
property alias screenshot: adapter.screenshot
property alias services: adapter.services
@@ -115,7 +116,12 @@ Singleton {
function serializeColors(): var {
return {
schemeType: colors.schemeType
schemeType: colors.schemeType,
presets: {
name: colors.presets.name,
variant: colors.presets.variant,
accent: colors.presets.accent
}
};
}
@@ -135,7 +141,8 @@ Singleton {
launcher: serializeLauncher(),
colors: serializeColors(),
dock: serializeDock(),
screenshot: serializeScreenshot()
screenshot: serializeScreenshot(),
plugins: serializePlugins()
};
}
@@ -242,6 +249,7 @@ Singleton {
recolorLogo: lock.recolorLogo,
enableFprint: lock.enableFprint,
showNotifContent: lock.showNotifContent,
showNotifIcon: lock.showNotifIcon,
maxFprintTries: lock.maxFprintTries,
blurAmount: lock.blurAmount,
sizes: {
@@ -283,6 +291,13 @@ Singleton {
};
}
function serializePlugins(): var {
return {
enabled: plugins.enabled,
entries: plugins.entries
};
}
function serializeScreenshot(): var {
return {
enable_pp: screenshot.enable_pp,
@@ -452,6 +467,8 @@ Singleton {
}
property Overview overview: Overview {
}
property PluginConfig plugins: PluginConfig {
}
property Screenshot screenshot: Screenshot {
}
property Services services: Services {
+3 -2
View File
@@ -30,9 +30,10 @@ Singleton {
readonly property alias wallLuminance: analyser.luminance
function alterColor(c: color, a: real, layer: int): color {
const luminance = getLuminance(c);
const initLuminance = getLuminance(c);
const luminance = Math.max(initLuminance, 0.001);
const offset = (!light || layer == 1 ? 1 : -layer / 2) * (light ? 0.2 : 0.3) * (1 - transparency.base) * (1 + wallLuminance * (light ? (layer == 1 ? 3 : 1) : 2.5));
const offset = (!light || layer == 1 ? 1 : -layer / 2) * (light ? 0.2 : 0.3) * (0.2 + 0.3 * (1 - transparency.base)) * (1 + wallLuminance * (light ? (layer == 1 ? 3 : 1) : 2.5));
const scale = (luminance + offset) / luminance;
const r = Math.max(0, Math.min(1, c.r * scale));
const g = Math.max(0, Math.min(1, c.g * scale));
+1
View File
@@ -6,6 +6,7 @@ JsonObject {
property int maxFprintTries: 3
property bool recolorLogo: false
property bool showNotifContent: false
property bool showNotifIcon: true
property Sizes sizes: Sizes {
}
+11
View File
@@ -0,0 +1,11 @@
import Quickshell.Io
JsonObject {
property bool enabled: false
property list<var> entries: [
{
id: "Plugin",
enabled: false
},
]
}
+18
View File
@@ -0,0 +1,18 @@
pragma Singleton
import Quickshell
import ZShell.Models
Singleton {
id: root
property alias plugins: plugins.entries
FileSystemModel {
id: plugins
nameFilters: ["*.qml"]
path: Quickshell.env("HOME") + "/.config/zshell"
recursive: false
}
}
+17
View File
@@ -0,0 +1,17 @@
import Quickshell
import QtQuick
import ZShell.Models
import qs.Config
Repeater {
model: FetchPlugins.plugins
LazyLoader {
required property FileSystemEntry modelData
activeAsync: Config.plugins.entries.some(p => {
return p.id === modelData.baseName && p.enabled;
})
source: modelData.path
}
}
+20 -20
View File
@@ -16,27 +16,14 @@ Scope {
property bool launching: false
property string promptMessage: ""
readonly property var selectedSession: sessionIndex >= 0 ? sessions[sessionIndex] : null
readonly property var selectedUser: Users.selectedUser
property int sessionIndex: sessions.length > 0 ? 0 : -1
property var sessions: []
readonly property string userFace: selectedUser ? selectedUser.face : ""
readonly property string username: Users.selectedUsername
// User handling - now uses the Users singleton
readonly property var users: Users.users
readonly property var selectedUser: Users.selectedUser
readonly property string username: Users.selectedUsername
readonly property string userFace: selectedUser ? selectedUser.face : ""
// User selection functions (delegate to Users singleton)
function selectUser(username: string): bool {
return Users.selectUser(username);
}
function selectNextUser(): void {
Users.selectNext();
}
function selectPreviousUser(): void {
Users.selectPrevious();
}
signal flashMsg
@@ -58,11 +45,11 @@ Scope {
event.accepted = true;
return;
}
if (event.text && !/[\r\n]/.test(event.text)) {
} else if (event.key === Qt.Key_Escape) {
buffer = "";
} else if (" abcdefghijklmnopqrstuvwxyz1234567890`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?".includes(event.text.toLowerCase())) {
// No illegal characters (you are insane if you use unicode in your password)
buffer += event.text;
event.accepted = true;
}
}
@@ -81,6 +68,19 @@ Scope {
Greetd.launch(selectedSession.command, [], true);
}
function selectNextUser(): void {
Users.selectNext();
}
function selectPreviousUser(): void {
Users.selectPrevious();
}
// User selection functions (delegate to Users singleton)
function selectUser(username: string): bool {
return Users.selectUser(username);
}
function submit(): void {
errorMessage = "";
+63
View File
@@ -0,0 +1,63 @@
// FetchPresets.qml
pragma Singleton
import QtQuick
import Quickshell
import Quickshell.Io
Singleton {
id: root
property var parsedPresets: ({})
readonly property var presets: parsedPresets
property bool ready: false
function accents(presetName, variantName) {
const variant = parsedPresets[presetName]?.variants?.[variantName];
return variant?.accents ?? [];
}
function defaultAccent(presetName, variantName) {
const variant = parsedPresets[presetName]?.variants?.[variantName];
return variant?.default_accent ?? "";
}
function modes(presetName, variantName) {
const variant = parsedPresets[presetName]?.variants?.[variantName];
return variant?.modes ?? [];
}
function presetNames() {
return Object.keys(parsedPresets);
}
function variantNames(presetName) {
const preset = parsedPresets[presetName];
if (!preset || !preset.variants)
return [];
return Object.keys(preset.variants);
}
Process {
command: ["zshell-cli", "scheme", "list-presets", "--json"]
running: true
stdout: StdioCollector {
onStreamFinished: {
try {
const parsed = JSON.parse(text);
root.parsedPresets = parsed.presets ?? {};
root.ready = true;
} catch (e) {
console.error("Failed to parse presets JSON:", e);
}
}
}
}
}
+1 -1
View File
@@ -12,7 +12,7 @@ Singleton {
readonly property int darkEnd: Config.general.color.scheduleDarkEnd
readonly property int darkStart: Config.general.color.scheduleDarkStart
readonly property bool enabled: Config.general.color.scheduleDark
readonly property bool enabled: Config.general.color.scheduleDark && Config.general.color.schemeGeneration
function applyDarkMode() {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", "dark"]);
+82 -41
View File
@@ -1,41 +1,82 @@
// pragma Singleton
//
// import Quickshell
// import QtQuick
//
// Singleton {
// id: root
//
// function start(extraArgs = []): void {
// needsStart = true;
// startArgs = extraArgs;
// checkProc.running = true;
// }
//
// PersistentProperties {
// id: props
//
// property real elapsed: 0
// property bool paused: false
// property bool running: false
//
// reloadableId: "recorder"
// }
//
// Process {
// id: checkProc
//
// command: ["pidof", "gpu-screen-recorder"]
// running: true
//
// onExited: code => {
// props.running = code === 0;
//
// if (code === 0) {
// if (root.needsStop) {
// Quickshell.execDetached(["zshell-cli"]);
// }
// }
// }
// }
// }
pragma Singleton
import Quickshell
import Quickshell.Io
import QtQuick
Singleton {
id: root
readonly property alias elapsed: props.elapsed
property bool needsPause
property bool needsStart
property bool needsStop
readonly property alias paused: props.paused
readonly property alias running: props.running
property list<string> startArgs
function start(extraArgs = []): void {
needsStart = true;
startArgs = extraArgs;
checkProc.running = true;
}
function stop(): void {
needsStop = true;
checkProc.running = true;
}
function togglePause(): void {
needsPause = true;
checkProc.running = true;
}
PersistentProperties {
id: props
property real elapsed: 0
property bool paused: false
property bool running: false
reloadableId: "recorder"
}
Process {
id: checkProc
command: ["pidof", "gpu-screen-recorder"]
running: true
onExited: code => {
props.running = code === 0;
if (code === 0) {
if (root.needsStop) {
Quickshell.execDetached(["zshell-cli", "record", "record"]);
props.running = false;
props.paused = false;
} else if (root.needsPause) {
Quickshell.execDetached(["zshell-cli", "record", "record", "-p"]);
props.paused = !props.paused;
}
} else if (root.needsStart) {
Quickshell.execDetached(["zshell-cli", "record", "record", ...root.startArgs]);
props.running = true;
props.paused = false;
props.elapsed = 0;
}
root.needsStart = false;
root.needsStop = false;
root.needsPause = false;
}
}
Connections {
function onSecondsChanged(): void {
props.elapsed++;
}
target: Time // qmllint disable incompatible-type
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
import Quickshell
import "../scripts/fzf.js" as Fzf
import "../scripts/fuzzysort.js" as Fuzzy
import QtQuick
import Quickshell
Singleton {
property var extraOpts: ({})
+14
View File
@@ -6,7 +6,21 @@ import Quickshell.Services.UPower
Singleton {
id: root
readonly property real batteryPercent: UPower.displayDevice.percentage
readonly property list<UPowerDevice> devices: UPower.devices.values
readonly property UPowerDevice displayDevice: UPower.displayDevice
readonly property bool onBattery: UPower.onBattery
// property bool toastShown
//
// Connections {
// target: UPower
//
// function onPercentageChanged(): {
// if (root.batteryPercent >= 0.2 && toastShown)
// return;
//
// root.toastShown = true;
// Toaster.toast(qsTr("Battery "))
// }
// }
}
+50
View File
@@ -1,7 +1,9 @@
pragma Singleton
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Io
import QtQuick
import ZShell.Models
import qs.Config
import qs.Modules
@@ -12,11 +14,17 @@ Searcher {
id: root
property string actualCurrent: WallpaperPath.currentWallpaperPath
property alias crops: adapter.monitorCrops
readonly property string current: showPreview ? previewPath : actualCurrent
property alias monitorCrops: monitorCrops
property string previewPath
property bool recentlyChanged
property bool showPreview: false
function getCrop(screen: string): var {
return root.crops[screen];
}
function preview(path: string): void {
previewPath = path;
if (Config.general.color.schemeGeneration)
@@ -24,9 +32,35 @@ Searcher {
showPreview = true;
}
function setCrop(screen: string, rect: rect, scaledRect: rect, zoom: real): void {
let updated = Object.assign({}, root.crops);
if (zoom <= 0)
zoom = 1.0;
else if (zoom > 5.0)
zoom = 5.0;
updated[screen] = {
x: rect.x,
y: rect.y,
width: rect.width,
height: rect.height,
scaledX: scaledRect.x,
scaledY: scaledRect.y,
scaledWidth: scaledRect.width,
scaledHeight: scaledRect.height,
zoom: zoom
};
root.crops = updated;
monitorCrops.writeAdapter();
monitorCrops.reload();
}
function setWallpaper(path: string): void {
actualCurrent = path;
WallpaperPath.currentWallpaperPath = path;
Quickshell.screens.forEach(n => setCrop(n.name, Qt.rect(0, 0, 0, 0), Qt.rect(0, 0, 0, 0), 1.0));
Quickshell.execDetached(["zshell-cli", "wallpaper", "lockscreen", "--input-image", `${root.actualCurrent}`, "--output-path", `${Paths.state}/lockscreen_bg.png`, "--blur-amount", `${Config.lock.blurAmount}`]);
if (Config.general.color.schemeGeneration)
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--image-path", `${root.actualCurrent}`, "--scheme", `${Config.colors.schemeType}`, "--mode", `${Config.general.color.mode}`]);
@@ -53,6 +87,22 @@ Searcher {
target: "wallpaper"
}
FileView {
id: monitorCrops
path: `${Paths.state}/wallpaper-crops.json`
watchChanges: true
onAdapterUpdated: writeAdapter()
onFileChanged: reload()
JsonAdapter {
id: adapter
property var monitorCrops: ({})
}
}
FileSystemModel {
id: wallpapers
+1
View File
@@ -58,6 +58,7 @@ CustomRect {
fillMode: Image.PreserveAspectCrop
height: Config.notifs.sizes.image
source: Qt.resolvedUrl(root.image)
visible: Config.lock.showNotifIcon
width: Config.notifs.sizes.image
}
}
+2
View File
@@ -30,6 +30,8 @@ Scope {
} else {
buffer = buffer.slice(0, -1);
}
} else if (event.key === Qt.Key_Escape) {
buffer = "";
} else if (" abcdefghijklmnopqrstuvwxyz1234567890`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?".includes(event.text.toLowerCase())) {
// No illegal characters (you are insane if you use unicode in your password)
buffer += event.text;
+3
View File
@@ -136,7 +136,10 @@ CustomRect {
wrapMode: Text.WordWrap
onLinkActivated: link => {
if (Config.launcher.uwsm)
Quickshell.execDetached(["app2unit", "-O", "--", link]);
else
Quickshell.execDetached(["xdg-open", link]);
root.visibilities.sidebar = false;
}
}
@@ -0,0 +1,290 @@
pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import QtQuick.Layouts
import qs.Components
import qs.Config
import qs.Helpers
CustomRect {
id: root
required property var props
required property PersistentProperties visibilities
Layout.fillWidth: true
color: DynamicColors.tPalette.m3surfaceContainer
implicitHeight: layout.implicitHeight + layout.anchors.margins * 2
radius: Appearance.rounding.smallest
ColumnLayout {
id: layout
anchors.fill: parent
anchors.margins: Appearance.padding.large
spacing: Appearance.spacing.normal
RowLayout {
spacing: Appearance.spacing.normal
z: 1
CustomRect {
color: Recorder.running ? DynamicColors.palette.m3secondary : DynamicColors.palette.m3secondaryContainer
implicitHeight: {
const h = icon.implicitHeight + Appearance.padding.smaller * 2;
return h - (h % 2);
}
implicitWidth: implicitHeight
radius: Appearance.rounding.full
MaterialIcon {
id: icon
anchors.centerIn: parent
anchors.horizontalCenterOffset: -0.5
anchors.verticalCenterOffset: 1.5
color: Recorder.running ? DynamicColors.palette.m3onSecondary : DynamicColors.palette.m3onSecondaryContainer
font.pointSize: Appearance.font.size.large
text: "screen_record"
}
}
ColumnLayout {
Layout.fillWidth: true
spacing: 0
CustomText {
Layout.fillWidth: true
elide: Text.ElideRight
font.pointSize: Appearance.font.size.normal
text: qsTr("Screen Recorder")
}
CustomText {
Layout.fillWidth: true
color: DynamicColors.palette.m3onSurfaceVariant
elide: Text.ElideRight
font.pointSize: Appearance.font.size.small
text: Recorder.paused ? qsTr("Recording paused") : Recorder.running ? qsTr("Recording running") : qsTr("Recording off")
}
}
CustomSplitButton {
active: menuItems.find(m => root.props.recordingMode === m.icon + m.text) ?? menuItems[0]
disabled: Recorder.running
menuItems: [
MenuItem {
activeText: qsTr("Fullscreen")
icon: "fullscreen"
text: qsTr("Record fullscreen")
onClicked: Recorder.start()
},
MenuItem {
activeText: qsTr("Region")
icon: "screenshot_region"
text: qsTr("Record region")
onClicked: Recorder.start(["-r"])
},
MenuItem {
activeText: qsTr("Fullscreen")
icon: "select_to_speak"
text: qsTr("Record fullscreen with sound")
onClicked: Recorder.start(["-s"])
},
MenuItem {
activeText: qsTr("Region")
icon: "volume_up"
text: qsTr("Record region with sound")
onClicked: Recorder.start(["-s", "-r"])
}
]
menu.onItemSelected: item => root.props.recordingMode = item.icon + item.text
}
}
Loader {
id: listOrControls
property bool running: Recorder.running
Layout.fillWidth: true
Layout.preferredHeight: implicitHeight
asynchronous: true
sourceComponent: running ? recordingControls : recordingList
Behavior on Layout.preferredHeight {
id: locHeightAnim
enabled: false
Anim {
}
}
Behavior on running {
SequentialAnimation {
ParallelAnimation {
Anim {
duration: Appearance.anim.durations.small
easing: Appearance.anim.curves.standardAccel
property: "scale"
target: listOrControls
to: 0.7
}
Anim {
duration: Appearance.anim.durations.small
easing: Appearance.anim.curves.standardAccel
property: "opacity"
target: listOrControls
to: 0
}
}
PropertyAction {
property: "enabled"
target: locHeightAnim
value: true
}
PropertyAction {
}
PropertyAction {
property: "enabled"
target: locHeightAnim
value: false
}
ParallelAnimation {
Anim {
duration: Appearance.anim.durations.small
easing: Appearance.anim.curves.standardDecel
property: "scale"
target: listOrControls
to: 1
}
Anim {
duration: Appearance.anim.durations.small
easing: Appearance.anim.curves.standardDecel
property: "opacity"
target: listOrControls
to: 1
}
}
}
}
}
}
Component {
id: recordingList
RecordingList {
props: root.props
visibilities: root.visibilities
}
}
Component {
id: recordingControls
RowLayout {
spacing: Appearance.spacing.normal
CustomRect {
color: Recorder.paused ? DynamicColors.palette.m3tertiary : DynamicColors.palette.m3error
implicitHeight: recText.implicitHeight + Appearance.padding.smaller * 2
implicitWidth: recText.implicitWidth + Appearance.padding.normal * 2
radius: Appearance.rounding.full
Behavior on implicitWidth {
Anim {
}
}
SequentialAnimation on opacity {
alwaysRunToEnd: true
loops: Animation.Infinite
running: !Recorder.paused
Anim {
duration: Appearance.anim.durations.large
easing: Appearance.anim.curves.emphasizedAccel
from: 1
to: 0
}
Anim {
duration: Appearance.anim.durations.extraLarge
easing: Appearance.anim.curves.emphasizedDecel
from: 0
to: 1
}
}
CustomText {
id: recText
anchors.centerIn: parent
animate: true
color: Recorder.paused ? DynamicColors.palette.m3onTertiary : DynamicColors.palette.m3onError
font.family: Appearance.font.family.mono
text: Recorder.paused ? "PAUSED" : "REC"
}
}
CustomText {
font.pointSize: Appearance.font.size.normal
text: {
const elapsed = Recorder.elapsed;
const hours = Math.floor(elapsed / 3600);
const mins = Math.floor((elapsed % 3600) / 60);
const secs = Math.floor(elapsed % 60).toString().padStart(2, "0");
let time;
if (hours > 0)
time = `${hours}:${mins.toString().padStart(2, "0")}:${secs}`;
else
time = `${mins}:${secs}`;
return qsTr("Recording for %1").arg(time);
}
}
Item {
Layout.fillWidth: true
}
IconButton {
checked: Recorder.paused
font.pointSize: Appearance.font.size.large
icon: Recorder.paused ? "play_arrow" : "pause"
label.animate: true
toggle: true
type: IconButton.Tonal
onClicked: {
Recorder.togglePause();
internalChecked = Recorder.paused;
}
}
IconButton {
font.pointSize: Appearance.font.size.large
icon: "stop"
inactiveColour: DynamicColors.palette.m3error
inactiveOnColour: DynamicColors.palette.m3onError
onClicked: Recorder.stop()
}
}
}
}
@@ -0,0 +1,226 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Widgets
import ZShell.Models
import qs.Components
import qs.Helpers
import qs.Paths
import qs.Config
ColumnLayout {
id: root
required property var props
required property PersistentProperties visibilities
spacing: 0
WrapperMouseArea {
Layout.fillWidth: true
cursorShape: Qt.PointingHandCursor
onClicked: root.props.recordingListExpanded = !root.props.recordingListExpanded
RowLayout {
spacing: Appearance.spacing.smaller
MaterialIcon {
Layout.alignment: Qt.AlignVCenter
font.pointSize: Appearance.font.size.large
text: "list"
}
CustomText {
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
font.pointSize: Appearance.font.size.normal
text: qsTr("Recordings")
}
IconButton {
icon: root.props.recordingListExpanded ? "unfold_less" : "unfold_more"
label.animate: true
type: IconButton.Text
onClicked: root.props.recordingListExpanded = !root.props.recordingListExpanded
}
}
}
CustomListView {
id: list
Layout.fillWidth: true
Layout.rightMargin: -Appearance.spacing.small
clip: true
implicitHeight: (Appearance.font.size.larger + Appearance.padding.small) * (root.props.recordingListExpanded ? 10 : 3)
CustomScrollBar.vertical: CustomScrollBar {
flickable: list
}
add: Transition {
Anim {
from: 0
property: "opacity"
to: 1
}
Anim {
from: 0.5
property: "scale"
to: 1
}
}
delegate: RowLayout {
id: recording
property string baseName
required property FileSystemEntry modelData
anchors.left: list.contentItem.left
anchors.right: list.contentItem.right
anchors.rightMargin: Appearance.spacing.small
spacing: Appearance.spacing.small / 2
Component.onCompleted: baseName = modelData.baseName
CustomText {
Layout.fillWidth: true
Layout.rightMargin: Appearance.spacing.small / 2
color: DynamicColors.palette.m3onSurfaceVariant
elide: Text.ElideRight
text: {
const time = recording.baseName;
const matches = time.match(/^recording_(\d{4})(\d{2})(\d{2})_(\d{2})-(\d{2})-(\d{2})/);
if (!matches)
return time;
const date = new Date(...matches.slice(1));
date.setMonth(date.getMonth() - 1);
return qsTr("Recording at %1").arg(Qt.formatDateTime(date, Qt.locale()));
}
}
IconButton {
icon: "play_arrow"
type: IconButton.Text
onClicked: {
root.visibilities.sidebar = false;
Quickshell.execDetached(["app2unit", "--", ...Config.general.apps.playback, recording.modelData.path]);
}
}
IconButton {
icon: "folder"
type: IconButton.Text
onClicked: {
root.visibilities.sidebar = false;
Quickshell.execDetached(["app2unit", "--", ...Config.general.apps.explorer, recording.modelData.path]);
}
}
}
displaced: Transition {
Anim {
properties: "opacity,scale"
to: 1
}
Anim {
property: "y"
}
}
Behavior on implicitHeight {
Anim {
}
}
model: FileSystemModel {
nameFilters: ["recording_*.mp4"]
path: Paths.recsdir
sortReverse: true
}
remove: Transition {
Anim {
property: "opacity"
to: 0
}
Anim {
property: "scale"
to: 0.5
}
}
Loader {
active: opacity > 0
anchors.centerIn: parent
asynchronous: true
opacity: list.count === 0 ? 1 : 0
Behavior on opacity {
Anim {
}
}
sourceComponent: ColumnLayout {
spacing: Appearance.spacing.small
MaterialIcon {
Layout.alignment: Qt.AlignHCenter
Layout.preferredHeight: root.props.recordingListExpanded ? implicitHeight : 0
color: DynamicColors.palette.m3outline
font.pointSize: Appearance.font.size.extraLarge
opacity: root.props.recordingListExpanded ? 1 : 0
scale: root.props.recordingListExpanded ? 1 : 0
text: "scan_delete"
Behavior on Layout.preferredHeight {
Anim {
}
}
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
}
RowLayout {
spacing: Appearance.spacing.smaller
MaterialIcon {
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: !root.props.recordingListExpanded ? implicitWidth : 0
color: DynamicColors.palette.m3outline
opacity: !root.props.recordingListExpanded ? 1 : 0
scale: !root.props.recordingListExpanded ? 1 : 0
text: "scan_delete"
Behavior on Layout.preferredWidth {
Anim {
}
}
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
}
CustomText {
color: DynamicColors.palette.m3outline
text: qsTr("No recordings found")
}
}
}
}
}
}
@@ -1,13 +1,14 @@
import qs.Modules.Notifications.Sidebar.Utils.Cards
import qs.Config
import Quickshell
import QtQuick
import QtQuick.Layouts
import qs.Modules.Notifications.Sidebar.Utils.Cards
import qs.Config
Item {
id: root
required property Item popouts
required property var props
required property PersistentProperties props
required property var visibilities
implicitHeight: layout.implicitHeight
@@ -22,6 +23,12 @@ Item {
IdleInhibit {
}
Record {
props: root.props
visibilities: root.visibilities
z: 1
}
Toggles {
popouts: root.popouts
visibilities: root.visibilities
+5 -3
View File
@@ -100,13 +100,15 @@ Item {
icon: `brightness_${(Math.round(value * 6) + 1)}`
value: root.brightness
onMoved: {
onPressedChanged: {
if (!pressed) {
if (Config.osd.allMonBrightness) {
root.monitor?.setBrightness(value);
} else {
for (const mon of Brightness.monitors) {
mon.setBrightness(value);
}
} else {
root.monitor?.setBrightness(value);
}
}
}
}
+6
View File
@@ -116,6 +116,12 @@ Item {
key: "updates"
name: "Updates"
}
ListElement {
icon: "extension"
key: "plugins"
name: "Extensions"
}
}
CustomClippingRect {
@@ -1,3 +1,4 @@
import QtQuick
import qs.Modules.Settings.Controls
import qs.Config
@@ -80,6 +81,7 @@ SettingsPage {
name: "Sans family"
object: Config.appearance.font.family
setting: "sans"
stringList: Qt.fontFamilies()
}
Separator {
@@ -89,6 +91,7 @@ SettingsPage {
name: "Monospace family"
object: Config.appearance.font.family
setting: "mono"
stringList: Qt.fontFamilies()
}
}
+3 -3
View File
@@ -1,3 +1,4 @@
import Quickshell
import QtQuick.Layouts
import qs.Modules.Settings.Controls
import qs.Config
@@ -5,6 +6,8 @@ import qs.Config
SettingsPage {
id: root
required property ShellScreen screen
SettingsSection {
sectionId: "Wallpaper"
@@ -33,8 +36,6 @@ SettingsPage {
}
WallpaperCropper {
Layout.fillWidth: true
Layout.preferredHeight: 600
}
}
@@ -42,7 +43,6 @@ SettingsPage {
sectionId: "Wallpapers"
WallpaperGrid {
Layout.fillWidth: true
}
}
}
+111 -111
View File
@@ -19,8 +19,8 @@ SettingsPage {
}
SettingSpinBox {
name: "Media update interval"
min: 0
name: "Media update interval"
object: Config.dashboard
setting: "mediaUpdateInterval"
step: 50
@@ -30,8 +30,8 @@ SettingsPage {
}
SettingSpinBox {
name: "Resource update interval"
min: 0
name: "Resource update interval"
object: Config.dashboard
setting: "resourceUpdateInterval"
step: 50
@@ -41,8 +41,8 @@ SettingsPage {
}
SettingSpinBox {
name: "Drag threshold"
min: 0
name: "Drag threshold"
object: Config.dashboard
setting: "dragThreshold"
}
@@ -107,112 +107,112 @@ SettingsPage {
}
}
SettingsSection {
sectionId: "Layout Sizes"
SettingsHeader {
name: "Layout Sizes"
}
SettingReadOnly {
name: "Tab indicator height"
value: String(Config.dashboard.sizes.tabIndicatorHeight)
}
Separator {
}
SettingReadOnly {
name: "Tab indicator spacing"
value: String(Config.dashboard.sizes.tabIndicatorSpacing)
}
Separator {
}
SettingReadOnly {
name: "Info width"
value: String(Config.dashboard.sizes.infoWidth)
}
Separator {
}
SettingReadOnly {
name: "Info icon size"
value: String(Config.dashboard.sizes.infoIconSize)
}
Separator {
}
SettingReadOnly {
name: "Date time width"
value: String(Config.dashboard.sizes.dateTimeWidth)
}
Separator {
}
SettingReadOnly {
name: "Media width"
value: String(Config.dashboard.sizes.mediaWidth)
}
Separator {
}
SettingReadOnly {
name: "Media progress sweep"
value: String(Config.dashboard.sizes.mediaProgressSweep)
}
Separator {
}
SettingReadOnly {
name: "Media progress thickness"
value: String(Config.dashboard.sizes.mediaProgressThickness)
}
Separator {
}
SettingReadOnly {
name: "Resource progress thickness"
value: String(Config.dashboard.sizes.resourceProgessThickness)
}
Separator {
}
SettingReadOnly {
name: "Weather width"
value: String(Config.dashboard.sizes.weatherWidth)
}
Separator {
}
SettingReadOnly {
name: "Media cover art size"
value: String(Config.dashboard.sizes.mediaCoverArtSize)
}
Separator {
}
SettingReadOnly {
name: "Media visualiser size"
value: String(Config.dashboard.sizes.mediaVisualiserSize)
}
Separator {
}
SettingReadOnly {
name: "Resource size"
value: String(Config.dashboard.sizes.resourceSize)
}
}
// SettingsSection {
// sectionId: "Layout Sizes"
//
// SettingsHeader {
// name: "Layout Sizes"
// }
//
// SettingReadOnly {
// name: "Tab indicator height"
// value: String(Config.dashboard.sizes.tabIndicatorHeight)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Tab indicator spacing"
// value: String(Config.dashboard.sizes.tabIndicatorSpacing)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Info width"
// value: String(Config.dashboard.sizes.infoWidth)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Info icon size"
// value: String(Config.dashboard.sizes.infoIconSize)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Date time width"
// value: String(Config.dashboard.sizes.dateTimeWidth)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Media width"
// value: String(Config.dashboard.sizes.mediaWidth)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Media progress sweep"
// value: String(Config.dashboard.sizes.mediaProgressSweep)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Media progress thickness"
// value: String(Config.dashboard.sizes.mediaProgressThickness)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Resource progress thickness"
// value: String(Config.dashboard.sizes.resourceProgessThickness)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Weather width"
// value: String(Config.dashboard.sizes.weatherWidth)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Media cover art size"
// value: String(Config.dashboard.sizes.mediaCoverArtSize)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Media visualiser size"
// value: String(Config.dashboard.sizes.mediaVisualiserSize)
// }
//
// Separator {
// }
//
// SettingReadOnly {
// name: "Resource size"
// value: String(Config.dashboard.sizes.resourceSize)
// }
// }
}
+52
View File
@@ -1,4 +1,6 @@
import Quickshell
import QtQuick
import QtQuick.Layouts
import qs.Modules.Settings.Controls
import qs.Config
import qs.Components
@@ -67,6 +69,7 @@ SettingsPage {
CustomSplitButtonRow {
active: Config.general.color.mode === "light" ? menuItems[0] : menuItems[1]
buttonAlias.disabled: !Config.general.color.schemeGeneration
label: qsTr("Scheme mode")
menuItems: [
@@ -100,6 +103,7 @@ SettingsPage {
id: schemeType
active: root.schemeTypeItem(menuItems, Config.colors.schemeType)
buttonAlias.disabled: !Config.general.color.schemeGeneration
label: qsTr("Scheme type")
z: 2
@@ -169,21 +173,69 @@ SettingsPage {
}
Separator {
shouldBeActive: Config.general.color.schemeGeneration ? 0 : 1
}
SchemesListView {
name: "Color scheme presets"
object: Config.colors.presets
setting: "name"
shouldBeActive: Config.general.color.schemeGeneration ? 0 : 1
stringList: FetchPresets.presetNames()
}
Separator {
shouldBeActive: Config.colors.presets.name !== "" && !Config.general.color.schemeGeneration
}
SchemesListView {
name: "Preset variant"
object: Config.colors.presets
setting: "variant"
shouldBeActive: Config.colors.presets.name !== "" && !Config.general.color.schemeGeneration
stringList: FetchPresets.variantNames(Config.colors.presets.name)
onOptionSet: item => {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--preset", `${Config.colors.presets.name.toLowerCase()}:${item}`]);
}
}
Separator {
shouldBeActive: Config.colors.presets.variant !== "" && FetchPresets.accents(Config.colors.presets.name, Config.colors.presets.variant).length > 0 && !Config.general.color.schemeGeneration
}
SchemesListView {
name: "Preset accent"
object: Config.colors.presets
setting: "accent"
shouldBeActive: Config.colors.presets.variant !== "" && FetchPresets.accents(Config.colors.presets.name, Config.colors.presets.variant).length > 0 && !Config.general.color.schemeGeneration
stringList: FetchPresets.accents(Config.colors.presets.name, Config.colors.presets.variant)
onOptionSet: item => {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--preset", `${Config.colors.presets.name.toLowerCase()}:${Config.colors.presets.variant}`, "--accent", `${item}`]);
}
}
Separator {
shouldBeActive: Config.general.color.schemeGeneration ? 1 : 0
}
SettingSwitch {
name: "Smart color scheme"
object: Config.general.color
setting: "smart"
shouldBeActive: Config.general.color.schemeGeneration ? 1 : 0
}
Separator {
shouldBeActive: Config.general.color.schemeGeneration ? 1 : 0
}
SettingSpinner {
name: "Schedule dark mode"
object: Config.general.color
settings: ["scheduleDarkStart", "scheduleDarkEnd", "scheduleDark"]
shouldBeActive: Config.general.color.schemeGeneration ? 1 : 0
}
Separator {
@@ -50,6 +50,15 @@ SettingsPage {
Separator {
}
SettingSwitch {
name: "Show notification icon"
object: Config.lock
setting: "showNotifIcon"
}
Separator {
}
SettingSpinBox {
min: 0
name: "Blur amount"
@@ -94,6 +103,18 @@ SettingsPage {
}
}
SettingsSection {
sectionId: "Greeter"
SettingsHeader {
name: "Greeter"
}
SettingsIconButton {
name: "Install wallpaper and color scheme to greeter"
}
}
SettingsSection {
sectionId: "Idle"
@@ -9,6 +9,8 @@ import qs.Modules.Settings.Controls
ColumnLayout {
id: root
property bool shouldBeActive: true
function addTimeoutEntry() {
let list = [...Config.general.idle.timeouts];
@@ -40,8 +42,26 @@ ColumnLayout {
Config.save();
}
Layout.fillWidth: true
anchors.left: parent.left
anchors.right: parent.right
height: shouldBeActive ? implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
spacing: Appearance.spacing.smaller
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Settings {
name: "Idle Monitors"
@@ -52,6 +72,8 @@ ColumnLayout {
SettingList {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
onAddActiveActionRequested: {
root.updateTimeoutEntry(index, "activeAction", "");
+18
View File
@@ -0,0 +1,18 @@
import qs.Modules.Settings.Controls
import qs.Config
SettingsPage {
SettingsSection {
sectionId: "Plugins"
SettingsHeader {
name: "Plugins"
}
SettingBarEntryList {
name: "Enable or disable plugins"
object: Config.plugins
setting: "entries"
}
}
}
+97 -97
View File
@@ -19,8 +19,8 @@ SettingsPage {
}
SettingSpinBox {
name: "Max toasts"
min: 1
name: "Max toasts"
object: Config.utilities
setting: "maxToasts"
}
@@ -29,8 +29,8 @@ SettingsPage {
}
SettingSpinBox {
name: "Panel width"
min: 1
name: "Panel width"
object: Config.utilities.sizes
setting: "width"
}
@@ -39,8 +39,8 @@ SettingsPage {
}
SettingSpinBox {
name: "Toast width"
min: 1
name: "Toast width"
object: Config.utilities.sizes
setting: "toastWidth"
}
@@ -77,100 +77,100 @@ SettingsPage {
setting: "gameModeChanged"
}
Separator {
// Separator {
// }
//
// SettingSwitch {
// name: "Do not disturb changed"
// object: Config.utilities.toasts
// setting: "dndChanged"
// }
//
// Separator {
// }
//
// SettingSwitch {
// name: "Audio output changed"
// object: Config.utilities.toasts
// setting: "audioOutputChanged"
// }
//
// Separator {
// }
//
// SettingSwitch {
// name: "Audio input changed"
// object: Config.utilities.toasts
// setting: "audioInputChanged"
// }
//
// Separator {
// }
//
// SettingSwitch {
// name: "Caps lock changed"
// object: Config.utilities.toasts
// setting: "capsLockChanged"
// }
//
// Separator {
// }
//
// SettingSwitch {
// name: "Num lock changed"
// object: Config.utilities.toasts
// setting: "numLockChanged"
// }
//
// Separator {
// }
//
// SettingSwitch {
// name: "Keyboard layout changed"
// object: Config.utilities.toasts
// setting: "kbLayoutChanged"
// }
//
// Separator {
// }
//
// SettingSwitch {
// name: "VPN changed"
// object: Config.utilities.toasts
// setting: "vpnChanged"
// }
//
// Separator {
// }
//
// SettingSwitch {
// name: "Now playing"
// object: Config.utilities.toasts
// setting: "nowPlaying"
// }
}
SettingSwitch {
name: "Do not disturb changed"
object: Config.utilities.toasts
setting: "dndChanged"
}
Separator {
}
SettingSwitch {
name: "Audio output changed"
object: Config.utilities.toasts
setting: "audioOutputChanged"
}
Separator {
}
SettingSwitch {
name: "Audio input changed"
object: Config.utilities.toasts
setting: "audioInputChanged"
}
Separator {
}
SettingSwitch {
name: "Caps lock changed"
object: Config.utilities.toasts
setting: "capsLockChanged"
}
Separator {
}
SettingSwitch {
name: "Num lock changed"
object: Config.utilities.toasts
setting: "numLockChanged"
}
Separator {
}
SettingSwitch {
name: "Keyboard layout changed"
object: Config.utilities.toasts
setting: "kbLayoutChanged"
}
Separator {
}
SettingSwitch {
name: "VPN changed"
object: Config.utilities.toasts
setting: "vpnChanged"
}
Separator {
}
SettingSwitch {
name: "Now playing"
object: Config.utilities.toasts
setting: "nowPlaying"
}
}
SettingsSection {
sectionId: "VPN"
SettingsHeader {
name: "VPN"
}
SettingSwitch {
name: "Enable VPN integration"
object: Config.utilities.vpn
setting: "enabled"
}
Separator {
}
SettingStringList {
name: "Provider"
addLabel: qsTr("Add VPN provider")
object: Config.utilities.vpn
setting: "provider"
}
}
// SettingsSection {
// sectionId: "VPN"
//
// SettingsHeader {
// name: "VPN"
// }
//
// SettingSwitch {
// name: "Enable VPN integration"
// object: Config.utilities.vpn
// setting: "enabled"
// }
//
// Separator {
// }
//
// SettingStringList {
// name: "Provider"
// addLabel: qsTr("Add VPN provider")
// object: Config.utilities.vpn
// setting: "provider"
// }
// }
}
+13 -2
View File
@@ -1,3 +1,5 @@
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Widgets
import QtQuick
@@ -20,7 +22,6 @@ Item {
required property PersistentProperties visibilities
function scrollToSetting(section: string, settingName: string) {
// Wait for the StackView transition to complete, then scroll
root.pendingSection = section;
root.pendingSetting = settingName;
scrollTimer.restart();
@@ -78,6 +79,8 @@ Item {
stack.push(screenshot);
else if (currentCategory === "updates")
stack.push(updates);
else if (currentCategory === "plugins")
stack.push(plugins);
}
target: root
@@ -133,7 +136,7 @@ Item {
anchors.right: parent.right
anchors.top: searchBar.bottom
anchors.topMargin: Appearance.spacing.smaller
color: DynamicColors.tPalette.m3surfaceContainer
color: DynamicColors.tPalette.m3surfaceContainerLowest
radius: Appearance.rounding.normal
StackView {
@@ -157,6 +160,7 @@ Item {
id: background
Cat.Background {
screen: root.screen
}
}
@@ -243,4 +247,11 @@ Item {
Cat.SystemUpdates {
}
}
Component {
id: plugins
Cat.Plugins {
}
}
}
@@ -0,0 +1,161 @@
pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import QtQuick.Layouts
import qs.Config
import qs.Components
Item {
id: root
required property string name
required property var object
property alias row: row
required property string setting
property bool shouldBeActive: true
required property list<var> stringList
signal optionSet(option: string)
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.height : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
RowLayout {
id: row
anchors.left: parent.left
anchors.margins: Appearance.padding.small
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
CustomText {
id: text
Layout.fillWidth: true
font.pointSize: Appearance.font.size.larger
text: root.name
}
CustomClippingRect {
Layout.preferredHeight: 42 * 6 + Appearance.padding.normal * 2 + Appearance.spacing.small * 5
Layout.preferredWidth: 500
color: DynamicColors.tPalette.m3surfaceContainer
radius: (21 + Appearance.padding.normal) * Appearance.rounding.scale
CustomRect {
id: searchBox
anchors.left: parent.left
anchors.margins: Appearance.padding.normal
anchors.right: parent.right
anchors.top: parent.top
color: DynamicColors.tPalette.m3surfaceContainer
implicitHeight: 42
radius: Appearance.rounding.full
MaterialIcon {
id: searchIcon
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.leftMargin: Appearance.padding.large
anchors.top: parent.top
font.pointSize: Appearance.font.size.large
text: "search"
verticalAlignment: Text.AlignVCenter
}
CustomTextField {
id: textSearch
anchors.left: searchIcon.right
anchors.leftMargin: Appearance.spacing.small
anchors.right: parent.right
anchors.rightMargin: Appearance.spacing.normal
anchors.verticalCenter: parent.verticalCenter
placeholderText: "Search..."
}
}
CustomClippingRect {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.margins: Appearance.padding.normal
anchors.right: parent.right
anchors.top: searchBox.bottom
bottomLeftRadius: 21
bottomRightRadius: 21
CustomListView {
anchors.fill: parent
clip: true
spacing: Appearance.spacing.small
delegate: CustomRect {
id: delegate
required property string modelData
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: 42
radius: Appearance.rounding.smallest
CustomText {
anchors.fill: parent
anchors.leftMargin: Appearance.padding.normal
text: modelData
verticalAlignment: Text.AlignVCenter
}
MaterialIcon {
anchors.fill: parent
anchors.rightMargin: Appearance.padding.normal
color: DynamicColors.palette.m3primary
font.pointSize: Appearance.font.size.large
horizontalAlignment: Text.AlignRight
text: "check_circle"
verticalAlignment: Text.AlignVCenter
visible: root.object[root.setting] === delegate.modelData
}
StateLayer {
onClicked: {
root.object[root.setting] = delegate.modelData;
root.optionSet(delegate.modelData);
Config.save();
}
}
}
model: ScriptModel {
values: {
const values = root.stringList;
const search = textSearch.text;
var regex = new RegExp(search, "i");
return values.filter(n => regex.test(n));
}
}
}
}
}
}
}
+21 -2
View File
@@ -6,7 +6,26 @@ import qs.Config
CustomRect {
id: root
Layout.fillWidth: true
Layout.preferredHeight: 1
property bool shouldBeActive: true
anchors.left: parent.left
anchors.right: parent.right
color: DynamicColors.tPalette.m3outlineVariant
implicitHeight: shouldBeActive ? 1 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
}
@@ -13,6 +13,7 @@ ColumnLayout {
required property string name
required property var object
required property string setting
property bool shouldBeActive: true
function addAction() {
const list = [...root.object[root.setting]];
@@ -44,8 +45,26 @@ ColumnLayout {
Config.save();
}
Layout.fillWidth: true
anchors.left: parent.left
anchors.right: parent.right
height: shouldBeActive ? implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
spacing: Appearance.spacing.smaller
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
@@ -108,6 +127,9 @@ ColumnLayout {
}
Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
}
RowLayout {
@@ -188,6 +210,8 @@ ColumnLayout {
StringListEditor {
Layout.fillWidth: true
addLabel: qsTr("Add command argument")
anchors.left: undefined
anchors.right: undefined
values: [...(modelData.command ?? [])]
onListEdited: function (values) {
@@ -196,6 +220,9 @@ ColumnLayout {
}
Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
}
RowLayout {
@@ -214,6 +241,9 @@ ColumnLayout {
}
Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
}
RowLayout {
+44 -13
View File
@@ -6,13 +6,14 @@ import qs.Components
import qs.Config
import qs.Helpers
ColumnLayout {
CustomRect {
id: root
readonly property bool highlighted: SettingsHighlight.highlightedSetting === name
required property string name
required property var object
required property string setting
property bool shouldBeActive: true
function addAlias() {
const list = [...root.object[root.setting]];
@@ -40,8 +41,25 @@ ColumnLayout {
Config.save();
}
Layout.fillWidth: true
spacing: Appearance.spacing.smaller
anchors.left: parent.left
anchors.right: parent.right
height: shouldBeActive ? layout.implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
@@ -58,6 +76,14 @@ ColumnLayout {
}
}
ColumnLayout {
id: layout
anchors.left: parent.left
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: Appearance.spacing.smaller
CustomText {
Layout.fillWidth: true
font.pointSize: Appearance.font.size.larger
@@ -102,15 +128,17 @@ ColumnLayout {
}
CustomRect {
Layout.fillWidth: true
Layout.preferredHeight: 33
Layout.preferredWidth: Math.max(Math.min(fromTextField.contentWidth + Appearance.padding.large * 2, 550), 50)
color: DynamicColors.tPalette.m3surfaceContainerHigh
radius: Appearance.rounding.full
CustomTextField {
anchors.fill: parent
anchors.leftMargin: Appearance.padding.normal
anchors.rightMargin: Appearance.padding.normal
id: fromTextField
anchors.centerIn: parent
horizontalAlignment: Text.AlignHCenter
implicitWidth: Math.min(contentWidth + Appearance.padding.normal * 2, 550)
text: modelData.from ?? ""
onEditingFinished: root.updateAlias(index, "from", text)
@@ -135,15 +163,17 @@ ColumnLayout {
}
CustomRect {
Layout.fillWidth: true
Layout.preferredHeight: 33
color: DynamicColors.tPalette.m3surface
radius: Appearance.rounding.small
Layout.preferredWidth: Math.max(Math.min(toTextField.contentWidth + Appearance.padding.large * 2, 550), 50)
color: DynamicColors.tPalette.m3surfaceContainerHigh
radius: Appearance.rounding.full
CustomTextField {
anchors.fill: parent
anchors.leftMargin: Appearance.padding.normal
anchors.rightMargin: Appearance.padding.normal
id: toTextField
anchors.centerIn: parent
horizontalAlignment: Text.AlignHCenter
implicitWidth: Math.min(contentWidth + Appearance.padding.normal * 2, 550)
text: modelData.to ?? ""
onEditingFinished: root.updateAlias(index, "to", text)
@@ -169,4 +199,5 @@ ColumnLayout {
text: qsTr("Add alias")
}
}
}
}
@@ -25,6 +25,7 @@ Item {
required property var object
property var pendingCommitEntries: []
required property string setting
property bool shouldBeActive: true
property int uidCounter: 0
property var visualEntries: []
@@ -146,8 +147,25 @@ Item {
Config.save();
}
Layout.fillWidth: true
implicitHeight: layout.implicitHeight
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? layout.implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Component.onCompleted: root.rebuildVisualEntries()
@@ -11,6 +11,7 @@ Item {
required property string name
required property var object
required property list<string> settings
property bool shouldBeActive: true
function commitChoice(choice: int, setting: string): void {
root.object[setting] = choice;
@@ -32,8 +33,25 @@ Item {
return Qt.formatTime(d, "h AP");
}
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.implicitHeight + Appearance.padding.smaller * 2 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
+20 -2
View File
@@ -11,6 +11,7 @@ Item {
required property string name
required property var object
required property string setting
property bool shouldBeActive: true
function formattedValue(): string {
const value = root.object[root.setting];
@@ -21,8 +22,25 @@ Item {
return String(value);
}
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.implicitHeight + Appearance.padding.smaller * 2 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
+26 -2
View File
@@ -8,13 +8,31 @@ Item {
required property int index
required property var modelData
property bool shouldBeActive: true
signal addActiveActionRequested
signal deleteRequested(int index)
signal fieldEdited(string key, var value)
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.implicitHeight + Appearance.padding.smaller * 2 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
CustomRect {
anchors.left: parent.left
@@ -176,6 +194,9 @@ Item {
}
Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
}
RowLayout {
@@ -207,6 +228,9 @@ Item {
}
Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
}
Item {
+27 -4
View File
@@ -11,10 +11,32 @@ Item {
required property string name
required property var object
property alias row: row
required property string setting
property bool shouldBeActive: true
required property list<var> stringList
Layout.fillWidth: true
Layout.preferredHeight: row.height
signal optionSet
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.height : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
RowLayout {
id: row
@@ -120,17 +142,18 @@ Item {
StateLayer {
onClicked: {
root.object[root.setting] = fontDelegate.modelData;
root.optionSet();
Config.save();
}
}
}
model: ScriptModel {
values: {
const fonts = Qt.fontFamilies();
const values = root.stringList;
const search = fontSearch.text;
var regex = new RegExp(search, "i");
return fonts.filter(n => regex.test(n));
return values.filter(n => regex.test(n));
}
}
}
+20 -2
View File
@@ -9,10 +9,28 @@ Item {
readonly property bool highlighted: SettingsHighlight.highlightedSetting === name
required property string name
property bool shouldBeActive: true
required property string value
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.implicitHeight + Appearance.padding.smaller * 2 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
+20 -2
View File
@@ -13,10 +13,28 @@ Item {
required property string name
required property var object
required property string setting
property bool shouldBeActive: true
property real step: 1
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.implicitHeight + Appearance.padding.smaller * 2 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
+20 -2
View File
@@ -11,6 +11,7 @@ Item {
required property string name
required property var object
required property list<string> settings
property bool shouldBeActive: true
function commitChoice(choice: int, setting: string): void {
root.object[setting] = choice;
@@ -32,8 +33,25 @@ Item {
return Qt.formatTime(d, "h AP");
}
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.implicitHeight + Appearance.padding.smaller * 2 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
@@ -12,9 +12,27 @@ Item {
required property string name
required property var object
required property string setting
property bool shouldBeActive: true
Layout.fillWidth: true
Layout.preferredHeight: layout.implicitHeight
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? layout.implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
@@ -46,6 +64,9 @@ Item {
StringListEditor {
Layout.fillWidth: true
addLabel: root.addLabel
anchors.left: undefined
anchors.right: undefined
anchors.verticalCenter: undefined
values: [...(root.object[root.setting] ?? [])]
onListEdited: function (values) {
+20 -2
View File
@@ -11,9 +11,27 @@ Item {
required property string name
required property var object
required property string setting
property bool shouldBeActive: true
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.implicitHeight + Appearance.padding.smaller * 2 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
+6 -2
View File
@@ -7,9 +7,13 @@ CustomRect {
id: root
required property string name
property bool shouldBeActive: true
Layout.preferredHeight: 60
Layout.preferredWidth: 200
implicitHeight: 60
implicitWidth: 200
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
CustomText {
anchors.fill: parent
@@ -0,0 +1,83 @@
import Quickshell
import QtQuick
import QtQuick.Layouts
import qs.Paths
import qs.Components
import qs.Config
import qs.Helpers
Item {
id: root
property alias button: iButton
readonly property bool highlighted: SettingsHighlight.highlightedSetting === name
required property string name
property bool shouldBeActive: true
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? row.implicitHeight + Appearance.padding.smaller * 2 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle {
anchors.fill: parent
anchors.margins: -Appearance.padding.smaller
color: DynamicColors.palette.m3primaryContainer
opacity: root.highlighted ? 0.5 : 0
radius: Appearance.rounding.small
Behavior on opacity {
Anim {
duration: Appearance.anim.durations.normal
}
}
}
RowLayout {
id: row
anchors.left: parent.left
anchors.margins: Appearance.padding.small
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
CustomText {
id: text
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.fillWidth: true
font.pointSize: Appearance.font.size.larger
text: root.name
}
IconButton {
id: iButton
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
icon: "download"
onClicked: {
const lockBg = `${Paths.state}/lockscreen_bg.png`;
const scheme = `${Paths.state}/scheme.json`;
const face = `${Paths.home}/.face`;
const destination = "/etc/zshell-greeter/images";
Quickshell.execDetached(["pkexec", "sh", "-c", `mkdir -p ${destination}; cp ${lockBg} ${destination}; cp ${scheme} /etc/zshell-greeter; cp ${face} ${destination}`]);
}
}
}
}
+7 -1
View File
@@ -60,12 +60,18 @@ CustomClippingRect {
}
}
ColumnLayout {
Column {
id: clayout
anchors.left: parent.left
anchors.right: parent.right
spacing: Appearance.spacing.small
// move: Transition {
// Anim {
// properties: "y"
// }
// }
}
}
}
+25 -4
View File
@@ -10,18 +10,39 @@ CustomRect {
property real contentPadding: Appearance.padding.large
property string sectionId: ""
Layout.fillWidth: true
Layout.preferredHeight: layout.implicitHeight + contentPadding * 2
anchors.left: parent.left
anchors.right: parent.right
color: DynamicColors.tPalette.m3surfaceContainer
implicitHeight: layout.height + contentPadding * 2
radius: Appearance.rounding.normal - Appearance.padding.smaller
ColumnLayout {
Behavior on implicitHeight {
Anim {
}
}
Behavior on y {
Anim {
}
}
Column {
id: layout
anchors.left: parent.left
anchors.margins: root.contentPadding
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.top: parent.top
// anchors.verticalCenter: parent.verticalCenter
spacing: Appearance.spacing.normal
Behavior on height {
Anim {
}
}
move: Transition {
Anim {
properties: "y"
}
}
}
}
@@ -12,12 +12,29 @@ CustomRect {
property alias expanded: menu.expanded
property alias label: label
property alias menu: menu
property bool shouldBeActive: true
property alias text: label.text
color: enabled ? DynamicColors.palette.m3primary : DynamicColors.layer(DynamicColors.palette.m3surfaceContainerHigh, 2)
opacity: shouldBeActive ? 1 : 0
radius: Appearance.rounding.full
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
z: expanded ? 100 : 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
CustomText {
id: label
+20 -1
View File
@@ -9,6 +9,7 @@ ColumnLayout {
id: root
property string addLabel: qsTr("Add entry")
property bool shouldBeActive: true
property var values: []
signal listEdited(var values)
@@ -31,8 +32,26 @@ ColumnLayout {
root.listEdited(list);
}
Layout.fillWidth: true
anchors.left: parent.left
anchors.right: parent.right
height: shouldBeActive ? implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
spacing: Appearance.spacing.smaller
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Repeater {
model: [...root.values]
+224 -59
View File
@@ -1,73 +1,254 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Quickshell
import Quickshell.Hyprland
import ZShell.Internal
import qs.Config
import qs.Components
import qs.Helpers
Item {
id: wrapper
property bool changesMade: false
property bool shouldBeActive: true
signal requestCrop
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: shouldBeActive ? 400 : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
IconButton {
anchors.margins: Appearance.padding.normal
anchors.right: parent.right
anchors.top: parent.top
icon: "check"
opacity: wrapper.changesMade ? 1 : 0
scale: wrapper.changesMade ? 1 : 0
z: 2
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
onClicked: {
wrapper.requestCrop();
wrapper.changesMade = false;
}
}
RowLayout {
id: root
Image {
id: imageView
property real displayH: paintedHeight
property real displayW: paintedWidth
property real displayX: (width - paintedWidth) * 0.5
property real displayY: (height - paintedHeight) * 0.5
property real scaleX: sourceW / displayW
property real scaleY: sourceH / displayH
property real sourceH: Quickshell.screens[0].height
property real sourceW: Quickshell.screens[0].width
anchors.fill: parent
fillMode: Image.PreserveAspectFit
smooth: true
source: Wallpapers.current
spacing: Appearance.spacing.normal
Repeater {
model: ScriptModel {
values: [...Quickshell.screens].sort((a, b) => {
return a.x - b.x;
})
}
Item {
id: overlay
id: delegate
clip: true
height: imageView.displayH
width: imageView.displayW
x: imageView.displayX
y: imageView.displayY
required property ShellScreen modelData
function applyCrop(): void {
const croprect = cropRect.mapToItem(scaledImg, 0, 0, cropRect.width, cropRect.height);
const upscaledRect = Qt.rect((croprect.x - cropRect.imageX) / scaledImg.paintedWidth, (croprect.y - cropRect.imageY) / scaledImg.paintedHeight, croprect.width / scaledImg.paintedWidth, croprect.height / scaledImg.paintedHeight);
Wallpapers.setCrop(delegate.modelData.name, upscaledRect, croprect, cropRect.zoom);
}
function zoomClipRect(zoom: real): void {
let oldCenterX = cropRect.x + cropRect.width * 0.5;
let oldCenterY = cropRect.y + cropRect.height * 0.5;
cropRect.zoom = zoom;
cropRect.x = oldCenterX - cropRect.width * 0.5;
cropRect.y = oldCenterY - cropRect.height * 0.5;
cropRect.clampToBounds();
}
Layout.fillHeight: true
Layout.fillWidth: true
Connections {
function onRequestCrop(): void {
delegate.applyCrop();
}
target: wrapper
}
RowLayout {
id: sliderLayout
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: 30
spacing: Appearance.spacing.large
CustomText {
text: qsTr("Crop scale")
}
CustomSlider {
id: zoomSlider
Layout.fillWidth: true
Layout.preferredHeight: 10
from: 1.0
to: 5.0
value: cropRect.zoom
onMoved: {
delegate.zoomClipRect(value);
wrapper.changesMade = true;
}
}
}
CachingImage {
id: scaledImg
property var displayData
property real monitorScale: 1.0
anchors.bottom: sliderLayout.top
anchors.bottomMargin: Appearance.spacing.normal
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
asynchronous: true
fillMode: Image.PreserveAspectFit
// retainWhileLoading: true
source: Wallpapers.current
sourceSize.height: parent.height
sourceSize.width: parent.width
onPaintedWidthChanged: {
if (paintedWidth > 0) {
scaledImg.displayData = Wallpapers.getCrop(delegate.modelData.name);
cropRect.zoom = Wallpapers.getCrop(delegate.modelData.name).zoom;
cropRect.restoreFromData();
}
}
onSourceChanged: cropRect.clampToBounds()
onStatusChanged: if (scaledImg.status == Image.Ready)
cropRect.clampToBounds()
CustomText {
id: monitorId
anchors.centerIn: parent
color: Qt.alpha(DynamicColors.palette.m3surface, 0.85)
font.pointSize: Appearance.font.size.large * 4
style: Text.Outline
styleColor: DynamicColors.palette.m3onSurface
text: delegate.modelData.name
}
CustomRect {
id: cropRect
property real aspectRatio: Quickshell.screens[0].width / Quickshell.screens[0].height
readonly property rect sourceRect: Qt.rect(x * imageView.scaleX, y * imageView.scaleY, width * imageView.scaleX, height * imageView.scaleY)
property real zoom: Config.background.zoom
property real aspectRatio: delegate.modelData.width / delegate.modelData.height
readonly property real baseHeight: baseWidth / aspectRatio
readonly property real baseWidth: {
let fittedHeight = scaledImg.paintedHeight;
let fittedWidth = fittedHeight * aspectRatio;
if (fittedWidth > scaledImg.paintedWidth) {
fittedWidth = scaledImg.paintedWidth;
fittedHeight = fittedWidth / aspectRatio;
}
return fittedWidth;
}
readonly property real imageX: (scaledImg.width - scaledImg.paintedWidth) / 2
readonly property real imageY: (scaledImg.height - scaledImg.paintedHeight) / 2
property real imgAspectRatio: scaledImg.paintedWidth / scaledImg.paintedHeight
property real zoom: scaledImg.displayData.zoom
function centerInImage() {
x = imageX + (scaledImg.paintedWidth - width) / 2;
y = imageY + (scaledImg.paintedHeight - height) / 2;
}
function clampToBounds() {
x = Math.max(0, Math.min(x, overlay.width - width));
x = Math.max(imageX, Math.min(x, imageX + scaledImg.paintedWidth - width));
y = Math.max(0, Math.min(y, overlay.height - height));
y = Math.max(imageY, Math.min(y, imageY + scaledImg.paintedHeight - height));
}
function restoreFromData() {
let data = scaledImg.displayData;
if (data && data.scaledX !== 0 || data.scaledY !== 0 || data.scaledWidth !== 0 || data.scaledHeight !== 0) {
x = data.scaledX;
y = data.scaledY;
clampToBounds();
} else {
zoom = 1.0;
centerInImage();
}
}
border.color: DynamicColors.palette.m3primary
border.width: 2
color: DynamicColors.tPalette.m3primary
height: width / aspectRatio
radius: Appearance.rounding.small
visible: imageView.status === Image.Ready
width: Math.min(overlay.width / zoom, overlay.height * aspectRatio / zoom)
x: Config.background.sourceClipX / imageView.scaleX
y: Config.background.sourceClipY / imageView.scaleY
height: baseHeight / zoom
opacity: 1
width: baseWidth / zoom
Behavior on opacity {
Anim {
}
}
Component.onCompleted: clampToBounds()
onHeightChanged: clampToBounds()
onWidthChanged: clampToBounds()
}
MouseArea {
id: mouse
function updateCrop(mouseX, mouseY) {
let nx = mouseX - cropRect.width * 0.5;
let ny = mouseY - cropRect.height * 0.5;
nx = Math.max(0, Math.min(nx, overlay.width - cropRect.width));
nx = Math.max(cropRect.imageX, Math.min(nx, cropRect.imageX + scaledImg.paintedWidth - cropRect.width));
ny = Math.max(0, Math.min(ny, overlay.height - cropRect.height));
ny = Math.max(cropRect.imageY, Math.min(ny, cropRect.imageY + scaledImg.paintedHeight - cropRect.height));
cropRect.x = nx;
cropRect.y = ny;
@@ -78,36 +259,20 @@ Item {
preventStealing: true
onPositionChanged: mouse => {
if (pressed)
if (pressed) {
updateCrop(mouse.x, mouse.y);
wrapper.changesMade = true;
}
}
onPressed: mouse => {
updateCrop(mouse.x, mouse.y);
wrapper.changesMade = true;
}
onReleased: {
Wallpapers.recentlyChanged = false;
Config.background.sourceClipX = cropRect.sourceRect.x;
Config.background.sourceClipY = cropRect.sourceRect.y;
Config.background.sourceClipW = cropRect.sourceRect.width;
Config.background.sourceClipH = cropRect.sourceRect.height;
Config.save();
wrapper.changesMade = true;
}
}
}
onWheel: wheel => {
let oldCenterX = cropRect.x + cropRect.width * 0.5;
let oldCenterY = cropRect.y + cropRect.height * 0.5;
if (wheel.angleDelta.y > 0)
cropRect.zoom *= 1.1;
else
cropRect.zoom /= 1.1;
cropRect.zoom = Math.max(1.0, Math.min(cropRect.zoom, 10.0));
Config.background.zoom = cropRect.zoom;
cropRect.x = oldCenterX - cropRect.width * 0.5;
cropRect.y = oldCenterY - cropRect.height * 0.5;
cropRect.clampToBounds();
}
}
}
+47 -35
View File
@@ -12,37 +12,30 @@ GridView {
readonly property int columnsCount: Math.max(1, Math.floor(width / minCellWidth))
readonly property int minCellWidth: 200 + Appearance.spacing.normal
property bool shouldBeActive: true
Layout.preferredHeight: contentHeight
anchors.left: parent.left
anchors.right: parent.right
cellHeight: 140 + Appearance.spacing.normal
cellWidth: width / columnsCount
clip: true
implicitHeight: shouldBeActive ? contentHeight : 0
interactive: false
model: Wallpapers.list
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
delegate: Item {
required property int index
readonly property bool isCurrent: modelData && modelData.path === Wallpapers.actualCurrent
readonly property real itemMargin: Appearance.spacing.normal / 2
readonly property real itemRadius: Appearance.rounding.normal
readonly property real itemMargin: Appearance.spacing.normal
readonly property real itemRadius: Appearance.rounding.small
required property var modelData
height: root.cellHeight
width: root.cellWidth
StateLayer {
function onClicked(): void {
Wallpapers.setWallpaper(modelData.path);
}
anchors.bottomMargin: itemMargin
anchors.fill: parent
anchors.leftMargin: itemMargin
anchors.rightMargin: itemMargin
anchors.topMargin: itemMargin
radius: itemRadius
}
CustomClippingRect {
id: image
@@ -53,8 +46,6 @@ GridView {
anchors.topMargin: itemMargin
antialiasing: true
color: DynamicColors.tPalette.m3surfaceContainer
layer.enabled: true
layer.smooth: true
radius: itemRadius
CachingImage {
@@ -100,29 +91,13 @@ GridView {
}
}
Timer {
id: fallbackTimer
property bool triggered: false
interval: 800
running: cachingImage.status === Image.Loading || cachingImage.status === Image.Null
onTriggered: triggered = true
}
}
Rectangle {
anchors.bottomMargin: itemMargin
anchors.fill: parent
anchors.leftMargin: itemMargin
anchors.rightMargin: itemMargin
anchors.topMargin: itemMargin
antialiasing: true
border.color: DynamicColors.palette.m3primary
border.width: isCurrent ? 2 : 0
color: "transparent"
radius: itemRadius - border.width
radius: itemRadius + 2
smooth: true
Behavior on border.width {
@@ -142,5 +117,42 @@ GridView {
visible: isCurrent
}
}
Timer {
id: fallbackTimer
property bool triggered: false
interval: 800
running: cachingImage.status === Image.Loading || cachingImage.status === Image.Null
onTriggered: triggered = true
}
}
StateLayer {
function onClicked(): void {
Wallpapers.setWallpaper(modelData.path);
}
anchors.bottomMargin: itemMargin
anchors.fill: parent
anchors.leftMargin: itemMargin
anchors.rightMargin: itemMargin
anchors.topMargin: itemMargin
radius: itemRadius
}
}
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
}
+1
View File
@@ -1,5 +1,6 @@
import QtQuick.Layouts
import QtQuick
import QtQuick.VectorImage
import Quickshell
import Quickshell.Services.SystemTray
import qs.Modules
+56 -13
View File
@@ -1,6 +1,7 @@
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Hyprland
import QtQuick
import qs.Components
import qs.Helpers
@@ -12,31 +13,73 @@ Item {
required property ShellScreen screen
property string source: Wallpapers.current
function refreshData(): void {
Hyprland.refreshMonitors();
const scale = Hyprland.monitorFor(root.screen).scale;
if (scale > 0 && img.resScale !== scale) {
img.resScale = scale;
img.sourceSize.width = root.screen.width * scale;
}
const displayData = Wallpapers.getCrop(root.screen.name);
const displayRect = Qt.rect(img.sourceSize.width * displayData.x, img.implicitHeight * displayData.y, img.sourceSize.width * displayData.width, img.implicitHeight * displayData.height);
img.anchors.fill = null;
img.zoom = displayData.zoom;
img.x = -(displayRect.x * displayData.zoom / img.resScale);
img.y = -(displayRect.y * displayData.zoom / img.resScale);
}
anchors.fill: parent
Image {
id: img
anchors.fill: parent
property int displayH
property int displayW
property real resScale
property real zoom: 1.0
asynchronous: true
fillMode: Image.PreserveAspectCrop
height: implicitHeight * zoom / resScale
opacity: 1
retainWhileLoading: true
source: root.source
sourceClipRect: Wallpapers.recentlyChanged ? null : Qt.rect(Config.background.sourceClipX, Config.background.sourceClipY, Config.background.sourceClipW, Config.background.sourceClipH)
sourceSize.height: root.screen.height
sourceSize.width: root.screen.width
sourceSize.width: root.screen.width * resScale
width: implicitWidth * zoom / resScale
onSourceChanged: {
if (Wallpapers.recentlyChanged) {
Config.background.sourceClipH = 0;
Config.background.sourceClipW = 0;
Config.background.sourceClipY = 0;
Config.background.sourceClipX = 0;
Config.background.zoom = 1.0;
Config.save();
Behavior on height {
Anim {
}
Wallpapers.recentlyChanged = true;
}
Behavior on width {
Anim {
}
}
Behavior on x {
Anim {
}
}
Behavior on y {
Anim {
}
}
onStatusChanged: {
if (img.status == Image.Ready) {
root.refreshData();
}
}
Connections {
function onAdapterUpdated(): void {
root.refreshData();
}
function onLoaded(): void {
root.refreshData();
}
target: Wallpapers.monitorCrops
}
}
}
+16 -25
View File
@@ -12,7 +12,8 @@ FileSystemEntry::FileSystemEntry(const QString& path, const QString& relativePat
, m_path(path)
, m_relativePath(relativePath)
, m_isImageInitialised(false)
, m_mimeTypeInitialised(false) {}
, m_mimeTypeInitialised(false) {
}
QString FileSystemEntry::path() const {
return m_path;
@@ -57,8 +58,8 @@ bool FileSystemEntry::isImage() const {
QString FileSystemEntry::mimeType() const {
if (!m_mimeTypeInitialised) {
const QMimeDatabase db;
m_mimeType = db.mimeTypeForFile(m_path).name();
static const QMimeDatabase s_db;
m_mimeType = s_db.mimeTypeForFile(m_path).name();
m_mimeTypeInitialised = true;
}
return m_mimeType;
@@ -219,7 +220,7 @@ void FileSystemModel::watchDirIfRecursive(const QString& path) {
if (m_recursive && m_watchChanges) {
const auto currentDir = m_dir;
const bool showHidden = m_showHidden;
const auto future = QtConcurrent::run([showHidden, path]() {
auto future = QtConcurrent::run([showHidden, path]() {
QDir::Filters filters = QDir::Dirs | QDir::NoDotAndDotDot;
if (showHidden) {
filters |= QDir::Hidden;
@@ -232,16 +233,12 @@ void FileSystemModel::watchDirIfRecursive(const QString& path) {
}
return dirs;
});
const auto watcher = new QFutureWatcher<QStringList>(this);
connect(watcher, &QFutureWatcher<QStringList>::finished, this, [currentDir, showHidden, watcher, this]() {
const auto paths = watcher->result();
future.then(this, [currentDir, showHidden, this](const QStringList& paths) {
if (currentDir == m_dir && showHidden == m_showHidden && !paths.isEmpty()) {
// Ignore if dir or showHidden has changed
m_watcher.addPaths(paths);
}
watcher->deleteLater();
});
watcher->setFuture(future);
}
}
@@ -295,7 +292,7 @@ void FileSystemModel::updateEntriesForDir(const QString& dir) {
oldPaths << entry->path();
}
const auto future = QtConcurrent::run([=](QPromise<QPair<QSet<QString>, QSet<QString>>>& promise) {
auto future = QtConcurrent::run([=](QPromise<QPair<QSet<QString>, QSet<QString> > >& promise) {
const auto flags = recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags;
std::optional<QDirIterator> iter;
@@ -353,7 +350,7 @@ void FileSystemModel::updateEntriesForDir(const QString& dir) {
newPaths.insert(path);
}
if (promise.isCanceled() || newPaths == oldPaths) {
if (promise.isCanceled()) {
return;
}
@@ -365,23 +362,17 @@ void FileSystemModel::updateEntriesForDir(const QString& dir) {
}
m_futures.insert(dir, future);
const auto watcher = new QFutureWatcher<QPair<QSet<QString>, QSet<QString>>>(this);
connect(watcher, &QFutureWatcher<QPair<QSet<QString>, QSet<QString>>>::finished, this, [dir, watcher, this]() {
future
.then(this,
[dir, this](QPair<QSet<QString>, QSet<QString> > result) {
m_futures.remove(dir);
if (!watcher->future().isResultReadyAt(0)) {
watcher->deleteLater();
return;
}
const auto result = watcher->result();
if (!result.first.isEmpty() || !result.second.isEmpty()) {
applyChanges(result.first, result.second);
watcher->deleteLater();
}
})
.onCanceled(this, [dir, this]() {
m_futures.remove(dir);
});
watcher->setFuture(future);
}
void FileSystemModel::applyChanges(const QSet<QString>& removedPaths, const QSet<QString>& addedPaths) {
+90 -90
View File
@@ -13,136 +13,136 @@
namespace ZShell::models {
class FileSystemEntry : public QObject {
Q_OBJECT
QML_ELEMENT
Q_OBJECT
QML_ELEMENT
QML_UNCREATABLE("FileSystemEntry instances can only be retrieved from a FileSystemModel")
Q_PROPERTY(QString path READ path CONSTANT)
Q_PROPERTY(QString relativePath READ relativePath NOTIFY relativePathChanged)
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(QString baseName READ baseName CONSTANT)
Q_PROPERTY(QString parentDir READ parentDir CONSTANT)
Q_PROPERTY(QString suffix READ suffix CONSTANT)
Q_PROPERTY(qint64 size READ size CONSTANT)
Q_PROPERTY(bool isDir READ isDir CONSTANT)
Q_PROPERTY(bool isImage READ isImage CONSTANT)
Q_PROPERTY(QString mimeType READ mimeType CONSTANT)
Q_PROPERTY(QString path READ path CONSTANT)
Q_PROPERTY(QString relativePath READ relativePath NOTIFY relativePathChanged)
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(QString baseName READ baseName CONSTANT)
Q_PROPERTY(QString parentDir READ parentDir CONSTANT)
Q_PROPERTY(QString suffix READ suffix CONSTANT)
Q_PROPERTY(qint64 size READ size CONSTANT)
Q_PROPERTY(bool isDir READ isDir CONSTANT)
Q_PROPERTY(bool isImage READ isImage CONSTANT)
Q_PROPERTY(QString mimeType READ mimeType CONSTANT)
public:
explicit FileSystemEntry(const QString& path, const QString& relativePath, QObject* parent = nullptr);
explicit FileSystemEntry(const QString& path, const QString& relativePath, QObject* parent = nullptr);
[[nodiscard]] QString path() const;
[[nodiscard]] QString relativePath() const;
[[nodiscard]] QString name() const;
[[nodiscard]] QString baseName() const;
[[nodiscard]] QString parentDir() const;
[[nodiscard]] QString suffix() const;
[[nodiscard]] qint64 size() const;
[[nodiscard]] bool isDir() const;
[[nodiscard]] bool isImage() const;
[[nodiscard]] QString mimeType() const;
[[nodiscard]] QString path() const;
[[nodiscard]] QString relativePath() const;
[[nodiscard]] QString name() const;
[[nodiscard]] QString baseName() const;
[[nodiscard]] QString parentDir() const;
[[nodiscard]] QString suffix() const;
[[nodiscard]] qint64 size() const;
[[nodiscard]] bool isDir() const;
[[nodiscard]] bool isImage() const;
[[nodiscard]] QString mimeType() const;
void updateRelativePath(const QDir& dir);
void updateRelativePath(const QDir& dir);
signals:
void relativePathChanged();
void relativePathChanged();
private:
const QFileInfo m_fileInfo;
const QFileInfo m_fileInfo;
const QString m_path;
QString m_relativePath;
const QString m_path;
QString m_relativePath;
mutable bool m_isImage;
mutable bool m_isImageInitialised;
mutable bool m_isImage;
mutable bool m_isImageInitialised;
mutable QString m_mimeType;
mutable bool m_mimeTypeInitialised;
mutable QString m_mimeType;
mutable bool m_mimeTypeInitialised;
};
class FileSystemModel : public QAbstractListModel {
Q_OBJECT
QML_ELEMENT
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)
Q_PROPERTY(bool recursive READ recursive WRITE setRecursive NOTIFY recursiveChanged)
Q_PROPERTY(bool watchChanges READ watchChanges WRITE setWatchChanges NOTIFY watchChangesChanged)
Q_PROPERTY(bool showHidden READ showHidden WRITE setShowHidden NOTIFY showHiddenChanged)
Q_PROPERTY(bool sortReverse READ sortReverse WRITE setSortReverse NOTIFY sortReverseChanged)
Q_PROPERTY(Filter filter READ filter WRITE setFilter NOTIFY filterChanged)
Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters NOTIFY nameFiltersChanged)
Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)
Q_PROPERTY(bool recursive READ recursive WRITE setRecursive NOTIFY recursiveChanged)
Q_PROPERTY(bool watchChanges READ watchChanges WRITE setWatchChanges NOTIFY watchChangesChanged)
Q_PROPERTY(bool showHidden READ showHidden WRITE setShowHidden NOTIFY showHiddenChanged)
Q_PROPERTY(bool sortReverse READ sortReverse WRITE setSortReverse NOTIFY sortReverseChanged)
Q_PROPERTY(Filter filter READ filter WRITE setFilter NOTIFY filterChanged)
Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters NOTIFY nameFiltersChanged)
Q_PROPERTY(QQmlListProperty<ZShell::models::FileSystemEntry> entries READ entries NOTIFY entriesChanged)
Q_PROPERTY(QQmlListProperty<ZShell::models::FileSystemEntry> entries READ entries NOTIFY entriesChanged)
public:
enum Filter {
enum Filter {
NoFilter,
Images,
Files,
Dirs
};
Q_ENUM(Filter)
};
Q_ENUM(Filter)
explicit FileSystemModel(QObject* parent = nullptr);
explicit FileSystemModel(QObject* parent = nullptr);
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
[[nodiscard]] QString path() const;
void setPath(const QString& path);
[[nodiscard]] QString path() const;
void setPath(const QString& path);
[[nodiscard]] bool recursive() const;
void setRecursive(bool recursive);
[[nodiscard]] bool recursive() const;
void setRecursive(bool recursive);
[[nodiscard]] bool watchChanges() const;
void setWatchChanges(bool watchChanges);
[[nodiscard]] bool watchChanges() const;
void setWatchChanges(bool watchChanges);
[[nodiscard]] bool showHidden() const;
void setShowHidden(bool showHidden);
[[nodiscard]] bool showHidden() const;
void setShowHidden(bool showHidden);
[[nodiscard]] bool sortReverse() const;
void setSortReverse(bool sortReverse);
[[nodiscard]] bool sortReverse() const;
void setSortReverse(bool sortReverse);
[[nodiscard]] Filter filter() const;
void setFilter(Filter filter);
[[nodiscard]] Filter filter() const;
void setFilter(Filter filter);
[[nodiscard]] QStringList nameFilters() const;
void setNameFilters(const QStringList& nameFilters);
[[nodiscard]] QStringList nameFilters() const;
void setNameFilters(const QStringList& nameFilters);
[[nodiscard]] QQmlListProperty<FileSystemEntry> entries();
[[nodiscard]] QQmlListProperty<FileSystemEntry> entries();
signals:
void pathChanged();
void recursiveChanged();
void watchChangesChanged();
void showHiddenChanged();
void sortReverseChanged();
void filterChanged();
void nameFiltersChanged();
void entriesChanged();
void pathChanged();
void recursiveChanged();
void watchChangesChanged();
void showHiddenChanged();
void sortReverseChanged();
void filterChanged();
void nameFiltersChanged();
void entriesChanged();
private:
QDir m_dir;
QFileSystemWatcher m_watcher;
QList<FileSystemEntry*> m_entries;
QHash<QString, QFuture<QPair<QSet<QString>, QSet<QString>>>> m_futures;
QDir m_dir;
QFileSystemWatcher m_watcher;
QList<FileSystemEntry*> m_entries;
QHash<QString, QFuture<QPair<QSet<QString>, QSet<QString> > > > m_futures;
QString m_path;
bool m_recursive;
bool m_watchChanges;
bool m_showHidden;
bool m_sortReverse;
Filter m_filter;
QStringList m_nameFilters;
QString m_path;
bool m_recursive;
bool m_watchChanges;
bool m_showHidden;
bool m_sortReverse = false;
Filter m_filter;
QStringList m_nameFilters;
void watchDirIfRecursive(const QString& path);
void update();
void updateWatcher();
void updateEntries();
void updateEntriesForDir(const QString& dir);
void applyChanges(const QSet<QString>& removedPaths, const QSet<QString>& addedPaths);
[[nodiscard]] bool compareEntries(const FileSystemEntry* a, const FileSystemEntry* b) const;
void watchDirIfRecursive(const QString& path);
void update();
void updateWatcher();
void updateEntries();
void updateEntriesForDir(const QString& dir);
void applyChanges(const QSet<QString>& removedPaths, const QSet<QString>& addedPaths);
[[nodiscard]] bool compareEntries(const FileSystemEntry* a, const FileSystemEntry* b) const;
};
} // namespace ZShell::models
+49 -5
View File
@@ -216,12 +216,56 @@ Action-driven flows (`>` prefix by default) include calculator, wallpaper picker
`zshell-cli` provides these subcommands:
- `shell` - start/kill/log/IPC calls
- `screenshot` - open area picker (`start`, `start-freeze`)
- `wallpaper` - set wallpaper + generate lockscreen blur image
- `scheme` - generate and apply dynamic/preset color schemes
### `shell` — daemon management
Note: `cli/src/zshell/subcommands/scheme.py` uses Jinja2 templating for `~/.config/zshell/templates` rendering.
| Command | Description |
|---------|-------------|
| `start` | Start the shell daemon (pass `--no-daemon` to run in foreground) |
| `kill` | Kill the running shell daemon |
| `restart` | Kill then restart the daemon |
| `lock` | Lock the session via IPC |
| `show` | Show the shell window via IPC |
| `log` | Print daemon logs |
### `scheme` — color scheme generation
```
Usage: zshell-cli scheme generate [--preset <scheme>:<variant>] [--accent <accent>]
[--mode <dark|light>] [--image-path <path>]
Generate a color scheme from a wallpaper image (Material You) or from
a built-in preset.
Preset selection:
--preset <scheme>:<variant> Pick a built-in scheme (e.g. catppuccin:mocha)
--accent <name> Accent color for schemes that support it
(catppuccin accepts: blue, green, mauve,
peach, pink, red, rosewater, etc.)
--mode <dark|light> Override variant mode
If variant has both dark and light modes, the mode is auto-detected from
the current system or config preference.
List all available presets:
zshell-cli scheme list-presets # human-readable
zshell-cli scheme list-presets --json # machine-readable (QML UI)
Examples:
zshell-cli scheme generate --preset gruvbox:medium
zshell-cli scheme generate --preset catppuccin:mocha --accent green
zshell-cli scheme generate --preset everforest:medium --mode light
```
Note: Template rendering (Jinja2) applies generated colors to `~/.config/zshell/templates/*`.
### `screenshot` — area picker
- `start` — open interactive area picker
- `start-freeze` — freeze screen then pick
### `wallpaper` — wallpaper management
- Set wallpaper and generate lockscreen blur background
## Greeter
+5
View File
@@ -9,6 +9,7 @@ version = "0.1.0"
dependencies = [
"typer",
"pillow",
"jinja2",
"materialyoucolor"
]
@@ -25,3 +26,7 @@ only-include = [
[tool.ruff]
line-length = 120
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src"]
+2 -1
View File
@@ -1,6 +1,6 @@
from __future__ import annotations
import typer
from zshell.subcommands import shell, scheme, screenshot, wallpaper
from zshell.subcommands import shell, scheme, screenshot, wallpaper, record
app = typer.Typer()
@@ -8,6 +8,7 @@ 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")
app.add_typer(record.app, name="record")
# app.add_typer(preset.app, name="preset")
@@ -1,544 +0,0 @@
_data = {
"id": "catppuccin",
"name": "Catppuccin",
"version": "1.0.0",
"author": "Catppuccin Org",
"description": "Soothing pastel theme for the high-spirited!",
"dark": {},
"light": {},
"variants": {
"type": "multi",
"defaults": {
"dark": {"m3flavor": "mocha", "m3accent": "mauve"},
"light": {"m3flavor": "latte", "m3accent": "mauve"},
},
"flavors": [
{
"id": "latte",
"name": "Latte",
"light": {
"m3surface": "#ccd0da",
"m3surfaceText": "#4c4f69",
"m3surfaceVariant": "#eff1f5",
"m3surfaceVariantText": "#6c6f85",
"m3background": "#eff1f5",
"m3backgroundText": "#4c4f69",
"m3outline": "#9ca0b0",
"m3surfaceContainer": "#eff1f5",
"m3surfaceContainerHigh": "#e6e9ef",
"m3surfaceContainerHighest": "#dce0e8",
"m3error": "#d20f39",
"m3warning": "#fe640b",
"m3info": "#1e66f5",
},
},
{
"id": "frappe",
"name": "Frappé",
"dark": {
"m3surface": "#414559",
"m3surfaceText": "#c6d0f5",
"m3surfaceVariant": "#303446",
"m3surfaceVariantText": "#a5adce",
"m3background": "#303446",
"m3backgroundText": "#c6d0f5",
"m3outline": "#737994",
"m3surfaceContainer": "#303446",
"m3surfaceContainerHigh": "#292c3c",
"m3surfaceContainerHighest": "#232634",
"m3error": "#e78284",
"m3warning": "#ef9f76",
"m3info": "#8caaee",
},
},
{
"id": "macchiato",
"name": "Macchiato",
"dark": {
"m3surface": "#363a4f",
"m3surfaceText": "#cad3f5",
"m3surfaceVariant": "#24273a",
"m3surfaceVariantText": "#a5adcb",
"m3background": "#24273a",
"m3backgroundText": "#cad3f5",
"m3outline": "#6e738d",
"m3surfaceContainer": "#24273a",
"m3surfaceContainerHigh": "#1e2030",
"m3surfaceContainerHighest": "#181926",
"m3error": "#ed8796",
"m3warning": "#f5a97f",
"m3info": "#8aadf4",
},
},
{
"id": "mocha",
"name": "Mocha",
"dark": {
"m3surface": "#313244",
"m3surfaceText": "#cdd6f4",
"m3surfaceVariant": "#1e1e2e",
"m3surfaceVariantText": "#a6adc8",
"m3background": "#1e1e2e",
"m3backgroundText": "#cdd6f4",
"m3outline": "#6c7086",
"m3surfaceContainer": "#1e1e2e",
"m3surfaceContainerHigh": "#181825",
"m3surfaceContainerHighest": "#11111b",
"m3error": "#f38ba8",
"m3warning": "#fab387",
"m3info": "#89b4fa",
},
},
],
"accents": [
{
"id": "rosewater",
"name": "Rosewater",
"latte": {
"m3primary": "#dc8a78",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#e1a99d",
"m3secondary": "#d8c7c4",
"m3surfaceTint": "#e1a99d",
},
"frappe": {
"m3primary": "#f2d5cf",
"m3primaryText": "#303446",
"m3primaryContainer": "#b8a5a6",
"m3secondary": "#a2748b",
"m3surfaceTint": "#b8a5a6",
},
"macchiato": {
"m3primary": "#f4dbd6",
"m3primaryText": "#24273a",
"m3primaryContainer": "#b6a6a7",
"m3secondary": "#9f6f8d",
"m3surfaceTint": "#b6a6a7",
},
"mocha": {
"m3primary": "#f5e0dc",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#b5a6a8",
"m3secondary": "#9d6d87",
"m3surfaceTint": "#b5a6a8",
},
},
{
"id": "flamingo",
"name": "Flamingo",
"latte": {
"m3primary": "#dd7878",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#e29c9d",
"m3secondary": "#d7c3c4",
"m3surfaceTint": "#e29c9d",
},
"frappe": {
"m3primary": "#eebebe",
"m3primaryText": "#303446",
"m3primaryContainer": "#b5949a",
"m3secondary": "#9d6b80",
"m3surfaceTint": "#b5949a",
},
"macchiato": {
"m3primary": "#f0c6c6",
"m3primaryText": "#24273a",
"m3primaryContainer": "#b3979c",
"m3secondary": "#996780",
"m3surfaceTint": "#b3979c",
},
"mocha": {
"m3primary": "#f2cdcd",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#b3999e",
"m3secondary": "#98667c",
"m3surfaceTint": "#b3999e",
},
},
{
"id": "pink",
"name": "Pink",
"latte": {
"m3primary": "#ea76cb",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#eb9bd7",
"m3secondary": "#d9c7d5",
"m3surfaceTint": "#eb9bd7",
},
"frappe": {
"m3primary": "#f4b8e4",
"m3primaryText": "#303446",
"m3primaryContainer": "#b990b5",
"m3secondary": "#996e9e",
"m3surfaceTint": "#b990b5",
},
"macchiato": {
"m3primary": "#f5bde6",
"m3primaryText": "#24273a",
"m3primaryContainer": "#b791b2",
"m3secondary": "#95689a",
"m3surfaceTint": "#b791b2",
},
"mocha": {
"m3primary": "#f5c2e7",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#b591b0",
"m3secondary": "#966597",
"m3surfaceTint": "#b591b0",
},
},
{
"id": "mauve",
"name": "Mauve",
"latte": {
"m3primary": "#8839ef",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#a670f1",
"m3secondary": "#c2b8d0",
"m3surfaceTint": "#a670f1",
},
"frappe": {
"m3primary": "#ca9ee6",
"m3primaryText": "#303446",
"m3primaryContainer": "#9c7eb6",
"m3secondary": "#7d6799",
"m3surfaceTint": "#9c7eb6",
},
"macchiato": {
"m3primary": "#c6a0f6",
"m3primaryText": "#24273a",
"m3primaryContainer": "#967cbe",
"m3secondary": "#766597",
"m3surfaceTint": "#967cbe",
},
"mocha": {
"m3primary": "#cba6f7",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#977ebb",
"m3secondary": "#756294",
"m3surfaceTint": "#977ebb",
},
},
{
"id": "red",
"name": "Red",
"latte": {
"m3primary": "#d20f39",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#da5371",
"m3secondary": "#c0a0a8",
"m3surfaceTint": "#da5371",
},
"frappe": {
"m3primary": "#e78284",
"m3primaryText": "#303446",
"m3primaryContainer": "#b06a72",
"m3secondary": "#8b5d66",
"m3surfaceTint": "#b06a72",
},
"macchiato": {
"m3primary": "#ed8796",
"m3primaryText": "#24273a",
"m3primaryContainer": "#b16b7a",
"m3secondary": "#865a69",
"m3surfaceTint": "#b16b7a",
},
"mocha": {
"m3primary": "#f38ba8",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#b46b84",
"m3secondary": "#85596b",
"m3surfaceTint": "#b46b84",
},
},
{
"id": "maroon",
"name": "Maroon",
"latte": {
"m3primary": "#e64553",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#e87883",
"m3secondary": "#cfb7ba",
"m3surfaceTint": "#e87883",
},
"frappe": {
"m3primary": "#ea999c",
"m3primaryText": "#303446",
"m3primaryContainer": "#b27a83",
"m3secondary": "#92626f",
"m3surfaceTint": "#b27a83",
},
"macchiato": {
"m3primary": "#ee99a0",
"m3primaryText": "#24273a",
"m3primaryContainer": "#b27781",
"m3secondary": "#8c5e6c",
"m3surfaceTint": "#b27781",
},
"mocha": {
"m3primary": "#eba0ac",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#ae7987",
"m3secondary": "#895b6c",
"m3surfaceTint": "#ae7987",
},
},
{
"id": "peach",
"name": "Peach",
"latte": {
"m3primary": "#fe640b",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#f98e51",
"m3secondary": "#c9b7ad",
"m3surfaceTint": "#f98e51",
},
"frappe": {
"m3primary": "#ef9f76",
"m3primaryText": "#303446",
"m3primaryContainer": "#b67f68",
"m3secondary": "#8f6a5f",
"m3surfaceTint": "#b67f68",
},
"macchiato": {
"m3primary": "#f5a97f",
"m3primaryText": "#24273a",
"m3primaryContainer": "#b7836a",
"m3secondary": "#8c695e",
"m3surfaceTint": "#b7836a",
},
"mocha": {
"m3primary": "#fab387",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#b8876d",
"m3secondary": "#8b6a5d",
"m3surfaceTint": "#b8876d",
},
},
{
"id": "yellow",
"name": "Yellow",
"latte": {
"m3primary": "#df8e1d",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#e4ac5d",
"m3secondary": "#c6baaa",
"m3surfaceTint": "#e4ac5d",
},
"frappe": {
"m3primary": "#e5c890",
"m3primaryText": "#303446",
"m3primaryContainer": "#af9b7a",
"m3secondary": "#948062",
"m3surfaceTint": "#af9b7a",
},
"macchiato": {
"m3primary": "#eed49f",
"m3primaryText": "#24273a",
"m3primaryContainer": "#b2a181",
"m3secondary": "#947e62",
"m3surfaceTint": "#b2a181",
},
"mocha": {
"m3primary": "#f9e2af",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#b8a889",
"m3secondary": "#978265",
"m3surfaceTint": "#b8a889",
},
},
{
"id": "green",
"name": "Green",
"latte": {
"m3primary": "#40a02b",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#74b867",
"m3secondary": "#9fbd9b",
"m3surfaceTint": "#74b867",
},
"frappe": {
"m3primary": "#a6d189",
"m3primaryText": "#303446",
"m3primaryContainer": "#83a275",
"m3secondary": "#648e5e",
"m3surfaceTint": "#83a275",
},
"macchiato": {
"m3primary": "#a6da95",
"m3primaryText": "#24273a",
"m3primaryContainer": "#80a57a",
"m3secondary": "#5c8a61",
"m3surfaceTint": "#80a57a",
},
"mocha": {
"m3primary": "#a6e3a1",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#7ea87f",
"m3secondary": "#5b8964",
"m3surfaceTint": "#7ea87f",
},
},
{
"id": "teal",
"name": "Teal",
"latte": {
"m3primary": "#179299",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#57aeb4",
"m3secondary": "#93b4b7",
"m3surfaceTint": "#57aeb4",
},
"frappe": {
"m3primary": "#81c8be",
"m3primaryText": "#303446",
"m3primaryContainer": "#699b9a",
"m3secondary": "#588084",
"m3surfaceTint": "#699b9a",
},
"macchiato": {
"m3primary": "#8bd5ca",
"m3primaryText": "#24273a",
"m3primaryContainer": "#6da29f",
"m3secondary": "#577e83",
"m3surfaceTint": "#6da29f",
},
"mocha": {
"m3primary": "#94e2d5",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#71a8a4",
"m3secondary": "#588284",
"m3surfaceTint": "#71a8a4",
},
},
{
"id": "sky",
"name": "Sky",
"latte": {
"m3primary": "#04a5e5",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#4abcea",
"m3secondary": "#a4b9c2",
"m3surfaceTint": "#4abcea",
},
"frappe": {
"m3primary": "#99d1db",
"m3primaryText": "#303446",
"m3primaryContainer": "#79a2af",
"m3secondary": "#628494",
"m3surfaceTint": "#79a2af",
},
"macchiato": {
"m3primary": "#91d7e3",
"m3primaryText": "#24273a",
"m3primaryContainer": "#71a3b0",
"m3secondary": "#5e7e8c",
"m3surfaceTint": "#71a3b0",
},
"mocha": {
"m3primary": "#89dceb",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#69a3b3",
"m3secondary": "#5a7b88",
"m3surfaceTint": "#69a3b3",
},
},
{
"id": "sapphire",
"name": "Sapphire",
"latte": {
"m3primary": "#209fb5",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#5db8c8",
"m3secondary": "#9eb9be",
"m3surfaceTint": "#5db8c8",
},
"frappe": {
"m3primary": "#85c1dc",
"m3primaryText": "#303446",
"m3primaryContainer": "#6b96af",
"m3secondary": "#5e7b8e",
"m3surfaceTint": "#6b96af",
},
"macchiato": {
"m3primary": "#7dc4e4",
"m3primaryText": "#24273a",
"m3primaryContainer": "#6396b1",
"m3secondary": "#5a7486",
"m3surfaceTint": "#6396b1",
},
"mocha": {
"m3primary": "#74c7ec",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#5a95b4",
"m3secondary": "#567080",
"m3surfaceTint": "#5a95b4",
},
},
{
"id": "blue",
"name": "Blue",
"latte": {
"m3primary": "#1e66f5",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#5c90f5",
"m3secondary": "#b1bacb",
"m3surfaceTint": "#5c90f5",
},
"frappe": {
"m3primary": "#8caaee",
"m3primaryText": "#303446",
"m3primaryContainer": "#7086bc",
"m3secondary": "#637195",
"m3surfaceTint": "#7086bc",
},
"macchiato": {
"m3primary": "#8aadf4",
"m3primaryText": "#24273a",
"m3primaryContainer": "#6c85bc",
"m3secondary": "#5f6d8f",
"m3surfaceTint": "#6c85bc",
},
"mocha": {
"m3primary": "#89b4fa",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#6987bd",
"m3secondary": "#5d6c8b",
"m3surfaceTint": "#6987bd",
},
},
{
"id": "lavender",
"name": "Lavender",
"latte": {
"m3primary": "#7287fd",
"m3primaryText": "#eff1f5",
"m3primaryContainer": "#97a7fb",
"m3secondary": "#cdcfdd",
"m3surfaceTint": "#97a7fb",
},
"frappe": {
"m3primary": "#babbf1",
"m3primaryText": "#303446",
"m3primaryContainer": "#9192be",
"m3secondary": "#7175a1",
"m3surfaceTint": "#9192be",
},
"macchiato": {
"m3primary": "#b7bdf8",
"m3primaryText": "#24273a",
"m3primaryContainer": "#8b91bf",
"m3secondary": "#6b709d",
"m3surfaceTint": "#8b91bf",
},
"mocha": {
"m3primary": "#b4befe",
"m3primaryText": "#1e1e2e",
"m3primaryContainer": "#878ec0",
"m3secondary": "#676d99",
"m3surfaceTint": "#878ec0",
},
},
],
},
}
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint 7086bc
primary 8caaee
onPrimary 303446
primaryContainer 7086bc
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 637195
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -1,87 +1,87 @@
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
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint b7c4ff
primary b7c4ff
onPrimary 1e2d60
primaryContainer 6674ac
surfaceTint 9c7eb6
primary ca9ee6
onPrimary 303446
primaryContainer 9c7eb6
onPrimaryContainer ffffff
inversePrimary 4e5c92
secondary c1c5e0
onSecondary 2a2f44
secondaryContainer 41465c
onSecondaryContainer afb4ce
tertiary f1b3e6
onTertiary 4c1f49
tertiaryContainer b67fae
inversePrimary 6c4f94
secondary 7d6799
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
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
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f1b3e6
tertiaryFixedDim f4b8e4
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
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
@@ -92,19 +92,19 @@ 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
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint b5949a
primary eebebe
onPrimary 303446
primaryContainer b5949a
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 9d6b80
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint 83a275
primary a6d189
onPrimary 303446
primaryContainer 83a275
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 648e5e
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint 9192be
primary babbf1
onPrimary 303446
primaryContainer 9192be
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 7175a1
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint b27a83
primary ea999c
onPrimary 303446
primaryContainer b27a83
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 92626f
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint 9c7eb6
primary ca9ee6
onPrimary 303446
primaryContainer 9c7eb6
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 7d6799
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint b67f68
primary ef9f76
onPrimary 303446
primaryContainer b67f68
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 8f6a5f
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint b990b5
primary f4b8e4
onPrimary 303446
primaryContainer b990b5
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 996e9e
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint b06a72
primary e78284
onPrimary 303446
primaryContainer b06a72
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 8b5d66
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint b8a5a6
primary f2d5cf
onPrimary 303446
primaryContainer b8a5a6
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary a2748b
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint 6b96af
primary 85c1dc
onPrimary 303446
primaryContainer 6b96af
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 5e7b8e
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint 79a2af
primary 99d1db
onPrimary 303446
primaryContainer 79a2af
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 628494
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint 699b9a
primary 81c8be
onPrimary 303446
primaryContainer 699b9a
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 588084
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor ca9ee6
secondary_paletteKeyColor 7d6799
tertiary_paletteKeyColor f4b8e4
neutral_paletteKeyColor 414559
neutral_variant_paletteKeyColor 303446
background 303446
onBackground c6d0f5
surface 414559
surfaceDim 414559
surfaceBright 55596f
surfaceContainerLowest 292c3c
surfaceContainerLow 363a50
surfaceContainer 303446
surfaceContainerHigh 292c3c
surfaceContainerHighest 232634
onSurface c6d0f5
surfaceVariant 303446
onSurfaceVariant a5adce
inverseSurface c6d0f5
inverseOnSurface 414559
outline 737994
outlineVariant 51576d
shadow 000000
scrim 000000
surfaceTint af9b7a
primary e5c890
onPrimary 303446
primaryContainer af9b7a
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 948062
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f4b8e4
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error e78284
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim ca9ee6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 7d6799
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4
onTertiaryFixed 330832
onTertiaryFixedVariant 653661
term0 414559
term1 e78284
term2 a6d189
term3 e5c890
term4 8caaee
term5 f4b8e4
term6 81c8be
term7 c6d0f5
term8 51576d
term9 e78284
term10 a6d189
term11 e5c890
term12 8caaee
term13 f4b8e4
term14 81c8be
term15 a5adce
rosewater f2d5cf
flamingo eebebe
pink f4b8e4
mauve ca9ee6
red e78284
maroon ea999c
peach ef9f76
yellow e5c890
green a6d189
teal 81c8be
sky 99d1db
sapphire 85c1dc
blue 8caaee
lavender babbf1
klink 6685d1
klinkSelection 6585d1
kvisited 7276dd
kvisitedSelection 7276dd
knegative 8e70ff
knegativeSelection 8e70ff
kneutral c794ff
kneutralSelection c794ff
kpositive 54afff
kpositiveSelection 54afff
text c6d0f5
subtext1 a5adce
subtext0 7a7f9e
overlay2 737994
overlay1 585b70
overlay0 45475a
surface2 414559
surface1 363a50
surface0 303446
base 303446
mantle 292c3c
crust 232634
success a6d189
onSuccess 303446
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint 5c90f5
primary 1e66f5
onPrimary eff1f5
primaryContainer 5c90f5
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary b1bacb
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint e29c9d
primary dd7878
onPrimary eff1f5
primaryContainer e29c9d
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary d7c3c4
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint 74b867
primary 40a02b
onPrimary eff1f5
primaryContainer 74b867
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary 9fbd9b
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint 97a7fb
primary 7287fd
onPrimary eff1f5
primaryContainer 97a7fb
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary cdcfdd
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -1,87 +1,87 @@
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
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f2f3f7
surfaceContainer edeef1
surfaceContainerHigh e7e8eb
surfaceContainerHighest e1e2e6
onSurface 191c1e
surfaceVariant dce3eb
onSurfaceVariant 41484e
inverseSurface 2e3133
inverseOnSurface eff1f4
outline 6e757c
outlineVariant c0c7ce
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
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
surfaceTint a670f1
primary 8839ef
onPrimary eff1f5
primaryContainer a670f1
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary c2b8d0
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
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
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
@@ -92,19 +92,19 @@ 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
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint e87883
primary e64553
onPrimary eff1f5
primaryContainer e87883
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary cfb7ba
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint a670f1
primary 8839ef
onPrimary eff1f5
primaryContainer a670f1
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary c2b8d0
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint f98e51
primary fe640b
onPrimary eff1f5
primaryContainer f98e51
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary c9b7ad
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint eb9bd7
primary ea76cb
onPrimary eff1f5
primaryContainer eb9bd7
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary d9c7d5
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint da5371
primary d20f39
onPrimary eff1f5
primaryContainer da5371
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary c0a0a8
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint e1a99d
primary dc8a78
onPrimary eff1f5
primaryContainer e1a99d
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary d8c7c4
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint 5db8c8
primary 209fb5
onPrimary eff1f5
primaryContainer 5db8c8
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary 9eb9be
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint 4abcea
primary 04a5e5
onPrimary eff1f5
primaryContainer 4abcea
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary a4b9c2
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint 57aeb4
primary 179299
onPrimary eff1f5
primaryContainer 57aeb4
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary 93b4b7
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor 8839ef
secondary_paletteKeyColor c2b8d0
tertiary_paletteKeyColor ea76cb
neutral_paletteKeyColor 9ca0b0
neutral_variant_paletteKeyColor e6e9ef
background eff1f5
onBackground 4c4f69
surface ccd0da
surfaceDim ccd0da
surfaceBright eff1f5
surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9
surfaceContainer eff1f5
surfaceContainerHigh e6e9ef
surfaceContainerHighest dce0e8
onSurface 4c4f69
surfaceVariant eff1f5
onSurfaceVariant 6c6f85
inverseSurface 4c4f69
inverseOnSurface ccd0da
outline 9ca0b0
outlineVariant acb0be
shadow 000000
scrim 000000
surfaceTint e4ac5d
primary df8e1d
onPrimary eff1f5
primaryContainer e4ac5d
onPrimaryContainer 2a1040
inversePrimary 6c4f94
secondary c6baaa
onSecondary 4c4f69
secondaryContainer e6d4ff
onSecondaryContainer 544874
tertiary ea76cb
onTertiary eff1f5
tertiaryContainer ea76cb
onTertiaryContainer 4e1e44
error d20f39
onError eff1f5
errorContainer ffdad6
onErrorContainer 93000a
primaryFixed e8d4ff
primaryFixedDim a670f1
onPrimaryFixed ffffff
onPrimaryFixedVariant 544874
secondaryFixed f0e4ff
secondaryFixedDim c2b8d0
onSecondaryFixed 4c4f69
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f0
tertiaryFixedDim ea76cb
onTertiaryFixed 4c4f69
onTertiaryFixedVariant 4e1e44
term0 5c5f77
term1 d20f39
term2 40a02b
term3 df8e1d
term4 1e66f5
term5 ea76cb
term6 179299
term7 acb0be
term8 6c6f85
term9 d20f39
term10 40a02b
term11 df8e1d
term12 1e66f5
term13 ea76cb
term14 179299
term15 4c4f69
rosewater dc8a78
flamingo dd7878
pink ea76cb
mauve 8839ef
red d20f39
maroon e64553
peach fe640b
yellow df8e1d
green 40a02b
teal 179299
sky 04a5e5
sapphire 209fb5
blue 1e66f5
lavender 7287fd
klink 2e8fc3
klinkSelection 308fc4
kvisited 2584d6
kvisitedSelection 2984d7
knegative 607eff
knegativeSelection 607eff
kneutral c794ff
kneutralSelection c794ff
kpositive 00b8de
kpositiveSelection 00b8df
text 4c4f69
subtext1 6c6f85
subtext0 9ca0b0
overlay2 acb0be
overlay1 bcc0cc
overlay0 ccd0da
surface2 dce0e8
surface1 e6e9ef
surface0 eff1f5
base eff1f5
mantle e6e9ef
crust dce0e8
success 40a02b
onSuccess eff1f5
successContainer d1e8d5
onSuccessContainer 0c1f13
@@ -0,0 +1,110 @@
primary_paletteKeyColor c6a0f6
secondary_paletteKeyColor 766597
tertiary_paletteKeyColor f5bde6
neutral_paletteKeyColor 363a4f
neutral_variant_paletteKeyColor 24273a
background 24273a
onBackground cad3f5
surface 363a4f
surfaceDim 363a4f
surfaceBright 4a4e63
surfaceContainerLowest 1e2030
surfaceContainerLow 2a2e43
surfaceContainer 24273a
surfaceContainerHigh 1e2030
surfaceContainerHighest 181926
onSurface cad3f5
surfaceVariant 24273a
onSurfaceVariant a5adcb
inverseSurface cad3f5
inverseOnSurface 363a4f
outline 6e738d
outlineVariant 494d64
shadow 000000
scrim 000000
surfaceTint 6c85bc
primary 8aadf4
onPrimary 24273a
primaryContainer 6c85bc
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 5f6d8f
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f5bde6
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error ed8796
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim c6a0f6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 766597
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f4
tertiaryFixedDim f5bde6
onTertiaryFixed 340831
onTertiaryFixedVariant 66365f
term0 363a4f
term1 ed8796
term2 a6da95
term3 eed49f
term4 8aadf4
term5 f5bde6
term6 8bd5ca
term7 cad3f5
term8 494d64
term9 ed8796
term10 a6da95
term11 eed49f
term12 8aadf4
term13 f5bde6
term14 8bd5ca
term15 a5adcb
rosewater f4dbd6
flamingo f0c6c6
pink f5bde6
mauve c6a0f6
red ed8796
maroon ee99a0
peach f5a97f
yellow eed49f
green a6da95
teal 8bd5ca
sky 91d7e3
sapphire 7dc4e4
blue 8aadf4
lavender b7bdf8
klink 7382d2
klinkSelection 7382d2
kvisited 8172da
kvisitedSelection 8172da
knegative a167ff
knegativeSelection a167ff
kneutral ca92ff
kneutralSelection c992ff
kpositive 60adff
kpositiveSelection 60adff
text cad3f5
subtext1 a5adcb
subtext0 7a7f9e
overlay2 6e738d
overlay1 585b70
overlay0 45475a
surface2 363a4f
surface1 2a2e43
surface0 24273a
base 24273a
mantle 1e2030
crust 181926
success a6da95
onSuccess 24273a
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -1,110 +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
primary_paletteKeyColor c6a0f6
secondary_paletteKeyColor 766597
tertiary_paletteKeyColor f5bde6
neutral_paletteKeyColor 363a4f
neutral_variant_paletteKeyColor 24273a
background 24273a
onBackground cad3f5
surface 363a4f
surfaceDim 363a4f
surfaceBright 4a4e63
surfaceContainerLowest 1e2030
surfaceContainerLow 2a2e43
surfaceContainer 24273a
surfaceContainerHigh 1e2030
surfaceContainerHighest 181926
onSurface cad3f5
surfaceVariant 24273a
onSurfaceVariant a5adcb
inverseSurface cad3f5
inverseOnSurface 363a4f
outline 6e738d
outlineVariant 494d64
shadow 000000
scrim 000000
surfaceTint bac3ff
primary bac3ff
onPrimary 232c60
primaryContainer 6a73ac
surfaceTint 967cbe
primary c6a0f6
onPrimary 24273a
primaryContainer 967cbe
onPrimaryContainer ffffff
inversePrimary 525b92
secondary c3c5e0
onSecondary 2c2f44
secondaryContainer 42455c
onSecondaryContainer b1b3ce
tertiary f1b3e5
onTertiary 4c1f48
tertiaryContainer b77ead
inversePrimary 6c4f94
secondary 766597
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f5bde6
onTertiary 4e1e44
tertiaryContainer bb7da9
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
error ed8796
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim c6a0f6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 766597
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f4
tertiaryFixedDim f1b3e5
tertiaryFixedDim f5bde6
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
term0 363a4f
term1 ed8796
term2 a6da95
term3 eed49f
term4 8aadf4
term5 f5bde6
term6 8bd5ca
term7 cad3f5
term8 494d64
term9 ed8796
term10 a6da95
term11 eed49f
term12 8aadf4
term13 f5bde6
term14 8bd5ca
term15 a5adcb
rosewater f4dbd6
flamingo f0c6c6
pink f5bde6
mauve c6a0f6
red ed8796
maroon ee99a0
peach f5a97f
yellow eed49f
green a6da95
teal 8bd5ca
sky 91d7e3
sapphire 7dc4e4
blue 8aadf4
lavender b7bdf8
klink 7382d2
klinkSelection 7382d2
kvisited 8172da
kvisitedSelection 8172da
knegative a167ff
knegativeSelection a167ff
kneutral ca92ff
kneutralSelection c992ff
kpositive 60adff
kpositiveSelection 60adff
text cad3f5
subtext1 a5adcb
subtext0 7a7f9e
overlay2 6e738d
overlay1 585b70
overlay0 45475a
surface2 363a4f
surface1 2a2e43
surface0 24273a
base 24273a
mantle 1e2030
crust 181926
success a6da95
onSuccess 24273a
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor c6a0f6
secondary_paletteKeyColor 766597
tertiary_paletteKeyColor f5bde6
neutral_paletteKeyColor 363a4f
neutral_variant_paletteKeyColor 24273a
background 24273a
onBackground cad3f5
surface 363a4f
surfaceDim 363a4f
surfaceBright 4a4e63
surfaceContainerLowest 1e2030
surfaceContainerLow 2a2e43
surfaceContainer 24273a
surfaceContainerHigh 1e2030
surfaceContainerHighest 181926
onSurface cad3f5
surfaceVariant 24273a
onSurfaceVariant a5adcb
inverseSurface cad3f5
inverseOnSurface 363a4f
outline 6e738d
outlineVariant 494d64
shadow 000000
scrim 000000
surfaceTint b3979c
primary f0c6c6
onPrimary 24273a
primaryContainer b3979c
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 996780
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f5bde6
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error ed8796
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim c6a0f6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 766597
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f4
tertiaryFixedDim f5bde6
onTertiaryFixed 340831
onTertiaryFixedVariant 66365f
term0 363a4f
term1 ed8796
term2 a6da95
term3 eed49f
term4 8aadf4
term5 f5bde6
term6 8bd5ca
term7 cad3f5
term8 494d64
term9 ed8796
term10 a6da95
term11 eed49f
term12 8aadf4
term13 f5bde6
term14 8bd5ca
term15 a5adcb
rosewater f4dbd6
flamingo f0c6c6
pink f5bde6
mauve c6a0f6
red ed8796
maroon ee99a0
peach f5a97f
yellow eed49f
green a6da95
teal 8bd5ca
sky 91d7e3
sapphire 7dc4e4
blue 8aadf4
lavender b7bdf8
klink 7382d2
klinkSelection 7382d2
kvisited 8172da
kvisitedSelection 8172da
knegative a167ff
knegativeSelection a167ff
kneutral ca92ff
kneutralSelection c992ff
kpositive 60adff
kpositiveSelection 60adff
text cad3f5
subtext1 a5adcb
subtext0 7a7f9e
overlay2 6e738d
overlay1 585b70
overlay0 45475a
surface2 363a4f
surface1 2a2e43
surface0 24273a
base 24273a
mantle 1e2030
crust 181926
success a6da95
onSuccess 24273a
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor c6a0f6
secondary_paletteKeyColor 766597
tertiary_paletteKeyColor f5bde6
neutral_paletteKeyColor 363a4f
neutral_variant_paletteKeyColor 24273a
background 24273a
onBackground cad3f5
surface 363a4f
surfaceDim 363a4f
surfaceBright 4a4e63
surfaceContainerLowest 1e2030
surfaceContainerLow 2a2e43
surfaceContainer 24273a
surfaceContainerHigh 1e2030
surfaceContainerHighest 181926
onSurface cad3f5
surfaceVariant 24273a
onSurfaceVariant a5adcb
inverseSurface cad3f5
inverseOnSurface 363a4f
outline 6e738d
outlineVariant 494d64
shadow 000000
scrim 000000
surfaceTint 80a57a
primary a6da95
onPrimary 24273a
primaryContainer 80a57a
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 5c8a61
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f5bde6
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error ed8796
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim c6a0f6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 766597
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f4
tertiaryFixedDim f5bde6
onTertiaryFixed 340831
onTertiaryFixedVariant 66365f
term0 363a4f
term1 ed8796
term2 a6da95
term3 eed49f
term4 8aadf4
term5 f5bde6
term6 8bd5ca
term7 cad3f5
term8 494d64
term9 ed8796
term10 a6da95
term11 eed49f
term12 8aadf4
term13 f5bde6
term14 8bd5ca
term15 a5adcb
rosewater f4dbd6
flamingo f0c6c6
pink f5bde6
mauve c6a0f6
red ed8796
maroon ee99a0
peach f5a97f
yellow eed49f
green a6da95
teal 8bd5ca
sky 91d7e3
sapphire 7dc4e4
blue 8aadf4
lavender b7bdf8
klink 7382d2
klinkSelection 7382d2
kvisited 8172da
kvisitedSelection 8172da
knegative a167ff
knegativeSelection a167ff
kneutral ca92ff
kneutralSelection c992ff
kpositive 60adff
kpositiveSelection 60adff
text cad3f5
subtext1 a5adcb
subtext0 7a7f9e
overlay2 6e738d
overlay1 585b70
overlay0 45475a
surface2 363a4f
surface1 2a2e43
surface0 24273a
base 24273a
mantle 1e2030
crust 181926
success a6da95
onSuccess 24273a
successContainer 3b5e3b
onSuccessContainer b6f0b1
@@ -0,0 +1,110 @@
primary_paletteKeyColor c6a0f6
secondary_paletteKeyColor 766597
tertiary_paletteKeyColor f5bde6
neutral_paletteKeyColor 363a4f
neutral_variant_paletteKeyColor 24273a
background 24273a
onBackground cad3f5
surface 363a4f
surfaceDim 363a4f
surfaceBright 4a4e63
surfaceContainerLowest 1e2030
surfaceContainerLow 2a2e43
surfaceContainer 24273a
surfaceContainerHigh 1e2030
surfaceContainerHighest 181926
onSurface cad3f5
surfaceVariant 24273a
onSurfaceVariant a5adcb
inverseSurface cad3f5
inverseOnSurface 363a4f
outline 6e738d
outlineVariant 494d64
shadow 000000
scrim 000000
surfaceTint 8b91bf
primary b7bdf8
onPrimary 24273a
primaryContainer 8b91bf
onPrimaryContainer ffffff
inversePrimary 6c4f94
secondary 6b709d
onSecondary ffffff
secondaryContainer 544874
onSecondaryContainer cbbae8
tertiary f5bde6
onTertiary 4e1e44
tertiaryContainer bb7da9
onTertiaryContainer 000000
error ed8796
onError 4a0019
errorContainer 8c2643
onErrorContainer ffb3c6
primaryFixed e8d4ff
primaryFixedDim c6a0f6
onPrimaryFixed 2a1040
onPrimaryFixedVariant 544874
secondaryFixed e2d4ff
secondaryFixedDim 766597
onSecondaryFixed 1a0a28
onSecondaryFixedVariant 3a2850
tertiaryFixed ffd7f4
tertiaryFixedDim f5bde6
onTertiaryFixed 340831
onTertiaryFixedVariant 66365f
term0 363a4f
term1 ed8796
term2 a6da95
term3 eed49f
term4 8aadf4
term5 f5bde6
term6 8bd5ca
term7 cad3f5
term8 494d64
term9 ed8796
term10 a6da95
term11 eed49f
term12 8aadf4
term13 f5bde6
term14 8bd5ca
term15 a5adcb
rosewater f4dbd6
flamingo f0c6c6
pink f5bde6
mauve c6a0f6
red ed8796
maroon ee99a0
peach f5a97f
yellow eed49f
green a6da95
teal 8bd5ca
sky 91d7e3
sapphire 7dc4e4
blue 8aadf4
lavender b7bdf8
klink 7382d2
klinkSelection 7382d2
kvisited 8172da
kvisitedSelection 8172da
knegative a167ff
knegativeSelection a167ff
kneutral ca92ff
kneutralSelection c992ff
kpositive 60adff
kpositiveSelection 60adff
text cad3f5
subtext1 a5adcb
subtext0 7a7f9e
overlay2 6e738d
overlay1 585b70
overlay0 45475a
surface2 363a4f
surface1 2a2e43
surface0 24273a
base 24273a
mantle 1e2030
crust 181926
success a6da95
onSuccess 24273a
successContainer 3b5e3b
onSuccessContainer b6f0b1

Some files were not shown because too many files have changed in this diff Show More