import QtQuick import qs.config import qs.services SettingsPage { title: "Notifications & Focus" lede: "Control interruptions without losing useful history." SettingsCard { title: "Notifications" SettingRow { label: "Do Not Disturb" detail: "Keep notifications in the center but suppress banners" controlWidth: 48 SettingsToggle { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter checked: Notifs.doNotDisturb onToggled: value => Notifs.doNotDisturb = value } } TextRow { label: "Notification history" detail: "Live notifications retained by Panama" value: `${Notifs.history.length} items` } ActionRow { label: "Clear notification history" detail: "Dismiss every item currently in the notification center" divider: false action: "Clear all" enabled: Notifs.history.length > 0 onTriggered: Notifs.dismissAll() } } SettingsCard { title: "Banner behavior" SliderRow { setting: "notificationTimeoutMs" } SliderRow { setting: "notificationTimeoutCriticalMs" zeroLabel: "Never" } SliderRow { setting: "notificationHistoryLimit" } SliderRow { setting: "maxVisibleToasts"; divider: false } } SettingsCard { title: "Application rules" subtitle: "Apps appear here after they send a notification." TextRow { visible: Notifs.applications.length === 0 label: "No applications remembered yet" detail: "Application controls will appear after the first notification arrives." divider: false } Repeater { model: Notifs.applications Column { required property var modelData readonly property var app: modelData width: parent.width SettingRow { label: app.name detail: app.id controlWidth: 48 SettingsToggle { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter checked: Notifs.appRule(app.id).enabled onToggled: value => Notifs.setAppRule(app.id, { enabled: value }) } } SettingRow { label: "Show on lock screen" detail: "Allow this app's notifications on the lock screen" controlWidth: 48 SettingsToggle { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter checked: Notifs.appRule(app.id).showOnLockScreen onToggled: value => Notifs.setAppRule(app.id, { showOnLockScreen: value }) } } SettingRow { label: "Show content on lock screen" detail: "Show message details when this app is visible there" divider: false controlWidth: 48 SettingsToggle { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter checked: Notifs.appRule(app.id).showContentOnLockScreen onToggled: value => Notifs.setAppRule(app.id, { showContentOnLockScreen: value }) } } } } } SettingsCard { title: "Focus sessions" subtitle: "A focus session binds quiet mode and Caffeine to the current workspace." SettingRow { id: durationRow label: "Default duration" detail: "Used by Super+Shift+F and Quick Settings" controlWidth: 264 Row { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter spacing: 6 Repeater { model: [25, 45, 60, 90] SettingsButton { required property int modelData text: `${modelData}m` tone: DesktopPreferences.get("focusDurationMinutes") === modelData ? "accent" : "normal" onClicked: SystemSettings.commitPreference("focusDurationMinutes", modelData) } } } } SettingRow { label: FocusSession.active ? `Active on ${FocusSession.workspaceLabel}` : "No active focus session" detail: FocusSession.active ? `${FocusSession.remainingText} remaining` : "Start one without leaving Settings" divider: false controlWidth: 120 SettingsButton { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter text: FocusSession.active ? "Show controls" : "Start focus" tone: FocusSession.active ? "normal" : "accent" onClicked: FocusSession.reveal() } } } }