feat(qt): kiosk profile release hardening

Integrate the Kiosk profile hardening round: 12 dedicated Kiosk views plus
22 shared opt-in hosts, shared navigation history with Back/Forward, Albums
as the default library tab, native paged Local Library (artists/tracks),
lightweight MyQBZ grid and detail, Ephemeral lifecycle, bounded lists and
artwork sized to the physical frame, static skeletons, 64px transport bar,
Settings touch reflow and a persistent Immersive exit.

Desktop keeps its prior behavior: every shared component defaults to the
desktop path and only opts into Kiosk behavior through explicit properties
(origin-relative ScrollMemory, viewport-bounded artwork requests).

Regression coverage: kiosk navigation and artwork Node tests added to the
runtime gate, scroll-origin fixtures for fixed and grouped rows, i18n
strings for all eight locales.

Verified by 750 release tests, six QML audits, Kiosk smokes at 800x480 and
1280x800 and a Desktop A/B with seven pixel-identical captures.

cc
This commit is contained in:
vicrodh committed 2026-09-07 08:23:11 -06:00
1 parent c1c463dc94
commit b1dba198c9
139 files changed
+9590 -4973

No files matched your search

+11 -6
View File
@@ -30,6 +30,7 @@ import "../theme"
Rectangle {
id: root
property bool kioskHost: false
color: ambientOn ? "transparent" : theme.surfaceMain
readonly property bool ambientOn: theme.ambientOn
@@ -87,7 +88,7 @@ Rectangle {
Item {
id: header
width: parent.width
height: 56
height: root.kioskHost ? 64 : 56
Rectangle {
anchors.fill: parent
@@ -108,7 +109,7 @@ Rectangle {
Text {
x: 48
y: 25 - height / 2
y: (root.kioskHost ? 32 : 25) - height / 2
width: Math.max(0, tools.x - 48 - 16)
text: root.doc.title || ""
color: theme.textPrimary
@@ -120,10 +121,11 @@ Rectangle {
Row {
id: tools
x: parent.width - width - 32
y: 25 - height / 2
y: (root.kioskHost ? 32 : 25) - height / 2
spacing: 8
QbzLineEdit {
kioskHost: root.kioskHost
searchMode: true
width: 200
placeholder: QbzSession.tr("Search…", QbzSession.trRev)
@@ -131,10 +133,12 @@ Rectangle {
onEdited: function (v) { QbzHome.discoverBrowseSearch(v) }
}
BrowseGenreButton {
btnHeight: root.kioskHost ? 44 : 34
context: "discover"
onClicked: genrePopup.toggle()
}
ViewModeToggle {
visible: !root.kioskHost
mode: root.viewMode
onSetMode: function (m) { QbzHome.discoverBrowseSetViewMode(m) }
}
@@ -144,7 +148,7 @@ Rectangle {
// --- Scrolling list ----------------------------------------------
Item {
width: parent.width
height: parent.height - 56
height: parent.height - (root.kioskHost ? 64 : 56)
Flickable {
id: flick
@@ -180,6 +184,7 @@ Rectangle {
}
AlbumCollection {
kioskHost: root.kioskHost
id: collection
visible: !QbzHome.discoverBrowseLoading
width: parent.width - 64
@@ -191,7 +196,7 @@ Rectangle {
cardGap: 24
listRowGap: 4
flick: flick
contentOffset: 8
contentOffset: root.kioskHost ? y : (8)
}
Item {
@@ -205,7 +210,7 @@ Rectangle {
QbzLoadMore {
id: loadMore
width: parent.width
buttonHeight: 32
buttonHeight: root.kioskHost ? 64 : 32
busy: QbzHome.discoverBrowseLoadingMore
skeleton: root.viewMode === "list" ? "rows" : "cards"
// AlbumCollection pitch: 200x266 + 24px gutter.