Files
EonaCat.DoxaApi/DoxaApi/UI/Assets/app.css
T
2026-06-23 20:12:51 +02:00

2263 lines
43 KiB
CSS

*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
/* Method colors */
--m-get: #34d399;
--m-post: #818cf8;
--m-put: #fbbf24;
--m-patch: #fb923c;
--m-delete: #f87171;
--m-head: #c084fc;
--m-options: #22d3ee;
--m-default: #64748b;
/* Accent palette */
--accent: #6366f1;
--accent-2: #a5b4fc;
--accent-dim: rgba(99,102,241,.13);
--accent-glow: rgba(99,102,241,.35);
/* Typography */
--font-sans: 'Inter', system-ui, -apple-system, sans-serif;
--font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
/* Radii */
--radius-xs: 3px;
--radius-sm: 5px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
--radius-2xl: 20px;
/* Sizing */
--topbar-h: 54px;
--sidebar-w: 256px;
--try-w: 390px;
/* Transitions */
--ease: cubic-bezier(.22,.1,.36,1);
}
/* DARK THEME (default) */
[data-theme="dark"] {
--bg-0: #0a0b10;
--bg-1: #0f1117;
--bg-2: #161921;
--bg-3: #1e2130;
--bg-4: #252a3a;
--bg-5: #2d3347;
--border: rgba(255,255,255,.055);
--border-2: rgba(255,255,255,.10);
--border-3: rgba(255,255,255,.16);
--text-1: #eef0f8;
--text-2: #7a82a6;
--text-3: #404766;
--shadow-sm: 0 1px 4px rgba(0,0,0,.5), 0 2px 8px rgba(0,0,0,.3);
--shadow: 0 4px 20px rgba(0,0,0,.6), 0 8px 40px rgba(0,0,0,.3);
--shadow-lg: 0 16px 60px rgba(0,0,0,.7), 0 4px 16px rgba(0,0,0,.4);
--topbar-bg: rgba(15,17,23,.92);
--sidebar-bg: rgba(15,17,23,.98);
--code-bg: #070809;
--icon-sun: block;
--icon-moon: none;
}
/* LIGHT THEME */
[data-theme="light"] {
--bg-0: #f4f5fa;
--bg-1: #ffffff;
--bg-2: #f0f1f8;
--bg-3: #e6e8f4;
--bg-4: #dcdff0;
--bg-5: #d2d5e8;
--border: rgba(0,0,0,.07);
--border-2: rgba(0,0,0,.12);
--border-3: rgba(0,0,0,.18);
--text-1: #0e1028;
--text-2: #5a628c;
--text-3: #9298b8;
--shadow-sm: 0 1px 4px rgba(0,0,0,.08), 0 2px 8px rgba(0,0,0,.04);
--shadow: 0 4px 20px rgba(0,0,0,.1), 0 8px 40px rgba(0,0,0,.05);
--shadow-lg: 0 16px 60px rgba(0,0,0,.15), 0 4px 16px rgba(0,0,0,.07);
--topbar-bg: rgba(255,255,255,.92);
--sidebar-bg: rgba(255,255,255,.98);
--code-bg: #f8f9fd;
--icon-sun: none;
--icon-moon: block;
}
/* BASE */
html, body {
height: 100%;
overflow: hidden;
background: var(--bg-0);
color: var(--text-1);
font-family: var(--font-sans);
font-size: 13px;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
button {
cursor: pointer;
border: none;
background: none;
font: inherit;
color: inherit;
}
input, textarea, select {
font: inherit;
color: inherit;
background: transparent;
border: none;
outline: none;
}
select {
appearance: none;
-webkit-appearance: none;
}
a {
color: var(--accent-2);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
::-webkit-scrollbar {
width: 4px;
height: 4px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: var(--bg-4);
border-radius: 99px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--bg-5);
}
/* TOP BAR */
.topbar {
position: fixed;
inset: 0 0 auto 0;
z-index: 100;
height: var(--topbar-h);
display: flex;
align-items: center;
gap: 8px;
padding: 0 16px;
background: var(--topbar-bg);
border-bottom: 1px solid var(--border);
backdrop-filter: blur(20px) saturate(1.8);
-webkit-backdrop-filter: blur(20px) saturate(1.8);
}
.topbar-left {
display: flex;
align-items: center;
gap: 14px;
flex-shrink: 0;
}
.topbar-center {
flex: 1;
min-width: 0;
max-width: 480px;
margin: 0 auto;
}
.topbar-right {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
/* Brand */
.brand {
display: flex;
align-items: center;
gap: 10px;
user-select: none;
}
.brand-icon {
width: 32px;
height: 32px;
border-radius: var(--radius-md);
background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #06b6d4 100%);
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2px 12px rgba(99,102,241,.5), 0 0 0 1px rgba(255,255,255,.1) inset;
position: relative;
overflow: hidden;
}
.brand-icon::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(255,255,255,.15) 0%, transparent 60%);
}
.brand-icon svg {
width: 16px;
height: 16px;
color: #fff;
position: relative;
z-index: 1;
}
.brand-text {
display: flex;
align-items: baseline;
gap: 8px;
}
.brand-name {
font-size: 15px;
font-weight: 700;
color: var(--text-1);
letter-spacing: -.02em;
background: linear-gradient(135deg, var(--text-1) 40%, var(--accent-2) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.brand-ver {
font-size: 10px;
font-weight: 600;
font-family: var(--font-mono);
padding: 2px 7px;
background: var(--bg-3);
border: 1px solid var(--border-2);
border-radius: 99px;
color: var(--text-2);
-webkit-text-fill-color: var(--text-2);
}
/* API Selector */
.api-switcher-wrap {
display: flex;
}
.api-select {
height: 30px;
padding: 0 28px 0 10px;
font-size: 12px;
font-weight: 500;
background: var(--bg-2) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 6l4 4 4-4' stroke='%236b7280' stroke-width='1.6' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") right 6px center / 16px no-repeat;
border: 1px solid var(--border-2);
border-radius: var(--radius-md);
color: var(--text-1);
cursor: pointer;
transition: border-color .15s, box-shadow .15s;
}
.api-select:hover {
border-color: var(--accent);
}
.api-select:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-dim);
outline: none;
}
/* Search */
.search-wrap {
display: flex;
align-items: center;
gap: 8px;
height: 36px;
background: var(--bg-2);
border: 1px solid var(--border-2);
border-radius: var(--radius-lg);
padding: 0 12px;
transition: border-color .15s, box-shadow .15s;
}
.search-wrap:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-dim);
}
.search-ico {
width: 15px;
height: 15px;
color: var(--text-3);
flex-shrink: 0;
}
.search-wrap input {
flex: 1;
font-size: 13px;
background: none;
color: var(--text-1);
}
.search-wrap input::placeholder {
color: var(--text-3);
}
.search-kbd {
font-family: var(--font-mono);
font-size: 10px;
padding: 2px 6px;
background: var(--bg-3);
border: 1px solid var(--border-2);
border-radius: 4px;
color: var(--text-3);
flex-shrink: 0;
}
/* Topbar Buttons */
.tb-btn {
display: flex;
align-items: center;
gap: 5px;
height: 30px;
padding: 0 10px;
font-size: 12px;
font-weight: 500;
border-radius: var(--radius-md);
color: var(--text-2);
transition: background .13s, color .13s;
white-space: nowrap;
position: relative;
}
.tb-btn svg {
width: 14px;
height: 14px;
flex-shrink: 0;
}
.tb-btn:hover {
background: var(--bg-3);
color: var(--text-1);
}
.tb-btn-accent {
background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
color: #fff !important;
box-shadow: 0 2px 10px rgba(99,102,241,.4);
}
.tb-btn-accent:hover {
background: linear-gradient(135deg, #7c7ff5 0%, #9d71fa 100%) !important;
box-shadow: 0 3px 14px rgba(99,102,241,.55);
}
.tb-divider {
width: 1px;
height: 22px;
background: var(--border-2);
margin: 0 4px;
}
/* Auth dot */
.auth-dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: #34d399;
box-shadow: 0 0 6px rgba(52,211,153,.7);
margin-left: 2px;
}
/* Export dropdown */
.export-group {
display: flex;
align-items: center;
gap: 4px;
position: relative;
}
.export-dropdown {
position: relative;
}
.export-menu {
position: absolute;
top: calc(100% + 8px);
right: 0;
min-width: 170px;
background: var(--bg-2);
border: 1px solid var(--border-2);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-lg);
overflow: hidden;
display: none;
z-index: 200;
animation: pop-in .14s var(--ease);
}
.export-menu.open {
display: block;
}
@keyframes pop-in {
from {
opacity: 0;
transform: translateY(-6px) scale(.97);
}
to {
opacity: 1;
transform: none;
}
}
.export-item {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 9px 14px;
font-size: 12px;
transition: background .1s;
}
.export-item:hover {
background: var(--bg-3);
}
.export-fmt {
font-weight: 600;
color: var(--text-1);
}
.export-desc {
color: var(--text-3);
font-family: var(--font-mono);
font-size: 10px;
}
.chevdown {
width: 14px;
height: 14px;
margin-left: 2px;
}
/* Icon buttons */
.icon-btn {
width: 30px;
height: 30px;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-2);
transition: background .13s, color .13s;
}
.icon-btn:hover {
background: var(--bg-3);
color: var(--text-1);
}
.icon-btn svg {
width: 16px;
height: 16px;
}
[data-theme="dark"] .icon-sun {
display: block;
}
[data-theme="dark"] .icon-moon {
display: none;
}
[data-theme="light"] .icon-sun {
display: none;
}
[data-theme="light"] .icon-moon {
display: block;
}
/*
LAYOUT
*/
.app-shell {
display: flex;
flex-direction: column;
height: 100vh;
}
.layout {
display: flex;
flex: 1;
overflow: hidden;
margin-top: var(--topbar-h);
}
/*
SIDEBAR
*/
.sidebar {
width: var(--sidebar-w);
flex-shrink: 0;
overflow-y: auto;
overflow-x: hidden;
background: var(--sidebar-bg);
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
}
.sidebar-inner {
padding: 10px 0 40px;
}
/* Overview link */
.nav-overview-link {
display: flex;
align-items: center;
gap: 9px;
width: 100%;
padding: 8px 16px;
font-size: 12.5px;
font-weight: 500;
color: var(--text-2);
border-radius: 0;
margin-bottom: 6px;
transition: background .12s, color .12s;
}
.nav-overview-link svg {
width: 15px;
height: 15px;
flex-shrink: 0;
}
.nav-overview-link:hover {
background: var(--bg-2);
color: var(--text-1);
}
.nav-overview-link.active {
background: var(--accent-dim);
color: var(--accent-2);
position: relative;
}
.nav-overview-link.active::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 2px;
background: var(--accent);
border-radius: 0 2px 2px 0;
}
/* Nav groups */
.nav-group {
}
.nav-group-header {
display: flex;
align-items: center;
gap: 7px;
width: 100%;
padding: 8px 16px 4px;
font-size: 10.5px;
font-weight: 700;
color: var(--text-3);
letter-spacing: .08em;
text-transform: uppercase;
transition: color .12s;
}
.nav-group-header:hover {
color: var(--text-2);
}
.chev {
width: 11px;
height: 11px;
transition: transform .2s var(--ease);
flex-shrink: 0;
}
.nav-group.collapsed .chev {
transform: rotate(-90deg);
}
.nav-group-count {
margin-left: auto;
font-size: 10px;
font-weight: 600;
padding: 0 6px;
height: 17px;
line-height: 17px;
background: var(--bg-3);
border-radius: 99px;
color: var(--text-3);
font-family: var(--font-mono);
}
.nav-endpoints {
}
.nav-group.collapsed .nav-endpoints {
display: none;
}
/* Endpoint items */
.nav-endpoint {
display: flex;
align-items: center;
gap: 9px;
width: 100%;
padding: 5px 16px 5px 28px;
font-size: 12px;
color: var(--text-2);
transition: background .1s, color .1s;
border-left: 2px solid transparent;
overflow: hidden;
min-height: 30px;
}
.nav-endpoint:hover {
background: var(--bg-2);
color: var(--text-1);
}
.nav-endpoint.active {
background: color-mix(in srgb, var(--method-color, var(--accent)) 8%, var(--bg-2));
color: var(--text-1);
border-left-color: var(--method-color, var(--accent));
}
.nav-endpoint.deprecated {
opacity: .45;
text-decoration: line-through;
}
/* Method tags */
.method-tag {
font-family: var(--font-mono);
font-size: 8.5px;
font-weight: 800;
padding: 2px 5px;
border-radius: var(--radius-xs);
flex-shrink: 0;
letter-spacing: .06em;
background: color-mix(in srgb, var(--method-color, var(--m-default)) 18%, transparent);
color: var(--method-color, var(--m-default));
min-width: 40px;
text-align: center;
}
.nav-endpoint-path {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: var(--font-mono);
font-size: 11.5px;
}
.nav-empty {
padding: 20px 16px;
color: var(--text-3);
font-size: 12px;
line-height: 1.6;
}
/* Skeleton */
.skeleton {
background: linear-gradient(90deg, var(--bg-3) 25%, var(--bg-4) 50%, var(--bg-3) 75%);
background-size: 200% 100%;
animation: shimmer 1.6s infinite;
border-radius: 4px;
}
@keyframes shimmer {
from {
background-position: 200% 0;
}
to {
background-position: -200% 0;
}
}
/*
MAIN CONTENT
*/
.content-area {
flex: 1;
display: flex;
overflow: hidden;
min-width: 0;
}
/* Detail pane */
.detail-pane {
flex: 1;
overflow-y: auto;
min-width: 0;
background: var(--bg-0);
}
.detail-content {
max-width: 820px;
margin: 0 auto;
padding: 36px 44px 100px;
}
/* Try pane */
.try-pane {
width: var(--try-w);
flex-shrink: 0;
overflow-y: auto;
background: var(--bg-1);
border-left: 1px solid var(--border);
}
.try-content {
padding: 18px;
}
/*
ANIMATIONS
*/
.fade-in {
animation: fade-up .22s var(--ease);
}
@keyframes fade-up {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: none;
}
}
/*
OVERVIEW
*/
.overview-hero {
margin-bottom: 36px;
padding-bottom: 36px;
border-bottom: 1px solid var(--border);
}
.overview-eyebrow {
display: flex;
align-items: center;
gap: 7px;
font-size: 10.5px;
font-weight: 700;
letter-spacing: .12em;
text-transform: uppercase;
color: var(--accent-2);
margin-bottom: 16px;
opacity: .85;
}
.overview-eyebrow svg {
width: 13px;
height: 13px;
}
.overview-title {
font-size: 30px;
font-weight: 800;
line-height: 1.15;
letter-spacing: -.03em;
margin-bottom: 12px;
background: linear-gradient(135deg, var(--text-1) 40%, var(--accent-2) 120%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.overview-desc {
font-size: 14px;
color: var(--text-2);
line-height: 1.75;
max-width: 540px;
}
.overview-meta {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 18px;
}
.overview-pill {
display: flex;
align-items: center;
gap: 6px;
font-size: 11.5px;
font-family: var(--font-mono);
padding: 5px 12px;
background: var(--bg-2);
border: 1px solid var(--border-2);
border-radius: 99px;
color: var(--text-2);
}
.overview-pill svg {
width: 12px;
height: 12px;
}
/* Stats */
.overview-stats {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
margin-bottom: 36px;
}
.overview-stat {
background: var(--bg-1);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 20px 16px;
text-align: center;
position: relative;
overflow: hidden;
transition: border-color .2s, transform .2s var(--ease);
}
.overview-stat::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, var(--accent) 0%, #8b5cf6 50%, #06b6d4 100%);
opacity: 0;
transition: opacity .2s;
}
.overview-stat:hover::before {
opacity: 1;
}
.overview-stat:hover {
border-color: var(--border-2);
transform: translateY(-1px);
}
.overview-stat-value {
font-size: 28px;
font-weight: 800;
color: var(--text-1);
line-height: 1;
letter-spacing: -.03em;
}
.overview-stat-label {
font-size: 10.5px;
font-weight: 600;
color: var(--text-3);
margin-top: 6px;
text-transform: uppercase;
letter-spacing: .07em;
}
/* Overview section */
.overview-section-title {
font-size: 10.5px;
font-weight: 700;
letter-spacing: .1em;
text-transform: uppercase;
color: var(--text-3);
margin: 32px 0 14px;
}
/* Security badges */
.security-badges {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.security-badge {
display: flex;
align-items: center;
gap: 7px;
font-size: 12px;
font-weight: 500;
padding: 6px 12px;
background: var(--bg-2);
border: 1px solid var(--border-2);
border-radius: var(--radius-md);
color: var(--text-2);
transition: border-color .14s, color .14s, background .14s;
}
.security-badge svg {
width: 12px;
height: 12px;
}
button.security-badge:hover {
border-color: var(--accent);
color: var(--accent-2);
background: var(--accent-dim);
}
/* Overview group cards */
.overview-group-card {
background: var(--bg-1);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
margin-bottom: 12px;
overflow: hidden;
transition: border-color .15s, box-shadow .15s;
}
.overview-group-card:hover {
border-color: var(--border-2);
box-shadow: var(--shadow-sm);
}
.overview-group-card-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 18px;
font-size: 13px;
font-weight: 700;
border-bottom: 1px solid var(--border);
background: var(--bg-2);
}
.overview-group-routes {
}
.overview-route-row {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 18px;
cursor: pointer;
transition: background .1s;
border-bottom: 1px solid var(--border);
}
.overview-route-row:last-child {
border-bottom: none;
}
.overview-route-row:hover {
background: var(--bg-2);
}
.method-badge {
font-family: var(--font-mono);
font-size: 9.5px;
font-weight: 800;
padding: 3px 8px;
border-radius: var(--radius-sm);
flex-shrink: 0;
background: color-mix(in srgb, var(--method-color, var(--m-default)) 15%, transparent);
color: var(--method-color, var(--m-default));
min-width: 54px;
text-align: center;
letter-spacing: .04em;
}
.route-path {
font-family: var(--font-mono);
font-size: 12px;
flex-shrink: 0;
color: var(--text-1);
}
.route-summary {
font-size: 12px;
color: var(--text-2);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
}
.route-arrow {
width: 14px;
height: 14px;
color: var(--text-3);
flex-shrink: 0;
margin-left: auto;
}
/*
ENDPOINT DETAIL
*/
.endpoint-header {
margin-bottom: 32px;
padding-bottom: 28px;
border-bottom: 1px solid var(--border);
}
.breadcrumb {
display: flex;
align-items: center;
gap: 6px;
font-size: 11.5px;
color: var(--text-3);
margin-bottom: 14px;
}
.breadcrumb svg {
width: 13px;
height: 13px;
}
.breadcrumb .current {
color: var(--text-2);
}
.request-line {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 14px;
padding: 12px 16px;
background: var(--bg-1);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
border-left: 3px solid var(--method-color, var(--accent));
}
.endpoint-path {
font-family: var(--font-mono);
font-size: 14px;
font-weight: 500;
color: var(--text-1);
letter-spacing: -.01em;
flex: 1;
}
.copy-route-btn {
width: 28px;
height: 28px;
border-radius: var(--radius-sm);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-3);
transition: background .12s, color .12s;
flex-shrink: 0;
}
.copy-route-btn svg {
width: 14px;
height: 14px;
}
.copy-route-btn:hover {
background: var(--bg-3);
color: var(--text-1);
}
.endpoint-summary {
font-size: 22px;
font-weight: 800;
letter-spacing: -.03em;
margin-bottom: 8px;
line-height: 1.2;
}
.endpoint-description {
font-size: 13.5px;
color: var(--text-2);
line-height: 1.75;
}
.deprecated-banner {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 16px;
margin: 14px 0;
background: color-mix(in srgb, #fbbf24 8%, transparent);
border: 1px solid color-mix(in srgb, #fbbf24 25%, transparent);
border-radius: var(--radius-md);
font-size: 12px;
color: #fbbf24;
}
.deprecated-banner svg {
width: 14px;
height: 14px;
flex-shrink: 0;
}
/* Sections */
.section {
margin-bottom: 32px;
}
.section-title {
font-size: 10.5px;
font-weight: 700;
letter-spacing: .1em;
text-transform: uppercase;
color: var(--text-3);
margin-bottom: 14px;
display: flex;
align-items: center;
gap: 8px;
}
.count {
font-size: 10px;
font-family: var(--font-mono);
padding: 0 7px;
height: 17px;
line-height: 17px;
background: var(--bg-3);
border-radius: 99px;
color: var(--text-2);
font-weight: 600;
}
/* Param table */
.param-table {
width: 100%;
border-collapse: collapse;
font-size: 12.5px;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
overflow: hidden;
}
.param-table thead th {
text-align: left;
padding: 9px 14px;
font-size: 10px;
font-weight: 700;
letter-spacing: .09em;
text-transform: uppercase;
color: var(--text-3);
background: var(--bg-1);
border-bottom: 1px solid var(--border);
}
.param-table tbody tr {
border-bottom: 1px solid var(--border);
transition: background .1s;
}
.param-table tbody tr:last-child {
border-bottom: none;
}
.param-table tbody tr:hover {
background: var(--bg-2);
}
.param-table td {
padding: 10px 14px;
vertical-align: top;
}
.param-name {
font-family: var(--font-mono);
font-size: 12.5px;
font-weight: 600;
}
.param-required {
color: #f87171;
margin-left: 2px;
font-size: 14px;
line-height: 1;
}
.param-loc {
display: inline-block;
padding: 2px 7px;
font-size: 9.5px;
font-weight: 700;
background: var(--bg-3);
border-radius: var(--radius-xs);
color: var(--text-2);
font-family: var(--font-mono);
letter-spacing: .03em;
}
.param-type {
font-family: var(--font-mono);
font-size: 11px;
color: var(--accent-2);
}
.param-desc {
color: var(--text-2);
font-size: 12px;
}
/* Schema box */
.schema-box {
background: var(--code-bg);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 16px 20px;
font-family: var(--font-mono);
font-size: 12px;
line-height: 1.85;
white-space: pre-wrap;
overflow-x: auto;
}
.schema-key {
color: #93c5fd;
}
.schema-type {
color: var(--accent-2);
}
.schema-comment {
color: var(--text-3);
font-style: italic;
}
.schema-punct {
color: var(--text-3);
}
.schema-required-mark {
color: #f87171;
}
.schema-nullable-mark {
color: #fbbf24;
}
/* Response blocks */
.response-block {
margin-bottom: 10px;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
overflow: hidden;
transition: border-color .15s;
}
.response-block:hover {
border-color: var(--border-2);
}
.response-block-header {
display: flex;
align-items: center;
gap: 12px;
padding: 11px 16px;
background: var(--bg-1);
}
.response-block-body {
padding: 14px 16px;
border-top: 1px solid var(--border);
background: var(--bg-0);
}
/* Status pills */
.status-pill {
display: inline-flex;
align-items: center;
justify-content: center;
font-family: var(--font-mono);
font-size: 11px;
font-weight: 700;
padding: 3px 9px;
border-radius: var(--radius-sm);
flex-shrink: 0;
letter-spacing: .03em;
}
.status-2xx {
background: color-mix(in srgb, #34d399 14%, transparent);
color: #34d399;
}
.status-4xx {
background: color-mix(in srgb, #fbbf24 14%, transparent);
color: #fbbf24;
}
.status-5xx {
background: color-mix(in srgb, #f87171 14%, transparent);
color: #f87171;
}
.response-desc {
font-size: 13px;
color: var(--text-2);
}
/*
TRY-IT PANE
*/
.try-empty {
text-align: center;
padding: 70px 28px;
color: var(--text-3);
font-size: 13px;
line-height: 1.75;
}
.try-empty svg {
width: 28px;
height: 28px;
margin: 0 auto 14px;
display: block;
opacity: .3;
}
.try-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
padding-bottom: 14px;
border-bottom: 1px solid var(--border);
}
.try-title {
font-size: 11px;
font-weight: 700;
letter-spacing: .1em;
text-transform: uppercase;
color: var(--text-2);
display: flex;
align-items: center;
gap: 8px;
}
.live-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--method-color, var(--accent));
box-shadow: 0 0 8px var(--method-color, var(--accent));
animation: pulse-dot 2.2s ease-in-out infinite;
}
@keyframes pulse-dot {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: .5;
transform: scale(.85);
}
}
/* Try tabs */
.try-tabs {
display: flex;
gap: 2px;
margin-bottom: 16px;
background: var(--bg-2);
border-radius: var(--radius-md);
padding: 3px;
border: 1px solid var(--border);
}
.try-tab {
flex: 1;
height: 27px;
font-size: 12px;
font-weight: 600;
border-radius: calc(var(--radius-md) - 2px);
color: var(--text-3);
transition: background .12s, color .12s, box-shadow .12s;
}
.try-tab.active {
background: var(--bg-1);
color: var(--text-1);
box-shadow: var(--shadow-sm);
}
.try-tab:hover:not(.active) {
color: var(--text-2);
background: var(--bg-3);
}
/* Auth banner */
.auth-banner {
display: flex;
align-items: center;
gap: 9px;
padding: 10px 14px;
border-radius: var(--radius-md);
font-size: 12px;
margin-bottom: 14px;
}
.auth-banner svg {
width: 14px;
height: 14px;
flex-shrink: 0;
}
.auth-set {
background: color-mix(in srgb, #34d399 10%, transparent);
border: 1px solid color-mix(in srgb, #34d399 22%, transparent);
color: #34d399;
}
.auth-missing {
background: color-mix(in srgb, #fbbf24 10%, transparent);
border: 1px solid color-mix(in srgb, #fbbf24 22%, transparent);
color: #fbbf24;
}
.auth-banner-link {
margin-left: auto;
font-size: 11.5px;
font-weight: 700;
text-decoration: underline;
background: none;
border: none;
cursor: pointer;
color: inherit;
opacity: .85;
flex-shrink: 0;
}
.auth-banner-link:hover {
opacity: 1;
}
/* Mock toggle */
.mock-toggle-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 9px 14px;
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: var(--radius-md);
font-size: 12px;
margin-bottom: 14px;
cursor: pointer;
transition: border-color .13s;
}
.mock-toggle-row:hover {
border-color: var(--border-2);
}
.mock-toggle-label {
color: var(--text-2);
}
/* Switch */
.switch {
position: relative;
display: inline-block;
width: 34px;
height: 19px;
flex-shrink: 0;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.switch-slider {
position: absolute;
inset: 0;
cursor: pointer;
background: var(--bg-4);
border-radius: 99px;
transition: background .2s;
}
.switch-slider::before {
content: '';
position: absolute;
width: 13px;
height: 13px;
border-radius: 50%;
left: 3px;
top: 3px;
background: #fff;
transition: transform .2s var(--ease);
box-shadow: 0 1px 4px rgba(0,0,0,.3);
}
.switch input:checked + .switch-slider {
background: var(--accent);
}
.switch input:checked + .switch-slider::before {
transform: translateX(15px);
}
/* Field groups */
.field-group {
margin-bottom: 14px;
}
.field-label {
font-size: 10.5px;
font-weight: 700;
letter-spacing: .08em;
text-transform: uppercase;
color: var(--text-3);
margin-bottom: 9px;
}
.field-sublabel {
font-size: 12px;
font-weight: 500;
color: var(--text-2);
margin-bottom: 5px;
display: flex;
align-items: center;
gap: 7px;
}
.type-hint {
font-family: var(--font-mono);
font-size: 10px;
color: var(--text-3);
}
.req-star {
color: #f87171;
}
.field-input {
width: 100%;
background: var(--bg-2);
border: 1px solid var(--border-2);
border-radius: var(--radius-md);
padding: 8px 12px;
font-size: 12.5px;
color: var(--text-1);
transition: border-color .15s, box-shadow .15s;
}
.field-input:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-dim);
outline: none;
}
textarea.field-input {
min-height: 120px;
font-family: var(--font-mono);
font-size: 12px;
resize: vertical;
line-height: 1.7;
}
/* Send button */
.send-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
width: 100%;
height: 40px;
font-size: 13px;
font-weight: 700;
letter-spacing: -.01em;
background: var(--method-color, var(--accent));
color: #fff;
border-radius: var(--radius-md);
margin-top: 6px;
transition: opacity .14s, transform .1s var(--ease), box-shadow .14s;
box-shadow: 0 2px 12px color-mix(in srgb, var(--method-color, var(--accent)) 45%, transparent);
position: relative;
overflow: hidden;
}
.send-btn::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(180deg, rgba(255,255,255,.15) 0%, transparent 100%);
}
.send-btn svg {
width: 16px;
height: 16px;
position: relative;
z-index: 1;
}
.send-btn span {
position: relative;
z-index: 1;
}
.send-btn:hover {
opacity: .88;
transform: translateY(-1px);
box-shadow: 0 4px 18px color-mix(in srgb, var(--method-color, var(--accent)) 55%, transparent);
}
.send-btn:active {
transform: scale(.98);
}
.send-btn:disabled {
opacity: .4;
cursor: not-allowed;
transform: none;
}
/* Code language tabs */
.code-lang-tabs {
display: flex;
gap: 2px;
margin-bottom: 12px;
overflow-x: auto;
background: var(--bg-2);
border-radius: var(--radius-md);
padding: 3px;
border: 1px solid var(--border);
}
.code-lang-tab {
padding: 4px 12px;
font-size: 11px;
font-weight: 600;
border-radius: calc(var(--radius-md) - 2px);
color: var(--text-3);
white-space: nowrap;
transition: background .12s, color .12s;
}
.code-lang-tab.active {
background: var(--accent-dim);
color: var(--accent-2);
}
.code-lang-tab:hover:not(.active) {
background: var(--bg-3);
color: var(--text-2);
}
.curl-header-row {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 9px;
}
.curl-box {
background: var(--code-bg);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 16px;
font-family: var(--font-mono);
font-size: 11.5px;
line-height: 1.85;
overflow-x: auto;
white-space: pre;
}
.curl-flag {
color: #38bdf8;
}
.curl-string {
color: #86efac;
}
/* Response panel */
.response-panel {
margin-top: 14px;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
overflow: hidden;
animation: fade-up .18s var(--ease);
}
.response-meta {
display: flex;
align-items: center;
gap: 9px;
padding: 9px 14px;
background: var(--bg-2);
border-bottom: 1px solid var(--border);
}
.response-time {
display: flex;
align-items: center;
gap: 5px;
font-size: 11px;
color: var(--text-3);
font-family: var(--font-mono);
}
.response-time svg {
width: 12px;
height: 12px;
}
.mock-badge {
display: flex;
align-items: center;
gap: 4px;
font-size: 10.5px;
font-weight: 600;
padding: 2px 8px;
border-radius: 99px;
background: color-mix(in srgb, var(--accent) 14%, transparent);
color: var(--accent-2);
}
.response-body {
padding: 16px;
font-family: var(--font-mono);
font-size: 12px;
line-height: 1.75;
white-space: pre-wrap;
word-break: break-all;
max-height: 400px;
overflow-y: auto;
background: var(--code-bg);
}
.response-error {
color: #f87171;
}
/* JSON highlighting */
.json-key {
color: #93c5fd;
}
.json-string {
color: #86efac;
}
.json-number {
color: #fdba74;
}
.json-boolean {
color: #f9a8d4;
}
.json-null {
color: var(--text-3);
}
/* Copy button */
.copy-btn {
display: flex;
align-items: center;
gap: 5px;
height: 27px;
padding: 0 9px;
font-size: 11px;
font-weight: 600;
background: var(--bg-3);
border: 1px solid var(--border-2);
border-radius: var(--radius-sm);
color: var(--text-2);
transition: background .12s, color .12s, border-color .12s;
}
.copy-btn svg {
width: 12px;
height: 12px;
}
.copy-btn:hover {
background: var(--bg-4);
color: var(--text-1);
border-color: var(--border-3);
}
/* Spinner */
.spinner {
display: inline-block;
width: 14px;
height: 14px;
border: 2px solid rgba(255,255,255,.25);
border-top-color: #fff;
border-radius: 50%;
animation: spin .65s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* History */
.history-empty {
padding: 28px 16px;
text-align: center;
color: var(--text-3);
font-size: 12px;
line-height: 1.75;
}
.history-item {
padding: 10px;
border-bottom: 1px solid var(--border);
cursor: pointer;
transition: background .1s;
border-radius: var(--radius-sm);
margin-bottom: 2px;
}
.history-item:hover {
background: var(--bg-2);
}
.history-item-row {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 4px;
}
.history-item-time {
font-size: 11px;
color: var(--text-3);
margin-left: auto;
font-family: var(--font-mono);
}
.history-item-path {
font-family: var(--font-mono);
font-size: 11px;
color: var(--text-2);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/*
MODAL
*/
.modal-backdrop {
position: fixed;
inset: 0;
z-index: 1000;
background: rgba(0,0,0,.7);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
animation: fade-up .14s var(--ease);
}
.modal-box {
background: var(--bg-1);
border: 1px solid var(--border-2);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
width: 100%;
max-width: 490px;
max-height: 82vh;
display: flex;
flex-direction: column;
overflow: hidden;
animation: modal-in .18s var(--ease);
}
.modal-wide {
max-width: 660px;
}
@keyframes modal-in {
from {
opacity: 0;
transform: scale(.95) translateY(14px);
}
to {
opacity: 1;
transform: none;
}
}
.modal-head {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 22px;
border-bottom: 1px solid var(--border);
flex-shrink: 0;
background: var(--bg-2);
}
.modal-title {
font-size: 15px;
font-weight: 700;
letter-spacing: -.02em;
}
.modal-close {
width: 30px;
height: 30px;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-3);
transition: background .12s, color .12s;
}
.modal-close:hover {
background: var(--bg-3);
color: var(--text-1);
}
.modal-close svg {
width: 15px;
height: 15px;
}
.modal-body {
overflow-y: auto;
padding: 20px 22px;
flex: 1;
}
/* Auth card */
.auth-scheme-card {
background: var(--bg-2);
border: 1px solid var(--border-2);
border-radius: var(--radius-lg);
padding: 18px;
margin-bottom: 12px;
transition: border-color .15s;
}
.auth-scheme-card:hover {
border-color: var(--border-3);
}
.auth-scheme-head {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 14px;
}
.auth-scheme-name {
font-size: 13.5px;
font-weight: 700;
}
.auth-scheme-type {
font-size: 9.5px;
font-weight: 700;
padding: 2px 7px;
border-radius: var(--radius-xs);
background: var(--bg-3);
color: var(--text-2);
font-family: var(--font-mono);
letter-spacing: .04em;
text-transform: uppercase;
}
.auth-scheme-status {
width: 9px;
height: 9px;
border-radius: 50%;
background: var(--bg-5);
margin-left: auto;
flex-shrink: 0;
transition: background .25s, box-shadow .25s;
}
.auth-scheme-status.set {
background: #34d399;
box-shadow: 0 0 8px rgba(52,211,153,.5);
}
.auth-scheme-desc {
font-size: 12px;
color: var(--text-2);
margin-bottom: 12px;
line-height: 1.6;
}
.auth-clear-btn {
font-size: 11px;
color: var(--text-3);
margin-top: 8px;
text-decoration: underline;
transition: color .12s;
}
.auth-clear-btn:hover {
color: #f87171;
}
/* Console */
.console-trigger {
display: flex;
gap: 8px;
margin-bottom: 14px;
}
.request-url {
flex: 1;
}
/* Diff */
.diff-summary {
display: flex;
gap: 16px;
padding: 14px 0;
margin-bottom: 18px;
border-bottom: 1px solid var(--border);
flex-wrap: wrap;
}
.diff-row {
display: flex;
align-items: center;
gap: 9px;
font-size: 12.5px;
color: var(--text-2);
margin-bottom: 6px;
}
.diff-tag {
font-family: var(--font-mono);
font-size: 11px;
padding: 2px 8px;
border-radius: var(--radius-sm);
font-weight: 700;
}
.diff-tag-added {
background: color-mix(in srgb, #34d399 14%, transparent);
color: #34d399;
}
.diff-tag-removed {
background: color-mix(in srgb, #f87171 14%, transparent);
color: #f87171;
}
.diff-tag-changed {
background: color-mix(in srgb, #fbbf24 14%, transparent);
color: #fbbf24;
}
/*
DASHBOARD DRAWER
*/
.drawer {
position: fixed;
top: var(--topbar-h);
right: 0;
bottom: 0;
z-index: 90;
width: 420px;
background: var(--bg-1);
border-left: 1px solid var(--border);
box-shadow: var(--shadow-lg);
display: flex;
flex-direction: column;
animation: slide-in .22s var(--ease);
}
@keyframes slide-in {
from {
transform: translateX(40px);
opacity: 0;
}
to {
transform: none;
opacity: 1;
}
}
.drawer-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 22px;
border-bottom: 1px solid var(--border);
flex-shrink: 0;
background: var(--bg-2);
}
.drawer-title {
font-size: 15px;
font-weight: 700;
letter-spacing: -.02em;
}
.drawer-body {
overflow-y: auto;
padding: 20px;
flex: 1;
}
/* Dashboard stat cards */
.stat-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin-bottom: 22px;
}
.stat-card {
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 16px;
text-align: center;
position: relative;
overflow: hidden;
}
.stat-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, var(--accent) 0%, #8b5cf6 100%);
}
.stat-card-err::before {
background: linear-gradient(90deg, #f87171, #f43f5e);
}
.stat-card-err .stat-val {
color: #f87171;
}
.stat-val {
font-size: 24px;
font-weight: 800;
line-height: 1;
color: var(--text-1);
letter-spacing: -.03em;
}
.stat-lbl {
font-size: 10.5px;
font-weight: 600;
color: var(--text-3);
margin-top: 5px;
text-transform: uppercase;
letter-spacing: .07em;
}
.dash-section {
margin-bottom: 16px;
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
overflow: hidden;
}
.dash-section-title {
padding: 13px 16px 0;
font-size: 12px;
font-weight: 700;
color: var(--text-2);
text-transform: uppercase;
letter-spacing: .07em;
}
/* Request items */
.request-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 9px 16px;
border-bottom: 1px solid var(--border);
font-size: 12px;
transition: background .1s;
}
.request-item:last-child {
border-bottom: none;
}
.request-item:hover {
background: var(--bg-3);
}
.request-method {
font-family: var(--font-mono);
font-size: 9.5px;
font-weight: 800;
padding: 2px 7px;
border-radius: var(--radius-xs);
margin-right: 8px;
background: var(--bg-3);
color: var(--text-2);
letter-spacing: .04em;
}
.request-time {
font-size: 11px;
color: var(--text-3);
font-family: var(--font-mono);
}
.request-status-error {
color: #f87171 !important;
}
.request-status-success {
color: #34d399 !important;
}
/*
UTILITIES
*/
code {
font-family: var(--font-mono);
font-size: .9em;
background: var(--bg-3);
border: 1px solid var(--border);
padding: 1px 6px;
border-radius: var(--radius-xs);
}