Add initial Shift desktop theme frame assets

Provide the first real Shift Plasma desktop theme SVGs for panel and widget frames used directly by the shell. Cover dark and light modes, including solid panel backgrounds for opaque panel states.

Extend the theme identity test so the desktop themes cannot regress to metadata-only packages.
This commit is contained in:
Marco Allegretti 2026-05-18 10:17:27 +02:00
parent 85f102a2d1
commit 1de58ed486
9 changed files with 202 additions and 0 deletions

View file

@ -0,0 +1,23 @@
<!-- SPDX-FileCopyrightText: 2026 Marco Allegretti -->
<!-- SPDX-License-Identifier: EUPL-1.2 -->
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<rect id="hint-tile-center" x="0" y="0" width="2" height="2" fill="#2eb8a8" opacity="0"/>
<rect id="center" x="8" y="8" width="48" height="48" fill="#0e1118"/>
<rect id="top" x="8" y="0" width="48" height="8" fill="#0e1118"/>
<rect id="bottom" x="8" y="56" width="48" height="8" fill="#0e1118"/>
<rect id="left" x="0" y="8" width="8" height="48" fill="#0e1118"/>
<rect id="right" x="56" y="8" width="8" height="48" fill="#0e1118"/>
<rect id="topleft" x="0" y="0" width="8" height="8" fill="#0e1118"/>
<rect id="topright" x="56" y="0" width="8" height="8" fill="#0e1118"/>
<rect id="bottomleft" x="0" y="56" width="8" height="8" fill="#0e1118"/>
<rect id="bottomright" x="56" y="56" width="8" height="8" fill="#0e1118"/>
<rect id="hint-top-margin" x="30" y="0" width="4" height="8" fill="#2eb8a8" opacity="0"/>
<rect id="hint-bottom-margin" x="30" y="56" width="4" height="8" fill="#2eb8a8" opacity="0"/>
<rect id="hint-left-margin" x="0" y="30" width="8" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="hint-right-margin" x="56" y="30" width="8" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="thick-center" x="12" y="12" width="40" height="40" fill="#0e1118"/>
<rect id="thick-hint-top-margin" x="30" y="0" width="4" height="12" fill="#2eb8a8" opacity="0"/>
<rect id="thick-hint-bottom-margin" x="30" y="52" width="4" height="12" fill="#2eb8a8" opacity="0"/>
<rect id="thick-hint-left-margin" x="0" y="30" width="12" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="thick-hint-right-margin" x="52" y="30" width="12" height="4" fill="#2eb8a8" opacity="0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,22 @@
<!-- SPDX-FileCopyrightText: 2026 Marco Allegretti -->
<!-- SPDX-License-Identifier: EUPL-1.2 -->
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<rect id="hint-tile-center" x="0" y="0" width="2" height="2" fill="#2eb8a8" opacity="0"/>
<rect id="center" x="8" y="8" width="48" height="48" rx="3" fill="#171c29"/>
<rect id="top" x="8" y="0" width="48" height="8" fill="#171c29"/>
<rect id="bottom" x="8" y="56" width="48" height="8" fill="#171c29"/>
<rect id="left" x="0" y="8" width="8" height="48" fill="#171c29"/>
<rect id="right" x="56" y="8" width="8" height="48" fill="#171c29"/>
<rect id="topleft" x="0" y="0" width="8" height="8" fill="#171c29"/>
<rect id="topright" x="56" y="0" width="8" height="8" fill="#171c29"/>
<rect id="bottomleft" x="0" y="56" width="8" height="8" fill="#171c29"/>
<rect id="bottomright" x="56" y="56" width="8" height="8" fill="#171c29"/>
<rect id="hint-top-margin" x="30" y="0" width="4" height="8" fill="#2eb8a8" opacity="0"/>
<rect id="hint-bottom-margin" x="30" y="56" width="4" height="8" fill="#2eb8a8" opacity="0"/>
<rect id="hint-left-margin" x="0" y="30" width="8" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="hint-right-margin" x="56" y="30" width="8" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="hint-top-inset" x="30" y="8" width="4" height="1" fill="#2eb8a8" opacity="0"/>
<rect id="hint-bottom-inset" x="30" y="55" width="4" height="1" fill="#2eb8a8" opacity="0"/>
<rect id="hint-left-inset" x="8" y="30" width="1" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="hint-right-inset" x="55" y="30" width="1" height="4" fill="#2eb8a8" opacity="0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,33 @@
<!-- SPDX-FileCopyrightText: 2026 Marco Allegretti -->
<!-- SPDX-License-Identifier: EUPL-1.2 -->
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">
.ColorScheme-Background { color: #0e1118; }
.ColorScheme-Highlight { color: #2eb8a8; }
</style>
</defs>
<rect id="hint-tile-center" x="0" y="0" width="2" height="2" fill="#2eb8a8" opacity="0"/>
<rect id="center" x="8" y="8" width="48" height="48" rx="0" fill="#111622"/>
<rect id="top" x="8" y="0" width="48" height="8" fill="#111622"/>
<rect id="bottom" x="8" y="56" width="48" height="8" fill="#111622"/>
<rect id="left" x="0" y="8" width="8" height="48" fill="#111622"/>
<rect id="right" x="56" y="8" width="8" height="48" fill="#111622"/>
<rect id="topleft" x="0" y="0" width="8" height="8" fill="#111622"/>
<rect id="topright" x="56" y="0" width="8" height="8" fill="#111622"/>
<rect id="bottomleft" x="0" y="56" width="8" height="8" fill="#111622"/>
<rect id="bottomright" x="56" y="56" width="8" height="8" fill="#111622"/>
<rect id="hint-top-margin" x="30" y="0" width="4" height="8" fill="#2eb8a8" opacity="0"/>
<rect id="hint-bottom-margin" x="30" y="56" width="4" height="8" fill="#2eb8a8" opacity="0"/>
<rect id="hint-left-margin" x="0" y="30" width="8" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="hint-right-margin" x="56" y="30" width="8" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="hint-top-inset" x="30" y="8" width="4" height="1" fill="#2eb8a8" opacity="0"/>
<rect id="hint-bottom-inset" x="30" y="55" width="4" height="1" fill="#2eb8a8" opacity="0"/>
<rect id="hint-left-inset" x="8" y="30" width="1" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="hint-right-inset" x="55" y="30" width="1" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="thick-center" x="12" y="12" width="40" height="40" fill="#111622"/>
<rect id="thick-hint-top-margin" x="30" y="0" width="4" height="12" fill="#2eb8a8" opacity="0"/>
<rect id="thick-hint-bottom-margin" x="30" y="52" width="4" height="12" fill="#2eb8a8" opacity="0"/>
<rect id="thick-hint-left-margin" x="0" y="30" width="12" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="thick-hint-right-margin" x="52" y="30" width="12" height="4" fill="#2eb8a8" opacity="0"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1,18 @@
<!-- SPDX-FileCopyrightText: 2026 Marco Allegretti -->
<!-- SPDX-License-Identifier: EUPL-1.2 -->
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<rect id="hint-tile-center" x="0" y="0" width="2" height="2" fill="#2eb8a8" opacity="0"/>
<rect id="center" x="8" y="8" width="48" height="48" fill="#0e1118" opacity="0.72"/>
<rect id="top" x="8" y="0" width="48" height="8" fill="#0e1118" opacity="0.72"/>
<rect id="bottom" x="8" y="56" width="48" height="8" fill="#0e1118" opacity="0.72"/>
<rect id="left" x="0" y="8" width="8" height="48" fill="#0e1118" opacity="0.72"/>
<rect id="right" x="56" y="8" width="8" height="48" fill="#0e1118" opacity="0.72"/>
<rect id="topleft" x="0" y="0" width="8" height="8" fill="#0e1118" opacity="0.72"/>
<rect id="topright" x="56" y="0" width="8" height="8" fill="#0e1118" opacity="0.72"/>
<rect id="bottomleft" x="0" y="56" width="8" height="8" fill="#0e1118" opacity="0.72"/>
<rect id="bottomright" x="56" y="56" width="8" height="8" fill="#0e1118" opacity="0.72"/>
<rect id="hint-top-margin" x="30" y="0" width="4" height="8" fill="#2eb8a8" opacity="0"/>
<rect id="hint-bottom-margin" x="30" y="56" width="4" height="8" fill="#2eb8a8" opacity="0"/>
<rect id="hint-left-margin" x="0" y="30" width="8" height="4" fill="#2eb8a8" opacity="0"/>
<rect id="hint-right-margin" x="56" y="30" width="8" height="4" fill="#2eb8a8" opacity="0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,23 @@
<!-- SPDX-FileCopyrightText: 2026 Marco Allegretti -->
<!-- SPDX-License-Identifier: EUPL-1.2 -->
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<rect id="hint-tile-center" x="0" y="0" width="2" height="2" fill="#0f766e" opacity="0"/>
<rect id="center" x="8" y="8" width="48" height="48" fill="#ffffff"/>
<rect id="top" x="8" y="0" width="48" height="8" fill="#ffffff"/>
<rect id="bottom" x="8" y="56" width="48" height="8" fill="#ffffff"/>
<rect id="left" x="0" y="8" width="8" height="48" fill="#ffffff"/>
<rect id="right" x="56" y="8" width="8" height="48" fill="#ffffff"/>
<rect id="topleft" x="0" y="0" width="8" height="8" fill="#ffffff"/>
<rect id="topright" x="56" y="0" width="8" height="8" fill="#ffffff"/>
<rect id="bottomleft" x="0" y="56" width="8" height="8" fill="#ffffff"/>
<rect id="bottomright" x="56" y="56" width="8" height="8" fill="#ffffff"/>
<rect id="hint-top-margin" x="30" y="0" width="4" height="8" fill="#0f766e" opacity="0"/>
<rect id="hint-bottom-margin" x="30" y="56" width="4" height="8" fill="#0f766e" opacity="0"/>
<rect id="hint-left-margin" x="0" y="30" width="8" height="4" fill="#0f766e" opacity="0"/>
<rect id="hint-right-margin" x="56" y="30" width="8" height="4" fill="#0f766e" opacity="0"/>
<rect id="thick-center" x="12" y="12" width="40" height="40" fill="#ffffff"/>
<rect id="thick-hint-top-margin" x="30" y="0" width="4" height="12" fill="#0f766e" opacity="0"/>
<rect id="thick-hint-bottom-margin" x="30" y="52" width="4" height="12" fill="#0f766e" opacity="0"/>
<rect id="thick-hint-left-margin" x="0" y="30" width="12" height="4" fill="#0f766e" opacity="0"/>
<rect id="thick-hint-right-margin" x="52" y="30" width="12" height="4" fill="#0f766e" opacity="0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,22 @@
<!-- SPDX-FileCopyrightText: 2026 Marco Allegretti -->
<!-- SPDX-License-Identifier: EUPL-1.2 -->
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<rect id="hint-tile-center" x="0" y="0" width="2" height="2" fill="#0f766e" opacity="0"/>
<rect id="center" x="8" y="8" width="48" height="48" rx="3" fill="#ffffff"/>
<rect id="top" x="8" y="0" width="48" height="8" fill="#ffffff"/>
<rect id="bottom" x="8" y="56" width="48" height="8" fill="#ffffff"/>
<rect id="left" x="0" y="8" width="8" height="48" fill="#ffffff"/>
<rect id="right" x="56" y="8" width="8" height="48" fill="#ffffff"/>
<rect id="topleft" x="0" y="0" width="8" height="8" fill="#ffffff"/>
<rect id="topright" x="56" y="0" width="8" height="8" fill="#ffffff"/>
<rect id="bottomleft" x="0" y="56" width="8" height="8" fill="#ffffff"/>
<rect id="bottomright" x="56" y="56" width="8" height="8" fill="#ffffff"/>
<rect id="hint-top-margin" x="30" y="0" width="4" height="8" fill="#0f766e" opacity="0"/>
<rect id="hint-bottom-margin" x="30" y="56" width="4" height="8" fill="#0f766e" opacity="0"/>
<rect id="hint-left-margin" x="0" y="30" width="8" height="4" fill="#0f766e" opacity="0"/>
<rect id="hint-right-margin" x="56" y="30" width="8" height="4" fill="#0f766e" opacity="0"/>
<rect id="hint-top-inset" x="30" y="8" width="4" height="1" fill="#0f766e" opacity="0"/>
<rect id="hint-bottom-inset" x="30" y="55" width="4" height="1" fill="#0f766e" opacity="0"/>
<rect id="hint-left-inset" x="8" y="30" width="1" height="4" fill="#0f766e" opacity="0"/>
<rect id="hint-right-inset" x="55" y="30" width="1" height="4" fill="#0f766e" opacity="0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,27 @@
<!-- SPDX-FileCopyrightText: 2026 Marco Allegretti -->
<!-- SPDX-License-Identifier: EUPL-1.2 -->
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<rect id="hint-tile-center" x="0" y="0" width="2" height="2" fill="#0f766e" opacity="0"/>
<rect id="center" x="8" y="8" width="48" height="48" fill="#f6f8fb"/>
<rect id="top" x="8" y="0" width="48" height="8" fill="#f6f8fb"/>
<rect id="bottom" x="8" y="56" width="48" height="8" fill="#f6f8fb"/>
<rect id="left" x="0" y="8" width="8" height="48" fill="#f6f8fb"/>
<rect id="right" x="56" y="8" width="8" height="48" fill="#f6f8fb"/>
<rect id="topleft" x="0" y="0" width="8" height="8" fill="#f6f8fb"/>
<rect id="topright" x="56" y="0" width="8" height="8" fill="#f6f8fb"/>
<rect id="bottomleft" x="0" y="56" width="8" height="8" fill="#f6f8fb"/>
<rect id="bottomright" x="56" y="56" width="8" height="8" fill="#f6f8fb"/>
<rect id="hint-top-margin" x="30" y="0" width="4" height="8" fill="#0f766e" opacity="0"/>
<rect id="hint-bottom-margin" x="30" y="56" width="4" height="8" fill="#0f766e" opacity="0"/>
<rect id="hint-left-margin" x="0" y="30" width="8" height="4" fill="#0f766e" opacity="0"/>
<rect id="hint-right-margin" x="56" y="30" width="8" height="4" fill="#0f766e" opacity="0"/>
<rect id="hint-top-inset" x="30" y="8" width="4" height="1" fill="#0f766e" opacity="0"/>
<rect id="hint-bottom-inset" x="30" y="55" width="4" height="1" fill="#0f766e" opacity="0"/>
<rect id="hint-left-inset" x="8" y="30" width="1" height="4" fill="#0f766e" opacity="0"/>
<rect id="hint-right-inset" x="55" y="30" width="1" height="4" fill="#0f766e" opacity="0"/>
<rect id="thick-center" x="12" y="12" width="40" height="40" fill="#f6f8fb"/>
<rect id="thick-hint-top-margin" x="30" y="0" width="4" height="12" fill="#0f766e" opacity="0"/>
<rect id="thick-hint-bottom-margin" x="30" y="52" width="4" height="12" fill="#0f766e" opacity="0"/>
<rect id="thick-hint-left-margin" x="0" y="30" width="12" height="4" fill="#0f766e" opacity="0"/>
<rect id="thick-hint-right-margin" x="52" y="30" width="12" height="4" fill="#0f766e" opacity="0"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,18 @@
<!-- SPDX-FileCopyrightText: 2026 Marco Allegretti -->
<!-- SPDX-License-Identifier: EUPL-1.2 -->
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<rect id="hint-tile-center" x="0" y="0" width="2" height="2" fill="#0f766e" opacity="0"/>
<rect id="center" x="8" y="8" width="48" height="48" fill="#ffffff" opacity="0.78"/>
<rect id="top" x="8" y="0" width="48" height="8" fill="#ffffff" opacity="0.78"/>
<rect id="bottom" x="8" y="56" width="48" height="8" fill="#ffffff" opacity="0.78"/>
<rect id="left" x="0" y="8" width="8" height="48" fill="#ffffff" opacity="0.78"/>
<rect id="right" x="56" y="8" width="8" height="48" fill="#ffffff" opacity="0.78"/>
<rect id="topleft" x="0" y="0" width="8" height="8" fill="#ffffff" opacity="0.78"/>
<rect id="topright" x="56" y="0" width="8" height="8" fill="#ffffff" opacity="0.78"/>
<rect id="bottomleft" x="0" y="56" width="8" height="8" fill="#ffffff" opacity="0.78"/>
<rect id="bottomright" x="56" y="56" width="8" height="8" fill="#ffffff" opacity="0.78"/>
<rect id="hint-top-margin" x="30" y="0" width="4" height="8" fill="#0f766e" opacity="0"/>
<rect id="hint-bottom-margin" x="30" y="56" width="4" height="8" fill="#0f766e" opacity="0"/>
<rect id="hint-left-margin" x="0" y="30" width="8" height="4" fill="#0f766e" opacity="0"/>
<rect id="hint-right-margin" x="56" y="30" width="8" height="4" fill="#0f766e" opacity="0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -65,6 +65,22 @@ require_line desktoptheme/shift-light/metadata.json '"Name": "SHIFT Light"' \
require_line cursors/shift-cursors/index.theme '^Name=SHIFT$' \ require_line cursors/shift-cursors/index.theme '^Name=SHIFT$' \
"cursor theme visible name must be SHIFT" "cursor theme visible name must be SHIFT"
for desktop_asset in \
desktoptheme/shift-dark/widgets/panel-background.svg \
desktoptheme/shift-dark/solid/widgets/panel-background.svg \
desktoptheme/shift-dark/widgets/background.svg \
desktoptheme/shift-dark/widgets/translucentbackground.svg \
desktoptheme/shift-light/widgets/panel-background.svg \
desktoptheme/shift-light/solid/widgets/panel-background.svg \
desktoptheme/shift-light/widgets/background.svg \
desktoptheme/shift-light/widgets/translucentbackground.svg; do
[[ -f "$desktop_asset" ]] || fail "Shift desktop theme must provide $desktop_asset"
require_line "$desktop_asset" 'SPDX-FileCopyrightText: 2026 Marco Allegretti' \
"$desktop_asset must attribute Shift-owned work to Marco Allegretti"
require_line "$desktop_asset" 'SPDX-License-Identifier: EUPL-1\.2' \
"$desktop_asset must use EUPL-1.2"
done
require_line lookandfeel/contents/defaults '^ColorScheme=ShiftDark$' \ require_line lookandfeel/contents/defaults '^ColorScheme=ShiftDark$' \
"look-and-feel defaults must select ShiftDark" "look-and-feel defaults must select ShiftDark"
require_line lookandfeel/contents/defaults '^Theme=org\.shift\.icons$' \ require_line lookandfeel/contents/defaults '^Theme=org\.shift\.icons$' \