1 Commits

Author SHA1 Message Date
zach 33746fca04 Initial commit for submenu popouts, unfinished 2026-05-20 14:07:38 +02:00
151 changed files with 2316 additions and 10319 deletions
+1 -32
View File
@@ -1,4 +1,4 @@
name: Python name: Lint & Format (Python)
on: on:
pull_request: pull_request:
@@ -32,34 +32,3 @@ jobs:
run: | run: |
. .venv/bin/activate . .venv/bin/activate
ruff check . 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
+1 -8
View File
@@ -31,13 +31,6 @@ if("shell" IN_LIST ENABLE_MODULES)
foreach(dir assets scripts Components Config Modules Daemons Drawers Effects Helpers Paths) foreach(dir assets scripts Components Config Modules Daemons Drawers Effects Helpers Paths)
install(DIRECTORY ${dir} DESTINATION "${INSTALL_QSCONFDIR}") install(DIRECTORY ${dir} DESTINATION "${INSTALL_QSCONFDIR}")
endforeach() 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}") install(DIRECTORY Greeter/ DESTINATION "${INSTALL_GREETERCONFDIR}")
endif() endif()
+2 -16
View File
@@ -8,34 +8,20 @@ Item {
id: root id: root
property alias active: splitButton.active property alias active: splitButton.active
property alias buttonAlias: splitButton
property bool enabled: true property bool enabled: true
property alias expanded: splitButton.expanded property alias expanded: splitButton.expanded
property int expandedZ: 100 property int expandedZ: 100
required property string label required property string label
property alias menuItems: splitButton.menuItems property alias menuItems: splitButton.menuItems
property bool shouldBeActive: true
property alias type: splitButton.type property alias type: splitButton.type
signal selected(item: MenuItem) signal selected(item: MenuItem)
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
clip: false clip: false
implicitHeight: row.implicitHeight + Appearance.padding.smaller * 2
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
z: root.expanded ? expandedZ : -1 z: root.expanded ? expandedZ : -1
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
RowLayout { RowLayout {
id: row id: row
-1
View File
@@ -15,7 +15,6 @@ Text {
color: DynamicColors.palette.m3onSurface color: DynamicColors.palette.m3onSurface
font.family: Appearance.font.family.sans font.family: Appearance.font.family.sans
font.pointSize: Appearance.font.size.normal font.pointSize: Appearance.font.size.normal
linkColor: DynamicColors.palette.m3onPrimaryFixedVariant
renderType: Text.NativeRendering renderType: Text.NativeRendering
textFormat: Text.PlainText textFormat: Text.PlainText
-8
View File
@@ -1,13 +1,5 @@
import Quickshell.Io import Quickshell.Io
JsonObject { JsonObject {
property Presets presets: Presets {
}
property string schemeType: "vibrant" property string schemeType: "vibrant"
component Presets: JsonObject {
property string accent: ""
property string name: ""
property string variant: ""
}
} }
+2 -19
View File
@@ -22,7 +22,6 @@ Singleton {
property alias notifs: adapter.notifs property alias notifs: adapter.notifs
property alias osd: adapter.osd property alias osd: adapter.osd
property alias overview: adapter.overview property alias overview: adapter.overview
property alias plugins: adapter.plugins
property bool recentlySaved: false property bool recentlySaved: false
property alias screenshot: adapter.screenshot property alias screenshot: adapter.screenshot
property alias services: adapter.services property alias services: adapter.services
@@ -116,12 +115,7 @@ Singleton {
function serializeColors(): var { function serializeColors(): var {
return { return {
schemeType: colors.schemeType, schemeType: colors.schemeType
presets: {
name: colors.presets.name,
variant: colors.presets.variant,
accent: colors.presets.accent
}
}; };
} }
@@ -141,8 +135,7 @@ Singleton {
launcher: serializeLauncher(), launcher: serializeLauncher(),
colors: serializeColors(), colors: serializeColors(),
dock: serializeDock(), dock: serializeDock(),
screenshot: serializeScreenshot(), screenshot: serializeScreenshot()
plugins: serializePlugins()
}; };
} }
@@ -249,7 +242,6 @@ Singleton {
recolorLogo: lock.recolorLogo, recolorLogo: lock.recolorLogo,
enableFprint: lock.enableFprint, enableFprint: lock.enableFprint,
showNotifContent: lock.showNotifContent, showNotifContent: lock.showNotifContent,
showNotifIcon: lock.showNotifIcon,
maxFprintTries: lock.maxFprintTries, maxFprintTries: lock.maxFprintTries,
blurAmount: lock.blurAmount, blurAmount: lock.blurAmount,
sizes: { sizes: {
@@ -291,13 +283,6 @@ Singleton {
}; };
} }
function serializePlugins(): var {
return {
enabled: plugins.enabled,
entries: plugins.entries
};
}
function serializeScreenshot(): var { function serializeScreenshot(): var {
return { return {
enable_pp: screenshot.enable_pp, enable_pp: screenshot.enable_pp,
@@ -467,8 +452,6 @@ Singleton {
} }
property Overview overview: Overview { property Overview overview: Overview {
} }
property PluginConfig plugins: PluginConfig {
}
property Screenshot screenshot: Screenshot { property Screenshot screenshot: Screenshot {
} }
property Services services: Services { property Services services: Services {
+2 -3
View File
@@ -30,10 +30,9 @@ Singleton {
readonly property alias wallLuminance: analyser.luminance readonly property alias wallLuminance: analyser.luminance
function alterColor(c: color, a: real, layer: int): color { function alterColor(c: color, a: real, layer: int): color {
const initLuminance = getLuminance(c); const luminance = getLuminance(c);
const luminance = Math.max(initLuminance, 0.001);
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 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 scale = (luminance + offset) / luminance; const scale = (luminance + offset) / luminance;
const r = Math.max(0, Math.min(1, c.r * scale)); const r = Math.max(0, Math.min(1, c.r * scale));
const g = Math.max(0, Math.min(1, c.g * scale)); const g = Math.max(0, Math.min(1, c.g * scale));
-1
View File
@@ -6,7 +6,6 @@ JsonObject {
property int maxFprintTries: 3 property int maxFprintTries: 3
property bool recolorLogo: false property bool recolorLogo: false
property bool showNotifContent: false property bool showNotifContent: false
property bool showNotifIcon: true
property Sizes sizes: Sizes { property Sizes sizes: Sizes {
} }
-11
View File
@@ -1,11 +0,0 @@
import Quickshell.Io
JsonObject {
property bool enabled: false
property list<var> entries: [
{
id: "Plugin",
enabled: false
},
]
}
+75
View File
@@ -13,6 +13,7 @@ import qs.Modules.Resources as Resources
import qs.Modules.Settings as Settings import qs.Modules.Settings as Settings
import qs.Modules.Drawing as Drawing import qs.Modules.Drawing as Drawing
import qs.Modules.Dock as Dock import qs.Modules.Dock as Dock
import qs.Modules.SysTray.Popouts as SysPopouts
import qs.Config import qs.Config
Item { Item {
@@ -37,6 +38,7 @@ Item {
readonly property alias settingsWrapper: settingsWrapper readonly property alias settingsWrapper: settingsWrapper
readonly property alias sidebar: sidebar readonly property alias sidebar: sidebar
readonly property alias toasts: toasts readonly property alias toasts: toasts
readonly property alias traySubmenus: traySubmenus
readonly property alias utilities: utilities readonly property alias utilities: utilities
required property PersistentProperties visibilities required property PersistentProperties visibilities
@@ -93,6 +95,79 @@ Item {
visibilities: root.visibilities visibilities: root.visibilities
} }
Item {
id: traySubmenus
Repeater {
model: popouts.content.state.submenus
CustomClippingRect {
id: subMenuWrapper
required property int index
required property var modelData
property real targetX: 0
property real targetY: 0
function updatePosition() {
let sourceItem = modelData.sourceItem;
if (!sourceItem || !sourceItem.parent)
return;
let mapped = sourceItem.mapToItem(root, 0, -Appearance.padding.small);
let rightX = mapped.x + modelData.sourceWidth + Config.barConfig.border;
let leftX = mapped.x - implicitWidth - Config.barConfig.border;
if (rightX + implicitWidth > root.width) {
targetX = leftX;
} else {
targetX = rightX;
}
targetY = mapped.y;
if (targetY + implicitHeight > root.height) {
targetY = root.height - implicitHeight;
}
if (targetY < 0)
targetY = 0;
}
implicitHeight: subMenuContent.implicitHeight + Appearance.padding.small * 2
implicitWidth: subMenuContent.implicitWidth + Appearance.padding.small * 2
radius: Appearance.rounding.normal
x: targetX
y: targetY
Behavior on implicitHeight {
Anim {
}
}
Behavior on implicitWidth {
Anim {
}
}
Component.onCompleted: {
updatePosition();
}
onImplicitHeightChanged: updatePosition()
onImplicitWidthChanged: updatePosition()
SysPopouts.SubMenu {
id: subMenuContent
anchors.centerIn: parent
handle: subMenuWrapper.modelData.handle
level: subMenuWrapper.index + 1
popouts: root.popouts.state
screen: root.screen
}
}
}
}
Modules.ClipWrapper { Modules.ClipWrapper {
id: popouts id: popouts
+29 -1
View File
@@ -64,7 +64,7 @@ Variants {
height: win.height - bar.implicitHeight - Config.barConfig.border height: win.height - bar.implicitHeight - Config.barConfig.border
intersection: Intersection.Xor intersection: Intersection.Xor
regions: popoutRegions.instances regions: [...popoutRegions.instances, ...subMenuRegions.instances]
width: win.width - Config.barConfig.border * 2 width: win.width - Config.barConfig.border * 2
x: Config.barConfig.border x: Config.barConfig.border
y: bar.implicitHeight y: bar.implicitHeight
@@ -93,6 +93,22 @@ Variants {
} }
} }
Variants {
id: subMenuRegions
model: panels.traySubmenus.children
Region {
required property Item modelData
height: modelData.height
intersection: Intersection.Subtract
width: modelData.width
x: modelData.x + panels.traySubmenus.x + Config.barConfig.border
y: modelData.y + panels.traySubmenus.y + bar.implicitHeight
}
}
HyprlandFocusGrab { HyprlandFocusGrab {
id: focusGrab id: focusGrab
@@ -302,6 +318,18 @@ Variants {
panel: panels.drawing panel: panels.drawing
radius: Appearance.rounding.normal radius: Appearance.rounding.normal
} }
Repeater {
model: panels.traySubmenus.children
PanelBg {
required property Item modelData
deformAmount: 0.1
panel: modelData
radius: 20 * Appearance.rounding.scale
}
}
} }
Drawing { Drawing {
-18
View File
@@ -1,18 +0,0 @@
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
@@ -1,17 +0,0 @@
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,14 +16,27 @@ Scope {
property bool launching: false property bool launching: false
property string promptMessage: "" property string promptMessage: ""
readonly property var selectedSession: sessionIndex >= 0 ? sessions[sessionIndex] : null readonly property var selectedSession: sessionIndex >= 0 ? sessions[sessionIndex] : null
readonly property var selectedUser: Users.selectedUser
property int sessionIndex: sessions.length > 0 ? 0 : -1 property int sessionIndex: sessions.length > 0 ? 0 : -1
property var sessions: [] property var sessions: []
readonly property string userFace: selectedUser ? selectedUser.face : ""
readonly property string username: Users.selectedUsername
// User handling - now uses the Users singleton // User handling - now uses the Users singleton
readonly property var users: Users.users 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 signal flashMsg
@@ -45,11 +58,11 @@ Scope {
event.accepted = true; event.accepted = true;
return; return;
} else if (event.key === Qt.Key_Escape) { }
buffer = "";
} else if (" abcdefghijklmnopqrstuvwxyz1234567890`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?".includes(event.text.toLowerCase())) { if (event.text && !/[\r\n]/.test(event.text)) {
// No illegal characters (you are insane if you use unicode in your password)
buffer += event.text; buffer += event.text;
event.accepted = true;
} }
} }
@@ -68,19 +81,6 @@ Scope {
Greetd.launch(selectedSession.command, [], true); 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 { function submit(): void {
errorMessage = ""; errorMessage = "";
-63
View File
@@ -1,63 +0,0 @@
// 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 darkEnd: Config.general.color.scheduleDarkEnd
readonly property int darkStart: Config.general.color.scheduleDarkStart readonly property int darkStart: Config.general.color.scheduleDarkStart
readonly property bool enabled: Config.general.color.scheduleDark && Config.general.color.schemeGeneration readonly property bool enabled: Config.general.color.scheduleDark
function applyDarkMode() { function applyDarkMode() {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", "dark"]); Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", "dark"]);
+41 -82
View File
@@ -1,82 +1,41 @@
pragma Singleton // pragma Singleton
//
import Quickshell // import Quickshell
import Quickshell.Io // import QtQuick
import QtQuick //
// Singleton {
Singleton { // id: root
id: root //
// function start(extraArgs = []): void {
readonly property alias elapsed: props.elapsed // needsStart = true;
property bool needsPause // startArgs = extraArgs;
property bool needsStart // checkProc.running = true;
property bool needsStop // }
readonly property alias paused: props.paused //
readonly property alias running: props.running // PersistentProperties {
property list<string> startArgs // id: props
//
function start(extraArgs = []): void { // property real elapsed: 0
needsStart = true; // property bool paused: false
startArgs = extraArgs; // property bool running: false
checkProc.running = true; //
} // reloadableId: "recorder"
// }
function stop(): void { //
needsStop = true; // Process {
checkProc.running = true; // id: checkProc
} //
// command: ["pidof", "gpu-screen-recorder"]
function togglePause(): void { // running: true
needsPause = true; //
checkProc.running = true; // onExited: code => {
} // props.running = code === 0;
//
PersistentProperties { // if (code === 0) {
id: props // if (root.needsStop) {
// Quickshell.execDetached(["zshell-cli"]);
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/fzf.js" as Fzf
import "../scripts/fuzzysort.js" as Fuzzy import "../scripts/fuzzysort.js" as Fuzzy
import QtQuick import QtQuick
import Quickshell
Singleton { Singleton {
property var extraOpts: ({}) property var extraOpts: ({})
-14
View File
@@ -6,21 +6,7 @@ import Quickshell.Services.UPower
Singleton { Singleton {
id: root id: root
readonly property real batteryPercent: UPower.displayDevice.percentage
readonly property list<UPowerDevice> devices: UPower.devices.values readonly property list<UPowerDevice> devices: UPower.devices.values
readonly property UPowerDevice displayDevice: UPower.displayDevice readonly property UPowerDevice displayDevice: UPower.displayDevice
readonly property bool onBattery: UPower.onBattery 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,9 +1,7 @@
pragma Singleton pragma Singleton
pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import Quickshell.Io import Quickshell.Io
import QtQuick
import ZShell.Models import ZShell.Models
import qs.Config import qs.Config
import qs.Modules import qs.Modules
@@ -14,17 +12,11 @@ Searcher {
id: root id: root
property string actualCurrent: WallpaperPath.currentWallpaperPath property string actualCurrent: WallpaperPath.currentWallpaperPath
property alias crops: adapter.monitorCrops
readonly property string current: showPreview ? previewPath : actualCurrent readonly property string current: showPreview ? previewPath : actualCurrent
property alias monitorCrops: monitorCrops
property string previewPath property string previewPath
property bool recentlyChanged property bool recentlyChanged
property bool showPreview: false property bool showPreview: false
function getCrop(screen: string): var {
return root.crops[screen];
}
function preview(path: string): void { function preview(path: string): void {
previewPath = path; previewPath = path;
if (Config.general.color.schemeGeneration) if (Config.general.color.schemeGeneration)
@@ -32,35 +24,9 @@ Searcher {
showPreview = true; 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 { function setWallpaper(path: string): void {
actualCurrent = path; actualCurrent = path;
WallpaperPath.currentWallpaperPath = 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}`]); 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) if (Config.general.color.schemeGeneration)
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--image-path", `${root.actualCurrent}`, "--scheme", `${Config.colors.schemeType}`, "--mode", `${Config.general.color.mode}`]); Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--image-path", `${root.actualCurrent}`, "--scheme", `${Config.colors.schemeType}`, "--mode", `${Config.general.color.mode}`]);
@@ -87,22 +53,6 @@ Searcher {
target: "wallpaper" target: "wallpaper"
} }
FileView {
id: monitorCrops
path: `${Paths.state}/wallpaper-crops.json`
watchChanges: true
onAdapterUpdated: writeAdapter()
onFileChanged: reload()
JsonAdapter {
id: adapter
property var monitorCrops: ({})
}
}
FileSystemModel { FileSystemModel {
id: wallpapers id: wallpapers
+2
View File
@@ -16,6 +16,7 @@ Item {
readonly property Item current: currentPopout?.item ?? null readonly property Item current: currentPopout?.item ?? null
readonly property Popout currentPopout: content.children.find(c => c.shouldBeActive) ?? null readonly property Popout currentPopout: content.children.find(c => c.shouldBeActive) ?? null
required property PopoutState popouts required property PopoutState popouts
required property ShellScreen screen
implicitHeight: (currentPopout?.implicitHeight ?? 0) + 5 * 2 implicitHeight: (currentPopout?.implicitHeight ?? 0) + 5 * 2
implicitWidth: (currentPopout?.implicitWidth ?? 0) + 5 * 2 implicitWidth: (currentPopout?.implicitWidth ?? 0) + 5 * 2
@@ -63,6 +64,7 @@ Item {
TrayMenuPopout { TrayMenuPopout {
popouts: root.popouts popouts: root.popouts
screen: root.screen
trayItem: trayMenu.modelData.menu trayItem: trayMenu.modelData.menu
} }
} }
-1
View File
@@ -58,7 +58,6 @@ CustomRect {
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
height: Config.notifs.sizes.image height: Config.notifs.sizes.image
source: Qt.resolvedUrl(root.image) source: Qt.resolvedUrl(root.image)
visible: Config.lock.showNotifIcon
width: Config.notifs.sizes.image width: Config.notifs.sizes.image
} }
} }
-2
View File
@@ -30,8 +30,6 @@ Scope {
} else { } else {
buffer = buffer.slice(0, -1); buffer = buffer.slice(0, -1);
} }
} else if (event.key === Qt.Key_Escape) {
buffer = "";
} else if (" abcdefghijklmnopqrstuvwxyz1234567890`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?".includes(event.text.toLowerCase())) { } else if (" abcdefghijklmnopqrstuvwxyz1234567890`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?".includes(event.text.toLowerCase())) {
// No illegal characters (you are insane if you use unicode in your password) // No illegal characters (you are insane if you use unicode in your password)
buffer += event.text; buffer += event.text;
-3
View File
@@ -136,10 +136,7 @@ CustomRect {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
onLinkActivated: link => { onLinkActivated: link => {
if (Config.launcher.uwsm)
Quickshell.execDetached(["app2unit", "-O", "--", link]); Quickshell.execDetached(["app2unit", "-O", "--", link]);
else
Quickshell.execDetached(["xdg-open", link]);
root.visibilities.sidebar = false; root.visibilities.sidebar = false;
} }
} }
@@ -1,290 +0,0 @@
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()
}
}
}
}
@@ -1,226 +0,0 @@
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,14 +1,13 @@
import Quickshell
import QtQuick
import QtQuick.Layouts
import qs.Modules.Notifications.Sidebar.Utils.Cards import qs.Modules.Notifications.Sidebar.Utils.Cards
import qs.Config import qs.Config
import QtQuick
import QtQuick.Layouts
Item { Item {
id: root id: root
required property Item popouts required property Item popouts
required property PersistentProperties props required property var props
required property var visibilities required property var visibilities
implicitHeight: layout.implicitHeight implicitHeight: layout.implicitHeight
@@ -23,12 +22,6 @@ Item {
IdleInhibit { IdleInhibit {
} }
Record {
props: root.props
visibilities: root.visibilities
z: 1
}
Toggles { Toggles {
popouts: root.popouts popouts: root.popouts
visibilities: root.visibilities visibilities: root.visibilities
+3 -5
View File
@@ -100,15 +100,13 @@ Item {
icon: `brightness_${(Math.round(value * 6) + 1)}` icon: `brightness_${(Math.round(value * 6) + 1)}`
value: root.brightness value: root.brightness
onPressedChanged: { onMoved: {
if (!pressed) {
if (Config.osd.allMonBrightness) { if (Config.osd.allMonBrightness) {
root.monitor?.setBrightness(value);
} else {
for (const mon of Brightness.monitors) { for (const mon of Brightness.monitors) {
mon.setBrightness(value); mon.setBrightness(value);
} }
} else {
root.monitor?.setBrightness(value);
}
} }
} }
} }
+28
View File
@@ -1,8 +1,36 @@
import QtQuick import QtQuick
QtObject { QtObject {
id: root
property string currentName property string currentName
property bool hasCurrent property bool hasCurrent
property var submenus: []
signal detachRequested(mode: string) signal detachRequested(mode: string)
function clearSubmenus(): void {
submenus = [];
}
function closeSubmenus(level: int): void {
submenus = submenus.slice(0, level);
}
function pushSubmenu(level: int, handle: var, sourceItem: var, sourceWidth: int): void {
let newSubmenus = submenus.slice(0, level);
newSubmenus.push({
"handle": handle,
"sourceItem": sourceItem,
"sourceWidth": sourceWidth
});
submenus = newSubmenus;
}
onCurrentNameChanged: {
root.clearSubmenus();
}
onHasCurrentChanged: {
root.clearSubmenus();
}
} }
-6
View File
@@ -116,12 +116,6 @@ Item {
key: "updates" key: "updates"
name: "Updates" name: "Updates"
} }
ListElement {
icon: "extension"
key: "plugins"
name: "Extensions"
}
} }
CustomClippingRect { CustomClippingRect {
@@ -1,4 +1,3 @@
import QtQuick
import qs.Modules.Settings.Controls import qs.Modules.Settings.Controls
import qs.Config import qs.Config
@@ -81,7 +80,6 @@ SettingsPage {
name: "Sans family" name: "Sans family"
object: Config.appearance.font.family object: Config.appearance.font.family
setting: "sans" setting: "sans"
stringList: Qt.fontFamilies()
} }
Separator { Separator {
@@ -91,7 +89,6 @@ SettingsPage {
name: "Monospace family" name: "Monospace family"
object: Config.appearance.font.family object: Config.appearance.font.family
setting: "mono" setting: "mono"
stringList: Qt.fontFamilies()
} }
} }
+3 -3
View File
@@ -1,4 +1,3 @@
import Quickshell
import QtQuick.Layouts import QtQuick.Layouts
import qs.Modules.Settings.Controls import qs.Modules.Settings.Controls
import qs.Config import qs.Config
@@ -6,8 +5,6 @@ import qs.Config
SettingsPage { SettingsPage {
id: root id: root
required property ShellScreen screen
SettingsSection { SettingsSection {
sectionId: "Wallpaper" sectionId: "Wallpaper"
@@ -36,6 +33,8 @@ SettingsPage {
} }
WallpaperCropper { WallpaperCropper {
Layout.fillWidth: true
Layout.preferredHeight: 600
} }
} }
@@ -43,6 +42,7 @@ SettingsPage {
sectionId: "Wallpapers" sectionId: "Wallpapers"
WallpaperGrid { WallpaperGrid {
Layout.fillWidth: true
} }
} }
} }
+111 -111
View File
@@ -19,8 +19,8 @@ SettingsPage {
} }
SettingSpinBox { SettingSpinBox {
min: 0
name: "Media update interval" name: "Media update interval"
min: 0
object: Config.dashboard object: Config.dashboard
setting: "mediaUpdateInterval" setting: "mediaUpdateInterval"
step: 50 step: 50
@@ -30,8 +30,8 @@ SettingsPage {
} }
SettingSpinBox { SettingSpinBox {
min: 0
name: "Resource update interval" name: "Resource update interval"
min: 0
object: Config.dashboard object: Config.dashboard
setting: "resourceUpdateInterval" setting: "resourceUpdateInterval"
step: 50 step: 50
@@ -41,8 +41,8 @@ SettingsPage {
} }
SettingSpinBox { SettingSpinBox {
min: 0
name: "Drag threshold" name: "Drag threshold"
min: 0
object: Config.dashboard object: Config.dashboard
setting: "dragThreshold" setting: "dragThreshold"
} }
@@ -107,112 +107,112 @@ SettingsPage {
} }
} }
// SettingsSection { SettingsSection {
// sectionId: "Layout Sizes" sectionId: "Layout Sizes"
//
// SettingsHeader { SettingsHeader {
// name: "Layout Sizes" name: "Layout Sizes"
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Tab indicator height" name: "Tab indicator height"
// value: String(Config.dashboard.sizes.tabIndicatorHeight) value: String(Config.dashboard.sizes.tabIndicatorHeight)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Tab indicator spacing" name: "Tab indicator spacing"
// value: String(Config.dashboard.sizes.tabIndicatorSpacing) value: String(Config.dashboard.sizes.tabIndicatorSpacing)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Info width" name: "Info width"
// value: String(Config.dashboard.sizes.infoWidth) value: String(Config.dashboard.sizes.infoWidth)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Info icon size" name: "Info icon size"
// value: String(Config.dashboard.sizes.infoIconSize) value: String(Config.dashboard.sizes.infoIconSize)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Date time width" name: "Date time width"
// value: String(Config.dashboard.sizes.dateTimeWidth) value: String(Config.dashboard.sizes.dateTimeWidth)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Media width" name: "Media width"
// value: String(Config.dashboard.sizes.mediaWidth) value: String(Config.dashboard.sizes.mediaWidth)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Media progress sweep" name: "Media progress sweep"
// value: String(Config.dashboard.sizes.mediaProgressSweep) value: String(Config.dashboard.sizes.mediaProgressSweep)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Media progress thickness" name: "Media progress thickness"
// value: String(Config.dashboard.sizes.mediaProgressThickness) value: String(Config.dashboard.sizes.mediaProgressThickness)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Resource progress thickness" name: "Resource progress thickness"
// value: String(Config.dashboard.sizes.resourceProgessThickness) value: String(Config.dashboard.sizes.resourceProgessThickness)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Weather width" name: "Weather width"
// value: String(Config.dashboard.sizes.weatherWidth) value: String(Config.dashboard.sizes.weatherWidth)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Media cover art size" name: "Media cover art size"
// value: String(Config.dashboard.sizes.mediaCoverArtSize) value: String(Config.dashboard.sizes.mediaCoverArtSize)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Media visualiser size" name: "Media visualiser size"
// value: String(Config.dashboard.sizes.mediaVisualiserSize) value: String(Config.dashboard.sizes.mediaVisualiserSize)
// } }
//
// Separator { Separator {
// } }
//
// SettingReadOnly { SettingReadOnly {
// name: "Resource size" name: "Resource size"
// value: String(Config.dashboard.sizes.resourceSize) value: String(Config.dashboard.sizes.resourceSize)
// } }
// } }
} }
-52
View File
@@ -1,6 +1,4 @@
import Quickshell import Quickshell
import QtQuick
import QtQuick.Layouts
import qs.Modules.Settings.Controls import qs.Modules.Settings.Controls
import qs.Config import qs.Config
import qs.Components import qs.Components
@@ -69,7 +67,6 @@ SettingsPage {
CustomSplitButtonRow { CustomSplitButtonRow {
active: Config.general.color.mode === "light" ? menuItems[0] : menuItems[1] active: Config.general.color.mode === "light" ? menuItems[0] : menuItems[1]
buttonAlias.disabled: !Config.general.color.schemeGeneration
label: qsTr("Scheme mode") label: qsTr("Scheme mode")
menuItems: [ menuItems: [
@@ -103,7 +100,6 @@ SettingsPage {
id: schemeType id: schemeType
active: root.schemeTypeItem(menuItems, Config.colors.schemeType) active: root.schemeTypeItem(menuItems, Config.colors.schemeType)
buttonAlias.disabled: !Config.general.color.schemeGeneration
label: qsTr("Scheme type") label: qsTr("Scheme type")
z: 2 z: 2
@@ -173,69 +169,21 @@ SettingsPage {
} }
Separator { 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 { SettingSwitch {
name: "Smart color scheme" name: "Smart color scheme"
object: Config.general.color object: Config.general.color
setting: "smart" setting: "smart"
shouldBeActive: Config.general.color.schemeGeneration ? 1 : 0
} }
Separator { Separator {
shouldBeActive: Config.general.color.schemeGeneration ? 1 : 0
} }
SettingSpinner { SettingSpinner {
name: "Schedule dark mode" name: "Schedule dark mode"
object: Config.general.color object: Config.general.color
settings: ["scheduleDarkStart", "scheduleDarkEnd", "scheduleDark"] settings: ["scheduleDarkStart", "scheduleDarkEnd", "scheduleDark"]
shouldBeActive: Config.general.color.schemeGeneration ? 1 : 0
} }
Separator { Separator {
@@ -50,15 +50,6 @@ SettingsPage {
Separator { Separator {
} }
SettingSwitch {
name: "Show notification icon"
object: Config.lock
setting: "showNotifIcon"
}
Separator {
}
SettingSpinBox { SettingSpinBox {
min: 0 min: 0
name: "Blur amount" name: "Blur amount"
@@ -103,18 +94,6 @@ SettingsPage {
} }
} }
SettingsSection {
sectionId: "Greeter"
SettingsHeader {
name: "Greeter"
}
SettingsIconButton {
name: "Install wallpaper and color scheme to greeter"
}
}
SettingsSection { SettingsSection {
sectionId: "Idle" sectionId: "Idle"
@@ -9,8 +9,6 @@ import qs.Modules.Settings.Controls
ColumnLayout { ColumnLayout {
id: root id: root
property bool shouldBeActive: true
function addTimeoutEntry() { function addTimeoutEntry() {
let list = [...Config.general.idle.timeouts]; let list = [...Config.general.idle.timeouts];
@@ -42,26 +40,8 @@ ColumnLayout {
Config.save(); Config.save();
} }
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right
height: shouldBeActive ? implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
spacing: Appearance.spacing.smaller spacing: Appearance.spacing.smaller
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Settings { Settings {
name: "Idle Monitors" name: "Idle Monitors"
@@ -72,8 +52,6 @@ ColumnLayout {
SettingList { SettingList {
Layout.fillWidth: true Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
onAddActiveActionRequested: { onAddActiveActionRequested: {
root.updateTimeoutEntry(index, "activeAction", ""); root.updateTimeoutEntry(index, "activeAction", "");
-18
View File
@@ -1,18 +0,0 @@
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 { SettingSpinBox {
min: 1
name: "Max toasts" name: "Max toasts"
min: 1
object: Config.utilities object: Config.utilities
setting: "maxToasts" setting: "maxToasts"
} }
@@ -29,8 +29,8 @@ SettingsPage {
} }
SettingSpinBox { SettingSpinBox {
min: 1
name: "Panel width" name: "Panel width"
min: 1
object: Config.utilities.sizes object: Config.utilities.sizes
setting: "width" setting: "width"
} }
@@ -39,8 +39,8 @@ SettingsPage {
} }
SettingSpinBox { SettingSpinBox {
min: 1
name: "Toast width" name: "Toast width"
min: 1
object: Config.utilities.sizes object: Config.utilities.sizes
setting: "toastWidth" setting: "toastWidth"
} }
@@ -77,100 +77,100 @@ SettingsPage {
setting: "gameModeChanged" 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"
// }
} }
// SettingsSection { SettingSwitch {
// sectionId: "VPN" name: "Do not disturb changed"
// object: Config.utilities.toasts
// SettingsHeader { setting: "dndChanged"
// name: "VPN" }
// }
// Separator {
// SettingSwitch { }
// name: "Enable VPN integration"
// object: Config.utilities.vpn SettingSwitch {
// setting: "enabled" name: "Audio output changed"
// } object: Config.utilities.toasts
// setting: "audioOutputChanged"
// Separator { }
// }
// Separator {
// SettingStringList { }
// name: "Provider"
// addLabel: qsTr("Add VPN provider") SettingSwitch {
// object: Config.utilities.vpn name: "Audio input changed"
// setting: "provider" 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"
}
}
} }
+2 -13
View File
@@ -1,5 +1,3 @@
pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import Quickshell.Widgets import Quickshell.Widgets
import QtQuick import QtQuick
@@ -22,6 +20,7 @@ Item {
required property PersistentProperties visibilities required property PersistentProperties visibilities
function scrollToSetting(section: string, settingName: string) { function scrollToSetting(section: string, settingName: string) {
// Wait for the StackView transition to complete, then scroll
root.pendingSection = section; root.pendingSection = section;
root.pendingSetting = settingName; root.pendingSetting = settingName;
scrollTimer.restart(); scrollTimer.restart();
@@ -79,8 +78,6 @@ Item {
stack.push(screenshot); stack.push(screenshot);
else if (currentCategory === "updates") else if (currentCategory === "updates")
stack.push(updates); stack.push(updates);
else if (currentCategory === "plugins")
stack.push(plugins);
} }
target: root target: root
@@ -136,7 +133,7 @@ Item {
anchors.right: parent.right anchors.right: parent.right
anchors.top: searchBar.bottom anchors.top: searchBar.bottom
anchors.topMargin: Appearance.spacing.smaller anchors.topMargin: Appearance.spacing.smaller
color: DynamicColors.tPalette.m3surfaceContainerLowest color: DynamicColors.tPalette.m3surfaceContainer
radius: Appearance.rounding.normal radius: Appearance.rounding.normal
StackView { StackView {
@@ -160,7 +157,6 @@ Item {
id: background id: background
Cat.Background { Cat.Background {
screen: root.screen
} }
} }
@@ -247,11 +243,4 @@ Item {
Cat.SystemUpdates { Cat.SystemUpdates {
} }
} }
Component {
id: plugins
Cat.Plugins {
}
}
} }
@@ -1,161 +0,0 @@
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));
}
}
}
}
}
}
}
+2 -21
View File
@@ -6,26 +6,7 @@ import qs.Config
CustomRect { CustomRect {
id: root id: root
property bool shouldBeActive: true Layout.fillWidth: true
Layout.preferredHeight: 1
anchors.left: parent.left
anchors.right: parent.right
color: DynamicColors.tPalette.m3outlineVariant 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,7 +13,6 @@ ColumnLayout {
required property string name required property string name
required property var object required property var object
required property string setting required property string setting
property bool shouldBeActive: true
function addAction() { function addAction() {
const list = [...root.object[root.setting]]; const list = [...root.object[root.setting]];
@@ -45,26 +44,8 @@ ColumnLayout {
Config.save(); Config.save();
} }
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right
height: shouldBeActive ? implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
spacing: Appearance.spacing.smaller spacing: Appearance.spacing.smaller
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
@@ -127,9 +108,6 @@ ColumnLayout {
} }
Separator { Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
} }
RowLayout { RowLayout {
@@ -210,8 +188,6 @@ ColumnLayout {
StringListEditor { StringListEditor {
Layout.fillWidth: true Layout.fillWidth: true
addLabel: qsTr("Add command argument") addLabel: qsTr("Add command argument")
anchors.left: undefined
anchors.right: undefined
values: [...(modelData.command ?? [])] values: [...(modelData.command ?? [])]
onListEdited: function (values) { onListEdited: function (values) {
@@ -220,9 +196,6 @@ ColumnLayout {
} }
Separator { Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
} }
RowLayout { RowLayout {
@@ -241,9 +214,6 @@ ColumnLayout {
} }
Separator { Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
} }
RowLayout { RowLayout {
+13 -44
View File
@@ -6,14 +6,13 @@ import qs.Components
import qs.Config import qs.Config
import qs.Helpers import qs.Helpers
CustomRect { ColumnLayout {
id: root id: root
readonly property bool highlighted: SettingsHighlight.highlightedSetting === name readonly property bool highlighted: SettingsHighlight.highlightedSetting === name
required property string name required property string name
required property var object required property var object
required property string setting required property string setting
property bool shouldBeActive: true
function addAlias() { function addAlias() {
const list = [...root.object[root.setting]]; const list = [...root.object[root.setting]];
@@ -41,25 +40,8 @@ CustomRect {
Config.save(); Config.save();
} }
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right spacing: Appearance.spacing.smaller
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 { Rectangle {
anchors.fill: parent anchors.fill: parent
@@ -76,14 +58,6 @@ CustomRect {
} }
} }
ColumnLayout {
id: layout
anchors.left: parent.left
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: Appearance.spacing.smaller
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
font.pointSize: Appearance.font.size.larger font.pointSize: Appearance.font.size.larger
@@ -128,17 +102,15 @@ CustomRect {
} }
CustomRect { CustomRect {
Layout.fillWidth: true
Layout.preferredHeight: 33 Layout.preferredHeight: 33
Layout.preferredWidth: Math.max(Math.min(fromTextField.contentWidth + Appearance.padding.large * 2, 550), 50)
color: DynamicColors.tPalette.m3surfaceContainerHigh color: DynamicColors.tPalette.m3surfaceContainerHigh
radius: Appearance.rounding.full radius: Appearance.rounding.full
CustomTextField { CustomTextField {
id: fromTextField anchors.fill: parent
anchors.leftMargin: Appearance.padding.normal
anchors.centerIn: parent anchors.rightMargin: Appearance.padding.normal
horizontalAlignment: Text.AlignHCenter
implicitWidth: Math.min(contentWidth + Appearance.padding.normal * 2, 550)
text: modelData.from ?? "" text: modelData.from ?? ""
onEditingFinished: root.updateAlias(index, "from", text) onEditingFinished: root.updateAlias(index, "from", text)
@@ -163,17 +135,15 @@ CustomRect {
} }
CustomRect { CustomRect {
Layout.fillWidth: true
Layout.preferredHeight: 33 Layout.preferredHeight: 33
Layout.preferredWidth: Math.max(Math.min(toTextField.contentWidth + Appearance.padding.large * 2, 550), 50) color: DynamicColors.tPalette.m3surface
color: DynamicColors.tPalette.m3surfaceContainerHigh radius: Appearance.rounding.small
radius: Appearance.rounding.full
CustomTextField { CustomTextField {
id: toTextField anchors.fill: parent
anchors.leftMargin: Appearance.padding.normal
anchors.centerIn: parent anchors.rightMargin: Appearance.padding.normal
horizontalAlignment: Text.AlignHCenter
implicitWidth: Math.min(contentWidth + Appearance.padding.normal * 2, 550)
text: modelData.to ?? "" text: modelData.to ?? ""
onEditingFinished: root.updateAlias(index, "to", text) onEditingFinished: root.updateAlias(index, "to", text)
@@ -200,4 +170,3 @@ CustomRect {
} }
} }
} }
}
@@ -25,7 +25,6 @@ Item {
required property var object required property var object
property var pendingCommitEntries: [] property var pendingCommitEntries: []
required property string setting required property string setting
property bool shouldBeActive: true
property int uidCounter: 0 property int uidCounter: 0
property var visualEntries: [] property var visualEntries: []
@@ -147,25 +146,8 @@ Item {
Config.save(); Config.save();
} }
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right implicitHeight: layout.implicitHeight
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() Component.onCompleted: root.rebuildVisualEntries()
@@ -11,7 +11,6 @@ Item {
required property string name required property string name
required property var object required property var object
required property list<string> settings required property list<string> settings
property bool shouldBeActive: true
function commitChoice(choice: int, setting: string): void { function commitChoice(choice: int, setting: string): void {
root.object[setting] = choice; root.object[setting] = choice;
@@ -33,25 +32,8 @@ Item {
return Qt.formatTime(d, "h AP"); return Qt.formatTime(d, "h AP");
} }
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
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 { Rectangle {
anchors.fill: parent anchors.fill: parent
+2 -20
View File
@@ -11,7 +11,6 @@ Item {
required property string name required property string name
required property var object required property var object
required property string setting required property string setting
property bool shouldBeActive: true
function formattedValue(): string { function formattedValue(): string {
const value = root.object[root.setting]; const value = root.object[root.setting];
@@ -22,25 +21,8 @@ Item {
return String(value); return String(value);
} }
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
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 { Rectangle {
anchors.fill: parent anchors.fill: parent
+2 -26
View File
@@ -8,31 +8,13 @@ Item {
required property int index required property int index
required property var modelData required property var modelData
property bool shouldBeActive: true
signal addActiveActionRequested signal addActiveActionRequested
signal deleteRequested(int index) signal deleteRequested(int index)
signal fieldEdited(string key, var value) signal fieldEdited(string key, var value)
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
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 { CustomRect {
anchors.left: parent.left anchors.left: parent.left
@@ -194,9 +176,6 @@ Item {
} }
Separator { Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
} }
RowLayout { RowLayout {
@@ -228,9 +207,6 @@ Item {
} }
Separator { Separator {
Layout.fillWidth: true
anchors.left: undefined
anchors.right: undefined
} }
Item { Item {
+4 -27
View File
@@ -11,32 +11,10 @@ Item {
required property string name required property string name
required property var object required property var object
property alias row: row
required property string setting required property string setting
property bool shouldBeActive: true
required property list<var> stringList
signal optionSet Layout.fillWidth: true
Layout.preferredHeight: row.height
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 { RowLayout {
id: row id: row
@@ -142,18 +120,17 @@ Item {
StateLayer { StateLayer {
onClicked: { onClicked: {
root.object[root.setting] = fontDelegate.modelData; root.object[root.setting] = fontDelegate.modelData;
root.optionSet();
Config.save(); Config.save();
} }
} }
} }
model: ScriptModel { model: ScriptModel {
values: { values: {
const values = root.stringList; const fonts = Qt.fontFamilies();
const search = fontSearch.text; const search = fontSearch.text;
var regex = new RegExp(search, "i"); var regex = new RegExp(search, "i");
return values.filter(n => regex.test(n)); return fonts.filter(n => regex.test(n));
} }
} }
} }
+2 -20
View File
@@ -9,28 +9,10 @@ Item {
readonly property bool highlighted: SettingsHighlight.highlightedSetting === name readonly property bool highlighted: SettingsHighlight.highlightedSetting === name
required property string name required property string name
property bool shouldBeActive: true
required property string value required property string value
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
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 { Rectangle {
anchors.fill: parent anchors.fill: parent
+2 -20
View File
@@ -13,28 +13,10 @@ Item {
required property string name required property string name
required property var object required property var object
required property string setting required property string setting
property bool shouldBeActive: true
property real step: 1 property real step: 1
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
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 { Rectangle {
anchors.fill: parent anchors.fill: parent
+2 -20
View File
@@ -11,7 +11,6 @@ Item {
required property string name required property string name
required property var object required property var object
required property list<string> settings required property list<string> settings
property bool shouldBeActive: true
function commitChoice(choice: int, setting: string): void { function commitChoice(choice: int, setting: string): void {
root.object[setting] = choice; root.object[setting] = choice;
@@ -33,25 +32,8 @@ Item {
return Qt.formatTime(d, "h AP"); return Qt.formatTime(d, "h AP");
} }
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
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 { Rectangle {
anchors.fill: parent anchors.fill: parent
@@ -12,27 +12,9 @@ Item {
required property string name required property string name
required property var object required property var object
required property string setting required property string setting
property bool shouldBeActive: true
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: layout.implicitHeight
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 { Rectangle {
anchors.fill: parent anchors.fill: parent
@@ -64,9 +46,6 @@ Item {
StringListEditor { StringListEditor {
Layout.fillWidth: true Layout.fillWidth: true
addLabel: root.addLabel addLabel: root.addLabel
anchors.left: undefined
anchors.right: undefined
anchors.verticalCenter: undefined
values: [...(root.object[root.setting] ?? [])] values: [...(root.object[root.setting] ?? [])]
onListEdited: function (values) { onListEdited: function (values) {
+2 -20
View File
@@ -11,27 +11,9 @@ Item {
required property string name required property string name
required property var object required property var object
required property string setting required property string setting
property bool shouldBeActive: true
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
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 { Rectangle {
anchors.fill: parent anchors.fill: parent
+2 -6
View File
@@ -7,13 +7,9 @@ CustomRect {
id: root id: root
required property string name required property string name
property bool shouldBeActive: true
implicitHeight: 60 Layout.preferredHeight: 60
implicitWidth: 200 Layout.preferredWidth: 200
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
CustomText { CustomText {
anchors.fill: parent anchors.fill: parent
@@ -1,83 +0,0 @@
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}`]);
}
}
}
}
+1 -7
View File
@@ -60,18 +60,12 @@ CustomClippingRect {
} }
} }
Column { ColumnLayout {
id: clayout id: clayout
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
spacing: Appearance.spacing.small spacing: Appearance.spacing.small
// move: Transition {
// Anim {
// properties: "y"
// }
// }
} }
} }
} }
+4 -25
View File
@@ -10,39 +10,18 @@ CustomRect {
property real contentPadding: Appearance.padding.large property real contentPadding: Appearance.padding.large
property string sectionId: "" property string sectionId: ""
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right Layout.preferredHeight: layout.implicitHeight + contentPadding * 2
color: DynamicColors.tPalette.m3surfaceContainer color: DynamicColors.tPalette.m3surfaceContainer
implicitHeight: layout.height + contentPadding * 2
radius: Appearance.rounding.normal - Appearance.padding.smaller radius: Appearance.rounding.normal - Appearance.padding.smaller
Behavior on implicitHeight { ColumnLayout {
Anim {
}
}
Behavior on y {
Anim {
}
}
Column {
id: layout id: layout
anchors.left: parent.left anchors.left: parent.left
anchors.margins: root.contentPadding anchors.margins: root.contentPadding
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.verticalCenter: parent.verticalCenter
// anchors.verticalCenter: parent.verticalCenter
spacing: Appearance.spacing.normal spacing: Appearance.spacing.normal
Behavior on height {
Anim {
}
}
move: Transition {
Anim {
properties: "y"
}
}
} }
} }
@@ -12,29 +12,12 @@ CustomRect {
property alias expanded: menu.expanded property alias expanded: menu.expanded
property alias label: label property alias label: label
property alias menu: menu property alias menu: menu
property bool shouldBeActive: true
property alias text: label.text property alias text: label.text
color: enabled ? DynamicColors.palette.m3primary : DynamicColors.layer(DynamicColors.palette.m3surfaceContainerHigh, 2) color: enabled ? DynamicColors.palette.m3primary : DynamicColors.layer(DynamicColors.palette.m3surfaceContainerHigh, 2)
opacity: shouldBeActive ? 1 : 0
radius: Appearance.rounding.full radius: Appearance.rounding.full
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
z: expanded ? 100 : 0 z: expanded ? 100 : 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
CustomText { CustomText {
id: label id: label
+1 -20
View File
@@ -9,7 +9,6 @@ ColumnLayout {
id: root id: root
property string addLabel: qsTr("Add entry") property string addLabel: qsTr("Add entry")
property bool shouldBeActive: true
property var values: [] property var values: []
signal listEdited(var values) signal listEdited(var values)
@@ -32,26 +31,8 @@ ColumnLayout {
root.listEdited(list); root.listEdited(list);
} }
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right
height: shouldBeActive ? implicitHeight : 0
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
spacing: Appearance.spacing.smaller spacing: Appearance.spacing.smaller
visible: opacity > 0
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Behavior on y {
Anim {
}
}
Repeater { Repeater {
model: [...root.values] model: [...root.values]
+60 -225
View File
@@ -1,254 +1,73 @@
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls
import Quickshell import Quickshell
import Quickshell.Hyprland
import ZShell.Internal
import qs.Config import qs.Config
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
Item { 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 id: root
anchors.fill: parent Image {
spacing: Appearance.spacing.normal id: imageView
Repeater { property real displayH: paintedHeight
model: ScriptModel { property real displayW: paintedWidth
values: [...Quickshell.screens].sort((a, b) => { property real displayX: (width - paintedWidth) * 0.5
return a.x - b.x; 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
} }
Item { Item {
id: delegate id: overlay
required property ShellScreen modelData clip: true
height: imageView.displayH
function applyCrop(): void { width: imageView.displayW
const croprect = cropRect.mapToItem(scaledImg, 0, 0, cropRect.width, cropRect.height); x: imageView.displayX
const upscaledRect = Qt.rect((croprect.x - cropRect.imageX) / scaledImg.paintedWidth, (croprect.y - cropRect.imageY) / scaledImg.paintedHeight, croprect.width / scaledImg.paintedWidth, croprect.height / scaledImg.paintedHeight); y: imageView.displayY
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 { CustomRect {
id: cropRect id: cropRect
property real aspectRatio: delegate.modelData.width / delegate.modelData.height property real aspectRatio: Quickshell.screens[0].width / Quickshell.screens[0].height
readonly property real baseHeight: baseWidth / aspectRatio readonly property rect sourceRect: Qt.rect(x * imageView.scaleX, y * imageView.scaleY, width * imageView.scaleX, height * imageView.scaleY)
readonly property real baseWidth: { property real zoom: Config.background.zoom
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() { function clampToBounds() {
x = Math.max(imageX, Math.min(x, imageX + scaledImg.paintedWidth - width)); x = Math.max(0, Math.min(x, overlay.width - width));
y = Math.max(imageY, Math.min(y, imageY + scaledImg.paintedHeight - height)); y = Math.max(0, Math.min(y, overlay.height - 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.color: DynamicColors.palette.m3primary
border.width: 2 border.width: 2
height: baseHeight / zoom color: DynamicColors.tPalette.m3primary
opacity: 1 height: width / aspectRatio
width: baseWidth / zoom radius: Appearance.rounding.small
visible: imageView.status === Image.Ready
Behavior on opacity { width: Math.min(overlay.width / zoom, overlay.height * aspectRatio / zoom)
Anim { x: Config.background.sourceClipX / imageView.scaleX
} y: Config.background.sourceClipY / imageView.scaleY
}
Component.onCompleted: clampToBounds()
onHeightChanged: clampToBounds()
onWidthChanged: clampToBounds()
} }
MouseArea { MouseArea {
id: mouse
function updateCrop(mouseX, mouseY) { function updateCrop(mouseX, mouseY) {
let nx = mouseX - cropRect.width * 0.5; let nx = mouseX - cropRect.width * 0.5;
let ny = mouseY - cropRect.height * 0.5; let ny = mouseY - cropRect.height * 0.5;
nx = Math.max(cropRect.imageX, Math.min(nx, cropRect.imageX + scaledImg.paintedWidth - cropRect.width)); nx = Math.max(0, Math.min(nx, overlay.width - cropRect.width));
ny = Math.max(cropRect.imageY, Math.min(ny, cropRect.imageY + scaledImg.paintedHeight - cropRect.height)); ny = Math.max(0, Math.min(ny, overlay.height - cropRect.height));
cropRect.x = nx; cropRect.x = nx;
cropRect.y = ny; cropRect.y = ny;
@@ -259,20 +78,36 @@ Item {
preventStealing: true preventStealing: true
onPositionChanged: mouse => { onPositionChanged: mouse => {
if (pressed) { if (pressed)
updateCrop(mouse.x, mouse.y); updateCrop(mouse.x, mouse.y);
wrapper.changesMade = true;
}
} }
onPressed: mouse => { onPressed: mouse => {
updateCrop(mouse.x, mouse.y); updateCrop(mouse.x, mouse.y);
wrapper.changesMade = true;
} }
onReleased: { onReleased: {
wrapper.changesMade = true; 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();
}
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();
} }
} }
} }
+35 -47
View File
@@ -12,30 +12,37 @@ GridView {
readonly property int columnsCount: Math.max(1, Math.floor(width / minCellWidth)) readonly property int columnsCount: Math.max(1, Math.floor(width / minCellWidth))
readonly property int minCellWidth: 200 + Appearance.spacing.normal readonly property int minCellWidth: 200 + Appearance.spacing.normal
property bool shouldBeActive: true
anchors.left: parent.left Layout.preferredHeight: contentHeight
anchors.right: parent.right
cellHeight: 140 + Appearance.spacing.normal cellHeight: 140 + Appearance.spacing.normal
cellWidth: width / columnsCount cellWidth: width / columnsCount
clip: true clip: true
implicitHeight: shouldBeActive ? contentHeight : 0
interactive: false interactive: false
model: Wallpapers.list model: Wallpapers.list
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
visible: opacity > 0
delegate: Item { delegate: Item {
required property int index required property int index
readonly property bool isCurrent: modelData && modelData.path === Wallpapers.actualCurrent readonly property bool isCurrent: modelData && modelData.path === Wallpapers.actualCurrent
readonly property real itemMargin: Appearance.spacing.normal readonly property real itemMargin: Appearance.spacing.normal / 2
readonly property real itemRadius: Appearance.rounding.small readonly property real itemRadius: Appearance.rounding.normal
required property var modelData required property var modelData
height: root.cellHeight height: root.cellHeight
width: root.cellWidth 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 { CustomClippingRect {
id: image id: image
@@ -46,6 +53,8 @@ GridView {
anchors.topMargin: itemMargin anchors.topMargin: itemMargin
antialiasing: true antialiasing: true
color: DynamicColors.tPalette.m3surfaceContainer color: DynamicColors.tPalette.m3surfaceContainer
layer.enabled: true
layer.smooth: true
radius: itemRadius radius: itemRadius
CachingImage { CachingImage {
@@ -91,13 +100,29 @@ GridView {
} }
} }
Timer {
id: fallbackTimer
property bool triggered: false
interval: 800
running: cachingImage.status === Image.Loading || cachingImage.status === Image.Null
onTriggered: triggered = true
}
}
Rectangle { Rectangle {
anchors.bottomMargin: itemMargin
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: itemMargin
anchors.rightMargin: itemMargin
anchors.topMargin: itemMargin
antialiasing: true antialiasing: true
border.color: DynamicColors.palette.m3primary border.color: DynamicColors.palette.m3primary
border.width: isCurrent ? 2 : 0 border.width: isCurrent ? 2 : 0
color: "transparent" color: "transparent"
radius: itemRadius + 2 radius: itemRadius - border.width
smooth: true smooth: true
Behavior on border.width { Behavior on border.width {
@@ -117,42 +142,5 @@ GridView {
visible: isCurrent 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 {
}
} }
} }
+158
View File
@@ -0,0 +1,158 @@
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Widgets
import QtQuick
import QtQuick.Controls
import QtQuick.Effects
import qs.Components
import qs.Modules
import qs.Config
Column {
id: menu
property int biggestWidth: 0
required property QsMenuHandle handle
required property int level
required property PopoutState popouts
required property ShellScreen screen
property bool shown: true
height: childrenRect.height
opacity: shown ? 1 : 0
padding: 0
scale: shown ? 1 : 0.8
spacing: 4
width: biggestWidth
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
QsMenuOpener {
id: menuOpener
menu: menu.handle
}
Repeater {
model: menuOpener.children
CustomRect {
id: item
required property int index
required property QsMenuEntry modelData
color: modelData.isSeparator ? DynamicColors.palette.m3outlineVariant : "transparent"
implicitHeight: modelData.isSeparator ? 1 : children.implicitHeight
implicitWidth: menu.biggestWidth
radius: Appearance.rounding.full
visible: index !== (menuOpener.children.values.length - 1) ? true : (modelData.isSeparator ? false : true)
Loader {
id: children
active: !item.modelData.isSeparator
anchors.left: parent.left
anchors.right: parent.right
asynchronous: true
sourceComponent: Item {
implicitHeight: 30
StateLayer {
function onClicked(): void {
const entry = item.modelData;
if (entry.hasChildren) {
menu.popouts.pushSubmenu(menu.level, entry, item, menu.biggestWidth);
} else {
entry.triggered();
menu.popouts.hasCurrent = false;
}
}
disabled: !item.modelData.enabled
radius: item.radius
}
Loader {
id: icon
active: item.modelData.icon !== ""
anchors.right: parent.right
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
asynchronous: true
sourceComponent: Item {
implicitHeight: label.implicitHeight
implicitWidth: label.implicitHeight
IconImage {
id: iconImage
implicitSize: parent.implicitHeight
source: item.modelData.icon
visible: false
}
MultiEffect {
anchors.fill: iconImage
colorization: 1.0
colorizationColor: item.modelData.enabled ? DynamicColors.palette.m3onSurface : DynamicColors.palette.m3outline
source: iconImage
}
}
}
CustomText {
id: label
anchors.left: parent.left
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
color: item.modelData.enabled ? DynamicColors.palette.m3onSurface : DynamicColors.palette.m3outline
text: labelMetrics.elidedText
}
TextMetrics {
id: labelMetrics
font.family: label.font.family
font.pointSize: label.font.pointSize
text: item.modelData.text
Component.onCompleted: {
var biggestWidth = menu.biggestWidth;
var currentWidth = labelMetrics.width + (item.modelData.icon ?? "" ? 30 : 0) + (item.modelData.hasChildren ? 30 : 0) + 20;
if (currentWidth > biggestWidth) {
menu.biggestWidth = currentWidth;
}
}
}
Loader {
id: expand
active: item.modelData.hasChildren
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
asynchronous: true
sourceComponent: MaterialIcon {
color: item.modelData.enabled ? DynamicColors.palette.m3onSurface : DynamicColors.palette.m3outline
text: "chevron_right"
}
}
}
}
}
}
}
+4 -239
View File
@@ -1,251 +1,16 @@
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import Quickshell.Widgets
import QtQuick import QtQuick
import QtQuick.Controls
import QtQuick.Effects
import qs.Components import qs.Components
import qs.Modules import qs.Modules
import qs.Config import qs.Config
StackView { SubMenu {
id: root id: root
property int biggestWidth: 0 handle: trayItem
required property PopoutState popouts level: 0
property int rootWidth: 0
required property QsMenuHandle trayItem required property QsMenuHandle trayItem
implicitHeight: currentItem.implicitHeight
implicitWidth: currentItem.implicitWidth
initialItem: SubMenu {
handle: root.trayItem
}
popEnter: NoAnim {
}
popExit: NoAnim {
}
pushEnter: NoAnim {
}
pushExit: NoAnim {
}
Component {
id: subMenuComp
SubMenu {
}
}
component NoAnim: Transition {
NumberAnimation {
duration: 0
}
}
component SubMenu: Column {
id: menu
required property QsMenuHandle handle
property bool isSubMenu
property bool shown
opacity: shown ? 1 : 0
padding: 0
scale: shown ? 1 : 0.8
spacing: 4
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
Component.onCompleted: shown = true
StackView.onActivating: shown = true
StackView.onDeactivating: shown = false
StackView.onRemoved: destroy()
QsMenuOpener {
id: menuOpener
menu: menu.handle
}
Repeater {
model: menuOpener.children
CustomRect {
id: item
required property int index
required property QsMenuEntry modelData
color: modelData.isSeparator ? DynamicColors.palette.m3outlineVariant : "transparent"
implicitHeight: modelData.isSeparator ? 1 : children.implicitHeight
implicitWidth: root.biggestWidth
radius: Appearance.rounding.full
visible: index !== (menuOpener.children.values.length - 1) ? true : (modelData.isSeparator ? false : true)
Loader {
id: children
active: !item.modelData.isSeparator
anchors.left: parent.left
anchors.right: parent.right
asynchronous: true
sourceComponent: Item {
implicitHeight: 30
StateLayer {
function onClicked(): void {
const entry = item.modelData;
if (entry.hasChildren) {
root.rootWidth = root.biggestWidth;
root.biggestWidth = 0;
root.push(subMenuComp.createObject(null, {
handle: entry,
isSubMenu: true
}));
} else {
item.modelData.triggered();
root.popouts.hasCurrent = false;
}
}
disabled: !item.modelData.enabled
radius: item.radius
}
Loader {
id: icon
active: item.modelData.icon !== ""
anchors.right: parent.right
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
asynchronous: true
sourceComponent: Item {
implicitHeight: label.implicitHeight
implicitWidth: label.implicitHeight
IconImage {
id: iconImage
implicitSize: parent.implicitHeight
source: item.modelData.icon
visible: false
}
MultiEffect {
anchors.fill: iconImage
colorization: 1.0
colorizationColor: item.modelData.enabled ? DynamicColors.palette.m3onSurface : DynamicColors.palette.m3outline
source: iconImage
}
}
}
CustomText {
id: label
anchors.left: parent.left
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
color: item.modelData.enabled ? DynamicColors.palette.m3onSurface : DynamicColors.palette.m3outline
text: labelMetrics.elidedText
}
TextMetrics {
id: labelMetrics
font.family: label.font.family
font.pointSize: label.font.pointSize
text: item.modelData.text
Component.onCompleted: {
var biggestWidth = root.biggestWidth;
var currentWidth = labelMetrics.width + (item.modelData.icon ?? "" ? 30 : 0) + (item.modelData.hasChildren ? 30 : 0) + 20;
if (currentWidth > biggestWidth) {
root.biggestWidth = currentWidth;
}
}
}
Loader {
id: expand
active: item.modelData.hasChildren
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
asynchronous: true
sourceComponent: MaterialIcon {
color: item.modelData.enabled ? DynamicColors.palette.m3onSurface : DynamicColors.palette.m3outline
text: "chevron_right"
}
}
}
}
}
}
Loader {
id: loader
active: menu.isSubMenu
asynchronous: true
sourceComponent: Item {
implicitHeight: 30
implicitWidth: back.implicitWidth
Item {
anchors.bottom: parent.bottom
implicitHeight: 30
implicitWidth: root.biggestWidth
CustomRect {
anchors.fill: parent
color: DynamicColors.palette.m3secondaryContainer
radius: Appearance.rounding.full
StateLayer {
function onClicked(): void {
root.pop();
root.biggestWidth = root.rootWidth;
}
color: DynamicColors.palette.m3onSecondaryContainer
radius: parent.radius
}
}
Row {
id: back
anchors.verticalCenter: parent.verticalCenter
MaterialIcon {
anchors.verticalCenter: parent.verticalCenter
color: DynamicColors.palette.m3onSecondaryContainer
text: "chevron_left"
}
CustomText {
anchors.verticalCenter: parent.verticalCenter
color: DynamicColors.palette.m3onSecondaryContainer
text: qsTr("Back")
}
}
}
}
}
}
} }
-1
View File
@@ -1,6 +1,5 @@
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick import QtQuick
import QtQuick.VectorImage
import Quickshell import Quickshell
import Quickshell.Services.SystemTray import Quickshell.Services.SystemTray
import qs.Modules import qs.Modules
+13 -56
View File
@@ -1,7 +1,6 @@
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import Quickshell.Hyprland
import QtQuick import QtQuick
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
@@ -13,73 +12,31 @@ Item {
required property ShellScreen screen required property ShellScreen screen
property string source: Wallpapers.current 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 anchors.fill: parent
Image { Image {
id: img id: img
property int displayH anchors.fill: parent
property int displayW
property real resScale
property real zoom: 1.0
asynchronous: true asynchronous: true
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
height: implicitHeight * zoom / resScale
opacity: 1 opacity: 1
retainWhileLoading: true retainWhileLoading: true
source: root.source source: root.source
sourceSize.width: root.screen.width * resScale sourceClipRect: Wallpapers.recentlyChanged ? null : Qt.rect(Config.background.sourceClipX, Config.background.sourceClipY, Config.background.sourceClipW, Config.background.sourceClipH)
width: implicitWidth * zoom / resScale sourceSize.height: root.screen.height
sourceSize.width: root.screen.width
Behavior on height { onSourceChanged: {
Anim { 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();
} }
} 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
} }
} }
} }
+3 -1
View File
@@ -15,13 +15,14 @@ Item {
property real currentCenter property real currentCenter
property alias currentName: popoutState.currentName property alias currentName: popoutState.currentName
property string detachedMode property string detachedMode
readonly property bool isDetached: detachedMode.length > 0
property alias hasCurrent: popoutState.hasCurrent property alias hasCurrent: popoutState.hasCurrent
readonly property bool isDetached: detachedMode.length > 0
readonly property real nonAnimHeight: children.find(c => c.shouldBeActive)?.implicitHeight ?? content.implicitHeight readonly property real nonAnimHeight: children.find(c => c.shouldBeActive)?.implicitHeight ?? content.implicitHeight
readonly property real nonAnimWidth: children.find(c => c.shouldBeActive)?.implicitWidth ?? content.implicitWidth readonly property real nonAnimWidth: children.find(c => c.shouldBeActive)?.implicitWidth ?? content.implicitWidth
required property real offsetScale required property real offsetScale
property string queuedMode property string queuedMode
required property ShellScreen screen required property ShellScreen screen
property alias state: popoutState
function close(): void { function close(): void {
hasCurrent = false; hasCurrent = false;
@@ -79,6 +80,7 @@ Item {
sourceComponent: Content { sourceComponent: Content {
popouts: popoutState popouts: popoutState
screen: root.screen
} }
} }
+25 -16
View File
@@ -12,8 +12,7 @@ FileSystemEntry::FileSystemEntry(const QString& path, const QString& relativePat
, m_path(path) , m_path(path)
, m_relativePath(relativePath) , m_relativePath(relativePath)
, m_isImageInitialised(false) , m_isImageInitialised(false)
, m_mimeTypeInitialised(false) { , m_mimeTypeInitialised(false) {}
}
QString FileSystemEntry::path() const { QString FileSystemEntry::path() const {
return m_path; return m_path;
@@ -58,8 +57,8 @@ bool FileSystemEntry::isImage() const {
QString FileSystemEntry::mimeType() const { QString FileSystemEntry::mimeType() const {
if (!m_mimeTypeInitialised) { if (!m_mimeTypeInitialised) {
static const QMimeDatabase s_db; const QMimeDatabase db;
m_mimeType = s_db.mimeTypeForFile(m_path).name(); m_mimeType = db.mimeTypeForFile(m_path).name();
m_mimeTypeInitialised = true; m_mimeTypeInitialised = true;
} }
return m_mimeType; return m_mimeType;
@@ -220,7 +219,7 @@ void FileSystemModel::watchDirIfRecursive(const QString& path) {
if (m_recursive && m_watchChanges) { if (m_recursive && m_watchChanges) {
const auto currentDir = m_dir; const auto currentDir = m_dir;
const bool showHidden = m_showHidden; const bool showHidden = m_showHidden;
auto future = QtConcurrent::run([showHidden, path]() { const auto future = QtConcurrent::run([showHidden, path]() {
QDir::Filters filters = QDir::Dirs | QDir::NoDotAndDotDot; QDir::Filters filters = QDir::Dirs | QDir::NoDotAndDotDot;
if (showHidden) { if (showHidden) {
filters |= QDir::Hidden; filters |= QDir::Hidden;
@@ -233,12 +232,16 @@ void FileSystemModel::watchDirIfRecursive(const QString& path) {
} }
return dirs; return dirs;
}); });
future.then(this, [currentDir, showHidden, this](const QStringList& paths) { const auto watcher = new QFutureWatcher<QStringList>(this);
connect(watcher, &QFutureWatcher<QStringList>::finished, this, [currentDir, showHidden, watcher, this]() {
const auto paths = watcher->result();
if (currentDir == m_dir && showHidden == m_showHidden && !paths.isEmpty()) { if (currentDir == m_dir && showHidden == m_showHidden && !paths.isEmpty()) {
// Ignore if dir or showHidden has changed // Ignore if dir or showHidden has changed
m_watcher.addPaths(paths); m_watcher.addPaths(paths);
} }
watcher->deleteLater();
}); });
watcher->setFuture(future);
} }
} }
@@ -292,7 +295,7 @@ void FileSystemModel::updateEntriesForDir(const QString& dir) {
oldPaths << entry->path(); oldPaths << entry->path();
} }
auto future = QtConcurrent::run([=](QPromise<QPair<QSet<QString>, QSet<QString> > >& promise) { const auto future = QtConcurrent::run([=](QPromise<QPair<QSet<QString>, QSet<QString>>>& promise) {
const auto flags = recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags; const auto flags = recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags;
std::optional<QDirIterator> iter; std::optional<QDirIterator> iter;
@@ -350,7 +353,7 @@ void FileSystemModel::updateEntriesForDir(const QString& dir) {
newPaths.insert(path); newPaths.insert(path);
} }
if (promise.isCanceled()) { if (promise.isCanceled() || newPaths == oldPaths) {
return; return;
} }
@@ -362,17 +365,23 @@ void FileSystemModel::updateEntriesForDir(const QString& dir) {
} }
m_futures.insert(dir, future); m_futures.insert(dir, future);
future const auto watcher = new QFutureWatcher<QPair<QSet<QString>, QSet<QString>>>(this);
.then(this,
[dir, this](QPair<QSet<QString>, QSet<QString> > result) { connect(watcher, &QFutureWatcher<QPair<QSet<QString>, QSet<QString>>>::finished, this, [dir, watcher, this]() {
m_futures.remove(dir); m_futures.remove(dir);
if (!result.first.isEmpty() || !result.second.isEmpty()) {
applyChanges(result.first, result.second); if (!watcher->future().isResultReadyAt(0)) {
watcher->deleteLater();
return;
} }
})
.onCanceled(this, [dir, this]() { const auto result = watcher->result();
m_futures.remove(dir); applyChanges(result.first, result.second);
watcher->deleteLater();
}); });
watcher->setFuture(future);
} }
void FileSystemModel::applyChanges(const QSet<QString>& removedPaths, const QSet<QString>& addedPaths) { void FileSystemModel::applyChanges(const QSet<QString>& removedPaths, const QSet<QString>& addedPaths) {
+1 -1
View File
@@ -132,7 +132,7 @@ QString m_path;
bool m_recursive; bool m_recursive;
bool m_watchChanges; bool m_watchChanges;
bool m_showHidden; bool m_showHidden;
bool m_sortReverse = false; bool m_sortReverse;
Filter m_filter; Filter m_filter;
QStringList m_nameFilters; QStringList m_nameFilters;
+5 -49
View File
@@ -216,56 +216,12 @@ Action-driven flows (`>` prefix by default) include calculator, wallpaper picker
`zshell-cli` provides these subcommands: `zshell-cli` provides these subcommands:
### `shell` — daemon management - `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
| Command | Description | Note: `cli/src/zshell/subcommands/scheme.py` uses Jinja2 templating for `~/.config/zshell/templates` rendering.
|---------|-------------|
| `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 ## Greeter
-5
View File
@@ -9,7 +9,6 @@ version = "0.1.0"
dependencies = [ dependencies = [
"typer", "typer",
"pillow", "pillow",
"jinja2",
"materialyoucolor" "materialyoucolor"
] ]
@@ -26,7 +25,3 @@ only-include = [
[tool.ruff] [tool.ruff]
line-length = 120 line-length = 120
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src"]
+1 -2
View File
@@ -1,6 +1,6 @@
from __future__ import annotations from __future__ import annotations
import typer import typer
from zshell.subcommands import shell, scheme, screenshot, wallpaper, record from zshell.subcommands import shell, scheme, screenshot, wallpaper
app = typer.Typer() app = typer.Typer()
@@ -8,7 +8,6 @@ app.add_typer(shell.app, name="shell")
app.add_typer(scheme.app, name="scheme") app.add_typer(scheme.app, name="scheme")
app.add_typer(screenshot.app, name="screenshot") app.add_typer(screenshot.app, name="screenshot")
app.add_typer(wallpaper.app, name="wallpaper") app.add_typer(wallpaper.app, name="wallpaper")
app.add_typer(record.app, name="record")
# app.add_typer(preset.app, name="preset") # app.add_typer(preset.app, name="preset")
@@ -0,0 +1,544 @@
_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",
},
},
],
},
}
@@ -1,110 +0,0 @@
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 ca9ee6 primary_paletteKeyColor 6674ac
secondary_paletteKeyColor 7d6799 secondary_paletteKeyColor 71768e
tertiary_paletteKeyColor f4b8e4 tertiary_paletteKeyColor 9a6593
neutral_paletteKeyColor 414559 neutral_paletteKeyColor 77767b
neutral_variant_paletteKeyColor 303446 neutral_variant_paletteKeyColor 757680
background 303446 background 131317
onBackground c6d0f5 onBackground e4e1e7
surface 414559 surface 131317
surfaceDim 414559 surfaceDim 131317
surfaceBright 55596f surfaceBright 39393d
surfaceContainerLowest 292c3c surfaceContainerLowest 0d0e12
surfaceContainerLow 363a50 surfaceContainerLow 1b1b1f
surfaceContainer 303446 surfaceContainer 1f1f23
surfaceContainerHigh 292c3c surfaceContainerHigh 292a2e
surfaceContainerHighest 232634 surfaceContainerHighest 343438
onSurface c6d0f5 onSurface e4e1e7
surfaceVariant 303446 surfaceVariant 45464f
onSurfaceVariant a5adce onSurfaceVariant c6c5d1
inverseSurface c6d0f5 inverseSurface e4e1e7
inverseOnSurface 414559 inverseOnSurface 303034
outline 737994 outline 8f909a
outlineVariant 51576d outlineVariant 45464f
shadow 000000 shadow 000000
scrim 000000 scrim 000000
surfaceTint 9c7eb6 surfaceTint b7c4ff
primary ca9ee6 primary b7c4ff
onPrimary 303446 onPrimary 1e2d60
primaryContainer 9c7eb6 primaryContainer 6674ac
onPrimaryContainer ffffff onPrimaryContainer ffffff
inversePrimary 6c4f94 inversePrimary 4e5c92
secondary 7d6799 secondary c1c5e0
onSecondary ffffff onSecondary 2a2f44
secondaryContainer 544874 secondaryContainer 41465c
onSecondaryContainer cbbae8 onSecondaryContainer afb4ce
tertiary f4b8e4 tertiary f1b3e6
onTertiary 4e1e44 onTertiary 4c1f49
tertiaryContainer bb7da9 tertiaryContainer b67fae
onTertiaryContainer 000000 onTertiaryContainer 000000
error e78284 error ffb4ab
onError 4a0019 onError 690005
errorContainer 8c2643 errorContainer 93000a
onErrorContainer ffb3c6 onErrorContainer ffdad6
primaryFixed e8d4ff primaryFixed dce1ff
primaryFixedDim ca9ee6 primaryFixedDim b7c4ff
onPrimaryFixed 2a1040 onPrimaryFixed 05164b
onPrimaryFixedVariant 544874 onPrimaryFixedVariant 364478
secondaryFixed e2d4ff secondaryFixed dde1fd
secondaryFixedDim 7d6799 secondaryFixedDim c1c5e0
onSecondaryFixed 1a0a28 onSecondaryFixed 151b2e
onSecondaryFixedVariant 3a2850 onSecondaryFixedVariant 41465c
tertiaryFixed ffd7f5 tertiaryFixed ffd7f5
tertiaryFixedDim f4b8e4 tertiaryFixedDim f1b3e6
onTertiaryFixed 330832 onTertiaryFixed 330832
onTertiaryFixedVariant 653661 onTertiaryFixedVariant 653661
term0 414559 term0 353434
term1 e78284 term1 9a7bff
term2 a6d189 term2 44def5
term3 e5c890 term3 ffdcf2
term4 8caaee term4 92acd6
term5 f4b8e4 term5 a9a2ed
term6 81c8be term6 9dceff
term7 c6d0f5 term7 e8d3de
term8 51576d term8 ac9fa9
term9 e78284 term9 b299ff
term10 a6d189 term10 89ecff
term11 e5c890 term11 fff0f6
term12 8caaee term12 b1c2db
term13 f4b8e4 term13 c1b7f7
term14 81c8be term14 bae0ff
term15 a5adce term15 ffffff
rosewater f2d5cf rosewater f5eff9
flamingo eebebe flamingo e5def4
pink f4b8e4 pink dcd9ff
mauve ca9ee6 mauve b5bbff
red e78284 red b5a9ff
maroon ea999c maroon c1b7ef
peach ef9f76 peach e0c2f9
yellow e5c890 yellow ffecf3
green a6d189 green c8e3ff
teal 81c8be teal cee1ff
sky 99d1db sky cadcff
sapphire 85c1dc sapphire aec7ff
blue 8caaee blue a6baff
lavender babbf1 lavender bfcaff
klink 6685d1 klink 6685d1
klinkSelection 6585d1 klinkSelection 6585d1
kvisited 7276dd kvisited 7276dd
@@ -92,19 +92,19 @@ kneutral c794ff
kneutralSelection c794ff kneutralSelection c794ff
kpositive 54afff kpositive 54afff
kpositiveSelection 54afff kpositiveSelection 54afff
text c6d0f5 text e4e1e7
subtext1 a5adce subtext1 c6c5d1
subtext0 7a7f9e subtext0 8f909a
overlay2 737994 overlay2 7d7d86
overlay1 585b70 overlay1 6a6a72
overlay0 45475a overlay0 585960
surface2 414559 surface2 48484e
surface1 363a50 surface1 37373d
surface0 303446 surface0 25252a
base 303446 base 131317
mantle 292c3c mantle 131317
crust 232634 crust 121216
success a6d189 success B5CCBA
onSuccess 303446 onSuccess 213528
successContainer 3b5e3b successContainer 374B3E
onSuccessContainer b6f0b1 onSuccessContainer D1E9D6
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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 8839ef primary_paletteKeyColor 417da2
secondary_paletteKeyColor c2b8d0 secondary_paletteKeyColor 657a8a
tertiary_paletteKeyColor ea76cb tertiary_paletteKeyColor 92689d
neutral_paletteKeyColor 9ca0b0 neutral_paletteKeyColor 75777a
neutral_variant_paletteKeyColor e6e9ef neutral_variant_paletteKeyColor 71787f
background eff1f5 background f8f9fc
onBackground 4c4f69 onBackground 191c1e
surface ccd0da surface f8f9fc
surfaceDim ccd0da surfaceDim d9dadd
surfaceBright eff1f5 surfaceBright f8f9fc
surfaceContainerLowest ffffff surfaceContainerLowest ffffff
surfaceContainerLow f5f6f9 surfaceContainerLow f2f3f7
surfaceContainer eff1f5 surfaceContainer edeef1
surfaceContainerHigh e6e9ef surfaceContainerHigh e7e8eb
surfaceContainerHighest dce0e8 surfaceContainerHighest e1e2e6
onSurface 4c4f69 onSurface 191c1e
surfaceVariant eff1f5 surfaceVariant dce3eb
onSurfaceVariant 6c6f85 onSurfaceVariant 41484e
inverseSurface 4c4f69 inverseSurface 2e3133
inverseOnSurface ccd0da inverseOnSurface eff1f4
outline 9ca0b0 outline 6e757c
outlineVariant acb0be outlineVariant c0c7ce
shadow 000000 shadow 000000
scrim 000000 scrim 000000
surfaceTint a670f1 surfaceTint 236488
primary 8839ef primary 3e7b9f
onPrimary eff1f5 onPrimary ffffff
primaryContainer a670f1 primaryContainer 417da2
onPrimaryContainer 2a1040 onPrimaryContainer 00060c
inversePrimary 6c4f94 inversePrimary 93cdf6
secondary c2b8d0 secondary 4c6170
onSecondary 4c4f69 onSecondary ffffff
secondaryContainer e6d4ff secondaryContainer cfe5f8
onSecondaryContainer 544874 onSecondaryContainer 526776
tertiary ea76cb tertiary 8f659a
onTertiary eff1f5 onTertiary ffffff
tertiaryContainer ea76cb tertiaryContainer 8f659a
onTertiaryContainer 4e1e44 onTertiaryContainer ffffff
error d20f39 error ba1a1a
onError eff1f5 onError ffffff
errorContainer ffdad6 errorContainer ffdad6
onErrorContainer 93000a onErrorContainer 93000a
primaryFixed e8d4ff primaryFixed c7e7ff
primaryFixedDim a670f1 primaryFixedDim 93cdf6
onPrimaryFixed ffffff onPrimaryFixed 001e2e
onPrimaryFixedVariant 544874 onPrimaryFixedVariant 004c6d
secondaryFixed f0e4ff secondaryFixed cfe5f8
secondaryFixedDim c2b8d0 secondaryFixedDim b4c9db
onSecondaryFixed 4c4f69 onSecondaryFixed 071e2b
onSecondaryFixedVariant 3a2850 onSecondaryFixedVariant 354958
tertiaryFixed ffd7f0 tertiaryFixed fad7ff
tertiaryFixedDim ea76cb tertiaryFixedDim e6b6f1
onTertiaryFixed 4c4f69 onTertiaryFixed 2e0a3b
onTertiaryFixedVariant 4e1e44 onTertiaryFixedVariant 5e3869
term0 5c5f77 term0 9a9b9b
term1 d20f39 term1 005bcc
term2 40a02b term2 008ca5
term3 df8e1d term3 7e61b0
term4 1e66f5 term4 009993
term5 ea76cb term5 006ac4
term6 179299 term6 3389ae
term7 acb0be term7 202225
term8 6c6f85 term8 0f0f0f
term9 d20f39 term9 0071fa
term10 40a02b term10 00afce
term11 df8e1d term11 9a7cce
term12 1e66f5 term12 3fbdb6
term13 ea76cb term13 1e85ec
term14 179299 term14 59a9d1
term15 4c4f69 term15 27282b
rosewater dc8a78 rosewater 7d76b1
flamingo dd7878 flamingo 6470bd
pink ea76cb pink 057ee6
mauve 8839ef mauve 005791
red d20f39 red 003ee0
maroon e64553 maroon 2751f9
peach fe640b peach 8a4dff
yellow df8e1d yellow 008f68
green 40a02b green 007991
teal 179299 teal 007195
sky 04a5e5 sky 0082b6
sapphire 209fb5 sapphire 037ba6
blue 1e66f5 blue 005e90
lavender 7287fd lavender 0077b7
klink 2e8fc3 klink 2e8fc3
klinkSelection 308fc4 klinkSelection 308fc4
kvisited 2584d6 kvisited 2584d6
@@ -92,19 +92,19 @@ kneutral c794ff
kneutralSelection c794ff kneutralSelection c794ff
kpositive 00b8de kpositive 00b8de
kpositiveSelection 00b8df kpositiveSelection 00b8df
text 4c4f69 text 191c1e
subtext1 6c6f85 subtext1 41484e
subtext0 9ca0b0 subtext0 6e757c
overlay2 acb0be overlay2 7f858b
overlay1 bcc0cc overlay1 91979d
overlay0 ccd0da overlay0 a4a8ae
surface2 dce0e8 surface2 b7babf
surface1 e6e9ef surface1 cbced2
surface0 eff1f5 surface0 e1e3e7
base eff1f5 base f8f9fc
mantle e6e9ef mantle eff1f4
crust dce0e8 crust e9ebef
success 40a02b success 4F6354
onSuccess eff1f5 onSuccess FFFFFF
successContainer d1e8d5 successContainer D1E8D5
onSuccessContainer 0c1f13 onSuccessContainer 0C1F13
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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
@@ -1,110 +0,0 @@
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

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