Route the redesign's icons through JetBrains Mono Nerd Font instead of Material Symbols, for visual consistency with the JetBrains Mono text. - services/Glyphs.qml: Material-Symbol-name -> Nerd Font (Font Awesome range) codepoint map (via String.fromCharCode), covering bar/panel icons + the dynamic Icons.getX() returns; get() falls back to a "?" glyph. - components/NsIcon.qml: reactive icon component (input `icon` = name -> mapped glyph), so dynamic icons (volume/battery/play-pause) stay live. Uses the "Mono" NF variant so glyphs center in a fixed cell. - Converted all MaterialIcon usages in NsBar + the 9 panels to NsIcon. caelestia core (nexus/launcher/osd/lock) still uses Material Symbols — no breakage (mixed), to be converted next with an expanded Glyphs map. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
171 lines
5.3 KiB
QML
171 lines
5.3 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
// NoSignal Notifications popout (off the bell). Header (count + DND + Clear),
|
|
// scrollable cards (tinted icon, title, body, time), empty state. Uses Notifs.
|
|
|
|
import QtQuick
|
|
import QtQuick.Layouts
|
|
import qs.services
|
|
import qs.utils
|
|
import qs.components
|
|
|
|
NsPanel {
|
|
id: root
|
|
|
|
implicitWidth: 380
|
|
anchorMode: "right"
|
|
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
|
|
StyledText {
|
|
text: "Notifications"
|
|
color: Theme.text
|
|
font.family: Theme.font.family
|
|
font.pixelSize: Theme.font.panelTitle
|
|
font.weight: Font.DemiBold
|
|
}
|
|
|
|
StyledText {
|
|
text: "· " + Notifs.notClosed.length + " new"
|
|
color: Theme.textFaint
|
|
font.family: Theme.font.family
|
|
font.pixelSize: Theme.font.bodySmall
|
|
}
|
|
|
|
Item {
|
|
Layout.fillWidth: true
|
|
}
|
|
|
|
Rectangle {
|
|
implicitWidth: 26
|
|
implicitHeight: 26
|
|
radius: 13
|
|
color: Notifs.dnd ? Theme.accentSoft : dndMa.containsMouse ? Theme.hover : "transparent"
|
|
|
|
NsIcon {
|
|
anchors.centerIn: parent
|
|
icon: Notifs.dnd ? "do_not_disturb_on" : "dark_mode"
|
|
color: Notifs.dnd ? Theme.accent : Theme.textMuted
|
|
}
|
|
|
|
MouseArea {
|
|
id: dndMa
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: Notifs.dnd = !Notifs.dnd
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
text: "Clear"
|
|
color: clearMa.containsMouse ? Theme.accent : Theme.textMuted
|
|
font.family: Theme.font.family
|
|
font.pixelSize: Theme.font.bodySmall
|
|
|
|
MouseArea {
|
|
id: clearMa
|
|
anchors.fill: parent
|
|
anchors.margins: -6
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: {
|
|
for (const n of Notifs.notClosed)
|
|
n.notification?.dismiss();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// cards
|
|
ColumnLayout {
|
|
Layout.fillWidth: true
|
|
spacing: 6
|
|
|
|
Repeater {
|
|
model: Notifs.notClosed
|
|
|
|
delegate: Rectangle {
|
|
id: card
|
|
|
|
required property var modelData
|
|
|
|
Layout.fillWidth: true
|
|
implicitHeight: cardRow.implicitHeight + 20
|
|
radius: Theme.radius.button
|
|
color: Theme.fillSubtle
|
|
|
|
RowLayout {
|
|
id: cardRow
|
|
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.leftMargin: 12
|
|
anchors.rightMargin: 12
|
|
spacing: 10
|
|
|
|
Rectangle {
|
|
Layout.alignment: Qt.AlignTop
|
|
implicitWidth: 30
|
|
implicitHeight: 30
|
|
radius: 0
|
|
color: Theme.accentSoft
|
|
|
|
NsIcon {
|
|
anchors.centerIn: parent
|
|
icon: Icons.getNotifIcon(card.modelData?.summary ?? "", card.modelData?.urgency ?? 1)
|
|
color: Theme.accent
|
|
}
|
|
}
|
|
|
|
ColumnLayout {
|
|
Layout.fillWidth: true
|
|
spacing: 2
|
|
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
StyledText {
|
|
Layout.fillWidth: true
|
|
text: card.modelData?.summary ?? ""
|
|
color: Theme.text
|
|
elide: Text.ElideRight
|
|
font.family: Theme.font.family
|
|
font.pixelSize: Theme.font.bodySmall
|
|
font.weight: Font.Medium
|
|
}
|
|
StyledText {
|
|
text: card.modelData?.timeStr ?? ""
|
|
color: Theme.textFaint
|
|
font.family: Theme.font.family
|
|
font.pixelSize: Theme.font.meta
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
Layout.fillWidth: true
|
|
visible: text !== ""
|
|
text: card.modelData?.body ?? ""
|
|
color: Theme.textMuted
|
|
wrapMode: Text.Wrap
|
|
maximumLineCount: 3
|
|
elide: Text.ElideRight
|
|
font.family: Theme.font.family
|
|
font.pixelSize: Theme.font.meta
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
visible: Notifs.notClosed.length === 0
|
|
Layout.topMargin: 6
|
|
text: "No notifications"
|
|
color: Theme.textMuted
|
|
font.family: Theme.font.family
|
|
font.pixelSize: Theme.font.bodySmall
|
|
}
|
|
}
|
|
}
|