Files
Ekklesia/surfaces/shell/index.html
T
ekklesiaandClaude Opus 5.5 405e509bcb
CI / verify (pull_request) Successful in 1m13s
CI / infrastructure-smoke (pull_request) Successful in 34s
CI / package-release (pull_request) Successful in 48s
CI / migration-smoke (pull_request) Successful in 2m22s
CI / image-build (pull_request) Successful in 1m8s
CI / deploy-smoke (same-origin) (pull_request) Successful in 49s
CI / package-publication (pull_request) Successful in 57s
CI / deploy-smoke (split) (pull_request) Successful in 3m38s
Fix the Stage 1 Dashboard UX defects found in assembled review
The assembled Stage 1 Dashboard was reviewed by hand on a desktop, with
the sidebar collapsed, and on an iPhone. This fixes what that review
found, and records the decisions in ADR 0064:

- Discover is its own page at /settings/discover, with Installed and
  Updates beneath it as children. There is no Browse item any more.
  /settings/discover/browse is still read, as an alias, and is respelled
  in place. Parents and children now read as a hierarchy: a guide line,
  text-only children, a disclosure chevron, and parent and current
  states that look different.
- The sidebar is navigation only. Display pairing moves from the sidebar
  and drawer to Settings -> Displays: the paired displays, a deliberate
  Add display dialog, and revocation. Nothing takes focus on arrival;
  the code field is focused only once Add display is chosen.
- Collapsed icons are centred. Nav-link layout moves from inline styles
  to the shell stylesheet, and every collapsed item is one square
  centred on the rail.
- /settings is an overview of the installation: displays paired,
  modules installed and running, and a line for each other area. It
  reads only existing endpoints.
- Phones get a sticky, safe-area-aware header holding the menu trigger
  and the page name. New pages start at the top, and focus no longer
  scrolls content under the header.
- @ekklesia/ui draws checkbox and radio indicators from tokens rather
  than accent-color, so the selected state is the strong accent in
  Light and Dark alike.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 20:37:32 -05:00

41 lines
2.3 KiB
HTML

<!doctype html>
<html lang="en" style="min-width: 0; scrollbar-gutter: stable">
<head>
<meta charset="utf-8" />
<!-- viewport-fit=cover lets the shell lay itself out around a notch, a status bar, and a home
indicator with env(safe-area-inset-*) (ADR 0064), rather than the browser letterboxing it. -->
<meta content="width=device-width, initial-scale=1, viewport-fit=cover" name="viewport" />
<!-- The API's origin (ADR 0045). The API serving this page fills it in at startup; empty means
this page's own origin, the same-origin topology. Never an inline script, so a strict
script-src needs no exception for it. -->
<meta content="" name="ekklesia-api-origin" />
<!-- Light and dark are both supported (ADR 0060). The browser paints its own canvas in the
system's scheme before any script runs, so a dark system never flashes white first. -->
<meta content="light dark" name="color-scheme" />
<!-- The pre-paint appearance script (ADR 0062): classic, same-origin, and render-blocking on
purpose, so a person who chose Light or Dark sees it from the first frame. It reads this
browser's cached copy of their choice (two words, nothing about the account) and sets the
theme attributes and the colour scheme above. Never inline. -->
<script src="/assets/ekklesia-dashboard/appearance.js"></script>
<title>Ekklesia</title>
</head>
<body
style="
margin: 0;
min-width: 0;
background: var(--ekklesia-background-page);
color: var(--ekklesia-text-primary);
"
>
<!-- The shell's root. A module UI never receives this element: it is given a container the
shell creates inside its own layout. -->
<div id="ekklesia-host"></div>
<!-- A real module script, from the same origin, with no inline script anywhere on the page:
a deployment can therefore apply a strict script-src without exceptions, and the runtime
`import()` of a published module artifact stays same-origin under it. The path is absolute
and fixed, exactly like the display host's, so it names one host-owned route rather than a
file relative to whatever URL served the page. -->
<script src="/assets/ekklesia-dashboard/app.js" type="module"></script>
</body>
</html>