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

@@ -100,9 +100,10 @@ QbzContextMenu {
Item {
visible: (menuRoot.folders || []).length >= 8
width: menuRoot.rowW
height: visible ? 32 : 0
height: visible ? (menuRoot.kioskHost ? 44 : 32) : 0
QbzLineEdit {
kioskHost: menuRoot.kioskHost
anchors.verticalCenter: parent.verticalCenter
// The plain arm is a FIXED width: 240 — a modal/menu must set it.
width: menuRoot.rowW
@@ -112,7 +113,7 @@ QbzContextMenu {
// is 1). The reference field is 28 inside a 32 px Rectangle
// (`:828-830`); the sidebar row menu sets its own height the same
// way (shell/SidebarRowMenu.qml:305).
height: 28
height: menuRoot.kioskHost ? 44 : 28
searchMode: true
elevated: false
placeholder: QbzSession.tr("Search folders", QbzSession.trRev)
@@ -125,6 +126,7 @@ QbzContextMenu {
// current folder's row is excluded, which makes the folder arm's selected
// state dead by construction. Do not "fix" it.
PmMenuRow {
kioskHost: menuRoot.kioskHost
width: menuRoot.rowW
label: QbzSession.tr("No folder", QbzSession.trRev)
selected: menuRoot.currentFolderId === ""
@@ -152,6 +154,7 @@ QbzContextMenu {
model: menuRoot.filteredFolders
delegate: PmMenuRow {
kioskHost: menuRoot.kioskHost
required property var modelData
width: menuRoot.rowW
// The current-folder exclusion, in the markup (D4).