Panels: per-device dashboard sets, paired by code
Playwright Tests / test-playwright (1, 2) (push) Canceled after 0s
Playwright Tests / test-playwright (2, 2) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Compose Smoke Test / test-compose (push) Canceled after 0s
Playwright Tests / merge-reports (push) Canceled after 0s
Playwright Tests / test-playwright (1, 2) (push) Canceled after 0s
Playwright Tests / test-playwright (2, 2) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Compose Smoke Test / test-compose (push) Canceled after 0s
Playwright Tests / merge-reports (push) Canceled after 0s
A panel is one screen and the ordered set of whole dashboards it shows, so a hallway tablet and a workshop tablet carry different sets without either dashboard knowing about the other. More than one and the device draws a rail to switch between them — the same rail the editor puts on screen, because the wall has it and it takes room off the canvas. A screen has no keyboard, so it pairs rather than logs in: it shows a six-character code, somebody approves it against a panel from the dashboards overview, and the credential that mints reaches that panel's published dashboards and the message endpoints its widgets speak, and nothing else. Deleting the panel revokes it. Closes the per-device view and the kiosk credential; supersedes the multi-page/multi-section UI, since a page is now a dashboard of its own. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AHpLJHozysQXjsxAyU1WHj
This commit is contained in:
@@ -15,8 +15,10 @@ import { Route as RecoverPasswordRouteImport } from './routes/recover-password'
|
||||
import { Route as LoginRouteImport } from './routes/login'
|
||||
import { Route as LayoutRouteImport } from './routes/_layout'
|
||||
import { Route as CanvasRouteImport } from './routes/_canvas'
|
||||
import { Route as PanelIndexRouteImport } from './routes/panel.index'
|
||||
import { Route as LayoutIndexRouteImport } from './routes/_layout/index'
|
||||
import { Route as ViewNameRouteImport } from './routes/view.$name'
|
||||
import { Route as PanelIdRouteImport } from './routes/panel.$id'
|
||||
import { Route as OauthAuthorizeRouteImport } from './routes/oauth.authorize'
|
||||
import { Route as LayoutSettingsRouteImport } from './routes/_layout/settings'
|
||||
import { Route as LayoutSecretsRouteImport } from './routes/_layout/secrets'
|
||||
@@ -56,6 +58,11 @@ const CanvasRoute = CanvasRouteImport.update({
|
||||
id: '/_canvas',
|
||||
getParentRoute: () => rootRouteImport,
|
||||
} as any)
|
||||
const PanelIndexRoute = PanelIndexRouteImport.update({
|
||||
id: '/panel/',
|
||||
path: '/panel/',
|
||||
getParentRoute: () => rootRouteImport,
|
||||
} as any)
|
||||
const LayoutIndexRoute = LayoutIndexRouteImport.update({
|
||||
id: '/',
|
||||
path: '/',
|
||||
@@ -66,6 +73,11 @@ const ViewNameRoute = ViewNameRouteImport.update({
|
||||
path: '/view/$name',
|
||||
getParentRoute: () => rootRouteImport,
|
||||
} as any)
|
||||
const PanelIdRoute = PanelIdRouteImport.update({
|
||||
id: '/panel/$id',
|
||||
path: '/panel/$id',
|
||||
getParentRoute: () => rootRouteImport,
|
||||
} as any)
|
||||
const OauthAuthorizeRoute = OauthAuthorizeRouteImport.update({
|
||||
id: '/oauth/authorize',
|
||||
path: '/oauth/authorize',
|
||||
@@ -129,7 +141,9 @@ export interface FileRoutesByFullPath {
|
||||
'/secrets': typeof LayoutSecretsRoute
|
||||
'/settings': typeof LayoutSettingsRoute
|
||||
'/oauth/authorize': typeof OauthAuthorizeRoute
|
||||
'/panel/$id': typeof PanelIdRoute
|
||||
'/view/$name': typeof ViewNameRoute
|
||||
'/panel/': typeof PanelIndexRoute
|
||||
'/dashboards/$name': typeof CanvasDashboardsNameRoute
|
||||
'/flows/$flowName': typeof CanvasFlowsFlowNameRoute
|
||||
'/dashboards/': typeof LayoutDashboardsIndexRoute
|
||||
@@ -147,7 +161,9 @@ export interface FileRoutesByTo {
|
||||
'/secrets': typeof LayoutSecretsRoute
|
||||
'/settings': typeof LayoutSettingsRoute
|
||||
'/oauth/authorize': typeof OauthAuthorizeRoute
|
||||
'/panel/$id': typeof PanelIdRoute
|
||||
'/view/$name': typeof ViewNameRoute
|
||||
'/panel': typeof PanelIndexRoute
|
||||
'/dashboards/$name': typeof CanvasDashboardsNameRoute
|
||||
'/flows/$flowName': typeof CanvasFlowsFlowNameRoute
|
||||
'/dashboards': typeof LayoutDashboardsIndexRoute
|
||||
@@ -167,8 +183,10 @@ export interface FileRoutesById {
|
||||
'/_layout/secrets': typeof LayoutSecretsRoute
|
||||
'/_layout/settings': typeof LayoutSettingsRoute
|
||||
'/oauth/authorize': typeof OauthAuthorizeRoute
|
||||
'/panel/$id': typeof PanelIdRoute
|
||||
'/view/$name': typeof ViewNameRoute
|
||||
'/_layout/': typeof LayoutIndexRoute
|
||||
'/panel/': typeof PanelIndexRoute
|
||||
'/_canvas/dashboards/$name': typeof CanvasDashboardsNameRoute
|
||||
'/_canvas/flows/$flowName': typeof CanvasFlowsFlowNameRoute
|
||||
'/_layout/dashboards/': typeof LayoutDashboardsIndexRoute
|
||||
@@ -188,7 +206,9 @@ export interface FileRouteTypes {
|
||||
| '/secrets'
|
||||
| '/settings'
|
||||
| '/oauth/authorize'
|
||||
| '/panel/$id'
|
||||
| '/view/$name'
|
||||
| '/panel/'
|
||||
| '/dashboards/$name'
|
||||
| '/flows/$flowName'
|
||||
| '/dashboards/'
|
||||
@@ -206,7 +226,9 @@ export interface FileRouteTypes {
|
||||
| '/secrets'
|
||||
| '/settings'
|
||||
| '/oauth/authorize'
|
||||
| '/panel/$id'
|
||||
| '/view/$name'
|
||||
| '/panel'
|
||||
| '/dashboards/$name'
|
||||
| '/flows/$flowName'
|
||||
| '/dashboards'
|
||||
@@ -225,8 +247,10 @@ export interface FileRouteTypes {
|
||||
| '/_layout/secrets'
|
||||
| '/_layout/settings'
|
||||
| '/oauth/authorize'
|
||||
| '/panel/$id'
|
||||
| '/view/$name'
|
||||
| '/_layout/'
|
||||
| '/panel/'
|
||||
| '/_canvas/dashboards/$name'
|
||||
| '/_canvas/flows/$flowName'
|
||||
| '/_layout/dashboards/'
|
||||
@@ -241,7 +265,9 @@ export interface RootRouteChildren {
|
||||
ResetPasswordRoute: typeof ResetPasswordRoute
|
||||
SignupRoute: typeof SignupRoute
|
||||
OauthAuthorizeRoute: typeof OauthAuthorizeRoute
|
||||
PanelIdRoute: typeof PanelIdRoute
|
||||
ViewNameRoute: typeof ViewNameRoute
|
||||
PanelIndexRoute: typeof PanelIndexRoute
|
||||
}
|
||||
|
||||
declare module '@tanstack/react-router' {
|
||||
@@ -288,6 +314,13 @@ declare module '@tanstack/react-router' {
|
||||
preLoaderRoute: typeof CanvasRouteImport
|
||||
parentRoute: typeof rootRouteImport
|
||||
}
|
||||
'/panel/': {
|
||||
id: '/panel/'
|
||||
path: '/panel'
|
||||
fullPath: '/panel/'
|
||||
preLoaderRoute: typeof PanelIndexRouteImport
|
||||
parentRoute: typeof rootRouteImport
|
||||
}
|
||||
'/_layout/': {
|
||||
id: '/_layout/'
|
||||
path: '/'
|
||||
@@ -302,6 +335,13 @@ declare module '@tanstack/react-router' {
|
||||
preLoaderRoute: typeof ViewNameRouteImport
|
||||
parentRoute: typeof rootRouteImport
|
||||
}
|
||||
'/panel/$id': {
|
||||
id: '/panel/$id'
|
||||
path: '/panel/$id'
|
||||
fullPath: '/panel/$id'
|
||||
preLoaderRoute: typeof PanelIdRouteImport
|
||||
parentRoute: typeof rootRouteImport
|
||||
}
|
||||
'/oauth/authorize': {
|
||||
id: '/oauth/authorize'
|
||||
path: '/oauth/authorize'
|
||||
@@ -421,7 +461,9 @@ const rootRouteChildren: RootRouteChildren = {
|
||||
ResetPasswordRoute: ResetPasswordRoute,
|
||||
SignupRoute: SignupRoute,
|
||||
OauthAuthorizeRoute: OauthAuthorizeRoute,
|
||||
PanelIdRoute: PanelIdRoute,
|
||||
ViewNameRoute: ViewNameRoute,
|
||||
PanelIndexRoute: PanelIndexRoute,
|
||||
}
|
||||
export const routeTree = rootRouteImport
|
||||
._addFileChildren(rootRouteChildren)
|
||||
|
||||
Reference in New Issue
Block a user