* feat(settings): persist named location for theme & gamma auto modes
* chore: bump dank-qml-common for location search support
* fix(settings): keep weather location name when search fills coordinates
* style(settings): unify manual coordinates layout with weather
- settings.json/session.json now store only values that differ from
spec defaults
- Machine-specific state moves out of settings.json into session.json
- Add dms backup create/restore: tar.gz of ~/.config/DankMaterialShell
fixes#3027
* feat(theme): add extract current theme to JSON file
Adds an 'Extract' button in Settings > Theme Color that exports the
current theme (generic/dynamic/custom/registry) to a dual-mode dark+light
JSON file via the DMS file save dialog.
* refactor(theme): simplify extract button to single DankButton
* refactor(theme): move extract button inside dynamic theme section
* fix(theme): address review feedback on extract theme save
* refactor: utilize dankActionButton
---------
* feat(tray): add IPC action to open tray menus
* tray: open IPC-requested menus on the focused screen only
---------
Co-authored-by: bbedward <[email protected]>
closeHoverSurfaces() called TrayMenuManager.closeAllMenus(), tearing down
every registered tray menu including ones opened by right-click. With
hoverPopouts enabled, moving the pointer after a right-click re-ran the
hit test and closed the menu before it could be reached.
Tag each menu with how it was opened and add closeHoverMenus(), which
only closes hover-opened menus. The hover controller now uses that.
Click-driven callers pass no argument, so byHover stays undefined and
`byHover === true` evaluates to false.
Fixes#2978
Claude-Session: https://claude.ai/code/session_01DYF9vdsaToU4Usu7kxPCNB
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
* fix(mpris): enrich metadata across equivalent players
* fix(mpris): address review feedback on source stealing and title stripping
- _bestPlayingPlayer: when the active player is playing but not
controllable, only hand ownership to a controllable peer that passes
isSameTrack; unrelated players can no longer steal the active source.
- displayTrackTitle: keep the full trackTitle for display. Suffix
stripping now only applies to the isSameTrack matching key, and only
for a known app-name allowlist (YouTube, SoundCloud, browsers, etc.)
so legitimate titles containing ' | ' are never mangled.
Co-Authored-By: Claude Fable 5 <[email protected]>
---------
Port 1.5
* feat: add QR Generator modal with auto-generate on input debounce
- QRGeneratorModal with dual-buffer sequential fade animation
- Auto-generate QR code on typing stop (200ms debounce)
- Clear text button on input field
- Escape key closes modal
- Register modal in PopoutService and AppSearchService
- Go backend for text QR code generation
* fix: add QR Generator toggle to Launcher DMS settings
* qr: also add qrg built in launcher plugin
---------
Co-authored-by: bbedward <[email protected]>