feat(assets): NexusOS asset + theme rebrand

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jon
2026-07-11 07:25:15 -05:00
parent 5c2df30342
commit 3d1168ff8c
564 changed files with 4823 additions and 56 deletions
+30
View File
@@ -0,0 +1,30 @@
[General]
TitleAlignment=Left
TitleEdgeTop=0
TitleEdgeBottom=0
TitleEdgeLeft=12
TitleEdgeRight=8
TitleBorderLeft=0
TitleBorderRight=0
TitleHeight=30
BorderLeft=1
BorderRight=1
BorderBottom=5
BorderTop=0
ButtonWidth=32
ButtonSize=32
ButtonSpacing=8
ButtonMarginTop=0
ExplicitButtonSpacer=0
PaddingTop=0
PaddingBottom=0
PaddingRight=0
PaddingLeft=0
ActiveTextColor=#f2f2f2
ActiveTextShadowColor=0,0,0,0
InactiveTextColor=#6e7173
InactiveTextShadowColor=0,0,0,0
Shadow=false
ShadowColor=0,0,0,180
ShadowStrength=100
Animation=0
+29
View File
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<g id="active-center">
<circle cx="7.5" cy="7.5" r="1.5" fill="#a8a8a8"/>
<circle cx="12.5" cy="7.5" r="1.5" fill="#a8a8a8"/>
<circle cx="7.5" cy="12.5" r="1.5" fill="#a8a8a8"/>
<circle cx="12.5" cy="12.5" r="1.5" fill="#a8a8a8"/>
</g>
<g id="hover-center">
<circle cx="10" cy="10" r="9" fill="#88008f"/>
<circle cx="7.5" cy="7.5" r="1.5" fill="#ffffff"/>
<circle cx="12.5" cy="7.5" r="1.5" fill="#ffffff"/>
<circle cx="7.5" cy="12.5" r="1.5" fill="#ffffff"/>
<circle cx="12.5" cy="12.5" r="1.5" fill="#ffffff"/>
</g>
<g id="pressed-center">
<circle cx="10" cy="10" r="9" fill="#5e0066"/>
<circle cx="7.5" cy="7.5" r="1.5" fill="#ffffff"/>
<circle cx="12.5" cy="7.5" r="1.5" fill="#ffffff"/>
<circle cx="7.5" cy="12.5" r="1.5" fill="#ffffff"/>
<circle cx="12.5" cy="12.5" r="1.5" fill="#ffffff"/>
</g>
<g id="inactive-center">
<circle cx="7.5" cy="7.5" r="1.5" fill="#6e7173"/>
<circle cx="12.5" cy="7.5" r="1.5" fill="#6e7173"/>
<circle cx="7.5" cy="12.5" r="1.5" fill="#6e7173"/>
<circle cx="12.5" cy="12.5" r="1.5" fill="#6e7173"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<g id="active-center">
<circle cx="10" cy="10" r="6" fill="#e9524a"/>
</g>
<g id="hover-center">
<circle cx="10" cy="10" r="6" fill="#e9524a"/>
<path d="M7.5,7.5 L12.5,12.5 M12.5,7.5 L7.5,12.5" stroke="#4a0000" stroke-width="1.2" stroke-linecap="round"/>
</g>
<g id="pressed-center">
<circle cx="10" cy="10" r="6" fill="#c04040"/>
<path d="M7.5,7.5 L12.5,12.5 M12.5,7.5 L7.5,12.5" stroke="#4a0000" stroke-width="1.2" stroke-linecap="round"/>
</g>
<g id="inactive-center">
<circle cx="10" cy="10" r="6" fill="#5d5d5d"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 674 B

+93
View File
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
NexusOS Aurorae decoration — PlasmaCore.FrameSvg format.
Aurorae uses PlasmaCore.FrameSvg, which requires elements named:
{prefix}-topleft {prefix}-top {prefix}-topright
{prefix}-left {prefix}-center {prefix}-right
{prefix}-bottomleft {prefix}-bottom {prefix}-bottomright
Prefixes used: decoration, decoration-inactive,
decoration-maximized, decoration-maximized-inactive
All elements sit at (0,0). QSvgRenderer renders each by ID independently
so coordinate overlap is harmless — FrameSvg uses each element's own
bounding box as the source rect and stretches/tiles it as needed.
Corner sizes drive FrameSvg margin inference:
topleft = 1×30 → left=1px, top(titlebar)=30px
bottomleft = 1×5 → bottom=5px, right=1px
-->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="32" height="36">
<!-- ══ ACTIVE (non-maximized) — prefix: decoration ══════════════════ -->
<g id="decoration-topleft">
<rect x="0" y="0" width="1" height="29" fill="#1e1526"/>
<rect x="0" y="29" width="1" height="1" fill="#8cc63f"/>
</g>
<g id="decoration-top">
<rect x="0" y="0" width="32" height="29" fill="#1e1526"/>
<rect x="0" y="29" width="32" height="1" fill="#8cc63f"/>
</g>
<g id="decoration-topright">
<rect x="0" y="0" width="1" height="29" fill="#1e1526"/>
<rect x="0" y="29" width="1" height="1" fill="#8cc63f"/>
</g>
<rect id="decoration-left" x="0" y="0" width="1" height="1" fill="#2e3236"/>
<rect id="decoration-center" x="0" y="0" width="32" height="1" fill="none"/>
<rect id="decoration-right" x="0" y="0" width="1" height="1" fill="#2e3236"/>
<rect id="decoration-bottomleft" x="0" y="0" width="1" height="5" fill="#2e3236"/>
<rect id="decoration-bottom" x="0" y="0" width="32" height="5" fill="#2e3236"/>
<rect id="decoration-bottomright" x="0" y="0" width="1" height="5" fill="#2e3236"/>
<!-- ══ INACTIVE (non-maximized) — prefix: decoration-inactive ═══════ -->
<rect id="decoration-inactive-topleft" x="0" y="0" width="1" height="30" fill="#1a1a20"/>
<rect id="decoration-inactive-top" x="0" y="0" width="32" height="30" fill="#1a1a20"/>
<rect id="decoration-inactive-topright" x="0" y="0" width="1" height="30" fill="#1a1a20"/>
<rect id="decoration-inactive-left" x="0" y="0" width="1" height="1" fill="#252525"/>
<rect id="decoration-inactive-center" x="0" y="0" width="32" height="1" fill="none"/>
<rect id="decoration-inactive-right" x="0" y="0" width="1" height="1" fill="#252525"/>
<rect id="decoration-inactive-bottomleft" x="0" y="0" width="1" height="5" fill="#252525"/>
<rect id="decoration-inactive-bottom" x="0" y="0" width="32" height="5" fill="#252525"/>
<rect id="decoration-inactive-bottomright" x="0" y="0" width="1" height="5" fill="#252525"/>
<!-- ══ MAXIMIZED ACTIVE — prefix: decoration-maximized ═════════════ -->
<!-- FrameSvg uses NoBorder for maximized: only -center is rendered,
stretched to fill the full width × maximizedBorders.top (TitleHeight). -->
<g id="decoration-maximized-center">
<rect x="0" y="0" width="32" height="29" fill="#1e1526"/>
<rect x="0" y="29" width="32" height="1" fill="#8cc63f"/>
</g>
<rect id="decoration-maximized-topleft" x="0" y="0" width="1" height="30" fill="#1e1526"/>
<rect id="decoration-maximized-top" x="0" y="0" width="32" height="30" fill="#1e1526"/>
<rect id="decoration-maximized-topright" x="0" y="0" width="1" height="30" fill="#1e1526"/>
<rect id="decoration-maximized-left" x="0" y="0" width="1" height="1" fill="none"/>
<rect id="decoration-maximized-right" x="0" y="0" width="1" height="1" fill="none"/>
<rect id="decoration-maximized-bottomleft" x="0" y="0" width="1" height="1" fill="none"/>
<rect id="decoration-maximized-bottom" x="0" y="0" width="32" height="1" fill="none"/>
<rect id="decoration-maximized-bottomright" x="0" y="0" width="1" height="1" fill="none"/>
<!-- ══ MAXIMIZED INACTIVE — prefix: decoration-maximized-inactive ══ -->
<rect id="decoration-maximized-inactive-center" x="0" y="0" width="32" height="30" fill="#1a1a20"/>
<rect id="decoration-maximized-inactive-topleft" x="0" y="0" width="1" height="30" fill="#1a1a20"/>
<rect id="decoration-maximized-inactive-top" x="0" y="0" width="32" height="30" fill="#1a1a20"/>
<rect id="decoration-maximized-inactive-topright" x="0" y="0" width="1" height="30" fill="#1a1a20"/>
<rect id="decoration-maximized-inactive-left" x="0" y="0" width="1" height="1" fill="none"/>
<rect id="decoration-maximized-inactive-right" x="0" y="0" width="1" height="1" fill="none"/>
<rect id="decoration-maximized-inactive-bottomleft" x="0" y="0" width="1" height="1" fill="none"/>
<rect id="decoration-maximized-inactive-bottom" x="0" y="0" width="32" height="1" fill="none"/>
<rect id="decoration-maximized-inactive-bottomright" x="0" y="0" width="1" height="1" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<g id="active-center">
<path d="M5,13 L10,7 L15,13" fill="none" stroke="#a8a8a8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="hover-center">
<circle cx="10" cy="10" r="9" fill="#88008f"/>
<path d="M5,13 L10,7 L15,13" fill="none" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="pressed-center">
<circle cx="10" cy="10" r="9" fill="#5e0066"/>
<path d="M5,13 L10,7 L15,13" fill="none" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="inactive-center">
<path d="M5,13 L10,7 L15,13" fill="none" stroke="#6e7173" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 862 B

+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<g id="active-center">
<path d="M5,7 L10,13 L15,7" fill="none" stroke="#a8a8a8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="hover-center">
<circle cx="10" cy="10" r="9" fill="#88008f"/>
<path d="M5,7 L10,13 L15,7" fill="none" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="pressed-center">
<circle cx="10" cy="10" r="9" fill="#5e0066"/>
<path d="M5,7 L10,13 L15,7" fill="none" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="inactive-center">
<path d="M5,7 L10,13 L15,7" fill="none" stroke="#6e7173" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 858 B

+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<g id="active-center">
<circle cx="10" cy="10" r="6" fill="#59c837"/>
</g>
<g id="hover-center">
<circle cx="10" cy="10" r="6" fill="#59c837"/>
<rect x="7" y="7" width="6" height="6" rx="0.8" fill="none" stroke="#003a00" stroke-width="1.1"/>
</g>
<g id="pressed-center">
<circle cx="10" cy="10" r="6" fill="#3d9a1f"/>
<rect x="7" y="7" width="6" height="6" rx="0.8" fill="none" stroke="#003a00" stroke-width="1.1"/>
</g>
<g id="inactive-center">
<circle cx="10" cy="10" r="6" fill="#5d5d5d"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 648 B

+18
View File
@@ -0,0 +1,18 @@
[Desktop Entry]
Name=NexusOS
Comment=Flat dark-purple window decoration, lime-green focus accent
Type=Service
X-KDE-ServiceTypes=org.kde.kwin.decoration
[KWin]
Type=Aurorae
X-KDE-PluginInfo-Author=Jon
X-KDE-PluginInfo-Email=
X-KDE-PluginInfo-Name=NexusOS
X-KDE-PluginInfo-Version=1.0
X-KDE-PluginInfo-Website=
X-KDE-PluginInfo-Category=
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=false
+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<g id="active-center">
<circle cx="10" cy="10" r="6" fill="#f1ae1b"/>
</g>
<g id="hover-center">
<circle cx="10" cy="10" r="6" fill="#f1ae1b"/>
<line x1="7" y1="10" x2="13" y2="10" stroke="#4a3000" stroke-width="1.2" stroke-linecap="round"/>
</g>
<g id="pressed-center">
<circle cx="10" cy="10" r="6" fill="#c48a00"/>
<line x1="7" y1="10" x2="13" y2="10" stroke="#4a3000" stroke-width="1.2" stroke-linecap="round"/>
</g>
<g id="inactive-center">
<circle cx="10" cy="10" r="6" fill="#5d5d5d"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 648 B

+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<g id="active-center">
<circle cx="10" cy="10" r="6" fill="#59c837"/>
</g>
<g id="hover-center">
<circle cx="10" cy="10" r="6" fill="#59c837"/>
<rect x="8" y="6" width="4.5" height="4.5" rx="0.6" fill="none" stroke="#003a00" stroke-width="1.0"/>
<rect x="6.5" y="8" width="4.5" height="4.5" rx="0.6" fill="#59c837" stroke="#003a00" stroke-width="1.0"/>
</g>
<g id="pressed-center">
<circle cx="10" cy="10" r="6" fill="#3d9a1f"/>
<rect x="8" y="6" width="4.5" height="4.5" rx="0.6" fill="none" stroke="#003a00" stroke-width="1.0"/>
<rect x="6.5" y="8" width="4.5" height="4.5" rx="0.6" fill="#3d9a1f" stroke="#003a00" stroke-width="1.0"/>
</g>
<g id="inactive-center">
<circle cx="10" cy="10" r="6" fill="#5d5d5d"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 878 B

+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<g id="active-center">
<line x1="5" y1="7" x2="15" y2="7" stroke="#a8a8a8" stroke-width="1.5" stroke-linecap="round"/>
<path d="M5,10 L10,14 L15,10" fill="none" stroke="#a8a8a8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="hover-center">
<circle cx="10" cy="10" r="9" fill="#88008f"/>
<line x1="5" y1="7" x2="15" y2="7" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round"/>
<path d="M5,10 L10,14 L15,10" fill="none" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="pressed-center">
<circle cx="10" cy="10" r="9" fill="#5e0066"/>
<line x1="5" y1="7" x2="15" y2="7" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round"/>
<path d="M5,10 L10,14 L15,10" fill="none" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="inactive-center">
<line x1="5" y1="7" x2="15" y2="7" stroke="#6e7173" stroke-width="1.5" stroke-linecap="round"/>
<path d="M5,10 L10,14 L15,10" fill="none" stroke="#6e7173" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+138
View File
@@ -0,0 +1,138 @@
#!/usr/bin/env python3
"""Generate NexusOS.colors (KDE KColorScheme format) from _palette.py.
Run from anywhere:
python3 assets/themes/KDE/generate_plasma_colors.py
Writes to assets/themes/KDE/plasma/NexusOS/NexusOS.colors (relative to repo root).
"""
import os
import sys
# Resolve repo root relative to this script's location
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
REPO_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, "../../.."))
sys.path.insert(0, os.path.join(REPO_ROOT, "assets/themes"))
import _palette as p # noqa: E402
OUT = os.path.join(SCRIPT_DIR, "plasma/NexusOS/NexusOS.colors")
def rgb(hexstr):
h = hexstr.lstrip("#")
return f"{int(h[0:2],16)},{int(h[2:4],16)},{int(h[4:6],16)}"
def section(name, bg_normal, bg_alt, fg_normal, fg_inactive, fg_active,
fg_link, fg_visited, fg_neg, fg_neutral, fg_pos,
deco_focus, deco_hover):
return f"""[Colors:{name}]
BackgroundNormal={rgb(bg_normal)}
BackgroundAlternate={rgb(bg_alt)}
ForegroundNormal={rgb(fg_normal)}
ForegroundInactive={rgb(fg_inactive)}
ForegroundActive={rgb(fg_active)}
ForegroundLink={rgb(fg_link)}
ForegroundVisited={rgb(fg_visited)}
ForegroundNegative={rgb(fg_neg)}
ForegroundNeutral={rgb(fg_neutral)}
ForegroundPositive={rgb(fg_pos)}
DecorationFocus={rgb(deco_focus)}
DecorationHover={rgb(deco_hover)}
"""
SHARED = dict(
fg_normal = "#" + p.TEXT_PRIMARY,
fg_inactive = "#" + p.TEXT_SECONDARY,
fg_active = "#" + p.BRAND_GREEN,
fg_link = "#" + p.BRAND_GREEN_LIGHT,
fg_visited = "#" + p.BRAND_PURPLE_LIGHT,
fg_neg = "#" + p.ERROR,
fg_neutral = "#" + p.WARNING,
fg_pos = "#" + p.SUCCESS,
deco_focus = "#" + p.BRAND_GREEN,
deco_hover = "#" + p.BRAND_PURPLE,
)
content = f"""\
[ColorEffects:Disabled]
Color=56,56,56
ColorAmount=0
ColorEffect=0
ContrastAmount=0.1
ContrastEffect=2
IntensityAmount=0
IntensityEffect=0
[ColorEffects:Inactive]
ChangeSelectionColor=true
Color=112,111,110
ColorAmount=0.025
ColorEffect=0
ContrastAmount=0.1
ContrastEffect=2
Enable=false
IntensityAmount=0
IntensityEffect=0
""" + section(
"Window",
bg_normal="#" + p.BASE_BG,
bg_alt ="#" + p.SURFACE_BG,
**SHARED,
) + section(
"View",
bg_normal="#" + p.BASE_BG,
bg_alt ="#" + p.SURFACE_BG,
**SHARED,
) + section(
"Button",
bg_normal="#" + p.SURFACE_BG_ALT,
bg_alt ="#" + p.BASE_BG,
**SHARED,
) + section(
"Selection",
bg_normal ="#" + p.BRAND_PURPLE,
bg_alt ="#" + p.BRAND_GREEN_DARK,
fg_normal ="#" + p.TEXT_ON_SELECTION,
fg_inactive="#" + p.TEXT_ON_SELECTION,
fg_active ="#" + p.BRAND_GREEN,
fg_link ="#" + p.BRAND_GREEN_LIGHT,
fg_visited="#" + p.BRAND_PURPLE_LIGHT,
fg_neg ="#" + p.ERROR,
fg_neutral="#" + p.WARNING,
fg_pos ="#" + p.SUCCESS,
deco_focus="#" + p.BRAND_GREEN,
deco_hover="#" + p.BRAND_PURPLE,
) + section(
"Tooltip",
bg_normal="#" + p.OVERLAY_BG,
bg_alt ="#" + p.BORDER_STRONG,
**SHARED,
) + section(
"Complementary",
bg_normal="#" + p.SURFACE_BG_ALT,
bg_alt ="#" + p.OVERLAY_BG,
**SHARED,
) + section(
"Header",
bg_normal="#" + p.BASE_BG,
bg_alt ="#" + p.SURFACE_BG_ALT,
**SHARED,
) + f"""\
[General]
ColorScheme=NexusOS
Name=NexusOS
shadeSortColumn=true
[KDE]
contrast=4
"""
os.makedirs(os.path.dirname(OUT), exist_ok=True)
with open(OUT, "w") as f:
f.write(content)
print(f"Written: {OUT}")
+145
View File
@@ -0,0 +1,145 @@
#!/usr/bin/env bash
# NexusOS KDE Plasma theme installer — idempotent, safe to re-run.
# Equivalent of assets/themes/install-theme.sh but for KDE.
#
# Usage:
# assets/themes/KDE/install-plasma.sh [--no-sddm]
#
# --no-sddm skip the SDDM step (requires sudo) — useful for live testing
set -euo pipefail
KDE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO="$(cd "$KDE/../../.." && pwd)"
NO_SDDM=0
for arg in "$@"; do
[[ "$arg" == "--no-sddm" ]] && NO_SDDM=1
done
echo "NexusOS KDE installer — repo: $REPO"
# ── 1. Create target directories ────────────────────────────────────────
mkdir -p \
~/.local/share/aurorae/themes \
~/.local/share/plasma/desktoptheme \
~/.local/share/color-schemes \
~/.local/share/konsole \
~/.local/share/kscreenlocker/themes \
~/.config/Kvantum
# ── 2. Symlink theme directories (update automatically on git pull) ──────
ln -sfn "$KDE/aurorae/NexusOS" ~/.local/share/aurorae/themes/NexusOS
ln -sfn "$KDE/plasma/NexusOS" ~/.local/share/plasma/desktoptheme/NexusOS
ln -sfn "$KDE/kscreenlocker/NexusOS" ~/.local/share/kscreenlocker/themes/NexusOS
ln -sfn "$KDE/kvantum/NexusOS" ~/.config/Kvantum/NexusOS
echo " [ok] theme symlinks"
# ── 3. Copy files that need to be in specific locations (not symlinks) ───
cp -f "$KDE/plasma/NexusOS/NexusOS.colors" ~/.local/share/color-schemes/
cp -f "$KDE/konsole/NexusOS.colorscheme" ~/.local/share/konsole/
cp -f "$KDE/konsole/NexusOS-Promethean.colorscheme" ~/.local/share/konsole/
cp -f "$KDE/konsole/Promethean.profile" ~/.local/share/konsole/
echo " [ok] color scheme + konsole files"
# ── 4. KDE color scheme ──────────────────────────────────────────────────
if command -v plasma-apply-colorscheme &>/dev/null; then
plasma-apply-colorscheme NexusOS 2>/dev/null && echo " [ok] color scheme applied"
else
echo " [skip] plasma-apply-colorscheme not found — apply color scheme manually"
fi
# ── 5. Kvantum ───────────────────────────────────────────────────────────
if command -v kvantummanager &>/dev/null; then
kvantummanager --set NexusOS 2>/dev/null && echo " [ok] Kvantum set to NexusOS"
else
echo " [skip] kvantummanager not found — install qt5-style-kvantum and run: kvantummanager --set NexusOS"
fi
# ── 6. KWin Aurorae decoration ───────────────────────────────────────────
if command -v kwriteconfig5 &>/dev/null; then
kwriteconfig5 --file kwinrc \
--group "org.kde.kdecoration2" --key library "org.kde.kwin.aurorae"
kwriteconfig5 --file kwinrc \
--group "org.kde.kdecoration2" --key theme "__aurorae__svg__NexusOS"
# Buttons on the right: minimize, maximize, close (I=minimize, A=maximize, X=close)
kwriteconfig5 --file kwinrc \
--group "org.kde.kdecoration2" --key ButtonsOnLeft ""
kwriteconfig5 --file kwinrc \
--group "org.kde.kdecoration2" --key ButtonsOnRight "IAX"
echo " [ok] KWin decoration: Aurorae NexusOS, buttons right"
else
echo " [skip] kwriteconfig5 not found — configure KWin decoration manually"
fi
# ── 7. Plasma shell theme ────────────────────────────────────────────────
if command -v plasma-apply-desktoptheme &>/dev/null; then
plasma-apply-desktoptheme NexusOS 2>/dev/null && echo " [ok] Plasma shell theme: NexusOS"
else
echo " [skip] plasma-apply-desktoptheme not found — apply desktop theme manually"
fi
# ── 8. kscreenlocker ─────────────────────────────────────────────────────
if command -v kwriteconfig5 &>/dev/null; then
kwriteconfig5 --file kscreenlockerrc --group Greeter --key Theme NexusOS
echo " [ok] kscreenlocker theme: NexusOS"
fi
# ── 9. GTK apps under Plasma ─────────────────────────────────────────────
if command -v kwriteconfig5 &>/dev/null; then
kwriteconfig5 --file kdeglobals --group KDE --key widgetStyle "kvantum-dark"
kwriteconfig5 --file kdeglobals --group Icons --key Theme NexusOS
kwriteconfig5 --file kdeglobals --group General \
--key font "Ubuntu,10,-1,5,50,0,0,0,0,0"
echo " [ok] kdeglobals: Kvantum style, NexusOS icons, Ubuntu 10"
fi
if command -v gsettings &>/dev/null; then
gsettings set org.gnome.desktop.interface gtk-theme NexusOS 2>/dev/null || true
gsettings set org.gnome.desktop.interface icon-theme NexusOS 2>/dev/null || true
echo " [ok] gsettings: GTK theme + icons = NexusOS"
fi
# ── 10. SDDM login theme ─────────────────────────────────────────────────
if [[ $NO_SDDM -eq 0 ]]; then
echo " Deploying SDDM theme + KDE session entry (requires sudo)..."
sudo cp -r "$KDE/sddm/NexusOS-QML" /usr/share/sddm/themes/
sudo cp "$REPO/management/sessions/nexusos-kde.desktop" /usr/share/xsessions/
if command -v kwriteconfig5 &>/dev/null; then
sudo kwriteconfig5 --file /etc/sddm.conf --group Theme --key Current NexusOS-QML
else
# Fallback: write the INI directly
sudo bash -c 'printf "[Theme]\nCurrent=NexusOS-QML\n" > /etc/sddm.conf.d/nexusos.conf'
fi
echo " [ok] SDDM theme: NexusOS-QML"
echo " [ok] KDE session: NexusOS-KDE added to /usr/share/xsessions/"
else
echo " [skip] SDDM (--no-sddm passed)"
fi
# ── 11. Promethean Terminal desktop launcher ──────────────────────────────
DESKTOP_SRC="$REPO/bin/promethean/promethean-terminal.desktop"
DESKTOP_DEST="$HOME/.local/share/applications/promethean-terminal.desktop"
if [[ -f "$DESKTOP_SRC" ]]; then
cp -f "$DESKTOP_SRC" "$DESKTOP_DEST"
echo " [ok] Promethean Terminal launcher updated"
fi
# ── 12. Apply live changes (if Plasma is running) ────────────────────────
if qdbus org.kde.KWin /KWin reconfigure 2>/dev/null; then
echo " [ok] KWin reconfigured"
# Restart plasmashell to pick up new shell theme
if command -v kquitapp5 &>/dev/null && command -v kstart5 &>/dev/null; then
kquitapp5 plasmashell 2>/dev/null
sleep 1
kstart5 plasmashell &
echo " [ok] plasmashell restarted"
fi
fi
echo ""
echo "NexusOS KDE theme installed. On first KDE session:"
echo " 1. System Settings → Appearance → verify all components show NexusOS"
echo " 2. Panel: right-click → Edit Panel to adjust height/position"
echo " 3. Konsole: Settings → Edit Profile → select Promethean (for Promethean Terminal)"
echo " 4. Test lock screen: Meta+L"
+94
View File
@@ -0,0 +1,94 @@
[General]
Description=NexusOS Promethean
Opacity=1
Wallpaper=
[Background]
Color=26,0,48
[BackgroundFaint]
Color=13,0,16
[BackgroundIntense]
Color=61,0,96
[Foreground]
Color=204,204,204
[ForegroundFaint]
Color=140,140,140
[ForegroundIntense]
Color=230,230,230
[Color0]
Color=26,0,48
[Color0Faint]
Color=13,0,24
[Color0Intense]
Color=61,0,96
[Color1]
Color=218,68,83
[Color1Faint]
Color=160,50,60
[Color1Intense]
Color=235,100,110
[Color2]
Color=39,174,96
[Color2Faint]
Color=28,128,70
[Color2Intense]
Color=80,200,120
[Color3]
Color=246,116,0
[Color3Faint]
Color=180,85,0
[Color3Intense]
Color=255,160,50
[Color4]
Color=136,0,143
[Color4Faint]
Color=94,0,100
[Color4Intense]
Color=176,64,192
[Color5]
Color=176,64,192
[Color5Faint]
Color=120,40,135
[Color5Intense]
Color=210,110,225
[Color6]
Color=140,198,63
[Color6Faint]
Color=100,145,45
[Color6Intense]
Color=184,227,115
[Color7]
Color=204,204,204
[Color7Faint]
Color=150,150,150
[Color7Intense]
Color=230,230,230
+94
View File
@@ -0,0 +1,94 @@
[General]
Description=NexusOS
Opacity=1
Wallpaper=
[Background]
Color=30,21,38
[BackgroundFaint]
Color=31,34,37
[BackgroundIntense]
Color=46,50,54
[Foreground]
Color=242,242,242
[ForegroundFaint]
Color=168,168,168
[ForegroundIntense]
Color=255,255,255
[Color0]
Color=31,34,37
[Color0Faint]
Color=20,20,25
[Color0Intense]
Color=58,61,65
[Color1]
Color=218,68,83
[Color1Faint]
Color=160,50,60
[Color1Intense]
Color=235,100,110
[Color2]
Color=39,174,96
[Color2Faint]
Color=28,128,70
[Color2Intense]
Color=80,200,120
[Color3]
Color=246,116,0
[Color3Faint]
Color=180,85,0
[Color3Intense]
Color=255,160,50
[Color4]
Color=136,0,143
[Color4Faint]
Color=94,0,100
[Color4Intense]
Color=162,50,168
[Color5]
Color=162,50,168
[Color5Faint]
Color=110,30,115
[Color5Intense]
Color=200,100,210
[Color6]
Color=140,198,63
[Color6Faint]
Color=100,145,45
[Color6Intense]
Color=184,227,115
[Color7]
Color=168,168,168
[Color7Faint]
Color=110,113,115
[Color7Intense]
Color=242,242,242
+36
View File
@@ -0,0 +1,36 @@
[Appearance]
ColorScheme=NexusOS-Promethean
Font=Monospace,12,-1,5,50,0,0,0,0,0
LineSpacing=1
UseFontLineCharacters=false
[Cursor Options]
CursorShape=0
CustomCursorColor=#b040c0
UseCustomCursorColor=true
[General]
Command=/bin/bash --rcfile /home/jon/nexus-core/.promethean_bashrc -i
Name=Promethean
Parent=FALLBACK/
TerminalCenter=false
TerminalColumns=110
TerminalRows=30
[Interaction Options]
AutoCopySelectedText=false
UnderlineFilesEnabled=false
[Scrolling]
HistoryMode=2
HistorySize=5000
ScrollBarPosition=2
[Terminal Features]
BidiRenderingEnabled=true
BlinkingCursorEnabled=true
BlinkingTextEnabled=true
UrlHintsModifiers=0
[Window]
RememberWindowSize=true
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1200" width="1920" height="1200">
<defs>
<linearGradient id="metalBase" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#1a1a2e;stop-opacity:1"/>
<stop offset="35%" style="stop-color:#16213e;stop-opacity:1"/>
<stop offset="65%" style="stop-color:#0f1626;stop-opacity:1"/>
<stop offset="100%" style="stop-color:#0a0e1a;stop-opacity:1"/>
</linearGradient>
<radialGradient id="vignette" cx="50%" cy="50%" r="70%">
<stop offset="0%" style="stop-color:transparent;stop-opacity:0"/>
<stop offset="100%" style="stop-color:#000000;stop-opacity:0.6"/>
</radialGradient>
<pattern id="brushLines" x="0" y="0" width="4" height="4" patternUnits="userSpaceOnUse">
<line x1="0" y1="4" x2="4" y2="0" stroke="#ffffff" stroke-width="0.3" opacity="0.03"/>
</pattern>
<pattern id="machineLines" x="0" y="0" width="100" height="3" patternUnits="userSpaceOnUse">
<line x1="0" y1="1.5" x2="100" y2="1.5" stroke="#ffffff" stroke-width="0.2" opacity="0.025"/>
</pattern>
</defs>
<rect width="1920" height="1200" fill="url(#metalBase)"/>
<rect width="1920" height="1200" fill="url(#brushLines)"/>
<rect width="1920" height="1200" fill="url(#machineLines)"/>
<ellipse cx="960" cy="340" rx="1200" ry="280" fill="#ffffff" opacity="0.012"/>
<ellipse cx="960" cy="220" rx="400" ry="170" fill="#00d4ff" opacity="0.015"/>
<rect width="1920" height="1200" fill="url(#vignette)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name=""/>
<group name="General">
</group>
</kcfg>
@@ -0,0 +1,268 @@
import QtQuick 2.15
import QtQuick.Controls 2.15
import org.kde.plasma.core 2.0 as PlasmaCore
/*
* NexusOS kscreenlocker theme.
* Mirrors the SDDM NexusOS-QML aesthetic: logo upper-center,
* clock/date bottom-center, centered password box.
*
* kscreenlocker API differences from SDDM:
* - authenticator.tryUnlock(password) instead of sddm.login(...)
* - authenticator.failed / authenticator.succeeded signals
* - No session selector, no power buttons
* - walletModel, userModel available but not mandatory
*/
Rectangle {
id: root
// kscreenlocker injects these from the surrounding PlasmaShell context
property bool locked: true
readonly property color accentColor: "#8cc63f" // brand_green
readonly property color bgDark: "#1e1526" // base_bg
readonly property color textPrimary: "#f2f2f2"
readonly property color textMuted: "#a8a8a8"
readonly property color fieldBg: "#1f2225" // surface_bg
readonly property color fieldBorder: "#4d3461" // menu_border
readonly property color errorColor: "#da4453"
anchors.fill: parent
color: bgDark
// ── Background image (reuses SDDM background asset) ────────────────
Image {
anchors.fill: parent
source: Qt.resolvedUrl("../../assets/background.svg")
fillMode: Image.PreserveAspectCrop
smooth: true
asynchronous: false
}
Rectangle {
anchors.fill: parent
color: "#000000"
opacity: 0.30
}
// ── Logo area ───────────────────────────────────────────────────────
Item {
id: logoArea
width: 100
height: 100
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: parent.height * 0.10
Rectangle {
anchors.centerIn: parent
width: parent.width * 1.6
height: parent.height * 1.6
radius: width / 2
color: accentColor
opacity: 0.06
}
Image {
anchors.fill: parent
source: Qt.resolvedUrl("../../assets/logo.png")
sourceSize: Qt.size(200, 200)
smooth: true
}
}
Text {
text: "NexusOS"
color: textPrimary
font.family: "Sans"
font.pixelSize: 26
font.letterSpacing: 6
font.weight: Font.Light
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: logoArea.bottom
anchors.topMargin: 14
}
// ── Password box ────────────────────────────────────────────────────
Rectangle {
id: loginBox
width: 340
height: loginColumn.height + 56
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
color: Qt.rgba(30/255, 21/255, 38/255, 0.80)
radius: 12
border.color: fieldBorder
border.width: 1
SequentialAnimation {
id: shakeAnim
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x - 10; duration: 50 }
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x + 10; duration: 50 }
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x - 6; duration: 50 }
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x + 6; duration: 50 }
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x; duration: 40 }
}
Column {
id: loginColumn
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: 28
spacing: 12
// Username label (read-only; kscreenlocker always locks current session)
Text {
width: parent.width
text: kscreenlocker_userName || userModel.data(userModel.index(0, 0), Qt.DisplayRole) || ""
color: textPrimary
font.pixelSize: 14
font.weight: Font.Medium
horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
}
// Password field
Rectangle {
width: parent.width
height: 44
color: fieldBg
radius: 6
border.color: passwordInput.activeFocus ? accentColor : fieldBorder
border.width: 1
TextInput {
id: passwordInput
anchors.fill: parent
anchors.leftMargin: 14
anchors.rightMargin: 14
verticalAlignment: TextInput.AlignVCenter
color: textPrimary
font.pixelSize: 14
echoMode: TextInput.Password
focus: true
clip: true
Keys.onReturnPressed: authenticator.tryUnlock(passwordInput.text)
Keys.onEnterPressed: authenticator.tryUnlock(passwordInput.text)
}
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 14
text: "Password"
color: textMuted
font.pixelSize: 14
visible: passwordInput.text.length === 0 && !passwordInput.activeFocus
}
}
// Error message
Text {
id: errorMsg
width: parent.width
text: ""
color: errorColor
font.pixelSize: 12
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
visible: text !== ""
}
// Unlock button
Rectangle {
id: unlockButton
width: parent.width
height: 44
radius: 6
color: unlockMouse.pressed
? Qt.darker(accentColor, 1.3)
: unlockMouse.containsMouse
? Qt.lighter(accentColor, 1.15)
: accentColor
Behavior on color { ColorAnimation { duration: 150 } }
Text {
anchors.centerIn: parent
text: "UNLOCK"
color: "#0a0a00" // text_on_accent
font.pixelSize: 14
font.letterSpacing: 3
font.weight: Font.DemiBold
}
MouseArea {
id: unlockMouse
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: authenticator.tryUnlock(passwordInput.text)
}
}
}
}
// ── Authenticator connections ───────────────────────────────────────
Connections {
target: authenticator
function onFailed() {
errorMsg.text = "Incorrect password — try again."
passwordInput.text = ""
passwordInput.forceActiveFocus()
shakeAnim.start()
}
function onSucceeded() {
errorMsg.text = ""
}
function onGraceLockedChanged() {}
function onMessage(msg) {}
function onError(err) {
errorMsg.text = err
}
}
// ── Clock / date (bottom) ───────────────────────────────────────────
Column {
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: parent.height * 0.05
spacing: 2
Text {
id: clockText
anchors.horizontalCenter: parent.horizontalCenter
color: textPrimary
font.family: "Sans"
font.pixelSize: 42
font.weight: Font.Thin
}
Text {
id: dateText
anchors.horizontalCenter: parent.horizontalCenter
color: textMuted
font.family: "Sans"
font.pixelSize: 14
font.letterSpacing: 2
}
Timer {
interval: 1000
running: true
repeat: true
triggeredOnStart: true
onTriggered: {
var d = new Date()
clockText.text = Qt.formatTime(d, "hh:mm")
dateText.text = Qt.formatDate(d, "dddd, MMMM d")
}
}
}
}
+10
View File
@@ -0,0 +1,10 @@
[Desktop Entry]
Name=NexusOS
Comment=NexusOS lock screen — dark purple, lime-green accents
Type=Service
X-KDE-ServiceTypes=org.kde.kscreenlocker.Greeter
[ScreenLocker]
Name=NexusOS
Description=NexusOS lock screen — dark purple, lime-green accents
MainScript=contents/ui/LockScreenUi.qml
+397
View File
@@ -0,0 +1,397 @@
[%GradualConfiguration]
# Toolbar / menubar gradient — flat: both ends same color
left.header.color=#2a2e32
right.header.color=#2a2e32
header.text.color=#f2f2f2
header.text.shadow.color=0,0,0,0
left.dock.header.color=#1e1526
right.dock.header.color=#1e1526
dock.header.text.color=#f2f2f2
dock.header.text.shadow.color=0,0,0,0
[%ThemeHacks]
transparent.menus=false
transparent.tooltips=false
blurring=false
composite=false
[General]
author=NexusOS
comment=Flat dark purple theme, lime-green accents, purple selections
x11drag=all
double.click.exception=
group.label.boldFont=false
menubar.mouse.tracking=true
toolbutton.style=0
dialog.button.layout=0
splitter.width=4
scroll.arrows=false
scroll.min.extent=36
tooltip.delay=500
tooltip.count=1
vertical.center.dialogs=true
inline.spin.indicators=true
transient.scrollbar=false
submenu.overlap=3
submenu.delay=250
shadow.spread=0
shadow.x.offset=0
shadow.y.offset=0
focus.rect.color=#8cc63f
reduce.window.opacity=0
reduce.menu.opacity=0
small.icon.size=16
large.icon.size=32
button.icon.size=16
toolbar.icon.size=16
[PanelButtonCommand]
inherits=PanelButtonTool
frame=false
interior=true
interior.element=button
interior.x.padding=8
interior.y.padding=4
indicator.size=0
text.shadow=0
text.margin=1
text.bold=false
min.height=26
min.width=60
[PanelButtonTool]
frame=false
interior=true
interior.element=toolbutton
interior.x.padding=6
interior.y.padding=3
indicator.size=0
text.shadow=0
text.margin=0
text.bold=false
min.height=22
min.width=0
[ToolbarButton]
inherits=PanelButtonTool
[Dock]
frame=false
interior=true
interior.element=dock
[DockTitle]
frame=false
interior=false
indicator.element=arrow
text.margin=3
text.shadow=0
[TitleBar]
frame=false
interior=true
interior.element=titlebar
indicator.element=button
min.height=30
text.margin=4
text.shadow=0
text.bold=false
[GroupBox]
frame=true
frame.element=groupbox
frame.top=6
frame.bottom=2
frame.left=2
frame.right=2
interior=false
text.margin=4
text.shadow=0
text.bold=false
text.italic=false
[LineEdit]
frame=false
interior=true
interior.element=lineedit
interior.x.padding=8
interior.y.padding=4
min.height=26
min.width=0
[DropDownButton]
frame=false
interior=true
interior.element=button
indicator.element=arrow-down
indicator.size=10
[ToolboxTab]
frame=false
interior=true
interior.element=tab
text.margin=4
text.shadow=0
text.bold=false
[Tab]
frame=false
interior=true
interior.element=tab
interior.x.padding=10
interior.y.padding=4
indicator.element=tab-close
indicator.size=12
text.shadow=0
text.margin=2
min.height=26
min.width=60
[TabFrame]
frame=false
interior=true
interior.element=tabframe
frame.top=0
frame.bottom=0
frame.left=0
frame.right=0
[TreeExpander]
frame=false
interior=false
indicator.element=arrow
indicator.size=10
[HeaderSection]
frame=false
interior=true
interior.element=header
interior.x.padding=6
interior.y.padding=3
indicator.element=arrow
indicator.size=10
text.shadow=0
min.height=24
[SizeGrip]
frame=false
interior=false
indicator.element=sizegrip
indicator.size=14
[Splitter]
frame=false
interior=true
interior.element=splitter
min.height=4
min.width=4
[Slider]
frame=false
interior=true
interior.element=slider
indicator.element=slider-handle
indicator.size=16
min.height=4
min.width=4
[SliderCursorFlat]
frame=false
interior=true
interior.element=slider-handle
min.height=16
min.width=16
[ProgressbarContents]
frame=false
interior=true
interior.element=progressbar-fill
[Progressbar]
frame=false
interior=true
interior.element=progressbar
indicator.size=0
text.shadow=0
min.height=6
min.width=0
[ItemView]
frame=false
interior=true
interior.element=itemview
interior.x.padding=4
interior.y.padding=2
[Toolbar]
frame=false
interior=true
interior.element=toolbar
interior.x.padding=2
interior.y.padding=2
indicator.element=toolbar-handle
indicator.size=8
[ScrollbarSlider]
frame=false
interior=true
interior.element=scrollbar-slider
min.height=36
min.width=8
[ScrollbarGroove]
frame=false
interior=true
interior.element=scrollbar-groove
[Scrollbar]
frame=false
interior=true
interior.element=scrollbar-groove
indicator.element=arrow
indicator.size=0
min.height=8
min.width=8
[ScrollArrow]
frame=false
interior=false
indicator.element=arrow
indicator.size=8
min.height=0
min.width=0
[CheckBox]
frame=false
interior=true
interior.element=checkbox
indicator.element=checkbox-indicator
indicator.size=14
text.shadow=0
text.margin=3
min.height=16
min.width=16
[RadioButton]
frame=false
interior=true
interior.element=radiobutton
indicator.element=radiobutton-indicator
indicator.size=8
text.shadow=0
text.margin=3
min.height=16
min.width=16
[Separator]
frame=false
interior=true
interior.element=separator
min.height=1
min.width=1
[ComboBox]
frame=false
interior=true
interior.element=combobox
interior.x.padding=8
interior.y.padding=4
indicator.element=arrow-down
indicator.size=10
min.height=26
min.width=0
[SpinBox]
frame=false
interior=true
interior.element=spinbox
interior.x.padding=6
interior.y.padding=3
indicator.element=arrow
indicator.size=10
min.height=26
min.width=0
[Frame]
frame=true
frame.element=frame
frame.top=1
frame.bottom=1
frame.left=1
frame.right=1
interior=false
[MenuItem]
frame=false
interior=true
interior.element=menuitem
interior.x.padding=6
interior.y.padding=1
indicator.element=menuitem-arrow
indicator.size=10
text.shadow=0
min.height=22
[Menu]
frame=false
interior=true
interior.element=menu
interior.x.padding=0
interior.y.padding=2
text.shadow=0
min.height=0
min.width=0
[Menubar]
frame=false
interior=true
interior.element=menubar
text.shadow=0
[MenubarItem]
frame=false
interior=true
interior.element=menubaritem
interior.x.padding=10
interior.y.padding=4
text.shadow=0
[ToolTip]
frame=false
interior=true
interior.element=tooltip
interior.x.padding=8
interior.y.padding=4
text.shadow=0
min.height=0
min.width=0
[StatusBar]
frame=false
interior=true
interior.element=statusbar
[Window]
frame=false
interior=true
interior.element=window
interior.x.padding=0
interior.y.padding=0
[Dialog]
frame=false
interior=true
interior.element=window
[MessageBox]
inherits=Dialog
text.bold=false
[GenericFrame]
frame=true
frame.element=frame
frame.top=1
frame.bottom=1
frame.left=1
frame.right=1
interior=false
+619
View File
@@ -0,0 +1,619 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
NexusOS Kvantum SVG
Palette: dark purple base + lime green accents + purple selections.
Layout: each element type occupies one row (y-step=50px). States
are arranged left-to-right within each row (x-step=110px):
col 0 (x=0): normal
col 1 (x=110): focused
col 2 (x=220): hover
col 3 (x=330): pressed / active
col 4 (x=440): disabled
col 5 (x=550): toggled
col 6 (x=660): toggled-focused / toggled-hover
Kvantum looks up elements by id; exact (x,y) positions are ignored.
-->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="800" height="2000">
<!-- ═══════════════════════════════════════════════════════════
BUTTON (y=0)
Used by: PanelButtonCommand, PanelButtonTool, DropDownButton
════════════════════════════════════════════════════════════════ -->
<g id="button">
<rect x="1" y="1" width="98" height="38" rx="4"
fill="#2a2e32" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="button-focused">
<rect x="111" y="1" width="98" height="38" rx="4"
fill="#2a2e32" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="button-hover">
<rect x="221" y="1" width="98" height="38" rx="4"
fill="#353a3e" stroke="#4a4f54" stroke-width="1"/>
</g>
<g id="button-pressed">
<rect x="331" y="1" width="98" height="38" rx="4"
fill="#8cc63f" stroke="#6ba62a" stroke-width="1"/>
</g>
<g id="button-disabled">
<rect x="441" y="1" width="98" height="38" rx="4"
fill="#1f2225" stroke="#2e3236" stroke-width="1"/>
</g>
<g id="button-toggled">
<rect x="551" y="1" width="98" height="38" rx="4"
fill="#88008f" stroke="#5e0066" stroke-width="1"/>
</g>
<g id="button-toggled-focused">
<rect x="661" y="1" width="98" height="38" rx="4"
fill="#88008f" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="button-toggled-hover">
<rect x="1" y="51" width="98" height="38" rx="4"
fill="#a232a8" stroke="#88008f" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
TOOLBUTTON (y=100) — flatter, no minimum width enforcement
════════════════════════════════════════════════════════════════ -->
<g id="toolbutton">
<rect x="1" y="101" width="98" height="38" rx="4"
fill="none" stroke="none"/>
</g>
<g id="toolbutton-focused">
<rect x="111" y="101" width="98" height="38" rx="4"
fill="#2a2e32" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="toolbutton-hover">
<rect x="221" y="101" width="98" height="38" rx="4"
fill="#2a2e32" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="toolbutton-pressed">
<rect x="331" y="101" width="98" height="38" rx="4"
fill="#8cc63f" stroke="#6ba62a" stroke-width="1"/>
</g>
<g id="toolbutton-disabled">
<rect x="441" y="101" width="98" height="38" rx="4"
fill="none" stroke="none"/>
</g>
<g id="toolbutton-toggled">
<rect x="551" y="101" width="98" height="38" rx="4"
fill="#88008f" stroke="#5e0066" stroke-width="1"/>
</g>
<g id="toolbutton-toggled-hover">
<rect x="661" y="101" width="98" height="38" rx="4"
fill="#a232a8" stroke="#88008f" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
LINE EDIT / TEXT FIELD (y=150)
Used by: LineEdit, SpinBox field, ComboBox field
════════════════════════════════════════════════════════════════ -->
<g id="lineedit">
<rect x="1" y="151" width="98" height="38" rx="4"
fill="#1f2225" stroke="#2e3236" stroke-width="1"/>
</g>
<g id="lineedit-focused">
<rect x="111" y="151" width="98" height="38" rx="4"
fill="#1f2225" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="lineedit-hover">
<rect x="221" y="151" width="98" height="38" rx="4"
fill="#1f2225" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="lineedit-disabled">
<rect x="331" y="151" width="98" height="38" rx="4"
fill="#1e1526" stroke="#2e3236" stroke-width="1" opacity="0.6"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
COMBO BOX (y=200)
════════════════════════════════════════════════════════════════ -->
<g id="combobox">
<rect x="1" y="201" width="98" height="38" rx="4"
fill="#1f2225" stroke="#2e3236" stroke-width="1"/>
</g>
<g id="combobox-focused">
<rect x="111" y="201" width="98" height="38" rx="4"
fill="#1f2225" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="combobox-hover">
<rect x="221" y="201" width="98" height="38" rx="4"
fill="#1f2225" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="combobox-pressed">
<rect x="331" y="201" width="98" height="38" rx="4"
fill="#1f2225" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="combobox-disabled">
<rect x="441" y="201" width="98" height="38" rx="4"
fill="#1e1526" stroke="#2e3236" stroke-width="1" opacity="0.6"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
SPIN BOX (y=250)
════════════════════════════════════════════════════════════════ -->
<g id="spinbox">
<rect x="1" y="251" width="98" height="38" rx="4"
fill="#1f2225" stroke="#2e3236" stroke-width="1"/>
</g>
<g id="spinbox-focused">
<rect x="111" y="251" width="98" height="38" rx="4"
fill="#1f2225" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="spinbox-hover">
<rect x="221" y="251" width="98" height="38" rx="4"
fill="#1f2225" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="spinbox-disabled">
<rect x="331" y="251" width="98" height="38" rx="4"
fill="#1e1526" stroke="#2e3236" stroke-width="1" opacity="0.6"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
MENU BACKGROUND (y=300)
════════════════════════════════════════════════════════════════ -->
<g id="menu">
<rect x="1" y="301" width="98" height="78" rx="6"
fill="#2a1d33" stroke="#4d3461" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
MENU ITEM (y=400) — just a fill highlight, no outline
════════════════════════════════════════════════════════════════ -->
<g id="menuitem">
<rect x="1" y="401" width="98" height="28" rx="3"
fill="none"/>
</g>
<g id="menuitem-hover">
<rect x="111" y="401" width="98" height="28" rx="3"
fill="#8cc63f" fill-opacity="0.18"/>
</g>
<g id="menuitem-pressed">
<rect x="221" y="401" width="98" height="28" rx="3"
fill="#8cc63f"/>
</g>
<g id="menuitem-disabled">
<rect x="331" y="401" width="98" height="28" rx="3"
fill="none"/>
</g>
<g id="menuitem-selected">
<rect x="441" y="401" width="98" height="28" rx="3"
fill="#8cc63f"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
MENU BAR (y=450)
════════════════════════════════════════════════════════════════ -->
<g id="menubar">
<rect x="1" y="451" width="98" height="28" rx="0"
fill="#2a2e32" stroke="none"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
MENU BAR ITEM (y=480)
════════════════════════════════════════════════════════════════ -->
<g id="menubaritem">
<rect x="1" y="481" width="98" height="28" rx="3"
fill="none"/>
</g>
<g id="menubaritem-hover">
<rect x="111" y="481" width="98" height="28" rx="3"
fill="#8cc63f" fill-opacity="0.18"/>
</g>
<g id="menubaritem-pressed">
<rect x="221" y="481" width="98" height="28" rx="3"
fill="#8cc63f"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
TOOLTIP (y=530)
════════════════════════════════════════════════════════════════ -->
<g id="tooltip">
<rect x="1" y="531" width="98" height="38" rx="6"
fill="#2e3236" stroke="#3a3d41" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
TAB (in tab bar) (y=580)
════════════════════════════════════════════════════════════════ -->
<g id="tab">
<rect x="1" y="581" width="98" height="34" rx="4"
fill="none"/>
</g>
<g id="tab-focused">
<rect x="111" y="581" width="98" height="34" rx="4"
fill="#2a2e32" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="tab-hover">
<rect x="221" y="581" width="98" height="34" rx="4"
fill="#2a2e32" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="tab-pressed">
<rect x="331" y="581" width="98" height="34" rx="4"
fill="#2a2e32" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="tab-disabled">
<rect x="441" y="581" width="98" height="34" rx="4"
fill="none" opacity="0.4"/>
</g>
<g id="tab-toggled">
<rect x="551" y="581" width="98" height="34" rx="4"
fill="#2a2e32" stroke="#8cc63f" stroke-width="2"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
TAB FRAME (content area) (y=630)
════════════════════════════════════════════════════════════════ -->
<g id="tabframe">
<rect x="1" y="631" width="98" height="58" rx="0"
fill="#1f2225" stroke="#3a3d41" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
PROGRESS BAR TRACK (y=700)
════════════════════════════════════════════════════════════════ -->
<g id="progressbar">
<rect x="1" y="701" width="98" height="8" rx="4"
fill="#2a2e32" stroke="none"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
PROGRESS BAR FILL (y=720)
════════════════════════════════════════════════════════════════ -->
<g id="progressbar-fill">
<rect x="1" y="721" width="98" height="8" rx="4"
fill="#8cc63f"/>
</g>
<g id="progressbar-fill-disabled">
<rect x="111" y="721" width="98" height="8" rx="4"
fill="#3a3d41"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
SCROLLBAR GROOVE (y=740)
════════════════════════════════════════════════════════════════ -->
<g id="scrollbar-groove">
<rect x="1" y="741" width="8" height="98" rx="4"
fill="#2a2e32" stroke="none"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
SCROLLBAR SLIDER (thumb) (y=850)
════════════════════════════════════════════════════════════════ -->
<g id="scrollbar-slider">
<rect x="1" y="851" width="8" height="36" rx="4"
fill="#3a3d41"/>
</g>
<g id="scrollbar-slider-hover">
<rect x="11" y="851" width="8" height="36" rx="4"
fill="#8cc63f"/>
</g>
<g id="scrollbar-slider-pressed">
<rect x="21" y="851" width="8" height="36" rx="4"
fill="#6ba62a"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
SLIDER GROOVE (y=900)
════════════════════════════════════════════════════════════════ -->
<g id="slider">
<rect x="1" y="901" width="98" height="4" rx="2"
fill="#2a2e32" stroke="none"/>
</g>
<g id="slider-focused">
<rect x="1" y="901" width="98" height="4" rx="2"
fill="#2a2e32" stroke="#8cc63f" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
SLIDER HANDLE (y=920)
════════════════════════════════════════════════════════════════ -->
<g id="slider-handle">
<circle cx="9" cy="929" r="8" fill="#3a3d41" stroke="#4a4f54" stroke-width="1"/>
</g>
<g id="slider-handle-focused">
<circle cx="9" cy="929" r="8" fill="#3a3d41" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="slider-handle-hover">
<circle cx="9" cy="929" r="8" fill="#8cc63f" stroke="#6ba62a" stroke-width="1"/>
</g>
<g id="slider-handle-pressed">
<circle cx="9" cy="929" r="8" fill="#6ba62a" stroke="#6ba62a" stroke-width="1"/>
</g>
<g id="slider-handle-disabled">
<circle cx="9" cy="929" r="8" fill="#2e3236" stroke="#3a3d41" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
CHECK BOX BACKGROUND (y=950)
════════════════════════════════════════════════════════════════ -->
<g id="checkbox">
<rect x="1" y="951" width="16" height="16" rx="3"
fill="#1f2225" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="checkbox-focused">
<rect x="19" y="951" width="16" height="16" rx="3"
fill="#1f2225" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="checkbox-hover">
<rect x="37" y="951" width="16" height="16" rx="3"
fill="#2a2e32" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="checkbox-toggled">
<rect x="55" y="951" width="16" height="16" rx="3"
fill="#8cc63f" stroke="#6ba62a" stroke-width="1"/>
</g>
<g id="checkbox-toggled-focused">
<rect x="73" y="951" width="16" height="16" rx="3"
fill="#8cc63f" stroke="#8cc63f" stroke-width="2"/>
</g>
<g id="checkbox-disabled">
<rect x="91" y="951" width="16" height="16" rx="3"
fill="#1e1526" stroke="#2e3236" stroke-width="1"/>
</g>
<!-- checkbox checkmark indicator -->
<g id="checkbox-indicator">
<!-- invisible placeholder for unchecked state -->
<path d="M3,979 L6,983 L11,975" fill="none" stroke="none"/>
</g>
<g id="checkbox-indicator-toggled">
<path d="M3,979 L6,983 L11,975"
fill="none" stroke="#0a0a00" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g id="checkbox-indicator-disabled">
<path d="M93,979 L96,983 L101,975"
fill="none" stroke="#6e7173" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
RADIO BUTTON BACKGROUND (y=1000)
════════════════════════════════════════════════════════════════ -->
<g id="radiobutton">
<circle cx="9" cy="1009" r="8" fill="#1f2225" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="radiobutton-focused">
<circle cx="27" cy="1009" r="8" fill="#1f2225" stroke="#8cc63f" stroke-width="1"/>
</g>
<g id="radiobutton-hover">
<circle cx="45" cy="1009" r="8" fill="#2a2e32" stroke="#3a3d41" stroke-width="1"/>
</g>
<g id="radiobutton-toggled">
<circle cx="63" cy="1009" r="8" fill="#8cc63f" stroke="#6ba62a" stroke-width="1"/>
</g>
<g id="radiobutton-toggled-focused">
<circle cx="81" cy="1009" r="8" fill="#8cc63f" stroke="#8cc63f" stroke-width="2"/>
</g>
<g id="radiobutton-disabled">
<circle cx="99" cy="1009" r="8" fill="#1e1526" stroke="#2e3236" stroke-width="1"/>
</g>
<!-- radio dot indicator -->
<g id="radiobutton-indicator">
<circle cx="9" cy="1009" r="3.5" fill="#0a0a00"/>
</g>
<g id="radiobutton-indicator-disabled">
<circle cx="99" cy="1009" r="3.5" fill="#6e7173"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
HEADER SECTION (table/tree column header) (y=1030)
════════════════════════════════════════════════════════════════ -->
<g id="header">
<rect x="1" y="1031" width="98" height="28" rx="0"
fill="#2a2e32" stroke="none"/>
</g>
<g id="header-hover">
<rect x="111" y="1031" width="98" height="28" rx="0"
fill="#353a3e" stroke="none"/>
</g>
<g id="header-pressed">
<rect x="221" y="1031" width="98" height="28" rx="0"
fill="#8cc63f" stroke="none"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
ITEM VIEW (list/tree row) (y=1070)
════════════════════════════════════════════════════════════════ -->
<g id="itemview">
<rect x="1" y="1071" width="98" height="24" rx="0"
fill="none"/>
</g>
<g id="itemview-hover">
<rect x="111" y="1071" width="98" height="24" rx="0"
fill="#8cc63f" fill-opacity="0.12"/>
</g>
<g id="itemview-pressed">
<rect x="221" y="1071" width="98" height="24" rx="0"
fill="#88008f" fill-opacity="0.8"/>
</g>
<g id="itemview-toggled">
<rect x="331" y="1071" width="98" height="24" rx="0"
fill="#88008f"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
TOOLBAR (y=1110)
════════════════════════════════════════════════════════════════ -->
<g id="toolbar">
<rect x="1" y="1111" width="98" height="38" rx="0"
fill="#2a2e32" stroke="none"/>
</g>
<!-- toolbar separator handle indicator -->
<g id="toolbar-handle">
<line x1="3" y1="1115" x2="3" y2="1143"
stroke="#3a3d41" stroke-width="2" stroke-dasharray="1,2"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
DOCK (y=1160)
════════════════════════════════════════════════════════════════ -->
<g id="dock">
<rect x="1" y="1161" width="98" height="58" rx="0"
fill="#1e1526" stroke="#2e3236" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
SPLITTER (y=1230)
════════════════════════════════════════════════════════════════ -->
<g id="splitter">
<rect x="1" y="1231" width="4" height="98" rx="2"
fill="#2e3236"/>
</g>
<g id="splitter-hover">
<rect x="7" y="1231" width="4" height="98" rx="2"
fill="#8cc63f" fill-opacity="0.4"/>
</g>
<g id="splitter-pressed">
<rect x="13" y="1231" width="4" height="98" rx="2"
fill="#8cc63f"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
SEPARATOR (y=1340)
════════════════════════════════════════════════════════════════ -->
<g id="separator">
<rect x="1" y="1341" width="98" height="1" rx="0"
fill="#3a3d41"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
GENERIC FRAME (y=1350)
════════════════════════════════════════════════════════════════ -->
<g id="frame">
<rect x="1" y="1351" width="98" height="78" rx="4"
fill="none" stroke="#3a3d41" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
GROUP BOX (y=1440)
════════════════════════════════════════════════════════════════ -->
<g id="groupbox">
<rect x="1" y="1441" width="98" height="78" rx="4"
fill="none" stroke="#3a3d41" stroke-width="1"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
STATUS BAR (y=1530)
════════════════════════════════════════════════════════════════ -->
<g id="statusbar">
<rect x="1" y="1531" width="98" height="22" rx="0"
fill="#1e1526" stroke="none"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
WINDOW / DIALOG BACKGROUND (y=1560)
════════════════════════════════════════════════════════════════ -->
<g id="window">
<rect x="1" y="1561" width="98" height="78" rx="0"
fill="#1e1526"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
TITLEBAR (y=1650)
════════════════════════════════════════════════════════════════ -->
<g id="titlebar">
<rect x="1" y="1651" width="98" height="30" rx="0"
fill="#1e1526"/>
</g>
<g id="titlebar-inactive">
<rect x="111" y="1651" width="98" height="30" rx="0"
fill="#1a1a20"/>
</g>
<!-- ═══════════════════════════════════════════════════════════
ARROWS / INDICATORS (y=1700)
Kvantum scales these as needed; drawn in NexusOS text colors
════════════════════════════════════════════════════════════════ -->
<!-- generic arrow down (for combo, dropdowns) -->
<g id="arrow-down">
<path d="M2,1703 L8,1711 L14,1703 Z" fill="#a8a8a8"/>
</g>
<g id="arrow-down-hover">
<path d="M2,1703 L8,1711 L14,1703 Z" fill="#f2f2f2"/>
</g>
<g id="arrow-down-pressed">
<path d="M2,1703 L8,1711 L14,1703 Z" fill="#0a0a00"/>
</g>
<g id="arrow-down-disabled">
<path d="M2,1703 L8,1711 L14,1703 Z" fill="#6e7173"/>
</g>
<g id="arrow-up">
<path d="M2,1721 L8,1713 L14,1721 Z" fill="#a8a8a8"/>
</g>
<g id="arrow-up-hover">
<path d="M2,1721 L8,1713 L14,1721 Z" fill="#f2f2f2"/>
</g>
<g id="arrow-up-disabled">
<path d="M2,1721 L8,1713 L14,1721 Z" fill="#6e7173"/>
</g>
<g id="arrow-left">
<path d="M15,1733 L7,1739 L15,1745 Z" fill="#a8a8a8"/>
</g>
<g id="arrow-left-hover">
<path d="M15,1733 L7,1739 L15,1745 Z" fill="#f2f2f2"/>
</g>
<g id="arrow-left-disabled">
<path d="M15,1733 L7,1739 L15,1745 Z" fill="#6e7173"/>
</g>
<g id="arrow-right">
<path d="M1,1753 L9,1759 L1,1765 Z" fill="#a8a8a8"/>
</g>
<g id="arrow-right-hover">
<path d="M1,1753 L9,1759 L1,1765 Z" fill="#f2f2f2"/>
</g>
<g id="arrow-right-disabled">
<path d="M1,1753 L9,1759 L1,1765 Z" fill="#6e7173"/>
</g>
<!-- generic arrow (used by TreeExpander, SpinBox, ScrollArrow) -->
<g id="arrow">
<path d="M2,1773 L8,1781 L14,1773 Z" fill="#a8a8a8"/>
</g>
<g id="arrow-hover">
<path d="M2,1773 L8,1781 L14,1773 Z" fill="#f2f2f2"/>
</g>
<g id="arrow-disabled">
<path d="M2,1773 L8,1781 L14,1773 Z" fill="#6e7173"/>
</g>
<!-- menuitem submenu arrow -->
<g id="menuitem-arrow">
<path d="M1,1793 L7,1799 L1,1805 Z" fill="#a8a8a8"/>
</g>
<g id="menuitem-arrow-hover">
<path d="M1,1793 L7,1799 L1,1805 Z" fill="#f2f2f2"/>
</g>
<g id="menuitem-arrow-pressed">
<path d="M1,1793 L7,1799 L1,1805 Z" fill="#0a0a00"/>
</g>
<!-- tab close button indicator -->
<g id="tab-close">
<path d="M 0,0 L 8,8 M 8,0 L 0,8" transform="translate(1,1813)"
fill="none" stroke="#a8a8a8" stroke-width="1.5"
stroke-linecap="round"/>
</g>
<g id="tab-close-hover">
<circle cx="5" cy="1821" r="7" fill="#da4453"/>
<path d="M 0,0 L 8,8 M 8,0 L 0,8" transform="translate(1,1817)"
fill="none" stroke="#ffffff" stroke-width="1.5"
stroke-linecap="round"/>
</g>
<!-- size grip -->
<g id="sizegrip">
<path d="M6,1840 L12,1840 M10,1836 L12,1836 L12,1838 M4,1842 L12,1842"
fill="none" stroke="#3a3d41" stroke-width="1" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 29 KiB

+118
View File
@@ -0,0 +1,118 @@
[ColorEffects:Disabled]
Color=56,56,56
ColorAmount=0
ColorEffect=0
ContrastAmount=0.1
ContrastEffect=2
IntensityAmount=0
IntensityEffect=0
[ColorEffects:Inactive]
ChangeSelectionColor=true
Color=112,111,110
ColorAmount=0.025
ColorEffect=0
ContrastAmount=0.1
ContrastEffect=2
Enable=false
IntensityAmount=0
IntensityEffect=0
[Colors:Window]
BackgroundNormal=30,21,38
BackgroundAlternate=31,34,37
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
ForegroundLink=184,227,115
ForegroundVisited=162,50,168
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundPositive=39,174,96
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:View]
BackgroundNormal=30,21,38
BackgroundAlternate=31,34,37
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
ForegroundLink=184,227,115
ForegroundVisited=162,50,168
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundPositive=39,174,96
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Button]
BackgroundNormal=42,46,50
BackgroundAlternate=30,21,38
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
ForegroundLink=184,227,115
ForegroundVisited=162,50,168
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundPositive=39,174,96
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Selection]
BackgroundNormal=136,0,143
BackgroundAlternate=107,166,42
ForegroundNormal=255,255,255
ForegroundInactive=255,255,255
ForegroundActive=140,198,63
ForegroundLink=184,227,115
ForegroundVisited=162,50,168
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundPositive=39,174,96
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Tooltip]
BackgroundNormal=46,50,54
BackgroundAlternate=58,61,65
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
ForegroundLink=184,227,115
ForegroundVisited=162,50,168
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundPositive=39,174,96
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Complementary]
BackgroundNormal=42,46,50
BackgroundAlternate=46,50,54
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
ForegroundLink=184,227,115
ForegroundVisited=162,50,168
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundPositive=39,174,96
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Header]
BackgroundNormal=30,21,38
BackgroundAlternate=42,46,50
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
ForegroundLink=184,227,115
ForegroundVisited=162,50,168
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundPositive=39,174,96
DecorationFocus=140,198,63
DecorationHover=136,0,143
[General]
ColorScheme=NexusOS
Name=NexusOS
shadeSortColumn=true
[KDE]
contrast=4
+53
View File
@@ -0,0 +1,53 @@
[Colors:Window]
BackgroundNormal=30,21,38
BackgroundAlternate=31,34,37
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Button]
BackgroundNormal=42,46,50
BackgroundAlternate=30,21,38
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:View]
BackgroundNormal=30,21,38
BackgroundAlternate=31,34,37
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Selection]
BackgroundNormal=136,0,143
BackgroundAlternate=107,166,42
ForegroundNormal=255,255,255
ForegroundInactive=255,255,255
ForegroundActive=140,198,63
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Tooltip]
BackgroundNormal=46,50,54
BackgroundAlternate=58,61,65
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
DecorationFocus=140,198,63
DecorationHover=136,0,143
[Colors:Complementary]
BackgroundNormal=42,46,50
BackgroundAlternate=46,50,54
ForegroundNormal=242,242,242
ForegroundInactive=168,168,168
ForegroundActive=140,198,63
DecorationFocus=140,198,63
DecorationHover=136,0,143
+16
View File
@@ -0,0 +1,16 @@
[Desktop Entry]
Name=NexusOS
Comment=Dark purple Plasma shell theme, lime-green accents
Type=Service
[KPackageStructure]
X-KDE-ServiceTypes=Plasma/Theme
X-KDE-PluginInfo-Author=Jon
X-KDE-PluginInfo-Email=
X-KDE-PluginInfo-Name=NexusOS
X-KDE-PluginInfo-Version=1.0
X-KDE-PluginInfo-Website=
X-KDE-PluginInfo-Category=
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=false
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
NexusOS opaque panel-background.svg — no transparency.
Used when compositor is disabled or "Opaque when maximized" is set.
-->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="100" height="100">
<rect id="center"
x="4" y="4" width="92" height="92"
fill="#1e1526"/>
<rect id="top" x="4" y="0" width="92" height="4" fill="#4d3461"/>
<rect id="bottom" x="4" y="96" width="92" height="4" fill="#4d3461"/>
<rect id="left" x="0" y="4" width="4" height="92" fill="#1e1526"/>
<rect id="right" x="96" y="4" width="4" height="92" fill="#1e1526"/>
<rect id="topleft" x="0" y="0" width="4" height="4" fill="#4d3461"/>
<rect id="topright" x="96" y="0" width="4" height="4" fill="#4d3461"/>
<rect id="bottomleft" x="0" y="96" width="4" height="4" fill="#4d3461"/>
<rect id="bottomright" x="96" y="96" width="4" height="4" fill="#4d3461"/>
<rect id="hint-left-margin" x="0" y="0" width="4" height="1" fill="none"/>
<rect id="hint-top-margin" x="0" y="0" width="1" height="4" fill="none"/>
<rect id="hint-right-margin" x="96" y="0" width="4" height="1" fill="none"/>
<rect id="hint-bottom-margin" x="0" y="96" width="1" height="4" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+27
View File
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
NexusOS default widget background (desktop widgets, plasmoids).
Same 9-slice structure as panel-background but solid surface_bg.
-->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="100" height="100">
<rect id="center"
x="4" y="4" width="92" height="92"
fill="#1f2225"/>
<rect id="top" x="4" y="0" width="92" height="4" fill="#3a3d41"/>
<rect id="bottom" x="4" y="96" width="92" height="4" fill="#3a3d41"/>
<rect id="left" x="0" y="4" width="4" height="92" fill="#1f2225"/>
<rect id="right" x="96" y="4" width="4" height="92" fill="#1f2225"/>
<rect id="topleft" x="0" y="0" width="4" height="4" fill="#3a3d41"/>
<rect id="topright" x="96" y="0" width="4" height="4" fill="#3a3d41"/>
<rect id="bottomleft" x="0" y="96" width="4" height="4" fill="#3a3d41"/>
<rect id="bottomright" x="96" y="96" width="4" height="4" fill="#3a3d41"/>
<rect id="hint-left-margin" x="0" y="0" width="4" height="1" fill="none"/>
<rect id="hint-top-margin" x="0" y="0" width="1" height="4" fill="none"/>
<rect id="hint-right-margin" x="96" y="0" width="4" height="1" fill="none"/>
<rect id="hint-bottom-margin" x="0" y="96" width="1" height="4" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
NexusOS Plasma button.svg — used for panel applet buttons.
States: normal (transparent), hover (lime wash), pressed (solid lime),
focus, checked.
-->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="100" height="100">
<!-- normal: transparent (no visible bg) -->
<rect id="normal"
x="2" y="2" width="96" height="96" rx="4"
fill="none"/>
<!-- hover: lime green wash -->
<rect id="hover"
x="2" y="2" width="96" height="96" rx="4"
fill="#8cc63f" fill-opacity="0.18"/>
<!-- pressed -->
<rect id="pressed"
x="2" y="2" width="96" height="96" rx="4"
fill="#8cc63f" fill-opacity="0.35"/>
<!-- focus: green outline -->
<rect id="focus"
x="2" y="2" width="96" height="96" rx="4"
fill="none" stroke="#8cc63f" stroke-width="2"/>
<!-- checked / toggled on -->
<rect id="checked"
x="2" y="2" width="96" height="96" rx="4"
fill="#8cc63f" fill-opacity="0.25"
stroke="#8cc63f" stroke-width="1"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
NexusOS Plasma panel-background.svg
9-slice: Plasma stretches the center element and tiles the edges/corners.
Semi-transparent dark purple panel with a subtle 1px purple top/bottom border.
-->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="100" height="100">
<!-- Margin hints for Plasma (pixels to use as non-stretched borders) -->
<inkscape:perspective id="margin-hint"
inkscape:label="4 4 4 4"/>
<!-- center — main stretchable fill (semi-transparent dark purple) -->
<rect id="center"
x="4" y="4" width="92" height="92"
fill="#1e1526" fill-opacity="0.88"/>
<!-- top edge -->
<rect id="top"
x="4" y="0" width="92" height="4"
fill="#4d3461"/>
<!-- bottom edge -->
<rect id="bottom"
x="4" y="96" width="92" height="4"
fill="#4d3461"/>
<!-- left edge -->
<rect id="left"
x="0" y="4" width="4" height="92"
fill="#1e1526" fill-opacity="0.88"/>
<!-- right edge -->
<rect id="right"
x="96" y="4" width="4" height="92"
fill="#1e1526" fill-opacity="0.88"/>
<!-- corners -->
<rect id="topleft" x="0" y="0" width="4" height="4" fill="#4d3461"/>
<rect id="topright" x="96" y="0" width="4" height="4" fill="#4d3461"/>
<rect id="bottomleft" x="0" y="96" width="4" height="4" fill="#4d3461"/>
<rect id="bottomright" x="96" y="96" width="4" height="4" fill="#4d3461"/>
<!-- shadow — empty for flat design -->
<rect id="shadow" x="0" y="0" width="1" height="1" fill="none"/>
<rect id="hint-left-margin" x="0" y="0" width="4" height="1" fill="none"/>
<rect id="hint-top-margin" x="0" y="0" width="1" height="4" fill="none"/>
<rect id="hint-right-margin" x="96" y="0" width="4" height="1" fill="none"/>
<rect id="hint-bottom-margin" x="0" y="96" width="1" height="4" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- NexusOS Plasma plasmoid heading (widget title bar) -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="100" height="100">
<rect id="center"
x="0" y="0" width="100" height="100"
fill="#2a2e32"/>
<!-- lime-green bottom accent line -->
<rect id="bottom"
x="0" y="97" width="100" height="3"
fill="#8cc63f" fill-opacity="0.5"/>
<rect id="top" x="0" y="0" width="100" height="2" fill="#2a2e32"/>
<rect id="left" x="0" y="0" width="2" height="100" fill="#2a2e32"/>
<rect id="right" x="98" y="0" width="2" height="100" fill="#2a2e32"/>
<rect id="topleft" x="0" y="0" width="2" height="2" fill="#2a2e32"/>
<rect id="topright" x="98" y="0" width="2" height="2" fill="#2a2e32"/>
<rect id="bottomleft" x="0" y="97" width="2" height="3" fill="#8cc63f" fill-opacity="0.5"/>
<rect id="bottomright" x="98" y="97" width="2" height="3" fill="#8cc63f" fill-opacity="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 1023 B

+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- NexusOS Plasma tooltip background -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="100" height="100">
<rect id="center"
x="6" y="6" width="88" height="88"
fill="#2e3236"/>
<rect id="top" x="6" y="0" width="88" height="6" fill="#3a3d41"/>
<rect id="bottom" x="6" y="94" width="88" height="6" fill="#3a3d41"/>
<rect id="left" x="0" y="6" width="6" height="88" fill="#2e3236"/>
<rect id="right" x="94" y="6" width="6" height="88" fill="#2e3236"/>
<rect id="topleft" x="0" y="0" width="6" height="6" fill="#3a3d41"/>
<rect id="topright" x="94" y="0" width="6" height="6" fill="#3a3d41"/>
<rect id="bottomleft" x="0" y="94" width="6" height="6" fill="#3a3d41"/>
<rect id="bottomright" x="94" y="94" width="6" height="6" fill="#3a3d41"/>
<rect id="hint-left-margin" x="0" y="0" width="6" height="1" fill="none"/>
<rect id="hint-top-margin" x="0" y="0" width="1" height="6" fill="none"/>
<rect id="hint-right-margin" x="94" y="0" width="6" height="1" fill="none"/>
<rect id="hint-bottom-margin" x="0" y="94" width="1" height="6" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+397
View File
@@ -0,0 +1,397 @@
import QtQuick 2.0
import SddmComponents 2.0
Rectangle {
id: root
width: 1920
height: 1200
readonly property color accentColor: "#8cc63f" // brand_green
readonly property color bgDark: "#1e1526" // base_bg
readonly property color textPrimary: "#f2f2f2" // text_primary
readonly property color textMuted: "#a8a8a8" // text_secondary
readonly property color fieldBg: "#1f2225" // surface_bg
readonly property color fieldBorder: "#4d3461" // menu_border (purple tint)
readonly property color errorColor: "#da4453" // error_color
property int sessionIndex: sessionModel.lastIndex
Connections {
target: sddm
onLoginFailed: {
errorMsg.text = "Login failed — check your credentials."
passwordInput.text = ""
passwordInput.focus = true
shakeAnim.start()
}
onLoginSucceeded: {
errorMsg.text = ""
}
}
Image {
anchors.fill: parent
source: "assets/background.svg"
fillMode: Image.PreserveAspectCrop
smooth: true
asynchronous: false
}
Rectangle {
anchors.fill: parent
color: "#000000"
opacity: 0.25
}
Item {
id: logoArea
width: 120
height: 120
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: parent.height * 0.10
Rectangle {
anchors.centerIn: parent
width: parent.width * 1.6
height: parent.height * 1.6
radius: width / 2
color: accentColor
opacity: 0.06
}
Image {
id: logo
anchors.fill: parent
source: "assets/logo.png"
sourceSize: Qt.size(200, 200)
smooth: true
}
}
Text {
id: brandLabel
text: "NexusOS"
color: textPrimary
font.family: "Sans"
font.pixelSize: 28
font.letterSpacing: 6
font.weight: Font.Light
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: logoArea.bottom
anchors.topMargin: 16
}
Rectangle {
id: loginBox
width: 360
height: loginColumn.height + 60
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: brandLabel.bottom
anchors.topMargin: parent.height * 0.08
color: Qt.rgba(15/255, 22/255, 38/255, 0.75)
radius: 12
border.color: fieldBorder
border.width: 1
SequentialAnimation {
id: shakeAnim
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x - 10; duration: 50 }
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x + 10; duration: 50 }
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x - 6; duration: 50 }
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x + 6; duration: 50 }
NumberAnimation { target: loginBox; property: "x"; to: loginBox.x; duration: 40 }
}
Column {
id: loginColumn
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: 30
spacing: 14
Rectangle {
id: sessionBox
width: parent.width
height: 40
color: fieldBg
radius: 6
border.color: sessionDropdown.visible ? accentColor : fieldBorder
border.width: 1
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 14
anchors.right: sessionArrow.left
anchors.rightMargin: 8
text: sessionModel.data(sessionModel.index(sessionIndex, 0), Qt.DisplayRole) || "Session"
color: textPrimary
font.pixelSize: 13
elide: Text.ElideRight
}
Text {
id: sessionArrow
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 14
text: sessionDropdown.visible ? "▲" : "▼"
color: textMuted
font.pixelSize: 10
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
if (!sessionDropdown.visible) {
var pos = sessionBox.mapToItem(root, 0, sessionBox.height)
sessionDropdown.x = pos.x
sessionDropdown.y = pos.y + 2
sessionDropdown.width = sessionBox.width
}
sessionDropdown.visible = !sessionDropdown.visible
}
}
}
Rectangle {
width: parent.width
height: 44
color: fieldBg
radius: 6
border.color: usernameInput.activeFocus ? accentColor : fieldBorder
border.width: 1
TextInput {
id: usernameInput
anchors.fill: parent
anchors.leftMargin: 14
anchors.rightMargin: 14
verticalAlignment: TextInput.AlignVCenter
color: textPrimary
font.pixelSize: 14
clip: true
text: userModel.lastUser
Keys.onTabPressed: passwordInput.forceActiveFocus()
Keys.onReturnPressed: sddm.login(usernameInput.text, passwordInput.text, sessionIndex)
}
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 14
text: "Username"
color: textMuted
font.pixelSize: 14
visible: usernameInput.text.length === 0 && !usernameInput.activeFocus
}
}
Rectangle {
width: parent.width
height: 44
color: fieldBg
radius: 6
border.color: passwordInput.activeFocus ? accentColor : fieldBorder
border.width: 1
TextInput {
id: passwordInput
anchors.fill: parent
anchors.leftMargin: 14
anchors.rightMargin: 14
verticalAlignment: TextInput.AlignVCenter
color: textPrimary
font.pixelSize: 14
echoMode: TextInput.Password
clip: true
focus: true
Keys.onReturnPressed: sddm.login(usernameInput.text, passwordInput.text, sessionIndex)
}
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 14
text: "Password"
color: textMuted
font.pixelSize: 14
visible: passwordInput.text.length === 0 && !passwordInput.activeFocus
}
}
Text {
id: errorMsg
width: parent.width
text: ""
color: errorColor
font.pixelSize: 12
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
visible: text !== ""
}
Rectangle {
id: loginButton
width: parent.width
height: 44
radius: 6
color: loginMouse.pressed
? Qt.darker(accentColor, 1.3)
: loginMouse.containsMouse
? Qt.lighter(accentColor, 1.15)
: accentColor
Behavior on color { ColorAnimation { duration: 150 } }
Text {
anchors.centerIn: parent
text: "LOGIN"
color: "#0a0a00" // text_on_accent (dark on lime green)
font.pixelSize: 14
font.letterSpacing: 3
font.weight: Font.DemiBold
}
MouseArea {
id: loginMouse
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: sddm.login(usernameInput.text, passwordInput.text, sessionIndex)
}
}
Item {
width: parent.width
height: 30
Row {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
spacing: 30
Text {
text: "⏻ Shutdown"
color: textMuted
font.pixelSize: 12
opacity: shutdownMouse.containsMouse ? 1.0 : 0.7
Behavior on opacity { NumberAnimation { duration: 120 } }
MouseArea {
id: shutdownMouse
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: sddm.powerOff()
}
}
Text {
text: "↻ Reboot"
color: textMuted
font.pixelSize: 12
opacity: rebootMouse.containsMouse ? 1.0 : 0.7
Behavior on opacity { NumberAnimation { duration: 120 } }
MouseArea {
id: rebootMouse
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: sddm.reboot()
}
}
}
}
}
}
Rectangle {
id: sessionDropdown
visible: false
z: 999
color: fieldBg
radius: 6
border.color: fieldBorder
border.width: 1
height: sessionList.contentHeight
clip: true
ListView {
id: sessionList
anchors.fill: parent
model: sessionModel
interactive: false
delegate: Rectangle {
width: sessionList.width
height: 36
color: sessionItemMouse.containsMouse ? Qt.lighter(fieldBg, 1.4) : "transparent"
radius: 4
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 14
text: model.name || ""
color: index === sessionIndex ? accentColor : textPrimary
font.pixelSize: 13
}
MouseArea {
id: sessionItemMouse
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
sessionIndex = index
sessionDropdown.visible = false
}
}
}
}
}
Column {
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: parent.height * 0.05
spacing: 2
Text {
id: clockText
anchors.horizontalCenter: parent.horizontalCenter
color: textPrimary
font.family: "Sans"
font.pixelSize: 42
font.weight: Font.Thin
}
Text {
id: dateText
anchors.horizontalCenter: parent.horizontalCenter
color: textMuted
font.family: "Sans"
font.pixelSize: 14
font.letterSpacing: 2
}
Timer {
interval: 1000
running: true
repeat: true
triggeredOnStart: true
onTriggered: {
var d = new Date()
clockText.text = Qt.formatTime(d, "hh:mm")
dateText.text = Qt.formatDate(d, "dddd, MMMM d")
}
}
}
}
+27
View File
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1200" width="1920" height="1200">
<defs>
<linearGradient id="metalBase" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#1a1a2e;stop-opacity:1"/>
<stop offset="35%" style="stop-color:#16213e;stop-opacity:1"/>
<stop offset="65%" style="stop-color:#0f1626;stop-opacity:1"/>
<stop offset="100%" style="stop-color:#0a0e1a;stop-opacity:1"/>
</linearGradient>
<radialGradient id="vignette" cx="50%" cy="50%" r="70%">
<stop offset="0%" style="stop-color:transparent;stop-opacity:0"/>
<stop offset="100%" style="stop-color:#000000;stop-opacity:0.6"/>
</radialGradient>
<pattern id="brushLines" x="0" y="0" width="4" height="4" patternUnits="userSpaceOnUse">
<line x1="0" y1="4" x2="4" y2="0" stroke="#ffffff" stroke-width="0.3" opacity="0.03"/>
</pattern>
<pattern id="machineLines" x="0" y="0" width="100" height="3" patternUnits="userSpaceOnUse">
<line x1="0" y1="1.5" x2="100" y2="1.5" stroke="#ffffff" stroke-width="0.2" opacity="0.025"/>
</pattern>
</defs>
<rect width="1920" height="1200" fill="url(#metalBase)"/>
<rect width="1920" height="1200" fill="url(#brushLines)"/>
<rect width="1920" height="1200" fill="url(#machineLines)"/>
<ellipse cx="960" cy="340" rx="1200" ry="280" fill="#ffffff" opacity="0.012"/>
<ellipse cx="960" cy="220" rx="400" ry="170" fill="#00d4ff" opacity="0.015"/>
<rect width="1920" height="1200" fill="url(#vignette)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

+10
View File
@@ -0,0 +1,10 @@
[SddmGreeterTheme]
Name=NexusOS-QML
Description=Dark brushed-metal lockscreen theme with flat N logo, upper-center branding, and centered login box.
Author=Jon
Version=1.0
Website=
Screenshot=
MainScript=Main.qml
ConfigFile=theme.conf
TranslationsDirectory=
+16
View File
@@ -0,0 +1,16 @@
[General]
# ── NexusOS-QML Theme Configuration ──
background=assets/background.svg
logo=assets/logo.png
# Color palette
accentColor=#8cc63f
bgDark=#1e1526
textPrimary=#f2f2f2
textMuted=#a8a8a8
fieldBg=#1f2225
fieldBorder=#4d3461
errorColor=#da4453
type=color