From 95357ffbb9b2bef510bc9da2c8b2433dd14c30c1 Mon Sep 17 00:00:00 2001 From: master <> Date: Fri, 27 Mar 2026 12:28:48 +0200 Subject: [PATCH] Web UI: feature updates across all modules Broad UI improvements spanning auth, branding, notifications, agents, analytics, approvals, audit-log, bundles, configuration, console-admin, dashboard, deployments, doctor, environments, evidence, feed-mirror, graph, integration-hub, issuer-trust, lineage, notify, offline-kit, policy, promotions, quota, registry, release-orchestrator, releases, sbom, scans, secret-detection, security, settings, setup-wizard, system-health, topology, triage, trust-admin, unknowns, vex-hub, vulnerabilities, and watchlist features. Adds new shared components (page-action-outlet, stella-action-card, stella-form-field), scripts feature module, audit-trust component, e2e test helpers, and release page e2e specs. Updates auth session model, branding service, color tokens, form styles, and i18n translations. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Web/StellaOps.Web/AGENTS.md | 73 ++ .../e2e/helpers/seed-releases.ts | 87 ++ .../e2e/workflows/release-pages.e2e.spec.ts | 1155 +++++++++++++++++ .../StellaOps.Web/src/app/app.component.html | 8 + .../StellaOps.Web/src/app/app.component.scss | 35 + .../StellaOps.Web/src/app/app.component.ts | 7 +- .../src/app/core/api/scripts.client.ts | 567 ++++++++ .../src/app/core/api/scripts.models.ts | 175 +++ .../app/core/auth/auth-http.interceptor.ts | 68 +- .../src/app/core/auth/auth-session.model.ts | 3 +- .../app/core/auth/auth-session.store.spec.ts | 3 +- .../src/app/core/auth/auth-session.store.ts | 6 +- .../app/core/auth/authority-auth.service.ts | 19 +- .../src/app/core/branding/branding.service.ts | 92 +- .../admin-notifications.component.ts | 1 + .../channel-management.component.ts | 31 - .../components/delivery-history.component.ts | 13 - .../components/escalation-config.component.ts | 4 - .../notification-dashboard.component.ts | 5 +- .../notification-rule-editor.component.ts | 21 - .../notification-rule-list.component.ts | 8 - .../operator-override-management.component.ts | 4 - .../components/operator-override.component.ts | 6 - .../quiet-hours-config.component.ts | 4 - .../components/rule-simulator.component.ts | 28 - .../components/template-editor.component.ts | 24 - .../components/throttle-config.component.ts | 4 - .../agents/agent-detail-page.component.ts | 1 + .../agent-action-modal.component.ts | 10 - .../analytics/sbom-lake-page.component.ts | 13 - .../approval-detail-page.component.ts | 3 +- .../audit-log/audit-authority.component.ts | 1 + .../features/audit-log/audit-log.routes.ts | 57 +- .../audit-log/audit-trust.component.ts | 62 + .../features/auth/auth-callback.component.ts | 30 +- .../binary-index-ops.component.ts | 1 + .../bundles/bundle-builder.component.ts | 13 - .../bundles/bundle-detail.component.ts | 1 + .../bundle-version-detail.component.ts | 1 + .../configuration-pane.component.ts | 14 - .../integration-detail.component.ts | 1 + .../audit/audit-log.component.ts | 70 +- .../branding/branding-editor.component.ts | 168 ++- .../clients/clients-list.component.ts | 149 ++- .../console-admin-layout.component.ts | 4 +- .../roles/roles-list.component.ts | 409 ++++-- .../tenants/tenants-list.component.ts | 175 ++- .../tokens/tokens-list.component.ts | 92 +- .../users/users-list.component.ts | 170 ++- .../deadletter-dashboard.component.ts | 8 - .../deadletter/deadletter-queue.component.ts | 13 - .../deployment-detail-page.component.ts | 1 + .../remediation-panel.component.ts | 34 + .../doctor/doctor-dashboard.component.scss | 173 ++- .../doctor/doctor-dashboard.component.ts | 174 ++- .../features/doctor/models/doctor.models.ts | 1 + .../environment-detail-page.component.ts | 1 + .../export-center.component.ts | 1 + .../evidence-center-page.component.ts | 3 - .../evidence-packet-page.component.ts | 1 + .../exception-wizard.component.scss | 26 +- .../feed-mirror-dashboard.component.ts | 4 + .../graph/graph-side-panels.component.ts | 1 + .../integration-activity.component.ts | 5 - .../integration-detail.component.ts | 1 + .../integration-shell.component.ts | 1 + .../integration-wizard.component.scss | 21 - .../components/issuer-editor.component.ts | 7 - .../components/key-rotation.component.ts | 7 - .../lineage-mobile-compare.component.ts | 1 + .../lineage-vex-diff.component.ts | 1 + .../notify/notify-panel.component.html | 2 + .../features/notify/notify-panel.component.ts | 3 +- .../components/jwks-management.component.ts | 7 - .../offline-kit/offline-kit.component.ts | 1 + .../dlq-replays-page.component.ts | 2 +- .../ops/feeds-offline-shell.component.ts | 1 + .../platform-feeds-airgap-page.component.ts | 1 + ...olicy-decisioning-audit-shell.component.ts | 1 + .../policy-decisioning-vex-shell.component.ts | 1 + .../policy-pack-shell.component.ts | 1 + .../policy-governance.component.ts | 1 + .../conflict-detection.component.ts | 16 - .../effective-policy-viewer.component.ts | 17 - .../policy-audit-log.component.ts | 16 - .../policy-lint.component.ts | 6 - .../policy-simulation.component.ts | 1 + .../shadow-mode-dashboard.component.ts | 16 - .../simulation-dashboard.component.ts | 1 + .../simulation-history.component.ts | 16 - .../policy/policy-studio.component.ts | 22 +- .../promotions/create-promotion.component.ts | 14 - .../promotions/promotion-detail.component.ts | 1 + .../promotions/promotions-list.component.ts | 18 - .../proof/score-comparison-view.component.ts | 1 + .../quota-forecast.component.ts | 13 - .../tenant-quota-table.component.ts | 12 - .../throttle-context.component.ts | 13 - .../registry-admin.component.ts | 1 + .../approval-detail.component.ts | 20 - .../approval-queue.component.ts | 158 +-- .../promotion-request.component.ts | 25 - .../deployment-monitor.component.ts | 20 - .../environment-settings.component.ts | 6 - .../freeze-window-editor.component.ts | 15 - .../target-list/target-list.component.ts | 20 - .../environment-detail.component.ts | 1 + .../environment-list.component.ts | 6 - .../evidence-detail.component.ts | 1 + .../evidence-list/evidence-list.component.ts | 6 - .../create-deployment.component.ts | 9 - .../create-release.component.ts | 29 - .../create-version.component.ts | 9 - .../workflow-editor.component.ts | 22 - .../workflow-list/workflow-list.component.ts | 23 - .../releases/hotfix-detail-page.component.ts | 2 +- .../releases/release-detail-page.component.ts | 1 + .../releases/releases-list-page.component.ts | 11 - .../releases-unified-page.component.ts | 6 +- .../sbom-diff-view.component.ts | 10 - .../source-wizard/source-wizard.component.ts | 13 - .../diff-viewer/diff-viewer.component.ts | 1 + .../features/scans/entropy-panel.component.ts | 1 + .../scripts/script-detail.component.ts | 613 +++++++++ .../features/scripts/script-diff.component.ts | 143 ++ .../scripts/scripts-list.component.ts | 300 +++++ .../app/features/scripts/scripts.routes.ts | 32 + .../alert-destination-config.component.ts | 5 - .../exception-form.component.ts | 6 - .../finding-detail-drawer.component.ts | 7 - .../secret-detection-settings.component.ts | 1 + .../finding-detail-page.component.ts | 1 + .../security-disposition-page.component.ts | 1 + .../security-findings-page.component.ts | 1 + .../security-reports-page.component.ts | 4 + .../security-sbom-explorer-page.component.ts | 1 + .../security/vex-hub-page.component.ts | 4 - .../admin/admin-settings-page.component.ts | 160 ++- .../integration-detail-page.component.ts | 1 + .../notifications-settings-page.component.ts | 2 +- .../system/system-settings-page.component.ts | 1 + .../usage/usage-settings-page.component.ts | 4 +- .../user-preferences-page.component.ts | 58 +- .../components/config-missing.component.ts | 13 - .../components/setup-wizard.component.ts | 62 +- .../components/step-content.component.ts | 39 +- .../system-health-page.component.ts | 1 + ...ology-environment-detail-page.component.ts | 1 + .../topology/topology-shell.component.ts | 1 + .../bulk-action-modal.component.ts | 8 - .../tabbed-evidence-panel.component.ts | 1 + .../triage-canvas/triage-canvas.component.ts | 1 + .../triage-audit-bundle-new.component.html | 278 ++-- .../triage-audit-bundle-new.component.scss | 472 +++++-- .../triage-audit-bundle-new.component.ts | 19 + .../trust-admin/airgap-audit.component.ts | 21 - .../certificate-inventory.component.ts | 16 +- .../trust-admin/incident-audit.component.ts | 21 - .../issuer-trust-list.component.ts | 16 +- .../key-rotation-wizard.component.ts | 23 - .../signing-key-dashboard.component.ts | 16 +- .../trust-admin/trust-admin.component.ts | 116 +- .../trust-admin/trust-admin.routes.ts | 90 +- .../trust-admin/trust-audit-log.component.ts | 21 - .../unknowns/unknowns-queue.component.ts | 1 + .../vex-hub/ai-justify-panel.component.ts | 34 - .../vex-conflict-resolution.component.ts | 26 - .../vex-hub/vex-create-workflow.component.ts | 34 - .../app/features/vex-hub/vex-hub.component.ts | 1 + .../vex-hub/vex-statement-search.component.ts | 29 - .../vuln-triage-dashboard.component.ts | 14 - .../watchlist/watchlist-page.component.ts | 2 +- .../layout/app-shell/app-shell.component.ts | 80 +- .../sidebar-nav-group.component.ts | 2 +- .../app-sidebar/sidebar-nav-item.component.ts | 103 +- .../app-sidebar/sidebar-preference.service.ts | 10 + .../layout/app-topbar/app-topbar.component.ts | 49 +- .../src/app/routes/operations.routes.ts | 19 +- .../src/app/routes/ops.routes.ts | 7 + .../src/app/routes/setup.routes.ts | 4 +- .../ai/ai-assist-panel.component.ts | 2 +- .../shared/components/ai/ai-chip.component.ts | 6 +- .../components/ai/ai-summary.component.ts | 4 +- .../ai/ask-stella-button.component.ts | 6 +- .../ai/ask-stella-panel.component.ts | 29 +- .../inline-edit/inline-edit.component.ts | 5 - .../page-action-outlet.component.ts | 46 + .../script-editor/script-context.ts | 22 + .../script-editor/script-editor.component.ts | 51 +- .../search-input/search-input.component.ts | 16 - .../stella-action-card.component.ts | 186 +++ .../stella-form-field.component.ts | 63 + .../stella-metric-card.component.ts | 2 +- .../stella-quick-links.component.ts | 2 +- .../theme-toggle/theme-toggle.component.ts | 2 +- .../StellaOps.Web/src/i18n/en-US.common.json | 3 + src/Web/StellaOps.Web/src/styles/_forms.scss | 26 +- .../src/styles/tokens/_colors.scss | 2 +- src/Web/StellaOps.Web/tests/e2e/auth.spec.ts | 67 +- 199 files changed, 6315 insertions(+), 2222 deletions(-) create mode 100644 src/Web/StellaOps.Web/e2e/helpers/seed-releases.ts create mode 100644 src/Web/StellaOps.Web/e2e/workflows/release-pages.e2e.spec.ts create mode 100644 src/Web/StellaOps.Web/src/app/core/api/scripts.client.ts create mode 100644 src/Web/StellaOps.Web/src/app/core/api/scripts.models.ts create mode 100644 src/Web/StellaOps.Web/src/app/features/audit-log/audit-trust.component.ts create mode 100644 src/Web/StellaOps.Web/src/app/features/scripts/script-detail.component.ts create mode 100644 src/Web/StellaOps.Web/src/app/features/scripts/script-diff.component.ts create mode 100644 src/Web/StellaOps.Web/src/app/features/scripts/scripts-list.component.ts create mode 100644 src/Web/StellaOps.Web/src/app/features/scripts/scripts.routes.ts create mode 100644 src/Web/StellaOps.Web/src/app/shared/components/page-action-outlet/page-action-outlet.component.ts create mode 100644 src/Web/StellaOps.Web/src/app/shared/components/stella-action-card/stella-action-card.component.ts create mode 100644 src/Web/StellaOps.Web/src/app/shared/components/stella-form-field/stella-form-field.component.ts diff --git a/src/Web/StellaOps.Web/AGENTS.md b/src/Web/StellaOps.Web/AGENTS.md index 8014ad144..4bb782162 100644 --- a/src/Web/StellaOps.Web/AGENTS.md +++ b/src/Web/StellaOps.Web/AGENTS.md @@ -112,6 +112,61 @@ Do NOT create custom `.stat-card`, `.summary-card`, `.kpi-card`, or `.posture-ca - If `route` is set: card is clickable with hover lift + arrow - If no `route`: static display, no hover effect +## Horizontal Scroll Card Lane Pattern (Reusable) + +A reusable pattern for displaying actionable items as horizontally scrollable cards with +gradient fades and scroll arrows. Used in the dashboard (environment cards, pending actions) +and the approvals inbox (approval cards with inline actions). + +### Architecture + +Three layers: +1. **Wrapper** (`*-lane-wrapper`) — relative-positioned container with `::before`/`::after` gradient pseudo-elements +2. **Scroll container** (`*-lane`) — flex row with `overflow-x: auto`, hidden scrollbar, `scroll-behavior: smooth` +3. **Cards** — fixed-width (`280px`) flex items with `flex-shrink: 0` + +### Scroll arrow signals (TypeScript) + +```typescript +@ViewChild('myScroll') myScrollRef?: ElementRef; +readonly showLeftArrow = signal(false); +readonly showRightArrow = signal(false); + +onScroll(): void { this.updateArrows(); } +scrollCards(direction: 'left' | 'right'): void { + this.myScrollRef?.nativeElement?.scrollBy({ left: direction === 'left' ? -300 : 300, behavior: 'smooth' }); +} +private updateArrows(): void { + const el = this.myScrollRef?.nativeElement; + if (!el) { this.showLeftArrow.set(false); this.showRightArrow.set(false); return; } + this.showLeftArrow.set(el.scrollLeft > 1); + this.showRightArrow.set(el.scrollWidth - el.scrollLeft - el.clientWidth > 1); +} +``` + +### Gradient fades (CSS) + +```scss +.my-wrapper.can-scroll-left::before { + content: ''; position: absolute; top: 0; left: 0; bottom: 0; width: 56px; + background: linear-gradient(to right, var(--color-surface-primary) 0%, transparent 100%); + pointer-events: none; z-index: 1; +} +.my-wrapper.can-scroll-right::after { /* mirror for right side */ } +``` + +### Confirmation dialogs for card actions + +- **Production approve**: `` with `variant="warning"` and `ViewChild` ref, call `.open()` programmatically +- **Reject with reason**: Custom inline dialog overlay with `