diff --git a/CHANGELOG.md b/CHANGELOG.md index ec1da65..9e13aff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,47 @@ CalVer image tags (`stable-YYYY.MM.N`, `dev-YYYY.MM.N`) are produced for every C ## [Unreleased] +## [0.54.10] — 2026-05-14 + +### Changed +- Web UI design system unified: single stylesheet (`style-custom.css`), + canonical primitives for buttons, form controls, page headers, tables, + empty states, toasts, and stat cards. Top-nav Admin entry now shares + styling 1:1 with sibling links (font, color, padding, hover, active + state) — previously a ` - + + {% endif %} @@ -208,7 +170,7 @@ Loading…
Loading members…
- + @@ -219,7 +181,7 @@ {% if not target_group.is_google_managed %}
- +
{% endif %} @@ -250,13 +212,13 @@
- - + +
-
+ - {% include "_version_badge.html" %} - - +{% endblock %} diff --git a/app/web/templates/admin_tokens.html b/app/web/templates/admin_tokens.html index 8e9a9a2..6af8284 100644 --- a/app/web/templates/admin_tokens.html +++ b/app/web/templates/admin_tokens.html @@ -554,35 +554,6 @@ justify-content: flex-end; margin-top: 24px; } - .modal-btn { - padding: 10px 18px; - border-radius: 8px; - font-size: 13.5px; - font-weight: 500; - font-family: var(--font-primary, inherit); - cursor: pointer; - transition: all 0.15s ease; - border: 1px solid var(--border, #e5e7eb); - background: var(--surface, #fff); - color: var(--text-primary, #1A253C); - } - .modal-btn:hover { - border-color: #cbd5e1; - background: var(--background, #F5F7FA); - } - .modal-btn.danger { - background: #dc2626; - color: #fff; - border-color: #dc2626; - } - .modal-btn.danger:hover { - background: #b91c1c; - border-color: #b91c1c; - } - .modal-btn:focus-visible { - outline: 2px solid #0073D1; - outline-offset: 2px; - } /* ── Toast ─────────────────────────────────────────────────────────────── */ .toast-stack { @@ -768,8 +739,8 @@

diff --git a/app/web/templates/admin_usage.html b/app/web/templates/admin_usage.html index 6697c5f..4287bad 100644 --- a/app/web/templates/admin_usage.html +++ b/app/web/templates/admin_usage.html @@ -6,7 +6,10 @@
-

Telemetry

+ {% set page_hero_eyebrow = "Activity Center" %} + {% set page_hero_title = "Telemetry" %} + {% set page_hero_subtitle = "Claude Code tool / skill / agent / slash-command invocations across users." %} + {% include "_page_hero.html" %}

Tool and skill invocations from Claude Code. Also available locally for analysis. For server-side admin / API audit events, see Audit log.

Loading…
@@ -109,7 +112,6 @@ .obs-topbar { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; padding: 12px 0 20px; border-bottom: 1px solid var(--border, #e5e7eb); margin-bottom: 16px; } .obs-topbar-left { flex: 1; min-width: 0; } -.obs-title { margin: 0 0 4px 0; font-size: 22px; font-weight: 600; color: var(--text-primary, #111827); } .obs-subtitle { margin: 0 0 10px; color: var(--text-secondary, #6b7280); font-size: 13px; max-width: 720px; } .obs-subtitle a { color: #2563eb; text-decoration: none; border-bottom: 1px dashed currentColor; } .obs-subtitle a:hover { border-bottom-style: solid; } diff --git a/app/web/templates/admin_user_detail.html b/app/web/templates/admin_user_detail.html index ee043c7..f70bb6b 100644 --- a/app/web/templates/admin_user_detail.html +++ b/app/web/templates/admin_user_detail.html @@ -17,12 +17,6 @@ } .ud-back:hover { color: var(--text-primary, #111827); } .ud-title-block { flex: 1; } - .ud-title { font-size: 22px; font-weight: 600; margin: 0; } - .ud-subtitle { - font-size: 13px; color: var(--text-secondary, #6b7280); - font-family: var(--font-mono, ui-monospace, monospace); - margin-top: 2px; - } .ud-status-pill { display: inline-block; padding: 3px 10px; border-radius: 999px; font-size: 11px; font-weight: 600; @@ -218,12 +212,10 @@
← Back to users
-

- {{ target_user.name or target_user.email }} - -

-
{{ target_user.email }} · id {{ target_user.id[:8] }}…
+ {% set page_hero_eyebrow = "Users & Access" %} + {% set page_hero_title = "User detail" %} + {% set page_hero_subtitle = "Account, group memberships, sessions, and activity for one user." %} + {% include "_page_hero.html" %}
diff --git a/app/web/templates/admin_users.html b/app/web/templates/admin_users.html index 8de1e60..be8bb88 100644 --- a/app/web/templates/admin_users.html +++ b/app/web/templates/admin_users.html @@ -10,39 +10,7 @@ display: flex; justify-content: space-between; align-items: center; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; } - .users-title { margin: 0; font-size: 22px; font-weight: 600; } - .users-search { - flex: 1; max-width: 360px; - padding: 8px 12px 8px 36px; - border: 1px solid var(--border, #e5e7eb); - border-radius: 8px; - font-size: 13px; - background: var(--surface, #fff) url("data:image/svg+xml;utf8,") no-repeat 12px center; - } - .users-search:focus { outline: 2px solid var(--primary, #6366f1); outline-offset: -1px; } - .users-table-wrap { - background: var(--surface, #fff); - border: 1px solid var(--border, #e5e7eb); - border-radius: 12px; - overflow-x: auto; - } - .users-table { width: 100%; border-collapse: collapse; font-size: 13px; } - .users-table thead th { - text-align: left; padding: 12px 16px; - background: var(--border-light, #f9fafb); - border-bottom: 1px solid var(--border, #e5e7eb); - font-weight: 600; color: var(--text-secondary, #6b7280); - font-size: 11px; text-transform: uppercase; letter-spacing: 0.4px; - } - .users-table tbody td { - padding: 12px 16px; - border-bottom: 1px solid var(--border-light, #f3f4f6); - vertical-align: middle; - } - .users-table tbody tr:last-child td { border-bottom: none; } - .users-table tbody tr.is-deactivated { opacity: 0.55; } - .users-table tbody tr:hover { background: var(--border-light, #fafafa); } /* Whole user-info cell is the click target for the detail page — anchor wraps avatar + name + email so the entire block lights up @@ -161,16 +129,6 @@ } .modal-card input:focus, .modal-card select:focus { outline: 2px solid var(--primary, #6366f1); outline-offset: -1px; } .modal-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 20px; } - .modal-btn { - padding: 8px 16px; border-radius: 8px; font-size: 13px; font-weight: 500; - border: 1px solid var(--border, #e5e7eb); background: var(--surface, #fff); - cursor: pointer; transition: all 0.15s; - } - .modal-btn:hover { background: var(--border-light, #f9fafb); } - .modal-btn.primary { background: var(--primary, #6366f1); color: #fff; border-color: var(--primary, #6366f1); } - .modal-btn.primary:hover { filter: brightness(1.05); } - .modal-btn.danger { background: #dc2626; color: #fff; border-color: #dc2626; } - .modal-btn.danger:hover { filter: brightness(1.05); } .token-reveal { margin: 12px 0; @@ -208,13 +166,16 @@
-

Users

- - + {% set page_hero_eyebrow = "Users & Access" %} + {% set page_hero_title = "Users" %} + {% set page_hero_subtitle = "Manage analyst accounts and group membership." %} + {% include "_page_hero.html" %} + +
-
-
+
+
@@ -254,8 +215,8 @@ Send invitation link (generates setup token, emails it if transport is configured) @@ -268,8 +229,8 @@ @@ -285,7 +246,7 @@ @@ -301,7 +262,7 @@ @@ -312,8 +273,8 @@

Are you sure?

diff --git a/app/web/templates/admin_welcome.html b/app/web/templates/admin_welcome.html index 2657469..eb13f6f 100644 --- a/app/web/templates/admin_welcome.html +++ b/app/web/templates/admin_welcome.html @@ -27,8 +27,6 @@ display: flex; justify-content: space-between; align-items: center; gap: 16px; margin-bottom: 16px; flex-wrap: wrap; } - .welcome-title { margin: 0; font-size: 22px; font-weight: 600; } - .welcome-sub { color: var(--text-secondary, #6b7280); font-size: 13px; margin-top: 4px; margin-bottom: 0; } .origin-chip { display: inline-block; @@ -188,12 +186,6 @@ .modal-card h3 { margin: 0 0 6px; font-size: 17px; font-weight: 600; } .modal-card p.sub { margin: 0 0 18px; font-size: 13px; color: var(--text-secondary, #6b7280); } .modal-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 20px; } - .modal-btn { - padding: 8px 16px; border-radius: 8px; font-size: 13px; font-weight: 500; - border: 1px solid var(--border, #e5e7eb); background: var(--surface, #fff); - cursor: pointer; - } - .modal-btn.danger { background: #dc2626; color: #fff; border-color: #dc2626; } /* Toast stack */ .toast-stack { @@ -214,8 +206,10 @@
-

Init Prompt

-

The bash setup script shown on /setup and copied by the dashboard CTA.

+ {% set page_hero_eyebrow = "Agent Experience" %} + {% set page_hero_title = "Init Prompt" %} + {% set page_hero_subtitle = "Welcome shown to analysts at agnes init. Overrides the OSS default." %} + {% include "_page_hero.html" %}
{% if is_override %} @@ -290,8 +284,8 @@

Reset to default?

Your override will be permanently removed. The auto-generated bash bootstrap script will be shown on /setup instead. This cannot be undone.

diff --git a/app/web/templates/admin_workspace_prompt.html b/app/web/templates/admin_workspace_prompt.html index 5ce3a39..fb8327d 100644 --- a/app/web/templates/admin_workspace_prompt.html +++ b/app/web/templates/admin_workspace_prompt.html @@ -27,8 +27,6 @@ display: flex; justify-content: space-between; align-items: center; gap: 16px; margin-bottom: 16px; flex-wrap: wrap; } - .welcome-title { margin: 0; font-size: 22px; font-weight: 600; } - .welcome-sub { color: var(--text-secondary, #6b7280); font-size: 13px; margin-top: 4px; margin-bottom: 0; } .origin-chip { display: inline-block; @@ -188,12 +186,6 @@ .modal-card h3 { margin: 0 0 6px; font-size: 17px; font-weight: 600; } .modal-card p.sub { margin: 0 0 18px; font-size: 13px; color: var(--text-secondary, #6b7280); } .modal-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 20px; } - .modal-btn { - padding: 8px 16px; border-radius: 8px; font-size: 13px; font-weight: 500; - border: 1px solid var(--border, #e5e7eb); background: var(--surface, #fff); - cursor: pointer; - } - .modal-btn.danger { background: #dc2626; color: #fff; border-color: #dc2626; } /* Toast stack */ .toast-stack { @@ -214,8 +206,10 @@
-

Workspace Prompt

-

Customize the CLAUDE.md Claude Code reads when it opens the analyst workspace.

+ {% set page_hero_eyebrow = "Agent Experience" %} + {% set page_hero_title = "Workspace Prompt" %} + {% set page_hero_subtitle = "CLAUDE.md template injected into each analyst workspace. Overrides the OSS default." %} + {% include "_page_hero.html" %}
{% if is_override %} @@ -314,8 +308,8 @@

Reset to default?

Your override will be permanently removed. The rich default CLAUDE.md briefing will be written to analyst workspaces instead. This cannot be undone.

diff --git a/app/web/templates/base.html b/app/web/templates/base.html index 0d3ece2..4886e9b 100644 --- a/app/web/templates/base.html +++ b/app/web/templates/base.html @@ -4,12 +4,14 @@ {% block title %}Data Analyst Portal{% endblock %} - + {# app.js loaded by _app_header.html itself so standalone pages + (catalog, corporate-memory, install, admin_tables) that don't + extend base.html also get the nav-dropdown wiring. #} {% block head_extra %}{% endblock %} {% include '_theme.html' %} - + {% include '_app_header.html' %} {# `layout` block: pages opt out of the narrow .container wrap by overriding diff --git a/app/web/templates/base_login.html b/app/web/templates/base_login.html index 4775469..366d6de 100644 --- a/app/web/templates/base_login.html +++ b/app/web/templates/base_login.html @@ -4,7 +4,6 @@ {% block title %}Data Analyst Portal{% endblock %} - {% include '_theme.html' %} diff --git a/app/web/templates/catalog.html b/app/web/templates/catalog.html index e31b8d6..5e6571f 100644 --- a/app/web/templates/catalog.html +++ b/app/web/templates/catalog.html @@ -1,16 +1,12 @@ - - - - - - Data Catalog - Data Analyst Portal - {% if not config.THEME_FONT_URL %} - - - - {% endif %} - - - - - - - - {% include '_theme.html' %} - - + + + +{% endblock %} - - {% include '_app_header.html' %} - - -
-

Data Catalog

-

Browse available data sources and manage your subscriptions

-
+{% block layout %} + + {% set page_hero_eyebrow = "Data" %} + {% set page_hero_title = "Data Packages" %} + {% set page_hero_subtitle = "Browse the data sources available to your AI agents." %} + {% include "_page_hero.html" %}
@@ -1381,13 +1356,6 @@
-
- Always included - -
{% for category in catalog_data %} @@ -1496,13 +1464,6 @@
{{ metrics_total.n }} metrics · {{ metrics_data|length }} categories
-
- Always included - -
{% if data_stats and data_stats.last_updated %} @@ -1608,6 +1569,56 @@ + + + +
+
+ +
+
+

+ +
+ +
+ + + + + +
+ +
+
+
+ + + + + + + +{% endblock %} + +{% block scripts %} - - -
-
- -
-
-

- -
- -
- - - - - -
- -
-
-
- - - - - {% include "_version_badge.html" %} - - +{% endblock %} diff --git a/app/web/templates/corporate_memory.html b/app/web/templates/corporate_memory.html index 305e229..889e8b7 100644 --- a/app/web/templates/corporate_memory.html +++ b/app/web/templates/corporate_memory.html @@ -1,16 +1,12 @@ - - - - - - Curated Memory — Admin - {% if not config.THEME_FONT_URL %} - - - - {% endif %} - - - {% include '_theme.html' %} - - - - {% include '_app_header.html' %} +{% endblock %} -
+{% block layout %} +
{# Match the obs-page header pattern used by /admin/activity, /admin/telemetry and /admin/sessions so admins see one consistent visual chrome across the Activity Center + Agent @@ -826,8 +819,10 @@
{% endif %}
+{% endblock %} - - {% include "_version_badge.html" %} - - +{% endblock %} diff --git a/app/web/templates/corporate_memory_admin.html b/app/web/templates/corporate_memory_admin.html index da60703..0f9b288 100644 --- a/app/web/templates/corporate_memory_admin.html +++ b/app/web/templates/corporate_memory_admin.html @@ -1,16 +1,12 @@ - - - - - - Corporate Memory Admin - Data Analyst Portal - {% if not config.THEME_FONT_URL %} - - - - {% endif %} - - - {% include '_theme.html' %} - - - - {% include '_app_header.html' %} +{% endblock %} -
+{% block layout %} +
@@ -1145,8 +1102,10 @@
+{% endblock %} - - {% include "_version_badge.html" %} - - +{% endblock %} diff --git a/app/web/templates/dashboard.html b/app/web/templates/dashboard.html index d36d37c..fd0e4cf 100644 --- a/app/web/templates/dashboard.html +++ b/app/web/templates/dashboard.html @@ -222,572 +222,6 @@ padding: 20px 24px 24px; } - /* ── Section Title ── */ - .section-title { - font-size: 13px; - font-weight: 600; - color: var(--text-secondary); - text-transform: uppercase; - letter-spacing: 0.6px; - margin-bottom: 16px; - } - - /* ── Data Source Cards ── */ - .data-source { - padding: 22px 24px; - border-bottom: 1px solid var(--border-light); - } - - .data-source:last-of-type { - border-bottom: none; - } - - .data-source-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - margin-bottom: 12px; - } - - .data-source-info { - display: flex; - align-items: center; - gap: 14px; - } - - .data-source-icon { - width: 44px; - height: 44px; - border-radius: 10px; - background: var(--border-light); - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - .data-source-icon svg { - color: #6B7280; - } - - .data-source-icon.realtime { - background: rgba(16, 183, 127, 0.1); - } - - .data-source-icon.realtime svg { - color: var(--success); - } - - .data-source-icon.disabled { - background: #F3F4F6; - } - - .data-source-icon.disabled svg { - color: #9CA3AF; - } - - .data-source-name { - font-size: 15px; - font-weight: 600; - color: var(--text-primary); - margin-bottom: 4px; - } - - .data-source-status { - display: flex; - align-items: center; - gap: 6px; - font-size: 13px; - color: var(--text-secondary); - } - - .status-dot { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--success); - flex-shrink: 0; - } - - .status-dot--live { - animation: pulse-dot 2s ease-in-out infinite; - } - - @keyframes pulse-dot { - 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(16, 183, 127, 0.4); } - 50% { opacity: 0.8; box-shadow: 0 0 0 4px rgba(16, 183, 127, 0); } - } - - .data-source-details { - font-size: 13px; - color: var(--text-secondary); - line-height: 1.6; - margin-left: 58px; - } - - .badge-included { - flex-shrink: 0; - font-size: 11px; - font-weight: 500; - color: #059669; - background: rgba(16, 183, 127, 0.1); - border-radius: 6px; - padding: 4px 10px; - white-space: nowrap; - align-self: center; - } - - .badge-subscribed { - flex-shrink: 0; - font-size: 11px; - font-weight: 500; - color: var(--primary); - background: var(--primary-light); - border-radius: 6px; - padding: 4px 10px; - white-space: nowrap; - align-self: center; - } - - .badge-disabled { - flex-shrink: 0; - font-size: 11px; - font-weight: 500; - color: #9CA3AF; - background: #F3F4F6; - border-radius: 6px; - padding: 4px 10px; - white-space: nowrap; - align-self: center; - } - - /* ── Toggles inside data source ── */ - .data-source-toggles { - display: flex; - gap: 16px; - margin-left: 58px; - margin-top: 12px; - padding-top: 12px; - border-top: 1px solid var(--border-light); - } - - .toggle-item { - display: flex; - align-items: center; - gap: 8px; - } - - .toggle-switch { - position: relative; - width: 36px; - height: 20px; - } - - .toggle-switch input { - opacity: 0; - width: 0; - height: 0; - } - - .toggle-slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: #E5E7EB; - transition: .2s; - border-radius: 20px; - } - - .toggle-slider:before { - position: absolute; - content: ""; - height: 14px; - width: 14px; - left: 3px; - bottom: 3px; - background-color: white; - transition: .2s; - border-radius: 50%; - } - - input:checked + .toggle-slider { - background-color: var(--primary); - } - - input:checked + .toggle-slider:before { - transform: translateX(16px); - } - - /* Disabled/locked toggle */ - .toggle-switch.locked .toggle-slider { - cursor: not-allowed; - background-color: #9CA3AF; - } - - .toggle-switch.locked .toggle-slider:before { - transform: translateX(16px); - } - - input:disabled + .toggle-slider { - cursor: not-allowed; - opacity: 0.6; - } - - .toggle-label { - font-size: 12px; - color: var(--text-primary); - font-weight: 500; - } - - .toggle-label.locked { - color: var(--text-secondary); - } - - /* ── Catalog CTA ── */ - .catalog-cta { - display: flex; - align-items: center; - justify-content: space-between; - padding: 18px 24px; - border-top: 1px solid var(--border-light); - background: var(--primary-light); - border-radius: 0 0 12px 12px; - } - - .catalog-cta-text { - font-size: 13px; - color: var(--text-secondary); - } - - .catalog-cta-link { - display: flex; - align-items: center; - gap: 6px; - font-size: 13px; - font-weight: 600; - color: var(--primary); - text-decoration: none; - white-space: nowrap; - transition: gap 0.15s ease; - } - - .catalog-cta-link:hover { - gap: 10px; - } - - /* ── Corporate Memory Widget ── */ - .memory-card { - border-left: 3px solid var(--warning); - display: flex; - flex-direction: column; - } - - .memory-card .card-header { - background: rgba(245, 159, 10, 0.08); - padding: 22px 24px; - } - - .memory-icon { - width: 28px; - height: 28px; - background: var(--warning); - border-radius: 6px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - .badge-beta { - font-size: 10px; - font-weight: 600; - color: var(--text-secondary); - background: var(--border-light); - border: 1px solid var(--border); - border-radius: 4px; - padding: 2px 7px; - text-transform: uppercase; - letter-spacing: 0.5px; - } - - .memory-stats { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 12px; - padding: 20px 24px; - } - - .memory-stat { - text-align: center; - padding: 14px 8px; - border-radius: 8px; - background: var(--border-light); - } - - .memory-stat--highlight { - background: rgba(245, 159, 10, 0.1); - } - - .memory-stat-value { - font-size: 22px; - font-weight: 700; - color: var(--text-primary); - line-height: 1.2; - } - - .memory-stat--highlight .memory-stat-value { - color: #D97706; - } - - .memory-stat-label { - font-size: 11px; - font-weight: 500; - color: var(--text-secondary); - margin-top: 2px; - } - - .memory-description { - margin: 0 24px 20px; - padding: 14px 16px; - border-left: 3px solid rgba(245, 159, 10, 0.4); - background: rgba(245, 159, 10, 0.04); - border-radius: 0 8px 8px 0; - font-size: 13px; - color: var(--text-secondary); - line-height: 1.6; - flex: 1; - } - - .memory-description strong { - color: var(--text-primary); - font-weight: 600; - } - - .memory-description code { - background: rgba(0, 0, 0, 0.06); - padding: 2px 8px; - border-radius: 4px; - font-family: var(--font-mono); - font-size: 12px; - } - - .memory-footer { - padding: 16px 24px; - border-top: 1px solid var(--border-light); - display: flex; - align-items: center; - justify-content: space-between; - margin-top: auto; - } - - .memory-sync { - font-size: 12px; - color: var(--text-secondary); - display: flex; - align-items: center; - gap: 6px; - } - - .memory-sync .sync-icon { - color: var(--success); - } - - .btn-memory { - font-family: var(--font-primary); - font-size: 13px; - font-weight: 600; - color: #92400E; - background: rgba(245, 159, 10, 0.15); - border: none; - border-radius: 8px; - padding: 8px 16px; - cursor: pointer; - transition: background 0.15s ease; - text-decoration: none; - display: inline-flex; - align-items: center; - gap: 6px; - } - - .btn-memory:hover { - background: rgba(245, 159, 10, 0.25); - } - - /* ── Activity Center Widget ── */ - .activity-card { - border-left: 3px solid #10B981; - } - - .activity-card .card-header { - background: rgba(16, 185, 129, 0.08); - padding: 22px 24px; - } - - .activity-icon { - width: 28px; - height: 28px; - background: #10B981; - border-radius: 6px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - .badge-demo { - font-size: 10px; - font-weight: 600; - color: #92400E; - background: rgba(245, 159, 10, 0.15); - border: 1px solid rgba(245, 159, 10, 0.3); - border-radius: 4px; - padding: 2px 7px; - text-transform: uppercase; - letter-spacing: 0.5px; - } - - .activity-stats { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 12px; - padding: 20px 24px; - } - - .activity-stat { - text-align: center; - padding: 14px 8px; - border-radius: 8px; - background: var(--border-light); - } - - .activity-stat--highlight { - background: rgba(16, 185, 129, 0.1); - } - - .activity-stat-value { - font-size: 22px; - font-weight: 700; - color: var(--text-primary); - line-height: 1.2; - } - - .activity-stat--highlight .activity-stat-value { - color: #059669; - } - - .activity-stat-label { - font-size: 11px; - font-weight: 500; - color: var(--text-secondary); - margin-top: 2px; - } - - .activity-maturity-bar { - margin: 0 24px 16px; - } - - .activity-maturity-label { - font-size: 11px; - font-weight: 500; - color: var(--text-secondary); - margin-bottom: 8px; - } - - .maturity-bar { - display: flex; - height: 8px; - border-radius: 4px; - overflow: hidden; - gap: 2px; - } - - .maturity-segment { - transition: flex 0.3s ease; - } - - .maturity-segment--optimized { background: #10B981; } - .maturity-segment--mature { background: #3B82F6; } - .maturity-segment--developing { background: #F59E0B; } - .maturity-segment--early { background: #9CA3AF; } - - .maturity-legend { - display: flex; - gap: 12px; - margin-top: 8px; - flex-wrap: wrap; - } - - .maturity-legend-item { - display: flex; - align-items: center; - gap: 4px; - font-size: 10px; - color: var(--text-secondary); - } - - .maturity-legend-dot { - width: 6px; - height: 6px; - border-radius: 50%; - flex-shrink: 0; - } - - .activity-description { - margin: 0 24px 20px; - padding: 14px 16px; - border-left: 3px solid rgba(16, 185, 129, 0.4); - background: rgba(16, 185, 129, 0.04); - border-radius: 0 8px 8px 0; - font-size: 13px; - color: var(--text-secondary); - line-height: 1.6; - } - - .activity-description strong { - color: var(--text-primary); - font-weight: 600; - } - - .activity-footer { - padding: 16px 24px; - border-top: 1px solid var(--border-light); - display: flex; - align-items: center; - justify-content: space-between; - } - - .activity-trend { - font-size: 12px; - color: #059669; - font-weight: 600; - display: flex; - align-items: center; - gap: 4px; - } - - .btn-activity { - font-family: var(--font-primary); - font-size: 13px; - font-weight: 600; - color: #065F46; - background: rgba(16, 185, 129, 0.15); - border: none; - border-radius: 8px; - padding: 8px 16px; - cursor: pointer; - transition: background 0.15s ease; - text-decoration: none; - display: inline-flex; - align-items: center; - gap: 6px; - } - - .btn-activity:hover { - background: rgba(16, 185, 129, 0.25); - } /* ── Bottom Cards Row ── */ .bottom-row { @@ -999,165 +433,6 @@ display: none; } - /* ── Account Card ── */ - .account-grid { - display: flex; - flex-direction: column; - gap: 18px; - } - - .account-row { - display: flex; - align-items: flex-start; - gap: 12px; - } - - .account-label { - font-size: 12px; - font-weight: 500; - color: var(--text-secondary); - text-transform: uppercase; - letter-spacing: 0.4px; - width: 90px; - flex-shrink: 0; - padding-top: 2px; - } - - .account-value { - font-size: 14px; - color: var(--text-primary); - font-weight: 500; - } - - .account-value--mono { - font-family: var(--font-mono); - font-size: 13px; - } - - .badge-role { - display: inline-block; - font-size: 11px; - font-weight: 600; - border-radius: 4px; - padding: 3px 10px; - letter-spacing: 0.3px; - } - - .badge-role.admin { - color: #EA580C; - background: rgba(234, 88, 12, 0.1); - } - - .badge-role.privileged { - color: #7C3AED; - background: rgba(124, 58, 237, 0.1); - } - - .badge-role.analyst { - color: var(--primary); - background: var(--primary-light); - } - - .badge-role.default { - color: var(--text-secondary); - background: var(--border-light); - } - - .badge-group { - display: inline-block; - font-size: 11px; - font-weight: 500; - font-family: var(--font-mono); - color: var(--text-secondary); - background: var(--border-light); - border: 1px solid var(--border); - border-radius: 4px; - padding: 2px 8px; - margin-right: 6px; - margin-bottom: 4px; - } - - .account-scripts { - list-style: none; - padding: 0; - flex: 1; - } - - .account-scripts li { - font-size: 13px; - color: var(--text-primary); - padding: 6px 0; - display: flex; - align-items: center; - justify-content: space-between; - } - - .account-scripts li + li { - border-top: 1px solid var(--border-light); - } - - .script-name { - font-family: var(--font-mono); - font-size: 12px; - font-weight: 500; - } - - .script-time { - font-size: 11px; - color: var(--text-secondary); - } - - .cron-line { - font-size: 12px; - color: var(--text-secondary); - margin-top: 6px; - display: flex; - align-items: center; - gap: 6px; - } - - .cron-line svg { - width: 12px; - height: 12px; - opacity: 0.5; - } - - .account-empty { - font-size: 12px; - color: var(--text-secondary); - font-style: italic; - } - - .account-hint { - font-size: 11px; - color: var(--text-secondary); - opacity: 0.7; - margin-top: 2px; - } - - .account-hint code { - background: var(--background); - padding: 1px 5px; - border-radius: 3px; - font-family: var(--font-mono); - font-size: 10px; - } - - .sync-datasets { - display: flex; - gap: 4px; - margin-top: 6px; - } - - .dataset-badge { - display: inline-block; - padding: 2px 8px; - background: rgba(16, 183, 127, 0.1); - color: var(--success); - border-radius: 4px; - font-size: 11px; - font-weight: 500; - } /* ── Setup Banner ── */ /* ── Environment Setup CTA (shown after account creation) ── */ @@ -1897,10 +1172,6 @@ Data Size {{ data_stats.size_display }}
-
- Unstructured - {{ data_stats.unstructured_display }} -
@@ -1914,77 +1185,6 @@
- -
-
- Your Data -
- - -
-
-
-
- - - - - -
-
-
Core Business Data
-
- - {% if data_stats.last_updated %}Synced {{ data_stats.last_updated }}{% else %}Not yet synced{% endif %} -
-
-
- Always included -
-
- {% if catalog_data %}{% for cat in catalog_data %}{{ cat.name }} ({{ cat.count }} tables){% if not loop.last %}, {% endif %}{% endfor %}{% if data_stats.remote_tables %} · {{ data_stats.local_tables }} local, {{ data_stats.remote_tables }} live{% endif %}{% else %}{{ data_stats.total_tables or data_stats.tables }} tables total{% endif %} -
-
- - {% if metrics_data %} - {% set metrics_total = namespace(n=0) %} - {% for c in metrics_data %}{% set metrics_total.n = metrics_total.n + c.metrics|length %}{% endfor %} -
-
-
-
- - - - -
-
-
Business Metrics
-
- {{ metrics_total.n }} metrics across {{ metrics_data|length }} categories{% if data_stats.last_updated %} · data from {{ data_stats.last_updated }}{% endif %} -
-
-
- Always included -
-
- {% for c in metrics_data %}{{ c.label }} ({{ c.metrics|length }}){% if not loop.last %}, {% endif %}{% endfor %} -
-
- {% endif %} - -
-
Manage your data subscriptions or discover new data sources
- - Open Data Catalog - - - - -
-
- -
@@ -2050,212 +1250,10 @@
- -
-
- Account -
-
- -
-
- -
- - {# Memory is admin-only. Widget hidden for non-admin; route - /corporate-memory + nav link are likewise admin-gated. #} - {% if session.user.is_admin %} - -
-
-
-
- - - - - -
- Corporate Memory -
- private beta -
- -
-
-
0
-
Contributors
-
-
-
0
-
Knowledge Items
-
-
-
0
-
Your Rules
-
-
- -
- Shared knowledge from your team's Claude Code sessions. - Upvote useful insights and they'll sync to your local .claude/rules/. -
- - -
- {% endif %} - - -
-
-
-
- - - - - -
- Activity Center -
- demo -
- -
-
-
{{ activity_summary.get('teams_active', 0) }}/{{ activity_summary.get('teams_total', 0) }}
-
Teams Active
-
-
-
{{ activity_summary.get('business_processes_identified', 0) }}
-
Processes
-
-
-
{{ activity_summary.get('avg_success_rate', 0) }}%
-
Success Rate
-
-
- - {% set maturity = activity_summary.get('maturity_distribution', {}) %} - {% set maturity_total = maturity.get('optimized', 0) + maturity.get('mature', 0) + maturity.get('developing', 0) + maturity.get('early', 0) %} -
-
Process Maturity Distribution
- {% if maturity_total > 0 %} -
-
-
-
-
-
-
- Optimized ({{ maturity.get('optimized', 0) }}) - Mature ({{ maturity.get('mature', 0) }}) - Developing ({{ maturity.get('developing', 0) }}) - Early ({{ maturity.get('early', 0) }}) -
- {% endif %} -
- -
- Strategic overview of how data powers business processes across {{ activity_summary.get('teams_total', 0) }} teams. -
- - -
- -
{% if account_details and account_details.last_sync_display %} diff --git a/app/web/templates/install.html b/app/web/templates/install.html index a850746..8312b15 100644 --- a/app/web/templates/install.html +++ b/app/web/templates/install.html @@ -1,16 +1,12 @@ - - - - - - Setup local agent — {{ config.INSTANCE_NAME }} - {% if not config.THEME_FONT_URL %} - - - - {% endif %} - - - {% include '_theme.html' %} - - +{% endblock %} - - {% include '_app_header.html' %} - - {% with messages = get_flashed_messages(with_categories=true) %} +{% block layout %} +{% with messages = get_flashed_messages(with_categories=true) %} {% if messages %}
{% for category, message in messages %} @@ -934,8 +926,10 @@ +{% endblock %} - - {% include "_version_badge.html" %} - - +{% endblock %} diff --git a/app/web/templates/marketplace.html b/app/web/templates/marketplace.html index 051ed7a..2da00a0 100644 --- a/app/web/templates/marketplace.html +++ b/app/web/templates/marketplace.html @@ -145,22 +145,11 @@ .mp-actions { display: flex; gap: 8px; align-items: center; } .mp-actions .btn { - appearance: none; - display: inline-flex; align-items: center; gap: 6px; - padding: 8px 14px; - border: 1px solid var(--border); background: var(--surface); - color: var(--text-primary); border-radius: 8px; font-size: 13px; font-weight: 500; cursor: pointer; font-family: var(--font-primary); text-decoration: none; transition: all 0.15s ease; } - .mp-actions .btn:hover { border-color: var(--primary); color: var(--primary); } - .mp-actions .btn.primary { - background: var(--primary); color: #fff; border-color: var(--primary); - } - .mp-actions .btn.primary:hover { - background: var(--primary-dark); border-color: var(--primary-dark); color: #fff; - } + /* ── Info block (curated trust badge + flea open-shelf signal) ───── */ .mp-curator-block { @@ -451,10 +440,10 @@
- Submit a plugin + Submit a plugin - +
diff --git a/app/web/templates/me_debug.html b/app/web/templates/me_debug.html index 59fe37c..36a8142 100644 --- a/app/web/templates/me_debug.html +++ b/app/web/templates/me_debug.html @@ -48,17 +48,7 @@ } .kv .v.muted { color: #9ca3af; font-style: italic; } - .md-table { width: 100%; border-collapse: collapse; font-size: 13px; } - .md-table th, .md-table td { - padding: 8px 14px; text-align: left; - border-bottom: 1px solid var(--border-light, #f3f4f6); - } - .md-table thead th { - background: var(--border-light, #f9fafb); - font-size: 11px; text-transform: uppercase; letter-spacing: 0.4px; - color: var(--text-secondary, #6b7280); font-weight: 600; - } - .md-table tbody tr:last-child td { border-bottom: none; } + .src-chip { display: inline-block; padding: 2px 8px; border-radius: 999px; @@ -79,12 +69,7 @@ .md-empty { color: #9ca3af; font-style: italic; font-size: 12px; } - .refetch-btn { - padding: 7px 12px; border-radius: 6px; font-size: 12px; font-weight: 500; - background: var(--primary, #6366f1); color: #fff; - border: 1px solid var(--primary, #6366f1); cursor: pointer; - } - .refetch-btn:disabled { opacity: 0.6; cursor: progress; } + .refetch-result { margin-top: 14px; } .diff-add { color: #166534; } @@ -168,7 +153,7 @@ {{ memberships|length }} row(s) {% if memberships %} -
User
+
@@ -202,7 +187,7 @@ Distinct {{ grants|length }} grant(s) reachable via your groups. {% if grants %} -
GroupLinked toSourceAddedAdded by
+
@@ -238,7 +223,7 @@
- diff --git a/app/web/templates/my_tokens.html b/app/web/templates/my_tokens.html index 469c09c..be1a87a 100644 --- a/app/web/templates/my_tokens.html +++ b/app/web/templates/my_tokens.html @@ -504,35 +504,6 @@ justify-content: flex-end; margin-top: 24px; } - .modal-btn { - padding: 10px 18px; - border-radius: 8px; - font-size: 13.5px; - font-weight: 500; - font-family: var(--font-primary, inherit); - cursor: pointer; - transition: all 0.15s ease; - border: 1px solid var(--border, #e5e7eb); - background: var(--surface, #fff); - color: var(--text-primary, #1A253C); - } - .modal-btn:hover { - border-color: #cbd5e1; - background: var(--background, #F5F7FA); - } - .modal-btn.danger { - background: #dc2626; - color: #fff; - border-color: #dc2626; - } - .modal-btn.danger:hover { - background: #b91c1c; - border-color: #b91c1c; - } - .modal-btn:focus-visible { - outline: 2px solid #0073D1; - outline-offset: 2px; - } /* ── Toast ─────────────────────────────────────────────────────────────── */ .toast-stack { @@ -660,15 +631,6 @@ border-color: #0073D1; box-shadow: 0 0 0 3px rgba(0, 115, 209, 0.15); } - .modal-btn.primary { - background: #0073D1; - color: #fff; - border-color: #0073D1; - } - .modal-btn.primary:hover { - background: #0056A3; - border-color: #0056A3; - } /* ── Responsive ────────────────────────────────────────────────────────── */ @media (max-width: 720px) { @@ -817,8 +779,8 @@

@@ -846,8 +808,8 @@ diff --git a/app/web/templates/profile_sessions.html b/app/web/templates/profile_sessions.html index 6e4bc4d..6e4ec60 100644 --- a/app/web/templates/profile_sessions.html +++ b/app/web/templates/profile_sessions.html @@ -5,7 +5,7 @@
-

My sessions

+ {% set page_hero_eyebrow = "Profile" %} + {% set page_hero_title = "My sessions" %} + {% set page_hero_subtitle = "Sessions uploaded via agnes push from Claude Code." %} + {% include "_page_hero.html" %}

Sessions you uploaded via agnes push from your Claude Code workspace, with extraction status from the verification processor's rows in session_processor_state. @@ -77,7 +65,7 @@

{% if sessions %} -
Resource typeResource idVia group
+
diff --git a/app/web/templates/store_edit.html b/app/web/templates/store_edit.html index 301b756..a6fe706 100644 --- a/app/web/templates/store_edit.html +++ b/app/web/templates/store_edit.html @@ -44,16 +44,6 @@ } .actions { display: flex; gap: 8px; margin-top: 20px; align-items: center; } - .btn-primary { - padding: 8px 18px; border-radius: 6px; border: none; - background: var(--primary, #0073D1); color: white; - font-size: 14px; font-weight: 500; cursor: pointer; - } - .btn-primary:disabled { background: var(--border, #d1d5db); cursor: not-allowed; } - .btn-link { - padding: 8px 12px; color: var(--text-secondary, #6b7280); text-decoration: none; - font-size: 14px; - } .pending-banner { margin: 12px 0 16px 0; padding: 14px 18px; border-radius: 10px; @@ -175,7 +165,7 @@
- Cancel + Cancel
diff --git a/app/web/templates/store_upload.html b/app/web/templates/store_upload.html index e116887..b131032 100644 --- a/app/web/templates/store_upload.html +++ b/app/web/templates/store_upload.html @@ -178,36 +178,8 @@ } .doc-add:hover { border-color: var(--primary, #0073D1); color: var(--primary, #0073D1); } - /* ── Buttons (mirror /setup primary CTA) ───────────────────────── */ + /* ── Buttons ───────────────────────────────────────────────────── */ .actions { display: flex; gap: 10px; align-items: center; margin-top: 8px; } - .btn-primary { - display: inline-flex; align-items: center; gap: 8px; - font-family: var(--font-primary, inherit); - font-size: 14px; font-weight: 600; color: #fff; - background: var(--primary, #0073D1); border: none; - border-radius: 8px; padding: 11px 22px; cursor: pointer; - transition: all 0.15s ease; - } - .btn-primary:hover { - background: var(--primary-dark, #0056A3); - transform: translateY(-1px); - box-shadow: 0 4px 14px rgba(0, 115, 209, 0.25); - } - .btn-primary:disabled { opacity: 0.7; cursor: wait; transform: none; box-shadow: none; } - .btn-secondary { - appearance: none; padding: 10px 18px; - border: 1px solid var(--border, #d1d5db); background: #fff; - color: var(--text-secondary, #6b7280); border-radius: 8px; - font-size: 14px; font-weight: 500; cursor: pointer; - font-family: var(--font-primary, inherit); - transition: all 0.15s ease; - } - .btn-secondary:hover { border-color: var(--primary, #0073D1); color: var(--primary, #0073D1); } - .btn-link { - color: var(--text-secondary, #6b7280); text-decoration: none; - font-size: 13px; padding: 10px 8px; - } - .btn-link:hover { color: var(--text-primary, #111827); } /* ── Status banner ─────────────────────────────────────────────── */ /* `display: flex` on .banner overrides the user-agent default for the @@ -447,7 +419,7 @@
- Cancel + Cancel
diff --git a/docs/superpowers/plans/2026-05-13-design-system-unification.md b/docs/superpowers/plans/2026-05-13-design-system-unification.md new file mode 100644 index 0000000..5fd9295 --- /dev/null +++ b/docs/superpowers/plans/2026-05-13-design-system-unification.md @@ -0,0 +1,1486 @@ +# Design System Unification Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. One PR for the whole thing — no mid-stream releases. + +**Goal:** Make every page of the Agnes web UI look like part of the same product — one CSS file, one design-token palette, one set of primitives (buttons, inputs, filter bars, page headers, tables, empty states, toasts), one nav style. Resolve the user-visible drift: top-nav Admin entry looking different from sibling links, filter bars rendering 3 different ways across pages, page headers in 5 different sizes, admin tables each rolling their own CSS. + +**Architecture:** +- Consolidate `app/web/static/style.css` into `app/web/static/style-custom.css` and delete `style.css`. One stylesheet, one `:root` token block. +- Introduce canonical primitives (`.btn` family, `.search-input`, `.filter-bar`, `.page-header`, `.data-table`, `.empty-state`, `.toast`, `.app-nav-link` unified for `` and `
Session file