Add Live Activities as configurable bar items (#30)

* Add Live Activities as configurable bar items

* Fix activity owner monitoring and Morph list interactions

* Keep activity rows stable during updates and tighten their layout

* Use subtle theme tint for activity cards

* Tighten activity title and progress spacing

* Use theme accent for active progress rings

* Fit compact activities to measured titles and badge

* Expose Live Activities display controls in Settings

* Open activity terminals and streamline the Morph header

* Give Morph continuous icons and prioritize workspace navigation

* Show activity progress inside its ring

* Inset activity progress rings and strengthen their stroke

* Fix activity lifecycle, command output handling and list navigation

* Reduce activity update work and harden publisher lifetimes

* Set up Live Activities for the detected user shell during installation

* Document Activities setup, daily use and troubleshooting

* Preserve Morph idle width across empty activity updates

* Fix dimming flicker, hide inactive music tab and consolidate Activities docs

* Fix panel clearance across styles and match previews to theme settings

* Prevent panel blur from repainting neighboring islands

---------

Co-authored-by: Samuel Onoja <[email protected]>
This commit is contained in:
Samuel OnojaandSamuel Onoja authored and GitHub committed 2026-10-12 22:52:25 +01:00
1 parent 7a7df0106c
commit 6b0d903ad0
107 files changed
+9340 -291

No files matched your search

+8 -1
View File
@@ -120,6 +120,7 @@ pub enum ItemKind {
},
FocusedWindow,
Media,
Activities,
QuickSettings,
Network,
Audio,
@@ -141,6 +142,7 @@ impl ItemKind {
Self::Workspaces { .. } => "Workspaces",
Self::FocusedWindow => "Focused window",
Self::Media => "Media",
Self::Activities => "Activities",
Self::QuickSettings => "Quick Settings",
Self::Network => "Network",
Self::Audio => "Audio",
@@ -155,7 +157,7 @@ impl ItemKind {
pub fn representations(self) -> &'static [Representation] {
use Representation::*;
match self {
Self::Media | Self::Clock => &[Wide, Compact, Icon],
Self::Activities | Self::Media | Self::Clock => &[Wide, Compact, Icon],
Self::Battery { percentage: true } => &[Wide, Icon],
Self::Workspaces { .. } | Self::FocusedWindow => &[Wide],
_ => &[Icon],
@@ -283,6 +285,8 @@ impl Item {
},
priority: if matches!(kind, ItemKind::Overview | ItemKind::Workspaces { .. }) {
100
} else if kind == ItemKind::Activities {
20
} else {
50
},
@@ -294,6 +298,7 @@ impl Item {
return false;
}
match self.kind {
ItemKind::Activities => availability.activities,
ItemKind::Media => availability.media,
ItemKind::Network => availability.network,
ItemKind::Audio => availability.audio,
@@ -308,6 +313,7 @@ impl Item {
#[derive(Clone, Copy, Debug, Default)]
pub struct Availability {
pub media: bool,
pub activities: bool,
pub network: bool,
pub audio: bool,
pub notifications: bool,
@@ -792,6 +798,7 @@ mod tests {
);
assert_eq!(
visible(Availability {
activities: true,
media: true,
network: true,
audio: true,