Feat v0.7.0 shell contract + surface audit + rebrand

Two-slot shell topbar (home, left, center, bell, user menu) with SDK API
(setLeft/setSlot/setTitle/hide/show). All 4 primary surfaces migrated:
Settings and Team Admin to Pattern B (flat tabs), Admin to Pattern C
(category tabs + sidebar), Docs to Pattern A (default).

Backend WS events: package.changed (broadcast), auth.changed (targeted),
notification.all_read. User menu re-fetches on package/auth changes.
Bell syncs read state across tabs.

Error handling pass with .sw-inline-error CSS primitive. Empty state
guidance for Admin Workflows/Groups. Announcement global dismiss via
localStorage. Rebrand assets deployed (both b/e icon variants, wordmarks,
full icon library). Docs outline scroll-to-heading fix.

Bug fixes: ICD security assertion tightened, workflow-demo error surfacing,
signoff display names, hello-dashboard + team-admin/groups.js deleted.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-01 20:08:57 +00:00
parent 1236220302
commit 1fbd836c5c
150 changed files with 3250 additions and 533 deletions

View File

@@ -292,6 +292,25 @@
.sw-dropdown__option--disabled:hover { background: transparent; }
.sw-dropdown__empty { padding: var(--sp-3); text-align: center; color: var(--text-3); font-size: 0.85rem; }
/* ── Inline Error ─────────────────────────── */
.sw-inline-error {
display: flex; align-items: center; gap: var(--sp-3);
padding: var(--sp-3) var(--sp-4);
background: var(--bg-2); border: 1px solid var(--danger);
border-radius: var(--radius); font-size: 13px; color: var(--danger);
}
/* ── Empty State ──────────────────────────── */
.sw-empty-state {
padding: var(--sp-6) var(--sp-4);
text-align: center; color: var(--text-3); font-size: 13px;
}
.sw-empty-state__text {
margin-bottom: var(--sp-3);
}
/* ── Focus Indicators ─────────────────────── */
.sw-btn:focus-visible {

View File

@@ -156,6 +156,89 @@
gap: var(--sp-2);
}
/* ── Shell Topbar — kernel-injected two-slot model ── */
.sw-topbar--shell {
gap: var(--sp-2);
}
.sw-topbar__home {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
color: var(--text-3);
text-decoration: none;
border-radius: var(--radius);
transition: color var(--transition), background var(--transition);
flex-shrink: 0;
}
.sw-topbar__home:hover {
color: var(--text);
background: var(--bg-hover);
}
.sw-topbar__left {
display: flex;
align-items: center;
gap: var(--sp-2);
flex-shrink: 0;
}
.sw-topbar__center {
flex: 1;
display: flex;
align-items: center;
min-width: 0;
overflow-x: auto;
}
/* ── Topbar Tabs — consistent tab styling in center slot ── */
.sw-topbar__tabs {
display: flex;
align-items: center;
gap: var(--sp-1);
height: 100%;
}
.sw-topbar__tab {
display: flex;
align-items: center;
gap: var(--sp-2);
padding: var(--sp-2) var(--sp-3);
font-size: 13px;
font-weight: 500;
color: var(--text-2);
text-decoration: none;
border-radius: var(--radius-sm);
transition: color var(--transition), background var(--transition);
white-space: nowrap;
cursor: pointer;
}
.sw-topbar__tab:hover {
color: var(--text);
background: var(--bg-hover);
}
.sw-topbar__tab.active {
color: var(--text);
background: var(--bg-2);
}
@media (max-width: 768px) {
.sw-topbar__tabs {
gap: 0;
}
.sw-topbar__tab {
padding: var(--sp-2);
font-size: 12px;
}
}
/* ── User menu trigger ───────────────────── */
.sw-user-menu__trigger {