diff --git a/CHANGELOG.md b/CHANGELOG.md index 406ef37..3eb9797 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,58 @@ All notable changes to Armature are documented here. +## v0.7.0 — Shell Contract + Surface Audit + Rebrand + +**Shell Infrastructure** +- Kernel-injected two-slot topbar for all surfaces (home, left slot, center slot, bell, user menu) +- `sw.shell.topbar` SDK API: `setLeft()`, `setSlot()`, `setTitle()`, `hide()`, `show()` +- `.sw-topbar__tabs` / `.sw-topbar__tab` CSS classes for consistent tab styling +- Shell topbar auto-mounts on extension surfaces via `#shell-topbar` div + +**Backend WS Events** +- `package.changed` event broadcast on install/uninstall/enable/disable/update +- `auth.changed` event targeted to affected user on team/group membership changes +- `notification.all_read` event split from `notification.read` for cleaner badge sync +- `Hub.Broadcast()` method for untargeted all-client events + +**User Menu + Bell Reactivity** +- User menu re-fetches surface list on `package.changed` and `auth.changed` events +- Notification bell syncs on `notification.read` and `notification.all_read` across tabs + +**Surface Migrations** +- Settings: Pattern B (flat tabs in topbar, no sidebar, full-width content) +- Admin: Pattern C (category tabs in topbar, surface-owned sidebar below) +- Team Admin: Pattern B (flat tabs, no sidebar, Groups tab removed) +- Docs: Pattern A (shell topbar auto-renders, removed explicit Topbar import) +- All 4 surfaces now have notification bell and user menu via shell topbar + +**Error Handling + Empty States** +- `.sw-inline-error` CSS primitive for inline error + retry pattern +- `.sw-empty-state` CSS primitive for guided empty states +- Admin Workflows, Packages, Groups: inline error on list fetch failure +- Admin Workflows, Groups: descriptive empty state guidance + +**Announcement Global Dismiss** +- Announcement dismiss state persisted to localStorage keyed by content hash +- Dismissed once on any surface, dismissed everywhere + +**Rebrand Assets** +- `favicon-light.svg` renamed to `wordmark.svg` (was a 520x80 wordmark, not an icon) +- New `favicon-light.svg`: actual square light-mode icon +- New `wordmark-dark.svg`, `wordmark-light.svg` for dark/light backgrounds +- New `favicon-light-32.png`, `favicon-light-256.png` raster icons +- Full icon library deployed to `src/icons/` (both b/e variants, animated SVGs) +- `manifest.json` description updated to "Self-hosted extension platform" +- Light-mode icon entries added to PWA manifest + +**Bug Fixes** +- Docs: "On this page" outline links now scroll to headings (IDs were missing from rendered HTML) +- ICD security tier: tightened path traversal assertion (400/422, not 409), added `finally` cleanup +- Workflow demo: replaced silent catch with inline error + retry +- Team Admin: signoff panel shows display names instead of raw UUIDs +- Deleted `packages/hello-dashboard/` (dead package) +- Deleted `team-admin/groups.js` (37-line dead-end, no CRUD) + ## v0.6.18 — CI Bundle Wiring Wire `BUNDLED_PACKAGES` env var into the Gitea CI pipeline so each diff --git a/ROADMAP-UI.md b/ROADMAP-UI.md deleted file mode 100644 index 9c93ff8..0000000 --- a/ROADMAP-UI.md +++ /dev/null @@ -1,151 +0,0 @@ -# Armature — v0.6.x UI Hardening Roadmap - -> **Goal**: Fix all viewport scaling, banner integration, and styling inconsistencies -> so Claude Code can run a meaningful automated usability survey against a -> stable, uniform UI. - ---- - -## Problem Inventory - -### P1 — Viewport & Scaling (blocks everything) - -| # | Issue | Where | Impact | -|---|-------|-------|--------| -| 1 | **Dual layout systems** — `base.html` template has its own banner→surface→footer column; `app-shell.js` Preact shell has a separate `sw-shell` → `sw-shell__body` → `sw-shell__surface` column. They never coordinate. | `server/pages/templates/base.html` ↔ `src/js/sw/shell/app-shell.js` | Every surface inherits an ambiguous viewport ancestor. | -| 2 | **Transform-based scaling is broken** — `transform: scale()` on `#surfaceInner` doesn't reflow layout. Breaks `getBoundingClientRect` (menu.js already carries a scale-correction hack at line 20), scroll containment, pointer events, and the inverse-width/height hack (`100/s%`) doesn't account for banners consuming viewport space. | `base.html:56-67`, `appearance.js:41-53`, `menu.js:20-33` | Menus, tooltips, dropdowns all mis-positioned at any non-100% scale. Click targets wrong. | -| 3 | **Banner height desync** — `base.html` hardcodes `--banner-h: 28px` and renders banners in-flow. `app-shell.js` ShellBanner measures `offsetHeight` into `--banner-top-height` / `--banner-bottom-height` and uses `position: fixed` + body padding. Two independent banner systems. | `base.html:31,72-75,103-107` ↔ `app-shell.js:25-42`, `sw-shell.css:22-37,63-69` | With banners enabled, content overflows by the banner height or gets double-inset depending on which code path is active. | -| 4 | **`100vh` on mobile** — `.sw-shell`, `.chat-app`, `.chat-loading`, `.login-shell` use `100vh` which doesn't subtract mobile browser chrome (address bar, toolbar). | `sw-shell.css:9`, `chat/css/main.css:15,25`, `sw-login.css:7` | Content overflows on iOS Safari, Android Chrome. | -| 5 | **Chat uses `100vh` not `100%`** — `.chat-app { height: 100vh }` ignores parent container (which already excludes banners/footer). Notes correctly uses `height: 100%`. Every extension surface that copies chat's pattern will inherit the bug. | `packages/chat/css/main.css:15` | Chat surface overflows behind banners. | - -### P2 — CSS Architecture - -| # | Issue | Where | Impact | -|---|-------|-------|--------| -| 6 | **Class name collisions** — `.settings-section` defined in both `modals.css:41-43` and `surfaces.css:75-83` with different padding, margin, and border-bottom rules. `.sw-dropdown` in `primitives.css:443` (styled `