@tailwind base; @tailwind components; @tailwind utilities; body { font-family: var(--font-inter), var(--font-roboto), sans-serif; } @layer utilities { .text-balance { text-wrap: balance; } } @layer base { :root { /* ======================================== OLIVER DECKFORGE DESIGN SYSTEM Modern, professional design tokens ======================================== */ /* Primary Brand Colors */ --brand-primary: #5146E5; --brand-secondary: #E9E8F8; --brand-accent: #3D35B0; /* Primary (Brand Purple) */ --primary: 250 70% 60%; /* #5146E5 */ --primary-hover: 250 70% 55%; --primary-light: 250 70% 95%; --primary-foreground: 0 0% 100%; /* Semantic Colors */ --success: 142 76% 36%; /* Green */ --success-foreground: 0 0% 100%; --warning: 38 92% 50%; /* Amber */ --warning-foreground: 0 0% 100%; --error: 0 84% 60%; /* Red */ --error-foreground: 0 0% 100%; --info: 199 89% 48%; /* Blue */ --info-foreground: 0 0% 100%; /* Neutrals */ --background: 0 0% 100%; /* White */ --foreground: 0 0% 10%; /* Near black */ --surface: 0 0% 98%; /* Light gray bg */ --surface-hover: 0 0% 95%; --text-primary: 0 0% 10%; --text-secondary: 0 0% 45%; --text-tertiary: 0 0% 65%; /* Shadcn UI compatibility */ --card: 0 0% 100%; --card-foreground: 0 0% 10%; --popover: 0 0% 100%; --popover-foreground: 0 0% 10%; --secondary: 0 0% 96%; --secondary-foreground: 0 0% 10%; --muted: 0 0% 96%; --muted-foreground: 0 0% 45%; --accent: 250 70% 95%; --accent-foreground: 250 70% 20%; --destructive: 0 84% 60%; --destructive-foreground: 0 0% 98%; /* Borders & Inputs */ --border: 0 0% 90%; --input: 0 0% 90%; --ring: 250 70% 60%; /* Charts */ --chart-1: 250 70% 60%; /* Brand purple */ --chart-2: 142 76% 36%; /* Success green */ --chart-3: 38 92% 50%; /* Warning amber */ --chart-4: 199 89% 48%; /* Info blue */ --chart-5: 0 84% 60%; /* Error red */ /* Shadows (HSL format for Tailwind) */ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1); --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1); --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1); /* Radius */ --radius: 0.75rem; /* 12px - more modern */ } .dark { --background: 222 47% 11%; /* Dark blue-gray */ --foreground: 0 0% 95%; --surface: 217 33% 17%; --surface-hover: 217 33% 20%; --text-primary: 0 0% 95%; --text-secondary: 0 0% 65%; --text-tertiary: 0 0% 45%; /* Shadcn UI dark mode */ --card: 217 33% 17%; --card-foreground: 0 0% 95%; --popover: 217 33% 17%; --popover-foreground: 0 0% 95%; --primary: 250 70% 60%; --primary-foreground: 0 0% 100%; --secondary: 217 33% 25%; --secondary-foreground: 0 0% 95%; --muted: 217 33% 25%; --muted-foreground: 0 0% 65%; --accent: 250 70% 30%; --accent-foreground: 0 0% 95%; --destructive: 0 62% 40%; --destructive-foreground: 0 0% 98%; --border: 217 33% 25%; --input: 217 33% 25%; --ring: 250 70% 60%; --chart-1: 250 70% 60%; --chart-2: 142 76% 46%; --chart-3: 38 92% 60%; --chart-4: 199 89% 58%; --chart-5: 0 84% 70%; } } @layer base { body { @apply bg-background text-foreground; } /* Typography Scale */ .h1 { @apply text-4xl font-bold tracking-tight; } .h2 { @apply text-3xl font-semibold tracking-tight; } .h3 { @apply text-2xl font-semibold; } .h4 { @apply text-xl font-semibold; } .body-lg { @apply text-lg leading-relaxed; } .body { @apply text-base leading-normal; } .body-sm { @apply text-sm leading-snug; } .caption { @apply text-xs text-muted-foreground; } } strong { @apply font-black; } /* Modern UI Animations */ @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideIn { from { transform: translateX(-100%); } to { transform: translateX(0); } } @keyframes scaleIn { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } .animate-fadeIn { animation: fadeIn 0.3s ease-out; } .animate-slideIn { animation: slideIn 0.3s ease-out; } .animate-scaleIn { animation: scaleIn 0.2s ease-out; } ::selection { background-color: hsl(var(--chart-1)); color: white; } /* Hide input number arrows */ input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } input[type="number"] { -moz-appearance: textfield; } thead, tbody tr { display: table; width: 100%; table-layout: fixed; /* even columns width , fix width of table too*/ } thead { width: calc(100% - 1em) /* scrollbar is average 1em/16px width, remove it from thead width */ } /* Add this to your global CSS or a specific CSS module */ @keyframes typing { from { width: 0; } to { width: 100%; } } .typing-effect { overflow: hidden; /* Ensures the text is hidden until revealed */ white-space: nowrap; /* Prevents text from wrapping */ display: inline-block; /* Ensures the width is respected */ animation: typing 2s steps(10, end); /* Adjust duration and steps for effect */ animation-fill-mode: forwards; /* Retain the final state of the animation */ animation-delay: 1s; /* Optional: delay before starting the animation */ } .typing-effect-complete { border-right: none; /* Remove the cursor after animation */ } .blinking-cursor { animation: blink 1s step-end infinite; } @keyframes blink { from, to { opacity: 1; } 50% { opacity: 0; } } .hide-scrollbar::-webkit-scrollbar { @apply hidden; } .hide-scrollbar { -ms-overflow-style: none; scrollbar-width: none; } .custom_scrollbar::-webkit-scrollbar { width: 6px; } .custom_scrollbar::-webkit-scrollbar-thumb { background-color: #d1d5db; border-radius: 8px; cursor: pointer; transition: background-color 0.2s ease; } .custom_scrollbar::-webkit-scrollbar-thumb:hover { background-color: #9ca3af; } .custom_scrollbar::-webkit-scrollbar-track { background-color: #f9fafb; border-radius: 8px; } .custom_scrollbar::-webkit-scrollbar-corner { background-color: transparent; } /* Firefox scrollbar styling */ .custom_scrollbar { scrollbar-width: thin; scrollbar-color: #d1d5db #f9fafb; } /* word animation */ @keyframes slideUp { 0% { transform: translateY(0); } 100% { transform: translateY(-50%); } } @keyframes slideDown { 0% { transform: translateY(-50%); } 100% { transform: translateY(0); } } .animate-slideUp { animation: slideUp 20s linear infinite; } .animate-slideDown { animation: slideDown 20s linear infinite; } /* Add hover pause */ .animate-slideUp:hover, .animate-slideDown:hover { animation-play-state: paused; } /* box animation */ .research-mode-bg { position: relative; overflow: hidden; } .research-mode-bg::before { content: ''; position: absolute; top: 50%; left: 50%; width: 0; height: 0; background: radial-gradient(circle, rgba(56, 48, 161, 0.1) 0%, transparent 70%); transform: translate(-50%, -50%); border-radius: 50%; animation: rippleEffect 0.6s ease-out forwards; pointer-events: none; } @keyframes rippleEffect { 0% { width: 0; height: 0; opacity: 0.8; } 100% { width: 200%; height: 200%; opacity: 1; } } /* Markdown Styles */ .markdown-content { @apply prose prose-slate max-w-none; } /* .markdown-content h1 { @apply text-xl font-bold mb-4 text-gray-900; } .markdown-content h2 { @apply text-lg font-bold mb-3 text-gray-900; } .markdown-content h3 { @apply text-base font-bold mb-2 text-gray-900; } .markdown-content h4 { @apply text-sm font-bold mb-2 text-gray-900; } .markdown-content h5 { @apply text-xs font-bold mb-1 text-gray-900; } .markdown-content h6 { @apply text-xs font-semibold mb-1 text-gray-900; } .markdown-content p { @apply mb-4 text-base text-gray-700; } .markdown-content ul { @apply list-disc pl-6 mb-4; } .markdown-content ol { @apply list-decimal pl-6 mb-4; } .markdown-content li { @apply mb-1; } .markdown-content strong, .markdown-content b { @apply font-bold text-gray-900; } .markdown-content em { @apply italic; } .markdown-content blockquote { @apply border-l-4 border-gray-300 pl-4 italic my-4; } .markdown-content code { @apply bg-gray-100 px-1 py-0.5 rounded font-mono text-sm; } .markdown-content pre { @apply bg-gray-100 p-4 rounded-lg my-4 overflow-x-auto; } .markdown-content a { @apply text-blue-600 hover:text-blue-800 underline; } .markdown-content table { @apply min-w-full border border-gray-300 my-4; } .markdown-content th { @apply bg-gray-100 border border-gray-300 px-4 py-2 font-bold; } .markdown-content td { @apply border border-gray-300 px-4 py-2; } */ /* Override Tailwind Typography prose heading sizes for markdown editor */ .prose h1 { font-size: 18px !important; font-weight: bold !important; margin-bottom: 1rem !important; color: rgb(17 24 39) !important; } .prose h2 { font-size: 16px !important; font-weight: bold !important; margin-bottom: 0.75rem !important; color: rgb(17 24 39) !important; } .prose h3 { font-size: 14px !important; font-weight: bold !important; margin-bottom: 0.5rem !important; color: rgb(17 24 39) !important; } .prose h4 { font-size: 12px !important; font-weight: bold !important; margin-bottom: 0.5rem !important; color: rgb(17 24 39) !important; } .prose h5 { font-size: 11px !important; font-weight: bold !important; margin-bottom: 0.25rem !important; color: rgb(17 24 39) !important; } .prose h6 { font-size: 10px !important; font-weight: 600 !important; margin-bottom: 0.25rem !important; color: rgb(17 24 39) !important; } /* MDXEditor styles */ .mdxeditor-toolbar-group { @apply flex items-center gap-1 p-1; } .mdxeditor-toolbar { @apply flex items-center gap-2 p-2 border-b; } .mdxeditor-button { @apply p-1 rounded hover:bg-gray-100 transition-colors; } .mdxeditor-button[data-active=true] { @apply bg-gray-100; } /* tippy-box */ .tippy-box { max-width: 100% !important; } .is-editor-empty:first-child::before { color: #adb5bd; content: attr(data-placeholder); float: left; height: 0; pointer-events: none; } /* code editor */ .container_editor_area { tab-size: 4ch; max-height: 400px; overflow: auto; margin: 1.67em 0; } .container__content { width: 440px; max-width: 100%; padding: 10px; text-align: center; } .container__content_area { tab-size: 4ch; /* max-height: 600px; */ overflow: auto; margin: 1.67em 0; } .container__editor { font-variant-ligatures: common-ligatures; background-color: #fafafa; border-radius: 3px; } .container__editor textarea { outline: 0; } /* Syntax highlighting */ .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #90a4ae; } .token.punctuation { color: #9e9e9e; } .namespace { opacity: 0.7; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: #e91e63; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #4caf50; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #795548; } .token.atrule, .token.attr-value, .token.keyword { color: #3f51b5; } .token.function { color: #f44336; } .token.regex, .token.important, .token.variable { color: #ff9800; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } /* Hamster wheel loading animation — from Uiverse.io by Nawsome */ .wheel-and-hamster { --dur: 1s; position: relative; width: 12em; height: 12em; font-size: 14px; } .wheel, .hamster, .hamster div, .spoke { position: absolute; } .wheel, .spoke { border-radius: 50%; top: 0; left: 0; width: 100%; height: 100%; } .wheel { background: radial-gradient(100% 100% at center,hsla(0,0%,60%,0) 47.8%,hsl(0,0%,60%) 48%); z-index: 2; } .hamster { animation: hamster var(--dur) ease-in-out infinite; top: 50%; left: calc(50% - 3.5em); width: 7em; height: 3.75em; transform: rotate(4deg) translate(-0.8em,1.85em); transform-origin: 50% 0; z-index: 1; } .hamster__head { animation: hamsterHead var(--dur) ease-in-out infinite; background: hsl(30,90%,55%); border-radius: 70% 30% 0 100% / 40% 25% 25% 60%; box-shadow: 0 -0.25em 0 hsl(30,90%,80%) inset, 0.75em -1.55em 0 hsl(30,90%,90%) inset; top: 0; left: -1.5em; width: 2.75em; height: 2.5em; transform-origin: 100% 50%; } .hamster__ear { animation: hamsterEar var(--dur) ease-in-out infinite; background: hsl(0,90%,85%); border-radius: 50%; box-shadow: -0.25em 0 hsl(30,90%,55%) inset; top: -0.25em; right: -0.25em; width: 0.75em; height: 0.75em; transform-origin: 50% 75%; } .hamster__eye { animation: hamsterEye var(--dur) linear infinite; background-color: hsl(0,0%,0%); border-radius: 50%; top: 0.375em; left: 1.25em; width: 0.5em; height: 0.5em; } .hamster__nose { background: hsl(0,90%,75%); border-radius: 35% 65% 85% 15% / 70% 50% 50% 30%; top: 0.75em; left: 0; width: 0.2em; height: 0.25em; } .hamster__body { animation: hamsterBody var(--dur) ease-in-out infinite; background: hsl(30,90%,90%); border-radius: 50% 30% 50% 30% / 15% 60% 40% 40%; box-shadow: 0.1em 0.75em 0 hsl(30,90%,55%) inset, 0.15em -0.5em 0 hsl(30,90%,80%) inset; top: 0.25em; left: 1.5em; width: 4.5em; height: 3em; transform-origin: 17% 50%; transform-style: preserve-3d; } .hamster__limb--fr, .hamster__limb--fl { clip-path: polygon(0 0,100% 0,70% 80%,60% 100%,0% 100%,40% 80%); top: 2em; left: 0.5em; width: 1em; height: 1.5em; transform-origin: 50% 0; } .hamster__limb--fr { animation: hamsterFRLimb var(--dur) linear infinite; background: linear-gradient(hsl(30,90%,80%) 80%,hsl(0,90%,75%) 80%); transform: rotate(15deg) translateZ(-1px); } .hamster__limb--fl { animation: hamsterFLLimb var(--dur) linear infinite; background: linear-gradient(hsl(30,90%,90%) 80%,hsl(0,90%,85%) 80%); transform: rotate(15deg); } .hamster__limb--br, .hamster__limb--bl { border-radius: 0.75em 0.75em 0 0; clip-path: polygon(0 0,100% 0,100% 30%,70% 90%,70% 100%,30% 100%,40% 90%,0% 30%); top: 1em; left: 2.8em; width: 1.5em; height: 2.5em; transform-origin: 50% 30%; } .hamster__limb--br { animation: hamsterBRLimb var(--dur) linear infinite; background: linear-gradient(hsl(30,90%,80%) 90%,hsl(0,90%,75%) 90%); transform: rotate(-25deg) translateZ(-1px); } .hamster__limb--bl { animation: hamsterBLLimb var(--dur) linear infinite; background: linear-gradient(hsl(30,90%,90%) 90%,hsl(0,90%,85%) 90%); transform: rotate(-25deg); } .hamster__tail { animation: hamsterTail var(--dur) linear infinite; background: hsl(0,90%,85%); border-radius: 0.25em 50% 50% 0.25em; box-shadow: 0 -0.2em 0 hsl(0,90%,75%) inset; top: 1.5em; right: -0.5em; width: 1em; height: 0.5em; transform: rotate(30deg) translateZ(-1px); transform-origin: 0.25em 0.25em; } .spoke { animation: spoke var(--dur) linear infinite; background: radial-gradient(100% 100% at center,hsl(0,0%,60%) 4.8%,hsla(0,0%,60%,0) 5%), linear-gradient(hsla(0,0%,55%,0) 46.9%,hsl(0,0%,65%) 47% 52.9%,hsla(0,0%,65%,0) 53%) 50% 50% / 99% 99% no-repeat; } @keyframes hamster { from, to { transform: rotate(4deg) translate(-0.8em,1.85em); } 50% { transform: rotate(0) translate(-0.8em,1.85em); } } @keyframes hamsterHead { from, 25%, 50%, 75%, to { transform: rotate(0); } 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(8deg); } } @keyframes hamsterEye { from, 90%, to { transform: scaleY(1); } 95% { transform: scaleY(0); } } @keyframes hamsterEar { from, 25%, 50%, 75%, to { transform: rotate(0); } 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(12deg); } } @keyframes hamsterBody { from, 25%, 50%, 75%, to { transform: rotate(0); } 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-2deg); } } @keyframes hamsterFRLimb { from, 25%, 50%, 75%, to { transform: rotate(50deg) translateZ(-1px); } 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-30deg) translateZ(-1px); } } @keyframes hamsterFLLimb { from, 25%, 50%, 75%, to { transform: rotate(-30deg); } 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(50deg); } } @keyframes hamsterBRLimb { from, 25%, 50%, 75%, to { transform: rotate(-60deg) translateZ(-1px); } 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(20deg) translateZ(-1px); } } @keyframes hamsterBLLimb { from, 25%, 50%, 75%, to { transform: rotate(20deg); } 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-60deg); } } @keyframes hamsterTail { from, 25%, 50%, 75%, to { transform: rotate(30deg) translateZ(-1px); } 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(10deg) translateZ(-1px); } } @keyframes spoke { from { transform: rotate(0); } to { transform: rotate(-1turn); } }