Files
skillhub/apps/web/app/globals.css
airano 3e22d2e238 sync: AI review scores, reviewed page, search improvements, score filter
- Surface AI review scores across skill pages, browse, and search
- Add dedicated /reviewed page with score filtering
- Add recommended sort using Meilisearch relevance + AI scores
- Fix search sort defaulting to stars instead of recommended
- Fix CLI TypeScript null check for aiScore in search command
- Adjust cache TTL for reviewed content

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 05:05:37 +03:30

416 lines
10 KiB
CSS

/* Font import must be at the very top */
@import url('https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css');
@tailwind base;
@tailwind components;
@tailwind utilities;
/* ============================================
CSS Variables - Design Tokens
============================================ */
:root {
/* Primary Colors - Sky Blue */
--color-primary-50: #f0f9ff;
--color-primary-100: #e0f2fe;
--color-primary-200: #bae6fd;
--color-primary-300: #7dd3fc;
--color-primary-400: #38bdf8;
--color-primary-500: #66b3e6;
--color-primary-600: #0284c7;
--color-primary-700: #0369a1;
--color-primary-800: #075985;
--color-primary-900: #0c4a6e;
/* Accent - Gold */
--color-accent-gold: #f7c150;
--color-accent-gold-light: #fbd87a;
--color-accent-gold-dark: #d4a43d;
/* Gradients */
--gradient-primary: linear-gradient(135deg, #66b3e6 0%, #3b82f6 100%);
--gradient-hero: linear-gradient(180deg, rgba(102, 179, 230, 0.08) 0%, transparent 60%);
--gradient-gold: linear-gradient(135deg, #f7c150 0%, #f59e0b 100%);
/* Text Colors */
--color-text-primary: #0f172a;
--color-text-secondary: #475569;
--color-text-muted: #94a3b8;
/* Surface Colors */
--color-surface: #ffffff;
--color-surface-elevated: #ffffff;
--color-surface-muted: #f8fafc;
--color-surface-subtle: #f1f5f9;
/* Borders */
--color-border: #e2e8f0;
--color-border-light: #f1f5f9;
/* States */
--color-success: #22c55e;
--color-success-bg: #f0fdf4;
--color-warning: #f59e0b;
--color-warning-bg: #fffbeb;
--color-error: #ef4444;
--color-error-bg: #fef2f2;
/* Shadows */
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
/* Animation */
--duration-fast: 150ms;
--duration-normal: 200ms;
--duration-slow: 300ms;
--ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
/* Spacing */
--space-xs: 0.25rem;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 1.5rem;
--space-xl: 2rem;
--space-2xl: 3rem;
--space-3xl: 4rem;
/* Border Radius */
--radius-sm: 0.375rem;
--radius-md: 0.5rem;
--radius-lg: 0.75rem;
--radius-xl: 1rem;
--radius-2xl: 1.5rem;
--radius-full: 9999px;
}
/* ============================================
Dark Mode Colors
============================================ */
.dark {
/* Primary Colors - Adjusted for dark mode */
--color-primary-50: #0c3d5a;
--color-primary-100: #0f4c6e;
--color-primary-200: #125e87;
--color-primary-300: #1c79a8;
--color-primary-400: #3b9ac9;
--color-primary-500: #66b3e6;
--color-primary-600: #8cc7ed;
--color-primary-700: #b3dbf5;
--color-primary-800: #d9effa;
--color-primary-900: #ecf7fd;
/* Accent - Gold */
--color-accent-gold: #f7c150;
--color-accent-gold-light: #fbd87a;
--color-accent-gold-dark: #c48f30;
/* Gradients */
--gradient-primary: linear-gradient(135deg, #66b3e6 0%, #3b82f6 100%);
--gradient-hero: linear-gradient(180deg, rgba(102, 179, 230, 0.15) 0%, transparent 60%);
/* Text Colors */
--color-text-primary: #f1f5f9;
--color-text-secondary: #94a3b8;
--color-text-muted: #64748b;
/* Surface Colors */
--color-surface: #0f172a;
--color-surface-elevated: #1e293b;
--color-surface-muted: #1e293b;
--color-surface-subtle: #334155;
/* Borders */
--color-border: #334155;
--color-border-light: #1e293b;
/* States */
--color-success: #4ade80;
--color-success-bg: #14532d;
--color-warning: #fbbf24;
--color-warning-bg: #78350f;
--color-error: #f87171;
--color-error-bg: #7f1d1d;
/* Shadows - Softer for dark mode */
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -2px rgba(0, 0, 0, 0.3);
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 10px 10px -5px rgba(0, 0, 0, 0.3);
}
/* ============================================
Font Faces - Vazirmatn (Open Source Persian Font)
https://github.com/rastikerdar/vazirmatn
Note: @import is at the top of this file
============================================ */
/* ============================================
Base Styles
============================================ */
@layer base {
html {
@apply antialiased;
scroll-behavior: smooth;
}
/* RTL Typography - Persian optimized with Vazirmatn */
html[dir="rtl"] {
font-family: 'Vazirmatn', system-ui, sans-serif;
font-size: 16px;
line-height: 1.8;
}
/* LTR Typography - English */
html[dir="ltr"] {
font-family: system-ui, 'Vazirmatn', sans-serif;
font-size: 16px;
line-height: 1.6;
}
body {
@apply bg-surface text-text-primary;
}
/* Persian headings - slightly tighter line-height */
html[dir="rtl"] h1,
html[dir="rtl"] h2,
html[dir="rtl"] h3 {
line-height: 1.4;
}
/* Avoid bold in Persian - use medium weight instead */
html[dir="rtl"] strong,
html[dir="rtl"] b {
font-weight: 500;
}
/* Focus visible for accessibility */
:focus-visible {
outline: 2px solid var(--color-primary-500);
outline-offset: 2px;
}
:focus:not(:focus-visible) {
outline: none;
}
}
/* ============================================
Component Styles
============================================ */
@layer components {
/* Container */
.container-main {
@apply container mx-auto px-4;
max-width: 1200px;
}
/* Primary Button */
.btn-primary {
@apply inline-flex items-center justify-center;
@apply px-6 py-3 rounded-xl;
@apply font-medium text-white;
@apply transition-all duration-200;
background: var(--gradient-primary);
box-shadow: 0 4px 15px rgba(102, 179, 230, 0.4);
min-height: 44px;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(102, 179, 230, 0.5);
}
.btn-primary:active {
transform: translateY(0);
}
.btn-primary:disabled {
@apply opacity-50 cursor-not-allowed;
transform: none;
}
/* Secondary Button */
.btn-secondary {
@apply inline-flex items-center justify-center;
@apply px-6 py-3 rounded-xl;
@apply font-medium;
@apply border-2 border-border;
@apply bg-surface text-text-primary;
@apply transition-all duration-200;
min-height: 44px;
}
.btn-secondary:hover {
@apply border-primary-500 text-primary-600 bg-primary-50;
}
/* Ghost Button */
.btn-ghost {
@apply inline-flex items-center justify-center;
@apply px-6 py-3 rounded-xl;
@apply font-medium text-text-secondary;
@apply transition-all duration-200;
@apply bg-transparent;
min-height: 44px;
}
.btn-ghost:hover {
@apply bg-surface-subtle text-text-primary;
}
/* Thin scrollbar */
.scrollbar-thin {
scrollbar-width: thin;
scrollbar-color: var(--color-border) transparent;
}
.scrollbar-thin::-webkit-scrollbar {
width: 6px;
}
.scrollbar-thin::-webkit-scrollbar-track {
background: transparent;
}
.scrollbar-thin::-webkit-scrollbar-thumb {
background: var(--color-border);
border-radius: 3px;
}
/* Card */
.card {
@apply bg-surface-elevated rounded-2xl;
@apply transition-all duration-300;
box-shadow: var(--shadow-md);
}
.card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-xl);
}
/* Glass Card */
.glass-card {
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: var(--radius-2xl);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}
.dark .glass-card {
background: rgba(30, 41, 59, 0.8);
border: 1px solid rgba(51, 65, 85, 0.3);
}
/* Input Field */
.input-field {
@apply w-full px-4 py-3 rounded-xl;
@apply border-2 border-border;
@apply bg-surface text-text-primary;
@apply transition-all duration-200;
@apply placeholder-text-muted;
min-height: 44px;
}
.input-field:focus {
@apply border-primary-500;
@apply outline-none;
box-shadow: 0 0 0 3px rgba(102, 179, 230, 0.15);
}
/* Hero Typography */
.hero-title {
font-size: clamp(2.5rem, 8vw, 4rem);
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.1;
color: var(--color-text-primary);
}
.hero-tagline {
font-size: clamp(1rem, 2.5vw, 1.25rem);
color: var(--color-primary-500);
font-weight: 500;
}
.hero-subtitle {
font-size: clamp(1.125rem, 3vw, 1.25rem);
color: var(--color-text-secondary);
line-height: 1.6;
}
/* Section */
.section {
@apply py-16 lg:py-24;
}
/* Section following a header - no top padding to avoid double spacing */
.section-header + .section,
.section.no-top-padding {
@apply pt-0;
}
/* Section header - reduced padding for hero/header sections */
.section-header {
@apply py-12 lg:py-16;
}
.section-title {
@apply text-3xl lg:text-4xl font-bold text-center mb-4;
color: var(--color-text-primary);
}
.section-subtitle {
@apply text-lg text-center max-w-2xl mx-auto;
color: var(--color-text-secondary);
}
}
/* ============================================
Utility Classes
============================================ */
@layer utilities {
/* Keep numbers LTR in RTL context */
.ltr-nums {
direction: ltr;
unicode-bidi: embed;
}
/* Gradient text */
.text-gradient {
background: var(--gradient-primary);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* Subtle gradient background */
.bg-gradient-subtle {
background: var(--gradient-hero);
}
/* Animation delay utilities */
.animation-delay-100 { animation-delay: 0.1s; }
.animation-delay-200 { animation-delay: 0.2s; }
.animation-delay-300 { animation-delay: 0.3s; }
.animation-delay-400 { animation-delay: 0.4s; }
.animation-delay-500 { animation-delay: 0.5s; }
/* Line clamp */
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-3 {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
}