nosignal-shell/modules/nexus/common/PageBase.qml
2026-06-08 00:37:01 +10:00

72 lines
2 KiB
QML

pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import Caelestia.Config
import qs.components
import qs.components.containers
import qs.components.controls
import qs.services
import qs.modules.nexus
ColumnLayout {
id: root
required property string title
required property NexusState nState
property bool isSubPage
readonly property int cappedWidth: Math.min(800, width)
default property Item contentChild
spacing: Tokens.spacing.extraLargeIncreased
MouseArea { // Prevent clicks from reaching flickable
z: 1
implicitWidth: header.implicitWidth
implicitHeight: header.implicitHeight - Layout.bottomMargin
Layout.bottomMargin: -flickable.topMargin // Extra height to block clicks on flickable top margin
RowLayout {
id: header
spacing: Tokens.spacing.largeIncreased
Loader {
visible: active
active: root.isSubPage
asynchronous: true
sourceComponent: IconButton {
icon: "arrow_back"
font: Tokens.font.icon.medium
type: IconButton.Tonal
isRound: true
inactiveColour: Colours.tPalette.m3surfaceContainerHigh
inactiveOnColour: Colours.palette.m3onSurfaceVariant
onClicked: root.nState.closeSubPage()
}
}
StyledText {
Layout.fillWidth: true
text: root.title
font: Tokens.font.title.large
elide: Text.ElideRight
}
}
}
VerticalFadeFlickable {
id: flickable
Layout.fillWidth: true
Layout.fillHeight: true
Layout.topMargin: -topMargin
topMargin: Tokens.padding.large
bottomMargin: Tokens.padding.extraLarge
contentHeight: root.contentChild?.implicitHeight ?? 0
contentItem.children: [root.contentChild]
}
}