diff --git a/dist/css/styles.css b/dist/css/styles.css index fbacbb7..71d83a0 100644 --- a/dist/css/styles.css +++ b/dist/css/styles.css @@ -1,1882 +1,271 @@ -:root { - /* Color palette */ - --primary: #6366f1; - --primary-hover: #4f46e5; - --primary-light: #a5b4fc; - --primary-dark: #3730a3; - --secondary: #64748b; - --secondary-hover: #475569; - --success: #10b981; - --success-light: #a7f3d0; - --warning: #f59e0b; - --warning-light: #fef3c7; - --error: #ef4444; - --error-light: #fecaca; - --info: #3b82f6; - --info-light: #bfdbfe; - - /* Grayscale */ - --gray-50: #f8fafc; - --gray-100: #f1f5f9; - --gray-200: #e2e8f0; - --gray-300: #cbd5e1; - --gray-400: #94a3b8; - --gray-500: #64748b; - --gray-600: #475569; - --gray-700: #334155; - --gray-800: #1e293b; - --gray-900: #0f172a; - - /* Text colors */ - --text-primary: var(--gray-900); - --text-secondary: var(--gray-600); - --text-tertiary: var(--gray-500); - --text-muted: var(--gray-400); - - /* Background colors */ - --bg-primary: #fff; - --bg-secondary: var(--gray-50); - --bg-tertiary: var(--gray-100); - --bg-elevated: #fff; - - /* Borders */ - --border-primary: var(--gray-200); - --border-secondary: var(--gray-300); - --border-focus: var(--primary); - - /* Spacing scale */ - --space-px: 1px; - --space-0-5: 0.125rem; - --space-1: 0.25rem; - --space-1-5: 0.375rem; - --space-2: 0.5rem; - --space-2-5: 0.625rem; - --space-3: 0.75rem; - --space-3-5: 0.875rem; - --space-4: 1rem; - --space-5: 1.25rem; - --space-6: 1.5rem; - --space-7: 1.75rem; - --space-8: 2rem; - --space-9: 2.25rem; - --space-10: 2.5rem; - --space-11: 2.75rem; - --space-12: 3rem; - --space-14: 3.5rem; - --space-16: 4rem; - --space-20: 5rem; - --space-24: 6rem; - --space-28: 7rem; - --space-32: 8rem; - - /* Typography */ - --text-xs: 0.75rem; - --text-sm: 0.875rem; - --text-base: 1rem; - --text-lg: 1.125rem; - --text-xl: 1.25rem; - --text-2xl: 1.5rem; - --text-3xl: 1.875rem; - --text-4xl: 2.25rem; - --text-5xl: 3rem; - --text-6xl: 3.75rem; - --text-7xl: 4.5rem; - --text-8xl: 6rem; - --text-9xl: 8rem; - - --font-thin: 100; - --font-extralight: 200; - --font-light: 300; - --font-normal: 400; - --font-medium: 500; - --font-semibold: 600; - --font-bold: 700; - --font-extrabold: 800; - --font-black: 900; - - /* Radius */ - --radius-none: 0; - --radius-sm: 0.125rem; - --radius-base: 0.25rem; - --radius-md: 0.375rem; - --radius-lg: 0.5rem; - --radius-xl: 0.75rem; - --radius-2xl: 1rem; - --radius-3xl: 1.5rem; - --radius-full: 9999px; - - /* Shadows */ - --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); - --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); - --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); - --shadow-focus: 0 0 0 3px rgb(99 102 241 / 0.1); - - /* Transitions */ - --transition-all: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); - --transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1); - --transition-normal: 0.2s cubic-bezier(0.4, 0, 0.2, 1); - --transition-slow: 0.3s cubic-bezier(0.4, 0, 0.2, 1); - --transition-bounce: 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55); - - /* Layout */ - --container-max-width: 1280px; - --header-height: 4.5rem; - --content-max-width: 65ch; - - /* Z-index */ - --z-hide: -1; - --z-auto: auto; - --z-base: 0; - --z-docked: 10; - --z-dropdown: 1000; - --z-sticky: 1020; - --z-banner: 1030; - --z-overlay: 1040; - --z-modal: 1050; - --z-popover: 1060; - --z-skiplink: 1070; - --z-toast: 1080; - --z-tooltip: 1090; -} - -[data-theme="dark"] { - --text-primary: var(--gray-50); - --text-secondary: var(--gray-300); - --text-tertiary: var(--gray-400); - --text-muted: var(--gray-500); - --bg-primary: var(--gray-900); - --bg-secondary: var(--gray-800); - --bg-tertiary: var(--gray-700); - --bg-elevated: var(--gray-800); - --border-primary: var(--gray-700); - --border-secondary: var(--gray-600); - --border-focus: var(--primary-light); - --primary: #818cf8; - --primary-hover: #a5b4fc; - --primary-light: #c7d2fe; - --primary-dark: #6366f1; - --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.3); - --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.4); - --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4); - --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.4); - --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.4); - --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.6); - --shadow-focus: 0 0 0 3px rgb(129 140 248 / 0.2); -} - -/* Reset & Base Styles */ -*, ::before, ::after { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -html { - scroll-behavior: smooth; - font-size: 16px; - line-height: 1.6; - -webkit-text-size-adjust: 100%; -} - -body { - font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - font-feature-settings: 'cv01', 'cv03', 'cv04', 'cv11'; - font-variation-settings: 'opsz' 32; - background-color: var(--bg-primary); - color: var(--text-primary); - transition: background-color var(--transition-normal), color var(--transition-normal); - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; - min-height: 100vh; - overflow-x: hidden; -} - -/* Focus Styles */ -:focus { - outline: 2px solid var(--border-focus); - outline-offset: 2px; -} - -:focus:not(:focus-visible) { - outline: none; -} - -:focus-visible { - outline: 2px solid var(--border-focus); - outline-offset: 2px; -} - -/* Typography */ -h1, h2, h3, h4, h5, h6 { - font-weight: var(--font-bold); - line-height: 1.25; - letter-spacing: -0.025em; - color: var(--text-primary); -} - -h1 { - font-size: var(--text-4xl); - font-weight: var(--font-extrabold); -} - -h2 { - font-size: var(--text-3xl); - font-weight: var(--font-bold); -} - -h3 { - font-size: var(--text-2xl); - font-weight: var(--font-semibold); -} - -p { - line-height: 1.75; - margin-bottom: var(--space-4); -} - -a { - color: var(--primary); - text-decoration: none; - transition: var(--transition-all); -} - -a:hover { - color: var(--primary-hover); - text-decoration: none; -} - -/* Layout Components */ -.page-wrapper { - min-height: 100vh; - display: flex; - flex-direction: column; - position: relative; -} - -.container { - max-width: var(--container-max-width); - margin: 0 auto; - padding: 0 var(--space-6); - width: 100%; -} - -.main-content { - flex: 1; - position: relative; -} - -/* Header */ -.site-header { - position: sticky; - top: 0; - z-index: var(--z-sticky); - background: rgb(255 255 255 / 0.8); - backdrop-filter: blur(20px) saturate(180%); - border-bottom: 1px solid var(--border-primary); - height: var(--header-height); - transition: var(--transition-all); -} - -[data-theme="dark"] .site-header { - background: rgb(15 23 42 / 0.8); -} - -.header-content { - display: flex; - align-items: center; - justify-content: space-between; - height: var(--header-height); - gap: var(--space-8); -} - -.site-title { - display: flex; - align-items: center; - gap: var(--space-2); - font-size: var(--text-xl); - font-weight: var(--font-bold); - color: var(--text-primary); - text-decoration: none; - transition: var(--transition-all); - position: relative; -} - -.site-title:hover { - color: var(--primary); - transform: translateY(-1px); -} - -.site-title:focus-visible { - border-radius: var(--radius-md); - padding: var(--space-1) var(--space-2); - margin: calc(-1 * var(--space-1)) calc(-1 * var(--space-2)); -} - -.logo-icon { - font-size: var(--text-2xl); - filter: drop-shadow(0 2px 4px rgb(99 102 241 / 0.2)); - transition: var(--transition-all); -} - -.site-title:hover .logo-icon { - transform: rotate(-5deg) scale(1.1); -} - -.header-nav { - display: flex; - align-items: center; - gap: var(--space-6); -} - -.nav-link { - position: relative; - display: inline-flex; - align-items: center; - padding: var(--space-2) var(--space-3); - font-size: var(--text-sm); - font-weight: var(--font-medium); - color: var(--text-secondary); - text-decoration: none; - border-radius: var(--radius-lg); - transition: var(--transition-all); - white-space: nowrap; -} - -.nav-link::before { - content: ''; - position: absolute; - bottom: -2px; - left: 50%; - width: 0; - height: 2px; - background: var(--primary); - border-radius: var(--radius-full); - transition: var(--transition-all); - transform: translateX(-50%); -} - -.nav-link:hover { - color: var(--primary); - background: var(--bg-secondary); - transform: translateY(-1px); -} - -.nav-link:hover::before { - width: 70%; -} - -.nav-link:focus-visible { - box-shadow: var(--shadow-focus); -} - -.dark-mode-toggle { - display: flex; - align-items: center; - justify-content: center; - width: 2.75rem; - height: 2.75rem; - border: 2px solid var(--border-primary); - border-radius: var(--radius-full); - background: var(--bg-primary); - color: var(--text-primary); - cursor: pointer; - transition: var(--transition-all); - position: relative; - overflow: hidden; -} - -.dark-mode-toggle:hover { - background: var(--bg-secondary); - border-color: var(--primary); - transform: scale(1.05); - box-shadow: var(--shadow-md); -} - -.dark-mode-toggle:focus-visible { - box-shadow: var(--shadow-focus); -} - -.sun-icon, -.moon-icon { - transition: var(--transition-all); - position: absolute; -} - -.moon-icon { - display: none; - transform: rotate(180deg); -} - -[data-theme="dark"] .sun-icon { - display: none; -} - -[data-theme="dark"] .moon-icon { - display: block; - transform: rotate(0deg); -} - -/* Hero Section */ -.hero-section { - position: relative; - padding: var(--space-24) 0 var(--space-20); - background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); - overflow: hidden; -} - -.hero-section::before { - content: ''; - position: absolute; - inset: 0; - background: radial-gradient(circle at 30% 20%, rgb(99 102 241 / 0.1) 0%, transparent 50%), - radial-gradient(circle at 70% 80%, rgb(99 102 241 / 0.05) 0%, transparent 50%); - pointer-events: none; -} - -[data-theme="dark"] .hero-section { - background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); -} - -[data-theme="dark"] .hero-section::before { - background: radial-gradient(circle at 30% 20%, rgb(129 140 248 / 0.15) 0%, transparent 50%), - radial-gradient(circle at 70% 80%, rgb(129 140 248 / 0.08) 0%, transparent 50%); -} - -.hero-content { - text-align: center; - max-width: 900px; - margin: 0 auto; - position: relative; - z-index: 1; - animation: fadeInUp 0.8s ease-out; -} - -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.hero-title { - font-size: clamp(var(--text-3xl), 8vw, var(--text-6xl)); - font-weight: var(--font-extrabold); - line-height: 1.1; - margin: 0 0 var(--space-6); - color: var(--text-primary); - letter-spacing: -0.02em; -} - -.gradient-text { - background: linear-gradient(135deg, var(--primary) 0%, #8b5cf6 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - position: relative; -} - -[data-theme="dark"] .gradient-text { - background: linear-gradient(135deg, var(--primary-light) 0%, #c4b5fd 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.hero-description { - font-size: clamp(var(--text-lg), 4vw, var(--text-xl)); - color: var(--text-secondary); - margin: 0 0 var(--space-10); - max-width: 650px; - margin-left: auto; - margin-right: auto; - line-height: 1.6; -} - -.hero-actions { - display: flex; - gap: var(--space-4); - justify-content: center; - margin-bottom: var(--space-16); - flex-wrap: wrap; -} - -.hero-stats { - display: flex; - gap: var(--space-12); - justify-content: center; - flex-wrap: wrap; -} - -.stat-item { - text-align: center; - position: relative; -} - -.stat-item:not(:last-child)::after { - content: ''; - position: absolute; - right: calc(-1 * var(--space-6)); - top: 50%; - transform: translateY(-50%); - width: 1px; - height: 40px; - background: var(--border-primary); -} - -.stat-number { - display: block; - font-size: clamp(var(--text-2xl), 6vw, var(--text-4xl)); - font-weight: var(--font-extrabold); - color: var(--primary); - margin-bottom: var(--space-1); - background: linear-gradient(135deg, var(--primary) 0%, #8b5cf6 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.stat-label { - font-size: var(--text-sm); - color: var(--text-secondary); - text-transform: uppercase; - letter-spacing: 0.1em; - font-weight: var(--font-medium); -} - -/* Buttons */ -.btn { - display: inline-flex; - align-items: center; - gap: var(--space-2); - padding: var(--space-4) var(--space-8); - border: 2px solid transparent; - border-radius: var(--radius-xl); - font-size: var(--text-base); - font-weight: var(--font-semibold); - text-decoration: none; - cursor: pointer; - transition: var(--transition-all); - white-space: nowrap; - position: relative; - overflow: hidden; - text-align: center; - min-width: 140px; - justify-content: center; -} - -.btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgb(255 255 255 / 0.2), transparent); - transition: left 0.5s; -} - -.btn:hover::before { - left: 100%; -} - -.btn-primary { - background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); - color: #fff; - box-shadow: var(--shadow-md); -} - -.btn-primary:hover { - background: linear-gradient(135deg, var(--primary-hover) 0%, var(--primary) 100%); - transform: translateY(-2px); - box-shadow: var(--shadow-lg); -} - -.btn-primary:focus-visible { - box-shadow: var(--shadow-focus), var(--shadow-lg); -} - -.btn-secondary { - background: transparent; - color: var(--text-primary); - border: 2px solid var(--border-primary); -} - -.btn-secondary:hover { - border-color: var(--primary); - color: var(--primary); - background: var(--bg-secondary); - transform: translateY(-2px); - box-shadow: var(--shadow-md); -} - -.btn-secondary:focus-visible { - box-shadow: var(--shadow-focus); -} - -/* Quick Navigation */ -.quick-nav { - padding: var(--space-20) 0; - background: var(--bg-primary); - position: relative; -} - -.quick-nav-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: var(--space-8); -} - -.quick-nav-card { - display: block; - padding: var(--space-8); - background: var(--bg-elevated); - border: 2px solid var(--border-primary); - border-radius: var(--radius-2xl); - text-decoration: none; - transition: var(--transition-all); - position: relative; - overflow: hidden; - box-shadow: var(--shadow-sm); - backdrop-filter: blur(10px); -} - -.quick-nav-card::before { - content: ''; - position: absolute; - inset: 0; - background: linear-gradient(135deg, var(--primary) 0%, transparent 100%); - opacity: 0; - transition: var(--transition-all); - z-index: 0; -} - -.quick-nav-card:hover::before { - opacity: 0.08; -} - -.quick-nav-card:hover { - border-color: var(--primary); - transform: translateY(-6px) scale(1.02); - box-shadow: var(--shadow-xl); -} - -.quick-nav-card:focus-visible { - box-shadow: var(--shadow-focus), var(--shadow-lg); -} - -.quick-nav-card > * { - position: relative; - z-index: 1; -} - -.quick-nav-icon { - font-size: var(--text-4xl); - margin-bottom: var(--space-4); - display: block; - filter: drop-shadow(0 2px 4px rgb(0 0 0 / 0.1)); - transition: var(--transition-all); -} - -.quick-nav-card:hover .quick-nav-icon { - transform: scale(1.1) rotate(-5deg); -} - -.quick-nav-card h3 { - margin: 0 0 var(--space-3); - font-size: var(--text-xl); - font-weight: var(--font-bold); - color: var(--text-primary); -} - -.quick-nav-card p { - margin: 0; - color: var(--text-secondary); - font-size: var(--text-base); - line-height: 1.6; -} - -.quick-nav-card a:hover { - text-decoration: none; -} +/* Quick nav */ +.quick-nav{padding:var(--space-20) 0;background:var(--bg-primary);position:relative;content-visibility:auto;contain-intrinsic-size:1px 600px;} +.quick-nav-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--space-8);} +.quick-nav-card{ + display:block;padding:var(--space-8);background:var(--bg-elevated);border:2px solid var(--border-primary);border-radius:var(--radius-2xl); + text-decoration:none;position:relative;overflow:hidden;box-shadow:var(--shadow-sm);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px); + transition:background-color var(--transition-normal),border-color var(--transition-normal),transform var(--transition-normal),box-shadow var(--transition-normal),opacity var(--transition-normal); + content-visibility:auto;contain:content; +} +.quick-nav-card::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,var(--primary) 0%,transparent 100%);opacity:0;transition:opacity var(--transition-normal);z-index:0;} +.quick-nav-card:hover::before{opacity:.08;} +.quick-nav-card:hover{border-color:var(--primary);transform:translateY(-6px) scale(1.02);box-shadow:var(--shadow-lg);} +.quick-nav-card:focus-visible{box-shadow:var(--shadow-focus),var(--shadow-lg);} +.quick-nav-card>*{position:relative;z-index:1;} +.quick-nav-icon{font-size:var(--text-4xl);margin-bottom:var(--space-4);display:block;filter:drop-shadow(0 2px 4px rgb(0 0 0 / .1));transition:transform var(--transition-normal),filter var(--transition-normal);} +.quick-nav-card:hover .quick-nav-icon{transform:scale(1.1) rotate(-5deg);} +.quick-nav-card h3{margin:0 0 var(--space-3);font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--text-primary);} +.quick-nav-card p{margin:0;color:var(--text-secondary);font-size:var(--text-base);line-height:1.6;} +.quick-nav-card a:hover{text-decoration:none;} /* Sections */ -.section { - padding: var(--space-24) 0; - position: relative; -} +.section{padding:var(--space-24) 0;position:relative;content-visibility:auto;contain-intrinsic-size:1px 800px;} +.section:nth-child(even){background:var(--bg-secondary);} +.section-header{text-align:center;margin-bottom:var(--space-20);animation:fadeInUp .6s ease-out;} +.section-title{font-size:clamp(var(--text-3xl),6vw,var(--text-5xl));font-weight:var(--font-extrabold);margin:0 0 var(--space-6);color:var(--text-primary);letter-spacing:-.02em;} +.section-description{font-size:clamp(var(--text-base),3vw,var(--text-xl));color:var(--text-secondary);margin:0;max-width:700px;margin-inline:auto;line-height:1.7;} -.section:nth-child(even) { - background: var(--bg-secondary); +/* Tables */ +.data-table-container{ + background:var(--bg-elevated);border-radius:var(--radius-2xl);box-shadow:var(--shadow-lg); + border:1px solid var(--border-primary);margin:var(--space-8) 0;position:relative;overflow:hidden; + -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px); } - -.section-header { - text-align: center; - margin-bottom: var(--space-20); - animation: fadeInUp 0.6s ease-out; +.table-wrapper{ + overflow-x:auto;overflow-y:visible;border-radius:var(--radius-2xl);-webkit-overflow-scrolling:touch; + scrollbar-width:thin;scrollbar-color:var(--primary) var(--bg-secondary); } - -.section-title { - font-size: clamp(var(--text-3xl), 6vw, var(--text-5xl)); - font-weight: var(--font-extrabold); - margin: 0 0 var(--space-6); - color: var(--text-primary); - letter-spacing: -0.02em; +.table-wrapper::-webkit-scrollbar{height:10px;} +.table-wrapper::-webkit-scrollbar-track{background:var(--bg-secondary);border-radius:var(--radius-md);} +.table-wrapper::-webkit-scrollbar-thumb{background:var(--primary);border-radius:var(--radius-md);border:2px solid var(--bg-secondary);} +.table-wrapper::-webkit-scrollbar-thumb:hover{background:var(--primary-hover);} +table{width:100%;border-collapse:collapse;font-size:var(--text-sm);min-width:600px;} +th,td{padding:var(--space-4) var(--space-6);text-align:left;border-bottom:1px solid var(--border-primary);white-space:nowrap;} +th{ + background:var(--primary);color:#fff;font-weight:var(--font-semibold);text-transform:uppercase;letter-spacing:.05em;font-size:var(--text-xs); + position:sticky;top:0;z-index:var(--z-sticky); } - -.section-description { - font-size: clamp(var(--text-base), 3vw, var(--text-xl)); - color: var(--text-secondary); - margin: 0; - max-width: 700px; - margin-inline: auto; - line-height: 1.7; -} - -/* Data Tables */ -.data-table-container { - background: var(--bg-elevated); - border-radius: var(--radius-2xl); - box-shadow: var(--shadow-xl); - border: 1px solid var(--border-primary); - margin: var(--space-8) 0; - position: relative; - overflow: hidden; - backdrop-filter: blur(10px); -} - -.table-wrapper { - overflow-x: auto; - overflow-y: visible; - border-radius: var(--radius-2xl); - -webkit-overflow-scrolling: touch; - scrollbar-width: thin; - scrollbar-color: var(--primary) var(--bg-secondary); -} - -.table-wrapper::-webkit-scrollbar { - height: 10px; -} - -.table-wrapper::-webkit-scrollbar-track { - background: var(--bg-secondary); - border-radius: var(--radius-md); -} - -.table-wrapper::-webkit-scrollbar-thumb { - background: var(--primary); - border-radius: var(--radius-md); - border: 2px solid var(--bg-secondary); -} - -.table-wrapper::-webkit-scrollbar-thumb:hover { - background: var(--primary-hover); -} - -table { - width: 100%; - border-collapse: collapse; - font-size: var(--text-sm); - min-width: 600px; -} - -th, -td { - padding: var(--space-4) var(--space-6); - text-align: left; - border-bottom: 1px solid var(--border-primary); - white-space: nowrap; -} - -th { - background: var(--primary); - color: #fff; - font-weight: var(--font-semibold); - text-transform: uppercase; - letter-spacing: 0.05em; - font-size: var(--text-xs); - position: sticky; - top: 0; - z-index: var(--z-sticky); -} - -th:first-child { - position: sticky; - left: 0; - z-index: calc(var(--z-sticky) + 1); - background: var(--primary); -} - -tr:hover { - background: var(--bg-secondary); -} - -td { - transition: all var(--transition-fast); -} - -td:first-child { - font-weight: var(--font-medium); - position: sticky; - left: 0; - background: var(--bg-primary); - z-index: 1; -} - -tr:hover td:first-child { - background: var(--bg-secondary); -} - -.status-cell { - text-align: center !important; -} - -.status-indicator { - display: inline-flex; - align-items: center; - justify-content: center; - width: 24px; - height: 24px; - border-radius: var(--radius-full); - transition: all var(--transition-fast); -} - -.status-indicator.supported { - background: rgb(14 236 162 / 0.1); - color: var(--success); -} - -.status-indicator.not-supported { - background: rgb(211 29 29 / 0.1); - color: var(--error); -} - -.status-indicator svg { - width: 16px; - height: 16px; +th:first-child{position:sticky;left:0;z-index:calc(var(--z-sticky) + 1);background:var(--primary);background-clip:padding-box;} +tr:hover{background:var(--bg-secondary);} +td{transition:background-color var(--transition-fast),color var(--transition-fast);} +td:first-child{ + font-weight:var(--font-medium);position:sticky;left:0;background:var(--bg-primary);z-index:1;background-clip:padding-box;box-shadow:inset -1px 0 0 var(--border-primary); } +tr:hover td:first-child{background:var(--bg-secondary);} +.status-cell{text-align:center!important;} +.status-indicator{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:var(--radius-full);transition:background-color var(--transition-fast),color var(--transition-fast),transform var(--transition-fast);} +.status-indicator.supported{background:rgb(14 236 162 / .1);color:var(--success);} +.status-indicator.not-supported{background:rgb(211 29 29 / .1);color:var(--error);} +.status-indicator svg{width:16px;height:16px;} /* Search */ -.search-section { - margin-bottom: var(--space-8); -} - -.search-container.enhanced { - position: relative; - max-width: 500px; - margin: 0 auto; -} - -.search-icon { - position: absolute; - left: var(--space-4); - top: 50%; - transform: translateY(-50%); - color: var(--text-tertiary); - z-index: 1; -} - -.search-input { - width: 100%; - padding: var(--space-4) var(--space-12) var(--space-4) var(--space-12); - border: 2px solid var(--border-primary); - border-radius: var(--radius-full); - font-size: var(--text-base); - background: var(--bg-primary); - color: var(--text-primary); - transition: all var(--transition-fast); - outline: none; -} - -.search-input:focus { - border-color: var(--primary); - box-shadow: 0 0 0 3px rgb(99 102 241 / 0.1); -} - -.clear-icon { - position: absolute; - right: var(--space-4); - top: 50%; - transform: translateY(-50%); - background: none; - border: none; - color: var(--text-tertiary); - cursor: pointer; - padding: var(--space-1); - border-radius: var(--radius-md); - transition: all var(--transition-fast); - opacity: 0; - visibility: hidden; -} - -.search-input:not(:placeholder-shown) + .clear-icon, -.search-input:focus + .clear-icon { - opacity: 1; - visibility: visible; -} - -.clear-icon:hover { - background: var(--bg-secondary); - color: var(--text-primary); -} - -.search-results { - text-align: center; - padding: var(--space-2) 0; - color: var(--text-secondary); - font-size: var(--text-sm); - margin-bottom: var(--space-4); -} - -/* Comparison */ -.compare-controls { - display: flex; - align-items: end; - gap: var(--space-6); - margin-bottom: var(--space-12); - flex-wrap: wrap; -} - -.compare-select-group { - flex: 1; - min-width: 200px; -} - -.compare-select-group label { - display: block; - margin-bottom: var(--space-2); - font-weight: var(--font-medium); - color: var(--text-primary); -} - -.select-wrapper { - position: relative; -} - -.select-wrapper::after { - content: ''; - position: absolute; - right: var(--space-4); - top: 50%; - transform: translateY(-50%); - width: 0; - height: 0; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid var(--text-tertiary); - pointer-events: none; -} - -select { - width: 100%; - padding: var(--space-3) var(--space-8) var(--space-3) var(--space-4); - border: 2px solid var(--border-primary); - border-radius: var(--radius-lg); - background: var(--bg-primary); - color: var(--text-primary); - font-size: var(--text-base); - cursor: pointer; - appearance: none; - transition: all var(--transition-fast); -} - -select:focus { - outline: none; - border-color: var(--primary); - box-shadow: 0 0 0 3px rgb(99 102 241 / 0.1); -} - -.compare-vs { - flex-shrink: 0; - font-size: var(--text-lg); - font-weight: var(--font-bold); - color: var(--primary); - background: var(--bg-secondary); - padding: var(--space-3) var(--space-4); - border-radius: var(--radius-lg); - border: 2px solid var(--border-primary); - margin-bottom: var(--space-2); -} - -#compare-table-container { - position: relative; - background: var(--bg-primary); - border-radius: var(--radius-xl); - box-shadow: var(--shadow-lg); - border: 1px solid var(--border-primary); - margin-top: var(--space-6); - display: none; -} - -.comparison-visible { - display: block !important; - animation: slideIn 0.3s ease-out; -} - -.comparison-hiding { - animation: slideOut 0.3s ease-in; -} - -@keyframes slideIn { - from { - opacity: 0; - transform: translateY(-20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes slideOut { - from { - opacity: 1; - transform: translateY(0); - } - to { - opacity: 0; - transform: translateY(-20px); - } -} - -.comparison-header { - padding: var(--space-6); - border-bottom: 1px solid var(--border-primary); - background: var(--bg-secondary); - border-radius: var(--radius-xl) var(--radius-xl) 0 0; -} - -.comparison-header h3 { - margin: 0 0 var(--space-4); - font-size: var(--text-2xl); - font-weight: var(--font-bold); - color: var(--text-primary); - text-align: center; -} - -.comparison-stats { - display: flex; - gap: var(--space-6); - justify-content: center; - margin-bottom: var(--space-6); - flex-wrap: wrap; -} - -.comparison-stats .stat { - text-align: center; - background: var(--bg-primary); - padding: var(--space-3) var(--space-4); - border-radius: var(--radius-lg); - border: 1px solid var(--border-primary); - min-width: 100px; -} - -.stat-label { - display: block; - font-size: var(--text-xs); - color: var(--text-secondary); - text-transform: uppercase; - letter-spacing: 0.05em; - margin-bottom: var(--space-1); -} - -.stat-value { - display: block; - font-size: var(--text-xl); - font-weight: var(--font-bold); - color: var(--primary); -} - -.comparison-actions { - display: flex; - justify-content: center; - gap: var(--space-3); -} - -.comparison-filters { - padding: var(--space-4) var(--space-6); - background: var(--bg-tertiary); - border-bottom: 1px solid var(--border-primary); - display: flex; - gap: var(--space-6); - justify-content: center; - flex-wrap: wrap; -} - -.filter-option { - display: flex; - align-items: center; - gap: var(--space-2); - cursor: pointer; - font-size: var(--text-sm); - font-weight: var(--font-medium); - color: var(--text-primary); -} - -.filter-option input[type="radio"] { - margin: 0; -} - -.filter-results { - text-align: center; - padding: var(--space-2) 0; - color: var(--text-secondary); - font-size: var(--text-sm); - background: var(--bg-secondary); - border-bottom: 1px solid var(--border-primary); -} - -.comparison-table { - width: 100%; - border-collapse: collapse; - font-size: var(--text-sm); - min-width: 700px; -} - -.comparison-table th, -.comparison-table td { - padding: var(--space-4) var(--space-6); - border-bottom: 1px solid var(--border-primary); - text-align: center; -} - -.comparison-table th:first-child, -.comparison-table td:first-child { - text-align: left; - font-weight: var(--font-medium); -} - -.comparison-table th { - background: var(--primary); - color: #fff; - font-weight: var(--font-semibold); - text-transform: uppercase; - letter-spacing: 0.05em; - font-size: var(--text-xs); - position: sticky; - top: 0; - z-index: var(--z-sticky); -} - -.provider-header { - position: relative; -} - -.comparison-row.both-supported { - background: rgb(16 185 129 / 0.05); -} - -.comparison-row.provider1-only { - background: rgb(59 130 246 / 0.05); -} - -.comparison-row.provider2-only { - background: rgb(168 85 247 / 0.05); -} - -.comparison-row.neither-supported { - background: rgb(239 68 68 / 0.05); -} - -.status-badge { - display: inline-block; - padding: var(--space-1) var(--space-3); - border-radius: var(--radius-full); - font-size: var(--text-xs); - font-weight: var(--font-medium); - text-transform: uppercase; - letter-spacing: 0.05em; -} - -.status-badge.both-supported { - background: rgb(16 185 129 / 0.1); - color: var(--success); -} - -.status-badge.provider1-only { - background: rgb(59 130 246 / 0.1); - color: var(--info); -} - -.status-badge.provider2-only { - background: rgb(168 85 247 / 0.1); - color: #8b5cf6; -} - -.status-badge.neither-supported { - background: rgb(239 68 68 / 0.1); - color: var(--error); -} - -#close-compare { - background: var(--bg-primary); - border: 1px solid var(--border-primary); - border-radius: var(--radius-lg); - padding: var(--space-2) var(--space-4); - display: flex; - align-items: center; - gap: var(--space-2); - cursor: pointer; - transition: all var(--transition-fast); - font-size: var(--text-sm); - color: var(--text-primary); - font-weight: var(--font-medium); -} - -#close-compare:hover { - background: var(--error); - color: #fff; - border-color: var(--error); - transform: translateY(-1px); -} - -.empty-state { - text-align: center; - padding: var(--space-16); -} - -.empty-state-icon { - font-size: var(--text-5xl); - margin-bottom: var(--space-4); -} - -.empty-state h3 { - margin: 0 0 var(--space-2); - font-size: var(--text-xl); - color: var(--text-primary); -} - -.empty-state p { - margin: 0; - color: var(--text-secondary); -} - -.warning-state { - text-align: center; - padding: var(--space-12); - background: rgb(245 158 11 / 0.05); - border-radius: var(--radius-lg); - border: 1px solid rgb(245 158 11 / 0.2); -} - -.warning-icon { - font-size: var(--text-4xl); - margin-bottom: var(--space-3); -} - -.warning-state h3 { - margin: 0 0 var(--space-2); - color: var(--warning); -} - -.warning-state p { - margin: 0; - color: var(--text-secondary); -} - -.alert { - display: flex; - align-items: flex-start; - gap: var(--space-3); - padding: var(--space-4); - border-radius: var(--radius-lg); - margin: var(--space-4) 0; -} - -.alert-info { - background: rgb(59 130 246 / 0.1); - border: 1px solid rgb(59 130 246 / 0.2); - color: var(--info); -} - -.alert-icon { - flex-shrink: 0; - margin-top: 2px; -} -/* Referral Section */ -.referral-section { - margin-block: var(--space-16); - padding: var(--space-8); - background: var(--bg-secondary); - border-radius: var(--radius-xl); - border: 1px solid var(--border-primary); - text-align: center; -} - -.referral-header h3 { - margin: 0 0 var(--space-2); - color: var(--text-primary); - font-size: var(--text-2xl); - font-weight: var(--font-bold); -} - -.referral-header p { - margin: 0 auto var(--space-6); - color: var(--text-secondary); - max-width: var(--content-max-width); -} - -.referral-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: var(--space-4); - justify-items: center; -} - -.referral-card { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: var(--space-2); - padding: var(--space-4) var(--space-3); - background: var(--bg-primary); - border: 1px solid var(--border-primary); - border-radius: var(--radius-lg); - text-decoration: none; - transition: var(--transition-all); - width: 100%; - max-width: 200px; - box-shadow: var(--shadow-sm); -} - -.referral-card:hover { - border-color: var(--primary); - transform: translateY(-2px); - box-shadow: var(--shadow-md); -} - -.service-name { - font-weight: var(--font-semibold); - color: var(--text-primary); - font-size: var(--text-base); -} - -.referral-badge { - font-size: var(--text-xs); - color: var(--primary); - background: rgb(99 102 241 / 0.1); - padding: var(--space-1) var(--space-2); - border-radius: var(--radius-md); - font-weight: var(--font-medium); -} - -.service-name { - font-weight: var(--font-medium); - color: var(--text-primary); -} - -.status-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: var(--space-6); -} - -.status-card { - display: block; - padding: var(--space-6); - background: var(--bg-primary); - border: 1px solid var(--border-primary); - border-radius: var(--radius-xl); - text-decoration: none; - transition: all var(--transition-normal); -} - -.status-card:hover { - border-color: var(--primary); - transform: translateY(-2px); - box-shadow: var(--shadow-lg); -} - -.status-header { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: var(--space-3); -} - -.service-status-indicator { - width: 12px; - height: 12px; - border-radius: var(--radius-full); - background: var(--success); - box-shadow: 0 0 0 2px rgb(16 185 129 / 0.2); -} - -.status-indicator.online { - background: var(--success); - box-shadow: 0 0 0 2px rgb(16 185 129 / 0.2); -} - -.status-card p { - margin: 0; - color: var(--text-secondary); - font-size: var(--text-sm); -} - -.loading-state { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: var(--space-12); - color: var(--text-secondary); -} - -.loading-spinner { - width: 32px; - height: 32px; - border: 3px solid var(--border-primary); - border-top: 3px solid var(--primary); - border-radius: var(--radius-full); - animation: spin 1s linear infinite; - margin-bottom: var(--space-4); -} - -@keyframes spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} +.search-section{margin-bottom:var(--space-8);} +.search-container.enhanced{position:relative;max-width:500px;margin:0 auto;} +.search-icon{position:absolute;left:var(--space-4);top:50%;transform:translateY(-50%);color:var(--text-tertiary);z-index:1;} +.search-input{ + width:100%;padding:var(--space-4) var(--space-12) var(--space-4) var(--space-12); + border:2px solid var(--border-primary);border-radius:var(--radius-full);font-size:var(--text-base); + background:var(--bg-primary);color:var(--text-primary);outline:none; + transition:border-color var(--transition-fast),box-shadow var(--transition-fast),color var(--transition-fast),background-color var(--transition-fast); +} +.search-input:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgb(99 102 241 / .1);} +.clear-icon{ + position:absolute;right:var(--space-4);top:50%;transform:translateY(-50%);background:none;border:none;color:var(--text-tertiary); + cursor:pointer;padding:var(--space-1);border-radius:var(--radius-md);opacity:0;visibility:hidden; + transition:opacity var(--transition-fast),color var(--transition-fast),background-color var(--transition-fast),transform var(--transition-fast); +} +.search-input:not(:placeholder-shown) + .clear-icon,.search-input:focus + .clear-icon{opacity:1;visibility:visible;} +.clear-icon:hover{background:var(--bg-secondary);color:var(--text-primary);} +.search-results{text-align:center;padding:var(--space-2) 0;color:var(--text-secondary);font-size:var(--text-sm);margin-bottom:var(--space-4);} + +/* Compare controls */ +.compare-controls{display:flex;align-items:end;gap:var(--space-6);margin-bottom:var(--space-12);flex-wrap:wrap;} +.compare-select-group{flex:1;min-width:200px;} +.compare-select-group label{display:block;margin-bottom:var(--space-2);font-weight:var(--font-medium);color:var(--text-primary);} +.select-wrapper{position:relative;} +.select-wrapper::after{ + content:'';position:absolute;right:var(--space-4);top:50%;transform:translateY(-50%); + width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid var(--text-tertiary);pointer-events:none; +} +select{ + width:100%;padding:var(--space-3) var(--space-8) var(--space-3) var(--space-4); + border:2px solid var(--border-primary);border-radius:var(--radius-lg);background:var(--bg-primary);color:var(--text-primary); + font-size:var(--text-base);cursor:pointer;appearance:none; + transition:border-color var(--transition-fast),box-shadow var(--transition-fast),color var(--transition-fast),background-color var(--transition-fast); +} +select:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px rgb(99 102 241 / .1);} +.compare-vs{flex-shrink:0;font-size:var(--text-lg);font-weight:var(--font-bold);color:var(--primary);background:var(--bg-secondary);padding:var(--space-3) var(--space-4);border-radius:var(--radius-lg);border:2px solid var(--border-primary);margin-bottom:var(--space-2);} + +/* Compare table container */ +#compare-table-container{ + position:relative;background:var(--bg-primary);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);border:1px solid var(--border-primary);margin-top:var(--space-6);display:none; +} +.comparison-visible{display:block!important;animation:slideIn .3s ease-out;} +.comparison-hiding{animation:slideOut .3s ease-in;} +@keyframes slideIn{from{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}} +@keyframes slideOut{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-20px)}} +.comparison-header{padding:var(--space-6);border-bottom:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:var(--radius-xl) var(--radius-xl) 0 0;} +.comparison-header h3{margin:0 0 var(--space-4);font-size:var(--text-2xl);font-weight:var(--font-bold);color:var(--text-primary);text-align:center;} +.comparison-stats{display:flex;gap:var(--space-6);justify-content:center;margin-bottom:var(--space-6);flex-wrap:wrap;} +.comparison-stats .stat{text-align:center;background:var(--bg-primary);padding:var(--space-3) var(--space-4);border-radius:var(--radius-lg);border:1px solid var(--border-primary);min-width:100px;} +.stat-label{display:block;font-size:var(--text-xs);color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;margin-bottom:var(--space-1);} +.stat-value{display:block;font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--primary);} +.comparison-actions{display:flex;justify-content:center;gap:var(--space-3);} +.comparison-filters{padding:var(--space-4) var(--space-6);background:var(--bg-tertiary);border-bottom:1px solid var(--border-primary);display:flex;gap:var(--space-6);justify-content:center;flex-wrap:wrap;} +.filter-option{display:flex;align-items:center;gap:var(--space-2);cursor:pointer;font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--text-primary);} +.filter-option input[type="radio"]{margin:0;} +.filter-results{text-align:center;padding:var(--space-2) 0;color:var(--text-secondary);font-size:var(--text-sm);background:var(--bg-secondary);border-bottom:1px solid var(--border-primary);} + +/* Comparison table */ +.comparison-table{width:100%;border-collapse:collapse;font-size:var(--text-sm);min-width:700px;} +.comparison-table th,.comparison-table td{padding:var(--space-4) var(--space-6);border-bottom:1px solid var(--border-primary);text-align:center;} +.comparison-table th:first-child,.comparison-table td:first-child{text-align:left;font-weight:var(--font-medium);} +.comparison-table th{background:var(--primary);color:#fff;font-weight:var(--font-semibold);text-transform:uppercase;letter-spacing:.05em;font-size:var(--text-xs);position:sticky;top:0;z-index:var(--z-sticky);} +.provider-header{position:relative;} +.comparison-row.both-supported{background:rgb(16 185 129 / .05);} +.comparison-row.provider1-only{background:rgb(59 130 246 / .05);} +.comparison-row.provider2-only{background:rgb(168 85 247 / .05);} +.comparison-row.neither-supported{background:rgb(239 68 68 / .05);} +.status-badge{display:inline-block;padding:var(--space-1) var(--space-3);border-radius:var(--radius-full);font-size:var(--text-xs);font-weight:var(--font-medium);text-transform:uppercase;letter-spacing:.05em;} +.status-badge.both-supported{background:rgb(16 185 129 / .1);color:var(--success);} +.status-badge.provider1-only{background:rgb(59 130 246 / .1);color:var(--info);} +.status-badge.provider2-only{background:rgb(168 85 247 / .1);color:#8b5cf6;} +.status-badge.neither-supported{background:rgb(239 68 68 / .1);color:var(--error);} + +#close-compare{ + background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:var(--radius-lg);padding:var(--space-2) var(--space-4); + display:flex;align-items:center;gap:var(--space-2);cursor:pointer;font-size:var(--text-sm);color:var(--text-primary);font-weight:var(--font-medium); + transition:color var(--transition-fast),background-color var(--transition-fast),border-color var(--transition-fast),transform var(--transition-fast),box-shadow var(--transition-fast); +} +#close-compare:hover{background:var(--error);color:#fff;border-color:var(--error);transform:translateY(-1px);} + +/* Empty + warning + alerts */ +.empty-state{text-align:center;padding:var(--space-16);} +.empty-state-icon{font-size:var(--text-5xl);margin-bottom:var(--space-4);} +.empty-state h3{margin:0 0 var(--space-2);font-size:var(--text-xl);color:var(--text-primary);} +.empty-state p{margin:0;color:var(--text-secondary);} +.warning-state{text-align:center;padding:var(--space-12);background:rgb(245 158 11 / .05);border-radius:var(--radius-lg);border:1px solid rgb(245 158 11 / .2);} +.warning-icon{font-size:var(--text-4xl);margin-bottom:var(--space-3);} +.warning-state h3{margin:0 0 var(--space-2);color:var(--warning);} +.warning-state p{margin:0;color:var(--text-secondary);} +.alert{display:flex;align-items:flex-start;gap:var(--space-3);padding:var(--space-4);border-radius:var(--radius-lg);margin:var(--space-4) 0;} +.alert-info{background:rgb(59 130 246 / .1);border:1px solid rgb(59 130 246 / .2);color:var(--info);} +.alert-icon{flex-shrink:0;margin-top:2px;} + +/* Referral */ +.referral-section{margin-block:var(--space-16);padding:var(--space-8);background:var(--bg-secondary);border-radius:var(--radius-xl);border:1px solid var(--border-primary);text-align:center;content-visibility:auto;contain-intrinsic-size:1px 400px;} +.referral-header h3{margin:0 0 var(--space-2);color:var(--text-primary);font-size:var(--text-2xl);font-weight:var(--font-bold);} +.referral-header p{margin:0 auto var(--space-6);color:var(--text-secondary);max-width:var(--content-max-width);} +.referral-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--space-4);justify-items:center;} +.referral-card{ + display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-2); + padding:var(--space-4) var(--space-3);background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:var(--radius-lg); + text-decoration:none;width:100%;max-width:200px;box-shadow:var(--shadow-sm); + transition:background-color var(--transition-normal),border-color var(--transition-normal),transform var(--transition-normal),box-shadow var(--transition-normal),color var(--transition-normal); +} +.referral-card:hover{border-color:var(--primary);transform:translateY(-2px);box-shadow:var(--shadow-md);} +.service-name{font-weight:var(--font-semibold);color:var(--text-primary);font-size:var(--text-base);} +.referral-badge{font-size:var(--text-xs);color:var(--primary);background:rgb(99 102 241 / .1);padding:var(--space-1) var(--space-2);border-radius:var(--radius-md);font-weight:var(--font-medium);} + +/* Status cards */ +.status-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--space-6);} +.status-card{ + display:block;padding:var(--space-6);background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:var(--radius-xl);text-decoration:none; + transition:background-color var(--transition-normal),border-color var(--transition-normal),transform var(--transition-normal),box-shadow var(--transition-normal); + content-visibility:auto;contain:content; +} +.status-card:hover{border-color:var(--primary);transform:translateY(-2px);box-shadow:var(--shadow-lg);} +.status-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3);} +.service-status-indicator{width:12px;height:12px;border-radius:var(--radius-full);background:var(--success);box-shadow:0 0 0 2px rgb(16 185 129 / .2);} +.status-card .status-indicator.online, +.service-status-indicator.online{background:var(--success);box-shadow:0 0 0 2px rgb(16 185 129 / .2);} +.status-card p{margin:0;color:var(--text-secondary);font-size:var(--text-sm);} + +/* Loading */ +.loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-12);color:var(--text-secondary);} +.loading-spinner{width:32px;height:32px;border:3px solid var(--border-primary);border-top:3px solid var(--primary);border-radius:var(--radius-full);animation:spin 1s linear infinite;margin-bottom:var(--space-4);} +@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}} +.loading-overlay{ + position:absolute;inset:0;background:rgb(255 255 255 / .9); + -webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px); + display:flex;align-items:center;justify-content:center;z-index:1050;opacity:0;visibility:hidden; + transition:opacity var(--transition-normal); +} +[data-theme="dark"] .loading-overlay{background:rgb(15 23 42 / .9);} +.loading-overlay--visible{opacity:1;visibility:visible;} +.loading-overlay--hiding{opacity:0;} +.loading-content{text-align:center;color:var(--text-primary);} +.spinner-ring{width:40px;height:40px;border:4px solid var(--border-primary);border-top:4px solid var(--primary);border-radius:var(--radius-full);animation:spin 1s linear infinite;margin:0 auto var(--space-3);} +.loading-text{margin:0;font-size:var(--text-sm);color:var(--text-secondary);} /* Footer */ -.site-footer { - background: var(--bg-secondary); - border-top: 1px solid var(--border-primary); - padding: var(--space-16) 0 var(--space-8); - margin-top: auto; +.site-footer{background:var(--bg-secondary);border-top:1px solid var(--border-primary);padding:var(--space-16) 0 var(--space-8);margin-top:auto;content-visibility:auto;contain-intrinsic-size:1px 500px;} +.footer-content{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:var(--space-8);margin-bottom:var(--space-8);} +.footer-section h4{margin:0 0 var(--space-4);font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-primary);} +.footer-section p{margin:0;color:var(--text-secondary);} +.footer-section ul{list-style:none;padding:0;margin:0;} +.footer-section li{margin-bottom:var(--space-2);} +.footer-section a{color:var(--text-secondary);text-decoration:none;transition:color var(--transition-fast);} +.footer-section a:hover{color:var(--primary);} +.footer-bottom{text-align:center;padding-top:var(--space-8);border-top:1px solid var(--border-primary);} +.footer-bottom p{margin:0;color:var(--text-tertiary);font-size:var(--text-sm);} +.footer-bottom a{color:var(--primary);text-decoration:none;} + +/* Back to top */ +.back-to-top{ + position:fixed;bottom:var(--space-6);right:var(--space-6);width:48px;height:48px;background:var(--primary);color:#fff;border:none;border-radius:var(--radius-full); + cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow-lg); + transition:background-color var(--transition-normal),transform var(--transition-normal),box-shadow var(--transition-normal),opacity var(--transition-normal),visibility 0s linear .2s; + opacity:0;visibility:hidden;transform:translateY(20px);z-index:var(--z-docked); +} +.back-to-top.visible{opacity:1;visibility:visible;transform:translateY(0);transition-delay:0s;} +.back-to-top:hover{background:var(--primary-hover);transform:translateY(-2px);box-shadow:var(--shadow-lg);} + +/* Misc */ +input,select,textarea,button{accent-color:var(--primary);} + +/* Responsive (deferred parts) */ +@media (width <= 768px){ + .quick-nav-grid{grid-template-columns:1fr} + .footer-content{grid-template-columns:1fr;text-align:center} + .data-table-container{margin:var(--space-2) calc(-1 * var(--space-4));border-radius:0;border-left:none;border-right:none} + .table-wrapper{border-radius:0} + table{font-size:var(--text-xs);min-width:500px} + th,td{padding:var(--space-2) var(--space-3)} + th:first-child,td:first-child{min-width:120px;max-width:150px;white-space:normal;word-break:break-word} + .comparison-header{padding:var(--space-4)} + .comparison-header h3{font-size:var(--text-lg)} + .comparison-stats{flex-direction:column;gap:var(--space-3)} + .comparison-stats .stat{margin:0 auto;max-width:200px} + .comparison-filters{flex-direction:column;align-items:center;gap:var(--space-3)} + .comparison-table{min-width:500px} + .comparison-table th,.comparison-table td{padding:var(--space-2) var(--space-3);font-size:var(--text-xs)} +} +@media (width <= 640px){ + .btn{width:100%;max-width:280px;padding:var(--space-4) var(--space-6)} +} +@media (width <= 480px){ + .section{padding:var(--space-12) 0} + .comparison-stats{gap:var(--space-2)} + .comparison-stats .stat{min-width:60px;padding:var(--space-1) var(--space-2)} + .stat-value{font-size:var(--text-lg)} + .stat-label{font-size:10px} + table{min-width:400px} + th:first-child,td:first-child{min-width:100px;max-width:120px} + .stat-item:not(:last-child)::after{display:none} } -.footer-content { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: var(--space-8); - margin-bottom: var(--space-8); +/* Coarse pointer */ +@media (pointer: coarse){ + .nav-link:hover,.btn:hover,.quick-nav-card:hover,.status-card:hover{transform:none;box-shadow:none} } -.footer-section h4 { - margin: 0 0 var(--space-4); - font-size: var(--text-lg); - font-weight: var(--font-semibold); - color: var(--text-primary); -} - -.footer-section p { - margin: 0; - color: var(--text-secondary); -} - -.footer-section ul { - list-style: none; - padding: 0; - margin: 0; -} - -.footer-section li { - margin-bottom: var(--space-2); -} - -.footer-section a { - color: var(--text-secondary); - text-decoration: none; - transition: color var(--transition-fast); -} - -.footer-section a:hover { - color: var(--primary); -} - -.footer-bottom { - text-align: center; - padding-top: var(--space-8); - border-top: 1px solid var(--border-primary); -} - -.footer-bottom p { - margin: 0; - color: var(--text-tertiary); - font-size: var(--text-sm); -} - -.footer-bottom a { - color: var(--primary); - text-decoration: none; -} - -/* Back to Top */ -.back-to-top { - position: fixed; - bottom: var(--space-6); - right: var(--space-6); - width: 48px; - height: 48px; - background: var(--primary); - color: #fff; - border: none; - border-radius: var(--radius-full); - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - box-shadow: var(--shadow-lg); - transition: all var(--transition-normal); - opacity: 0; - visibility: hidden; - transform: translateY(20px); - z-index: var(--z-docked); -} - -.back-to-top.visible { - opacity: 1; - visibility: visible; - transform: translateY(0); -} - -.back-to-top:hover { - background: var(--primary-hover); - transform: translateY(-2px); - box-shadow: var(--shadow-xl); -} - -/* Loading Overlay */ -.loading-overlay { - position: absolute; - inset: 0; - background: rgb(255 255 255 / 0.9); - backdrop-filter: blur(2px); - display: flex; - align-items: center; - justify-content: center; - z-index: var(--z-modal); - opacity: 0; - visibility: hidden; - transition: all var(--transition-normal); -} - -[data-theme="dark"] .loading-overlay { - background: rgb(15 23 42 / 0.9); -} - -.loading-overlay--visible { - opacity: 1; - visibility: visible; -} - -.loading-overlay--hiding { - opacity: 0; -} - -.loading-content { - text-align: center; - color: var(--text-primary); -} - -.spinner-ring { - width: 40px; - height: 40px; - border: 4px solid var(--border-primary); - border-top: 4px solid var(--primary); - border-radius: var(--radius-full); - animation: spin 1s linear infinite; - margin: 0 auto var(--space-3); -} - -.loading-text { - margin: 0; - font-size: var(--text-sm); - color: var(--text-secondary); -} - -/* Responsive Media Queries */ -@media (width <= 1024px) { - .container { - padding: 0 var(--space-4); - } - - .comparison-stats { - gap: var(--space-4); - } - - .comparison-stats .stat { - min-width: 80px; - padding: var(--space-2) var(--space-3); - } -} - -@media (width <= 768px) { - .header-nav { - display: none; - } - - .hero-title { - font-size: var(--text-3xl); - } - - .hero-description { - font-size: var(--text-lg); - } - - .hero-actions { - flex-direction: column; - align-items: center; - } - - .hero-stats { - gap: var(--space-6); - } - - .section-title { - font-size: var(--text-3xl); - } - - .compare-controls { - flex-direction: column; - } - - .compare-vs { - align-self: center; - margin: var(--space-2) 0; - } - - .quick-nav-grid { - grid-template-columns: 1fr; - } - - - .footer-content { - grid-template-columns: 1fr; - text-align: center; - } - - .data-table-container { - margin: var(--space-2) calc(-1 * var(--space-4)); - border-radius: 0; - border-left: none; - border-right: none; - } - - .table-wrapper { - border-radius: 0; - } - - table { - font-size: var(--text-xs); - min-width: 500px; - } - - th, - td { - padding: var(--space-2) var(--space-3); - } - - th:first-child, - td:first-child { - min-width: 120px; - max-width: 150px; - white-space: normal; - word-break: break-word; - } - - .comparison-header { - padding: var(--space-4); - } - - .comparison-header h3 { - font-size: var(--text-lg); - } - - .comparison-stats { - flex-direction: column; - gap: var(--space-3); - } - - .comparison-stats .stat { - margin: 0 auto; - max-width: 200px; - } - - .comparison-filters { - flex-direction: column; - align-items: center; - gap: var(--space-3); - } - - .comparison-table { - min-width: 500px; - } - - .comparison-table th, - .comparison-table td { - padding: var(--space-2) var(--space-3); - font-size: var(--text-xs); - } - - th, - td { - padding: var(--space-3) var(--space-4); - } - - .header-content { - gap: var(--space-4); - } - - .nav-link { - padding: var(--space-1-5) var(--space-2); - font-size: var(--text-xs); - } -} - -@media (width <= 480px) { - .hero-section { - padding: var(--space-16) 0 var(--space-12); - } - - .section { - padding: var(--space-12) 0; - } - - .btn { - width: 100%; - justify-content: center; - } - - .hero-stats { - flex-direction: column; - gap: var(--space-4); - } - - .comparison-stats { - gap: var(--space-2); - } - - .comparison-stats .stat { - min-width: 60px; - padding: var(--space-1) var(--space-2); - } - - .stat-value { - font-size: var(--text-lg); - } - - .stat-label { - font-size: 10px; - } - - table { - min-width: 400px; - } - - th:first-child, - td:first-child { - min-width: 100px; - max-width: 120px; - } - - .stat-item:not(:last-child)::after { - display: none; - } -} - -@media (width <= 640px) { - .container { - padding: 0 var(--space-4); - } - - .hero-actions { - flex-direction: column; - align-items: center; - gap: var(--space-3); - } - - .hero-stats { - gap: var(--space-8); - } - - .nav-link { - padding: var(--space-1-5) var(--space-2); - font-size: var(--text-xs); - } - - .btn { - width: 100%; - max-width: 280px; - padding: var(--space-4) var(--space-6); - } -} - -/* Print Styles */ -@media print { - .site-header, - .hero-section, - .quick-nav, - .referral-section, - .site-footer, - .back-to-top, - .dark-mode-toggle, - .comparison-filters, - .comparison-actions, - #close-compare { - display: none !important; - } - - .section { - page-break-inside: avoid; - } - - .data-table-container { - box-shadow: none; - border: 1px solid #000; - } - - .table-wrapper { - overflow: visible; - } - - table { - min-width: auto; - } - - th, - td { - border: 1px solid #000; - } -} - -/* Reduced Motion */ -@media (prefers-reduced-motion: reduce) { - *, - ::before, - ::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } - - html { - scroll-behavior: auto; - } -} - -/* High Contrast */ -@media (prefers-contrast: high) { - :root { - --border-primary: #000; - --text-secondary: #000; - } - - [data-theme="dark"] { - --border-primary: #fff; - --text-secondary: #fff; - } +/* Print */ +@media print{ + .site-header,.hero-section,.quick-nav,.referral-section,.site-footer,.back-to-top,.dark-mode-toggle,.comparison-filters,.comparison-actions,#close-compare{display:none!important} + .section{page-break-inside:avoid} + .data-table-container{box-shadow:none;border:1px solid #000} + .table-wrapper{overflow:visible} + table{min-width:auto} + th,td{border:1px solid #000} } \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index abf72bb..ca84968 100644 --- a/dist/index.html +++ b/dist/index.html @@ -57,8 +57,9 @@ +:root{ --primary:#6366f1;--primary-hover:#4f46e5;--primary-light:#a5b4fc;--primary-dark:#3730a3; --success:#10b981;--warning:#f59e0b;--error:#ef4444;--info:#3b82f6; --gray-50:#f8fafc;--gray-100:#f1f5f9;--gray-200:#e2e8f0;--gray-300:#cbd5e1;--gray-400:#94a3b8; --gray-500:#64748b;--gray-600:#475569;--gray-700:#334155;--gray-800:#1e293b;--gray-900:#0f172a; --text-primary:var(--gray-900);--text-secondary:var(--gray-600);--text-tertiary:var(--gray-500);--text-muted:var(--gray-400); --bg-primary:#fff;--bg-secondary:var(--gray-50);--bg-tertiary:var(--gray-100);--bg-elevated:#fff; --border-primary:var(--gray-200);--border-secondary:var(--gray-300);--border-focus:var(--primary); --space-px:1px;--space-0-5:.125rem;--space-1:.25rem;--space-1-5:.375rem;--space-2:.5rem;--space-2-5:.625rem;--space-3:.75rem;--space-3-5:.875rem; --space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--space-7:1.75rem;--space-8:2rem;--space-9:2.25rem;--space-10:2.5rem;--space-11:2.75rem;--space-12:3rem;--space-14:3.5rem;--space-16:4rem;--space-20:5rem;--space-24:6rem; --text-xs:.75rem;--text-sm:.875rem;--text-base:1rem;--text-lg:1.125rem;--text-xl:1.25rem;--text-2xl:1.5rem;--text-3xl:1.875rem;--text-4xl:2.25rem;--text-5xl:3rem;--text-6xl:3.75rem; --font-normal:400;--font-medium:500;--font-semibold:600;--font-bold:700;--font-extrabold:800; --radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-full:9999px; --shadow-sm:0 1px 3px 0 rgb(0 0 0 / .1),0 1px 2px -1px rgb(0 0 0 / .1); --shadow-md:0 4px 6px -1px rgb(0 0 0 / .1),0 2px 4px -2px rgb(0 0 0 / .1); --shadow-lg:0 10px 15px -3px rgb(0 0 0 / .1),0 4px 6px -4px rgb(0 0 0 / .1); --shadow-focus:0 0 0 3px rgb(99 102 241 / .15); --transition-fast:.15s cubic-bezier(.4,0,.2,1); --transition-normal:.2s cubic-bezier(.4,0,.2,1); --transition-slow:.3s cubic-bezier(.4,0,.2,1); --container-max-width:1280px; --header-height:4.5rem; --z-sticky:1020;--z-docked:10}[data-theme="dark"]{ --text-primary:var(--gray-50);--text-secondary:var(--gray-300);--text-tertiary:var(--gray-400);--text-muted:var(--gray-500); --bg-primary:var(--gray-900);--bg-secondary:var(--gray-800);--bg-tertiary:var(--gray-700);--bg-elevated:var(--gray-800); --border-primary:var(--gray-700);--border-secondary:var(--gray-600); --border-focus:var(--primary-light); --primary:#818cf8;--primary-hover:#a5b4fc;--primary-light:#c7d2fe;--primary-dark:#6366f1; --shadow-sm:0 1px 3px 0 rgb(0 0 0 / .4),0 1px 2px -1px rgb(0 0 0 / .4); --shadow-md:0 4px 6px -1px rgb(0 0 0 / .4),0 2px 4px -2px rgb(0 0 0 / .4); --shadow-lg:0 10px 15px -3px rgb(0 0 0 / .4),0 4px 6px -4px rgb(0 0 0 / .4); --shadow-focus:0 0 0 3px rgb(129 140 248 / .2)}*,::before,::after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth;font-size:16px;line-height:1.6;-webkit-text-size-adjust:100%}body{ font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif; font-feature-settings:'cv01','cv03','cv04','cv11';font-variation-settings:'opsz' 32; background-color:var(--bg-primary);color:var(--text-primary); transition:background-color var(--transition-normal),color var(--transition-normal); -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility; min-height:100vh;overflow-x:hidden}img,svg,video,canvas{max-width:100%;height:auto}:focus{outline:2px solid var(--border-focus);outline-offset:2px}:focus:not(:focus-visible){outline:none}:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}h1,h2,h3,h4,h5,h6{ font-weight:var(--font-bold);line-height:1.25;letter-spacing:-.025em;color:var(--text-primary); text-wrap:balance;scroll-margin-top:calc(var(--header-height) + var(--space-4))}h1{font-size:var(--text-4xl);font-weight:var(--font-extrabold)}h2{font-size:var(--text-3xl);font-weight:var(--font-bold)}h3{font-size:var(--text-2xl);font-weight:var(--font-semibold)}p{line-height:1.75;margin-bottom:var(--space-4)}a{color:var(--primary);text-decoration:none;transition:color var(--transition-normal)}a:hover{color:var(--primary-hover);text-decoration:none}.page-wrapper{min-height:100vh;display:flex;flex-direction:column;position:relative}.container{max-width:var(--container-max-width);margin:0 auto;padding:0 var(--space-6);width:100%}.main-content{flex:1;position:relative}.site-header{ position:sticky;top:0;z-index:var(--z-sticky); background:rgb(255 255 255 / .8); -webkit-backdrop-filter:blur(10px) saturate(150%);backdrop-filter:blur(10px) saturate(150%); border-bottom:1px solid var(--border-primary);height:var(--header-height); transition:background-color var(--transition-normal),border-color var(--transition-normal),backdrop-filter var(--transition-slow),box-shadow var(--transition-normal)}@supports not ((backdrop-filter: blur(1px))){.site-header{background:rgb(255 255 255 / .95)}}[data-theme="dark"] .site-header{background:rgb(15 23 42 / .8)}.header-content{display:flex;align-items:center;justify-content:space-between;height:var(--header-height);gap:var(--space-8)}.site-title{ display:flex;align-items:center;gap:var(--space-2); font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--text-primary);text-decoration:none;position:relative; transition:color var(--transition-normal),transform var(--transition-normal),text-shadow var(--transition-normal)}.site-title:hover{color:var(--primary);transform:translateY(-1px)}.site-title:focus-visible{border-radius:var(--radius-md);box-shadow:var(--shadow-focus)}.logo-icon{font-size:var(--text-2xl);filter:drop-shadow(0 2px 4px rgb(99 102 241 / .2));transition:transform var(--transition-normal),filter var(--transition-normal)}.site-title:hover .logo-icon{transform:rotate(-5deg) scale(1.1)}.header-nav{display:flex;align-items:center;gap:var(--space-6)}.nav-link{ position:relative;display:inline-flex;align-items:center;padding:var(--space-2) var(--space-3); font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--text-secondary);border-radius:var(--radius-lg);white-space:nowrap; transition:color var(--transition-normal),background-color var(--transition-normal),transform var(--transition-normal),box-shadow var(--transition-normal),border-color var(--transition-normal)}.nav-link::before{ content:'';position:absolute;bottom:-2px;left:50%;width:0;height:2px;background:var(--primary); border-radius:var(--radius-full);transition:width var(--transition-normal),left var(--transition-normal);transform:translateX(-50%)}.nav-link:hover{color:var(--primary);background:var(--bg-secondary);transform:translateY(-1px)}.nav-link:hover::before{width:70%}.nav-link:focus-visible{box-shadow:var(--shadow-focus)}.dark-mode-toggle{ display:flex;align-items:center;justify-content:center;width:2.75rem;height:2.75rem;border:2px solid var(--border-primary); border-radius:var(--radius-full);background:var(--bg-primary);color:var(--text-primary);cursor:pointer;position:relative;overflow:hidden; transition:background-color var(--transition-normal),border-color var(--transition-normal),transform var(--transition-normal),box-shadow var(--transition-normal),color var(--transition-normal); touch-action:manipulation}.dark-mode-toggle:hover{background:var(--bg-secondary);border-color:var(--primary);transform:scale(1.05);box-shadow:var(--shadow-md)}.dark-mode-toggle:focus-visible{box-shadow:var(--shadow-focus)}.sun-icon,.moon-icon{position:absolute;transition:opacity var(--transition-normal),transform var(--transition-normal)}.moon-icon{display:none;transform:rotate(180deg)}[data-theme="dark"] .sun-icon{display:none}[data-theme="dark"] .moon-icon{display:block;transform:rotate(0deg)}.hero-section{ position:relative;padding:var(--space-24) 0 var(--space-20); background:linear-gradient(135deg,var(--bg-primary) 0%,var(--bg-secondary) 100%); overflow:hidden}.hero-section::before{ content:'';position:absolute;inset:0; background:radial-gradient(circle at 30% 20%,rgb(99 102 241 / .1) 0%,transparent 50%), radial-gradient(circle at 70% 80%,rgb(99 102 241 / .05) 0%,transparent 50%); pointer-events:none}[data-theme="dark"] .hero-section{background:linear-gradient(135deg,var(--bg-primary) 0%,var(--bg-secondary) 100%)}[data-theme="dark"] .hero-section::before{ background:radial-gradient(circle at 30% 20%,rgb(129 140 248 / .15) 0%,transparent 50%), radial-gradient(circle at 70% 80%,rgb(129 140 248 / .08) 0%,transparent 50%)}.hero-content{text-align:center;max-width:900px;margin:0 auto;position:relative;z-index:1;animation:fadeInUp .8s ease-out}@keyframes fadeInUp{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}.hero-title{font-size:clamp(var(--text-3xl),8vw,var(--text-6xl));font-weight:var(--font-extrabold);line-height:1.1;margin:0 0 var(--space-6);color:var(--text-primary);letter-spacing:-.02em}.gradient-text{ background:linear-gradient(135deg,var(--primary) 0%,#8b5cf6 100%); -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;position:relative}[data-theme="dark"] .gradient-text{ background:linear-gradient(135deg,var(--primary-light) 0%,#c4b5fd 100%); -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.hero-description{ font-size:clamp(var(--text-lg),4vw,var(--text-xl)); color:var(--text-secondary);margin:0 0 var(--space-10); max-width:650px;margin-left:auto;margin-right:auto;line-height:1.6}.hero-actions{display:flex;gap:var(--space-4);justify-content:center;margin-bottom:var(--space-16);flex-wrap:wrap}.hero-stats{display:flex;gap:var(--space-12);justify-content:center;flex-wrap:wrap}.stat-item{text-align:center;position:relative}.stat-item:not(:last-child)::after{content:'';position:absolute;right:calc(-1 * var(--space-6));top:50%;transform:translateY(-50%);width:1px;height:40px;background:var(--border-primary)}.stat-number{ display:block;font-size:clamp(var(--text-2xl),6vw,var(--text-4xl));font-weight:var(--font-extrabold);color:var(--primary);margin-bottom:var(--space-1); background:linear-gradient(135deg,var(--primary) 0%,#8b5cf6 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.stat-label{font-size:var(--text-sm);color:var(--text-secondary);text-transform:uppercase;letter-spacing:.1em;font-weight:var(--font-medium)}.btn{ display:inline-flex;align-items:center;gap:var(--space-2); padding:var(--space-4) var(--space-8);border:2px solid transparent;border-radius:var(--radius-xl); font-size:var(--text-base);font-weight:var(--font-semibold);text-decoration:none;cursor:pointer;white-space:nowrap;position:relative;overflow:hidden;text-align:center;min-width:140px;justify-content:center; transition:color var(--transition-normal),background-color var(--transition-normal),border-color var(--transition-normal),transform var(--transition-normal),box-shadow var(--transition-normal),opacity var(--transition-normal); touch-action:manipulation}.btn::before{content:'';position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgb(255 255 255 / .2),transparent);transition:left .5s}.btn:hover::before{left:100%}.btn-primary{background:linear-gradient(135deg,var(--primary) 0%,var(--primary-dark) 100%);color:#fff;box-shadow:var(--shadow-md)}.btn-primary:hover{background:linear-gradient(135deg,var(--primary-hover) 0%,var(--primary) 100%);transform:translateY(-2px);box-shadow:var(--shadow-lg)}.btn-primary:focus-visible{box-shadow:var(--shadow-focus),var(--shadow-lg)}.btn-secondary{background:transparent;color:var(--text-primary);border:2px solid var(--border-primary)}.btn-secondary:hover{border-color:var(--primary);color:var(--primary);background:var(--bg-secondary);transform:translateY(-2px);box-shadow:var(--shadow-md)}.btn-secondary:focus-visible{box-shadow:var(--shadow-focus)}@media (width <=1024px){ .container{padding:0 var(--space-4)}}@media (width <=768px){ .header-nav{display:none} .hero-title{font-size:var(--text-3xl)} .hero-description{font-size:var(--text-lg)} .hero-actions{flex-direction:column;align-items:center} .hero-stats{gap:var(--space-6)} .container{padding:0 var(--space-4)} .nav-link{padding:var(--space-1-5) var(--space-2);font-size:var(--text-xs)}}@media (width <=640px){ .container{padding:0 var(--space-4)} .hero-actions{flex-direction:column;align-items:center;gap:var(--space-3)} .hero-stats{gap:var(--space-8)} .nav-link{padding:var(--space-1-5) var(--space-2);font-size:var(--text-xs)} .btn{width:100%;max-width:280px;padding:var(--space-4) var(--space-6)}}@media (width <=480px){ .hero-section{padding:var(--space-16) 0 var(--space-12)} .btn{width:100%;justify-content:center} .hero-stats{flex-direction:column;gap:var(--space-4)}}@media (prefers-reduced-motion:reduce){ *,::before,::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important} html{scroll-behavior:auto}}@media (prefers-contrast:high){ :root{--border-primary:#000;--text-secondary:#000} [data-theme="dark"]{--border-primary:#fff;--text-secondary:#fff}} + +
diff --git a/dist/js/app.js b/dist/js/app.js index 88af086..a17d6ad 100644 --- a/dist/js/app.js +++ b/dist/js/app.js @@ -1,301 +1,342 @@ /** - * @fileoverview Enhanced Debrid Services Comparison Application - * Modern, feature-rich JavaScript with performance optimizations and professional UX + * @fileoverview Optimized Debrid Services Comparison Application + * Performance-focused implementation with modern ES6+ features */ -// Modern utility functions -const Utils = { - // Enhanced debounce with immediate option - debounce: (func, delay = 300, immediate = false) => { - let timeout; - return function executedFunction(...args) { - const later = () => { - timeout = null; - if (!immediate) func.apply(this, args); - }; - const callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, delay); - if (callNow) func.apply(this, args); - }; - }, - - // Throttle function for scroll events - throttle: (func, limit) => { - let inThrottle; - return function() { - const args = arguments; - const context = this; - if (!inThrottle) { - func.apply(context, args); - inThrottle = true; - setTimeout(() => inThrottle = false, limit); - } - }; - }, - - // Animate elements with Intersection Observer - animateOnScroll: (elements, options = {}) => { - const defaultOptions = { - threshold: 0.1, - rootMargin: '0px 0px -50px 0px' - }; - - const observer = new IntersectionObserver((entries) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - entry.target.classList.add('animate-in'); - observer.unobserve(entry.target); +// Optimized utility module using singleton pattern +const Utils = (() => { + // WeakMap for caching debounced functions + const debounceCache = new WeakMap(); + + return { + debounce(func, delay = 300, immediate = false) { + if (debounceCache.has(func)) return debounceCache.get(func); + + let timeoutId; + const debounced = function(...args) { + const callNow = immediate && !timeoutId; + clearTimeout(timeoutId); + + if (callNow) { + func.apply(this, args); } - }); - }, { ...defaultOptions, ...options }); + + timeoutId = setTimeout(() => { + timeoutId = null; + if (!immediate) func.apply(this, args); + }, delay); + }; + + debounceCache.set(func, debounced); + return debounced; + }, - elements.forEach(el => observer.observe(el)); - } -}; + throttle(func, limit) { + let inThrottle; + return function(...args) { + if (!inThrottle) { + func.apply(this, args); + inThrottle = true; + requestAnimationFrame(() => { + setTimeout(() => inThrottle = false, limit); + }); + } + }; + }, -// Enhanced loading manager + // Optimized Intersection Observer with single instance + animateOnScroll: (() => { + let observer; + return (elements, options = {}) => { + if (!observer) { + observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('animate-in'); + observer.unobserve(entry.target); + } + }); + }, { + threshold: 0.1, + rootMargin: '0px 0px -50px 0px', + ...options + }); + } + elements.forEach(el => observer.observe(el)); + }; + })() + }; +})(); + +// Optimized LoadingManager with DOM fragment usage class LoadingManager { constructor() { - this.activeLoaders = new Set(); + this.activeLoaders = new Map(); + this.template = this.createTemplate(); + } + + createTemplate() { + const template = document.createElement('template'); + template.innerHTML = ` + + `; + return template; } show(target, text = 'Loading...') { - const loaderId = Date.now().toString(); - const loader = document.createElement('div'); - loader.className = 'loading-overlay'; - loader.setAttribute('data-loader-id', loaderId); - loader.innerHTML = ` -${text}
-No data available.
No data available.
| - Service Name - - | - ${providers.map(provider => ` -- ${provider} - - | - `).join('')} -
|---|
Select two services above to see a detailed comparison
Please select two different services to compare
| Plans | - ${services.map(service => ` -
-
- ${service}
-
- |
- `).join('')}
-
|---|---|
| - ${plan.name} - | - ${services.map(service => { - const price = plan[service]; - const isNumeric = !isNaN(parseFloat(price)); - - return ` -
-
- ${price}
- ${isNumeric ? '/month' : ''}
-
- |
- `;
- }).join('')}
-