From ac6a52d534cd638b97c668a1eb21a98996cd3d1d Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 27 Mar 2026 23:48:50 +0000 Subject: [PATCH] style(portal): overhaul design to premium aesthetic --- .../cloudcp/portal/dist/build_manifest.json | 2 +- internal/cloudcp/portal/dist/portal_app.css | 168 ++++++++++++------ .../cloudcp/portal/frontend/src/styles.css | 143 ++++++++++----- 3 files changed, 206 insertions(+), 107 deletions(-) diff --git a/internal/cloudcp/portal/dist/build_manifest.json b/internal/cloudcp/portal/dist/build_manifest.json index 401499c368..358d0efa35 100644 --- a/internal/cloudcp/portal/dist/build_manifest.json +++ b/internal/cloudcp/portal/dist/build_manifest.json @@ -1,5 +1,5 @@ { - "source_hash": "af74be942dbe9fa37b8c3eb059ba5434ea54ab2369d0d3da5c570049f5caab6b", + "source_hash": "b3f872fdcab37565d7a34a42d6d89d1a7f0dfe3af1d818123fa0ecbc38eb2dca", "build_inputs": [ "package.json", "tsconfig.json", diff --git a/internal/cloudcp/portal/dist/portal_app.css b/internal/cloudcp/portal/dist/portal_app.css index 4304600efa..7b8b92d761 100644 --- a/internal/cloudcp/portal/dist/portal_app.css +++ b/internal/cloudcp/portal/dist/portal_app.css @@ -1,33 +1,35 @@ /* src/styles.css */ :root { color-scheme: light; - --bg: #edf1f5; + --bg: #f4f7f9; --panel: #ffffff; - --panel-strong: #f8fafc; - --panel-muted: #f3f6f9; - --ink: #17212b; - --ink-soft: #4d5b6a; - --ink-muted: #6d7784; - --line: #d6dfe8; - --line-strong: #bcc8d3; - --accent: #0b6a72; - --accent-strong: #084d53; - --accent-soft: #dceef0; + --panel-strong: #fafcff; + --panel-muted: #f1f5f9; + --ink: #0f172a; + --ink-soft: #475569; + --ink-muted: #64748b; + --line: #e2e8f0; + --line-strong: #cbd5e1; + --accent: #0f766e; + --accent-strong: #115e59; + --accent-soft: #ccfbf1; --warn: #9a3412; - --warn-soft: #fff3e6; - --danger: #a61b1b; - --danger-soft: #fdeaea; - --success: #19603c; - --success-soft: #e3f3e8; - --nav-bg: #111b24; - --nav-line: #203240; - --nav-copy: #8fa0b0; - --nav-ink: #edf4f8; - --shadow-sm: 0 1px 2px rgba(23, 32, 42, 0.06); - --shadow-md: 0 10px 24px rgba(23, 32, 42, 0.08); - --radius-sm: 6px; - --radius-md: 10px; - --radius-lg: 16px; + --warn-soft: #ffedd5; + --danger: #991b1b; + --danger-soft: #fee2e2; + --success: #166534; + --success-soft: #dcfce7; + --nav-bg: #0b1120; + --nav-line: #1e293b; + --nav-copy: #94a3b8; + --nav-ink: #f8fafc; + --shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.05), 0 1px 2px rgba(15, 23, 42, 0.03); + --shadow-md: 0 10px 25px rgba(15, 23, 42, 0.04), 0 4px 10px rgba(15, 23, 42, 0.02); + --shadow-lg: 0 20px 40px rgba(15, 23, 42, 0.06), 0 8px 16px rgba(15, 23, 42, 0.03); + --shadow-hover: 0 12px 28px rgba(15, 23, 42, 0.06), 0 4px 12px rgba(15, 23, 42, 0.03); + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 20px; } * { box-sizing: border-box; @@ -39,17 +41,25 @@ body { margin: 0; min-height: 100vh; font-family: - "SF Pro Text", - "SF Pro Display", - "Segoe UI Variable Text", - "Segoe UI", + "Inter", + "Outfit", -apple-system, BlinkMacSystemFont, + "Segoe UI", + Roboto, "Helvetica Neue", Arial, sans-serif; background: var(--bg); + background-image: + radial-gradient( + circle at 50% 0%, + #ffffff 0%, + transparent 80%); + background-attachment: fixed; color: var(--ink); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } a { color: inherit; @@ -100,53 +110,59 @@ header .logout-btn, .btn-secondary, .link-button { border: 1px solid var(--line-strong); - background: #fff; + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(8px); color: var(--ink); border-radius: 8px; padding: 9px 14px; cursor: pointer; - transition: - border-color 140ms ease, - background 140ms ease, - transform 140ms ease, - box-shadow 140ms ease; + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); } header .logout-btn:hover, .btn-secondary:hover, .link-button:hover { - border-color: var(--accent); - background: #fffdfa; - transform: translateY(-1px); - box-shadow: var(--shadow-sm); + border-color: var(--line-strong); + background: #ffffff; + transform: translateY(-2px); + box-shadow: var(--shadow-hover); } .btn-primary { border-radius: 8px; padding: 10px 15px; - background: var(--accent); + background: + linear-gradient( + 180deg, + var(--accent) 0%, + var(--accent-strong) 100%); color: #fff; font-weight: 600; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), var(--shadow-sm); cursor: pointer; - transition: - background 140ms ease, - transform 140ms ease, - box-shadow 140ms ease; + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); } .btn-primary:hover { - background: var(--accent-strong); - transform: translateY(-1px); - box-shadow: var(--shadow-sm); + background: + linear-gradient( + 180deg, + #138980 0%, + var(--accent) 100%); + transform: translateY(-2px); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), var(--shadow-hover); } .btn-danger { border-radius: 8px; padding: 10px 15px; background: var(--danger-soft); color: var(--danger); + font-weight: 600; cursor: pointer; - transition: background 140ms ease, transform 140ms ease; + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); } .btn-danger:hover { - background: #f7d4d4; - transform: translateY(-1px); + background: #fecaca; + transform: translateY(-2px); + box-shadow: var(--shadow-sm); } .btn-compact { padding: 9px 14px; @@ -265,18 +281,28 @@ header .logout-btn:hover, .account-surface, .empty-state { border: 1px solid var(--line); - background: rgba(255, 255, 255, 0.98); + background: rgba(255, 255, 255, 0.85); + backdrop-filter: blur(12px); box-shadow: var(--shadow-sm); + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); + border-radius: var(--radius-lg); +} +.portal-command-strip:hover, +.intro-card:hover, +.service-panel:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .portal-shell-layout { display: grid; grid-template-columns: 224px minmax(0, 1fr); gap: 0; align-items: start; - border: 1px solid var(--line); + border: 1px solid rgba(255, 255, 255, 0.5); border-radius: var(--radius-lg); - background: #ffffff; - box-shadow: 0 24px 52px rgba(10, 25, 41, 0.08); + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + box-shadow: 0 32px 64px rgba(15, 23, 42, 0.08), 0 2px 12px rgba(15, 23, 42, 0.04); overflow: hidden; } .portal-shell-nav { @@ -286,7 +312,12 @@ header .logout-btn:hover, border-right: 1px solid var(--nav-line); border-radius: 0; background: var(--nav-bg); - box-shadow: none; + background: + linear-gradient( + 175deg, + var(--nav-bg) 0%, + #030712 100%); + box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.05); overflow: hidden; } .portal-shell-nav-header { @@ -579,7 +610,16 @@ header .logout-btn:hover, .service-panel .subsection { border: 1px solid var(--line); background: var(--panel); - border-radius: var(--radius-md); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} +.account-overview-card:hover, +.account-stat-card:hover, +.workspace-row:hover, +.service-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .account-overview-card, .account-stat-card, @@ -682,7 +722,13 @@ header .logout-btn:hover, grid-column: 1 / -1; padding: 16px; background: var(--panel); - border-radius: var(--radius-md); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} +.account-action-strip:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .account-action-copy { max-width: 720px; @@ -702,8 +748,14 @@ header .logout-btn:hover, .overview-side-card { padding: 16px; border: 1px solid var(--line); - border-radius: var(--radius-md); + border-radius: var(--radius-lg); background: var(--panel); + box-shadow: var(--shadow-sm); + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} +.overview-side-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .overview-side-card h4 { margin: 8px 0 0; diff --git a/internal/cloudcp/portal/frontend/src/styles.css b/internal/cloudcp/portal/frontend/src/styles.css index 8be276ea33..cd79ab82c5 100644 --- a/internal/cloudcp/portal/frontend/src/styles.css +++ b/internal/cloudcp/portal/frontend/src/styles.css @@ -1,32 +1,34 @@ :root { color-scheme: light; - --bg: #edf1f5; + --bg: #f4f7f9; --panel: #ffffff; - --panel-strong: #f8fafc; - --panel-muted: #f3f6f9; - --ink: #17212b; - --ink-soft: #4d5b6a; - --ink-muted: #6d7784; - --line: #d6dfe8; - --line-strong: #bcc8d3; - --accent: #0b6a72; - --accent-strong: #084d53; - --accent-soft: #dceef0; + --panel-strong: #fafcff; + --panel-muted: #f1f5f9; + --ink: #0f172a; + --ink-soft: #475569; + --ink-muted: #64748b; + --line: #e2e8f0; + --line-strong: #cbd5e1; + --accent: #0f766e; + --accent-strong: #115e59; + --accent-soft: #ccfbf1; --warn: #9a3412; - --warn-soft: #fff3e6; - --danger: #a61b1b; - --danger-soft: #fdeaea; - --success: #19603c; - --success-soft: #e3f3e8; - --nav-bg: #111b24; - --nav-line: #203240; - --nav-copy: #8fa0b0; - --nav-ink: #edf4f8; - --shadow-sm: 0 1px 2px rgba(23, 32, 42, 0.06); - --shadow-md: 0 10px 24px rgba(23, 32, 42, 0.08); - --radius-sm: 6px; - --radius-md: 10px; - --radius-lg: 16px; + --warn-soft: #ffedd5; + --danger: #991b1b; + --danger-soft: #fee2e2; + --success: #166534; + --success-soft: #dcfce7; + --nav-bg: #0b1120; + --nav-line: #1e293b; + --nav-copy: #94a3b8; + --nav-ink: #f8fafc; + --shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.05), 0 1px 2px rgba(15, 23, 42, 0.03); + --shadow-md: 0 10px 25px rgba(15, 23, 42, 0.04), 0 4px 10px rgba(15, 23, 42, 0.02); + --shadow-lg: 0 20px 40px rgba(15, 23, 42, 0.06), 0 8px 16px rgba(15, 23, 42, 0.03); + --shadow-hover: 0 12px 28px rgba(15, 23, 42, 0.06), 0 4px 12px rgba(15, 23, 42, 0.03); + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 20px; } * { box-sizing: border-box; } @@ -38,9 +40,13 @@ html { body { margin: 0; min-height: 100vh; - font-family: "SF Pro Text", "SF Pro Display", "Segoe UI Variable Text", "Segoe UI", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, sans-serif; + font-family: "Inter", "Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background: var(--bg); + background-image: radial-gradient(circle at 50% 0%, #ffffff 0%, transparent 80%); + background-attachment: fixed; color: var(--ink); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } a { color: inherit; } @@ -96,37 +102,40 @@ header .logout-btn, .btn-secondary, .link-button { border: 1px solid var(--line-strong); - background: #fff; + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(8px); color: var(--ink); border-radius: 8px; padding: 9px 14px; cursor: pointer; - transition: border-color 140ms ease, background 140ms ease, transform 140ms ease, box-shadow 140ms ease; + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); } header .logout-btn:hover, .btn-secondary:hover, .link-button:hover { - border-color: var(--accent); - background: #fffdfa; - transform: translateY(-1px); - box-shadow: var(--shadow-sm); + border-color: var(--line-strong); + background: #ffffff; + transform: translateY(-2px); + box-shadow: var(--shadow-hover); } .btn-primary { border-radius: 8px; padding: 10px 15px; - background: var(--accent); + background: linear-gradient(180deg, var(--accent) 0%, var(--accent-strong) 100%); color: #fff; font-weight: 600; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), var(--shadow-sm); cursor: pointer; - transition: background 140ms ease, transform 140ms ease, box-shadow 140ms ease; + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); } .btn-primary:hover { - background: var(--accent-strong); - transform: translateY(-1px); - box-shadow: var(--shadow-sm); + background: linear-gradient(180deg, #138980 0%, var(--accent) 100%); + transform: translateY(-2px); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), var(--shadow-hover); } .btn-danger { @@ -134,13 +143,15 @@ header .logout-btn:hover, padding: 10px 15px; background: var(--danger-soft); color: var(--danger); + font-weight: 600; cursor: pointer; - transition: background 140ms ease, transform 140ms ease; + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); } .btn-danger:hover { - background: #f7d4d4; - transform: translateY(-1px); + background: #fecaca; + transform: translateY(-2px); + box-shadow: var(--shadow-sm); } .btn-compact { @@ -277,8 +288,18 @@ header .logout-btn:hover, .account-surface, .empty-state { border: 1px solid var(--line); - background: rgba(255, 255, 255, 0.98); + background: rgba(255, 255, 255, 0.85); + backdrop-filter: blur(12px); box-shadow: var(--shadow-sm); + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); + border-radius: var(--radius-lg); +} + +.portal-command-strip:hover, +.intro-card:hover, +.service-panel:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .portal-shell-layout { @@ -286,10 +307,11 @@ header .logout-btn:hover, grid-template-columns: 224px minmax(0, 1fr); gap: 0; align-items: start; - border: 1px solid var(--line); + border: 1px solid rgba(255, 255, 255, 0.5); border-radius: var(--radius-lg); - background: #ffffff; - box-shadow: 0 24px 52px rgba(10, 25, 41, 0.08); + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + box-shadow: 0 32px 64px rgba(15, 23, 42, 0.08), 0 2px 12px rgba(15, 23, 42, 0.04); overflow: hidden; } @@ -300,7 +322,8 @@ header .logout-btn:hover, border-right: 1px solid var(--nav-line); border-radius: 0; background: var(--nav-bg); - box-shadow: none; + background: linear-gradient(175deg, var(--nav-bg) 0%, #030712 100%); + box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.05); overflow: hidden; } @@ -640,7 +663,17 @@ header .logout-btn:hover, .service-panel .subsection { border: 1px solid var(--line); background: var(--panel); - border-radius: var(--radius-md); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.account-overview-card:hover, +.account-stat-card:hover, +.workspace-row:hover, +.service-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .account-overview-card, @@ -749,7 +782,14 @@ header .logout-btn:hover, grid-column: 1 / -1; padding: 16px; background: var(--panel); - border-radius: var(--radius-md); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.account-action-strip:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .account-action-copy { @@ -773,8 +813,15 @@ header .logout-btn:hover, .overview-side-card { padding: 16px; border: 1px solid var(--line); - border-radius: var(--radius-md); + border-radius: var(--radius-lg); background: var(--panel); + box-shadow: var(--shadow-sm); + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.overview-side-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .overview-side-card h4 {