diff --git a/assets/scss/_design-tokens.scss b/assets/scss/_design-tokens.scss new file mode 100644 index 0000000..d344b18 --- /dev/null +++ b/assets/scss/_design-tokens.scss @@ -0,0 +1,193 @@ +// Design Tokens for Bolt.ai Style System +// Based on consensus from multiple AI models for optimal UI transformation + +// ============================================ +// Color Palette +// ============================================ +:root { + // Primary Colors - Subtle, professional tones + --color-primary: #dc2626; // Monaco red for branding + --color-primary-light: #fef2f2; // Very light red for backgrounds + --color-primary-soft: rgba(220, 38, 38, 0.1); // Soft red for hover states + + // Background Colors + --color-bg-primary: #ffffff; + --color-bg-secondary: #f8f9fa; + --color-bg-gradient: linear-gradient(135deg, #fef2f2 0%, #ffffff 100%); + + // Glass Effects - Subtle transparency + --color-glass-white: rgba(255, 255, 255, 0.6); + --color-glass-light: rgba(255, 255, 255, 0.8); + --color-glass-dark: rgba(0, 0, 0, 0.05); + + // Text Colors + --color-text-primary: #27272a; + --color-text-secondary: #6b7280; + --color-text-muted: #9ca3af; + --color-text-white: #ffffff; + + // Status Colors + --color-success: #10b981; + --color-warning: #f59e0b; + --color-error: #ef4444; + --color-info: #3b82f6; + + // Border Colors + --color-border-light: rgba(0, 0, 0, 0.05); + --color-border-medium: rgba(0, 0, 0, 0.1); + --color-border-white: rgba(255, 255, 255, 0.2); +} + +// ============================================ +// Spacing System (8-point grid) +// ============================================ +$spacing-unit: 8px; + +$space-0: 0; +$space-1: $spacing-unit; // 8px +$space-2: $spacing-unit * 2; // 16px +$space-3: $spacing-unit * 3; // 24px +$space-4: $spacing-unit * 4; // 32px +$space-5: $spacing-unit * 5; // 40px +$space-6: $spacing-unit * 6; // 48px +$space-7: $spacing-unit * 7; // 56px +$space-8: $spacing-unit * 8; // 64px +$space-10: $spacing-unit * 10; // 80px +$space-12: $spacing-unit * 12; // 96px + +// ============================================ +// Typography Scale +// ============================================ +:root { + // Font Families + --font-primary: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + --font-mono: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace; + + // Font Sizes + --text-xs: 0.75rem; // 12px + --text-sm: 0.875rem; // 14px + --text-base: 1rem; // 16px + --text-lg: 1.125rem; // 18px + --text-xl: 1.25rem; // 20px + --text-2xl: 1.5rem; // 24px + --text-3xl: 1.875rem; // 30px + --text-4xl: 2.25rem; // 36px + --text-5xl: 3rem; // 48px + + // Font Weights + --font-normal: 400; + --font-medium: 500; + --font-semibold: 600; + --font-bold: 700; + --font-extrabold: 800; + + // Line Heights + --leading-tight: 1.25; + --leading-normal: 1.5; + --leading-relaxed: 1.75; + + // Letter Spacing + --tracking-tight: -0.02em; + --tracking-normal: 0; + --tracking-wide: 0.05em; +} + +// ============================================ +// Border Radius +// ============================================ +:root { + --radius-sm: 4px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-xl: 16px; + --radius-2xl: 24px; + --radius-full: 9999px; +} + +// ============================================ +// Shadows (Subtle, layered approach) +// ============================================ +:root { + --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05); + --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08); + --shadow-lg: 0 10px 40px rgba(0, 0, 0, 0.08); + --shadow-xl: 0 20px 60px rgba(0, 0, 0, 0.12); + --shadow-glass: 0 8px 32px rgba(0, 0, 0, 0.1); + --shadow-monaco: 0 8px 24px rgba(220, 38, 38, 0.15); +} + +// ============================================ +// Glass Effects (Reduced blur for performance) +// ============================================ +:root { + --blur-none: 0; + --blur-sm: 2px; + --blur-md: 4px; + --blur-lg: 8px; // Maximum blur, use sparingly +} + +// ============================================ +// Transitions (Consistent timing) +// ============================================ +:root { + --transition-fast: 150ms ease; + --transition-base: 200ms ease; + --transition-slow: 300ms ease; + --transition-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55); +} + +// ============================================ +// Z-Index Scale +// ============================================ +:root { + --z-base: 0; + --z-dropdown: 10; + --z-sticky: 20; + --z-overlay: 30; + --z-modal: 40; + --z-popover: 50; + --z-tooltip: 60; + --z-max: 9999; +} + +// ============================================ +// Breakpoints +// ============================================ +$breakpoint-sm: 640px; +$breakpoint-md: 768px; +$breakpoint-lg: 1024px; +$breakpoint-xl: 1280px; +$breakpoint-2xl: 1536px; + +// ============================================ +// Utility Mixins +// ============================================ +@mixin glass-effect($blur: var(--blur-sm), $bg: var(--color-glass-white)) { + background: $bg; + backdrop-filter: blur($blur); + -webkit-backdrop-filter: blur($blur); + border: 1px solid var(--color-border-white); +} + +@mixin hover-lift() { + transition: transform var(--transition-base), box-shadow var(--transition-base); + &:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-lg); + } +} + +@mixin text-gradient() { + background: var(--color-bg-gradient); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; +} + +@mixin focus-ring() { + &:focus-visible { + outline: 2px solid var(--color-primary); + outline-offset: 2px; + } +} \ No newline at end of file diff --git a/assets/scss/glass-bolt-style.scss b/assets/scss/glass-bolt-style.scss new file mode 100644 index 0000000..84c406d --- /dev/null +++ b/assets/scss/glass-bolt-style.scss @@ -0,0 +1,269 @@ +// Bolt.ai Glass Style Overrides +// Ensures all glass components use the subtle bolt.ai design system + +// Import design tokens +@import 'design-tokens'; + +// ============================================ +// GLOBAL GLASS STYLES - Bolt.ai Pattern +// ============================================ + +// All glass elements get the subtle treatment +.glass, +.glass-light, +.glass-ultra, +.glass-card, +.glass-stat-card, +.glass-dues-card, +.glass-navbar, +.glass-sidebar, +.glass-app-bar, +.glass-card-bright { + // Subtle glass effect like bolt.ai + background: rgba(255, 255, 255, 0.6) !important; + backdrop-filter: blur(4px) !important; + -webkit-backdrop-filter: blur(4px) !important; + border: 1px solid rgba(0, 0, 0, 0.05) !important; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08) !important; + + // Hover state + &:hover { + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12) !important; + transform: translateY(-2px); + } +} + +// Ultra glass variant (slightly more opaque) +.glass-ultra { + background: rgba(255, 255, 255, 0.8) !important; + backdrop-filter: blur(2px) !important; + -webkit-backdrop-filter: blur(2px) !important; +} + +// Glass Monaco soft colors +.bg-glass-monaco-soft, +.glass-monaco-soft { + background: rgba(254, 242, 242, 0.6) !important; + + &:hover { + background: rgba(254, 242, 242, 0.8) !important; + } +} + +// Border radius consistency +.rounded-glass { + border-radius: 20px !important; +} + +// ============================================ +// TEXT COLORS - Dark on Light +// ============================================ + +// Ensure text is always readable on light backgrounds +.glass, +.glass-light, +.glass-ultra, +.glass-card, +.glass-stat-card, +.glass-dues-card, +.glass-navbar, +.glass-sidebar, +.glass-card-bright { + color: var(--color-text-primary, #27272a) !important; + + h1, h2, h3, h4, h5, h6 { + color: var(--color-text-primary, #27272a) !important; + } + + p { + color: var(--color-text-secondary, #6b7280) !important; + } + + .text-gray-500 { + color: var(--color-text-muted, #9ca3af) !important; + } +} + +// ============================================ +// GRADIENT OVERRIDES - Subtle Bolt.ai Style +// ============================================ + +// Hero gradients +.hero-gradient, +.bg-gradient-monaco, +.gradient-monaco, +.text-gradient-monaco { + background: linear-gradient(135deg, #fef2f2 0%, #ffffff 100%) !important; +} + +// Monaco gradient for text +.text-gradient-monaco { + background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%) !important; + -webkit-background-clip: text !important; + background-clip: text !important; + -webkit-text-fill-color: transparent !important; +} + +// ============================================ +// BUTTON STYLES - Bolt.ai Pattern +// ============================================ + +.btn-glass, +.btn-glass-primary, +.btn-glass-secondary { + background: rgba(255, 255, 255, 0.6) !important; + backdrop-filter: blur(4px) !important; + -webkit-backdrop-filter: blur(4px) !important; + border: 1px solid rgba(0, 0, 0, 0.05) !important; + color: var(--color-text-primary, #27272a) !important; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08) !important; + + &:hover { + background: rgba(255, 255, 255, 0.8) !important; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12) !important; + transform: translateY(-1px); + } +} + +.btn-glass-primary { + border-color: rgba(220, 38, 38, 0.1) !important; + color: #dc2626 !important; + + &:hover { + background: rgba(254, 242, 242, 0.8) !important; + border-color: rgba(220, 38, 38, 0.2) !important; + } +} + +// ============================================ +// ANIMATION OVERRIDES - Simple and Subtle +// ============================================ + +.animate-fade-in { + animation: fadeIn 0.3s ease-out !important; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +// Remove complex animations +.animate-float, +.animate-bounce, +.animate-pulse-glow, +.animate-shimmer-slow { + animation: none !important; +} + +// ============================================ +// SHADOW OVERRIDES - Subtle Shadows +// ============================================ + +.shadow-glass, +.shadow-glass-hover, +.shadow-glass-lg, +.shadow-monaco, +.shadow-monaco-sm, +.shadow-monaco-intense { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08) !important; +} + +.shadow-glass-hover:hover, +.shadow-glass-lg:hover { + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12) !important; +} + +// ============================================ +// SIDEBAR SPECIFIC +// ============================================ + +.glass-sidebar { + background: rgba(255, 255, 255, 0.6) !important; + backdrop-filter: blur(4px) !important; + -webkit-backdrop-filter: blur(4px) !important; + border-right: 1px solid rgba(0, 0, 0, 0.05) !important; + box-shadow: 4px 0 12px rgba(0, 0, 0, 0.08) !important; + + .bg-glass-light { + background: rgba(255, 255, 255, 0.4) !important; + backdrop-filter: blur(2px) !important; + } +} + +// ============================================ +// GLOBAL BLUR REDUCTION +// ============================================ + +// Override any high blur values +* { + &[style*="blur(60px)"], + &[style*="blur(50px)"], + &[style*="blur(40px)"], + &[style*="blur(30px)"], + &[style*="blur(20px)"], + &[style*="blur(10px)"] { + backdrop-filter: blur(4px) !important; + -webkit-backdrop-filter: blur(4px) !important; + } +} + +// Ensure maximum blur is 8px +.backdrop-blur-3xl, +.backdrop-blur-2xl, +.backdrop-blur-xl, +.backdrop-blur-lg { + backdrop-filter: blur(4px) !important; + -webkit-backdrop-filter: blur(4px) !important; +} + +.backdrop-blur-md { + backdrop-filter: blur(4px) !important; + -webkit-backdrop-filter: blur(4px) !important; +} + +.backdrop-blur-sm { + backdrop-filter: blur(2px) !important; + -webkit-backdrop-filter: blur(2px) !important; +} + +// ============================================ +// RESPONSIVE ADJUSTMENTS +// ============================================ + +@media (max-width: 768px) { + .glass, + .glass-light, + .glass-ultra, + .glass-card { + backdrop-filter: blur(2px) !important; + -webkit-backdrop-filter: blur(2px) !important; + } +} + +// ============================================ +// PERFORMANCE OPTIMIZATIONS +// ============================================ + +// Reduce motion for better performance +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} + +// GPU acceleration for transforms +.glass, +.glass-card, +.glass-stat-card { + will-change: transform; + transform: translateZ(0); +} \ No newline at end of file diff --git a/assets/scss/main.scss b/assets/scss/main.scss index 83ea510..af396e7 100644 --- a/assets/scss/main.scss +++ b/assets/scss/main.scss @@ -1,6 +1,12 @@ // MonacoUSA Portal - Main Stylesheet // Based on design-system.md specifications +// Import design tokens for bolt.ai style +@import 'design-tokens'; + +// Import bolt.ai glass style overrides +@import 'glass-bolt-style'; + // Import component styles @import 'components/dashboards'; diff --git a/components/GlassSidebar.vue b/components/GlassSidebar.vue index 340b5c8..eb66682 100644 --- a/components/GlassSidebar.vue +++ b/components/GlassSidebar.vue @@ -249,6 +249,29 @@ const settingsItems = [ \ No newline at end of file diff --git a/components/ui/GlassCard.vue b/components/ui/GlassCard.vue index a87559b..a53e878 100644 --- a/components/ui/GlassCard.vue +++ b/components/ui/GlassCard.vue @@ -91,58 +91,34 @@ const animationConfig = { overflow: hidden; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - // Glass effect base - &::before { - content: ''; - position: absolute; - inset: 0; - border-radius: inherit; - padding: 1px; - background: linear-gradient(135deg, - rgba(255, 255, 255, 0.3) 0%, - rgba(255, 255, 255, 0.1) 100%); - -webkit-mask: - linear-gradient(#fff 0 0) content-box, - linear-gradient(#fff 0 0); - -webkit-mask-composite: xor; - mask-composite: exclude; - pointer-events: none; - } - - // Variants + // Variants - Updated to bolt.ai style with reduced blur &--light { - background: rgba(255, 255, 255, 0.7); - backdrop-filter: blur(20px) saturate(180%); - -webkit-backdrop-filter: blur(20px) saturate(180%); - border: 1px solid rgba(255, 255, 255, 0.3); + background: rgba(255, 255, 255, 0.6); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + border: 1px solid rgba(255, 255, 255, 0.2); color: #27272a; } &--dark { - background: rgba(0, 0, 0, 0.7); - backdrop-filter: blur(20px) saturate(180%); - -webkit-backdrop-filter: blur(20px) saturate(180%); - border: 1px solid rgba(255, 255, 255, 0.1); - color: #ffffff; + background: rgba(0, 0, 0, 0.05); + backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + border: 1px solid rgba(0, 0, 0, 0.1); + color: #27272a; } &--colored { - background: linear-gradient(135deg, - rgba(220, 38, 38, 0.1) 0%, - rgba(185, 28, 28, 0.05) 100%); - backdrop-filter: blur(20px) saturate(180%); - -webkit-backdrop-filter: blur(20px) saturate(180%); - border: 1px solid rgba(220, 38, 38, 0.2); + background: rgba(254, 242, 242, 0.6); + backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + border: 1px solid rgba(220, 38, 38, 0.1); color: #27272a; } &--gradient { - background: linear-gradient(135deg, - rgba(255, 255, 255, 0.8) 0%, - rgba(255, 255, 255, 0.4) 100%); - backdrop-filter: blur(20px) saturate(180%); - -webkit-backdrop-filter: blur(20px) saturate(180%); - border: 1px solid rgba(255, 255, 255, 0.4); + background: linear-gradient(135deg, #fef2f2 0%, #ffffff 100%); + border: 1px solid rgba(0, 0, 0, 0.05); color: #27272a; } @@ -205,16 +181,10 @@ const animationConfig = { } &--elevated { - box-shadow: - 0 10px 40px rgba(0, 0, 0, 0.1), - 0 2px 10px rgba(0, 0, 0, 0.05), - inset 0 1px 0 rgba(255, 255, 255, 0.5); + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08); &:hover { - box-shadow: - 0 20px 60px rgba(0, 0, 0, 0.15), - 0 4px 15px rgba(0, 0, 0, 0.08), - inset 0 1px 0 rgba(255, 255, 255, 0.6); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.12); } } @@ -231,7 +201,7 @@ const animationConfig = { font-size: 1.25rem; font-weight: 600; margin: 0; - color: #dc2626; + color: #27272a; } &__subtitle { diff --git a/components/ui/MonacoButton.vue b/components/ui/MonacoButton.vue index 7485fdd..e5a5f07 100644 --- a/components/ui/MonacoButton.vue +++ b/components/ui/MonacoButton.vue @@ -149,33 +149,30 @@ defineEmits<{ } &--glass { - background: rgba(255, 255, 255, 0.7); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.3); - color: #dc2626; - box-shadow: - 0 8px 32px rgba(0, 0, 0, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.5); + background: rgba(255, 255, 255, 0.6); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + border: 1px solid rgba(255, 255, 255, 0.2); + color: #27272a; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); &:hover:not(:disabled) { background: rgba(255, 255, 255, 0.8); - border-color: rgba(220, 38, 38, 0.2); - box-shadow: - 0 12px 40px rgba(0, 0, 0, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.6); + border-color: rgba(220, 38, 38, 0.1); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); transform: translateY(-2px); } } &--gradient { - background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%); - color: white; - box-shadow: 0 4px 14px rgba(220, 38, 38, 0.25); + background: linear-gradient(135deg, #fef2f2 0%, #ffffff 100%); + color: #dc2626; + border: 1px solid rgba(220, 38, 38, 0.1); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); &:hover:not(:disabled) { - background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); - box-shadow: 0 6px 20px rgba(220, 38, 38, 0.35); + background: linear-gradient(135deg, #fee2e2 0%, #fef2f2 100%); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); transform: translateY(-2px); } } diff --git a/pages/board/dashboard/glass.vue b/pages/board/dashboard/glass.vue index bc91c7d..a2b6a8d 100644 --- a/pages/board/dashboard/glass.vue +++ b/pages/board/dashboard/glass.vue @@ -228,31 +228,10 @@ const visibleDuesMembers = ref([