Theme-linked glow and terminal, tabs, fonts and layout tweaks

- Real window glow (decoration.glow) plus borders and tab bar take their
  colours from DMS (hypr/dms/colors.lua); Hyprland reloads when DMS changes
  the theme.
- kitty: colours and tab colours come from DMS (dank-theme/dank-tabs),
  no more hard-coded palette.
- Group (tab) mode: Mod+W tabs the whole workspace, thinner tab bar.
- Fullscreen programs keep the DMS bar (Mod+F maximizes, Mod+Shift+F is real
  fullscreen); per-monitor workspace switching on Mod+Tab.
- Less jelly animations, smaller gaps, weaker glow.
- JetBrains Mono is the default monospace font (fontconfig + install.sh).
- DMS settings: purple theme, popup transparency 0.98.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-30 16:12:34 +05:00
co-authored by Claude Sonnet 5.5
parent 8937f03200
commit 64aba7caf4
8 changed files with 109 additions and 56 deletions
+2 -1
View File
@@ -18,7 +18,8 @@ Hyprland 0.57 на Fedora 44: тёмный минималистичный рай
| `dms/plugins/networkEditor` | плагин DMS: кнопка в панели, открывает `nm-connection-editor` | | `dms/plugins/networkEditor` | плагин DMS: кнопка в панели, открывает `nm-connection-editor` |
| `dms/settings.json` | настройки DMS (панель, тема `pink`, лаунчер) | | `dms/settings.json` | настройки DMS (панель, тема `pink`, лаунчер) |
| `systemd/user/hyprland-session.target` | нужен порталам (`xdg-desktop-portal`) вне uwsm | | `systemd/user/hyprland-session.target` | нужен порталам (`xdg-desktop-portal`) вне uwsm |
| `kitty/kitty.conf` | терминал | | `kitty/kitty.conf` | терминал: цвета и вкладки подключены из файлов DMS, прозрачность 0.80 |
| `fontconfig/60-monospace-jetbrains.conf` | JetBrains Mono — моноширинный шрифт по умолчанию для всех программ |
| `install.sh` | установка на чистую Fedora: по умолчанию только визуал, `--full` — ещё инструменты и приложения | | `install.sh` | установка на чистую Fedora: по умолчанию только визуал, `--full` — ещё инструменты и приложения |
| `sync.sh` | копирует живой конфиг из `~/.config` в репозиторий | | `sync.sh` | копирует живой конфиг из `~/.config` в репозиторий |
+2 -2
View File
@@ -346,7 +346,7 @@
} }
], ],
"configVersion": 42, "configVersion": 42,
"popupTransparency": 0.95, "popupTransparency": 0.98,
"fontFamily": "JetBrains Mono Medium", "fontFamily": "JetBrains Mono Medium",
"audioVisualizerEnabled": true, "audioVisualizerEnabled": true,
"scrollTitleEnabled": true, "scrollTitleEnabled": true,
@@ -489,7 +489,7 @@
"displayFontFamily": "JetBrains Mono", "displayFontFamily": "JetBrains Mono",
"fontWeight": 300, "fontWeight": 300,
"fontScale": 1, "fontScale": 1,
"currentThemeName": "pink", "currentThemeName": "purple",
"wallpaperFillMode": "Fill", "wallpaperFillMode": "Fill",
"connectedFrameBarStyleBackups": {}, "connectedFrameBarStyleBackups": {},
"frameEnabled": false, "frameEnabled": false,
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<!-- JetBrains Mono is the default monospace font for every program (instead of Noto Sans Mono / DejaVu) -->
<alias binding="same">
<family>monospace</family>
<prefer>
<family>JetBrains Mono</family>
</prefer>
</alias>
</fontconfig>
+6 -5
View File
@@ -22,8 +22,9 @@ Mod+C Центрировать плавающее окно
Mod+Shift+T Закрепить плавающее окно поверх всех Mod+Shift+T Закрепить плавающее окно поверх всех
Mod+E Сменить направление разбиения Mod+E Сменить направление разбиения
Mod+P Pseudo-tiling Mod+P Pseudo-tiling
Mod+W Собрать окна во вкладки (группа) Mod+W Режим вкладок: все окна стола в одну группу; повтор — разобрать обратно
Mod+[ / Mod+] Предыдущая / следующая вкладка группы Пока группа в фокусе, новые окна открываются новыми вкладками
Mod+[ / Mod+] Предыдущая / следующая вкладка (также колесо мыши на полосе вкладок, клик по вкладке)
Mod+Ctrl+H/J/K/L Изменить размер окна (также стрелки, можно удерживать) Mod+Ctrl+H/J/K/L Изменить размер окна (также стрелки, можно удерживать)
Mod+ЛКМ / ПКМ Перетащить / изменить размер окна мышью Mod+ЛКМ / ПКМ Перетащить / изменить размер окна мышью
@@ -50,9 +51,9 @@ Mod+1..0 Перейти на стол 1..10 (повтор = наза
Mod+Shift+1..0 Перенести окно на стол 1..10 Mod+Shift+1..0 Перенести окно на стол 1..10
Alt+Tab Предыдущее окно (ещё раз — обратно) Alt+Tab Предыдущее окно (ещё раз — обратно)
Mod+Alt+Tab Следующее окно на этом столе Mod+Alt+Tab Следующее окно на этом столе
Mod+Tab Следующий стол Mod+Tab Следующий стол этого монитора (на другой не уходит)
Mod+Shift+Tab Предыдущий стол Mod+Shift+Tab Предыдущий стол этого монитора
Mod+колесо мыши Листать столы Mod+колесо мыши Листать столы этого монитора
Жест 3 пальца Листать столы Жест 3 пальца Листать столы
Mod+, / Mod+. Фокус на левый / правый монитор Mod+, / Mod+. Фокус на левый / правый монитор
Mod+Shift+- Убрать окно в scratchpad Mod+Shift+- Убрать окно в scratchpad
+73 -17
View File
@@ -1,4 +1,21 @@
-- Hyprland 0.57 (Lua). Clean dark work setup; shell = DankMaterialShell. -- Hyprland 0.57 (Lua). Clean dark work setup; shell = DankMaterialShell.
pcall(require, "dms.colors") -- DMS theme colours; DMS rewrites that file on every theme change and Hyprland reloads when it does
-- Theme colours as plain hex, read from the file DMS regenerates (fallbacks = the pink theme).
local function dms_hex(key, fallback)
local f = io.open(os.getenv("HOME") .. "/.config/hypr/dms/colors.lua")
local t = f and f:read("*a") or ""
if f then f:close() end
return t:match("%f[%w_]" .. key .. '%s*=%s*"rgb%((%x%x%x%x%x%x)%)"') or fallback
end
local function lighten(hex, k) -- mix a colour with white
local function m(c) return math.floor(c + (255 - c) * k + 0.5) end
return string.format("%02x%02x%02x", m(tonumber(hex:sub(1, 2), 16)), m(tonumber(hex:sub(3, 4), 16)), m(tonumber(hex:sub(5, 6), 16)))
end
local primary = dms_hex("active_border", "e91e63")
local outline = dms_hex("inactive_border", "9f8c8e")
local light = lighten(primary, 0.55)
-- Fallback login session: GNOME (via GDM). -- Fallback login session: GNOME (via GDM).
local terminal = "kitty" local terminal = "kitty"
@@ -44,12 +61,12 @@ end)
----------------------- -----------------------
hl.config({ hl.config({
general = { general = {
gaps_in = 6, gaps_in = 4,
gaps_out = 14, gaps_out = 10,
border_size = 2, border_size = 2,
col = { col = {
active_border = { colors = { "rgba(e91e63ff)", "rgba(ff6398ff)", "rgba(f8bbd9ff)", "rgba(e91e63ff)" }, angle = 45 }, active_border = { colors = { "rgba(" .. primary .. "ff)", "rgba(" .. light .. "ff)", "rgba(" .. primary .. "ff)" }, angle = 45 },
inactive_border = "rgba(3a2a2eaa)", inactive_border = "rgba(" .. outline .. "40)",
}, },
resize_on_border = true, resize_on_border = true,
allow_tearing = false, allow_tearing = false,
@@ -63,11 +80,18 @@ hl.config({
dim_inactive = true, dim_inactive = true,
dim_strength = 0.06, dim_strength = 0.06,
shadow = { shadow = {
enabled = true, enabled = true,
range = 30, range = 20,
render_power = 3, render_power = 3,
color = 0x66e91e63, -- soft pink glow on the focused window color = 0x55000000,
color_inactive = 0x66000000, color_inactive = 0x44000000,
},
glow = { -- light around the focused window, colour follows the DMS theme
enabled = true,
range = 14,
render_power = 3,
color = "rgba(" .. primary .. "55)",
color_inactive = "rgba(00000000)",
}, },
blur = { blur = {
enabled = true, enabled = true,
@@ -79,6 +103,19 @@ hl.config({
popups = true, popups = true,
}, },
}, },
group = {
auto_group = true, -- a new window opened while a group is focused becomes another tab
insert_after_current = true,
focus_removed_window = true,
col = { border_active = "rgba(" .. primary .. "ff)", border_inactive = "rgba(" .. outline .. "40)" },
groupbar = {
enabled = true, height = 16, font_size = 10, font_family = "JetBrains Mono",
render_titles = true, gradients = true, rounding = 6, gaps_in = 2, gaps_out = 2,
indicator_height = 0, scrolling = true, middle_click_close = true,
text_color = "rgba(ffffffff)", text_color_inactive = "rgba(b8a4a9ff)",
col = { active = "rgba(" .. primary .. "dd)", inactive = "rgba(2a2024cc)" },
},
},
animations = { enabled = true }, animations = { enabled = true },
binds = { workspace_back_and_forth = true }, binds = { workspace_back_and_forth = true },
dwindle = { preserve_split = true, force_split = 2 }, -- new window always opens to the right/below dwindle = { preserve_split = true, force_split = 2 }, -- new window always opens to the right/below
@@ -99,14 +136,12 @@ hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1}
hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} } }) hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} } })
hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} } }) hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} } })
hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } }) hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
hl.curve("snappy", { type = "spring", mass = 1, stiffness = 340, damping = 24 })
hl.curve("bouncy", { type = "spring", mass = 1, stiffness = 280, damping = 17 })
hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" }) hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
hl.animation({ leaf = "border", enabled = true, speed = 4, bezier = "easeOutQuint" }) hl.animation({ leaf = "border", enabled = true, speed = 4, bezier = "easeOutQuint" })
hl.animation({ leaf = "borderangle", enabled = true, speed = 60, bezier = "linear", style = "loop" }) -- slowly rotating gradient border hl.animation({ leaf = "borderangle", enabled = true, speed = 60, bezier = "linear", style = "loop" }) -- slowly rotating gradient border
hl.animation({ leaf = "windows", enabled = true, speed = 3.2, spring = "snappy" }) hl.animation({ leaf = "windows", enabled = true, speed = 3.0, bezier = "easeOutQuint" })
hl.animation({ leaf = "windowsIn", enabled = true, speed = 3.0, spring = "bouncy", style = "popin 88%" }) hl.animation({ leaf = "windowsIn", enabled = true, speed = 2.6, bezier = "easeOutQuint", style = "popin 94%" })
hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.2, bezier = "quick", style = "popin 88%" }) hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.2, bezier = "quick", style = "popin 88%" })
hl.animation({ leaf = "fade", enabled = true, speed = 2, bezier = "quick" }) hl.animation({ leaf = "fade", enabled = true, speed = 2, bezier = "quick" })
hl.animation({ leaf = "fadeDim", enabled = true, speed = 2.5, bezier = "quick" }) hl.animation({ leaf = "fadeDim", enabled = true, speed = 2.5, bezier = "quick" })
@@ -181,13 +216,34 @@ b(mod .. " + SHIFT + SPACE", hl.dsp.window.float({ action = "toggle" }))
b(mod .. " + C", hl.dsp.window.center()) b(mod .. " + C", hl.dsp.window.center())
b(mod .. " + E", hl.dsp.layout("togglesplit")) b(mod .. " + E", hl.dsp.layout("togglesplit"))
b(mod .. " + P", hl.dsp.window.pseudo()) b(mod .. " + P", hl.dsp.window.pseudo())
b(mod .. " + W", hl.dsp.group.toggle()) -- Tabs: Mod+W puts every tiled window of this workspace into one tabbed group; press it again to split them back.
-- While a group is focused, new windows join it as tabs. Mod+[ / Mod+] or the mouse wheel on the tab bar switch tabs.
function HL_toggle_tabs()
local a = hl.get_active_window()
if not a then return end
if a.group and a.group.size > 1 then
hl.dispatch(hl.dsp.group.toggle())
return
end
local wins = hl.get_windows({ workspace = a.workspace.id, floating = false, mapped = true })
if #wins < 2 then
hl.dispatch(hl.dsp.group.toggle()) -- single window: just start a group, the next windows become its tabs
return
end
if not a.group then hl.dispatch(hl.dsp.group.toggle()) end
local g = hl.get_window("address:" .. a.address).group
for _, w in ipairs(wins) do
if w.address ~= a.address and not w.group then g:add(w) end
end
hl.dispatch(hl.dsp.focus({ window = "address:" .. a.address }))
end
b(mod .. " + W", HL_toggle_tabs)
b("ALT + TAB", hl.dsp.exec_cmd("~/.config/hypr/scripts/prev-window.sh")) -- previous window (press again to go back) b("ALT + TAB", hl.dsp.exec_cmd("~/.config/hypr/scripts/prev-window.sh")) -- previous window (press again to go back)
b(mod .. " + ALT + TAB", hl.dsp.window.cycle_next()) -- next window on this workspace b(mod .. " + ALT + TAB", hl.dsp.window.cycle_next()) -- next window on this workspace
b(mod .. " + TAB", hl.dsp.focus({ workspace = "e+1" })) b(mod .. " + TAB", hl.dsp.focus({ workspace = "m+1" })) -- next open workspace on THIS monitor
b(mod .. " + SHIFT + TAB", hl.dsp.focus({ workspace = "e-1" })) b(mod .. " + SHIFT + TAB", hl.dsp.focus({ workspace = "m-1" }))
b(mod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" })) b(mod .. " + mouse_down", hl.dsp.focus({ workspace = "m+1" }))
b(mod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" })) b(mod .. " + mouse_up", hl.dsp.focus({ workspace = "m-1" }))
-- workspaces 1..10 -- workspaces 1..10
for i = 1, 10 do for i = 1, 10 do
+8 -1
View File
@@ -58,7 +58,7 @@ done
# ---------- проверки ---------- # ---------- проверки ----------
step "Проверки" step "Проверки"
[ "$(id -u)" -ne 0 ] || die "запускайте от обычного пользователя, sudo скрипт вызовет сам" [ "$(id -u)" -ne 0 ] || die "запускайте от обычного пользователя, sudo скрипт вызовет сам"
for d in hypr dms/plugins/networkEditor systemd/user kitty; do for d in hypr dms/plugins/networkEditor systemd/user kitty fontconfig; do
[ -e "$REPO/$d" ] || die "в репозитории нет $d (запускайте install.sh из корня hyprland-rising)" [ -e "$REPO/$d" ] || die "в репозитории нет $d (запускайте install.sh из корня hyprland-rising)"
done done
. /etc/os-release 2>/dev/null || true . /etc/os-release 2>/dev/null || true
@@ -151,6 +151,13 @@ PY
run cp -a "$REPO/kitty/kitty.conf" "$CFG/kitty/kitty.conf" run cp -a "$REPO/kitty/kitty.conf" "$CFG/kitty/kitty.conf"
info "kitty/kitty.conf" info "kitty/kitty.conf"
# JetBrains Mono as the default monospace font for every program
run mkdir -p "$CFG/fontconfig/conf.d"
run cp -a "$REPO/fontconfig/60-monospace-jetbrains.conf" "$CFG/fontconfig/conf.d/60-monospace-jetbrains.conf"
run fc-cache -f || true
command -v gsettings >/dev/null && run gsettings set org.gnome.desktop.interface monospace-font-name 'JetBrains Mono 11' || true
info "fontconfig: JetBrains Mono как моноширинный шрифт по умолчанию"
run cp -a "$REPO/systemd/user/hyprland-session.target" "$CFG/systemd/user/" run cp -a "$REPO/systemd/user/hyprland-session.target" "$CFG/systemd/user/"
run systemctl --user daemon-reload || warn "systemctl --user недоступен (нет пользовательской сессии systemd): выполните daemon-reload после входа" run systemctl --user daemon-reload || warn "systemctl --user недоступен (нет пользовательской сессии systemd): выполните daemon-reload после входа"
info "systemd/user/hyprland-session.target (нужен порталам: выбор файлов, демонстрация экрана)" info "systemd/user/hyprland-session.target (нужен порталам: выбор файлов, демонстрация экрана)"
+5 -29
View File
@@ -36,6 +36,8 @@ copy_on_select clipboard
strip_trailing_spaces smart strip_trailing_spaces smart
# ---------- Tabs ---------- # ---------- Tabs ----------
# DMS tab colours; the layout lines below are mine and override its layout (kitty does not allow comments after include)
include dank-tabs.conf
tab_bar_edge top tab_bar_edge top
tab_bar_style powerline tab_bar_style powerline
tab_powerline_style round tab_powerline_style round
@@ -53,7 +55,6 @@ inactive_text_alpha 0.75
window_border_width 1pt window_border_width 1pt
# ---------- URLs ---------- # ---------- URLs ----------
url_color #7dcfff
url_style curly url_style curly
detect_urls yes detect_urls yes
underline_hyperlinks hover underline_hyperlinks hover
@@ -63,40 +64,15 @@ enable_audio_bell no
visual_bell_duration 0.15 ease-out visual_bell_duration 0.15 ease-out
window_alert_on_bell yes window_alert_on_bell yes
# ---------- Colors: Tokyo Night Storm tuned for glass ---------- # ---------- Colors: from DankMaterialShell ----------
foreground #c0caf5 # dank-theme.conf is regenerated by DMS on every theme change; tab colours come from dank-tabs.conf (included above the tab section)
background #11111b include dank-theme.conf
selection_foreground #11111b
selection_background #bb9af7
cursor #ff9e64
cursor_text_color #11111b
url_color #7dcfff
active_tab_foreground #11111b
active_tab_background #bb9af7
inactive_tab_foreground #a9b1d6
inactive_tab_background #1f2335
tab_bar_background none tab_bar_background none
mark1_foreground #11111b mark1_foreground #11111b
mark1_background #ff9e64 mark1_background #ff9e64
color0 #414868
color8 #565f89
color1 #f7768e
color9 #ff899d
color2 #9ece6a
color10 #b9f27c
color3 #e0af68
color11 #ffc777
color4 #7aa2f7
color12 #8db0ff
color5 #bb9af7
color13 #c9a9ff
color6 #7dcfff
color14 #a4daff
color7 #a9b1d6
color15 #c0caf5
# ---------- Shortcuts ---------- # ---------- Shortcuts ----------
# Plain Ctrl+C / Ctrl+V: Ctrl+C copies when text is selected, otherwise it is the usual interrupt (SIGINT) # Plain Ctrl+C / Ctrl+V: Ctrl+C copies when text is selected, otherwise it is the usual interrupt (SIGINT)
+2 -1
View File
@@ -4,10 +4,11 @@
set -e set -e
cd "$(dirname "$0")" cd "$(dirname "$0")"
C=${XDG_CONFIG_HOME:-$HOME/.config} C=${XDG_CONFIG_HOME:-$HOME/.config}
mkdir -p hypr dms/plugins systemd/user kitty mkdir -p hypr dms/plugins systemd/user kitty fontconfig
rsync -a --delete --exclude 'dms/' --exclude 'hyprlock.conf' --exclude 'hyprpaper.conf' --exclude 'scripts/osd.sh' "$C/hypr/" hypr/ rsync -a --delete --exclude 'dms/' --exclude 'hyprlock.conf' --exclude 'hyprpaper.conf' --exclude 'scripts/osd.sh' "$C/hypr/" hypr/
rsync -a --delete "$C/dms/plugins/networkEditor/" dms/plugins/networkEditor/ rsync -a --delete "$C/dms/plugins/networkEditor/" dms/plugins/networkEditor/
cp -f "$C/dms/settings.json" dms/settings.json cp -f "$C/dms/settings.json" dms/settings.json
cp -f "$C/systemd/user/hyprland-session.target" systemd/user/ cp -f "$C/systemd/user/hyprland-session.target" systemd/user/
cp -f "$C/kitty/kitty.conf" kitty/kitty.conf cp -f "$C/kitty/kitty.conf" kitty/kitty.conf
cp -f "$C/fontconfig/conf.d/60-monospace-jetbrains.conf" fontconfig/
git status --short git status --short