@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"); :root { font-family: "Inter", system-ui, sans-serif; line-height: 1.5; font-weight: 400; color: #101828; background: #f0f2f5; font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; --bg: #f0f2f5; --surface: #ffffff; --surface-2: #f7f8fa; --border: #e4e7ec; --border-2: #d0d5dd; --text-1: #101828; --text-2: #344054; --text-3: #667085; --text-4: #98a2b3; --teal: #0d9488; --teal-dark: #0f766e; --teal-bg: #f0fdfa; --teal-border: #99f6e4; --rest-c: #059669; --rest-bg: #ecfdf5; --rest-border: #a7f3d0; --gql-c: #d946ef; --gql-bg: #fdf4ff; --gql-border: #f0abfc; --grpc-c: #6366f1; --grpc-bg: #eef2ff; --grpc-border: #c7d2fe; --draft-c: #b45309; --draft-bg: #fffbeb; --pub-c: #065f46; --pub-bg: #ecfdf5; --sidebar-bg: #0d1117; --sidebar-border: rgba(255, 255, 255, 0.07); --sidebar-text: #e6edf3; --sidebar-muted: #7d8590; --sidebar-hover: rgba(255, 255, 255, 0.05); --sidebar-active-bg: rgba(13, 148, 136, 0.18); --sidebar-active-border: rgba(13, 148, 136, 0.5); --radius-sm: 6px; --radius: 10px; --radius-lg: 14px; --radius-xl: 18px; --shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.05); --shadow: 0 1px 3px rgba(16, 24, 40, 0.1), 0 1px 2px rgba(16, 24, 40, 0.06); --shadow-md: 0 4px 8px -2px rgba(16, 24, 40, 0.1), 0 2px 4px -2px rgba(16, 24, 40, 0.06); } *, *::before, *::after { box-sizing: border-box; } body { margin: 0; min-width: 320px; min-height: 100vh; } a { color: inherit; text-decoration: none; } button, input, textarea, select { font: inherit; } button { cursor: pointer; } #root { min-height: 100vh; } .layout-shell { display: grid; grid-template-columns: 240px 1fr; min-height: 100vh; } .layout-sidebar { display: flex; flex-direction: column; background: var(--sidebar-bg); border-right: 1px solid var(--sidebar-border); position: sticky; top: 0; height: 100vh; overflow-y: auto; } .sidebar-logo { display: flex; align-items: center; gap: 10px; padding: 20px 16px 16px; border-bottom: 1px solid var(--sidebar-border); } .logo-mark { width: 32px; height: 32px; border-radius: 8px; background: linear-gradient(135deg, #0d9488, #0891b2); color: #ffffff; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .logo-mark svg { width: 18px; height: 18px; } .logo-text { display: grid; gap: 1px; } .logo-text strong { font-size: 13px; font-weight: 700; color: var(--sidebar-text); letter-spacing: -0.01em; } .logo-text span { font-size: 11px; color: var(--sidebar-muted); } .sidebar-section { padding: 16px 8px 8px; } .sidebar-label { margin: 0 0 6px; padding: 0 8px; font-size: 11px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--sidebar-muted); } .sidebar-nav { display: grid; gap: 4px; } .nav-link { display: flex; align-items: flex-start; gap: 10px; padding: 10px; border-radius: var(--radius); border: 1px solid transparent; color: var(--sidebar-muted); transition: all 0.15s; } .nav-link:hover { background: var(--sidebar-hover); color: var(--sidebar-text); } .nav-link-active { background: var(--sidebar-active-bg); border-color: var(--sidebar-active-border); color: #2dd4bf; } .nav-copy { display: grid; gap: 3px; min-width: 0; } .nav-copy strong { font-size: 13.5px; font-weight: 600; } .nav-copy span { font-size: 12px; color: inherit; opacity: 0.8; } .nav-badge { margin-left: auto; background: rgba(255, 255, 255, 0.08); color: var(--sidebar-muted); font-size: 11px; font-weight: 600; padding: 1px 6px; border-radius: 99px; } .nav-link-active .nav-badge { background: rgba(45, 212, 191, 0.15); color: #2dd4bf; } .sidebar-divider { height: 1px; background: var(--sidebar-border); margin: 8px 16px; } .sidebar-pill-row { display: flex; gap: 6px; flex-wrap: wrap; padding: 0 8px; } .sidebar-footer { display: flex; align-items: center; gap: 10px; padding: 14px 16px; border-top: 1px solid var(--sidebar-border); margin-top: auto; } .sidebar-user-avatar { width: 28px; height: 28px; border-radius: 999px; background: linear-gradient(135deg, #0d9488, #6366f1); flex-shrink: 0; } .sidebar-user-copy { display: grid; gap: 1px; } .sidebar-user-copy strong { font-size: 12.5px; color: var(--sidebar-text); } .sidebar-user-copy span { font-size: 11px; color: var(--sidebar-muted); } .layout-main { display: flex; flex-direction: column; min-height: 100vh; } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; height: 56px; padding: 0 28px; background: var(--surface); border-bottom: 1px solid var(--border); position: sticky; top: 0; z-index: 10; } .breadcrumb { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--text-3); } .breadcrumb strong { color: var(--text-2); font-weight: 500; } .breadcrumb-separator { color: var(--border-2); } .topbar-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .main-content { width: 100%; max-width: 1480px; padding: 28px; margin: 0 auto; flex: 1; } .page-header { max-width: 1240px; margin: 0 auto 24px; } .page-header h1 { margin: 0 0 4px; font-size: 22px; font-weight: 700; letter-spacing: -0.02em; color: var(--text-1); } .page-header p { margin: 0; color: var(--text-3); font-size: 13.5px; } .workspace-badge, .protocol-pill, .status-pill { display: inline-flex; align-items: center; gap: 5px; padding: 4px 10px; border-radius: 999px; font-size: 11.5px; font-weight: 600; white-space: nowrap; } .workspace-badge { border: 1px solid var(--border); background: var(--surface-2); color: var(--text-3); } .protocol-rest { color: var(--rest-c); background: var(--rest-bg); border: 1px solid var(--rest-border); } .protocol-graphql { color: var(--gql-c); background: var(--gql-bg); border: 1px solid var(--gql-border); } .protocol-grpc { color: var(--grpc-c); background: var(--grpc-bg); border: 1px solid var(--grpc-border); } .status-draft { color: var(--draft-c); background: var(--draft-bg); } .status-published { color: var(--pub-c); background: var(--pub-bg); } .status-testing, .status-archived { color: var(--text-2); background: var(--surface-2); } .page-stack, .stack-layout, .builder-stack, .service-grid, .service-method-list { display: grid; gap: 16px; } .builder-stack { width: 100%; } .builder-content { width: 100%; max-width: 1240px; margin: 0 auto; display: grid; gap: 16px; } .page-section, .builder-card, .operation-card, .summary-card, .feedback-card, .result-panel, .hero-card, .service-card, .empty-state { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-xl); box-shadow: var(--shadow-sm); } .page-section { padding: 20px 24px; } .section-header, .builder-card-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; } .section-header { margin-bottom: 16px; } .builder-card-header { padding: 20px 24px 0; } .section-header h2, .builder-card-header h2 { margin: 0 0 2px; font-size: 15px; font-weight: 600; } .section-header p, .builder-card-header p { margin: 0; color: var(--text-3); font-size: 13px; } .section-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .builder-card-body { display: grid; gap: 16px; padding: 0 24px 24px; } .builder-content .form-grid { grid-template-columns: repeat(2, minmax(280px, 420px)); justify-content: space-between; } .proto-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } .proto-card { border: 2px solid var(--border); border-radius: var(--radius-lg); padding: 16px; cursor: pointer; transition: all 0.15s; display: grid; gap: 10px; background: var(--surface); } .proto-card:hover { transform: translateY(-1px); box-shadow: var(--shadow-md); } .selected-rest { border-color: var(--rest-c); background: var(--rest-bg); box-shadow: 0 0 0 1px var(--rest-c), var(--shadow-md); } .selected-gql { border-color: var(--gql-c); background: var(--gql-bg); box-shadow: 0 0 0 1px var(--gql-c), var(--shadow-md); } .selected-grpc { border-color: var(--grpc-c); background: var(--grpc-bg); box-shadow: 0 0 0 1px var(--grpc-c), var(--shadow-md); } .proto-card-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .proto-card-copy { display: grid; gap: 4px; text-align: left; } .proto-card-copy h3 { margin: 0; font-size: 14px; } .proto-card-copy p { margin: 0; font-size: 12.5px; color: var(--text-3); } .proto-icon { height: 28px; padding: 0 8px; border-radius: 6px; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 800; letter-spacing: 0.07em; } .pi-rest { background: var(--rest-bg); color: var(--rest-c); border: 1px solid var(--rest-border); } .pi-gql { background: var(--gql-bg); color: var(--gql-c); border: 1px solid var(--gql-border); } .pi-grpc { background: var(--grpc-bg); color: var(--grpc-c); border: 1px solid var(--grpc-border); } .proto-radio { width: 16px; height: 16px; border-radius: 50%; border: 2px solid var(--border-2); background: var(--surface); } .selected-rest .proto-radio, .selected-gql .proto-radio, .selected-grpc .proto-radio { position: relative; } .selected-rest .proto-radio { border-color: var(--rest-c); background: var(--rest-c); } .selected-gql .proto-radio { border-color: var(--gql-c); background: var(--gql-c); } .selected-grpc .proto-radio { border-color: var(--grpc-c); background: var(--grpc-c); } .selected-rest .proto-radio::after, .selected-gql .proto-radio::after, .selected-grpc .proto-radio::after { content: ""; position: absolute; inset: 4px; border-radius: 50%; background: #ffffff; } .form-grid, .split-layout, .detail-columns, .summary-grid, .target-grid, .metadata-grid, .upload-grid, .result-grid, .hero-grid, .operation-grid { display: grid; gap: 14px; } .form-grid, .split-layout, .detail-columns, .result-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .summary-grid, .target-grid, .metadata-grid, .upload-grid, .hero-grid, .operation-grid { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); } .field-block { display: grid; gap: 5px; align-content: start; } .field-block span { font-size: 12.5px; font-weight: 600; color: var(--text-2); } .field-hint { font-size: 11.5px; color: var(--text-4); } .field-block-wide { grid-column: 1 / -1; } .input, .select, .field-block input, .field-block textarea, .field-block select { width: 100%; border: 1px solid var(--border-2); border-radius: var(--radius); padding: 8px 12px; font-size: 13.5px; color: var(--text-1); background: var(--surface); transition: border-color 0.15s, box-shadow 0.15s; outline: none; } .input:focus, .select:focus, .field-block input:focus, .field-block textarea:focus, .field-block select:focus { border-color: var(--teal); box-shadow: 0 0 0 3px rgba(13, 148, 136, 0.12); } .select, .field-block select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' viewBox='0 0 24 24'%3E%3Cpath stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; padding-right: 32px; } .field-block textarea, .textarea { resize: vertical; min-height: 80px; line-height: 1.55; } .code-editor-shell { border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; } .code-editor-toolbar { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; background: #1e2330; border-bottom: 1px solid rgba(255, 255, 255, 0.06); } .code-editor-toolbar small { color: #8b949e; font-size: 11px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; } .code-editor-dots { display: flex; gap: 5px; } .code-editor-dots span { width: 10px; height: 10px; border-radius: 50%; } .code-editor-dots span:nth-child(1) { background: #ff5f56; } .code-editor-dots span:nth-child(2) { background: #ffbd2e; } .code-editor-dots span:nth-child(3) { background: #27c93f; } .textarea-code { border: 0; border-radius: 0; min-height: 180px; padding: 16px; background: #161b22; color: #c9d1d9; font-family: "JetBrains Mono", "Fira Code", monospace; font-size: 12.5px; line-height: 1.65; } .textarea-code:focus { box-shadow: none; } .info-banner { display: flex; align-items: flex-start; gap: 10px; padding: 10px 14px; border-radius: var(--radius); background: var(--teal-bg); border: 1px solid var(--teal-border); color: #134e4a; font-size: 12.5px; } .info-banner p { margin: 0; } .info-dot { width: 12px; height: 12px; border-radius: 999px; background: var(--teal); margin-top: 4px; flex-shrink: 0; } .section-divider { display: flex; align-items: center; gap: 12px; margin: 4px 0; } .section-divider-label { font-size: 12px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-4); white-space: nowrap; } .section-divider-line { flex: 1; height: 1px; background: var(--border); } .button-row { display: flex; gap: 10px; flex-wrap: wrap; } .button-primary, .button-secondary { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 9px 16px; border-radius: var(--radius); font-size: 13.5px; font-weight: 600; border: none; transition: all 0.15s; } .button-primary { background: var(--teal); color: #ffffff; box-shadow: 0 1px 2px rgba(13, 148, 136, 0.3); } .button-primary:hover { background: var(--teal-dark); box-shadow: 0 4px 8px rgba(13, 148, 136, 0.3); } .button-primary-strong { padding: 11px 22px; font-size: 14px; } .button-secondary { background: var(--surface); color: var(--text-2); border: 1px solid var(--border-2); box-shadow: var(--shadow-sm); } .button-secondary:hover { background: var(--surface-2); } .sticky-action-bar { position: sticky; bottom: 0; z-index: 30; display: flex; align-items: center; justify-content: space-between; gap: 16px; width: 100%; padding: 12px 28px; border-radius: 0; background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(16px); border: 1px solid var(--border); box-shadow: var(--shadow); } .sticky-action-copy { display: grid; gap: 6px; } .sticky-action-copy p { margin: 0; color: var(--text-3); font-size: 12.5px; } .field-error { color: #a1422c; font-size: 12px; } .body-copy { margin: 0; color: var(--text-3); } .hero-card { padding: 18px; display: grid; gap: 10px; } .hero-card h3, .operation-card h3, .result-panel h3, .service-card h3, .empty-state h3 { margin: 0; font-size: 14px; font-weight: 600; } .hero-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } .hero-metrics div { display: grid; gap: 4px; } .hero-metrics span { color: var(--text-4); font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; } .hero-metrics strong { font-size: 22px; } .toolbar-row { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; } .field-inline { width: 100%; max-width: 420px; } .toolbar-meta { display: flex; gap: 8px; flex-wrap: wrap; } .operation-card, .summary-card, .result-panel, .service-card, .empty-state { padding: 18px; } .operation-card { display: grid; gap: 12px; transition: transform 0.15s, box-shadow 0.15s; } .operation-card:hover { transform: translateY(-1px); box-shadow: var(--shadow-md); } .operation-card-top, .service-card-header, .service-method-top { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; } .operation-card-header { display: grid; gap: 4px; } .operation-name { margin: 0; color: var(--text-3); font-family: "JetBrains Mono", "Fira Code", monospace; font-size: 12.5px; } .card-link-row { display: flex; align-items: center; justify-content: space-between; color: var(--teal); font-weight: 700; font-size: 12.5px; } .key-value-list { display: grid; gap: 8px; margin: 0; } .key-value-list div { display: flex; justify-content: space-between; gap: 12px; } .key-value-list dt, .key-value-list dd { margin: 0; color: var(--text-3); } .summary-card { display: grid; gap: 4px; } .summary-card span, .target-card span { color: var(--text-4); font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; } .summary-card strong, .target-card strong { color: var(--text-1); font-size: 14px; word-break: break-word; } .detail-hero, .page-subsection { display: grid; gap: 16px; } .page-subsection-header { display: grid; gap: 4px; } .page-subsection-header h3 { margin: 0; font-size: 14px; } .page-subsection-header p, .service-card p, .empty-state p { margin: 0; color: var(--text-3); } .target-card { padding: 16px; border-radius: var(--radius-lg); background: var(--surface-2); border: 1px solid var(--border); display: grid; gap: 6px; } .feedback-card { padding: 14px 16px; } .feedback-success { border-color: rgba(6, 95, 70, 0.2); background: #ecfdf5; } .feedback-error { border-color: rgba(185, 28, 28, 0.15); background: #fef2f2; } pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: "JetBrains Mono", "Fira Code", monospace; font-size: 12px; line-height: 1.6; } .yaml-panel { padding: 16px; border-radius: var(--radius-lg); background: #161b22; color: #c9d1d9; } @media (max-width: 1160px) { .layout-shell { grid-template-columns: 1fr; } .layout-sidebar { position: static; height: auto; } .topbar { padding: 0 20px; } .main-content { padding: 20px; } .builder-content { max-width: none; } } @media (max-width: 820px) { .topbar, .section-header, .builder-card-header, .toolbar-row, .sticky-action-bar { flex-direction: column; align-items: stretch; } .form-grid, .split-layout, .detail-columns, .result-grid, .proto-grid, .hero-metrics { grid-template-columns: 1fr; } .builder-card-header, .builder-card-body, .page-section { padding-left: 16px; padding-right: 16px; } .sticky-action-bar { padding-left: 16px; padding-right: 16px; } }