106 Commits

Author SHA1 Message Date
AteebXYZ 6a91c7b990 fix: apply mode substitution after dynamic template fill (#84) 2026-02-10 21:37:58 +11:00
2 * r + 2 * t bdc5f91009 fix: xxx_paletteKeyColor rename in myc 3.0.0
Fixes caelestia-dots/shell#1112
2026-02-10 21:33:19 +11:00
Chea Vuthearith 164bda5462 record: add arg to copy screen recording to clipboard (#83) 2026-02-10 20:53:27 +11:00
github-actions fe071cb285 [CI] chore: update flake 2026-02-09 02:54:39 +00:00
github-actions 2d5bec14a5 [CI] chore: update flake 2026-02-08 03:19:32 +00:00
github-actions 2395347d36 [CI] chore: update flake 2026-02-06 02:39:29 +00:00
github-actions cf6092b77b [CI] chore: update flake 2026-02-05 02:40:10 +00:00
github-actions 6dad795297 [CI] chore: update flake 2026-02-04 02:38:06 +00:00
github-actions 016a566bb7 [CI] chore: update flake 2026-02-03 02:42:43 +00:00
github-actions 2240ad4adf [CI] chore: update flake 2026-02-02 02:53:33 +00:00
github-actions fccf32250e [CI] chore: update flake 2026-02-01 03:04:44 +00:00
github-actions 90fc2a981e [CI] chore: update flake 2026-01-30 02:37:13 +00:00
github-actions 6cdb131e3a [CI] chore: update flake 2026-01-26 02:35:07 +00:00
github-actions ecf0c6156a [CI] chore: update flake 2026-01-25 02:35:40 +00:00
Kalagmitan 52a3a3c50e theme: inject mode into user templates (#77)
* theme: apply_user_templates accepts mode.

* Some themes like those in NvChad require a mode to be supplied to
work. Added a minimal change that makes apply_user_templates accept a
mode parameter and replaces any {{ mode }} placeholder in a file with
the actual mode.

* theme: mode replace integrated with gen_replace_dynamic

+ Moved the {{ mode }} replacement logic to the gen_replace_dynamic
function.

* refactor: adjusted comment
2026-01-24 14:45:32 +11:00
github-actions 6b3f927d2c [CI] chore: update flake 2026-01-23 02:11:56 +00:00
github-actions 74ddac98eb [CI] chore: update flake 2026-01-22 02:21:06 +00:00
github-actions d09e36299a [CI] chore: update flake 2026-01-21 02:21:30 +00:00
github-actions 50c8f9c84d [CI] chore: update flake 2026-01-20 02:12:10 +00:00
github-actions 33fb69dc8c [CI] chore: update flake 2026-01-18 02:32:10 +00:00
mj0x0 7de6c60631 theme: ensure atomic writes for configuration files (#76)
* fix: ensure atomic writes for configuration files

* requested changes
2026-01-18 00:11:13 +11:00
github-actions 0cd11ef665 [CI] chore: update flake 2026-01-17 02:06:07 +00:00
github-actions 64686104a1 [CI] chore: update flake 2026-01-16 02:12:09 +00:00
2 * r + 2 * t 08dc3e0e87 theme: update discord theme template
Fixes caelestia-dots/caelestia#206
2026-01-14 19:22:19 +11:00
github-actions 7900d05459 [CI] chore: update flake 2026-01-13 02:08:26 +00:00
github-actions 315f1daf9d [CI] chore: update flake 2026-01-12 02:23:10 +00:00
github-actions ad555d5129 [CI] chore: update flake 2026-01-11 02:32:22 +00:00
github-actions 70a8624eac [CI] chore: update flake 2026-01-10 02:06:38 +00:00
github-actions 86b0c94bd1 [CI] chore: update flake 2026-01-08 02:10:20 +00:00
github-actions 55d75a1175 [CI] chore: update flake 2026-01-07 02:09:52 +00:00
github-actions 55590bd9e4 [CI] chore: update flake 2026-01-04 02:27:36 +00:00
github-actions 337c711371 [CI] chore: update flake 2026-01-02 02:16:30 +00:00
github-actions f3ea42d43a [CI] chore: update flake 2025-12-29 02:28:26 +00:00
github-actions e33e6ccf72 [CI] chore: update flake 2025-12-28 02:30:51 +00:00
github-actions b049cb1749 [CI] chore: update flake 2025-12-26 02:06:29 +00:00
github-actions 78e0b9d795 [CI] chore: update flake 2025-12-23 02:07:06 +00:00
github-actions e9f3f00bb9 [CI] chore: update flake 2025-12-21 02:13:41 +00:00
github-actions 8c83ae1e6a [CI] chore: update flake 2025-12-20 01:59:18 +00:00
github-actions 10639b5de0 [CI] chore: update flake 2025-12-16 02:07:04 +00:00
github-actions e1efe59e55 [CI] chore: update flake 2025-12-14 02:13:56 +00:00
github-actions b1e4e92e98 [CI] chore: update flake 2025-12-10 02:04:42 +00:00
github-actions 3e59c5acc2 [CI] chore: update flake 2025-12-07 02:18:43 +00:00
github-actions 1eead86151 [CI] chore: update flake 2025-12-04 02:02:53 +00:00
github-actions 02442e0f85 [CI] chore: update flake 2025-12-03 02:02:50 +00:00
github-actions 5fa4d1b278 [CI] chore: update flake 2025-12-02 02:03:08 +00:00
github-actions c0813790c2 [CI] chore: update flake 2025-11-30 02:17:28 +00:00
github-actions ed12d4cb82 [CI] chore: update flake 2025-11-29 01:56:50 +00:00
github-actions 1e1edfcd38 [CI] chore: update flake 2025-11-27 01:58:53 +00:00
github-actions 0fdab31bc7 [CI] chore: update flake 2025-11-26 02:07:00 +00:00
github-actions 909c25eefd [CI] chore: update flake 2025-11-25 02:06:40 +00:00
github-actions 434841e000 [CI] chore: update flake 2025-11-23 02:19:03 +00:00
github-actions 178e73a065 [CI] emojis: update data 2025-11-23 01:39:22 +00:00
github-actions 1cfd405eaa [CI] chore: update flake 2025-11-19 01:58:19 +00:00
github-actions 03d485ec07 [CI] chore: update flake 2025-11-18 01:58:41 +00:00
github-actions 0c08188584 [CI] chore: update flake 2025-11-16 02:11:44 +00:00
github-actions d89c438284 [CI] chore: update flake 2025-11-15 02:01:51 +00:00
github-actions f9acac8fb2 [CI] chore: update flake 2025-11-13 02:00:29 +00:00
github-actions 1e3d75fa8f [CI] chore: update flake 2025-11-10 02:04:22 +00:00
github-actions 5a80ac77ed [CI] chore: update flake 2025-11-09 02:02:36 +00:00
github-actions 9323fbf1b4 [CI] chore: update flake 2025-11-07 01:58:39 +00:00
github-actions c05f6ef57a [CI] chore: update flake 2025-11-05 01:59:44 +00:00
Evence Wang 57dfea955e shell: fix log rules arg (#67) 2025-11-04 23:13:00 +11:00
github-actions 0ae99bbe39 [CI] chore: update flake 2025-11-04 01:58:32 +00:00
github-actions f13803af6b [CI] chore: update flake 2025-11-02 02:09:23 +00:00
github-actions 1cea6fb42a [CI] chore: update flake 2025-11-01 02:01:08 +00:00
github-actions 94d5477908 [CI] chore: update flake 2025-10-30 02:00:53 +00:00
github-actions a8590220bb [CI] chore: update flake 2025-10-27 02:05:30 +00:00
github-actions 27be3dbd84 [CI] chore: update flake 2025-10-26 02:01:08 +00:00
2 * r + 2 * t cc458bf859 scheme: ignore empty lines in schemes 2025-10-25 22:41:34 +11:00
github-actions b2ea4e3aad [CI] chore: update flake 2025-10-24 01:50:36 +00:00
github-actions 98da4c0266 [CI] chore: update flake 2025-10-23 02:00:03 +00:00
github-actions a9f8bde28e [CI] chore: update flake 2025-10-22 01:58:45 +00:00
github-actions d0f8a06e59 [CI] chore: update flake 2025-10-20 02:07:40 +00:00
github-actions dcca082ee6 [CI] chore: update flake 2025-10-19 02:10:10 +00:00
Davi Ribeiro 4593b823d7 wallpaper: fix random for multi-monitor setup (#63) 2025-10-17 04:59:13 +11:00
Givani Boekestijn c6f46db36c feat: add wallpaper post-hook for dynamic theming (#61)
* feat: add wallpaper post-hook for dynamic theming

Adds support for running custom shell commands after wallpaper changes
via the `wallpaper.postHook` config option in `~/.config/caelestia/cli.json`.

The wallpaper path is made available to the hook via the $WALLPAPER_PATH
environment variable. This enables integration with tools like `matugen`
or `pywal` for dynamic theming based on wallpaper colors.

The hook runs after apply_colours() in set_wallpaper(), ensuring it
executes for all wallpaper change methods (UI, IPC, and direct CLI).

* Replaced comment in example config with no-op command
2025-10-17 04:56:32 +11:00
github-actions 40fbf3bd68 [CI] chore: update flake 2025-10-16 01:53:51 +00:00
github-actions 8dc745c936 [CI] chore: update flake 2025-10-15 01:54:51 +00:00
github-actions 14ee3c66ef [CI] chore: update flake 2025-10-14 01:52:02 +00:00
github-actions 601d08bdec [CI] chore: update flake 2025-10-12 02:00:34 +00:00
github-actions e9668d58f5 [CI] chore: update flake 2025-10-11 01:45:56 +00:00
github-actions 3f7f3bab15 [CI] chore: update flake 2025-10-09 01:51:33 +00:00
github-actions 1394e32a7e [CI] chore: update flake 2025-10-08 01:55:44 +00:00
Davi Ribeiro f912d33f26 nix: fix toggle app2unit (#60) 2025-10-07 15:14:35 +11:00
github-actions 8b1d0257df [CI] chore: update flake 2025-10-07 01:49:44 +00:00
github-actions 276f18d198 [CI] chore: update flake 2025-10-05 02:04:47 +00:00
github-actions ebbd636b79 [CI] chore: update flake 2025-10-04 01:45:05 +00:00
github-actions ee7c7c2d5d [CI] chore: update flake 2025-10-03 01:49:13 +00:00
github-actions 28a831779e [CI] chore: update flake 2025-10-02 01:49:11 +00:00
github-actions 069d3a95da [CI] chore: update flake 2025-09-30 01:47:52 +00:00
github-actions af79030bf5 [CI] chore: update flake 2025-09-28 02:00:02 +00:00
github-actions 1de7da5f2b [CI] chore: update flake 2025-09-27 01:46:12 +00:00
github-actions 4be834aa11 [CI] chore: update flake 2025-09-26 01:51:20 +00:00
github-actions 8399eee947 [CI] chore: update flake 2025-09-25 01:51:43 +00:00
github-actions 62e5dc317a [CI] chore: update flake 2025-09-24 01:50:54 +00:00
github-actions 60a6be2dfd [CI] chore: update flake 2025-09-23 01:49:21 +00:00
github-actions 7fc5bcca1a [CI] chore: update flake 2025-09-22 01:59:18 +00:00
github-actions 64fd3a4a28 [CI] chore: update flake 2025-09-21 02:02:29 +00:00
github-actions dd982bcb96 [CI] chore: update flake 2025-09-20 01:46:38 +00:00
github-actions 1bac394029 [CI] chore: update flake 2025-09-19 01:51:52 +00:00
github-actions b36794bbb5 [CI] chore: update flake 2025-09-18 01:48:31 +00:00
github-actions c3e8a6de72 [CI] chore: update flake 2025-09-17 01:48:57 +00:00
github-actions 65df31dca4 [CI] chore: update flake 2025-09-16 01:48:54 +00:00
2 * r + 2 * t ad6df1c9d2 record: add extraArgs config 2025-09-15 23:18:08 +10:00
github-actions e038c5d86a [CI] chore: update flake 2025-09-15 01:57:49 +00:00
2 * r + 2 * t e560a6e3d2 version: catch correct error 2025-09-14 20:45:57 +10:00
14 changed files with 133 additions and 73 deletions
+6
View File
@@ -130,6 +130,12 @@ All configuration options are in `~/.config/caelestia/cli.json`.
```json
{
"record": {
"extraArgs": []
},
"wallpaper": {
"postHook": "echo $WALLPAPER_PATH"
},
"theme": {
"enableTerm": true,
"enableHypr": true,
+1
View File
@@ -105,6 +105,7 @@ complete -c caelestia -n "$seen screenshot" -s 'f' -l 'freeze' -d 'Freeze while
# Record
complete -c caelestia -n "$seen record" -s 'r' -l 'region' -d 'Capture region'
complete -c caelestia -n "$seen record" -s 's' -l 'sound' -d 'Capture sound'
complete -c caelestia -n "$seen record" -s 'c' -l 'clipboard' -d 'Copy recording path to clipboard'
# Clipboard
complete -c caelestia -n "$seen clipboard" -s 'd' -l 'delete' -d 'Delete from cliboard history'
+3 -2
View File
@@ -65,10 +65,11 @@ python3.pkgs.buildPythonApplication {
substituteInPlace src/caelestia/subcommands/screenshot.py \
--replace-fail '"qs", "-c", "caelestia"' '"caelestia-shell"'
# Use config bin instead of discord + fix todoist
# Use config bin instead of discord + fix todoist + fix app2unit
substituteInPlace src/caelestia/subcommands/toggle.py \
--replace-fail 'discord' ${discordBin} \
--replace-fail 'todoist' 'todoist.desktop'
--replace-fail 'todoist' 'todoist.desktop'\
--replace-fail 'app2unit' ${app2unit}/bin/app2unit
# Use config style instead of darkly
substituteInPlace src/caelestia/data/templates/qtct.conf \
Generated
+10 -10
View File
@@ -9,11 +9,11 @@
"quickshell": "quickshell"
},
"locked": {
"lastModified": 1757726711,
"narHash": "sha256-nihMIyW+IN01jLH+XhRDJ4V/9ulD/iqi0dvA7gYlclA=",
"lastModified": 1770527631,
"narHash": "sha256-QFZAXF80GUrgdmgjMLPzhGOqjiRk4ukCEkpr0dehdnk=",
"owner": "caelestia-dots",
"repo": "shell",
"rev": "a57dd9343a2643f73f3994dc230b824617f89ecf",
"rev": "5b2e1a6231af24472fb8ff3bfa7183a4f63c6ba7",
"type": "github"
},
"original": {
@@ -24,11 +24,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1757487488,
"narHash": "sha256-zwE/e7CuPJUWKdvvTCB7iunV4E/+G0lKfv4kk/5Izdg=",
"lastModified": 1770562336,
"narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "ab0f3607a6c7486ea22229b92ed2d355f1482ee0",
"rev": "d6c71932130818840fc8fe9509cf50be8c64634f",
"type": "github"
},
"original": {
@@ -46,11 +46,11 @@
]
},
"locked": {
"lastModified": 1756981260,
"narHash": "sha256-GhuD9QVimjynHI0OOyZsqJsnlXr2orowh9H+HYz4YMs=",
"lastModified": 1769593411,
"narHash": "sha256-WW00FaBiUmQyxvSbefvgxIjwf/WmRrEGBbwMHvW/7uQ=",
"ref": "refs/heads/master",
"rev": "6eb12551baf924f8fdecdd04113863a754259c34",
"revCount": 672,
"rev": "1e4d804e7f3fa7465811030e8da2bf10d544426a",
"revCount": 732,
"type": "git",
"url": "https://git.outfoxxed.me/outfoxxed/quickshell"
},
+38 -30
View File
@@ -132,6 +132,7 @@
😯 hushed face epic face hushed omg stunned surprised whoa woah
😲 :o :O astonished face astonished cost face no omg shocked totally way
😳 :$ flushed face amazed awkward crazy dazed dead disbelief embarrassed face flushed geez heat hot impressed jeez what wow
🫪 distorted face anxiety bloated panic shocked surprised vulnerable
🥺 pleading face begging big eyes face mercy not pleading please pretty puppy sad why
🥹 face holding back tears admiration aww back cry embarrassed face feelings grateful gratitude holding joy please proud resist sad tears
😦 frowning face with open mouth caught face frown frowning guard mouth open scared scary surprise what wow
@@ -205,6 +206,7 @@
💋 kiss mark dating emotion heart kiss kissing lips mark romance sexy
💯 hundred points 100 a+ agree clearly definitely faithful fleek full hundred keep perfect point score true truth yup
💢 anger symbol anger angry comic mad symbol upset
🫯 fight cloud argument brawl debate disagreement fight ruckus wrestle
💥 collision bomb boom collide comic explode
💫 dizzy comic shining shooting star stars
💦 sweat droplets comic drip droplet droplets drops splashing squirt sweat water wet work workout
@@ -449,6 +451,7 @@
🧟‍♂️ man zombie apocalypse dead halloween horror man scary undead walking zombie
🧟‍♀️ woman zombie apocalypse dead halloween horror scary undead walking woman zombie
🧌 troll fairy fantasy monster tale trolling
🫈 hairy creature bigfoot cryptid forest giant hairy sasquatch woodwose yeti
💆 person getting massage face getting headache massage person relax relaxing salon soothe spa tension therapy treatment
💆‍♂️ man getting massage face getting headache man massage relax relaxing salon soothe spa tension therapy treatment
💆‍♀️ woman getting massage face getting headache massage relax relaxing salon soothe spa tension therapy treatment woman
@@ -458,42 +461,43 @@
🚶 person walking amble gait hike man pace pedestrian person stride stroll walk walking
🚶‍♂️ man walking amble gait hike man pace pedestrian stride stroll walk walking
🚶‍♀️ woman walking amble gait hike man pace pedestrian stride stroll walk walking woman
🚶‍➡️ person walking facing right amble gait hike man pace pedestrian person stride stroll walk walking
🚶‍♀️‍➡️ woman walking facing right amble gait hike man pace pedestrian stride stroll walk walking woman
🚶‍♂️‍➡️ man walking facing right amble gait hike man pace pedestrian stride stroll walk walking
🚶‍➡️ person walking: facing right amble facing gait hike man pace pedestrian person right stride stroll walk walking
🚶‍♀️‍➡️ woman walking: facing right amble facing gait hike man pace pedestrian right stride stroll walk walking woman
🚶‍♂️‍➡️ man walking: facing right amble facing gait hike man pace pedestrian right stride stroll walk walking
🧍 person standing person stand standing
🧍‍♂️ man standing man stand standing
🧍‍♀️ woman standing stand standing woman
🧎 person kneeling kneel kneeling knees person
🧎‍♂️ man kneeling kneel kneeling knees man
🧎‍♀️ woman kneeling kneel kneeling knees woman
🧎‍➡️ person kneeling facing right kneel kneeling knees person
🧎‍♀️‍➡️ woman kneeling facing right kneel kneeling knees woman
🧎‍♂️‍➡️ man kneeling facing right kneel kneeling knees man
🧎‍➡️ person kneeling: facing right facing kneel kneeling knees person right
🧎‍♀️‍➡️ woman kneeling: facing right facing kneel kneeling knees right woman
🧎‍♂️‍➡️ man kneeling: facing right facing kneel kneeling knees man right
🧑‍🦯 person with white cane accessibility blind cane person probing white
🧑‍🦯‍➡️ person with white cane facing right accessibility blind cane person probing white
🧑‍🦯‍➡️ person with white cane: facing right accessibility blind cane facing person probing right white
👨‍🦯 man with white cane accessibility blind cane man probing white
👨‍🦯‍➡️ man with white cane facing right accessibility blind cane man probing white
👨‍🦯‍➡️ man with white cane: facing right accessibility blind cane facing man probing right white
👩‍🦯 woman with white cane accessibility blind cane probing white woman
👩‍🦯‍➡️ woman with white cane facing right accessibility blind cane probing white woman
👩‍🦯‍➡️ woman with white cane: facing right accessibility blind cane facing probing right white woman
🧑‍🦼 person in motorized wheelchair accessibility motorized person wheelchair
🧑‍🦼‍➡️ person in motorized wheelchair facing right accessibility motorized person wheelchair
🧑‍🦼‍➡️ person in motorized wheelchair: facing right accessibility facing motorized person right wheelchair
👨‍🦼 man in motorized wheelchair accessibility man motorized wheelchair
👨‍🦼‍➡️ man in motorized wheelchair facing right accessibility man motorized wheelchair
👨‍🦼‍➡️ man in motorized wheelchair: facing right accessibility facing man motorized right wheelchair
👩‍🦼 woman in motorized wheelchair accessibility motorized wheelchair woman
👩‍🦼‍➡️ woman in motorized wheelchair facing right accessibility motorized wheelchair woman
👩‍🦼‍➡️ woman in motorized wheelchair: facing right accessibility facing motorized right wheelchair woman
🧑‍🦽 person in manual wheelchair accessibility manual person wheelchair
🧑‍🦽‍➡️ person in manual wheelchair facing right accessibility manual person wheelchair
🧑‍🦽‍➡️ person in manual wheelchair: facing right accessibility facing manual person right wheelchair
👨‍🦽 man in manual wheelchair accessibility man manual wheelchair
👨‍🦽‍➡️ man in manual wheelchair facing right accessibility man manual wheelchair
👨‍🦽‍➡️ man in manual wheelchair: facing right accessibility facing man manual right wheelchair
👩‍🦽 woman in manual wheelchair accessibility manual wheelchair woman
👩‍🦽‍➡️ woman in manual wheelchair facing right accessibility manual wheelchair woman
👩‍🦽‍➡️ woman in manual wheelchair: facing right accessibility facing manual right wheelchair woman
🏃 person running fast hurry marathon move person quick race racing run rush speed
🏃‍♂️ man running fast hurry man marathon move quick race racing run rush speed
🏃‍♀️ woman running fast hurry marathon move quick race racing run rush speed woman
🏃‍➡️ person running facing right fast hurry marathon move person quick race racing run rush speed
🏃‍♀️‍➡️ woman running facing right fast hurry marathon move quick race racing run rush speed woman
🏃‍♂️‍➡️ man running facing right fast hurry man marathon move quick race racing run rush speed
🏃‍➡️ person running: facing right facing fast hurry marathon move person quick race racing right run rush speed
🏃‍♀️‍➡️ woman running: facing right facing fast hurry marathon move quick race racing right run rush speed woman
🏃‍♂️‍➡️ man running: facing right facing fast hurry man marathon move quick race racing right run rush speed
🧑‍🩰 ballet dancer ballet dancer
💃 woman dancing dance dancer dancing elegant festive flair flamenco groove lets salsa tango woman
🕺 man dancing dance dancer dancing elegant festive flair flamenco groove lets man salsa tango
🕴️ person in suit levitating business levitating person suit
@@ -711,6 +715,7 @@
🐳 spouting whale animal beach face ocean spouting whale
🐋 whale animal beach ocean
🐬 dolphin animal beach flipper ocean
🫍 orca marine ocean whale
🦭 seal animal lion ocean sea
🐟️ fish animal dinner fishes fishing pisces zodiac
🐠 tropical fish animal fish fishes tropical
@@ -910,6 +915,7 @@
🧭 compass direction magnetic navigation orienteering
🏔️ snow-capped mountain cold mountain snow snow-capped
⛰️ mountain mountain
🛘 landslide avalanche danger disaster earthquake mountain mudslide rocks
🌋 volcano eruption mountain nature
🗻 mount fuji fuji mount mountain nature
🏕️ camping camping
@@ -1270,10 +1276,11 @@
🎧️ headphone earbud sound
📻️ radio entertainment tbt video
🎷 saxophone instrument music sax
🎺 trumpet instrument music
🪊 trombone brass instrument jazz music sad slide
🪗 accordion box concertina instrument music squeeze squeezebox
🎸 guitar instrument music strat
🎹 musical keyboard instrument keyboard music musical piano
🎺 trumpet instrument music
🎻 violin instrument music
🪕 banjo music stringed
🥁 drum drumsticks music
@@ -1334,8 +1341,9 @@
📑 bookmark tabs bookmark mark marker tabs
🔖 bookmark mark
🏷️ label tag
💰️ money bag bag bank bet billion cash cost dollar gold million money moneybag paid paying pot rich win
🪙 coin dollar euro gold metal money rich silver treasure
💰️ money bag bag bank bet billion cash cost dollar gold million money moneybag paid paying pot rich win
🪎 treasure chest gem gold jewels loot money prize silver valuables wealth
💴 yen banknote bank banknote bill currency money note yen
💵 dollar banknote bank banknote bill currency dollar money note
💶 euro banknote 100 bank banknote bill currency euro money note rich
@@ -1608,16 +1616,16 @@
🫟 splatter drip holi ink liquid mess paint spill stain
#️⃣ keycap: # keycap
*️⃣ keycap: * keycap
0️⃣ keycap: 0 keycap
1️⃣ keycap: 1 keycap
2️⃣ keycap: 2 keycap
3️⃣ keycap: 3 keycap
4️⃣ keycap: 4 keycap
5️⃣ keycap: 5 keycap
6️⃣ keycap: 6 keycap
7️⃣ keycap: 7 keycap
8️⃣ keycap: 8 keycap
9️⃣ keycap: 9 keycap
0️⃣ keycap: 0 0 keycap zero
1️⃣ keycap: 1 1 keycap one
2️⃣ keycap: 2 2 keycap two
3️⃣ keycap: 3 3 keycap three
4️⃣ keycap: 4 4 four keycap
5️⃣ keycap: 5 5 five keycap
6️⃣ keycap: 6 6 keycap six
7️⃣ keycap: 7 7 keycap seven
8️⃣ keycap: 8 8 eight keycap
9️⃣ keycap: 9 9 keycap nine
🔟 keycap: 10 keycap
🔠 input latin uppercase abcd input latin letters uppercase
🔡 input latin lowercase abcd input latin letters lowercase
+12 -10
View File
@@ -15,8 +15,10 @@
@import url("https://refact0r.github.io/midnight-discord/build/midnight.css");
body {
/* font, change to '' for default discord font */
--font: "figtree";
/* font options */
--font: "figtree"; /* change to '' for default discord font */
--code-font: "JetBrainsMono NF"; /* change to '' for default discord font */
font-weight: 400; /* normal text font weight. DOES NOT AFFECT BOLD TEXT */
/* sizes */
--gap: 12px; /* spacing between panels */
@@ -27,13 +29,14 @@ body {
--animations: on; /* turn off to disable all midnight animations/transitions */
--list-item-transition: 0.2s ease; /* transition for list items */
--dms-icon-svg-transition: 0.4s ease; /* transition for the dms icon */
--border-hover-transition: 0.2s ease; /* transition for borders when hovered */
/* top bar options */
--top-bar-height: var(
--gap
); /* height of the titlebar/top bar (discord default is 36px, 24px recommended if moving/hiding top bar buttons) */
--top-bar-button-position: hide; /* off: default position, hide: hide inbox/support buttons completely, serverlist: move inbox button to server list, titlebar: move inbox button to titlebar (will hide title) */
--top-bar-title-position: hide; /* off: default centered position, hide: hide title completely, left: left align title (like old discord) */
--top-bar-button-position: titlebar; /* off: default position, hide: hide inbox/support buttons completely, serverlist: move inbox button to server list, titlebar: move inbox button to titlebar (will hide title) */
--top-bar-title-position: off; /* off: default centered position, hide: hide title completely, left: left align title (like old discord) */
--subtle-top-bar-title: off; /* off: default, on: hide the icon and use subtle text color (like old discord) */
/* window controls */
@@ -42,9 +45,9 @@ body {
/* dms button icon options */
--custom-dms-icon: custom; /* off: use default discord icon, hide: remove icon entirely, custom: use custom icon */
--dms-icon-svg-url: url("https://upload.wikimedia.org/wikipedia/commons/c/c4/Font_Awesome_5_solid_moon.svg"); /* icon svg url. MUST BE A SVG. */
--dms-icon-svg-url: url("https://refact0r.github.io/midnight-discord/assets/Font_Awesome_5_solid_moon.svg"); /* icon svg url. MUST BE A SVG. */
--dms-icon-svg-size: 90%; /* size of the svg (css mask-size) */
--dms-icon-color-before: var(--icon-secondary); /* normal icon color */
--dms-icon-color-before: var(--icon-subtle); /* normal icon color */
--dms-icon-color-after: var(--white); /* icon color when button is hovered/selected */
/* dms button background options */
@@ -71,12 +74,11 @@ body {
--bg-floating: #{c.$surface}; /* you can set this to a more opaque color if floating panels look too transparent */
/* chatbar options */
--custom-chatbar: aligned; /* off: default chatbar, aligned: chatbar aligned with the user panel, separated: chatbar separated from chat */
--chatbar-height: 47px; /* height of the chatbar (52px by default, 47px recommended for aligned, 56px recommended for separated) */
--chatbar-padding: 8px; /* padding of the chatbar. only applies in aligned mode. */
--custom-chatbar: off; /* off: default chatbar, separated: chatbar separated from chat */
--chatbar-height: 47px; /* height of the chatbar (56px by default, 47px to align with user panel, 56px recommended for separated) */
/* other options */
--small-user-panel: off; /* turn on to make the user panel smaller like in old discord */
--small-user-panel: off; /* off: default user panel, on: smaller user panel like in old discord */
}
/* color options */
+1
View File
@@ -71,6 +71,7 @@ def parse_args() -> (argparse.ArgumentParser, argparse.Namespace):
record_parser.add_argument("-r", "--region", nargs="?", const="slurp", help="record a region")
record_parser.add_argument("-s", "--sound", action="store_true", help="record audio")
record_parser.add_argument("-p", "--pause", action="store_true", help="pause/resume the recording")
record_parser.add_argument("-c", "--clipboard", action="store_true", help="copy recording path to clipboard")
# Create parser for clipboard opts
clipboard_parser = command_parser.add_parser("clipboard", help="open clipboard history")
+15 -1
View File
@@ -1,3 +1,4 @@
from pathlib import Path
import json
import re
import shutil
@@ -7,7 +8,7 @@ from argparse import Namespace
from datetime import datetime
from caelestia.utils.notify import close_notification, notify
from caelestia.utils.paths import recording_notif_path, recording_path, recordings_dir
from caelestia.utils.paths import recording_notif_path, recording_path, recordings_dir, user_config_path
RECORDER = "gpu-screen-recorder"
@@ -63,6 +64,15 @@ class Command:
if self.args.sound:
args += ["-a", "default_output"]
try:
config = json.loads(user_config_path.read_text())
if "record" in config and "extraArgs" in config["record"]:
args += config["record"]["extraArgs"]
except (json.JSONDecodeError, FileNotFoundError):
pass
except TypeError as e:
raise ValueError(f"Config option 'record.extraArgs' should be an array: {e}")
recording_path.parent.mkdir(parents=True, exist_ok=True)
proc = subprocess.Popen([RECORDER, *args, "-o", str(recording_path)], start_new_session=True)
@@ -99,6 +109,10 @@ class Command:
except IOError:
pass
if self.args.clipboard:
file_uri = Path(new_path).resolve().as_uri() + "\n"
subprocess.run(["wl-copy", "--type", "text/uri-list"], input=file_uri.encode())
action = notify(
"--action=watch=Watch",
"--action=open=Open",
+1 -1
View File
@@ -27,7 +27,7 @@ class Command:
# Start the shell
args = ["qs", "-c", "caelestia", "-n"]
if self.args.log_rules:
args.append("--log-rules", self.args.log_rules)
args.extend(["--log-rules", self.args.log_rules])
if self.args.daemon:
args.append("-d")
subprocess.run(args)
+9 -4
View File
@@ -172,10 +172,15 @@ def gen_scheme(scheme, primary: Hct) -> dict[str, str]:
# Material colours
primary_scheme = get_scheme(scheme.variant)(primary, not light, 0)
for colour in vars(MaterialDynamicColors).keys():
colour_name = getattr(MaterialDynamicColors, colour)
if hasattr(colour_name, "get_hct"):
colours[colour] = colour_name.get_hct(primary_scheme)
dyn_colours = MaterialDynamicColors()
for colour in dyn_colours.all_colors:
colours[colour.name] = colour.get_hct(primary_scheme)
# Backwards compatibility with old colour names
if "primaryPaletteKeyColor" in colours: # materialyoucolor-python >= 3.0.0
for colour in "primary", "secondary", "tertiary", "neutral":
colours[f"{colour}_paletteKeyColor"] = colours[f"{colour}PaletteKeyColor"]
colours["neutral_variant_paletteKeyColor"] = colours["neutralVariantPaletteKeyColor"]
# Harmonize terminal colours
for i, hct in enumerate(light_gruvbox if light else dark_gruvbox):
+1 -1
View File
@@ -200,7 +200,7 @@ scheme: Scheme = None
def read_colours_from_file(path: Path) -> dict[str, str]:
return {k.strip(): v.strip() for k, v in (line.split(" ") for line in path.read_text().splitlines())}
return {k.strip(): v.strip() for k, v in (line.split(" ") for line in path.read_text().splitlines() if line)}
def get_scheme_path() -> Path:
+18 -7
View File
@@ -2,6 +2,8 @@ import json
import re
import subprocess
from pathlib import Path
import tempfile
import shutil
from caelestia.utils.colour import get_dynamic_colours
from caelestia.utils.logging import log_exception
@@ -37,7 +39,7 @@ def gen_replace(colours: dict[str, str], template: Path, hash: bool = False) ->
return template
def gen_replace_dynamic(colours: dict[str, str], template: Path) -> str:
def gen_replace_dynamic(colours: dict[str, str], template: Path, mode: str) -> str:
def fill_colour(match: re.Match) -> str:
data = match.group(1).strip().split(".")
if len(data) != 2:
@@ -48,10 +50,16 @@ def gen_replace_dynamic(colours: dict[str, str], template: Path) -> str:
return getattr(colours_dyn[col], form)
# match atomic {{ . }} pairs
field = r"\{\{((?:(?!\{\{|\}\}).)*)\}\}"
dotField = r"\{\{((?:(?!\{\{|\}\}).)*)\}\}"
# match {{ mode }}
modeField = r"\{\{\s*mode\s*\}\}"
colours_dyn = get_dynamic_colours(colours)
template_content = template.read_text()
template_filled = re.sub(field, fill_colour, template_content)
template_filled = re.sub(dotField, fill_colour, template_content)
template_filled = re.sub(modeField, mode, template_filled)
return template_filled
@@ -101,8 +109,11 @@ def gen_sequences(colours: dict[str, str]) -> str:
def write_file(path: Path, content: str) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(content)
with tempfile.NamedTemporaryFile("w") as f:
f.write(content)
f.flush()
shutil.move(f.name, path)
@log_exception
def apply_terms(sequences: str) -> None:
@@ -224,13 +235,13 @@ def apply_cava(colours: dict[str, str]) -> None:
@log_exception
def apply_user_templates(colours: dict[str, str]) -> None:
def apply_user_templates(colours: dict[str, str], mode: str) -> None:
if not user_templates_dir.is_dir():
return
for file in user_templates_dir.iterdir():
if file.is_file():
content = gen_replace_dynamic(colours, file)
content = gen_replace_dynamic(colours, file, mode)
write_file(theme_dir / file.name, content)
@@ -267,4 +278,4 @@ def apply_colours(colours: dict[str, str], mode: str) -> None:
apply_warp(colours, mode)
if check("enableCava"):
apply_cava(colours)
apply_user_templates(colours)
apply_user_templates(colours, mode)
+1 -1
View File
@@ -36,7 +36,7 @@ def print_version() -> None:
shell_ver = subprocess.check_output(["/usr/lib/caelestia/version", "-s"], text=True).strip()
print("Shell:")
print(" ", shell_ver)
except subprocess.CalledProcessError:
except FileNotFoundError:
print("Shell: version helper not available")
print()
+17 -6
View File
@@ -1,5 +1,7 @@
import json
import os
import random
import subprocess
from argparse import Namespace
from pathlib import Path
@@ -11,6 +13,7 @@ from caelestia.utils.hypr import message
from caelestia.utils.material import get_colours_for_image
from caelestia.utils.paths import (
compute_hash,
user_config_path,
wallpaper_link_path,
wallpaper_path_path,
wallpaper_thumbnail_path,
@@ -48,12 +51,7 @@ def get_wallpapers(args: Namespace) -> list[Path]:
return walls
monitors = message("monitors")
filter_size = monitors[0]["width"], monitors[0]["height"]
for monitor in monitors[1:]:
if filter_size[0] > monitor["width"]:
filter_size[0] = monitor["width"]
if filter_size[1] > monitor["height"]:
filter_size[1] = monitor["height"]
filter_size = min(m["width"] for m in monitors), min(m["height"] for m in monitors)
return [f for f in walls if check_wall(f, filter_size, args.threshold)]
@@ -158,6 +156,19 @@ def set_wallpaper(wall: Path | str, no_smart: bool) -> None:
scheme.update_colours()
apply_colours(scheme.colours, scheme.mode)
# Run custom post-hook if configured
try:
cfg = json.loads(user_config_path.read_text()).get("wallpaper", {})
if post_hook := cfg.get("postHook"):
subprocess.run(
post_hook,
shell=True,
env={**os.environ, "WALLPAPER_PATH": str(wall)},
stderr=subprocess.DEVNULL,
)
except (FileNotFoundError, json.JSONDecodeError):
pass
def set_random(args: Namespace) -> None:
wallpapers = get_wallpapers(args)