New settings/ui.nix holds `radius` as the one source of truth. Theme
derives radiusCard/Small/Tiny from it and hyprland's decoration.rounding
reads the same value, so one number rescales the whole desktop —
previously the shell and the window corners were unrelated constants,
which is why doubling Theme.radius left windows at 8.
Cards were using the SAME radius as the panel containing them. Nested
corners need outer − gap; matching them makes the inner corner
over-round for its size, which is the inflated/balloon look. All nine
inner surfaces now use radiusCard (radius − panelGap). Invisible at
r=8, obvious at r=32.
Radius 32 -> 24.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Radii doubled a second time (32/24/16).
Dropdown panels were +16 on the cross axis while the shader insets 8
top and bottom, leaving the panel edge flush with the content (0
padding) against a 4px overhang on the growth axis. Now +24 with the
content offset 12, giving 4px above and below to match the right.
Session menu becomes a real BarDropdown instead of its own surface:
it shares the morphing chrome with the other bar menus, so switching
between it and e.g. volume glides rather than cross-fading. Drops its
dedicated SDF surface, shader uniform and mask region, and the power
button gains the same hover-to-switch the other widgets have. Moved
beside volDropdown so it sits after the component declaration.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Panels near a frame band left a visible seam instead of merging. The
clamp now targets the frame's inner edge and the shader extends any
surface within snapDist 4px INTO the band, so the SDF fuses them into
one swollen shape — the launcher's launchBot trick, generalised to
dropdowns, the session menu and the toast.
Reverts the panelGap inset from the previous commit, which pushed in
the wrong direction.
qsIcon used anchors.verticalCenter and was centred only because the
cell was qsIcon.width; at barWidth it sat at x=0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
trayArea kept anchors.verticalCenter from when it was a Row inside a
Row. A Column refuses to position ANY child when one sets a vertical
anchor ("Column will not function"), so volume/network/night-mode/
tray/power all fell to y=0 and stacked unclickably in the corner.
Workspace switch animation gets style = "slidevert" so it slides up/
down to match the vertical workspace column.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A dropdown that hits the clamp landed exactly on frameWidth, fusing
into the frame band in the SDF and losing its rounded corner — that
is what the calendar was doing at the top. Clamp now insets by
panelGap at both ends.
Bottom cluster spacing 12 -> 16, separators 5 -> 10.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Calendar was left on dropdownY: bar.height / 2 from the rotation, so
it opened at screen centre instead of next to the clock it comes from.
It now maps the clock's position like every other dropdown.
Bottom cluster reads as one clump: bumped its spacing to 12 to match
the top and split status icons / tray / power with separators.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bar moves from a horizontal top band to a vertical left column
(Theme.barHeight -> barWidth, 46px for the stacked HH/mm clock).
Every panel now grows rightward out of the bar instead of down:
the dropdown chrome's morph axis, the SDF surface geometry and the
session menu all swap x/y. The launcher is the one surface left at
bottom-centre, as asked.
New: NixOS snowflake at the top (recoloured to the accent with the
tray's hidden-Image + ColorOverlay trick), vertical workspace dots
whose focused pill grows on height, an inline OSD slot in the gap
between the two clusters, and a power button in the bottom-left
that opens the session menu.
Dropped the flush-to-far-edge dropdown special case — clamped
tracking plus the SDF melt already covers it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sixth surface in the SDF chrome shader, melting out of the bottom
frame. Volume is reactive via Pipewire so the OSD also fires for
pavucontrol/mixer changes; brightness routes through a new osd IPC
handler since sysfs backlight only notifies via POLLPRI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- album art uses ClippingRectangle so the image follows the radius
- NotifContent gains an app icon + name header
- notifications move to a full-width card spanning both panes, each item
showing the notification image preview when present
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Extend the launcher/session HyprlandFocusGrab to the bar dropdowns and
remove the per-dropdown inactivity timers. Shift+Super+S brackets hyprshot
with a screenshot pin so open menus survive slurp's input grab.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- calendar month chevrons: fade from transparent base02, no black flash
- power menu: all four buttons use the logout base05 setup
- runner results: base01 card segment matching other dropdowns
- cards: translucent cardBg so the bar-layer blur shows through
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reduces the shell from 2898 → 2712 lines (~316 lines of duplication removed,
~130 of reusable scaffolding added). Rollback point: tag quickshell-pre-refactor.
- Theme tokens: barHeight, radius/radiusSmall/radiusTiny, cardPad, animMorph/
animContent/animFade — bar height and the shader cutout math now derive from
one constant instead of ~10 scattered 30/26 literals
- SText/SIcon base components default the two fonts (removed 58 font.family lines)
- Card component: the rounded base01 section surface, now one definition driving
7 cards (volume ×2, network ×2, battery ×2, calendar)
- PillSlider component: master + per-app volume sliders share one slider
- NotifContent component: calendar list + toast notification bodies deduped
- dead code: dropped unused QtQuick.Shapes import, collapsed redundant
weatherGlyph branches, converted the lone RowLayout to drop QtQuick.Layouts
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- launcher moved into the bar window as a 5th SDF surface: melts out of
the bottom frame edge, height morphs live as results filter
- session menu selection is a gliding pill (battery-menu tech)
- launcher selection uses an animated ListView highlight
- HyprlandFocusGrab gives both panels click-outside dismissal
- standalone Launcher.qml window removed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Material Symbols Rounded (ligature names) replaces nerd-font glyphs for
all shell icons; text stays on the stylix mono font
- network dropdown gets the card treatment like the others
- power menu is now an icon-only session panel melting out of the right
frame column at screen centre (still Super+L); launcher is apps-only
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bar, frame, panel and toast are one signed-distance field (compiled to
qsb at build time); ears, border gaps and the parametric melt are all
emergent from the math. PanelShape and all melt machinery deleted.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>