feat: Go backend, enhanced search, new widgets, Docker deploy

Major changes:
- Add Go backend (backend/) with microservices architecture
- Enhanced master-agents-svc: reranker, content-classifier, stealth-crawler,
  proxy-manager, media-search, fastClassifier, language detection
- New web-svc widgets: KnowledgeCard, ProductCard, ProfileCard, VideoCard,
  UnifiedCard, CardGallery, InlineImageGallery, SourcesPanel, RelatedQuestions
- Improved discover-svc with discover-db integration
- Docker deployment improvements (Caddyfile, vendor.sh, BUILD.md)
- Library-svc: project_id schema migration
- Remove deprecated finance-svc and travel-svc
- Localization improvements across services

Made-with: Cursor
This commit is contained in:
home
2026-02-27 04:15:32 +03:00
parent 328d968f3f
commit 06fe57c765
285 changed files with 53132 additions and 1871 deletions

View File

@@ -0,0 +1,522 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap');
:root {
/* Cursor IDE 2026 Dark Theme */
/* Base backgrounds - very dark with slight blue tint */
--bg-base: 240 6% 4%;
--bg-elevated: 240 6% 8%;
--bg-surface: 240 5% 11%;
--bg-overlay: 240 5% 14%;
--bg-muted: 240 4% 18%;
/* Text colors - zinc-based for readability */
--text-primary: 240 5% 92%;
--text-secondary: 240 4% 68%;
--text-muted: 240 4% 48%;
--text-faint: 240 3% 38%;
/* Accent colors - indigo/purple like Cursor */
--accent: 239 84% 67%;
--accent-hover: 239 84% 74%;
--accent-muted: 239 60% 55%;
--accent-subtle: 239 40% 25%;
/* Secondary accent - cyan for variety */
--accent-secondary: 187 85% 55%;
--accent-secondary-muted: 187 60% 40%;
/* Semantic colors */
--success: 142 71% 45%;
--success-muted: 142 50% 35%;
--warning: 38 92% 50%;
--warning-muted: 38 70% 40%;
--error: 0 72% 51%;
--error-muted: 0 60% 40%;
/* Border colors */
--border: 240 4% 16%;
--border-hover: 240 4% 22%;
--border-focus: 239 60% 50%;
/* Legacy mappings for compatibility */
--background: var(--bg-base);
--foreground: var(--text-primary);
--card: var(--bg-elevated);
--card-foreground: var(--text-primary);
--popover: var(--bg-surface);
--popover-foreground: var(--text-primary);
--primary: var(--accent);
--primary-foreground: 0 0% 100%;
--secondary: var(--bg-surface);
--secondary-foreground: var(--text-secondary);
--muted: var(--bg-muted);
--muted-foreground: var(--text-muted);
--accent-color: var(--accent);
--accent-foreground: 0 0% 100%;
--destructive: var(--error);
--destructive-foreground: 0 0% 100%;
--input: var(--bg-surface);
--ring: var(--accent);
--radius: 0.75rem;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
color-scheme: dark;
}
body {
font-family: 'Inter', system-ui, -apple-system, sans-serif;
background: hsl(var(--bg-base));
color: hsl(var(--text-primary));
min-height: 100vh;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
letter-spacing: -0.01em;
}
/* Gradient backgrounds */
.bg-gradient-main {
background: linear-gradient(
180deg,
hsl(240 6% 4%) 0%,
hsl(240 6% 5%) 50%,
hsl(240 5% 6%) 100%
);
}
.bg-gradient-elevated {
background: linear-gradient(
180deg,
hsl(240 6% 9% / 0.9) 0%,
hsl(240 6% 7% / 0.8) 100%
);
}
.bg-gradient-card {
background: linear-gradient(
180deg,
hsl(240 5% 11% / 0.6) 0%,
hsl(240 5% 9% / 0.4) 100%
);
}
/* Accent gradient for special elements */
.bg-gradient-accent {
background: linear-gradient(
135deg,
hsl(239 84% 67%) 0%,
hsl(260 84% 67%) 50%,
hsl(239 84% 67%) 100%
);
}
/* Text gradient */
.text-gradient {
background: linear-gradient(
135deg,
hsl(239 84% 74%) 0%,
hsl(260 90% 75%) 50%,
hsl(187 85% 65%) 100%
);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* Gradient border button */
.btn-gradient {
position: relative;
background: transparent;
border: none;
border-radius: 0.75rem;
padding: 0.625rem 1rem;
font-size: 0.875rem;
font-weight: 500;
color: hsl(239 84% 74%);
transition: all 0.15s ease;
z-index: 1;
}
.btn-gradient::before {
content: '';
position: absolute;
inset: 0;
border-radius: 0.75rem;
padding: 1.5px;
background: linear-gradient(
135deg,
hsl(239 84% 74%) 0%,
hsl(260 90% 75%) 50%,
hsl(187 85% 65%) 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;
}
.btn-gradient:hover {
background: linear-gradient(
135deg,
hsl(239 84% 74% / 0.1) 0%,
hsl(260 90% 75% / 0.1) 50%,
hsl(187 85% 65% / 0.1) 100%
);
}
.btn-gradient:active {
transform: scale(0.98);
}
/* Gradient border - larger version */
.btn-gradient-lg {
position: relative;
background: transparent;
border: none;
border-radius: 0.75rem;
padding: 0.75rem 1.25rem;
font-size: 0.875rem;
font-weight: 500;
color: hsl(239 84% 74%);
transition: all 0.15s ease;
z-index: 1;
}
.btn-gradient-lg::before {
content: '';
position: absolute;
inset: 0;
border-radius: 0.75rem;
padding: 2px;
background: linear-gradient(
135deg,
hsl(239 84% 74%) 0%,
hsl(260 90% 75%) 50%,
hsl(187 85% 65%) 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;
}
.btn-gradient-lg:hover {
background: linear-gradient(
135deg,
hsl(239 84% 74% / 0.1) 0%,
hsl(260 90% 75% / 0.1) 50%,
hsl(187 85% 65% / 0.1) 100%
);
}
/* Gradient text for buttons */
.btn-gradient-text {
background: linear-gradient(
135deg,
hsl(239 84% 74%) 0%,
hsl(260 90% 75%) 50%,
hsl(187 85% 65%) 100%
);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* Modern thin scrollbars */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: hsl(240 4% 20%);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: hsl(240 4% 28%);
}
::selection {
background: hsl(239 84% 67% / 0.3);
}
/* Code font */
.font-mono {
font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace;
}
@layer base {
* {
@apply border-border;
}
}
@layer components {
/* Glass morphism card */
.glass-card {
@apply bg-surface/60 backdrop-blur-xl border border-border rounded-2xl;
}
/* Surface card with hover */
.surface-card {
@apply bg-elevated/40 backdrop-blur-sm border border-border/50 rounded-xl;
@apply transition-all duration-200;
}
.surface-card:hover {
@apply border-border-hover bg-elevated/60;
}
/* Input styles */
.input-cursor {
@apply bg-surface/50 border border-border rounded-xl px-4 py-3;
@apply text-primary placeholder:text-muted;
@apply focus:outline-none focus:border-accent/50 focus:ring-1 focus:ring-accent/20;
@apply transition-all duration-200;
}
/* Primary button - gradient accent */
.btn-primary {
@apply bg-accent/10 text-accent-foreground border border-accent/30;
@apply rounded-xl px-4 py-2.5 text-sm font-medium;
@apply hover:bg-accent/20 hover:border-accent/50;
@apply active:bg-accent/25;
@apply transition-all duration-150;
}
.btn-primary-solid {
@apply bg-accent text-white border-none;
@apply rounded-xl px-4 py-2.5 text-sm font-medium;
@apply hover:bg-accent-hover;
@apply active:scale-[0.98];
@apply transition-all duration-150;
}
/* Secondary button */
.btn-secondary {
@apply bg-surface/50 text-secondary border border-border;
@apply rounded-xl px-4 py-2.5 text-sm font-medium;
@apply hover:bg-muted/50 hover:text-primary hover:border-border-hover;
@apply transition-all duration-150;
}
/* Ghost button */
.btn-ghost {
@apply text-secondary hover:text-primary;
@apply hover:bg-surface/50 rounded-xl px-3 py-2;
@apply transition-all duration-150;
}
/* Icon button */
.btn-icon {
@apply w-9 h-9 flex items-center justify-center rounded-xl;
@apply text-muted hover:text-secondary hover:bg-surface/50;
@apply transition-all duration-150;
}
.btn-icon-active {
@apply bg-accent/15 text-accent;
}
/* Navigation item */
.nav-item {
@apply flex items-center gap-3 px-3 py-2.5 rounded-xl;
@apply text-secondary hover:text-primary;
@apply hover:bg-surface/40 transition-all duration-150;
}
.nav-item-active {
@apply bg-accent/10 text-primary;
@apply border-l-2 border-accent;
}
/* Card styles */
.card {
@apply bg-elevated/40 backdrop-blur-sm;
@apply border border-border/50 rounded-2xl;
@apply transition-all duration-200;
}
.card:hover {
@apply border-border bg-elevated/60;
}
.card-interactive {
@apply cursor-pointer;
}
.card-interactive:hover {
@apply border-accent/30 shadow-lg shadow-accent/5;
}
/* Section headers */
.section-header {
@apply text-xs font-semibold uppercase tracking-wider text-muted;
}
/* Badges */
.badge {
@apply inline-flex items-center px-2 py-0.5 rounded-lg text-xs font-medium;
@apply bg-surface text-secondary border border-border/50;
}
.badge-accent {
@apply bg-accent/15 text-accent border-accent/30;
}
.badge-success {
@apply bg-success/15 text-success border-success/30;
}
.badge-warning {
@apply bg-warning/15 text-warning border-warning/30;
}
.badge-error {
@apply bg-error/15 text-error border-error/30;
}
/* Divider */
.divider {
@apply border-t border-border/50;
}
}
@layer utilities {
.text-balance {
text-wrap: balance;
}
/* Glow effects */
.glow-accent {
box-shadow: 0 0 20px hsl(239 84% 67% / 0.15),
0 0 40px hsl(239 84% 67% / 0.1);
}
.glow-accent-strong {
box-shadow: 0 0 30px hsl(239 84% 67% / 0.25),
0 0 60px hsl(239 84% 67% / 0.15);
}
.glow-subtle {
box-shadow: 0 4px 20px hsl(240 6% 4% / 0.5);
}
/* Focus ring */
.focus-ring {
@apply focus:outline-none focus:ring-2 focus:ring-accent/50 focus:ring-offset-2 focus:ring-offset-base;
}
/* Animation delays */
.animate-delay-75 { animation-delay: 75ms; }
.animate-delay-100 { animation-delay: 100ms; }
.animate-delay-150 { animation-delay: 150ms; }
.animate-delay-200 { animation-delay: 200ms; }
.animate-delay-300 { animation-delay: 300ms; }
.animate-delay-400 { animation-delay: 400ms; }
.animate-delay-500 { animation-delay: 500ms; }
}
/* Smooth animations */
@keyframes fade-in {
0% { opacity: 0; transform: translateY(4px); }
100% { opacity: 1; transform: translateY(0); }
}
@keyframes fade-in-up {
0% { opacity: 0; transform: translateY(12px); }
100% { opacity: 1; transform: translateY(0); }
}
@keyframes slide-in-right {
0% { opacity: 0; transform: translateX(-12px); }
100% { opacity: 1; transform: translateX(0); }
}
@keyframes slide-in-left {
0% { opacity: 0; transform: translateX(12px); }
100% { opacity: 1; transform: translateX(0); }
}
@keyframes scale-in {
0% { opacity: 0; transform: scale(0.95); }
100% { opacity: 1; transform: scale(1); }
}
@keyframes pulse-soft {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
@keyframes shimmer {
0% { background-position: -200% 0; }
100% { background-position: 200% 0; }
}
@keyframes glow-pulse {
0%, 100% {
box-shadow: 0 0 20px hsl(239 84% 67% / 0.15);
}
50% {
box-shadow: 0 0 30px hsl(239 84% 67% / 0.25);
}
}
.animate-fade-in {
animation: fade-in 0.2s ease-out forwards;
}
.animate-fade-in-up {
animation: fade-in-up 0.3s ease-out forwards;
}
.animate-slide-in-right {
animation: slide-in-right 0.25s ease-out forwards;
}
.animate-slide-in-left {
animation: slide-in-left 0.25s ease-out forwards;
}
.animate-scale-in {
animation: scale-in 0.2s ease-out forwards;
}
.animate-pulse-soft {
animation: pulse-soft 2s ease-in-out infinite;
}
.animate-shimmer {
background: linear-gradient(
90deg,
hsl(240 5% 11%) 0%,
hsl(240 5% 16%) 50%,
hsl(240 5% 11%) 100%
);
background-size: 200% 100%;
animation: shimmer 1.5s linear infinite;
}
.animate-glow-pulse {
animation: glow-pulse 2s ease-in-out infinite;
}