From a0db15542727fdebe472853d67e85751d67a4c5b Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Mon, 19 Jan 2026 21:30:36 +0100 Subject: [PATCH] website refactor --- apps/website/app/globals.css | 1 + apps/website/app/layout.tsx | 6 +- apps/website/components/AppWrapper.tsx | 2 +- apps/website/components/app/AppShell.tsx | 20 ++- .../components/dashboard/DashboardShell.tsx | 25 ++- apps/website/components/dev/DevToolbar.tsx | 23 ++- apps/website/components/layout/AppFooter.tsx | 44 +++++ apps/website/components/layout/AppHeader.tsx | 78 +++++++++ apps/website/components/layout/AppSidebar.tsx | 54 +++++++ .../website/components/layout/MainContent.tsx | 54 +++++++ .../website/docs/LAYOUT_RECREATION_SUMMARY.md | 153 ++++++++++++++++++ apps/website/templates/HomeTemplate.tsx | 2 +- .../templates/layout/GlobalFooterTemplate.tsx | 61 ++++--- .../layout/GlobalSidebarTemplate.tsx | 31 +++- .../layout/HeaderContentTemplate.tsx | 43 +++-- .../templates/layout/RootAppShellTemplate.tsx | 43 +++-- apps/website/ui/ContentShell.tsx | 8 +- apps/website/ui/ContentViewport.tsx | 21 +-- apps/website/ui/ControlBar.tsx | 32 ++-- apps/website/ui/MainContent.tsx | 4 +- apps/website/ui/Surface.tsx | 7 +- apps/website/ui/TopNav.tsx | 12 +- apps/website/ui/theme/theme.css | 5 + 23 files changed, 582 insertions(+), 147 deletions(-) create mode 100644 apps/website/components/layout/AppFooter.tsx create mode 100644 apps/website/components/layout/AppHeader.tsx create mode 100644 apps/website/components/layout/AppSidebar.tsx create mode 100644 apps/website/components/layout/MainContent.tsx create mode 100644 apps/website/docs/LAYOUT_RECREATION_SUMMARY.md diff --git a/apps/website/app/globals.css b/apps/website/app/globals.css index 288203d7a..77f60b44b 100644 --- a/apps/website/app/globals.css +++ b/apps/website/app/globals.css @@ -57,6 +57,7 @@ color: var(--color-text-high); line-height: 1.5; overscroll-behavior: none; + min-height: 100vh; } ::selection { diff --git a/apps/website/app/layout.tsx b/apps/website/app/layout.tsx index cd8361073..fe418d98f 100644 --- a/apps/website/app/layout.tsx +++ b/apps/website/app/layout.tsx @@ -75,11 +75,9 @@ export default async function RootLayout({ - + - - {children} - + {children} diff --git a/apps/website/components/AppWrapper.tsx b/apps/website/components/AppWrapper.tsx index 0c75834f4..06567e47e 100644 --- a/apps/website/components/AppWrapper.tsx +++ b/apps/website/components/AppWrapper.tsx @@ -27,8 +27,8 @@ export function AppWrapper({ children, enabledFlags }: AppWrapperProps) { {children} - {process.env.NODE_ENV === 'development' && } + {process.env.NODE_ENV === 'development' && } diff --git a/apps/website/components/app/AppShell.tsx b/apps/website/components/app/AppShell.tsx index 01d610a7b..3e6d0ca32 100644 --- a/apps/website/components/app/AppShell.tsx +++ b/apps/website/components/app/AppShell.tsx @@ -7,18 +7,24 @@ interface AppShellProps { /** * AppShell is the root container for the entire application layout. - * It provides the base background and layout structure. + * Provides the base structure with cockpit-inspired design. */ export function AppShell({ children }: AppShellProps) { return ( - {children} ); -} +} \ No newline at end of file diff --git a/apps/website/components/dashboard/DashboardShell.tsx b/apps/website/components/dashboard/DashboardShell.tsx index 0fa4d4b59..b27deb510 100644 --- a/apps/website/components/dashboard/DashboardShell.tsx +++ b/apps/website/components/dashboard/DashboardShell.tsx @@ -18,21 +18,16 @@ interface DashboardShellProps { */ export function DashboardShell({ children, rail, controlBar }: DashboardShellProps) { return ( - - {rail && ( - - {rail} - - )} - - {controlBar && ( -
- {controlBar} -
- )} - - {children} - + + {rail && {rail}} + + + {controlBar &&
{controlBar}
} + {children}
); diff --git a/apps/website/components/dev/DevToolbar.tsx b/apps/website/components/dev/DevToolbar.tsx index 91d344007..a55ea5269 100644 --- a/apps/website/components/dev/DevToolbar.tsx +++ b/apps/website/components/dev/DevToolbar.tsx @@ -229,7 +229,7 @@ export function DevToolbar() { if (isMinimized) { return ( - + setIsMinimized(false)} @@ -242,7 +242,26 @@ export function DevToolbar() { } return ( - + {/* Header */} diff --git a/apps/website/components/layout/AppFooter.tsx b/apps/website/components/layout/AppFooter.tsx new file mode 100644 index 000000000..e0d794c35 --- /dev/null +++ b/apps/website/components/layout/AppFooter.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { Surface } from '@/ui/Surface'; +import { Stack } from '@/ui/Stack'; +import { Text } from '@/ui/Text'; +import { Box } from '@/ui/Box'; + +export function AppFooter() { + return ( + + + + + © {new Date().getFullYear()} GridPilot + + + + Session ready + + + + + + + + System Normal + + + + + + ); +} diff --git a/apps/website/components/layout/AppHeader.tsx b/apps/website/components/layout/AppHeader.tsx new file mode 100644 index 000000000..112025b09 --- /dev/null +++ b/apps/website/components/layout/AppHeader.tsx @@ -0,0 +1,78 @@ +'use client'; + +import { BrandMark } from '@/ui/BrandMark'; +import { HeaderActions } from '@/components/layout/HeaderActions'; +import { PublicNav } from '@/components/layout/PublicNav'; +import { useCurrentSession } from '@/hooks/auth/useCurrentSession'; +import { routes } from '@/lib/routing/RouteConfig'; +import { Box } from '@/ui/Box'; +import { Stack } from '@/ui/Stack'; +import { Text } from '@/ui/Text'; +import { Surface } from '@/ui/Surface'; +import { usePathname } from 'next/navigation'; + +export function AppHeader() { + const pathname = usePathname(); + const { data: session } = useCurrentSession(); + const isAuthenticated = !!session; + const homeHref = isAuthenticated ? routes.protected.dashboard : routes.public.home; + + return ( + + + {/* Left: Brand & Context */} + + + + {isAuthenticated && ( + + + Workspace + + + )} + + + {/* Center: Navigation (if public) */} + {!isAuthenticated && ( + + + + )} + + {/* Right: Session Controls */} + + + + + LIVE + + + + + + + ); +} diff --git a/apps/website/components/layout/AppSidebar.tsx b/apps/website/components/layout/AppSidebar.tsx new file mode 100644 index 000000000..058ae4164 --- /dev/null +++ b/apps/website/components/layout/AppSidebar.tsx @@ -0,0 +1,54 @@ +'use client'; + +import { AuthedNav } from '@/components/layout/AuthedNav'; +import { PublicNav } from '@/components/layout/PublicNav'; +import { useCurrentSession } from '@/hooks/auth/useCurrentSession'; +import { Box } from '@/ui/Box'; +import { DashboardRail } from '@/components/dashboard/DashboardRail'; +import { Text } from '@/ui/Text'; +import { Surface } from '@/ui/Surface'; +import { usePathname } from 'next/navigation'; + +export function AppSidebar() { + const pathname = usePathname(); + const { data: session } = useCurrentSession(); + const isAuthenticated = !!session; + + return ( + + + + + + + + DASHBOARD + + + + + {isAuthenticated ? ( + + ) : ( + + )} + + + + + ); +} diff --git a/apps/website/components/layout/MainContent.tsx b/apps/website/components/layout/MainContent.tsx new file mode 100644 index 000000000..ad1d5df38 --- /dev/null +++ b/apps/website/components/layout/MainContent.tsx @@ -0,0 +1,54 @@ +'use client'; + +import { Box } from '@/ui/Box'; +import { ReactNode } from 'react'; + +interface MainContentProps { + children: ReactNode; + hasSidebar: boolean; +} + +export function MainContent({ children, hasSidebar }: MainContentProps) { + return ( + + + {/* Background Grid */} + + + {/* Content */} + + {children} + + + + ); +} diff --git a/apps/website/docs/LAYOUT_RECREATION_SUMMARY.md b/apps/website/docs/LAYOUT_RECREATION_SUMMARY.md new file mode 100644 index 000000000..5680284a5 --- /dev/null +++ b/apps/website/docs/LAYOUT_RECREATION_SUMMARY.md @@ -0,0 +1,153 @@ +# Layout Recreation Summary + +## Overview +Completely recreated the application layout following the "Precision Racing Minimal" design philosophy from `docs/THEME.md`. + +## Issues Fixed + +### 1. Content Alignment +- **Issue**: Content was left-aligned instead of centered +- **Fix**: Added `alignItems="center"` to outer Box in ContentViewport +- **Result**: Content is now properly centered with `marginX="auto"` + +### 2. Dev Toolbar Positioning +- **Issue**: Dev toolbar appearing below footer +- **Fix**: Wrapped footer in Box with `position="relative"` and `zIndex={50}` +- **Result**: Footer stays at bottom, dev toolbar floats above + +### 3. Scroll Containment +- **Issue**: Nested scrollbars and improper scroll behavior +- **Fix**: Proper `overflow="hidden"` on parent, `overflowY="auto"` on content +- **Result**: Single scroll viewport, clean scrolling experience + +## Key Changes + +### 1. AppShell (`components/app/AppShell.tsx`) +- **Before**: Basic flex container with background +- **After**: + - Added `overflow="hidden"` to prevent body scroll issues + - Applied cockpit-inspired gradient background + - Ensures proper layout containment + +### 2. ControlBar (`ui/ControlBar.tsx`) +- **Before**: 48px height, basic styling +- **After**: + - Increased height to 56px for better visual presence + - Enhanced backdrop blur from `backdrop-blur-md` to `backdrop-blur-xl` + - Added subtle shadow for depth + - Added padding (px={6}) for better spacing + - Improved visual hierarchy with darker background (rgba(10, 10, 11, 0.95)) + +### 3. HeaderContentTemplate (`templates/layout/HeaderContentTemplate.tsx`) +- **Before**: Basic header layout +- **After**: + - Added horizontal padding (px={6}) for consistent spacing + - Enhanced border styling with explicit color + - Maintains clean, cockpit-inspired navigation + +### 4. ContentViewport (`ui/ContentViewport.tsx`) +- **Before**: + - Content area had its own scroll bars + - Left-aligned content + - Improper scroll containment +- **After**: + - **Fixed scroll containment**: Proper `overflow="hidden"` on parent, `overflowY="auto"` on content + - **Proper alignment**: Centered content with `marginX="auto"` and `maxWidth` + - **Clean scrolling**: Single scroll viewport, no nested scrollbars + - **Responsive**: Maintains `fullWidth` option for specific pages + - **Consistent padding**: Uses padding map for standardized spacing + +### 5. GlobalFooterTemplate (`templates/layout/GlobalFooterTemplate.tsx`) +- **Before**: Basic footer with minimal styling +- **After**: + - Increased padding (paddingY={3}, paddingX={6}) + - Darker background with transparency (rgba(10, 10, 11, 0.95)) + - Subtle top border for visual separation + - Consistent with header styling + +### 6. GlobalSidebarTemplate (`templates/layout/GlobalSidebarTemplate.tsx`) +- **Before**: Basic sidebar +- **After**: + - Enhanced gradient background (linear-gradient from #0d0d0e to #0a0a0b) + - Maintains proper sticky positioning + - Consistent with overall cockpit theme + +### 7. RootAppShellTemplate (`templates/layout/RootAppShellTemplate.tsx`) +- **Before**: Basic layout orchestration +- **After**: + - Improved overflow handling in main content area + - Removed redundant background (transparent) + - Maintains proper z-index layering + - Ensures content viewport handles scrolling correctly + +## Design Principles Applied + +### From THEME.md: +1. **Matte dark surfaces**: All components use dark backgrounds with subtle gradients +2. **Thin, crisp separators**: Borders use `var(--ui-color-border-default)` and `var(--ui-color-border-muted)` +3. **Soft blue/cyan glows**: Maintained existing accent colors (Electric Blue, Telemetry Aqua) +4. **Instrument-grade feel**: All spacing and sizing follows consistent scale +5. **Minimal visual noise**: Removed unnecessary decorations, focused on function + +### Layout Structure (Telemetry Workspace): +- **Header (ControlBar)**: Context + session controls (56px) +- **Sidebar (GlobalSidebar)**: Navigation rail (260px, sticky) +- **Main Content**: Centered, proper scrolling +- **Footer**: System status (56px) + +## Scroll Behavior Fixes + +### Before: +``` +Body scroll → Content area scroll → Nested scrollbars +``` + +### After: +``` +Body scroll disabled → Single viewport scroll +``` + +Key changes: +1. `AppShell`: `overflow="hidden"` on root +2. `ContentViewport`: Proper `overflowY="auto"` on content container +3. `RootAppShellTemplate`: Main area has `overflow="hidden"`, content has `overflowY="auto"` + +## Visual Improvements + +1. **Header**: Taller (56px vs 48px), better blur, subtle shadow +2. **Footer**: More prominent, better spacing +3. **Content**: Centered, clean scrolling, no alignment issues +4. **Sidebar**: Enhanced gradient, better visual depth +5. **Overall**: Consistent cockpit/dashboard aesthetic + +## Testing Checklist + +- [x] TypeScript compilation passes +- [x] ESLint passes with no warnings +- [x] Layout structure follows THEME.md +- [x] Scroll behavior is correct (no nested scrollbars) +- [x] Content is properly centered +- [x] Header and footer have consistent styling +- [x] Sidebar shows/hides correctly based on auth state +- [x] Responsive behavior maintained + +## Files Modified + +1. `apps/website/components/app/AppShell.tsx` +2. `apps/website/ui/ControlBar.tsx` +3. `apps/website/ui/TopNav.tsx` +4. `apps/website/ui/ContentViewport.tsx` +5. `apps/website/templates/layout/HeaderContentTemplate.tsx` +6. `apps/website/templates/layout/GlobalFooterTemplate.tsx` +7. `apps/website/templates/layout/GlobalSidebarTemplate.tsx` +8. `apps/website/templates/layout/RootAppShellTemplate.tsx` + +## Next Steps + +The layout is now ready for content implementation. All components follow the design system and provide a solid foundation for: +- Page templates +- Content components +- Interactive elements +- State management integration + +The layout respects all architecture rules and provides a clean, professional racing interface. diff --git a/apps/website/templates/HomeTemplate.tsx b/apps/website/templates/HomeTemplate.tsx index 89296eb83..6b44d1776 100644 --- a/apps/website/templates/HomeTemplate.tsx +++ b/apps/website/templates/HomeTemplate.tsx @@ -49,7 +49,7 @@ interface HomeTemplateProps { */ export function HomeTemplate({ viewData }: HomeTemplateProps) { return ( - + {/* Hero Section */} - - - - {/* Left: Identity */} - - - - // Infrastructure + + + + + © {new Date().getFullYear()} GridPilot + + + + Session ready + + + + + + + + Live - - {/* Center: Technical Links */} - - LEAGUES - TEAMS - DOCUMENTATION - - - {/* Right: System Status */} - - - - SYSTEM NOMINAL - - v1.0.0 - - - + ); -} +} \ No newline at end of file diff --git a/apps/website/templates/layout/GlobalSidebarTemplate.tsx b/apps/website/templates/layout/GlobalSidebarTemplate.tsx index 4c420df70..638fa3b8d 100644 --- a/apps/website/templates/layout/GlobalSidebarTemplate.tsx +++ b/apps/website/templates/layout/GlobalSidebarTemplate.tsx @@ -17,15 +17,30 @@ export function GlobalSidebarTemplate(_props: GlobalSidebarViewData) { const isAuthenticated = !!session; return ( - + - - - - NAVIGATION - + + + + + + DASHBOARD + + - + {isAuthenticated ? ( ) : ( @@ -36,4 +51,4 @@ export function GlobalSidebarTemplate(_props: GlobalSidebarViewData) { ); -} +} \ No newline at end of file diff --git a/apps/website/templates/layout/HeaderContentTemplate.tsx b/apps/website/templates/layout/HeaderContentTemplate.tsx index 205be0a4d..7888401eb 100644 --- a/apps/website/templates/layout/HeaderContentTemplate.tsx +++ b/apps/website/templates/layout/HeaderContentTemplate.tsx @@ -17,30 +17,45 @@ export function HeaderContentTemplate(_props: HeaderContentViewData) { const homeHref = isAuthenticated ? routes.protected.dashboard : routes.public.home; return ( - <> - + + {/* Left: Context */} + - - - - MOTORSPORT INFRASTRUCTURE - - + + {isAuthenticated && ( + + + Workspace + + + )} + {/* Center: Navigation (if public) */} {!isAuthenticated && ( )} + {/* Right: Session Controls */} - - STATUS: - OPERATIONAL - + + + + LIVE + + - + ); -} +} \ No newline at end of file diff --git a/apps/website/templates/layout/RootAppShellTemplate.tsx b/apps/website/templates/layout/RootAppShellTemplate.tsx index 20b8f18f2..bd37185c4 100644 --- a/apps/website/templates/layout/RootAppShellTemplate.tsx +++ b/apps/website/templates/layout/RootAppShellTemplate.tsx @@ -1,17 +1,15 @@ 'use client'; import { AppShell } from '@/components/app/AppShell'; +import { AppFooter } from '@/components/layout/AppFooter'; +import { AppHeader } from '@/components/layout/AppHeader'; +import { AppSidebar } from '@/components/layout/AppSidebar'; +import { MainContent } from '@/components/layout/MainContent'; import { useCurrentSession } from '@/hooks/auth/useCurrentSession'; import { routes } from '@/lib/routing/RouteConfig'; -import { Box } from '@/ui/Box'; import { ContentViewport } from '@/ui/ContentViewport'; -import { ControlBar } from '@/ui/ControlBar'; -import { TopNav } from '@/ui/TopNav'; import { usePathname } from 'next/navigation'; import React from 'react'; -import { GlobalFooterTemplate } from './GlobalFooterTemplate'; -import { GlobalSidebarTemplate } from './GlobalSidebarTemplate'; -import { HeaderContentTemplate } from './HeaderContentTemplate'; export interface RootAppShellViewData { children: React.ReactNode; @@ -20,9 +18,10 @@ export interface RootAppShellViewData { /** * RootAppShellTemplate orchestrates the top-level semantic shells of the application. * It follows the "Telemetry Workspace" structure: - * - ControlBar = header/control bar - * - DashboardRail = sidebar rail - * - ContentViewport = content area + * - AppHeader = header/control bar + * - AppSidebar = sidebar rail + * - MainContent = content area wrapper + * - AppFooter = footer */ export function RootAppShellTemplate({ children }: RootAppShellViewData) { const pathname = usePathname(); @@ -35,23 +34,19 @@ export function RootAppShellTemplate({ children }: RootAppShellViewData) { return ( - - - - - + - - {showSidebar && } - - - - {children} - - - + {showSidebar && } - + + + {children} + + + ); } diff --git a/apps/website/ui/ContentShell.tsx b/apps/website/ui/ContentShell.tsx index 2a555f579..a4906e15b 100644 --- a/apps/website/ui/ContentShell.tsx +++ b/apps/website/ui/ContentShell.tsx @@ -14,18 +14,14 @@ export const ContentShell = ({ }: ContentShellProps) => { return ( - {header && ( - - {header} - - )} + {header && {header}} {sidebar && ( {sidebar} )} - + {children} diff --git a/apps/website/ui/ContentViewport.tsx b/apps/website/ui/ContentViewport.tsx index 273088274..e8576df95 100644 --- a/apps/website/ui/ContentViewport.tsx +++ b/apps/website/ui/ContentViewport.tsx @@ -1,6 +1,5 @@ import { ReactNode } from 'react'; -import { Box } from './Box'; -import { Container } from './Container'; +import { Box, type Spacing } from './Box'; export interface ContentViewportProps { children: ReactNode; @@ -8,23 +7,25 @@ export interface ContentViewportProps { fullWidth?: boolean; } -export const ContentViewport = ({ - children, +export const ContentViewport = ({ + children, padding = 'md', - fullWidth = false + fullWidth = false, }: ContentViewportProps) => { - const paddingMap: Record = { + const paddingMap: Record, Spacing> = { none: 0, sm: 4, md: 8, lg: 12, }; + const maxWidth = fullWidth ? '100%' : '80rem'; + return ( - - + + {children} - + ); -}; +}; \ No newline at end of file diff --git a/apps/website/ui/ControlBar.tsx b/apps/website/ui/ControlBar.tsx index d0e634a1c..aa4163512 100644 --- a/apps/website/ui/ControlBar.tsx +++ b/apps/website/ui/ControlBar.tsx @@ -5,33 +5,35 @@ import { Surface } from './Surface'; export interface ControlBarProps { children: ReactNode; leftContent?: ReactNode; - variant?: 'default' | 'dark'; } -export const ControlBar = ({ - children, - leftContent, - variant = 'default' -}: ControlBarProps) => { +export const ControlBar = ({ children, leftContent }: ControlBarProps) => { return ( - - + {leftContent && ( - + {leftContent} )} - + {children} ); -}; +}; \ No newline at end of file diff --git a/apps/website/ui/MainContent.tsx b/apps/website/ui/MainContent.tsx index b4f15dc00..6a0343913 100644 --- a/apps/website/ui/MainContent.tsx +++ b/apps/website/ui/MainContent.tsx @@ -9,8 +9,8 @@ export interface MainContentProps { export const MainContent = ({ children, maxWidth = 'xl' }: MainContentProps) => { return ( - - + + {children} diff --git a/apps/website/ui/Surface.tsx b/apps/website/ui/Surface.tsx index 2ee09605f..db027c858 100644 --- a/apps/website/ui/Surface.tsx +++ b/apps/website/ui/Surface.tsx @@ -16,7 +16,7 @@ import { ThemeRadii, ThemeShadows } from './theme/Theme'; export interface SurfaceProps extends BoxProps { as?: T; children?: ReactNode; - variant?: 'default' | 'dark' | 'muted' | 'glass' | 'discord' | 'gradient-blue' | 'gradient-gold' | 'gradient-purple' | 'gradient-green' | 'discord-inner' | 'outline' | 'rarity-common' | 'rarity-rare' | 'rarity-epic' | 'rarity-legendary'; + variant?: 'default' | 'dark' | 'muted' | 'glass' | 'discord' | 'gradient-blue' | 'gradient-gold' | 'gradient-purple' | 'gradient-green' | 'discord-inner' | 'outline' | 'rarity-common' | 'rarity-rare' | 'rarity-epic' | 'rarity-legendary' | 'precision'; rounded?: keyof ThemeRadii | 'none' | '2xl'; shadow?: keyof ThemeShadows | 'none'; } @@ -36,6 +36,11 @@ export const Surface = forwardRef(( default: { backgroundColor: 'var(--ui-color-bg-surface)' }, dark: { backgroundColor: 'var(--ui-color-bg-base)' }, muted: { backgroundColor: 'var(--ui-color-bg-surface-muted)' }, + precision: { + backgroundColor: 'var(--ui-color-bg-surface)', + border: '1px solid var(--ui-color-border-default)', + boxShadow: 'inset 0 1px 0 0 rgba(255, 255, 255, 0.02)' + }, glass: { backgroundColor: 'rgba(20, 22, 25, 0.6)', backdropFilter: 'blur(12px)', diff --git a/apps/website/ui/TopNav.tsx b/apps/website/ui/TopNav.tsx index 538bba4d5..61d27e0cb 100644 --- a/apps/website/ui/TopNav.tsx +++ b/apps/website/ui/TopNav.tsx @@ -1,17 +1,17 @@ import React from 'react'; +import { Box } from './Box'; interface TopNavProps { children: React.ReactNode; - className?: string; } /** - * TopNav is a horizontal navigation container used within the AppHeader. + * TopNav is a horizontal navigation container used within the ControlBar. */ -export function TopNav({ children, className = '' }: TopNavProps) { +export function TopNav({ children }: TopNavProps) { return ( - + ); -} +} \ No newline at end of file diff --git a/apps/website/ui/theme/theme.css b/apps/website/ui/theme/theme.css index 224f30d83..ba9e476a2 100644 --- a/apps/website/ui/theme/theme.css +++ b/apps/website/ui/theme/theme.css @@ -6,6 +6,7 @@ --ui-color-border-default: #23272B; --ui-color-border-muted: rgba(35, 39, 43, 0.5); + --ui-color-border-bright: #3A3F45; --ui-color-text-high: #FFFFFF; --ui-color-text-med: #A1A1AA; @@ -16,6 +17,10 @@ --ui-color-intent-warning: #FFBE4D; --ui-color-intent-success: #6FE37A; --ui-color-intent-critical: #E35C5C; + + /* Glows */ + --ui-glow-primary: 0 0 15px rgba(25, 140, 255, 0.3); + --ui-glow-telemetry: 0 0 15px rgba(78, 212, 224, 0.3); --ui-radius-none: 0; --ui-radius-sm: 0.125rem;