import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Wayland import Quickshell.Services.Notifications import qs import qs.common import qs.common.widgets Scope { id: root property bool visible: false property int panelWidth: 350 Timer { id: hideTimer interval: Config.options.osd.timeout onTriggered: GlobalStates.notificationPanelOpen = false } Loader { id: notificationPanelLoader active: GlobalStates.notificationPanelOpen onActiveChanged: { if (notificationPanelLoader.active) { hideTimer.restart(); } } sourceComponent: PanelWindow { id: notificationPanelRoot visible: true exclusionMode: ExclusionMode.Ignore exclusiveZone: 0 implicitWidth: root.panelWidth anchors { top: true right: true bottom: true } margins { top: Config.options.bar.height } Rectangle { anchors { fill: parent margins: Config.options.bar.cornerStyle === 1 ? (Appearance.sizes.hyprlandGapsOut) : 0 } color: Config.options.bar.showBackground ? Appearance.colors.colLayer1 : "transparent" } MouseArea { id: notificationArea anchors.fill: parent hoverEnabled: true onExited: () => { hideTimer.restart(); } onEntered: () => { hideTimer.stop(); } ColumnLayout { id: layout anchors.fill: parent anchors.margins: 4 spacing: 4 RippleButton { buttonText: "Dismiss All" buttonTextColor: Appearance.m3colors.m3onTertiaryContainer colBackground: Appearance.m3colors.m3tertiaryContainer releaseAction: NotificationService.dismissAll buttonRadius: Appearance.rounding.unsharpenmore Layout.fillWidth: true } ListView { id: notifs Layout.fillWidth: true Layout.fillHeight: true clip: true spacing: 4 model: NotificationService.notifications delegate: NotificationItem { required property Notification modelData notif: modelData textWidth: notifs.width - 8 notificationRounding: Appearance.rounding.unsharpenmore Layout.fillWidth: true } } } } } } }