Author SHA1 Message Date
zach 54d4676ddf Merge branch 'main' into feat/llm-chat-tab
C++ / fmt (pull_request) Successful in 4s
C++ / build (pull_request) Failing after 2m3s
C++ / clang-tidy (pull_request) Failing after 2m2s
JS/TS / fmt (pull_request) Failing after 12s
JS/TS / lint (pull_request) Successful in 9s
Python / static (pull_request) Successful in 29s
Rust / build (pull_request) Successful in 51s
Python / verify (pull_request) Successful in 1m35s
Rust / fmt (pull_request) Successful in 33s
Rust / clippy (pull_request) Successful in 57s
2026-09-04 19:44:12 +02:00
zach bd699e72a7 fix: polkit width 2026-09-04 19:43:13 +02:00
zach cd3da1941b fix: truncate context logic
C++ / fmt (pull_request) Successful in 4s
C++ / build (pull_request) Failing after 2m6s
C++ / clang-tidy (pull_request) Failing after 2m5s
JS/TS / fmt (pull_request) Failing after 3m8s
Python / static (pull_request) Successful in 24s
Python / verify (pull_request) Successful in 1m21s
JS/TS / lint (pull_request) Successful in 5m10s
Rust / fmt (pull_request) Successful in 30s
Rust / build (pull_request) Successful in 56s
Rust / clippy (pull_request) Successful in 46s
2026-09-04 02:20:37 +02:00
zach 34dde4bbfb fix: tool call prompt
C++ / fmt (pull_request) Failing after 4s
C++ / build (pull_request) Failing after 2m4s
C++ / clang-tidy (pull_request) Failing after 2m2s
JS/TS / fmt (pull_request) Failing after 6s
JS/TS / lint (pull_request) Successful in 9s
Python / static (pull_request) Successful in 27s
Rust / build (pull_request) Successful in 47s
Python / verify (pull_request) Successful in 1m35s
Rust / fmt (pull_request) Successful in 27s
Rust / clippy (pull_request) Successful in 49s
2026-09-03 23:45:07 +02:00
zach fcb848b6d2 fix: truncate webfetch content to fit context
C++ / fmt (pull_request) Failing after 5s
C++ / build (pull_request) Failing after 2m18s
C++ / clang-tidy (pull_request) Failing after 2m7s
JS/TS / fmt (pull_request) Failing after 9s
JS/TS / lint (pull_request) Successful in 9s
Python / static (pull_request) Successful in 29s
Rust / build (pull_request) Successful in 50s
Python / verify (pull_request) Successful in 1m38s
Rust / fmt (pull_request) Successful in 26s
Rust / clippy (pull_request) Successful in 47s
2026-09-03 22:46:46 +02:00
zach ed7ec326b1 fix: idlemonitors list value 2026-09-03 16:15:55 +02:00
zach ae5c1fa148 use blobgroup for window chat interface + slim sidebar
C++ / fmt (pull_request) Successful in 4s
C++ / build (pull_request) Failing after 2m1s
C++ / clang-tidy (pull_request) Failing after 1m54s
JS/TS / fmt (pull_request) Failing after 7s
JS/TS / lint (pull_request) Successful in 7s
Python / static (pull_request) Successful in 29s
Rust / build (pull_request) Successful in 47s
Python / verify (pull_request) Successful in 1m35s
Rust / fmt (pull_request) Successful in 29s
Rust / clippy (pull_request) Successful in 51s
2026-09-01 23:14:21 +02:00
zach b254000737 feat: implement findChild* methods
C++ / fmt (pull_request) Canceled after 0s
C++ / build (pull_request) Canceled after 0s
C++ / clang-tidy (pull_request) Canceled after 0s
JS/TS / lint (pull_request) Canceled after 0s
JS/TS / fmt (pull_request) Canceled after 2s
Python / static (pull_request) Canceled after 0s
Python / verify (pull_request) Canceled after 0s
Rust / build (pull_request) Canceled after 0s
Rust / fmt (pull_request) Canceled after 0s
Rust / clippy (pull_request) Canceled after 0s
2026-09-01 15:51:10 +02:00
zach 04fe8b1e43 feat: implement findChild* methods
C++ / fmt (pull_request) Canceled after 0s
C++ / build (pull_request) Canceled after 0s
C++ / clang-tidy (pull_request) Canceled after 0s
JS/TS / fmt (pull_request) Canceled after 0s
JS/TS / lint (pull_request) Canceled after 0s
Python / static (pull_request) Canceled after 0s
Python / verify (pull_request) Canceled after 0s
Rust / build (pull_request) Canceled after 0s
Rust / fmt (pull_request) Canceled after 0s
Rust / clippy (pull_request) Canceled after 0s
2026-09-01 15:49:21 +02:00
zach dfa6b010e6 fix: property link modules
C++ / fmt (pull_request) Canceled after 0s
C++ / build (pull_request) Canceled after 0s
C++ / clang-tidy (pull_request) Canceled after 0s
JS/TS / lint (pull_request) Canceled after 0s
JS/TS / fmt (pull_request) Canceled after 1s
Python / static (pull_request) Canceled after 0s
Python / verify (pull_request) Canceled after 0s
Rust / build (pull_request) Canceled after 0s
Rust / fmt (pull_request) Canceled after 0s
Rust / clippy (pull_request) Canceled after 0s
2026-09-01 15:42:27 +02:00
zach 8a4e9bac31 fix: add gnuinstalldirs include
C++ / fmt (pull_request) Successful in 6s
C++ / build (pull_request) Canceled after 15s
C++ / clang-tidy (pull_request) Canceled after 9s
JS/TS / fmt (pull_request) Canceled after 0s
JS/TS / lint (pull_request) Canceled after 0s
Python / verify (pull_request) Canceled after 0s
Python / static (pull_request) Canceled after 1s
Rust / fmt (pull_request) Canceled after 0s
Rust / clippy (pull_request) Canceled after 0s
Rust / build (pull_request) Canceled after 6s
2026-09-01 15:28:25 +02:00
zach f20fa45b29 fix: cmake install dir
Rust / build (pull_request) Canceled after 0s
Rust / fmt (pull_request) Canceled after 0s
Rust / clippy (pull_request) Canceled after 0s
Python / static (pull_request) Canceled after 0s
Python / verify (pull_request) Canceled after 0s
JS/TS / fmt (pull_request) Canceled after 0s
JS/TS / lint (pull_request) Canceled after 0s
C++ / fmt (pull_request) Canceled after 0s
C++ / build (pull_request) Canceled after 0s
C++ / clang-tidy (pull_request) Canceled after 0s
2026-09-01 15:15:15 +02:00
zach 53a3c76dc0 fix: cmake install dir
C++ / fmt (pull_request) Successful in 7s
JS/TS / fmt (pull_request) Failing after 14s
JS/TS / lint (pull_request) Successful in 18s
Python / static (pull_request) Successful in 57s
C++ / build (pull_request) Failing after 3m50s
C++ / clang-tidy (pull_request) Failing after 3m32s
Python / verify (pull_request) Canceled after 0s
Rust / build (pull_request) Canceled after 0s
Rust / fmt (pull_request) Canceled after 0s
Rust / clippy (pull_request) Canceled after 0s
2026-09-01 15:03:42 +02:00
zach 617e87d64f fix: uncomment settings index cache path
C++ / fmt (pull_request) Successful in 10s
C++ / clang-tidy (pull_request) Failing after 15m10s
C++ / build (pull_request) Failing after 16m4s
JS/TS / fmt (pull_request) Failing after 10s
JS/TS / lint (pull_request) Successful in 11s
Python / static (pull_request) Successful in 53s
Rust / fmt (pull_request) Successful in 1m33s
Rust / build (pull_request) Successful in 3m3s
Rust / clippy (pull_request) Successful in 2m59s
Python / verify (pull_request) Successful in 3m58s
2026-09-01 14:31:44 +02:00
zach ef2fb95fab chore: split cmake into multiple files and fix settings searching regex + add enabled option to llm
C++ / fmt (pull_request) Successful in 4s
JS/TS / fmt (pull_request) Failing after 17s
JS/TS / lint (pull_request) Successful in 19s
Python / static (pull_request) Successful in 1m11s
Rust / fmt (pull_request) Successful in 1m3s
Rust / build (pull_request) Successful in 2m26s
Rust / clippy (pull_request) Failing after 16m40s
Python / verify (pull_request) Failing after 17m52s
C++ / clang-tidy (pull_request) Failing after 18m0s
C++ / build (pull_request) Failing after 18m2s
2026-09-01 14:30:04 +02:00
zach 2150859847 fix: font family
JS/TS / fmt (pull_request) Successful in 19s
JS/TS / lint (pull_request) Successful in 18s
Rust / fmt (pull_request) Canceled after 0s
Rust / clippy (pull_request) Canceled after 0s
Rust / build (pull_request) Canceled after 5m56s
Python / static (pull_request) Canceled after 6m44s
Python / verify (pull_request) Canceled after 6m40s
C++ / fmt (pull_request) Successful in 8s
C++ / clang-tidy (pull_request) Canceled after 7m8s
C++ / build (pull_request) Failing after 1m24s
2026-08-31 22:54:52 +02:00
AramJonghu c9f7856982 fix(Docker): add required deps to dockerfile
JS/TS / fmt (pull_request) Successful in 11s
JS/TS / lint (pull_request) Successful in 11s
Python / static (pull_request) Successful in 45s
Rust / fmt (pull_request) Successful in 2m0s
Rust / build (pull_request) Successful in 2m24s
Rust / clippy (pull_request) Successful in 2m24s
Python / verify (pull_request) Successful in 2m48s
C++ / fmt (pull_request) Successful in 4s
C++ / clang-tidy (pull_request) Canceled after 5m34s
C++ / build (pull_request) Canceled after 0s
2026-08-31 22:46:42 +02:00
zachandAramJonghu 51dc0fc026 chore: format python codeicons 2026-08-31 22:44:57 +02:00
zach cef91caebc chore: format llm c files
C++ / fmt (pull_request) Successful in 16s
C++ / build (pull_request) Failing after 19s
JS/TS / fmt (pull_request) Successful in 10s
C++ / clang-tidy (pull_request) Failing after 29s
JS/TS / lint (pull_request) Successful in 23s
Python / static (pull_request) Failing after 48s
Rust / fmt (pull_request) Successful in 1m15s
Rust / build (pull_request) Successful in 1m46s
Rust / clippy (pull_request) Successful in 1m33s
Python / verify (pull_request) Successful in 2m16s
2026-08-31 19:06:49 +02:00
zach c5a089adaf chore: format llm c files
C++ / fmt (pull_request) Failing after 4s
C++ / build (pull_request) Failing after 10s
JS/TS / fmt (pull_request) Successful in 22s
JS/TS / lint (pull_request) Successful in 16s
Python / static (pull_request) Failing after 37s
C++ / clang-tidy (pull_request) Failing after 1m19s
Rust / fmt (pull_request) Successful in 1m24s
Rust / clippy (pull_request) Successful in 1m59s
Rust / build (pull_request) Successful in 2m12s
Python / verify (pull_request) Successful in 2m48s
2026-08-31 19:05:22 +02:00
zach 52feb6006a chore: format llm c files
C++ / fmt (pull_request) Failing after 4s
C++ / build (pull_request) Failing after 9s
JS/TS / lint (pull_request) Successful in 9s
JS/TS / fmt (pull_request) Successful in 16s
C++ / clang-tidy (pull_request) Failing after 43s
Python / static (pull_request) Failing after 57s
Rust / fmt (pull_request) Successful in 1m30s
Rust / build (pull_request) Successful in 2m5s
Rust / clippy (pull_request) Successful in 1m55s
Python / verify (pull_request) Successful in 2m23s
2026-08-31 19:02:26 +02:00
zach dbb51ceadd feat: config object migration path and add new options to settings
C++ / fmt (pull_request) Failing after 4s
C++ / build (pull_request) Failing after 12s
JS/TS / fmt (pull_request) Successful in 15s
JS/TS / lint (pull_request) Successful in 15s
C++ / clang-tidy (pull_request) Failing after 33s
Python / static (pull_request) Failing after 36s
Rust / fmt (pull_request) Successful in 1m14s
Rust / build (pull_request) Successful in 1m49s
Rust / clippy (pull_request) Successful in 1m33s
Python / verify (pull_request) Successful in 2m10s
2026-08-31 18:43:41 +02:00
zach 487615f482 fix: shader fade animation linear curve 2026-08-31 14:09:54 +02:00
zach d4e936a7e2 add nightlight hyprland plugin + rename hyprsunsetmanager -> nightlightmanager to control both 2026-08-31 13:53:37 +02:00
zach 04869656aa Merge pull request 'changed old appearance vars for the lockscreen + warning hunting for the polkit' (#154) from fix/lockscreen-font into main
Reviewed-on: #154
Reviewed-by: AramJonghu <aramjonghu@tutamail.com>
Reviewed-by: zach <zach@brohn.se>
2026-08-31 00:14:06 +02:00
zach 2f6847ce0e Merge branch 'main' into fix/lockscreen-font
C++ / fmt (pull_request) Successful in 3s
JS/TS / fmt (pull_request) Successful in 14s
JS/TS / lint (pull_request) Successful in 20s
Python / static (pull_request) Successful in 58s
Rust / fmt (pull_request) Successful in 55s
C++ / build (pull_request) Successful in 2m31s
Rust / build (pull_request) Successful in 2m16s
Rust / clippy (pull_request) Successful in 1m33s
Python / verify (pull_request) Successful in 2m53s
C++ / clang-tidy (pull_request) Successful in 4m5s
2026-08-31 00:13:16 +02:00
zach e5e52802de test aur 2026-08-30 23:49:53 +02:00
zach 42f02f4dd2 test aur 2026-08-30 23:33:50 +02:00
zach 9df3a64815 fix: lowercase battery device state 2026-08-30 22:20:39 +02:00
Inorishio 9370284c6b changed old appearance vars for the lockscreen + warning hunting for the polkit
C++ / fmt (pull_request) Successful in 4s
JS/TS / fmt (pull_request) Successful in 14s
JS/TS / lint (pull_request) Successful in 16s
Python / static (pull_request) Successful in 1m14s
Rust / fmt (pull_request) Successful in 1m8s
Rust / build (pull_request) Successful in 2m14s
C++ / build (pull_request) Successful in 2m36s
Rust / clippy (pull_request) Successful in 1m15s
Python / verify (pull_request) Successful in 3m19s
C++ / clang-tidy (pull_request) Successful in 4m1s
2026-08-30 16:35:20 +02:00
zach 703d804746 fab menu and model selector 2026-08-29 18:56:59 +02:00
zach 327270f3fa better support for opening chat in floating window 2026-08-28 14:15:57 +02:00
zach 8a66c3b064 expandable dialogs for color scheme, fonts and scheduling modes 2026-08-27 16:57:02 +02:00
zach 293bf67e09 better scrollbar in codeblocks + enter anim for delegates 2026-08-27 01:47:17 +02:00
zach c33dbc147f rotated view + wheel inverter 2026-08-26 17:10:34 +02:00
zach 78988700be async parsing + tex caching 2026-08-26 02:06:40 +02:00
zach 3946541f87 async parsing + tex caching 2026-08-26 02:06:10 +02:00
zach e18875a752 add markdown parsing + latex + tree-sitter highlighting for codeblocks in llm responses 2026-08-24 23:55:51 +02:00
zach 5598f4f435 README.md 2026-08-23 17:01:27 +02:00
zach 7e02c87b91 README.md 2026-08-23 17:00:41 +02:00
zach aae3757daf better chat list view + anchor to bottom. sqlite db for chats + LIFO-ordered 2026-08-23 16:37:11 +02:00
zach 37c6a9986e start initial work on detaching chat to floating window 2026-08-20 20:24:54 +02:00
zach 9657e5092a add removal of chat sessions, auto title + icon, proper stick-to-bottom as response is streamed 2026-08-20 17:40:33 +02:00
zach 47bab21e22 initial commit for llm chat tab in sidebar 2026-08-20 00:27:48 +02:00
zach d3e61efd86 Merge pull request 'Feat: Dashboard media widget update + anim tokens restructure' (#151) from feat/dashboard-media-widget into main
Reviewed-on: #151
2026-08-19 11:26:23 +02:00
zach de95b6c8f9 fix rounding tokens
C++ / fmt (pull_request) Successful in 7s
JS/TS / fmt (pull_request) Successful in 12s
JS/TS / lint (pull_request) Successful in 16s
Python / static (pull_request) Successful in 53s
Rust / fmt (pull_request) Successful in 39s
Rust / build (pull_request) Successful in 1m57s
C++ / build (pull_request) Successful in 3m51s
Rust / clippy (pull_request) Successful in 1m39s
Python / verify (pull_request) Successful in 3m4s
C++ / clang-tidy (pull_request) Successful in 5m25s
2026-08-19 00:38:41 +02:00
zach 4ff4afa279 Merge branch 'main' into feat/dashboard-media-widget
C++ / fmt (pull_request) Successful in 4s
JS/TS / fmt (pull_request) Successful in 18s
JS/TS / lint (pull_request) Successful in 17s
Python / static (pull_request) Successful in 58s
Rust / fmt (pull_request) Successful in 1m4s
C++ / build (pull_request) Successful in 2m39s
Rust / build (pull_request) Successful in 2m22s
Rust / clippy (pull_request) Successful in 1m48s
Python / verify (pull_request) Successful in 3m29s
C++ / clang-tidy (pull_request) Successful in 7m7s
2026-08-19 00:36:42 +02:00
zach 8a83181f11 modular quick toggles 2026-08-19 00:34:49 +02:00
zach f778335600 fix switch style
C++ / fmt (pull_request) Successful in 4s
JS/TS / fmt (pull_request) Successful in 18s
JS/TS / lint (pull_request) Successful in 20s
Python / static (pull_request) Successful in 55s
Rust / fmt (pull_request) Successful in 1m4s
Rust / build (pull_request) Successful in 1m58s
C++ / build (pull_request) Successful in 2m32s
Rust / clippy (pull_request) Successful in 1m34s
Python / verify (pull_request) Successful in 2m40s
C++ / clang-tidy (pull_request) Successful in 4m1s
2026-08-18 22:31:32 +02:00
zach 6de7672c05 Merge branch 'main' into feat/dashboard-media-widget
C++ / fmt (pull_request) Successful in 3s
JS/TS / fmt (pull_request) Successful in 19s
JS/TS / lint (pull_request) Successful in 18s
Python / static (pull_request) Successful in 59s
Rust / fmt (pull_request) Successful in 1m3s
C++ / build (pull_request) Successful in 2m35s
Rust / build (pull_request) Successful in 2m11s
Rust / clippy (pull_request) Successful in 1m52s
Python / verify (pull_request) Successful in 3m28s
C++ / clang-tidy (pull_request) Successful in 7m18s
2026-08-18 21:46:52 +02:00
zach d74daf96ca Merge branch 'main' into feat/dashboard-media-widget
C++ / fmt (pull_request) Successful in 4s
JS/TS / fmt (pull_request) Successful in 14s
JS/TS / lint (pull_request) Successful in 18s
Python / static (pull_request) Successful in 1m10s
Rust / fmt (pull_request) Successful in 1m1s
Rust / build (pull_request) Successful in 2m12s
Rust / clippy (pull_request) Successful in 1m17s
C++ / build (pull_request) Successful in 2m45s
Python / verify (pull_request) Successful in 3m9s
C++ / clang-tidy (pull_request) Successful in 4m7s
2026-08-18 19:26:15 +02:00
zach 7e9c05d90a adjust notification padding
C++ / fmt (pull_request) Successful in 3s
JS/TS / fmt (pull_request) Successful in 17s
JS/TS / lint (pull_request) Successful in 17s
Python / static (pull_request) Successful in 57s
Rust / fmt (pull_request) Successful in 1m3s
Rust / build (pull_request) Successful in 2m11s
C++ / build (pull_request) Successful in 2m37s
Rust / clippy (pull_request) Successful in 1m33s
Python / verify (pull_request) Successful in 2m45s
C++ / clang-tidy (pull_request) Successful in 4m3s
2026-08-18 17:46:15 +02:00
zach f9a17caaf3 fix incorrect property names
JS/TS / fmt (pull_request) Successful in 12s
C++ / fmt (pull_request) Successful in 26s
JS/TS / lint (pull_request) Successful in 16s
Python / static (pull_request) Successful in 56s
Rust / fmt (pull_request) Successful in 31s
Rust / build (pull_request) Successful in 2m2s
Rust / clippy (pull_request) Successful in 1m38s
Python / verify (pull_request) Successful in 3m21s
C++ / build (pull_request) Successful in 4m4s
C++ / clang-tidy (pull_request) Successful in 5m30s
2026-08-18 16:24:28 +02:00
zach 7d6f3cc275 initial commit for media widget update + anim tokens restructure
C++ / fmt (pull_request) Successful in 4s
JS/TS / fmt (pull_request) Successful in 20s
JS/TS / lint (pull_request) Successful in 22s
Python / static (pull_request) Successful in 57s
Rust / fmt (pull_request) Successful in 1m2s
C++ / build (pull_request) Successful in 2m10s
Rust / build (pull_request) Successful in 1m50s
Rust / clippy (pull_request) Successful in 1m25s
Python / verify (pull_request) Successful in 2m58s
C++ / clang-tidy (pull_request) Successful in 7m8s
2026-08-18 16:14:41 +02:00
300 changed files with 18101 additions and 2990 deletions
+2 -1
View File
@@ -3,8 +3,9 @@ FunctionsSpacing=true
IndentWidth=4 IndentWidth=4
MaxColumnWidth=-1 MaxColumnWidth=-1
NewlineType=native NewlineType=native
NormalizeOrder=true GroupAttributesTogether=false
ObjectsSpacing=true ObjectsSpacing=true
SemicolonRule=always SemicolonRule=always
SingleLineEmptyObjects=true
SortImports=false SortImports=false
UseTabs=true UseTabs=true
+20 -20
View File
@@ -26,22 +26,36 @@ if(NOT DEFINED VERSION)
endif() endif()
endif() endif()
if(NOT DEFINED GIT_REVISION)
execute_process(COMMAND git rev-parse HEAD
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if("${GIT_REVISION}" STREQUAL "")
message(FATAL_ERROR "GIT_REVISION is not set and failed to get from git")
endif()
endif()
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
project(ZShell VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) project(ZShell VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
message(STATUS "ZShell version: ${VERSION}") message(STATUS "ZShell version: ${VERSION}")
include(GNUInstallDirs)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(ENABLE_MODULES "plugin;shell;m3shapes" CACHE STRING "Modules to build/install") set(ENABLE_MODULES "plugin;shell;cli;m3shapes" CACHE STRING "Modules to build/install")
set(INSTALL_LIBDIR "usr/lib/ZShell" CACHE STRING "Library install dir") set(INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}/ZShell" CACHE STRING "Library install dir")
set(INSTALL_QMLDIR "usr/lib/qt6/qml" CACHE STRING "QML install dir") set(INSTALL_QMLDIR "${CMAKE_INSTALL_LIBDIR}/qt6/qml" CACHE STRING "QML install dir")
set(INSTALL_QSCONFDIR "etc/xdg/quickshell/zshell" CACHE STRING "Quickshell config install dir") set(INSTALL_QSCONFDIR "${CMAKE_INSTALL_SYSCONFDIR}/xdg/quickshell/zshell" CACHE STRING "Quickshell config install dir")
set(INSTALL_GREETERCONFDIR "etc/xdg/quickshell/zshell-greeter" CACHE STRING "Quickshell greeter install dir") set(INSTALL_GREETERCONFDIR "${CMAKE_INSTALL_SYSCONFDIR}/xdg/quickshell/zshell-greeter" CACHE STRING "Quickshell greeter install dir")
set(CMAKE_INSTALL_MESSAGE NEVER) set(CMAKE_INSTALL_MESSAGE NEVER)
@@ -54,21 +68,7 @@ add_compile_options(
) )
if("shell" IN_LIST ENABLE_MODULES) if("cli" IN_LIST ENABLE_MODULES)
# Build settings index
find_package(Python3 COMPONENTS Interpreter REQUIRED)
set(SETTINGS_INDEX_JSON "${CMAKE_BINARY_DIR}/settings-index.json")
execute_process(
COMMAND ${Python3_EXECUTABLE}
"${CMAKE_SOURCE_DIR}/scripts/build-settings-index.py"
"${CMAKE_SOURCE_DIR}/Modules/Settings"
"${SETTINGS_INDEX_JSON}"
RESULT_VARIABLE SETTINGS_INDEX_RESULT
)
if(NOT SETTINGS_INDEX_RESULT EQUAL 0)
message(FATAL_ERROR "Failed to build settings search index")
endif()
# Nuitka compilation # Nuitka compilation
set(ZSHELL_CLI_BUILD_DIR "${CMAKE_BINARY_DIR}/zshell-cli") set(ZSHELL_CLI_BUILD_DIR "${CMAKE_BINARY_DIR}/zshell-cli")
set(ZSHELL_CLI_DIST "${ZSHELL_CLI_BUILD_DIR}/zshell.dist") set(ZSHELL_CLI_DIST "${ZSHELL_CLI_BUILD_DIR}/zshell.dist")
+9 -9
View File
@@ -27,25 +27,25 @@ AnchorAnimation {
if (type == AnchorAnim.DefaultSpatial) if (type == AnchorAnim.DefaultSpatial)
return Tokens.anim.durations.expressiveDefaultSpatial; return Tokens.anim.durations.expressiveDefaultSpatial;
if (type == AnchorAnim.SlowSpatial) if (type == AnchorAnim.SlowSpatial)
return Tokens.anim.durations.large; return Tokens.anim.durations.expressiveSlowSpatial;
const types = ["small", "normal", "large", "extraLarge"]; const types = ["small", "normal", "large", "extraLarge"];
const idx = type % 4; const idx = type % 4; // 0-7 are the 4 standard types
return Tokens.anim.durations[types[idx]]; return Tokens.anim.durations[types[idx]];
} }
easing.bezierCurve: { easing: {
if (type == AnchorAnim.FastSpatial) if (type == AnchorAnim.FastSpatial)
return Tokens.anim.curves.expressiveFastSpatial; return Tokens.anim.expressiveFastSpatial;
if (type == AnchorAnim.DefaultSpatial) if (type == AnchorAnim.DefaultSpatial)
return Tokens.anim.curves.expressiveDefaultSpatial; return Tokens.anim.expressiveDefaultSpatial;
if (type == AnchorAnim.SlowSpatial) if (type == AnchorAnim.SlowSpatial)
return Tokens.anim.curves.expressiveSlowSpatial; return Tokens.anim.expressiveSlowSpatial;
if (type >= AnchorAnim.StandardSmall && type <= AnchorAnim.StandardExtraLarge) if (type >= AnchorAnim.StandardSmall && type <= AnchorAnim.StandardExtraLarge)
return Tokens.anim.curves.standard; return Tokens.anim.standard;
if (type >= AnchorAnim.EmphasizedSmall && type <= AnchorAnim.EmphasizedExtraLarge) if (type >= AnchorAnim.EmphasizedSmall && type <= AnchorAnim.EmphasizedExtraLarge)
return Tokens.anim.curves.emphasized; return Tokens.anim.emphasized;
return Tokens.anim.curves.expressiveDefaultSpatial; return Tokens.anim.expressiveDefaultSpatial;
} }
} }
+12 -12
View File
@@ -30,34 +30,34 @@ NumberAnimation {
if (type === Anim.DefaultSpatial) if (type === Anim.DefaultSpatial)
return Tokens.anim.durations.expressiveDefaultSpatial; return Tokens.anim.durations.expressiveDefaultSpatial;
if (type === Anim.SlowSpatial) if (type === Anim.SlowSpatial)
return Tokens.anim.durations.large; return Tokens.anim.durations.expressiveSlowSpatial;
if (type === Anim.FastEffects) if (type === Anim.FastEffects)
return Tokens.anim.durations.expressiveFastEffects; return Tokens.anim.durations.expressiveFastEffects;
if (type === Anim.DefaultEffects) if (type === Anim.DefaultEffects)
return Tokens.anim.durations.expressiveEffects; return Tokens.anim.durations.expressiveDefaultEffects;
if (type === Anim.SlowEffects) if (type === Anim.SlowEffects)
return Tokens.anim.durations.expressiveSlowEffects; return Tokens.anim.durations.expressiveSlowEffects;
const types = ["small", "normal", "large", "extraLarge"]; const types = ["small", "normal", "large", "extraLarge"];
const idx = type % 4; const idx = type % 4; // 0-7 are the 4 standard types
return Tokens.anim.durations[types[idx]]; return Tokens.anim.durations[types[idx]];
} }
easing.bezierCurve: { easing: {
if (type === Anim.FastSpatial) if (type === Anim.FastSpatial)
return Tokens.anim.curves.expressiveFastSpatial; return Tokens.anim.expressiveFastSpatial;
if (type === Anim.DefaultSpatial) if (type === Anim.DefaultSpatial)
return Tokens.anim.curves.expressiveDefaultSpatial; return Tokens.anim.expressiveDefaultSpatial;
if (type === Anim.SlowSpatial) if (type === Anim.SlowSpatial)
return Tokens.anim.curves.expressiveSlowSpatial; return Tokens.anim.expressiveSlowSpatial;
if (type === Anim.FastEffects) if (type === Anim.FastEffects)
return Tokens.anim.curves.expressiveFastEffects; return Tokens.anim.expressiveFastEffects;
if (type === Anim.DefaultEffects) if (type === Anim.DefaultEffects)
return Tokens.anim.curves.expressiveDefaultEffects; return Tokens.anim.expressiveDefaultEffects;
if (type === Anim.SlowEffects) if (type === Anim.SlowEffects)
return Tokens.anim.curves.expressiveSlowEffects; return Tokens.anim.expressiveSlowEffects;
if (type >= Anim.EmphasizedSmall && type <= Anim.EmphasizedExtraLarge) if (type >= Anim.EmphasizedSmall && type <= Anim.EmphasizedExtraLarge)
return Tokens.anim.curves.emphasized; return Tokens.anim.emphasized;
return Tokens.anim.curves.standard; return Tokens.anim.standard;
} }
} }
+2 -2
View File
@@ -107,7 +107,7 @@ Slider {
Anim { Anim {
duration: Tokens.anim.durations.normal / 2 duration: Tokens.anim.durations.normal / 2
easing.bezierCurve: Tokens.anim.curves.standardAccel easing: Tokens.anim.standardAccel
property: "scale" property: "scale"
target: icon target: icon
to: 0 to: 0
@@ -119,7 +119,7 @@ Slider {
Anim { Anim {
duration: Tokens.anim.durations.normal / 2 duration: Tokens.anim.durations.normal / 2
easing.bezierCurve: Tokens.anim.curves.standardDecel easing: Tokens.anim.standardDecel
property: "scale" property: "scale"
target: icon target: icon
to: 1 to: 1
+2 -1
View File
@@ -1,5 +1,6 @@
import QtQuick import QtQuick
import ZShell.Config import ZShell.Config
import qs.Components
import qs.Services import qs.Services
CustomRect { CustomRect {
@@ -36,7 +37,7 @@ CustomRect {
readonly property color onColor: !enabled ? disabledOnColor : internalChecked ? activeOnColor : inactiveOnColor readonly property color onColor: !enabled ? disabledOnColor : internalChecked ? activeOnColor : inactiveOnColor
property real padding property real padding
readonly property alias pressed: stateLayer.pressed readonly property alias pressed: stateLayer.pressed
property real pressedRadius: Tokens.rounding.smallest property real pressedRadius: Tokens.rounding.small
readonly property alias radiusAnim: radiusAnim readonly property alias radiusAnim: radiusAnim
property bool radiusMorph: true property bool radiusMorph: true
property alias shapeMorph: stateLayer.shapeMorph property alias shapeMorph: stateLayer.shapeMorph
+2 -58
View File
@@ -2,62 +2,6 @@ import QtQuick
import ZShell.Config import ZShell.Config
ColorAnimation { ColorAnimation {
enum Type { duration: Tokens.anim.durations.expressiveSlowEffects
StandardSmall = 0, easing: Tokens.anim.expressiveSlowEffects
Standard,
StandardLarge,
StandardExtraLarge,
EmphasizedSmall,
Emphasized,
EmphasizedLarge,
EmphasizedExtraLarge,
FastSpatial,
DefaultSpatial,
SlowSpatial,
FastEffects,
DefaultEffects,
SlowEffects
}
property int type: CAnim.DefaultSpatial
duration: {
if (type < CAnim.StandardSmall || type > Anim.SlowEffects)
return Tokens.anim.durations.normal;
if (type === CAnim.FastSpatial)
return Tokens.anim.durations.expressiveFastSpatial;
if (type === CAnim.DefaultSpatial)
return Tokens.anim.durations.expressiveDefaultSpatial;
if (type === CAnim.SlowSpatial)
return Tokens.anim.durations.large;
if (type === CAnim.FastEffects)
return Tokens.anim.durations.expressiveFastEffects;
if (type === CAnim.DefaultEffects)
return Tokens.anim.durations.expressiveEffects;
if (type === CAnim.SlowEffects)
return Tokens.anim.durations.expressiveSlowEffects;
const types = ["small", "normal", "large", "extraLarge"];
const idx = type % 4;
return Tokens.anim.durations[types[idx]];
}
easing.bezierCurve: {
if (type === CAnim.FastSpatial)
return Tokens.anim.curves.expressiveFastSpatial;
if (type === CAnim.DefaultSpatial)
return Tokens.anim.curves.expressiveDefaultSpatial;
if (type === CAnim.SlowSpatial)
return Tokens.anim.curves.expressiveSlowSpatial;
if (type === CAnim.FastEffects)
return Tokens.anim.curves.expressiveFastEffects;
if (type === CAnim.DefaultEffects)
return Tokens.anim.curves.expressiveDefaultEffects;
if (type === CAnim.SlowEffects)
return Tokens.anim.curves.expressiveSlowEffects;
if (type >= CAnim.EmphasizedSmall && type <= Anim.EmphasizedExtraLarge)
return Tokens.anim.curves.emphasized;
return Tokens.anim.curves.standard;
}
} }
+1 -1
View File
@@ -23,7 +23,7 @@ BusyIndicator {
property real implicitSize: Tokens.font.size.normal * 3 property real implicitSize: Tokens.font.size.normal * 3
property real internalStrokeWidth: strokeWidth property real internalStrokeWidth: strokeWidth
readonly property alias progress: manager.progress readonly property alias progress: manager.progress
property real strokeWidth: Tokens.padding.small * 0.8 property real strokeWidth: Tokens.padding.extraSmall * 0.8
property alias type: manager.indeterminateAnimationType property alias type: manager.indeterminateAnimationType
implicitHeight: implicitSize implicitHeight: implicitSize
+1 -1
View File
@@ -21,7 +21,7 @@ Item {
readonly property real size: Math.min(width, height) readonly property real size: Math.min(width, height)
property int spacing: Tokens.spacing.small property int spacing: Tokens.spacing.small
property int startAngle: -90 property int startAngle: -90
property int strokeWidth: Tokens.padding.small property int strokeWidth: Tokens.padding.extraSmall
property int sweepAngle: 360 property int sweepAngle: 360
readonly property real thickness: strokeWidth * (1 + waveAmplitude) * 2 readonly property real thickness: strokeWidth * (1 + waveAmplitude) * 2
property real value property real value
+1 -1
View File
@@ -23,7 +23,7 @@ CheckBox {
color: Colors.palette.m3surfaceVariant color: Colors.palette.m3surfaceVariant
implicitHeight: control.checkHeight implicitHeight: control.checkHeight
implicitWidth: control.checkWidth implicitWidth: control.checkWidth
radius: Tokens.rounding.smallest / 2 radius: Tokens.rounding.small / 2
CustomRect { CustomRect {
color: Colors.palette.m3primary color: Colors.palette.m3primary
+3 -1
View File
@@ -28,6 +28,8 @@ Flickable {
interval: 10 interval: 10
running: root.doneFakeFlick running: root.doneFakeFlick
onTriggered: root.doneFakeFlick = false onTriggered: {
root.doneFakeFlick = false;
}
} }
} }
+17 -14
View File
@@ -10,24 +10,27 @@ ListView {
maximumFlickVelocity: 3000 maximumFlickVelocity: 3000
rebound: Transition { rebound: Transition {
onRunningChanged: { // onRunningChanged: {
if (!running && !root.doneFakeFlick) { // if (!running && !root.doneFakeFlick) {
root.doneFakeFlick = true; // root.doneFakeFlick = true;
root.flick(1, 1); // root.flick(1, 1);
root.flick(-1, -1); // root.flick(-1, -1);
Qt.callLater(() => root.cancelFlick()); // Qt.callLater(() => root.cancelFlick());
} // }
} // }
Anim { Anim {
properties: "x,y" properties: "x,y"
type: Anim.DefaultEffects
} }
} }
Timer { // Timer {
interval: 10 // interval: 10
running: root.doneFakeFlick // running: root.doneFakeFlick
//
onTriggered: root.doneFakeFlick = false // onTriggered: {
} // root.doneFakeFlick = false;
// }
// }
} }
+1
View File
@@ -4,6 +4,7 @@ MouseArea {
property int scrollAccumulatedY: 0 property int scrollAccumulatedY: 0
function onWheel(event: WheelEvent): void { function onWheel(event: WheelEvent): void {
event.accepted = false;
} }
onWheel: event => { onWheel: event => {
+1 -2
View File
@@ -6,7 +6,6 @@ Rectangle {
color: "transparent" color: "transparent"
Behavior on color { Behavior on color {
CAnim { CAnim {}
}
} }
} }
+62 -78
View File
@@ -1,32 +1,37 @@
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Templates import QtQuick.Templates
import qs.Helpers import qs.Helpers
import ZShell.Config import ZShell.Config
import qs.Services
ScrollBar { ScrollBar {
id: root id: root
required property Flickable flickable
readonly property bool isHorizontal: flickable && flickable.ScrollBar.horizontal === root
readonly property real axisSize: isHorizontal ? flickable.width : flickable.height
readonly property real axisContentSize: isHorizontal ? flickable.contentWidth : flickable.contentHeight
readonly property real axisContentPos: isHorizontal ? (reversed ? flickable.contentX : (flickable.contentX - flickable.originX)) : (reversed ? flickable.contentY : (flickable.contentY - flickable.originY))
readonly property real axisLength: isHorizontal ? root.width : root.height
readonly property real effectiveSize: Math.max(nonAnimHeight, root.minimumSize) readonly property real effectiveSize: Math.max(nonAnimHeight, root.minimumSize)
readonly property real effectiveTravel: Math.max(0, 1 - root.effectiveSize) readonly property real effectiveTravel: Math.max(0, 1 - root.effectiveSize)
required property Flickable flickable readonly property real nonAnimHeight: root.axisSize / root.axisContentSize
readonly property real nonAnimHeight: flickable.height / flickable.contentHeight readonly property real nonAnimY: root.axisContentPos / root.axisContentSize
readonly property real nonAnimY: flickable.contentY / flickable.contentHeight
readonly property real rawTravel: Math.max(0, 1 - root.nonAnimHeight) readonly property real rawTravel: Math.max(0, 1 - root.nonAnimHeight)
readonly property bool reversed: flickable instanceof ListView && flickable.verticalLayoutDirection === ListView.BottomToTop readonly property bool reversed: isHorizontal ? (flickable instanceof ListView && flickable.layoutDirection === Qt.RightToLeft) : (flickable instanceof ListView && flickable.verticalLayoutDirection === ListView.BottomToTop)
property bool shouldBeActive property bool shouldBeActive
readonly property real travelScale: root.rawTravel > 0 ? root.effectiveTravel / root.rawTravel : 0 readonly property real travelScale: root.rawTravel > 0 ? root.effectiveTravel / root.rawTravel : 0
enabled: !Visibilities.getForActive().isDrawing enabled: !Visibilities.getForActive().isDrawing
implicitWidth: Tokens.padding.extraSmall * 2 implicitWidth: size === 1 ? 0 : isHorizontal ? 0 : Tokens.padding.extraSmall * 2
implicitHeight: size === 1 ? 0 : isHorizontal ? Tokens.padding.extraSmall * 2 : 0
contentItem: Item { contentItem: Item {}
}
Behavior on position { Behavior on position {
enabled: !fullMouse.pressed enabled: !fullMouse.pressed
Anim { Anim {}
}
} }
onHoveredChanged: { onHoveredChanged: {
@@ -47,54 +52,27 @@ ScrollBar {
target: root.flickable target: root.flickable
} }
CustomClippingRect { Loader {
anchors.bottom: parent.bottom anchors.fill: parent
anchors.right: parent.right active: root.size < 1
anchors.top: parent.top sourceComponent: root.isHorizontal ? horizontalTrack : verticalTrack
implicitWidth: handle.implicitWidth }
radius: Tokens.rounding.full
CustomRect { Component {
id: handle id: verticalTrack
anchors.right: parent.right VerticalScrollBarTrack {
color: Colors.palette.m3secondary scrollBar: root
implicitHeight: root.height * root.effectiveSize mouseArea: fullMouse
implicitWidth: fullMouse.pressed || fullMouse.containsMouse ? Tokens.padding.extraSmall * 2 : Tokens.padding.extraSmall }
opacity: { }
if (!root.enabled)
return 0;
if (root.size === 1)
return 0;
if (fullMouse.pressed)
return 1;
if (fullMouse.containsMouse)
return 0.8;
if (root.policy === ScrollBar.AlwaysOn || root.shouldBeActive)
return 0.6;
return 0;
}
radius: Tokens.rounding.full
y: root.reversed ? root.height * (1 + root.nonAnimY) * root.travelScale : root.height * root.nonAnimY * root.travelScale
Behavior on implicitWidth { Component {
Anim { id: horizontalTrack
}
}
Behavior on opacity {
Anim {
type: Anim.DefaultEffects
}
}
MouseArea { HorizontalScrollBarTrack {
id: mouse scrollBar: root
mouseArea: fullMouse
acceptedButtons: Qt.NoButton
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
}
} }
} }
@@ -111,25 +89,40 @@ ScrollBar {
property real pressOffset: 0 property real pressOffset: 0
function contentYFromThumbTop(thumbTop) { function contentPosFromThumbStart(thumbStart) {
var visualPos = root.effectiveTravel > 0 ? thumbTop / root.travelScale : 0; var visualPos = root.effectiveTravel > 0 ? thumbStart / root.travelScale : 0;
return root.reversed ? (visualPos - 1) * root.axisContentSize : visualPos * root.axisContentSize;
return root.reversed ? (visualPos - 1) * root.flickable.contentHeight : visualPos * root.flickable.contentHeight;
} }
function updateFromEvent(event) { function updateFromEvent(event) {
var posInTrack = event.y / root.height; var eventPos = root.isHorizontal ? event.x : event.y;
var thumbTop = posInTrack - pressOffset; var posInTrack = eventPos / root.axisLength;
thumbTop = Math.max(0, Math.min(root.effectiveTravel, thumbTop)); var thumbStart = posInTrack - pressOffset;
thumbStart = Math.max(0, Math.min(root.effectiveTravel, thumbStart));
root.flickable.contentY = contentYFromThumbTop(thumbTop); var newPos = contentPosFromThumbStart(thumbStart);
if (root.isHorizontal)
root.flickable.contentX = newPos + (root.flickable.originX + (root.reversed ? root.flickable.contentWidth : 0));
else
root.flickable.contentY = newPos + (root.flickable.originY + (root.reversed ? root.flickable.contentHeight : 0));
} }
function visualThumbTop() { function visualThumbStart() {
const visualPos = root.reversed ? (1 + root.nonAnimY) : root.nonAnimY; const visualPos = root.reversed ? (1 + root.nonAnimY) : root.nonAnimY;
return visualPos * root.travelScale; return visualPos * root.travelScale;
} }
function onWheel(event: WheelEvent): void {
if (root.horizontal) {
event.accepted = false;
return;
}
var delta = event.angleDelta.y > 0 ? -0.1 : 0.1;
var newPos = Math.max(0, Math.min(1 - root.size, root.position + delta));
root.position = newPos;
}
anchors.fill: parent anchors.fill: parent
cursorShape: undefined cursorShape: undefined
hoverEnabled: true hoverEnabled: true
@@ -140,24 +133,15 @@ ScrollBar {
updateFromEvent(event); updateFromEvent(event);
} }
onPressed: event => { onPressed: event => {
var currentTop = visualThumbTop(); var currentStart = visualThumbStart();
var currentBottom = currentTop + root.effectiveSize; var currentEnd = currentStart + root.effectiveSize;
var clickPos = event.y / root.height; var eventPos = root.isHorizontal ? event.x : event.y;
var clickPos = eventPos / root.axisLength;
var clickedInsideThumb = clickPos >= currentTop && clickPos <= currentBottom; var clickedInsideThumb = clickPos >= currentStart && clickPos <= currentEnd;
pressOffset = clickedInsideThumb ? (clickPos - currentStart) : root.effectiveSize / 2;
if (clickedInsideThumb) {
pressOffset = clickPos - currentTop;
} else {
pressOffset = root.effectiveSize / 2;
}
updateFromEvent(event); updateFromEvent(event);
} }
onWheel: event => {
var delta = event.angleDelta.y > 0 ? -0.1 : 0.1;
var newPos = Math.max(0, Math.min(1 - root.size, root.position + delta));
root.position = newPos;
}
} }
} }
+1 -1
View File
@@ -141,7 +141,7 @@ Slider {
CAnim { CAnim {
} }
} }
NumberAnimation on waveProgress { Anim on waveProgress {
duration: root.waveDuration duration: root.waveDuration
easing.type: Easing.Linear easing.type: Easing.Linear
from: 0 from: 0
+2 -2
View File
@@ -38,9 +38,9 @@ DoubleSpinBox {
horizontalAlignment: TextField.AlignHCenter horizontalAlignment: TextField.AlignHCenter
implicitWidth: 65 implicitWidth: 65
inputMethodHints: Qt.ImhFormattedNumbersOnly inputMethodHints: Qt.ImhFormattedNumbersOnly
leftPadding: Tokens.padding.larger leftPadding: Tokens.padding.small
readOnly: !root.editable readOnly: !root.editable
rightPadding: Tokens.padding.larger rightPadding: Tokens.padding.small
text: root.textFromValue(root.value, root.locale) text: root.textFromValue(root.value, root.locale)
validator: root.validator validator: root.validator
-70
View File
@@ -1,70 +0,0 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import qs.Services
Item {
id: root
property alias active: splitButton.active
property alias buttonAlias: splitButton
property alias expanded: splitButton.expanded
property int expandedZ: 100
required property string label
property alias menuItems: splitButton.menuItems
property bool shouldBeActive: true
property alias type: splitButton.type
signal selected(item: MenuItem)
anchors.left: parent.left
anchors.right: parent.right
clip: false
implicitHeight: row.implicitHeight + Tokens.padding.smaller * 2
opacity: shouldBeActive ? 1 : 0
scale: shouldBeActive ? 1 : 0.8
z: splitButton.menu.implicitHeight > 0 ? expandedZ : 1
Behavior on opacity {
Anim {
}
}
Behavior on scale {
Anim {
}
}
RowLayout {
id: row
anchors.left: parent.left
anchors.margins: Tokens.padding.small
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: Tokens.spacing.normal
CustomText {
Layout.fillWidth: true
color: root.enabled ? Colors.palette.m3onSurface : Colors.palette.m3onSurfaceVariant
font.pointSize: Tokens.font.size.larger
text: root.label
}
CustomSplitButton {
id: splitButton
enabled: root.enabled
type: CustomSplitButton.Filled
z: 2
menu.onItemSelected: item => {
root.selected(item);
}
stateLayer.onClicked: {
splitButton.expanded = !splitButton.expanded;
}
}
}
}
+20 -8
View File
@@ -13,8 +13,12 @@ Switch {
implicitWidth: implicitIndicatorWidth implicitWidth: implicitIndicatorWidth
indicator: CustomRect { indicator: CustomRect {
color: root.checked && root.enabled ? Colors.palette.m3primary : Colors.layer(Colors.palette.m3surfaceContainerHighest, root.cLayer) color: {
implicitHeight: Tokens.font.size.medium + Tokens.padding.normal * 2 if (!root.enabled)
return root.checked ? Qt.alpha(Colors.palette.m3onSurface, 0.12) : Qt.alpha(Colors.palette.m3surfaceContainerHighest, 0.38);
return root.checked ? Colors.palette.m3primary : Colors.layer(Colors.palette.m3surfaceContainerHighest, root.cLayer);
}
implicitHeight: 14 + Tokens.padding.small * 2
implicitWidth: implicitHeight * 1.7 implicitWidth: implicitHeight * 1.7
radius: Tokens.rounding.full radius: Tokens.rounding.full
@@ -22,7 +26,11 @@ Switch {
readonly property real nonAnimWidth: root.pressed ? implicitHeight * 1.2 : implicitHeight readonly property real nonAnimWidth: root.pressed ? implicitHeight * 1.2 : implicitHeight
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: root.checked && root.enabled ? Colors.palette.m3onPrimary : Colors.layer(Colors.palette.m3outline, root.cLayer + 1) color: {
if (!root.enabled)
return root.checked ? Qt.alpha(Colors.palette.m3surface, 0.7) : Qt.alpha(Colors.palette.m3onSurface, 0.12);
return root.checked ? Colors.palette.m3onPrimary : Colors.layer(Colors.palette.m3outline, root.cLayer + 1);
}
implicitHeight: parent.implicitHeight - Tokens.padding.extraSmall implicitHeight: parent.implicitHeight - Tokens.padding.extraSmall
implicitWidth: nonAnimWidth implicitWidth: nonAnimWidth
radius: Tokens.rounding.full radius: Tokens.rounding.full
@@ -92,7 +100,7 @@ Switch {
anchors.centerIn: parent anchors.centerIn: parent
asynchronous: true asynchronous: true
height: parent.implicitHeight - Tokens.padding.larger height: parent.implicitHeight - Tokens.padding.medium
preferredRendererType: Shape.CurveRenderer preferredRendererType: Shape.CurveRenderer
width: height width: height
@@ -114,12 +122,16 @@ Switch {
} }
ShapePath { ShapePath {
capStyle: ShapePath.RoundCap capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap
fillColor: "transparent" fillColor: "transparent"
startX: icon.start1.x startX: icon.start1.x
startY: icon.start1.y startY: icon.start1.y
strokeColor: root.checked && root.enabled ? Colors.palette.m3primary : Colors.palette.m3surfaceContainerHighest strokeColor: {
strokeWidth: Tokens.font.size.larger * 0.15 if (!root.enabled)
return root.checked ? Colors.palette.m3outline : Colors.palette.m3surfaceContainer;
return root.checked ? Colors.palette.m3primary : Colors.palette.m3surfaceContainerHighest;
}
strokeWidth: 16 * 0.15
Behavior on strokeColor { Behavior on strokeColor {
CAnim { CAnim {
@@ -153,6 +165,6 @@ Switch {
component PropAnim: PropertyAnimation { component PropAnim: PropertyAnimation {
duration: Tokens.anim.durations.expressiveFastSpatial duration: Tokens.anim.durations.expressiveFastSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial easing: Tokens.anim.expressiveFastSpatial
} }
} }
+4 -4
View File
@@ -129,8 +129,8 @@ TextFieldBase {
} }
AnchorAnim { AnchorAnim {
duration: Tokens.anim.durations.expressiveEffects duration: Tokens.anim.durations.expressiveDefaultEffects
easing.bezierCurve: Tokens.anim.curves.expressiveEffects easing: Tokens.anim.expressiveDefaultEffects
} }
} }
} }
@@ -140,7 +140,7 @@ TextFieldBase {
active: root.leadingIcon active: root.leadingIcon
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: Tokens.padding.normal anchors.leftMargin: Tokens.padding.small
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
sourceComponent: MaterialIcon { sourceComponent: MaterialIcon {
@@ -154,7 +154,7 @@ TextFieldBase {
active: root.trailingIcon active: root.trailingIcon
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: Tokens.padding.normal anchors.rightMargin: Tokens.padding.small
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
sourceComponent: MaterialIcon { sourceComponent: MaterialIcon {
+56
View File
@@ -0,0 +1,56 @@
import QtQuick
import ZShell.Config
import qs.Services
CustomClippingRect {
id: track
required property var scrollBar
required property var mouseArea
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
implicitHeight: handle.implicitHeight
radius: Tokens.rounding.full
CustomRect {
id: handle
anchors.bottom: parent.bottom
color: Colors.palette.m3secondary
implicitWidth: track.scrollBar.width * track.scrollBar.effectiveSize
implicitHeight: track.mouseArea.pressed || track.mouseArea.containsMouse ? Tokens.padding.extraSmall * 2 : Tokens.padding.extraSmall
opacity: {
if (!track.scrollBar.enabled)
return 0;
if (track.scrollBar.size === 1)
return 0;
if (track.mouseArea.pressed)
return 1;
if (track.mouseArea.containsMouse)
return 0.8;
if (track.scrollBar.policy === CustomScrollBar.AlwaysOn || track.scrollBar.shouldBeActive)
return 0.6;
return 0;
}
radius: Tokens.rounding.full
x: track.scrollBar.reversed ? track.scrollBar.width * (1 + track.scrollBar.nonAnimY) * track.scrollBar.travelScale : track.scrollBar.width * track.scrollBar.nonAnimY * track.scrollBar.travelScale
Behavior on implicitHeight {
Anim {}
}
Behavior on opacity {
Anim {
type: Anim.DefaultEffects
}
}
MouseArea {
acceptedButtons: Qt.NoButton
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
}
}
}
+1 -1
View File
@@ -27,7 +27,7 @@ ButtonBase {
return Colors.palette.m3onPrimary; return Colors.palette.m3onPrimary;
return type === IconButton.Tonal ? Colors.palette.m3onSecondaryContainer : Colors.palette.m3onSurfaceVariant; return type === IconButton.Tonal ? Colors.palette.m3onSecondaryContainer : Colors.palette.m3onSurfaceVariant;
} }
padding: type === IconButton.Text ? Tokens.padding.extraSmall / 2 : Tokens.padding.small padding: type === IconButton.Text ? Tokens.padding.extraSmall / 2 : Tokens.padding.extraSmall
MaterialIcon { MaterialIcon {
id: label id: label
+2 -2
View File
@@ -17,7 +17,7 @@ ButtonBase {
return Colors.palette.m3primary; return Colors.palette.m3primary;
return type === TextButton.Filled ? Colors.palette.m3onPrimary : Colors.palette.m3onSecondary; return type === TextButton.Filled ? Colors.palette.m3onPrimary : Colors.palette.m3onSecondary;
} }
horizontalPadding: Tokens.padding.larger horizontalPadding: Tokens.padding.small
implicitHeight: row.implicitHeight + verticalPadding * 2 implicitHeight: row.implicitHeight + verticalPadding * 2
implicitWidth: row.implicitWidth + horizontalPadding * 2 implicitWidth: row.implicitWidth + horizontalPadding * 2
inactiveColor: { inactiveColor: {
@@ -32,7 +32,7 @@ ButtonBase {
return Colors.palette.m3primary; return Colors.palette.m3primary;
return type === TextButton.Filled ? Colors.palette.m3onSurface : Colors.palette.m3onSecondaryContainer; return type === TextButton.Filled ? Colors.palette.m3onSurface : Colors.palette.m3onSecondaryContainer;
} }
verticalPadding: Tokens.padding.small verticalPadding: Tokens.padding.extraSmall
RowLayout { RowLayout {
id: row id: row
+5 -5
View File
@@ -78,7 +78,7 @@ MouseArea {
implicitHeight: column.implicitHeight + column.anchors.margins * 2 implicitHeight: column.implicitHeight + column.anchors.margins * 2
implicitWidth: Math.max(200, column.implicitWidth + column.anchors.margins * 2) implicitWidth: Math.max(200, column.implicitWidth + column.anchors.margins * 2)
level: 2 level: 2
radius: Tokens.rounding.medium radius: Tokens.rounding.large
x: { x: {
watcher.transform; watcher.transform;
const item = root.attachTo; const item = root.attachTo;
@@ -132,9 +132,9 @@ MouseArea {
Layout.fillWidth: true Layout.fillWidth: true
color: Qt.alpha(Colors.palette.m3tertiaryContainer, active ? 1 : 0) color: Qt.alpha(Colors.palette.m3tertiaryContainer, active ? 1 : 0)
implicitHeight: menuOptionRow.implicitHeight + Tokens.padding.larger * 2 implicitHeight: menuOptionRow.implicitHeight + Tokens.padding.medium * 2
implicitWidth: menuOptionRow.implicitWidth + Tokens.padding.larger * 2 implicitWidth: menuOptionRow.implicitWidth + Tokens.padding.medium * 2
radius: Tokens.rounding.small radius: menu.radius - column.anchors.margins
Behavior on radius { Behavior on radius {
Anim { Anim {
@@ -157,7 +157,7 @@ MouseArea {
id: menuOptionRow id: menuOptionRow
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.larger anchors.margins: Tokens.padding.medium
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
+1 -1
View File
@@ -70,7 +70,7 @@ TextFieldBase {
id: clearIcon id: clearIcon
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: Tokens.padding.larger anchors.rightMargin: Tokens.padding.small
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
enabled: root.text enabled: root.text
icon: "clear" icon: "clear"
@@ -12,14 +12,14 @@ Row {
} }
property alias active: menu.active property alias active: menu.active
property color color: type == CustomSplitButton.Filled ? Colors.palette.m3primary : Colors.palette.m3secondaryContainer property color color: type == SplitButton.Filled ? Colors.palette.m3primary : Colors.palette.m3secondaryContainer
property color disabledColor: Qt.alpha(Colors.palette.m3onSurface, 0.1) property color disabledColor: Qt.alpha(Colors.palette.m3onSurface, 0.1)
property color disabledTextColor: Qt.alpha(Colors.palette.m3onSurface, 0.38) property color disabledTextColor: Qt.alpha(Colors.palette.m3onSurface, 0.38)
readonly property alias expandBtn: expandBtn readonly property alias expandBtn: expandBtn
property alias expanded: menu.expanded property alias expanded: menu.expanded
property string fallbackIcon property string fallbackIcon
property string fallbackText property string fallbackText
property real horizontalPadding: Tokens.padding.larger property real horizontalPadding: Tokens.padding.medium
readonly property alias iconLabel: iconLabel readonly property alias iconLabel: iconLabel
readonly property alias label: label readonly property alias label: label
readonly property alias menu: menu readonly property alias menu: menu
@@ -27,20 +27,20 @@ Row {
property bool menuOnTop property bool menuOnTop
property real minLeftWidth property real minLeftWidth
readonly property alias stateLayer: stateLayer readonly property alias stateLayer: stateLayer
property color textColor: type == CustomSplitButton.Filled ? Colors.palette.m3onPrimary : Colors.palette.m3onSecondaryContainer property color textColor: type == SplitButton.Filled ? Colors.palette.m3onPrimary : Colors.palette.m3onSecondaryContainer
readonly property alias textRow: textRow readonly property alias textRow: textRow
property int type: CustomSplitButton.Filled property int type: SplitButton.Filled
property real verticalPadding: Tokens.padding.small property real verticalPadding: Tokens.padding.small
spacing: Math.floor(Tokens.spacing.extraSmall) spacing: Math.floor(Tokens.spacing.extraSmall / 2)
CustomRect { CustomRect {
bottomRightRadius: Tokens.rounding.small / 2 bottomRightRadius: Tokens.rounding.medium / 2
color: !root.enabled ? root.disabledColor : root.color color: !root.enabled ? root.disabledColor : root.color
implicitHeight: expandBtn.implicitHeight implicitHeight: expandBtn.implicitHeight
implicitWidth: Math.max(root.minLeftWidth, textRow.implicitWidth + root.horizontalPadding * 2) implicitWidth: Math.max(root.minLeftWidth, textRow.implicitWidth + root.horizontalPadding * 2)
radius: implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) radius: implicitHeight / 2 * Math.min(1, Tokens.rounding.scale)
topRightRadius: Tokens.rounding.small / 2 topRightRadius: Tokens.rounding.medium / 2
StateLayer { StateLayer {
id: stateLayer id: stateLayer
@@ -92,7 +92,7 @@ Row {
CustomRect { CustomRect {
id: expandBtn id: expandBtn
property real rad: root.expanded ? implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) : Tokens.rounding.small / 2 property real rad: root.expanded ? implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) : Tokens.rounding.medium / 2
bottomLeftRadius: rad bottomLeftRadius: rad
color: !root.enabled ? root.disabledColor : root.color color: !root.enabled ? root.disabledColor : root.color
+2 -3
View File
@@ -1,9 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Shapes import QtQuick.Shapes
import ZShell import ZShell
import ZShell.Components
import qs.Helpers
import ZShell.Config import ZShell.Config
import qs.Helpers
import qs.Services import qs.Services
MouseArea { MouseArea {
@@ -81,7 +80,7 @@ MouseArea {
alwaysRunToEnd: true alwaysRunToEnd: true
duration: Tokens.anim.durations.expressiveSlowEffects * 2 duration: Tokens.anim.durations.expressiveSlowEffects * 2
easing.bezierCurve: Tokens.anim.curves.standard easing: Tokens.anim.standard
property: "circleRadius" property: "circleRadius"
target: root target: root
to: root.endRadius to: root.endRadius
+86
View File
@@ -0,0 +1,86 @@
import QtQuick
import QtQuick.Templates
import ZShell.Config
import qs.Services
TextArea {
id: root
color: Colors.palette.m3onSurface
cursorVisible: !readOnly
font.pointSize: Tokens.font.size.small
implicitHeight: contentHeight + topPadding + bottomPadding
implicitWidth: contentWidth + leftPadding + rightPadding
placeholderTextColor: Colors.palette.m3onSurfaceVariant // No anim cause placeholder is custom
renderType: TextArea.NativeRendering
selectedTextColor: color
selectionColor: Qt.alpha(Colors.palette.m3primary, 0.4)
verticalAlignment: TextInput.AlignVCenter
Behavior on color {
CAnim {}
}
Behavior on selectionColor {
CAnim {}
}
cursorDelegate: Item {}
CustomRect {
id: cursor
property bool disableBlink
color: Colors.palette.m3primary
implicitHeight: root.cursorRectangle.height
implicitWidth: 1.5
radius: Tokens.rounding.largeIncreased
x: root.cursorRectangle.x
y: root.cursorRectangle.y
Behavior on x {
Anim {
duration: Tokens.anim.durations.expressiveFastEffects
easing.bezierCurve: [0.2, 1, 0.21, 1, 1, 1]
}
}
Behavior on opacity {
Anim {
type: Anim.StandardSmall
}
}
Connections {
function onCursorPositionChanged(): void {
if (root.activeFocus && root.cursorVisible) {
cursor.opacity = 1;
cursor.disableBlink = true;
enableBlink.restart();
}
}
target: root
}
Timer {
id: enableBlink
interval: 500
onTriggered: cursor.disableBlink = false
}
Timer {
interval: 500
repeat: true
running: root.activeFocus && root.cursorVisible && !cursor.disableBlink
triggeredOnStart: true
onTriggered: parent.opacity = parent.opacity === 1 ? 0 : 1
}
Binding {
cursor.opacity: 0
when: !root.activeFocus || !root.cursorVisible
}
}
}
+2 -2
View File
@@ -14,7 +14,7 @@ ButtonBase {
return Colors.palette.m3primary; return Colors.palette.m3primary;
return type === TextButton.Filled ? Colors.palette.m3onPrimary : Colors.palette.m3onSecondary; return type === TextButton.Filled ? Colors.palette.m3onPrimary : Colors.palette.m3onSecondary;
} }
horizontalPadding: Tokens.padding.normal horizontalPadding: Tokens.padding.small
implicitHeight: label.implicitHeight + verticalPadding * 2 implicitHeight: label.implicitHeight + verticalPadding * 2
implicitWidth: label.implicitWidth + horizontalPadding * 2 implicitWidth: label.implicitWidth + horizontalPadding * 2
inactiveColor: { inactiveColor: {
@@ -29,7 +29,7 @@ ButtonBase {
return Colors.palette.m3primary; return Colors.palette.m3primary;
return type === TextButton.Filled ? Colors.palette.m3onSurface : Colors.palette.m3onSecondaryContainer; return type === TextButton.Filled ? Colors.palette.m3onSurface : Colors.palette.m3onSecondaryContainer;
} }
verticalPadding: Tokens.padding.small verticalPadding: Tokens.padding.extraSmall
CustomText { CustomText {
id: label id: label
+100
View File
@@ -0,0 +1,100 @@
import QtQuick
import QtQuick.Templates
import ZShell.Config
import qs.Services
TextEdit {
id: root
property bool animateCursor: true
property alias cursor: cursor
color: Colors.palette.m3onSurface
cursorVisible: !readOnly
font.pointSize: Tokens.font.size.small
font.family: Config.appearance.font.family.sans
renderType: TextField.NativeRendering
selectedTextColor: color
selectionColor: Qt.alpha(Colors.palette.m3primary, 0.4)
verticalAlignment: TextInput.AlignVCenter
Behavior on color {
CAnim {
}
}
cursorDelegate: Item {
}
Behavior on selectionColor {
CAnim {
}
}
CustomRect {
id: cursor
property bool disableBlink
color: Colors.palette.m3primary
implicitHeight: root.cursorRectangle.height
implicitWidth: 1.5
radius: Tokens.rounding.largeIncreased
x: root.cursorRectangle.x
y: root.cursorRectangle.y
Behavior on opacity {
Anim {
type: Anim.StandardSmall
}
}
Behavior on x {
enabled: root.animateCursor
Anim {
duration: Tokens.anim.durations.expressiveFastEffects
easing.bezierCurve: [0.2, 1, 0.21, 1, 1, 1]
}
}
Behavior on y {
enabled: root.animateCursor
Anim {
duration: Tokens.anim.durations.expressiveFastEffects
easing.bezierCurve: [0.2, 1, 0.21, 1, 1, 1]
}
}
Connections {
function onCursorPositionChanged(): void {
if (root.activeFocus && root.cursorVisible) {
cursor.opacity = 1;
cursor.disableBlink = true;
enableBlink.restart();
}
}
target: root
}
Timer {
id: enableBlink
interval: 500
onTriggered: cursor.disableBlink = false
}
Timer {
interval: 500
repeat: true
running: root.activeFocus && root.cursorVisible && !cursor.disableBlink
triggeredOnStart: true
onTriggered: parent.opacity = parent.opacity === 1 ? 0 : 1
}
Binding {
cursor.opacity: 0
when: !root.activeFocus || !root.cursorVisible
}
}
}
+1 -1
View File
@@ -36,7 +36,7 @@ TextField {
color: Colors.palette.m3primary color: Colors.palette.m3primary
implicitHeight: root.cursorRectangle.height implicitHeight: root.cursorRectangle.height
implicitWidth: 1.5 implicitWidth: 1.5
radius: Tokens.rounding.large radius: Tokens.rounding.largeIncreased
x: root.cursorRectangle.x x: root.cursorRectangle.x
y: root.cursorRectangle.y y: root.cursorRectangle.y
+8 -8
View File
@@ -32,8 +32,8 @@ CustomRect {
return Colors.palette.m3errorContainer; return Colors.palette.m3errorContainer;
return Colors.palette.m3surface; return Colors.palette.m3surface;
} }
implicitHeight: layout.implicitHeight + Tokens.padding.smaller * 2 implicitHeight: layout.implicitHeight + Tokens.padding.small * 2
radius: Tokens.rounding.normal radius: Tokens.rounding.medium
Behavior on border.color { Behavior on border.color {
CAnim { CAnim {
@@ -52,10 +52,10 @@ CustomRect {
id: layout id: layout
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.normal anchors.leftMargin: Tokens.padding.small
anchors.margins: Tokens.padding.smaller anchors.margins: Tokens.padding.small
anchors.rightMargin: Tokens.padding.normal anchors.rightMargin: Tokens.padding.small
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
CustomRect { CustomRect {
color: { color: {
@@ -67,9 +67,9 @@ CustomRect {
return Colors.palette.m3error; return Colors.palette.m3error;
return Colors.palette.m3surfaceContainerHigh; return Colors.palette.m3surfaceContainerHigh;
} }
implicitHeight: icon.implicitHeight + Tokens.padding.smaller * 2 implicitHeight: icon.implicitHeight + Tokens.padding.small * 2
implicitWidth: implicitHeight implicitWidth: implicitHeight
radius: Tokens.rounding.normal radius: Tokens.rounding.medium
MaterialIcon { MaterialIcon {
id: icon id: icon
+3 -3
View File
@@ -21,7 +21,7 @@ Item {
} }
return h; return h;
} }
implicitWidth: Config.utilities.sizes.toastWidth - Tokens.padding.normal * 2 implicitWidth: Config.utilities.sizes.toastWidth - Tokens.padding.small * 2
Repeater { Repeater {
id: repeater id: repeater
@@ -82,7 +82,7 @@ Item {
Behavior on anchors.bottomMargin { Behavior on anchors.bottomMargin {
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
} }
} }
Behavior on opacity { Behavior on opacity {
@@ -105,7 +105,7 @@ Item {
id: initAnim id: initAnim
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
from: 0 from: 0
properties: "opacity,scale" properties: "opacity,scale"
target: toast target: toast
+3 -2
View File
@@ -8,6 +8,7 @@ CustomListView {
property real endFadeOpacity: fadeShouldBeActive(false) ? 0 : 1 property real endFadeOpacity: fadeShouldBeActive(false) ? 0 : 1
property real fadeAmount: 0.1 property real fadeAmount: 0.1
property real fadeThreshold: 0.0
readonly property bool horizontal: orientation === ListView.Horizontal readonly property bool horizontal: orientation === ListView.Horizontal
property real startFadeOpacity: fadeShouldBeActive(true) ? 0 : 1 property real startFadeOpacity: fadeShouldBeActive(true) ? 0 : 1
@@ -28,11 +29,11 @@ CustomListView {
} }
function marginEnd(): real { function marginEnd(): real {
return horizontal ? rightMargin : bottomMargin; return horizontal ? rightMargin - fadeThreshold : bottomMargin - fadeThreshold;
} }
function marginStart(): real { function marginStart(): real {
return horizontal ? leftMargin : topMargin; return horizontal ? leftMargin - fadeThreshold : topMargin - fadeThreshold;
} }
function overshootStart(): real { function overshootStart(): real {
+56
View File
@@ -0,0 +1,56 @@
import QtQuick
import ZShell.Config
import qs.Services
CustomClippingRect {
id: track
required property var scrollBar
required property var mouseArea
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.top: parent.top
implicitWidth: handle.implicitWidth
radius: Tokens.rounding.full
CustomRect {
id: handle
anchors.right: parent.right
color: Colors.palette.m3secondary
implicitHeight: track.scrollBar.height * track.scrollBar.effectiveSize
implicitWidth: track.mouseArea.pressed || track.mouseArea.containsMouse ? Tokens.padding.extraSmall * 2 : Tokens.padding.extraSmall
opacity: {
if (!track.scrollBar.enabled)
return 0;
if (track.scrollBar.size === 1)
return 0;
if (track.mouseArea.pressed)
return 1;
if (track.mouseArea.containsMouse)
return 0.8;
if (track.scrollBar.policy === CustomScrollBar.AlwaysOn || track.scrollBar.shouldBeActive)
return 0.6;
return 0;
}
radius: Tokens.rounding.full
y: track.scrollBar.reversed ? track.scrollBar.height * (1 + track.scrollBar.nonAnimY) * track.scrollBar.travelScale : track.scrollBar.height * track.scrollBar.nonAnimY * track.scrollBar.travelScale
Behavior on implicitWidth {
Anim {}
}
Behavior on opacity {
Anim {
type: Anim.DefaultEffects
}
}
MouseArea {
acceptedButtons: Qt.NoButton
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
}
}
}
+2 -3
View File
@@ -111,7 +111,7 @@ Item {
id: toasts id: toasts
anchors.bottom: sidebar.visible ? parent.bottom : utilities.top anchors.bottom: sidebar.visible ? parent.bottom : utilities.top
anchors.margins: Tokens.padding.normal anchors.margins: Tokens.padding.small
anchors.right: sidebar.left anchors.right: sidebar.left
} }
@@ -140,7 +140,6 @@ Item {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
popouts: popouts
sidebar: sidebar sidebar: sidebar
visibilities: root.visibilities visibilities: root.visibilities
} }
@@ -161,7 +160,7 @@ Item {
Behavior on offsetScale { Behavior on offsetScale {
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
} }
} }
+13 -16
View File
@@ -55,7 +55,7 @@ CustomWindow {
property color surfaceColor: Colors.tPalette.m3surface property color surfaceColor: Colors.tPalette.m3surface
WlrLayershell.exclusionMode: ExclusionMode.Ignore WlrLayershell.exclusionMode: ExclusionMode.Ignore
WlrLayershell.keyboardFocus: visibilities.launcher || visibilities.settings ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None WlrLayershell.keyboardFocus: visibilities.launcher || visibilities.settings || visibilities.sidebar ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
WlrLayershell.layer: (fsTransitionProg > 0 && Config.general.showOverFullscreen) || (hasSpecialWorkspace && hasFullscreenOnNormalWs) ? WlrLayer.Overlay : WlrLayer.Top WlrLayershell.layer: (fsTransitionProg > 0 && Config.general.showOverFullscreen) || (hasSpecialWorkspace && hasFullscreenOnNormalWs) ? WlrLayer.Overlay : WlrLayer.Top
color: "transparent" color: "transparent"
contentItem.focus: true contentItem.focus: true
@@ -63,12 +63,10 @@ CustomWindow {
name: "Bar" name: "Bar"
Behavior on fsTransitionProg { Behavior on fsTransitionProg {
Anim { Anim {}
}
} }
Behavior on surfaceColor { Behavior on surfaceColor {
CAnim { CAnim {}
}
} }
contentItem.Keys.onEscapePressed: { contentItem.Keys.onEscapePressed: {
@@ -225,7 +223,7 @@ CustomWindow {
implicitHeight: panels.dashboard.height * (geometry.horizontal ? 1 + extraExtent : 1) implicitHeight: panels.dashboard.height * (geometry.horizontal ? 1 + extraExtent : 1)
implicitWidth: panels.dashboard.width * (geometry.horizontal ? 1 : 1 + extraExtent) implicitWidth: panels.dashboard.width * (geometry.horizontal ? 1 : 1 + extraExtent)
panel: panels.dashboardWrapper panel: panels.dashboardWrapper
radius: Tokens.rounding.normal radius: Tokens.rounding.extraLarge
x: panels.dashboardWrapper.x + panels.dashboard.x + geometry.insetLeft(root.borderThickness) - (geometry.horizontal ? 0 : panels.dashboard.width * extraExtent) x: panels.dashboardWrapper.x + panels.dashboard.x + geometry.insetLeft(root.borderThickness) - (geometry.horizontal ? 0 : panels.dashboard.width * extraExtent)
y: panels.dashboardWrapper.y + panels.dashboard.y + geometry.insetTop(root.borderThickness) - (geometry.horizontal && geometry.position !== "bottom" ? panels.dashboard.height * extraExtent : 0) y: panels.dashboardWrapper.y + panels.dashboard.y + geometry.insetTop(root.borderThickness) - (geometry.horizontal && geometry.position !== "bottom" ? panels.dashboard.height * extraExtent : 0)
} }
@@ -238,7 +236,7 @@ CustomWindow {
deformAmount: 0.06 deformAmount: 0.06
implicitHeight: panels.launcher.height * (1 + extraHeight) implicitHeight: panels.launcher.height * (1 + extraHeight)
panel: panels.launcher panel: panels.launcher
radius: Tokens.rounding.smallest + 5 radius: Tokens.rounding.medium + (Tokens.padding.largeIncreased / 4)
y: panels.launcher.y + geometry.insetTop(root.borderThickness) y: panels.launcher.y + geometry.insetTop(root.borderThickness)
} }
@@ -267,7 +265,7 @@ CustomWindow {
id: notifsBg id: notifsBg
panel: panels.notifications panel: panels.notifications
radius: Tokens.rounding.normal radius: Tokens.rounding.large
} }
PanelBg { PanelBg {
@@ -288,13 +286,12 @@ CustomWindow {
implicitHeight: panels.popouts.height * (geometry.horizontal ? 1 + extraExtent : 1) implicitHeight: panels.popouts.height * (geometry.horizontal ? 1 + extraExtent : 1)
implicitWidth: panels.popouts.width * (geometry.horizontal ? 1 : 1 + extraExtent) implicitWidth: panels.popouts.width * (geometry.horizontal ? 1 : 1 + extraExtent)
panel: panels.popoutsWrapper panel: panels.popoutsWrapper
radius: panels.popouts.current?.panelRadius ?? Tokens.rounding.normal radius: panels.popouts.current?.panelRadius ?? Tokens.rounding.large
x: panels.popoutsWrapper.x + panels.popouts.x + geometry.insetLeft(root.borderThickness) - (geometry.horizontal ? 0 : panels.popouts.width * extraExtent) x: panels.popoutsWrapper.x + panels.popouts.x + geometry.insetLeft(root.borderThickness) - (geometry.horizontal ? 0 : panels.popouts.width * extraExtent)
y: panels.popoutsWrapper.y + panels.popouts.y + geometry.insetTop(root.borderThickness) - (geometry.barOnTop ? panels.popouts.height * extraExtent : 0) y: panels.popoutsWrapper.y + panels.popouts.y + geometry.insetTop(root.borderThickness) - (geometry.barOnTop ? panels.popouts.height * extraExtent : 0)
Behavior on extraExtent { Behavior on extraExtent {
Anim { Anim {}
}
} }
} }
@@ -305,7 +302,7 @@ CustomWindow {
implicitHeight: panels.resources.height implicitHeight: panels.resources.height
implicitWidth: panels.resources.width implicitWidth: panels.resources.width
panel: panels.resourcesWrapper panel: panels.resourcesWrapper
radius: Tokens.rounding.large radius: Tokens.rounding.largeIncreased + Tokens.padding.small
x: panels.resourcesWrapper.x + panels.resources.x + geometry.insetLeft(root.borderThickness) x: panels.resourcesWrapper.x + panels.resources.x + geometry.insetLeft(root.borderThickness)
y: panels.resourcesWrapper.y + panels.resources.y + geometry.insetTop(root.borderThickness) y: panels.resourcesWrapper.y + panels.resources.y + geometry.insetTop(root.borderThickness)
} }
@@ -315,7 +312,7 @@ CustomWindow {
deformAmount: 0.03 deformAmount: 0.03
panel: panels.settings panel: panels.settings
radius: Tokens.rounding.large + Tokens.padding.normal radius: Tokens.rounding.largeIncreased + Tokens.padding.small
} }
PanelBg { PanelBg {
@@ -323,7 +320,7 @@ CustomWindow {
deformAmount: 0.08 deformAmount: 0.08
panel: panels.dock panel: panels.dock
radius: Tokens.rounding.normal radius: Tokens.rounding.medium
} }
PanelBg { PanelBg {
@@ -331,7 +328,7 @@ CustomWindow {
deformAmount: 0.08 deformAmount: 0.08
panel: panels.drawing panel: panels.drawing
radius: Tokens.rounding.normal radius: Tokens.rounding.medium
} }
PanelBg { PanelBg {
@@ -462,7 +459,7 @@ CustomWindow {
group: blobGroup group: blobGroup
implicitHeight: panel.height implicitHeight: panel.height
implicitWidth: panel.width implicitWidth: panel.width
radius: Tokens.rounding.smallest radius: Tokens.rounding.small
x: panel.x + geometry.insetLeft(root.borderThickness) x: panel.x + geometry.insetLeft(root.borderThickness)
y: panel.y + geometry.insetTop(root.borderThickness) y: panel.y + geometry.insetTop(root.borderThickness)
} }
+8 -8
View File
@@ -18,7 +18,7 @@ ColumnLayout {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: false Layout.fillWidth: false
Layout.preferredWidth: centerWidth Layout.preferredWidth: centerWidth
spacing: Tokens.spacing.large * 2 spacing: Tokens.spacing.largeIncreased * 2
RowLayout { RowLayout {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
@@ -64,7 +64,7 @@ ColumnLayout {
CustomClippingRect { CustomClippingRect {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.topMargin: Tokens.spacing.large * 2 Layout.topMargin: Tokens.spacing.largeIncreased * 2
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: root.centerWidth / 2 implicitHeight: root.centerWidth / 2
implicitWidth: root.centerWidth / 2 implicitWidth: root.centerWidth / 2
@@ -99,7 +99,7 @@ ColumnLayout {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
focus: true focus: true
implicitHeight: input.implicitHeight + Tokens.padding.small * 2 implicitHeight: input.implicitHeight + Tokens.padding.extraSmall * 2
implicitWidth: root.centerWidth * 0.8 implicitWidth: root.centerWidth * 0.8
radius: Tokens.rounding.full radius: Tokens.rounding.full
@@ -130,11 +130,11 @@ ColumnLayout {
id: input id: input
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.small anchors.margins: Tokens.padding.extraSmall
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
Item { Item {
implicitHeight: statusIcon.implicitHeight + Tokens.padding.small * 2 implicitHeight: statusIcon.implicitHeight + Tokens.padding.extraSmall * 2
implicitWidth: implicitHeight implicitWidth: implicitHeight
MaterialIcon { MaterialIcon {
@@ -174,7 +174,7 @@ ColumnLayout {
CustomRect { CustomRect {
color: root.greeter.buffer && !root.greeter.launching ? Colors.palette.m3primary : Colors.layer(Colors.palette.m3surfaceContainerHigh, 2) color: root.greeter.buffer && !root.greeter.launching ? Colors.palette.m3primary : Colors.layer(Colors.palette.m3surfaceContainerHigh, 2)
implicitHeight: enterIcon.implicitHeight + Tokens.padding.small * 2 implicitHeight: enterIcon.implicitHeight + Tokens.padding.extraSmall * 2
implicitWidth: implicitHeight implicitWidth: implicitHeight
radius: Tokens.rounding.full radius: Tokens.rounding.full
@@ -200,7 +200,7 @@ ColumnLayout {
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: -Tokens.spacing.large Layout.topMargin: -Tokens.spacing.largeIncreased
implicitHeight: Math.max(message.implicitHeight, stateMessage.implicitHeight) implicitHeight: Math.max(message.implicitHeight, stateMessage.implicitHeight)
Behavior on implicitHeight { Behavior on implicitHeight {
+11 -11
View File
@@ -30,11 +30,11 @@ NumberAnimation {
if (type === Anim.DefaultSpatial) if (type === Anim.DefaultSpatial)
return Tokens.anim.durations.expressiveDefaultSpatial; return Tokens.anim.durations.expressiveDefaultSpatial;
if (type === Anim.SlowSpatial) if (type === Anim.SlowSpatial)
return Tokens.anim.durations.large; return Tokens.anim.durations.expressiveSlowSpatial;
if (type === Anim.FastEffects) if (type === Anim.FastEffects)
return Tokens.anim.durations.expressiveFastEffects; return Tokens.anim.durations.expressiveFastEffects;
if (type === Anim.DefaultEffects) if (type === Anim.DefaultEffects)
return Tokens.anim.durations.expressiveEffects; return Tokens.anim.durations.expressiveDefaultEffects;
if (type === Anim.SlowEffects) if (type === Anim.SlowEffects)
return Tokens.anim.durations.expressiveSlowEffects; return Tokens.anim.durations.expressiveSlowEffects;
@@ -42,22 +42,22 @@ NumberAnimation {
const idx = type % 4; // 0-7 are the 4 standard types const idx = type % 4; // 0-7 are the 4 standard types
return Tokens.anim.durations[types[idx]]; return Tokens.anim.durations[types[idx]];
} }
easing.bezierCurve: { easing: {
if (type === Anim.FastSpatial) if (type === Anim.FastSpatial)
return Tokens.anim.curves.expressiveFastSpatial; return Tokens.anim.expressiveFastSpatial;
if (type === Anim.DefaultSpatial) if (type === Anim.DefaultSpatial)
return Tokens.anim.curves.expressiveDefaultSpatial; return Tokens.anim.expressiveDefaultSpatial;
if (type === Anim.SlowSpatial) if (type === Anim.SlowSpatial)
return Tokens.anim.curves.expressiveSlowSpatial; return Tokens.anim.expressiveSlowSpatial;
if (type === Anim.FastEffects) if (type === Anim.FastEffects)
return Tokens.anim.curves.expressiveFastEffects; return Tokens.anim.expressiveFastEffects;
if (type === Anim.DefaultEffects) if (type === Anim.DefaultEffects)
return Tokens.anim.curves.expressiveDefaultEffects; return Tokens.anim.expressiveDefaultEffects;
if (type === Anim.SlowEffects) if (type === Anim.SlowEffects)
return Tokens.anim.curves.expressiveSlowEffects; return Tokens.anim.expressiveSlowEffects;
if (type >= Anim.EmphasizedSmall && type <= Anim.EmphasizedExtraLarge) if (type >= Anim.EmphasizedSmall && type <= Anim.EmphasizedExtraLarge)
return Tokens.anim.curves.emphasized; return Tokens.anim.emphasized;
return Tokens.anim.curves.standard; return Tokens.anim.standard;
} }
} }
+2 -58
View File
@@ -2,62 +2,6 @@ import QtQuick
import ZShell.Config import ZShell.Config
ColorAnimation { ColorAnimation {
enum Type { duration: Tokens.anim.durations.expressiveSlowEffects
StandardSmall = 0, easing: Tokens.anim.expressiveSlowEffects
Standard,
StandardLarge,
StandardExtraLarge,
EmphasizedSmall,
Emphasized,
EmphasizedLarge,
EmphasizedExtraLarge,
FastSpatial,
DefaultSpatial,
SlowSpatial,
FastEffects,
DefaultEffects,
SlowEffects
}
property int type: CAnim.DefaultSpatial
duration: {
if (type < CAnim.StandardSmall || type > Anim.SlowEffects)
return Tokens.anim.durations.normal;
if (type === CAnim.FastSpatial)
return Tokens.anim.durations.expressiveFastSpatial;
if (type === CAnim.DefaultSpatial)
return Tokens.anim.durations.expressiveDefaultSpatial;
if (type === CAnim.SlowSpatial)
return Tokens.anim.durations.large;
if (type === CAnim.FastEffects)
return Tokens.anim.durations.expressiveFastEffects;
if (type === CAnim.DefaultEffects)
return Tokens.anim.durations.expressiveEffects;
if (type === CAnim.SlowEffects)
return Tokens.anim.durations.expressiveSlowEffects;
const types = ["small", "normal", "large", "extraLarge"];
const idx = type % 4;
return Tokens.anim.durations[types[idx]];
}
easing.bezierCurve: {
if (type === CAnim.FastSpatial)
return Tokens.anim.curves.expressiveFastSpatial;
if (type === CAnim.DefaultSpatial)
return Tokens.anim.curves.expressiveDefaultSpatial;
if (type === CAnim.SlowSpatial)
return Tokens.anim.curves.expressiveSlowSpatial;
if (type === CAnim.FastEffects)
return Tokens.anim.curves.expressiveFastEffects;
if (type === CAnim.DefaultEffects)
return Tokens.anim.curves.expressiveDefaultEffects;
if (type === CAnim.SlowEffects)
return Tokens.anim.curves.expressiveSlowEffects;
if (type >= CAnim.EmphasizedSmall && type <= Anim.EmphasizedExtraLarge)
return Tokens.anim.curves.emphasized;
return Tokens.anim.curves.standard;
}
} }
+1 -1
View File
@@ -23,7 +23,7 @@ BusyIndicator {
property real implicitSize: Tokens.font.size.normal * 3 property real implicitSize: Tokens.font.size.normal * 3
property real internalStrokeWidth: strokeWidth property real internalStrokeWidth: strokeWidth
readonly property alias progress: manager.progress readonly property alias progress: manager.progress
property real strokeWidth: Tokens.padding.small * 0.8 property real strokeWidth: Tokens.padding.extraSmall * 0.8
property alias type: manager.indeterminateAnimationType property alias type: manager.indeterminateAnimationType
implicitHeight: implicitSize implicitHeight: implicitSize
+1 -1
View File
@@ -21,7 +21,7 @@ Item {
readonly property real size: Math.min(width, height) readonly property real size: Math.min(width, height)
property int spacing: Tokens.spacing.small property int spacing: Tokens.spacing.small
property int startAngle: -90 property int startAngle: -90
property int strokeWidth: Tokens.padding.small property int strokeWidth: Tokens.padding.extraSmall
property int sweepAngle: 360 property int sweepAngle: 360
readonly property real thickness: strokeWidth * (1 + waveAmplitude) * 2 readonly property real thickness: strokeWidth * (1 + waveAmplitude) * 2
property real value property real value
+1 -1
View File
@@ -27,7 +27,7 @@ TextField {
color: Colors.palette.m3primary color: Colors.palette.m3primary
implicitWidth: 2 implicitWidth: 2
radius: Tokens.rounding.normal radius: Tokens.rounding.medium
Behavior on opacity { Behavior on opacity {
Anim { Anim {
+1 -1
View File
@@ -81,7 +81,7 @@ MouseArea {
alwaysRunToEnd: true alwaysRunToEnd: true
duration: Tokens.anim.durations.expressiveSlowEffects * 2 duration: Tokens.anim.durations.expressiveSlowEffects * 2
easing.bezierCurve: Tokens.anim.curves.standard easing: Tokens.anim.standard
property: "circleRadius" property: "circleRadius"
target: root target: root
to: root.endRadius to: root.endRadius
+7 -7
View File
@@ -11,18 +11,18 @@ RowLayout {
required property var greeter required property var greeter
required property real screenHeight required property real screenHeight
spacing: Tokens.spacing.large * 2 spacing: Tokens.spacing.largeIncreased * 2
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
CustomRect { CustomRect {
Layout.fillWidth: true Layout.fillWidth: true
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: weather.implicitHeight implicitHeight: weather.implicitHeight
radius: Tokens.rounding.small radius: Tokens.rounding.small
topLeftRadius: Tokens.rounding.large topLeftRadius: Tokens.rounding.largeIncreased
WeatherInfo { WeatherInfo {
id: weather id: weather
@@ -34,7 +34,7 @@ RowLayout {
CustomClippingRect { CustomClippingRect {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
bottomLeftRadius: Tokens.rounding.large bottomLeftRadius: Tokens.rounding.largeIncreased
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
radius: Tokens.rounding.small radius: Tokens.rounding.small
@@ -51,15 +51,15 @@ RowLayout {
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
CustomRect { CustomRect {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
bottomRightRadius: Tokens.rounding.large bottomRightRadius: Tokens.rounding.largeIncreased
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
radius: Tokens.rounding.small radius: Tokens.rounding.small
topRightRadius: Tokens.rounding.large topRightRadius: Tokens.rounding.largeIncreased
SessionDock { SessionDock {
greeter: root.greeter greeter: root.greeter
+5 -5
View File
@@ -43,7 +43,7 @@ Scope {
ParallelAnimation { ParallelAnimation {
Anim { Anim {
duration: Tokens.anim.durations.expressiveFastSpatial duration: Tokens.anim.durations.expressiveFastSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial easing: Tokens.anim.expressiveFastSpatial
property: "scale" property: "scale"
target: lockContent target: lockContent
to: 1 to: 1
@@ -65,7 +65,7 @@ Scope {
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
property: "scale" property: "scale"
target: content target: content
to: 1 to: 1
@@ -74,12 +74,12 @@ Scope {
Anim { Anim {
property: "radius" property: "radius"
target: lockBg target: lockBg
to: Tokens.rounding.large * 1.5 to: Tokens.rounding.largeIncreased * 1.5
} }
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
property: "implicitWidth" property: "implicitWidth"
target: lockContent target: lockContent
to: (win.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio to: (win.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio
@@ -87,7 +87,7 @@ Scope {
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
property: "implicitHeight" property: "implicitHeight"
target: lockContent target: lockContent
to: (win.screen?.height ?? 0) * Config.lock.sizes.heightMult to: (win.screen?.height ?? 0) * Config.lock.sizes.heightMult
+1 -1
View File
@@ -113,7 +113,7 @@ Item {
Behavior on scale { Behavior on scale {
Anim { Anim {
duration: Tokens.anim.durations.expressiveFastSpatial duration: Tokens.anim.durations.expressiveFastSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial easing: Tokens.anim.expressiveFastSpatial
} }
} }
+5 -10
View File
@@ -13,21 +13,17 @@ import qs.Paths
Singleton { Singleton {
id: root id: root
readonly property M3Palette current: M3Palette { readonly property M3Palette current: M3Palette {}
}
property bool currentLight property bool currentLight
property string flavour property string flavour
readonly property bool light: showPreview ? previewLight : currentLight readonly property bool light: showPreview ? previewLight : currentLight
readonly property M3Palette palette: showPreview ? preview : current readonly property M3Palette palette: showPreview ? preview : current
readonly property M3Palette preview: M3Palette { readonly property M3Palette preview: M3Palette {}
}
property bool previewLight property bool previewLight
property string scheme property string scheme
property bool showPreview property bool showPreview
readonly property M3TPalette tPalette: M3TPalette { readonly property M3TPalette tPalette: M3TPalette {}
} readonly property Transparency transparency: Transparency {}
readonly property Transparency transparency: Transparency {
}
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 {
@@ -112,8 +108,7 @@ Singleton {
function setMode(mode: string): void { function setMode(mode: string): void {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", mode]); Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", mode]);
Config.general.color.mode = mode; Config.colors.mode = mode;
Config.save();
} }
function swapRG(c: color): color { function swapRG(c: color): color {
+8 -8
View File
@@ -13,7 +13,7 @@ ColumnLayout {
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.smaller spacing: Tokens.spacing.small
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
@@ -41,7 +41,7 @@ ColumnLayout {
} }
} }
sourceComponent: ColumnLayout { sourceComponent: ColumnLayout {
spacing: Tokens.spacing.large spacing: Tokens.spacing.largeIncreased
MaterialIcon { MaterialIcon {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
@@ -79,8 +79,8 @@ ColumnLayout {
anchors.left: parent?.left anchors.left: parent?.left
anchors.right: parent?.right anchors.right: parent?.right
implicitHeight: row.implicitHeight + Tokens.padding.normal * 2 implicitHeight: row.implicitHeight + Tokens.padding.small * 2
radius: Tokens.rounding.normal - Tokens.padding.smaller radius: Tokens.rounding.medium - Tokens.padding.small
StateLayer { StateLayer {
onClicked: { onClicked: {
@@ -92,8 +92,8 @@ ColumnLayout {
id: row id: row
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.normal anchors.margins: Tokens.padding.small
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
MaterialIcon { MaterialIcon {
color: session.index === sessions.currentIndex ? Colors.palette.m3onPrimary : Colors.palette.m3onSurfaceVariant color: session.index === sessions.currentIndex ? Colors.palette.m3onPrimary : Colors.palette.m3onSurfaceVariant
@@ -129,13 +129,13 @@ ColumnLayout {
color: Colors.palette.m3primary color: Colors.palette.m3primary
implicitHeight: sessions.currentItem?.implicitHeight ?? 0 implicitHeight: sessions.currentItem?.implicitHeight ?? 0
implicitWidth: sessions.width implicitWidth: sessions.width
radius: Tokens.rounding.normal - Tokens.padding.smaller radius: Tokens.rounding.medium - Tokens.padding.small
y: sessions.currentItem?.y ?? 0 y: sessions.currentItem?.y ?? 0
Behavior on y { Behavior on y {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects easing: Tokens.anim.expressiveDefaultEffects
} }
} }
} }
+9 -9
View File
@@ -14,7 +14,7 @@ ColumnLayout {
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.smaller spacing: Tokens.spacing.small
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
@@ -42,7 +42,7 @@ ColumnLayout {
} }
} }
sourceComponent: ColumnLayout { sourceComponent: ColumnLayout {
spacing: Tokens.spacing.large spacing: Tokens.spacing.largeIncreased
MaterialIcon { MaterialIcon {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
@@ -81,8 +81,8 @@ ColumnLayout {
anchors.left: parent?.left anchors.left: parent?.left
anchors.right: parent?.right anchors.right: parent?.right
implicitHeight: row.implicitHeight + Tokens.padding.normal * 2 implicitHeight: row.implicitHeight + Tokens.padding.small * 2
radius: Tokens.rounding.normal - Tokens.padding.smaller radius: Tokens.rounding.medium - Tokens.padding.small
StateLayer { StateLayer {
onClicked: { onClicked: {
@@ -94,8 +94,8 @@ ColumnLayout {
id: row id: row
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.normal anchors.margins: Tokens.padding.small
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
CustomClippingRect { CustomClippingRect {
Layout.preferredHeight: 50 Layout.preferredHeight: 50
@@ -135,13 +135,13 @@ ColumnLayout {
color: Colors.palette.m3primary color: Colors.palette.m3primary
implicitHeight: users.currentItem?.implicitHeight ?? 0 implicitHeight: users.currentItem?.implicitHeight ?? 0
implicitWidth: users.width implicitWidth: users.width
radius: Tokens.rounding.normal - Tokens.padding.smaller radius: Tokens.rounding.medium - Tokens.padding.small
y: users.currentItem?.y ?? 0 y: users.currentItem?.y ?? 0
Behavior on y { Behavior on y {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.expressiveDefaultEffects
easing.bezierCurve: Tokens.anim.curves.expressiveEffects easing: Tokens.anim.expressiveDefaultEffects
} }
} }
} }
+4 -4
View File
@@ -34,7 +34,7 @@ ColumnLayout {
RowLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.large spacing: Tokens.spacing.largeIncreased
MaterialIcon { MaterialIcon {
animate: true animate: true
@@ -67,7 +67,7 @@ ColumnLayout {
} }
Loader { Loader {
Layout.rightMargin: Tokens.padding.smaller Layout.rightMargin: Tokens.padding.small
active: root.width > 400 active: root.width > 400
visible: active visible: active
@@ -103,12 +103,12 @@ ColumnLayout {
Layout.bottomMargin: Tokens.padding.large * 2 Layout.bottomMargin: Tokens.padding.large * 2
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: Tokens.spacing.smaller Layout.topMargin: Tokens.spacing.small
active: root.rootHeight > 820 active: root.rootHeight > 820
visible: active visible: active
sourceComponent: RowLayout { sourceComponent: RowLayout {
spacing: Tokens.spacing.large spacing: Tokens.spacing.largeIncreased
Repeater { Repeater {
model: { model: {
+8 -6
View File
@@ -9,13 +9,13 @@ Singleton {
id: root id: root
readonly property bool enabled: service.enabled readonly property bool enabled: service.enabled
readonly property int end: Config.general.color.scheduleHyprsunsetEnd readonly property int end: Config.display.nightlight.scheduleEnd
property bool manualToggle: false property bool manualToggle: false
readonly property int start: Config.general.color.scheduleHyprsunsetStart readonly property int start: Config.display.nightlight.scheduleStart
readonly property int temp: Config.general.color.hyprsunsetTemp readonly property int temp: Config.display.nightlight.temp
function checkStartup(): void { function checkStartup(): void {
if (!Config.general.color.scheduleHyprsunset) if (!Config.display.nightlight.schedule)
return; return;
service.apply(); service.apply();
@@ -26,12 +26,14 @@ Singleton {
service.toggle(); service.toggle();
} }
HyprsunsetManager { NightlightManager {
id: service id: service
activeAuto: Config.general.color.scheduleHyprsunset activeAuto: Config.display.nightlight.schedule
endTime: root.end endTime: root.end
startTime: root.start startTime: root.start
temp: root.temp temp: root.temp
fadeDuration: Config.display.nightlight.fadeDuration / 1000
useNativeNightlight: Config.display.nightlight.useNative
} }
} }
+6 -6
View File
@@ -11,14 +11,14 @@ import qs.Services
Singleton { Singleton {
id: root id: root
readonly property int darkEnd: Config.general.color.scheduleDarkEnd readonly property int darkEnd: Config.colors.scheduleDarkEnd
readonly property int darkStart: Config.general.color.scheduleDarkStart readonly property int darkStart: Config.colors.scheduleDarkStart
readonly property bool enabled: Config.general.color.scheduleDark && Config.general.color.schemeGeneration readonly property bool enabled: Config.colors.scheduleDark && Config.colors.schemeGen
function applyDarkMode() { function applyDarkMode() {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", "dark"]); Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", "dark"]);
Config.general.color.mode = "dark"; Config.colors.mode = "dark";
Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", "'prefer-dark'"]); Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", "'prefer-dark'"]);
@@ -30,13 +30,13 @@ Singleton {
function applyLightMode() { function applyLightMode() {
Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", "light"]); Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--mode", "light"]);
Config.general.color.mode = "light"; Config.colors.mode = "light";
Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", "'prefer-light'"]); Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", "'prefer-light'"]);
Quickshell.execDetached(["sh", "-c", `sed -i 's/color_scheme_path=\\(.*\\)Dark.colors/color_scheme_path=\\1Light.colors/' ${Paths.home}/.config/qt6ct/qt6ct.conf`]); Quickshell.execDetached(["sh", "-c", `sed -i 's/color_scheme_path=\\(.*\\)Dark.colors/color_scheme_path=\\1Light.colors/' ${Paths.home}/.config/qt6ct/qt6ct.conf`]);
if (Config.general.color.neovimColors) if (Config.colors.neovimColors)
Quickshell.execDetached(["sed", "-i", "'s/\\(vim.cmd.colorscheme \\).*/\\1\"onelight\"/'", "~/.config/nvim/lua/config/load-colorscheme.lua"]); Quickshell.execDetached(["sed", "-i", "'s/\\(vim.cmd.colorscheme \\).*/\\1\"onelight\"/'", "~/.config/nvim/lua/config/load-colorscheme.lua"]);
} }
+11 -17
View File
@@ -126,33 +126,29 @@ Item {
focus: true focus: true
opacity: 0 opacity: 0
Behavior on opacity {
Anim {
duration: 300
}
}
Behavior on rsx { Behavior on rsx {
enabled: !selectArea.pressed && root.mode === "select" enabled: !selectArea.pressed && root.mode === "select"
ExAnim { ExAnim {}
}
} }
Behavior on rsy { Behavior on rsy {
enabled: !selectArea.pressed && root.mode === "select" enabled: !selectArea.pressed && root.mode === "select"
ExAnim { ExAnim {}
}
} }
Behavior on sh { Behavior on sh {
enabled: !selectArea.pressed && root.mode === "select" enabled: !selectArea.pressed && root.mode === "select"
ExAnim { ExAnim {}
}
} }
Behavior on sw { Behavior on sw {
enabled: !selectArea.pressed && root.mode === "select" enabled: !selectArea.pressed && root.mode === "select"
ExAnim { ExAnim {}
}
Behavior on opacity {
Anim {
duration: 300
} }
} }
@@ -352,8 +348,7 @@ Item {
y: selectionRect.y - root.realBorderWidth y: selectionRect.y - root.realBorderWidth
Behavior on border.color { Behavior on border.color {
Anim { Anim {}
}
} }
} }
@@ -391,7 +386,7 @@ Item {
tool: root.tool tool: root.tool
visible: root.mode === "edit" visible: root.mode === "edit"
x: Math.max(8, Math.min(root.rsx + root.sw / 2 - width / 2, root.screen.width - width - 8)) x: Math.max(8, Math.min(root.rsx + root.sw / 2 - width / 2, root.screen.width - width - 8))
y: (root.rsy + root.sh + height + Tokens.padding.normal <= root.screen.height) ? root.rsy + root.sh + Tokens.padding.normal : (root.rsy - height - Tokens.padding.normal <= 0) ? root.rsy + root.sh - height - Tokens.padding.normal : root.rsy - height - Tokens.padding.normal y: (root.rsy + root.sh + height + Tokens.padding.small <= root.screen.height) ? root.rsy + root.sh + Tokens.padding.small : (root.rsy - height - Tokens.padding.small <= 0) ? root.rsy + root.sh - height - Tokens.padding.small : root.rsy - height - Tokens.padding.small
onCancelRequested: root.cancel() onCancelRequested: root.cancel()
onClearRequested: annotations.clearAll() onClearRequested: annotations.clearAll()
@@ -402,6 +397,5 @@ Item {
onUndoRequested: annotations.undo() onUndoRequested: annotations.undo()
} }
component ExAnim: Anim { component ExAnim: Anim {}
}
} }
+10 -4
View File
@@ -49,9 +49,9 @@ CustomRect {
signal undoRequested signal undoRequested
color: Colors.palette.m3surface color: Colors.palette.m3surface
height: row.implicitHeight + Tokens.padding.normal * 2 height: row.implicitHeight + Tokens.padding.small * 2
radius: Tokens.rounding.full radius: Tokens.rounding.full
width: row.implicitWidth + Tokens.padding.normal * 2 width: row.implicitWidth + Tokens.padding.small * 2
RowLayout { RowLayout {
id: row id: row
@@ -73,6 +73,7 @@ CustomRect {
required property var modelData required property var modelData
color: root.tool === modelData.id ? "#3584e4" : "transparent" color: root.tool === modelData.id ? "#3584e4" : "transparent"
font.pointSize: Tokens.font.size.large
icon: tool.modelData.glyph icon: tool.modelData.glyph
inactiveColor: root.tool === modelData.id ? Colors.palette.m3primary : "transparent" inactiveColor: root.tool === modelData.id ? Colors.palette.m3primary : "transparent"
inactiveOnColor: root.tool === modelData.id ? Colors.palette.m3onPrimary : Colors.palette.m3onSurface inactiveOnColor: root.tool === modelData.id ? Colors.palette.m3onPrimary : Colors.palette.m3onSurface
@@ -98,11 +99,11 @@ CustomRect {
model: root.colorPalette model: root.colorPalette
delegate: IconButton { delegate: IconButton {
readonly property real buttonSize: toolRow.implicitHeight - Tokens.padding.normal readonly property real buttonSize: toolRow.implicitHeight - Tokens.padding.small
required property color modelData required property color modelData
fillWidth: false fillWidth: false
font.pointSize: 0 font.pointSize: Tokens.font.size.large
icon: "" icon: ""
implicitHeight: buttonSize implicitHeight: buttonSize
implicitWidth: buttonSize implicitWidth: buttonSize
@@ -127,6 +128,7 @@ CustomRect {
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
IconButton { IconButton {
font.pointSize: Tokens.font.size.large
icon: "undo" icon: "undo"
inactiveColor: "transparent" inactiveColor: "transparent"
inactiveOnColor: Colors.palette.m3onSurface inactiveOnColor: Colors.palette.m3onSurface
@@ -138,6 +140,7 @@ CustomRect {
} }
IconButton { IconButton {
font.pointSize: Tokens.font.size.large
icon: "delete_history" icon: "delete_history"
inactiveColor: "transparent" inactiveColor: "transparent"
inactiveOnColor: Colors.palette.m3onSurface inactiveOnColor: Colors.palette.m3onSurface
@@ -149,6 +152,7 @@ CustomRect {
} }
IconButton { IconButton {
font.pointSize: Tokens.font.size.large
icon: "content_copy" icon: "content_copy"
inactiveColor: "transparent" inactiveColor: "transparent"
inactiveOnColor: Colors.palette.m3onSurface inactiveOnColor: Colors.palette.m3onSurface
@@ -160,6 +164,7 @@ CustomRect {
} }
IconButton { IconButton {
font.pointSize: Tokens.font.size.large
icon: "delete_forever" icon: "delete_forever"
inactiveColor: "transparent" inactiveColor: "transparent"
inactiveOnColor: Colors.palette.m3onSurface inactiveOnColor: Colors.palette.m3onSurface
@@ -171,6 +176,7 @@ CustomRect {
} }
IconButton { IconButton {
font.pointSize: Tokens.font.size.large
icon: "check" icon: "check"
inactiveColor: "transparent" inactiveColor: "transparent"
inactiveOnColor: Colors.palette.m3onSurface inactiveOnColor: Colors.palette.m3onSurface
+3 -3
View File
@@ -38,7 +38,7 @@ Searcher {
previewPath = path; previewPath = path;
showPreview = true; showPreview = true;
if (Config.general.color.schemeGeneration) if (Config.colors.schemeGen)
previewColorsProc.running = true; previewColorsProc.running = true;
} }
@@ -62,8 +62,8 @@ Searcher {
WallpaperPath.currentWallpaperPath = path; WallpaperPath.currentWallpaperPath = path;
Quickshell.screens.forEach(n => setCrop(n.name, Qt.rect(0, 0, 1, 1), 1.0)); Quickshell.screens.forEach(n => setCrop(n.name, Qt.rect(0, 0, 1, 1), 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.colors.schemeGen)
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.colors.mode}`]);
} }
function stopPreview(): void { function stopPreview(): void {
+1 -1
View File
@@ -16,7 +16,7 @@ Item {
required property bool fullscreen required property bool fullscreen
readonly property bool horizontal: position !== "left" readonly property bool horizontal: position !== "left"
property bool isHovered property bool isHovered
readonly property int padding: Math.max(Tokens.padding.smaller, Config.bar.border) readonly property int padding: Math.max(Tokens.padding.small, Config.bar.border)
required property Wrapper popouts required property Wrapper popouts
required property ClipWrapper popoutsWrapper required property ClipWrapper popoutsWrapper
required property string position required property string position
+12 -16
View File
@@ -44,7 +44,7 @@ WidgetBase {
} }
required property GridLayout loader required property GridLayout loader
required property Wrapper popouts required property Wrapper popouts
readonly property real size: horizontal ? timeText.contentWidth + Tokens.padding.normal * 2 : verticalColumn.implicitHeight + Tokens.padding.larger * 2 readonly property real size: horizontal ? timeText.contentWidth + Tokens.padding.medium * 2 : verticalColumn.implicitHeight + Tokens.padding.medium * 2
required property PersistentProperties visibilities required property PersistentProperties visibilities
color: visibilities.dashboard ? Colors.palette.m3primary : Colors.tPalette.m3surfaceContainer color: visibilities.dashboard ? Colors.palette.m3primary : Colors.tPalette.m3surfaceContainer
@@ -57,14 +57,13 @@ WidgetBase {
anchors.centerIn: parent anchors.centerIn: parent
color: root.contentColor color: root.contentColor
font.family: Config.appearance.font.family.mono // qmllint disable incompatible-type font.family: Config.appearance.font.family.clock // qmllint disable incompatible-type
height: implicitHeight height: implicitHeight
text: Time.dateStr text: Time.dateStr
visible: root.horizontal visible: root.horizontal
Behavior on color { Behavior on color {
CAnim { CAnim {}
}
} }
} }
@@ -72,7 +71,7 @@ WidgetBase {
id: verticalColumn id: verticalColumn
anchors.centerIn: parent anchors.centerIn: parent
spacing: Tokens.padding.small ?? 2 spacing: Tokens.padding.extraSmall ?? 2
visible: !root.horizontal visible: !root.horizontal
width: root.baseSize width: root.baseSize
@@ -84,20 +83,19 @@ WidgetBase {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
color: root.contentColor color: root.contentColor
font.family: Config.appearance.font.family.mono // qmllint disable incompatible-type font.family: Config.appearance.font.family.clock // qmllint disable incompatible-type
text: Qt.formatDateTime(Time.date, modelData) text: Qt.formatDateTime(Time.date, modelData)
Behavior on color { Behavior on color {
CAnim { CAnim {}
}
} }
} }
} }
Rectangle { Rectangle {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.bottomMargin: Tokens.padding.small ?? 2 Layout.bottomMargin: Tokens.padding.extraSmall ?? 2
Layout.topMargin: Tokens.padding.small ?? 2 Layout.topMargin: Tokens.padding.extraSmall ?? 2
color: root.contentColor color: root.contentColor
height: 1 height: 1
implicitWidth: root.baseSize * 0.5 implicitWidth: root.baseSize * 0.5
@@ -114,7 +112,7 @@ WidgetBase {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
color: root.contentColor color: root.contentColor
font.family: Config.appearance.font.family.mono // qmllint disable incompatible-type font.family: Config.appearance.font.family.clock // qmllint disable incompatible-type
text: { text: {
if (modelData.includes("h")) if (modelData.includes("h"))
return Time.hourStr; return Time.hourStr;
@@ -126,8 +124,7 @@ WidgetBase {
} }
Behavior on color { Behavior on color {
CAnim { CAnim {}
}
} }
} }
} }
@@ -135,13 +132,12 @@ WidgetBase {
CustomText { CustomText {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
color: root.contentColor color: root.contentColor
font.family: Config.appearance.font.family.mono // qmllint disable incompatible-type font.family: Config.appearance.font.family.clock // qmllint disable incompatible-type
text: Qt.formatDateTime(Time.date, "AP") text: Qt.formatDateTime(Time.date, "AP")
visible: Config.services.useTwelveHourClock && root.formatParts.timeTokens.length > 0 visible: Config.services.useTwelveHourClock && root.formatParts.timeTokens.length > 0
Behavior on color { Behavior on color {
CAnim { CAnim {}
}
} }
} }
} }
@@ -7,13 +7,13 @@ import qs.Helpers
Row { Row {
id: root id: root
property real batHeight: Tokens.padding.smaller * 2 property real batHeight: Tokens.padding.small * 2
property real batWidth: Tokens.padding.larger * 2 property real batWidth: Tokens.padding.medium * 2
required property string devState required property string devState
property real nubHeight: Tokens.padding.small property real nubHeight: Tokens.padding.extraSmall
property real nubWidth: 2 property real nubWidth: 2
required property real percentage required property real percentage
property real radius: Tokens.rounding.smallest / 2 property real radius: Tokens.rounding.small / 2
spacing: 1 spacing: 1
+6 -6
View File
@@ -12,8 +12,8 @@ WidgetBase {
readonly property string currentMedia: (Players.active?.trackTitle ?? qsTr("No media")) || qsTr("Unknown title") readonly property string currentMedia: (Players.active?.trackTitle ?? qsTr("No media")) || qsTr("Unknown title")
readonly property int textWidth: Math.min(metrics.width, 200) readonly property int textWidth: Math.min(metrics.width, 200)
implicitHeight: horizontal ? baseSize : layout.implicitHeight + Tokens.padding.normal * 2 implicitHeight: horizontal ? baseSize : layout.implicitHeight + Tokens.padding.small * 2
implicitWidth: horizontal ? layout.implicitWidth + Tokens.padding.normal * 2 : baseSize implicitWidth: horizontal ? layout.implicitWidth + Tokens.padding.small * 2 : baseSize
radius: Tokens.rounding.full radius: Tokens.rounding.full
Behavior on implicitHeight { Behavior on implicitHeight {
@@ -39,11 +39,11 @@ WidgetBase {
GridLayout { GridLayout {
id: layout id: layout
anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.normal anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.small
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: root.horizontal ? Tokens.padding.normal : 0 anchors.leftMargin: root.horizontal ? Tokens.padding.small : 0
anchors.rightMargin: root.horizontal ? Tokens.padding.normal : 0 anchors.rightMargin: root.horizontal ? Tokens.padding.small : 0
anchors.topMargin: root.horizontal ? 0 : Tokens.padding.normal anchors.topMargin: root.horizontal ? 0 : Tokens.padding.small
columns: root.horizontal ? -1 : 1 columns: root.horizontal ? -1 : 1
Behavior on implicitWidth { Behavior on implicitWidth {
+2 -2
View File
@@ -22,7 +22,7 @@ GridLayout {
property bool warning: percentage * 100 >= warningThreshold property bool warning: percentage * 100 >= warningThreshold
property int warningThreshold: 80 property int warningThreshold: 80
columnSpacing: Tokens.spacing.smaller columnSpacing: Tokens.spacing.medium
columns: horizontal ? -1 : 1 columns: horizontal ? -1 : 1
percentage: 0 percentage: 0
@@ -49,7 +49,7 @@ GridLayout {
} }
CustomClippingRect { CustomClippingRect {
Layout.preferredHeight: root.horizontal ? icon.implicitHeight - Tokens.padding.small : 4 Layout.preferredHeight: root.horizontal ? icon.implicitHeight - Tokens.padding.extraSmall : 4
Layout.preferredWidth: root.horizontal ? 4 : icon.implicitWidth Layout.preferredWidth: root.horizontal ? 4 : icon.implicitWidth
color: Colors.layer(Colors.palette.m3surfaceContainerHigh, 2) color: Colors.layer(Colors.palette.m3surfaceContainerHigh, 2)
radius: Tokens.rounding.full radius: Tokens.rounding.full
+3 -3
View File
@@ -16,8 +16,8 @@ WidgetBase {
clip: true clip: true
color: visibilities.resources ? Colors.palette.m3primary : Colors.tPalette.m3surfaceContainer color: visibilities.resources ? Colors.palette.m3primary : Colors.tPalette.m3surfaceContainer
implicitHeight: horizontal ? baseSize : gridLayout.implicitHeight + Tokens.padding.normal * 2 implicitHeight: horizontal ? baseSize : gridLayout.implicitHeight + Tokens.padding.medium * 2
implicitWidth: horizontal ? gridLayout.implicitWidth + Tokens.padding.larger * 2 : baseSize implicitWidth: horizontal ? gridLayout.implicitWidth + Tokens.padding.medium * 2 : baseSize
radius: Tokens.rounding.full radius: Tokens.rounding.full
StateLayer { StateLayer {
@@ -32,7 +32,7 @@ WidgetBase {
anchors.centerIn: parent anchors.centerIn: parent
anchors.horizontalCenterOffset: root.horizontal ? 0 : 1 anchors.horizontalCenterOffset: root.horizontal ? 0 : 1
anchors.verticalCenterOffset: root.horizontal ? 0 : -3 anchors.verticalCenterOffset: root.horizontal ? 0 : -3
columnSpacing: Tokens.spacing.smaller columnSpacing: Tokens.spacing.small
columns: root.horizontal ? -1 : 1 columns: root.horizontal ? -1 : 1
ServiceRef { ServiceRef {
+9 -9
View File
@@ -30,8 +30,8 @@ WidgetBase {
return i; return i;
return -1; return -1;
} }
readonly property real size: horizontal ? grid.implicitWidth + Tokens.padding.small * 2 : grid.implicitHeight + Tokens.padding.small * 2 readonly property real size: horizontal ? grid.implicitWidth + grid.anchors.leftMargin + grid.anchors.rightMargin : grid.implicitHeight + grid.anchors.bottomMargin + grid.anchors.topMargin
readonly property int spacing: Tokens.spacing.normal / 2 readonly property int spacing: Tokens.spacing.medium / 2
// Entries that can shrink to nothing, spacing included // Entries that can shrink to nothing, spacing included
function collapsed(entry: var): bool { function collapsed(entry: var): bool {
@@ -40,13 +40,13 @@ WidgetBase {
return false; return false;
} }
bottomLeftRadius: horizontal ? Tokens.rounding.smallest / 2 : Tokens.rounding.full bottomLeftRadius: horizontal ? Tokens.rounding.small / 2 : Tokens.rounding.full
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: horizontal ? baseSize : size implicitHeight: horizontal ? baseSize : size
implicitWidth: horizontal ? size : baseSize implicitWidth: horizontal ? size : baseSize
radius: Tokens.rounding.full radius: Tokens.rounding.full
topLeftRadius: Tokens.rounding.smallest / 2 topLeftRadius: Tokens.rounding.small / 2
topRightRadius: horizontal ? Tokens.rounding.full : Tokens.rounding.smallest / 2 topRightRadius: horizontal ? Tokens.rounding.full : Tokens.rounding.small / 2
Behavior on implicitHeight { Behavior on implicitHeight {
enabled: !root.horizontal enabled: !root.horizontal
@@ -64,11 +64,11 @@ WidgetBase {
GridLayout { GridLayout {
id: grid id: grid
anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.small anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.medium
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: root.horizontal ? Tokens.padding.small : 0 anchors.leftMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.rightMargin: root.horizontal ? Tokens.padding.small : 0 anchors.rightMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.topMargin: root.horizontal ? 0 : Tokens.padding.small anchors.topMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
columns: root.horizontal ? -1 : 1 columns: root.horizontal ? -1 : 1
Repeater { Repeater {
@@ -40,7 +40,7 @@ Item {
anchors.centerIn: parent anchors.centerIn: parent
sourceComponent: BatteryIcon { sourceComponent: BatteryIcon {
devState: Battery.deviceStateString devState: Battery.deviceStateString.toLowerCase()
percentage: Battery.currentPerc percentage: Battery.currentPerc
} }
} }
+10 -5
View File
@@ -16,22 +16,26 @@ WidgetBase {
readonly property alias items: repeater readonly property alias items: repeater
readonly property alias layout: sysGrid readonly property alias layout: sysGrid
required property GridLayout loader required property GridLayout loader
readonly property int padding: Tokens.padding.small readonly property int padding: Tokens.padding.extraSmall
required property Wrapper popouts required property Wrapper popouts
readonly property real size: horizontal ? sysGrid.implicitWidth + Tokens.padding.small : sysGrid.implicitHeight + Tokens.padding.small readonly property real size: horizontal ? sysGrid.implicitWidth + sysGrid.anchors.leftMargin + sysGrid.anchors.rightMargin : sysGrid.implicitHeight + sysGrid.anchors.topMargin + sysGrid.anchors.bottomMargin
bottomLeftRadius: horizontal ? Tokens.rounding.full : Tokens.rounding.smallest / 2 bottomLeftRadius: horizontal ? Tokens.rounding.full : Tokens.rounding.small / 2
bottomRightRadius: Tokens.rounding.smallest / 2 bottomRightRadius: Tokens.rounding.small / 2
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: horizontal ? baseSize : size implicitHeight: horizontal ? baseSize : size
implicitWidth: horizontal ? size : baseSize implicitWidth: horizontal ? size : baseSize
radius: Tokens.rounding.full radius: Tokens.rounding.full
topRightRadius: horizontal ? Tokens.rounding.smallest / 2 : Tokens.rounding.full topRightRadius: horizontal ? Tokens.rounding.small / 2 : Tokens.rounding.full
GridLayout { GridLayout {
id: sysGrid id: sysGrid
anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
anchors.centerIn: parent anchors.centerIn: parent
anchors.leftMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.rightMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.topMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
columns: root.horizontal ? -1 : 1 columns: root.horizontal ? -1 : 1
rowSpacing: -2 rowSpacing: -2
@@ -46,6 +50,7 @@ WidgetBase {
required property int index required property int index
required property SystemTrayItem modelData required property SystemTrayItem modelData
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
implicitHeight: 34 implicitHeight: 34
implicitWidth: 34 implicitWidth: 34
ind: index ind: index
+1 -1
View File
@@ -12,7 +12,7 @@ import qs.Services
Item { Item {
id: root id: root
property real activeWorkspaceMargin: Math.ceil(Tokens.padding.small / 2) property real activeWorkspaceMargin: Math.ceil(Tokens.padding.medium / 4)
readonly property int effectiveActiveWorkspaceId: monitor?.activeWorkspace?.id ?? 1 readonly property int effectiveActiveWorkspaceId: monitor?.activeWorkspace?.id ?? 1
required property bool horizontal required property bool horizontal
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(root.screen) readonly property HyprlandMonitor monitor: Hyprland.monitorFor(root.screen)
+36 -35
View File
@@ -15,12 +15,13 @@ import qs.Services
Item { Item {
id: root id: root
readonly property int rounding: Tokens.rounding.small - Tokens.padding.small readonly property int panelRadius: Tokens.rounding.largeIncreased + Tokens.padding.smaller
readonly property int rounding: panelRadius - Tokens.padding.smaller
readonly property int topMargin: 0 readonly property int topMargin: 0
required property var wrapper required property var wrapper
implicitHeight: vol.implicitHeight + Tokens.padding.small * 2 implicitHeight: vol.implicitHeight + Tokens.padding.smaller * 2
implicitWidth: 500 + Tokens.padding.small * 2 implicitWidth: 500 + Tokens.padding.smaller * 2
CustomRect { CustomRect {
anchors.left: parent.left anchors.left: parent.left
@@ -28,7 +29,7 @@ Item {
anchors.top: parent.top anchors.top: parent.top
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: parent.implicitHeight implicitHeight: parent.implicitHeight
radius: Tokens.rounding.small radius: root.rounding
y: parent.y y: parent.y
Behavior on implicitHeight { Behavior on implicitHeight {
@@ -41,7 +42,7 @@ Item {
id: vol id: vol
anchors.left: parent.left anchors.left: parent.left
anchors.margins: Tokens.padding.small anchors.margins: Tokens.padding.smaller
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
@@ -51,17 +52,17 @@ Item {
CustomRect { CustomRect {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 65 + Tokens.spacing.smaller * 2 Layout.preferredHeight: 65 + Tokens.spacing.small * 2
Layout.topMargin: root.topMargin Layout.topMargin: root.topMargin
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
radius: root.rounding radius: root.rounding - vol.anchors.margins
ColumnLayout { ColumnLayout {
anchors.bottomMargin: Tokens.padding.smaller anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.larger anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.larger anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.smaller anchors.topMargin: Tokens.padding.small
RowLayout { RowLayout {
Layout.fillHeight: true Layout.fillHeight: true
@@ -82,12 +83,12 @@ Item {
} }
RowLayout { RowLayout {
spacing: Tokens.spacing.large spacing: Tokens.spacing.largeIncreased
CustomMouseArea { CustomMouseArea {
Layout.bottomMargin: Tokens.padding.normal Layout.bottomMargin: Tokens.padding.small
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Tokens.padding.larger * 3 Layout.preferredHeight: Tokens.padding.medium * 3
CustomSlider { CustomSlider {
anchors.left: parent.left anchors.left: parent.left
@@ -109,7 +110,7 @@ Item {
} }
CustomSwitch { CustomSwitch {
Layout.bottomMargin: Tokens.padding.normal Layout.bottomMargin: Tokens.padding.small
checked: !Audio.muted checked: !Audio.muted
onToggled: { onToggled: {
@@ -124,10 +125,10 @@ Item {
CustomClippingRect { CustomClippingRect {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 65 + Tokens.spacing.smaller * 2 Layout.preferredHeight: 65 + Tokens.spacing.small * 2
Layout.topMargin: root.topMargin Layout.topMargin: root.topMargin
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
radius: root.rounding radius: root.rounding - vol.anchors.margins
PwNodePeakMonitor { PwNodePeakMonitor {
id: sourcePeak id: sourcePeak
@@ -151,11 +152,11 @@ Item {
} }
ColumnLayout { ColumnLayout {
anchors.bottomMargin: Tokens.padding.smaller anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.larger anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.larger anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.smaller anchors.topMargin: Tokens.padding.small
RowLayout { RowLayout {
Layout.fillHeight: true Layout.fillHeight: true
@@ -176,12 +177,12 @@ Item {
} }
RowLayout { RowLayout {
spacing: Tokens.spacing.large spacing: Tokens.spacing.largeIncreased
CustomMouseArea { CustomMouseArea {
Layout.bottomMargin: Tokens.padding.normal Layout.bottomMargin: Tokens.padding.small
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Tokens.padding.larger * 3 Layout.preferredHeight: Tokens.padding.medium * 3
CustomSlider { CustomSlider {
anchors.left: parent.left anchors.left: parent.left
@@ -203,7 +204,7 @@ Item {
} }
CustomSwitch { CustomSwitch {
Layout.bottomMargin: Tokens.padding.normal Layout.bottomMargin: Tokens.padding.small
checked: !Audio.sourceMuted checked: !Audio.sourceMuted
onToggled: { onToggled: {
@@ -236,10 +237,10 @@ Item {
required property var modelData required property var modelData
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 65 + Tokens.spacing.smaller * 2 Layout.preferredHeight: 65 + Tokens.spacing.small * 2
Layout.topMargin: root.topMargin Layout.topMargin: root.topMargin
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
radius: root.rounding radius: root.rounding - vol.anchors.margins
PwNodePeakMonitor { PwNodePeakMonitor {
id: peak id: peak
@@ -271,11 +272,11 @@ Item {
} }
ColumnLayout { ColumnLayout {
anchors.bottomMargin: Tokens.padding.smaller anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.larger anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.larger anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.smaller anchors.topMargin: Tokens.padding.small
RowLayout { RowLayout {
Layout.fillHeight: true Layout.fillHeight: true
@@ -297,12 +298,12 @@ Item {
} }
RowLayout { RowLayout {
spacing: Tokens.spacing.large spacing: Tokens.spacing.largeIncreased
CustomMouseArea { CustomMouseArea {
Layout.bottomMargin: Tokens.padding.normal Layout.bottomMargin: Tokens.padding.small
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Tokens.padding.larger * 3 Layout.preferredHeight: Tokens.padding.medium * 3
CustomSlider { CustomSlider {
anchors.left: parent.left anchors.left: parent.left
@@ -324,7 +325,7 @@ Item {
} }
CustomSwitch { CustomSwitch {
Layout.bottomMargin: Tokens.padding.normal Layout.bottomMargin: Tokens.padding.small
checked: !appBox.modelData.audio.muted checked: !appBox.modelData.audio.muted
onToggled: { onToggled: {
+3 -2
View File
@@ -58,7 +58,7 @@ Item {
Anim { Anim {
duration: content.animLength duration: content.animLength
easing.bezierCurve: content.animCurve easing: content.animCurve
} }
} }
Behavior on y { Behavior on y {
@@ -66,7 +66,7 @@ Item {
Anim { Anim {
duration: content.animLength duration: content.animLength
easing.bezierCurve: content.animCurve easing: content.animCurve
} }
} }
@@ -81,6 +81,7 @@ Item {
anchors.top: root.position === "top" ? parent.top : undefined anchors.top: root.position === "top" ? parent.top : undefined
anchors.topMargin: (-implicitHeight - 5) * root.offsetScale anchors.topMargin: (-implicitHeight - 5) * root.offsetScale
anchors.verticalCenter: root.horizontal ? undefined : parent.verticalCenter anchors.verticalCenter: root.horizontal ? undefined : parent.verticalCenter
horizontal: root.horizontal
offsetScale: root.offsetScale offsetScale: root.offsetScale
screen: root.screen screen: root.screen
} }
+5 -3
View File
@@ -11,10 +11,11 @@ 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 bool horizontal
required property PopoutState popouts required property PopoutState popouts
implicitHeight: (currentPopout?.implicitHeight ?? 0) + Tokens.padding.small * 2 implicitHeight: (currentPopout?.implicitHeight ?? 0) + Tokens.padding.smaller * 2
implicitWidth: (currentPopout?.implicitWidth ?? 0) + Tokens.padding.small * 2 implicitWidth: (currentPopout?.implicitWidth ?? 0) + Tokens.padding.smaller * 2
Item { Item {
id: content id: content
@@ -69,6 +70,7 @@ Item {
name: "upower" name: "upower"
sourceComponent: UPowerPopout { sourceComponent: UPowerPopout {
horizontal: root.horizontal
} }
} }
@@ -99,7 +101,7 @@ Item {
anchors.centerIn: opacity === 1 ? undefined : parent anchors.centerIn: opacity === 1 ? undefined : parent
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.top: opacity === 1 ? parent.top : undefined anchors.top: opacity === 1 ? parent.top : undefined
anchors.topMargin: 5 anchors.topMargin: Tokens.padding.smaller
opacity: 0 opacity: 0
scale: 0.8 scale: 0.8
+14 -14
View File
@@ -15,7 +15,7 @@ StackView {
id: root id: root
readonly property int itemHeight: 30 readonly property int itemHeight: 30
readonly property int panelRadius: ((itemHeight / 2) + Tokens.padding.small) * Tokens.rounding.scale readonly property int panelRadius: ((itemHeight / 2) + Tokens.padding.extraSmall) * Tokens.rounding.scale
required property PopoutState popouts required property PopoutState popouts
property int rootWidth: 0 property int rootWidth: 0
required property QsMenuHandle trayItem required property QsMenuHandle trayItem
@@ -88,10 +88,10 @@ StackView {
required property QsMenuEntry modelData required property QsMenuEntry modelData
Layout.fillWidth: true Layout.fillWidth: true
Layout.leftMargin: modelData.isSeparator ? Tokens.padding.normal : 0 Layout.leftMargin: modelData?.isSeparator ?? false ? Tokens.padding.small : 0
Layout.rightMargin: modelData.isSeparator ? Tokens.padding.normal : 0 Layout.rightMargin: modelData?.isSeparator ?? false ? Tokens.padding.small : 0
color: modelData.isSeparator ? Colors.palette.m3outlineVariant : "transparent" color: modelData?.isSeparator ?? false ? Colors.palette.m3outlineVariant : "transparent"
implicitHeight: modelData.isSeparator ? (visible ? 1 : 0) : childrenLoader.item.implicitHeight implicitHeight: modelData?.isSeparator ?? false ? (visible ? 1 : 0) : childrenLoader.item?.implicitHeight ?? 0
implicitWidth: childrenLoader.item?.implicitWidth ?? 0 implicitWidth: childrenLoader.item?.implicitWidth ?? 0
radius: Tokens.rounding.full radius: Tokens.rounding.full
visible: index !== (menuOpener.children.values.length - 1) ? true : (modelData.isSeparator ? false : true) visible: index !== (menuOpener.children.values.length - 1) ? true : (modelData.isSeparator ? false : true)
@@ -99,18 +99,18 @@ StackView {
Loader { Loader {
id: childrenLoader id: childrenLoader
active: !item.modelData.isSeparator active: !item.modelData?.isSeparator ?? false
anchors.fill: parent anchors.fill: parent
asynchronous: true asynchronous: true
sourceComponent: Item { sourceComponent: Item {
property int iconWidth: icon.active ? icon.width + Tokens.spacing.normal + icon.anchors.rightMargin : 0 property int iconWidth: icon.active ? icon.width + Tokens.spacing.medium + icon.anchors.rightMargin : 0
implicitHeight: root.itemHeight implicitHeight: root.itemHeight
implicitWidth: label.width + label.anchors.leftMargin * 2 + iconWidth + (expand.item?.width ?? 0) implicitWidth: label.width + label.anchors.leftMargin * 2 + iconWidth + (expand.item?.width ?? 0)
StateLayer { StateLayer {
enabled: item.modelData.enabled enabled: item.modelData?.enabled ?? false
radius: item.radius radius: item.radius
onClicked: { onClicked: {
@@ -130,7 +130,7 @@ StackView {
Loader { Loader {
id: icon id: icon
active: item.modelData.icon !== "" active: item.modelData?.icon ?? "" !== ""
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 10 anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
@@ -144,7 +144,7 @@ StackView {
id: iconImage id: iconImage
implicitSize: parent.implicitHeight implicitSize: parent.implicitHeight
source: item.modelData.icon source: item.modelData?.icon ?? Qt.url("")
visible: false visible: false
} }
@@ -163,20 +163,20 @@ StackView {
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 10 anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: item.modelData.enabled ? Colors.palette.m3onSurface : Colors.palette.m3outline color: item.modelData?.enabled ?? false ? Colors.palette.m3onSurface : Colors.palette.m3outline
text: item.modelData.text text: item.modelData?.text ?? ""
} }
Loader { Loader {
id: expand id: expand
active: item.modelData.hasChildren active: item.modelData?.hasChildren ?? false
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
asynchronous: true asynchronous: true
sourceComponent: MaterialIcon { sourceComponent: MaterialIcon {
color: item.modelData.enabled ? Colors.palette.m3onSurface : Colors.palette.m3outline color: item.modelData?.enabled ?? false ? Colors.palette.m3onSurface : Colors.palette.m3outline
text: "chevron_right" text: "chevron_right"
} }
} }
+18 -10
View File
@@ -12,9 +12,10 @@ import qs.Services
Column { Column {
id: root id: root
readonly property int panelRadius: ((profiles.height / 2) + Tokens.padding.small) * Tokens.rounding.scale required property bool horizontal
readonly property int panelRadius: ((profiles.height / 2) + Tokens.padding.extraSmall) * Tokens.rounding.scale
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
Loader { Loader {
active: Battery.isLaptop active: Battery.isLaptop
@@ -24,6 +25,13 @@ Column {
} }
} }
Item {
id: padding
implicitHeight: root.horizontal ? 0 : Tokens.padding.small
implicitWidth: 1
}
Repeater { Repeater {
model: Battery.allPeripherals model: Battery.allPeripherals
@@ -33,9 +41,9 @@ Column {
required property var modelData required property var modelData
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: Tokens.padding.normal anchors.leftMargin: Tokens.padding.small
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: Tokens.padding.normal anchors.rightMargin: Tokens.padding.small
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
@@ -67,7 +75,7 @@ Column {
} }
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: Tokens.padding.normal anchors.leftMargin: Tokens.padding.small
text: Battery.isLaptop ? qsTr("Time %1: %2").arg(Battery.onBattery ? "remaining" : "until charged").arg(Battery.onBattery ? formatSeconds(Battery.timeToEmpty, "Calculating...") : formatSeconds(Battery.timeToFull, "Fully charged!")) : qsTr("Power profile: %1").arg(PowerProfile.toString(PowerProfiles.profile)) text: Battery.isLaptop ? qsTr("Time %1: %2").arg(Battery.onBattery ? "remaining" : "until charged").arg(Battery.onBattery ? formatSeconds(Battery.timeToEmpty, "Calculating...") : formatSeconds(Battery.timeToFull, "Fully charged!")) : qsTr("Power profile: %1").arg(PowerProfile.toString(PowerProfiles.profile))
} }
@@ -80,8 +88,8 @@ Column {
sourceComponent: CustomRect { sourceComponent: CustomRect {
color: Colors.palette.m3error color: Colors.palette.m3error
implicitHeight: child.implicitHeight + Tokens.padding.large implicitHeight: child.implicitHeight + Tokens.padding.large
implicitWidth: child.implicitWidth + Tokens.padding.larger * 2 implicitWidth: child.implicitWidth + Tokens.padding.small * 2
radius: Tokens.rounding.large radius: Tokens.rounding.largeIncreased
Column { Column {
id: child id: child
@@ -138,7 +146,7 @@ Column {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: indicator.height + Tokens.padding.extraSmall * 2 implicitHeight: indicator.height + Tokens.padding.extraSmall * 2
implicitWidth: saver.implicitHeight + balance.implicitHeight + perf.implicitHeight + Tokens.padding.larger * 2 + Tokens.spacing.small * 8 implicitWidth: saver.implicitHeight + balance.implicitHeight + perf.implicitHeight + Tokens.padding.small * 2 + Tokens.spacing.small * 8
radius: Tokens.rounding.full radius: Tokens.rounding.full
CustomRect { CustomRect {
@@ -219,8 +227,8 @@ Column {
required property string icon required property string icon
required property int profile required property int profile
implicitHeight: icon.implicitHeight + Tokens.padding.small implicitHeight: icon.implicitHeight + Tokens.padding.extraSmall
implicitWidth: icon.implicitHeight + Tokens.padding.small implicitWidth: icon.implicitHeight + Tokens.padding.extraSmall
StateLayer { StateLayer {
color: profiles.current === parent.icon ? Colors.palette.m3onPrimary : Colors.palette.m3onSurface color: profiles.current === parent.icon ? Colors.palette.m3onPrimary : Colors.palette.m3onSurface
+8 -8
View File
@@ -13,13 +13,13 @@ CustomClippingRect {
id: root id: root
readonly property bool hasUpdates: Object.keys(Updates.updates)?.length > 0 readonly property bool hasUpdates: Object.keys(Updates.updates)?.length > 0
readonly property int itemHeight: 50 + Tokens.padding.smaller * 2 readonly property int itemHeight: 50 + Tokens.padding.small * 2
required property var wrapper required property var wrapper
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: hasUpdates ? updatesListLoader.item?.implicitHeight + Tokens.padding.small * 2 : noUpdatesLoader.item.height implicitHeight: hasUpdates ? updatesListLoader.item?.implicitHeight + Tokens.padding.extraSmall * 2 : noUpdatesLoader.item.height
implicitWidth: hasUpdates ? updatesListLoader.item?.contentWidth + Tokens.padding.small * 2 : noUpdatesLoader.item.width implicitWidth: hasUpdates ? updatesListLoader.item?.contentWidth + Tokens.padding.extraSmall * 2 : noUpdatesLoader.item.width
radius: Tokens.rounding.small radius: Tokens.rounding.large - Tokens.padding.smaller
Loader { Loader {
id: noUpdatesLoader id: noUpdatesLoader
@@ -70,7 +70,7 @@ CustomClippingRect {
displayMarginEnd: root.itemHeight displayMarginEnd: root.itemHeight
implicitHeight: Math.min(contentHeight, (root.itemHeight + spacing) * 5 - spacing) implicitHeight: Math.min(contentHeight, (root.itemHeight + spacing) * 5 - spacing)
implicitWidth: contentWidth implicitWidth: contentWidth
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
delegate: CustomRect { delegate: CustomRect {
id: update id: update
@@ -81,12 +81,12 @@ CustomClippingRect {
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: root.itemHeight implicitHeight: root.itemHeight
implicitWidth: 600 implicitWidth: 600
radius: Tokens.rounding.small - Tokens.padding.small radius: root.radius - Tokens.padding.extraSmall
RowLayout { RowLayout {
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.smaller anchors.rightMargin: Tokens.padding.small
MaterialIcon { MaterialIcon {
font.pointSize: Tokens.font.size.large * 2 font.pointSize: Tokens.font.size.large * 2
+5 -3
View File
@@ -8,7 +8,7 @@ import ZShell.Config
Item { Item {
id: root id: root
property list<real> animCurve: Tokens.anim.curves.expressiveDefaultSpatial property var animCurve: Tokens.anim.expressiveDefaultSpatial
property int animLength: Tokens.anim.durations.expressiveDefaultSpatial property int animLength: Tokens.anim.durations.expressiveDefaultSpatial
readonly property alias content: content readonly property alias content: content
readonly property Item current: (content.item as Content)?.current ?? null readonly property Item current: (content.item as Content)?.current ?? null
@@ -16,6 +16,7 @@ Item {
property alias currentName: popoutState.currentName property alias currentName: popoutState.currentName
property string detachedMode property string detachedMode
property alias hasCurrent: popoutState.hasCurrent property alias hasCurrent: popoutState.hasCurrent
required property bool horizontal
readonly property real nonAnimHeight: content.implicitHeight || 150 readonly property real nonAnimHeight: content.implicitHeight || 150
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
@@ -35,7 +36,7 @@ Item {
Anim { Anim {
duration: root.animLength duration: root.animLength
easing.bezierCurve: root.animCurve easing: root.animCurve
} }
} }
Behavior on implicitWidth { Behavior on implicitWidth {
@@ -43,7 +44,7 @@ Item {
Anim { Anim {
duration: root.animLength duration: root.animLength
easing.bezierCurve: root.animCurve easing: root.animCurve
} }
} }
@@ -58,6 +59,7 @@ Item {
shouldBeActive: root.hasCurrent shouldBeActive: root.hasCurrent
sourceComponent: Content { sourceComponent: Content {
horizontal: root.horizontal
popouts: popoutState popouts: popoutState
} }
} }
+9 -9
View File
@@ -59,7 +59,7 @@ Item {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: entries.right anchors.left: entries.right
anchors.leftMargin: Tokens.spacing.normal anchors.leftMargin: Tokens.spacing.medium
anchors.top: parent.top anchors.top: parent.top
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitWidth: ClipHistory.previewIsImage ? Math.max(Math.min(imagePreview.sourceSize.width + Tokens.padding.large * 2, Config.clipboard.sizes.previewWidth), Config.clipboard.sizes.minPreviewWidth) : Math.max(Math.min(textPreviewColumn.width + textPreviewColumn.anchors.margins * 2, Config.clipboard.sizes.previewWidth), Config.clipboard.sizes.minPreviewWidth) implicitWidth: ClipHistory.previewIsImage ? Math.max(Math.min(imagePreview.sourceSize.width + Tokens.padding.large * 2, Config.clipboard.sizes.previewWidth), Config.clipboard.sizes.minPreviewWidth) : Math.max(Math.min(textPreviewColumn.width + textPreviewColumn.anchors.margins * 2, Config.clipboard.sizes.previewWidth), Config.clipboard.sizes.minPreviewWidth)
@@ -75,7 +75,7 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 0 anchors.leftMargin: 0
anchors.margins: Tokens.padding.normal anchors.margins: Tokens.padding.small
anchors.top: parent.top anchors.top: parent.top
visible: !ClipHistory.previewIsImage visible: !ClipHistory.previewIsImage
@@ -90,7 +90,7 @@ Item {
required property int index required property int index
required property var modelData required property var modelData
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
CustomRect { CustomRect {
color: lineRow.index % 2 ? Colors.tPalette.m3surfaceContainer : "transparent" color: lineRow.index % 2 ? Colors.tPalette.m3surfaceContainer : "transparent"
@@ -192,7 +192,7 @@ Item {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.top: search.bottom anchors.top: search.bottom
anchors.topMargin: Tokens.spacing.normal anchors.topMargin: Tokens.spacing.medium
implicitWidth: Config.clipboard.sizes.width implicitWidth: Config.clipboard.sizes.width
CustomListView { CustomListView {
@@ -204,7 +204,7 @@ Item {
highlightRangeMode: ListView.ApplyRange highlightRangeMode: ListView.ApplyRange
preferredHighlightBegin: 0 preferredHighlightBegin: 0
preferredHighlightEnd: height preferredHighlightEnd: height
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
CustomScrollBar.vertical: CustomScrollBar { CustomScrollBar.vertical: CustomScrollBar {
flickable: view flickable: view
@@ -250,7 +250,7 @@ Item {
id: icon id: icon
anchors.left: parent.left anchors.left: parent.left
anchors.margins: Tokens.padding.normal anchors.margins: Tokens.padding.small
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
font.pointSize: Tokens.font.size.large font.pointSize: Tokens.font.size.large
text: clipItem.isImage ? "image" : "text_fields" text: clipItem.isImage ? "image" : "text_fields"
@@ -260,7 +260,7 @@ Item {
id: text id: text
anchors.left: icon.right anchors.left: icon.right
anchors.margins: Tokens.spacing.normal anchors.margins: Tokens.spacing.medium
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
elide: Text.ElideRight elide: Text.ElideRight
text: clipItem.isImage ? qsTr("Image") : ClipHistory.displayText(clipItem.modelData) text: clipItem.isImage ? qsTr("Image") : ClipHistory.displayText(clipItem.modelData)
@@ -292,7 +292,7 @@ Item {
IconButton { IconButton {
Layout.fillHeight: true Layout.fillHeight: true
Layout.margins: Tokens.padding.normal Layout.margins: Tokens.padding.small
Layout.preferredWidth: height Layout.preferredWidth: height
icon: "delete" icon: "delete"
inactiveColor: Qt.alpha(Colors.palette.m3error, 0.8) inactiveColor: Qt.alpha(Colors.palette.m3error, 0.8)
@@ -320,7 +320,7 @@ Item {
Behavior on y { Behavior on y {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects easing: Tokens.anim.expressiveDefaultEffects
} }
} }
} }
+3 -3
View File
@@ -15,15 +15,15 @@ Item {
required property PersistentProperties visibilities required property PersistentProperties visibilities
anchors.bottomMargin: (-implicitHeight - 5) * offsetScale anchors.bottomMargin: (-implicitHeight - 5) * offsetScale
implicitHeight: content.implicitHeight + Tokens.padding.normal * 2 implicitHeight: content.implicitHeight + Tokens.padding.small * 2
implicitWidth: content.implicitWidth + Tokens.padding.normal * 2 || 400 implicitWidth: content.implicitWidth + Tokens.padding.small * 2 || 400
opacity: 1 - offsetScale opacity: 1 - offsetScale
visible: offsetScale < 1 visible: offsetScale < 1
Behavior on offsetScale { Behavior on offsetScale {
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
} }
} }
+2 -2
View File
@@ -32,11 +32,11 @@ Item {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.margins: Tokens.padding.smaller anchors.margins: Tokens.padding.small
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
color: "transparent" color: "transparent"
radius: Tokens.rounding.normal - anchors.margins radius: Tokens.rounding.extraLarge - anchors.margins
Item { Item {
id: view id: view
+5 -4
View File
@@ -13,11 +13,11 @@ GridLayout {
required property PersistentProperties dashState required property PersistentProperties dashState
readonly property bool dashboardVisible: visibilities.dashboard readonly property bool dashboardVisible: visibilities.dashboard
property int radius: Tokens.rounding.smallest property int radius: Tokens.rounding.medium
required property PersistentProperties visibilities required property PersistentProperties visibilities
columnSpacing: Tokens.spacing.smaller columnSpacing: Tokens.spacing.small
rowSpacing: Tokens.spacing.smaller rowSpacing: Tokens.spacing.small
ParallelAnimation { ParallelAnimation {
id: openAnim id: openAnim
@@ -104,12 +104,13 @@ GridLayout {
} }
} }
Rect { CustomClippingRect {
Layout.column: 0 Layout.column: 0
Layout.columnSpan: 5 Layout.columnSpan: 5
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: media.implicitHeight Layout.preferredHeight: media.implicitHeight
Layout.row: 2 Layout.row: 2
color: Colors.tPalette.m3surfaceContainer
radius: root.radius radius: root.radius
Media { Media {
+4 -4
View File
@@ -132,7 +132,7 @@ CustomMouseArea {
IconButton { IconButton {
icon: "chevron_left" icon: "chevron_left"
padding: Tokens.padding.small padding: Tokens.padding.extraSmall
type: IconButton.Text type: IconButton.Text
onClicked: root.dashState.currentDate = new Date(root.realCurrYear, root.realCurrMonth - 1, 1) onClicked: root.dashState.currentDate = new Date(root.realCurrYear, root.realCurrMonth - 1, 1)
@@ -150,7 +150,7 @@ CustomMouseArea {
const now = new Date(); const now = new Date();
return root.realCurrMonth !== now.getMonth() || root.realCurrYear !== now.getFullYear(); return root.realCurrMonth !== now.getMonth() || root.realCurrYear !== now.getFullYear();
} }
radius: pressed ? Tokens.rounding.small : Tokens.rounding.large radius: pressed ? Tokens.rounding.small : Tokens.rounding.largeIncreased
Behavior on radius { Behavior on radius {
Anim { Anim {
@@ -203,7 +203,7 @@ CustomMouseArea {
IconButton { IconButton {
icon: "chevron_right" icon: "chevron_right"
padding: Tokens.padding.small padding: Tokens.padding.extraSmall
type: IconButton.Text type: IconButton.Text
onClicked: root.dashState.currentDate = new Date(root.realCurrYear, root.realCurrMonth + 1, 1) onClicked: root.dashState.currentDate = new Date(root.realCurrYear, root.realCurrMonth + 1, 1)
@@ -259,7 +259,7 @@ CustomMouseArea {
required property var model required property var model
implicitHeight: text.implicitHeight + Tokens.padding.normal * 2 implicitHeight: text.implicitHeight + Tokens.padding.small * 2
implicitWidth: implicitHeight implicitWidth: implicitHeight
CustomText { CustomText {
+25 -46
View File
@@ -9,6 +9,7 @@ import QtQuick.Effects
import ZShell.Components import ZShell.Components
import ZShell.Services import ZShell.Services
import ZShell.Config import ZShell.Config
import qs.Modules.Dashboard.Dash.Media
import qs.Daemons import qs.Daemons
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
@@ -25,7 +26,7 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
implicitHeight: layout.implicitHeight implicitHeight: layout.implicitHeight + layout.anchors.margins * 2
function lengthStr(length: int): string { function lengthStr(length: int): string {
if (length < 0) if (length < 0)
return "-1:-1"; return "-1:-1";
@@ -57,14 +58,18 @@ Item {
service: Audio.cava service: Audio.cava
} }
BackgroundShapes {
anchors.fill: parent
}
Shape { Shape {
id: visualizer id: visualizer
readonly property int bars: Config.services.visualizerBars readonly property int bars: Config.services.visualizerBars
property color color: Colors.palette.m3tertiary property color color: Qt.alpha(Colors.palette.m3primary, 0.5)
property color fillColor: Qt.alpha(color, 0.25) property color fillColor: Qt.alpha(color, 0.1)
anchors.fill: layout anchors.fill: parent
anchors.leftMargin: -(shape.strokeWidth / 2) anchors.leftMargin: -(shape.strokeWidth / 2)
layer.enabled: true layer.enabled: true
asynchronous: true asynchronous: true
@@ -87,15 +92,15 @@ Item {
if (n < 2) if (n < 2)
return ""; return "";
const h = layout.height + shape.strokeWidth / 2; const h = root.height + shape.strokeWidth / 2;
const w = layout.width + shape.strokeWidth; const w = root.width + shape.strokeWidth;
function x(i) { function x(i) {
return i * w / (n - 1); return i * w / (n - 1);
} }
function y(i) { function y(i) {
return h - values[i] * Config.dashboard.sizes.mediaVisualizerSize; return h - (values[i] * Config.dashboard.sizes.mediaVisualizerSize) / 2;
} }
let d = `M 0 ${h} `; let d = `M 0 ${h} `;
@@ -142,48 +147,21 @@ Item {
RowLayout { RowLayout {
id: layout id: layout
anchors.left: parent.left anchors.fill: parent
anchors.right: parent.right anchors.margins: Tokens.padding.large
anchors.leftMargin: Tokens.padding.extraLarge
CustomClippingRect { CoverVisualizer {
id: cover Layout.fillHeight: true
implicitWidth: Config.dashboard.sizes.mediaCoverArtSize
Layout.alignment: Qt.AlignLeft
Layout.bottomMargin: Tokens.padding.large + Config.dashboard.sizes.mediaProgressThickness + Tokens.spacing.small
Layout.leftMargin: Tokens.padding.large + Config.dashboard.sizes.mediaProgressThickness + Tokens.spacing.small
Layout.preferredHeight: Config.dashboard.sizes.mediaCoverArtSize
Layout.preferredWidth: Config.dashboard.sizes.mediaCoverArtSize
Layout.topMargin: Tokens.padding.large + Config.dashboard.sizes.mediaProgressThickness + Tokens.spacing.small
color: Colors.tPalette.m3surfaceContainerHigh
radius: Infinity
MaterialIcon {
anchors.centerIn: parent
color: Colors.palette.m3onSurfaceVariant
font.pointSize: (parent.width * 0.4) || 1
grade: 200
text: "art_track"
}
Image {
id: image
anchors.fill: parent
asynchronous: true
fillMode: Image.PreserveAspectCrop
source: Players.active?.trackArtUrl ?? ""
sourceSize.height: Math.floor(height)
sourceSize.width: Math.floor(width)
}
} }
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.leftMargin: Tokens.spacing.large Layout.leftMargin: Tokens.spacing.largeIncreased
Layout.rightMargin: Tokens.spacing.large Layout.rightMargin: Tokens.spacing.largeIncreased
Layout.preferredHeight: childrenRect.height
spacing: Tokens.spacing.normal spacing: Tokens.spacing.small
MarqueeText { MarqueeText {
id: title id: title
@@ -222,7 +200,7 @@ Item {
RowLayout { RowLayout {
id: positionSliderLayout id: positionSliderLayout
Layout.topMargin: Tokens.spacing.extraLargeIncreased Layout.topMargin: Tokens.spacing.large
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
@@ -289,7 +267,6 @@ Item {
checked: Players.active?.shuffle ?? false checked: Players.active?.shuffle ?? false
enabled: Players.active?.shuffleSupported enabled: Players.active?.shuffleSupported
onClicked: Players.active.shuffle = !Players.active?.shuffle onClicked: Players.active.shuffle = !Players.active?.shuffle
implicitWidth: Math.round(implicitHeight * 0.9)
} }
IconButton { IconButton {
@@ -301,6 +278,7 @@ Item {
shapeMorph: true shapeMorph: true
enabled: Players.active?.canGoPrevious enabled: Players.active?.canGoPrevious
onClicked: Players.active?.previous() onClicked: Players.active?.previous()
font.pointSize: Tokens.font.size.large
} }
IconButton { IconButton {
@@ -313,6 +291,7 @@ Item {
checked: Players.active?.isPlaying ?? false checked: Players.active?.isPlaying ?? false
enabled: Players.active?.canTogglePlaying enabled: Players.active?.canTogglePlaying
onClicked: Players.active?.togglePlaying() onClicked: Players.active?.togglePlaying()
font.pointSize: Tokens.font.size.large
} }
IconButton { IconButton {
@@ -324,6 +303,7 @@ Item {
shapeMorph: true shapeMorph: true
enabled: Players.active?.canGoNext enabled: Players.active?.canGoNext
onClicked: Players.active?.next() onClicked: Players.active?.next()
font.pointSize: Tokens.font.size.large
} }
IconButton { IconButton {
@@ -342,7 +322,6 @@ Item {
else else
Players.active.loopState = MprisLoopState.None; Players.active.loopState = MprisLoopState.None;
} }
implicitWidth: Math.round(implicitHeight * 0.9)
} }
} }
} }
@@ -0,0 +1,97 @@
pragma ComponentBehavior: Bound
import QtQuick
import M3Shapes
import qs.Components
import qs.Services
import qs.Helpers
Item {
id: root
property int count: 14
property list<real> darkOpacities: [0.10, 0.20, 0.10, 0.20]
property list<real> lightOpacities: [0.34, 0.34, 0.08, 0.2]
property real maxRotSpeed: 12
property real maxSize: 124
property real maxSpeed: 18
property real minRotSpeed: -12
property real minSize: 36
property real minSpeed: 4
readonly property list<int> shapePool: [MaterialShape.Circle, MaterialShape.Cookie4Sided, MaterialShape.Cookie6Sided, MaterialShape.Cookie7Sided, MaterialShape.Cookie9Sided, MaterialShape.Cookie12Sided, MaterialShape.Sunny, MaterialShape.VerySunny, MaterialShape.SoftBurst, MaterialShape.Pentagon, MaterialShape.Gem, MaterialShape.Arch, MaterialShape.Arrow, MaterialShape.Pill, MaterialShape.Triangle, MaterialShape.Fan, MaterialShape.Oval]
function rand(min: real, max: real): real {
return min + Math.random() * (max - min);
}
function signedRand(min: real, max: real): real {
return rand(min, max) * (Math.random() < 0.5 ? -1 : 1);
}
Component.onCompleted: shapes.model = count
Repeater {
id: shapes
DriftingShape {
}
}
FrameAnimation {
running: root.visible && root.width > 0 && root.height > 0 && (Players.active?.isPlaying ?? false)
onTriggered: {
const dt = frameTime;
for (let i = 0; i < shapes.count; i++) {
const s = shapes.itemAt(i) as DriftingShape;
if (!s)
continue;
s.x += s.vx * dt;
s.y += s.vy * dt;
s.rotation += s.vr * dt;
if (s.x + s.width < 0)
s.x = root.width;
else if (s.x > root.width)
s.x = -s.width;
if (s.y + s.height < 0)
s.y = root.height;
else if (s.y > root.height)
s.y = -s.height;
}
}
}
component DriftingShape: MaterialShape {
id: shapeItem
readonly property int colorIdx: Math.floor(Math.random() * 4)
required property int index
property real vr: root.rand(root.minRotSpeed, root.maxRotSpeed)
property real vx: root.signedRand(root.minSpeed, root.maxSpeed)
property real vy: root.signedRand(root.minSpeed, root.maxSpeed)
color: [Colors.palette.m3primaryContainer, Colors.palette.m3secondaryContainer, Colors.palette.m3tertiaryContainer, Colors.palette.m3outlineVariant][colorIdx]
implicitSize: root.minSize + (index / root.count) * (root.maxSize - root.minSize)
opacity: Colors.light ? root.lightOpacities[colorIdx] : root.darkOpacities[colorIdx]
rotation: root.rand(0, 360)
shape: root.shapePool[Math.floor(Math.random() * root.shapePool.length)]
Behavior on color {
CAnim {
}
}
Behavior on opacity {
Anim {
type: Anim.SlowEffects
}
}
Component.onCompleted: {
x = root.rand(0, root.width - implicitSize);
y = root.rand(0, root.height - implicitSize);
}
}
}
+100
View File
@@ -0,0 +1,100 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Effects
import M3Shapes
import qs.Helpers
import qs.Effects
import qs.Components
import qs.Services
Item {
id: root
property color fallbackColor: Colors.layer(Colors.palette.m3surfaceContainerHighest, 2)
property bool hadPrevious
readonly property alias shape: shape
layer.enabled: true
Behavior on fallbackColor {
CAnim {
}
}
layer.effect: MultiEffect {
blurMax: 1
shadowColor: Colors.palette.m3outline
shadowEnabled: true
shadowOpacity: 0.3
}
Item {
id: shapeWrapper
anchors.fill: parent
layer.enabled: true
opacity: root.fallbackColor.a
MaterialShape {
id: shape
color: Qt.alpha(root.fallbackColor, 1)
implicitSize: root.width
shape: MaterialShape.Cookie12Sided
Anim on rotation {
duration: 23500
easing.type: Easing.Linear
from: 360
loops: Animation.Infinite
paused: !Players.active?.isPlaying
running: true
to: 0
}
}
}
MaterialIcon {
anchors.centerIn: parent
animate: true
color: Colors.palette.m3onSurfaceVariant
grade: 200
opacity: image.status === Image.Null || image.status === Image.Error ? 1 : 0
text: image.status === Image.Error ? "broken_image" : "art_track"
Behavior on opacity {
Anim {
type: Anim.DefaultEffects
}
}
}
Loader {
active: opacity > 0
anchors.centerIn: parent
asynchronous: true
opacity: image.status === Image.Loading ? 1 : 0
Behavior on opacity {
Anim {
type: Anim.DefaultEffects
}
}
sourceComponent: LoadingIndicator {
color: Colors.palette.m3primaryContainer
implicitSize: root.width * 0.3
}
}
FadeImage {
id: image
anchors.fill: parent
layer.enabled: true
source: Players.getArtUrl(Players.active)
layer.effect: Mask {
maskSource: shapeWrapper
}
}
}
@@ -0,0 +1,18 @@
pragma ComponentBehavior: Bound
import QtQuick
import M3Shapes
import ZShell.Config
Item {
id: root
CoverArt {
id: cover
anchors.centerIn: parent
implicitHeight: Config.dashboard.sizes.mediaCoverArtSize
implicitWidth: Config.dashboard.sizes.mediaCoverArtSize
shape.shape: MaterialShape.Cookie9Sided
}
}
+1 -1
View File
@@ -35,7 +35,7 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
anchors.top: parent.top anchors.top: parent.top
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
Resource { Resource {
fgColor: Colors.palette.m3primary fgColor: Colors.palette.m3primary
+1 -1
View File
@@ -18,7 +18,7 @@ Row {
color: Colors.layer(Colors.palette.m3surfaceContainerHigh, 2) color: Colors.layer(Colors.palette.m3surfaceContainerHigh, 2)
implicitHeight: info.implicitHeight implicitHeight: info.implicitHeight
implicitWidth: info.implicitHeight implicitWidth: info.implicitHeight
radius: Tokens.rounding.smallest radius: Tokens.rounding.small
MaterialIcon { MaterialIcon {
anchors.centerIn: parent anchors.centerIn: parent
+1 -1
View File
@@ -27,7 +27,7 @@ Item {
id: info id: info
anchors.left: icon.right anchors.left: icon.right
anchors.leftMargin: Tokens.spacing.large anchors.leftMargin: Tokens.spacing.largeIncreased
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
spacing: 8 spacing: 8
+1 -1
View File
@@ -181,7 +181,7 @@ Item {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: "transparent" color: "transparent"
implicitHeight: parent.height + 8 * 2 implicitHeight: parent.height + 8 * 2
radius: Tokens.rounding.smallest radius: Tokens.rounding.small
CustomRect { CustomRect {
id: stateLayer id: stateLayer
@@ -32,7 +32,7 @@ Item {
y: root.menuY y: root.menuY
color: Colors.tPalette.m3surface color: Colors.tPalette.m3surface
radius: Tokens.rounding.normal radius: Tokens.rounding.medium
implicitWidth: menuLayout.implicitWidth + padding * 2 implicitWidth: menuLayout.implicitWidth + padding * 2
implicitHeight: menuLayout.implicitHeight + padding * 2 implicitHeight: menuLayout.implicitHeight + padding * 2
@@ -48,13 +48,13 @@ Item {
CustomRect { CustomRect {
Layout.preferredWidth: 200 Layout.preferredWidth: 200
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
implicitHeight: openTerminalRow.implicitHeight + Tokens.padding.small * 2 implicitHeight: openTerminalRow.implicitHeight + Tokens.padding.extraSmall * 2
RowLayout { RowLayout {
id: openTerminalRow id: openTerminalRow
spacing: 8 spacing: 8
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
MaterialIcon { text: "terminal"; font.pointSize: 20 } MaterialIcon { text: "terminal"; font.pointSize: 20 }
CustomText { text: "Open terminal"; Layout.fillWidth: true } CustomText { text: "Open terminal"; Layout.fillWidth: true }
@@ -81,13 +81,13 @@ Item {
CustomRect { CustomRect {
Layout.fillWidth: true Layout.fillWidth: true
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
implicitHeight: settingsRow.implicitHeight + Tokens.padding.small * 2 implicitHeight: settingsRow.implicitHeight + Tokens.padding.extraSmall * 2
RowLayout { RowLayout {
id: settingsRow id: settingsRow
spacing: 8 spacing: 8
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
MaterialIcon { text: "settings"; font.pointSize: 20 } MaterialIcon { text: "settings"; font.pointSize: 20 }
CustomText { text: "ZShell settings"; Layout.fillWidth: true } CustomText { text: "ZShell settings"; Layout.fillWidth: true }
@@ -115,13 +115,13 @@ Item {
CustomRect { CustomRect {
Layout.fillWidth: true Layout.fillWidth: true
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
implicitHeight: logoutRow.implicitHeight + Tokens.padding.small * 2 implicitHeight: logoutRow.implicitHeight + Tokens.padding.extraSmall * 2
RowLayout { RowLayout {
id: logoutRow id: logoutRow
spacing: 8 spacing: 8
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
MaterialIcon { text: "logout"; font.pointSize: 20 } MaterialIcon { text: "logout"; font.pointSize: 20 }
CustomText { text: "Logout"; Layout.fillWidth: true } CustomText { text: "Logout"; Layout.fillWidth: true }
@@ -148,13 +148,13 @@ Item {
// CustomRect { // CustomRect {
// Layout.fillWidth: true // Layout.fillWidth: true
// radius: popupBackground.radius - popupBackground.padding // radius: popupBackground.radius - popupBackground.padding
// implicitHeight: desktopIconsRow.implicitHeight + Tokens.padding.small * 2 // implicitHeight: desktopIconsRow.implicitHeight + Tokens.padding.extraSmall * 2
// //
// RowLayout { // RowLayout {
// id: desktopIconsRow // id: desktopIconsRow
// spacing: 8 // spacing: 8
// anchors.fill: parent // anchors.fill: parent
// anchors.leftMargin: Tokens.padding.smaller // anchors.leftMargin: Tokens.padding.small
// //
// MaterialIcon { text: Config.options.background.showDesktopIcons ? "visibility_off" : "visibility"; font.pointSize: 20 } // MaterialIcon { text: Config.options.background.showDesktopIcons ? "visibility_off" : "visibility"; font.pointSize: 20 }
// CustomText { text: Config.options.background.showDesktopIcons ? "Hide icons" : "Show icons"; Layout.fillWidth: true } // CustomText { text: Config.options.background.showDesktopIcons ? "Hide icons" : "Show icons"; Layout.fillWidth: true }
+12 -12
View File
@@ -43,13 +43,13 @@ Item {
CustomClippingRect { CustomClippingRect {
id: popupBackground id: popupBackground
readonly property real padding: Tokens.padding.small readonly property real padding: Tokens.padding.extraSmall
color: Colors.tPalette.m3surface color: Colors.tPalette.m3surface
implicitHeight: menuLayout.implicitHeight + padding * 2 implicitHeight: menuLayout.implicitHeight + padding * 2
implicitWidth: menuLayout.implicitWidth + padding * 2 implicitWidth: menuLayout.implicitWidth + padding * 2
opacity: contextMenu.visible ? 1 : 0 opacity: contextMenu.visible ? 1 : 0
radius: Tokens.rounding.normal radius: Tokens.rounding.medium
x: contextMenu.menuX x: contextMenu.menuX
y: contextMenu.menuY y: contextMenu.menuY
@@ -66,14 +66,14 @@ Item {
CustomRect { CustomRect {
Layout.preferredWidth: 160 Layout.preferredWidth: 160
implicitHeight: openRow.implicitHeight + Tokens.padding.small * 2 implicitHeight: openRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
RowLayout { RowLayout {
id: openRow id: openRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
@@ -109,14 +109,14 @@ Item {
CustomRect { CustomRect {
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: openWithRow.implicitHeight + Tokens.padding.small * 2 implicitHeight: openWithRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
RowLayout { RowLayout {
id: openWithRow id: openWithRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
@@ -154,14 +154,14 @@ Item {
CustomRect { CustomRect {
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: copyPathRow.implicitHeight + Tokens.padding.small * 2 implicitHeight: copyPathRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
RowLayout { RowLayout {
id: copyPathRow id: copyPathRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
@@ -187,7 +187,7 @@ Item {
CustomRect { CustomRect {
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: renameRow.implicitHeight + Tokens.padding.small * 2 implicitHeight: renameRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
visible: contextMenu.targetPaths.length === 1 visible: contextMenu.targetPaths.length === 1
@@ -195,7 +195,7 @@ Item {
id: renameRow id: renameRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
@@ -229,14 +229,14 @@ Item {
CustomRect { CustomRect {
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: deleteRow.implicitHeight + Tokens.padding.small * 2 implicitHeight: deleteRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
RowLayout { RowLayout {
id: deleteRow id: deleteRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.smaller anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
+2 -2
View File
@@ -205,7 +205,7 @@ Item {
anchors.margins: 4 anchors.margins: 4
color: "white" color: "white"
opacity: root.iconsRoot.selectedIcons.includes(root.filePath) ? 0.2 : 0.0 opacity: root.iconsRoot.selectedIcons.includes(root.filePath) ? 0.2 : 0.0
radius: Tokens.rounding.smallest radius: Tokens.rounding.small
Behavior on opacity { Behavior on opacity {
Anim { Anim {
@@ -265,7 +265,7 @@ Item {
anchors.margins: 4 anchors.margins: 4
color: "white" color: "white"
opacity: parent.containsMouse ? 0.1 : 0.0 opacity: parent.containsMouse ? 0.1 : 0.0
radius: Tokens.rounding.smallest radius: Tokens.rounding.small
Behavior on opacity { Behavior on opacity {
Anim { Anim {
+4 -4
View File
@@ -22,10 +22,10 @@ Item {
property string draggedAppId: "" property string draggedAppId: ""
property var draggedModelData: null property var draggedModelData: null
property bool dropAnimating: false property bool dropAnimating: false
readonly property int padding: Tokens.padding.small readonly property int padding: Tokens.padding.extraSmall
required property var panels required property var panels
property var pendingCommitIds: [] property var pendingCommitIds: []
readonly property int rounding: Tokens.rounding.large readonly property int rounding: Tokens.rounding.largeIncreased
required property ShellScreen screen required property ShellScreen screen
required property PersistentProperties visibilities required property PersistentProperties visibilities
property var visualIds: [] property var visualIds: []
@@ -247,7 +247,7 @@ Item {
property bool enableAddAnimation: false property bool enableAddAnimation: false
anchors.left: parent.left anchors.left: parent.left
anchors.margins: Tokens.padding.small anchors.margins: Tokens.padding.extraSmall
anchors.top: parent.top anchors.top: parent.top
boundsBehavior: Flickable.StopAtBounds boundsBehavior: Flickable.StopAtBounds
height: Config.dock.height height: Config.dock.height
@@ -255,7 +255,7 @@ Item {
interactive: !(root.dragActive || root.dropAnimating) interactive: !(root.dragActive || root.dropAnimating)
model: visualModel model: visualModel
orientation: ListView.Horizontal orientation: ListView.Horizontal
spacing: Tokens.padding.smaller spacing: Tokens.padding.small
add: Transition { add: Transition {
ParallelAnimation { ParallelAnimation {
+1 -1
View File
@@ -23,7 +23,7 @@ CustomRect {
implicitHeight: Config.dock.height implicitHeight: Config.dock.height
implicitWidth: isSeparator ? 1 : implicitHeight implicitWidth: isSeparator ? 1 : implicitHeight
radius: Tokens.rounding.normal - Tokens.padding.small radius: Tokens.rounding.medium - Tokens.padding.extraSmall
Loader { Loader {
active: !isSeparator active: !isSeparator
+2 -2
View File
@@ -5,9 +5,9 @@ import ZShell.Config
import qs.Services import qs.Services
CustomRect { CustomRect {
Layout.bottomMargin: dockRow.padding + Tokens.rounding.normal Layout.bottomMargin: dockRow.padding + Tokens.rounding.medium
Layout.fillHeight: true Layout.fillHeight: true
Layout.topMargin: dockRow.padding + Tokens.rounding.normal Layout.topMargin: dockRow.padding + Tokens.rounding.medium
color: Colors.palette.m3outlineVariant color: Colors.palette.m3outlineVariant
implicitWidth: 1 implicitWidth: 1
} }
+1 -1
View File
@@ -24,7 +24,7 @@ Item {
Behavior on offsetScale { Behavior on offsetScale {
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
} }
} }
+5 -5
View File
@@ -33,8 +33,8 @@ Item {
drawing.drawingState.penColor = Qt.hsva(huePicker.currentHue, saturationSlider.value, brightnessSlider.value, drawing.drawingState.penColor.a); drawing.drawingState.penColor = Qt.hsva(huePicker.currentHue, saturationSlider.value, brightnessSlider.value, drawing.drawingState.penColor.a);
} }
implicitHeight: column.height + Tokens.padding.larger * 2 implicitHeight: column.height + Tokens.padding.small * 2
implicitWidth: huePicker.implicitWidth + Tokens.padding.normal * 2 implicitWidth: huePicker.implicitWidth + Tokens.padding.small * 2
Component.onCompleted: syncFromPenColor() Component.onCompleted: syncFromPenColor()
@@ -97,7 +97,7 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
Repeater { Repeater {
model: root.colors1 model: root.colors1
@@ -113,7 +113,7 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
Repeater { Repeater {
model: root.colors2 model: root.colors2
@@ -172,7 +172,7 @@ Item {
} }
IconButton { IconButton {
anchors.margins: Tokens.padding.normal anchors.margins: Tokens.padding.small
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
checked: root.wrapper.pinned checked: root.wrapper.pinned
+2 -2
View File
@@ -49,13 +49,13 @@ Item {
Behavior on implicitWidth { Behavior on implicitWidth {
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
} }
} }
Behavior on offsetScale { Behavior on offsetScale {
Anim { Anim {
duration: Tokens.anim.durations.expressiveDefaultSpatial duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial
} }
} }
+24 -7
View File
@@ -25,6 +25,8 @@ CustomListView {
return [0]; return [0];
case "variant": case "variant":
return SchemeVariants.query(text); return SchemeVariants.query(text);
case "files":
return Files.query(text);
default: default:
return Apps.search(text); return Apps.search(text);
} }
@@ -33,7 +35,7 @@ CustomListView {
function stateForText(text: string): string { function stateForText(text: string): string {
const prefix = Config.launcher.actionPrefix; const prefix = Config.launcher.actionPrefix;
if (text.startsWith(prefix)) { if (text.startsWith(prefix)) {
for (const action of ["calc", "scheme", "variant"]) for (const action of ["calc", "scheme", "variant", "files"])
if (text.startsWith(`${prefix}${action} `)) if (text.startsWith(`${prefix}${action} `))
return action; return action;
@@ -99,13 +101,13 @@ CustomListView {
implicitHeight: root.currentItem?.implicitHeight ?? 0 implicitHeight: root.currentItem?.implicitHeight ?? 0
implicitWidth: root.width implicitWidth: root.width
opacity: 0.08 opacity: 0.08
radius: Tokens.rounding.smallest radius: Tokens.rounding.medium
y: root.currentItem?.y ?? 0 y: root.currentItem?.y ?? 0
Behavior on y { Behavior on y {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects easing: Tokens.anim.expressiveDefaultEffects
} }
} }
} }
@@ -163,6 +165,13 @@ CustomListView {
PropertyChanges { PropertyChanges {
root.delegate: variantItem root.delegate: variantItem
} }
},
State {
name: "files"
PropertyChanges {
root.delegate: filesItem
}
} }
] ]
transitions: Transition { transitions: Transition {
@@ -170,7 +179,7 @@ CustomListView {
ParallelAnimation { ParallelAnimation {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.standardAccel easing: Tokens.anim.standardAccel
from: 1 from: 1
property: "opacity" property: "opacity"
target: root target: root
@@ -179,7 +188,7 @@ CustomListView {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.standardAccel easing: Tokens.anim.standardAccel
from: 1 from: 1
property: "scale" property: "scale"
target: root target: root
@@ -205,7 +214,7 @@ CustomListView {
ParallelAnimation { ParallelAnimation {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.standardDecel easing: Tokens.anim.standardDecel
from: 0 from: 0
property: "opacity" property: "opacity"
target: root target: root
@@ -214,7 +223,7 @@ CustomListView {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.standardDecel easing: Tokens.anim.standardDecel
from: 0.9 from: 0.9
property: "scale" property: "scale"
target: root target: root
@@ -264,6 +273,14 @@ CustomListView {
} }
} }
Component {
id: filesItem
FilesItem {
list: root
}
}
Connections { Connections {
function onTextChanged() { function onTextChanged() {
root.syncDisplayText(); root.syncDisplayText();
+1 -1
View File
@@ -25,7 +25,7 @@ CarouselView {
focalWidth: Config.launcher.sizes.wallpaperWidth focalWidth: Config.launcher.sizes.wallpaperWidth
glideDuration: 250 glideDuration: 250
glideEasingType: Easing.OutCubic glideEasingType: Easing.OutCubic
implicitHeight: tileHeight + Tokens.spacing.small / 2 + Tokens.padding.large + Tokens.padding.normal implicitHeight: tileHeight + Tokens.spacing.small / 2 + Tokens.padding.large + Tokens.padding.small
itemSpacing: Tokens.spacing.small itemSpacing: Tokens.spacing.small
maxWidth: { maxWidth: {
if (!screen) if (!screen)
+6 -4
View File
@@ -12,9 +12,9 @@ Item {
id: root id: root
required property real maxHeight required property real maxHeight
readonly property int padding: Tokens.padding.small readonly property int padding: Tokens.padding.largeIncreased / 4
required property var panels required property var panels
readonly property int rounding: Tokens.rounding.large readonly property int rounding: Tokens.rounding.largeIncreased
required property PersistentProperties visibilities required property PersistentProperties visibilities
implicitHeight: search.height + listWrapper.height + padding * 2 implicitHeight: search.height + listWrapper.height + padding * 2
@@ -49,9 +49,9 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.margins: root.padding anchors.margins: root.padding
anchors.right: parent.right anchors.right: parent.right
bottomPadding: Tokens.padding.larger bottomPadding: Tokens.padding.medium
placeholderText: qsTr("Type \"%1\" for commands").arg(Config.launcher.actionPrefix) placeholderText: qsTr("Type \"%1\" for commands").arg(Config.launcher.actionPrefix)
topPadding: Tokens.padding.larger topPadding: Tokens.padding.medium
Component.onCompleted: forceActiveFocus() Component.onCompleted: forceActiveFocus()
Keys.onDownPressed: list.currentList?.decrementCurrentIndex() Keys.onDownPressed: list.currentList?.decrementCurrentIndex()
@@ -85,6 +85,8 @@ Item {
} else if (text.startsWith(Config.launcher.actionPrefix)) { } else if (text.startsWith(Config.launcher.actionPrefix)) {
if (text.startsWith(`${Config.launcher.actionPrefix}calc `)) if (text.startsWith(`${Config.launcher.actionPrefix}calc `))
currentItem.onClicked(); currentItem.onClicked();
else if (text.startsWith(`${Config.launcher.actionPrefix}files `))
currentItem.onClicked();
else else
currentItem.modelData.onClicked(list.currentList); currentItem.modelData.onClicked(list.currentList);
} else { } else {
+3 -3
View File
@@ -32,7 +32,7 @@ Item {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects easing: Tokens.anim.expressiveDefaultEffects
} }
} }
Behavior on implicitWidth { Behavior on implicitWidth {
@@ -40,7 +40,7 @@ Item {
Anim { Anim {
duration: Tokens.anim.durations.small duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects easing: Tokens.anim.expressiveDefaultEffects
} }
} }
Behavior on state { Behavior on state {
@@ -127,7 +127,7 @@ Item {
opacity: root.currentList?.count === 0 ? 1 : 0 opacity: root.currentList?.count === 0 ? 1 : 0
padding: Tokens.padding.large padding: Tokens.padding.large
scale: root.currentList?.count === 0 ? 1 : 0.5 scale: root.currentList?.count === 0 ? 1 : 0.5
spacing: Tokens.spacing.normal spacing: Tokens.spacing.medium
Behavior on opacity { Behavior on opacity {
Anim { Anim {
+6 -6
View File
@@ -16,7 +16,7 @@ Item {
implicitHeight: Config.launcher.sizes.itemHeight implicitHeight: Config.launcher.sizes.itemHeight
StateLayer { StateLayer {
radius: Tokens.rounding.smallest radius: Tokens.rounding.medium
onClicked: { onClicked: {
root.modelData?.onClicked(root.list); root.modelData?.onClicked(root.list);
@@ -25,9 +25,9 @@ Item {
Item { Item {
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.larger anchors.leftMargin: Tokens.padding.small
anchors.margins: Tokens.padding.smaller anchors.margins: Tokens.padding.small
anchors.rightMargin: Tokens.padding.larger anchors.rightMargin: Tokens.padding.small
MaterialIcon { MaterialIcon {
id: icon id: icon
@@ -39,7 +39,7 @@ Item {
Item { Item {
anchors.left: icon.right anchors.left: icon.right
anchors.leftMargin: Tokens.spacing.normal anchors.leftMargin: Tokens.spacing.medium
anchors.verticalCenter: icon.verticalCenter anchors.verticalCenter: icon.verticalCenter
implicitHeight: name.implicitHeight + desc.implicitHeight implicitHeight: name.implicitHeight + desc.implicitHeight
implicitWidth: parent.width - icon.width implicitWidth: parent.width - icon.width
@@ -59,7 +59,7 @@ Item {
elide: Text.ElideRight elide: Text.ElideRight
font.pointSize: Tokens.font.size.small font.pointSize: Tokens.font.size.small
text: root.modelData?.desc ?? "" text: root.modelData?.desc ?? ""
width: root.width - icon.width - Tokens.rounding.normal * 2 width: root.width - icon.width - Tokens.rounding.medium * 2
} }
} }
} }

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