Kiosk mode and wall screens
A single-role floor login locks to its queue, and a role's portals lay its pinned views out as live wall screens.
The situation
A tablet on the floor should show one queue and nothing else. A screen on the wall should show three queues at once, readable from across the room, and stay current without anyone touching it.
The recipe
roles: [{ role: 'packing', properties: { kiosk: true }, portals: [{ key: 'floor', label: 'Floor screen', counts: [ { label: 'Waiting', url: '/escalations/available?role=packing', blurb: 'Unclaimed cartons' }, ], rows: [ [{ label: 'Packing board', url: '/escalations/available?role=packing&view=rich' }], [ { label: 'North', url: '/escalations/available?role=packing&facets=%7B%22facility%22%3A%22north%22%7D&view=table&layout=compact', badge: true }, { label: 'South', url: '/escalations/available?role=packing&facets=%7B%22facility%22%3A%22south%22%7D&view=table&layout=compact', badge: true }, ], ], }],}],A member of exactly that one role gets the locked viewport: no left nav, held to the list, the detail page, the role’s portals and the scan screens. A kiosk role lands on its first portal as home. Each portal renders at /portal/packing/floor as a grid of live list panels, up to 4 rows of up to 6 cells.
The guarantee
Kiosk applies only to a single-role member. A user holding more than one role, or an admin-type grant, always gets full chrome. Portal panels read through the same role-scoped endpoints as the list page, so each viewer sees exactly what their read scope returns, and a queue outside it renders empty. See Dashboard.
Related patterns
The physical world
Station login, badge at submit
A shared device signs in read-only; anyone edits the form, and the badge is asked for once, at the submit that changes the record.
Forms and configuration
Pins are the bookmark set
A role ships the exact queries its members need as pinned views with live counts, in their nav from the first login.
Forms and configuration
Link variables
One pinned link serves every station: a role declares a variable, each device binds its value, and the link resolves at render time.
