theme: soften the YoRHa shapes; SUPER+D opens the dashboard

The square markers, block meters and hard-cornered fills read as boxy
next to the porthole. The desktop is now soft throughout: the porthole
is the shape everything is built around and every smaller surface echoes
it.

- Theme gains radiusS / radiusM / radiusL. radiusL is frameRadius - padS,
  so anything inset padS inside one of the frame's curves is concentric
  with it.
- P5Panel and Skew draw rounded rectangles (Geom.roundedRect) whenever
  they neither lean nor are chopped, which is always now; the polygon
  path is kept for shapes brought back on purpose.
- Markers are dots; workspace pips, toggles, transport and media chips,
  notification actions and today's date are pills or discs; the slider
  handle is round. Meters are one continuous rounded line that glides to
  its level instead of a row of segments.
- Album art is rounded with ClippingRectangle in the bar, the media
  popout and the dashboard.
- Free-standing panels (launcher, ask) drop the corner brackets and take
  the frame radius.
- Fix: a hovered notification's wash was a full-bleed square, so in the
  drawer's bottom corner it ran past the drawer's curve. It is inset by
  padS/2 and rounded by radiusL, which keeps it inside the curve.

Hyprland: the discord special workspace and its window rule are gone,
SUPER+S stays the only scratchpad, and SUPER+D now opens the dashboard
(it was on SUPER+I).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
nvrlandClaude Opus 5.5 committed 2026-10-04 20:56:43 +02:00
1 parent d6de04eaaf
commit a8c19961e2
24 files changed
+188 -110

No files matched your search

+2 -1
View File
@@ -130,7 +130,8 @@ Popout {
Skew {
anchors.centerIn: parent
width: 26
height: 24
height: 26
radius: 13
visible: cell.modelData.today
color: Theme.accent
}
+6 -2
View File
@@ -1,6 +1,7 @@
import QtQuick
import QtQuick.Shapes
import Quickshell
import Quickshell.Widgets
import "root:/config"
import "root:/components"
import "root:/services"
@@ -32,14 +33,15 @@ Popout {
subtitle: Media.identity
}
// Cover art in a hairline frame.
Rectangle {
// Cover art, rounded, in a hairline frame.
ClippingRectangle {
id: artFrame
anchors.top: header.bottom
anchors.topMargin: Theme.padM
anchors.left: parent.left
width: 108
height: 108
radius: Theme.radiusL
color: Theme.surface
border.width: 1
border.color: Theme.overlay
@@ -216,6 +218,7 @@ Popout {
Skew {
anchors.fill: parent
radius: height / 2
color: !chip.enabled
? Theme.treatmentDisabledFill
: (chip.activeFocus
@@ -287,6 +290,7 @@ Popout {
Skew {
anchors.fill: parent
radius: width / 2
color: {
if (!tb.enabled) return "transparent";
if (tb.activeFocus) return Theme.treatmentFocusFill;
+2 -1
View File
@@ -3,7 +3,7 @@ import "root:/config"
import "root:/components"
// Title bar for a popout, in the NieR header pattern: glyph, tracked heading,
// right-aligned status text, and a hairline rule that ends in a square.
// right-aligned status text, and a hairline rule that ends in a dot.
Item {
id: root
@@ -62,6 +62,7 @@ Item {
anchors.right: parent.right
width: Theme.marker
height: Theme.marker
radius: width / 2
color: Theme.accent
}
}
+5 -3
View File
@@ -17,14 +17,16 @@ P5Panel {
// Zero, not a transparent fill: P5Panel re-applies this opacity to the
// fill colour, which turned "transparent" into 97% black.
fillOpacity: attached ? 0 : 0.97
// The frame is structure: a neutral hairline. The tone goes into the
// corner ticks, which is where NieR puts the one bright mark on a panel.
// The frame is structure: a neutral hairline. A free-standing panel takes
// the frame's own corner radius, so it reads as a piece of the hull set
// down somewhere else rather than as a hard card.
border: Theme.surfaceAlt
borderWidth: attached ? 0 : Theme.stroke
halftone: textured
halftoneColor: tone
halftoneOpacity: 0.06
ticks: !attached
ticks: false
radius: Theme.frameRadius
tickColor: tone
padding: Theme.padM
}
+1
View File
@@ -106,6 +106,7 @@ Column {
anchors.fill: parent
anchors.leftMargin: Theme.padS
anchors.rightMargin: Theme.padS
radius: Theme.radiusM
color: row.hovered ? Theme.accent : "transparent"
Behavior on color {