import Quickshell import Quickshell.Wayland import Quickshell.Services.Notifications import QtQuick import QtQuick.Layouts import "config.js" as Config Scope { id: root NotificationServer { id: server actionsSupported: true bodySupported: true imageSupported: true onNotification: n => { n.tracked = true } } PanelWindow { anchors { top: true; right: true } margins { top: 56; right: 12 } implicitWidth: 380 implicitHeight: Math.max(1, column.implicitHeight) color: "transparent" exclusionMode: ExclusionMode.Ignore ColumnLayout { id: column width: parent.width spacing: 10 Repeater { model: server.trackedNotifications delegate: Rectangle { id: card required property var modelData Timer { running: card.modelData.urgency !== NotificationUrgency.Critical interval: Config.notifications.timeout repeat: false onTriggered: card.modelData.dismiss() } Layout.fillWidth: true implicitHeight: layout.implicitHeight + 20 radius: 12 color: Config.colors.bgDark Rectangle { anchors.left: parent.left anchors.top: parent.top anchors.bottom: parent.bottom width: 4 radius: 12 color: card.modelData.urgency === NotificationUrgency.Critical ? Config.colors.red : Config.colors.purple } RowLayout { id: layout anchors.fill: parent anchors.margins: 10 anchors.leftMargin: 18 spacing: 10 Image { Layout.preferredWidth: 36 Layout.preferredHeight: 36 Layout.alignment: Qt.AlignTop fillMode: Image.PreserveAspectFit visible: source.toString() !== "" source: card.modelData.image || card.modelData.appIcon || "" } ColumnLayout { Layout.fillWidth: true spacing: 2 Text { Layout.fillWidth: true text: card.modelData.summary color: Config.colors.cyan font.family: Config.bar.fontFamily font.pixelSize: Config.bar.fontSize font.bold: true elide: Text.ElideRight } Text { Layout.fillWidth: true visible: text !== "" text: card.modelData.body color: Config.colors.fg font.family: Config.bar.fontFamily font.pixelSize: Config.bar.fontSize - 1 wrapMode: Text.WordWrap } } } MouseArea { anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: card.modelData.dismiss() } } } } } }