diff --git a/frontend/index.html b/frontend/index.html index fa307b2d..ef83ec2e 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -66,6 +66,7 @@ *, *::before, *::after { + box-shadow: border-box; box-sizing: border-box; margin: 0; padding: 0 @@ -327,6 +328,8 @@ HERO ═══════════════════════════════════════════════════════════════ */ .hero { + position: relative; + overflow: hidden; text-align: center; padding: 64px 0 48px; animation: heroEnter 0.7s ease both; @@ -359,6 +362,8 @@ text-transform: uppercase; margin-bottom: 28px; animation: badgePop 0.5s 0.1s ease both; + position: relative; + z-index: 1; } @keyframes badgePop { @@ -400,6 +405,8 @@ letter-spacing: -0.04em; line-height: 1.16; margin-bottom: 20px; + position: relative; + z-index: 1; } .hero h1 em { @@ -417,13 +424,17 @@ max-width: 520px; margin: 0 auto 36px; line-height: 1.7; + position: relative; + z-index: 1; } .hero-cta { display: flex; gap: 12px; justify-content: center; - flex-wrap: wrap + flex-wrap: wrap; + position: relative; + z-index: 1; } .btn { @@ -737,7 +748,7 @@ min-height: 300px; max-height: 500px; height: 100%; - } + } #codeEditor { width: 100%; @@ -1050,35 +1061,39 @@ .issue-card:hover { transform: translateX(3px) } - .collapsible-summary { - cursor: pointer; - display: flex; - justify-content: space-between; - align-items: center; - font-weight: 600; - list-style: none; - font-size: 0.78rem; -} - -.collapsible-summary::-webkit-details-marker { - display: none; -} -.collapsible-summary::before { - content: "▶"; - margin-right: 8px; - font-size: 12px; -} - -details[open] > .collapsible-summary::before { - content: "▼"; -} -.issue-content { - margin-top: 12px; -} - -details.issue-card[open] { - border-left-width: 5px; -} + + .collapsible-summary { + cursor: pointer; + display: flex; + justify-content: space-between; + align-items: center; + font-weight: 600; + list-style: none; + font-size: 0.78rem; + } + + .collapsible-summary::-webkit-details-marker { + display: none; + } + + .collapsible-summary::before { + content: "▶"; + margin-right: 8px; + font-size: 12px; + } + + details[open] > .collapsible-summary::before { + content: "▼"; + } + + .issue-content { + margin-top: 12px; + } + + details.issue-card[open] { + border-left-width: 5px; + } + @keyframes cardIn { from { opacity: 0; @@ -1413,4467 +1428,16 @@ align-items: center; gap: 8px 12px; padding: 12px 14px; - list-style: none + list-style: none; } .zip-file-card summary::-webkit-details-marker { - display: none - } - - .zip-file-card summary::before { - content: ">"; - color: var(--text3); - font-size: 0.75rem; - transition: transform 0.18s ease - } - - .zip-file-card[open] summary::before { - transform: rotate(90deg) - } - - .zip-file-name { - font-family: var(--font-mono); - font-size: 0.82rem; - color: var(--text) - } - - .zip-file-meta { - color: var(--text3); - font-size: 0.74rem; - margin-left: auto - } - - .zip-file-body { - border-top: 1px solid var(--border); - padding: 12px 14px; - color: var(--text2); - font-size: 0.84rem - } - - .zip-mini-grid { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin: 10px 0 - } - - .zip-mini-grid span, - .zip-skipped { - border: 1px solid var(--border); - border-radius: var(--r2); - background: var(--bg); - color: var(--text3); - font-size: 0.74rem; - padding: 5px 8px - } - - .zip-issue { - border-left: 3px solid var(--border2); - background: var(--bg); - border-radius: var(--r2); - margin-top: 8px; - padding: 9px 10px - } - - .zip-issue.error { - border-left-color: var(--red) - } - - .zip-issue.warning { - border-left-color: var(--yellow) - } - - .zip-issue.info { - border-left-color: var(--accent) - } - - .zip-issue strong { - color: var(--text); - font-size: 0.78rem - } - - .zip-issue span { - float: right; - color: var(--text3); - font-size: 0.72rem - } - - .zip-issue p { - margin-top: 5px - } - - .suggest-header { - display: flex; - align-items: center; - gap: 8px; - margin-bottom: 6px; - } - - .suggest-cat { - font-size: 0.7rem; - font-weight: 700; - letter-spacing: 0.05em; - text-transform: uppercase; - padding: 2px 8px; - border-radius: 99px; - } - - .priority-high .suggest-cat { - background: rgba(242, 87, 87, 0.12); - color: var(--red) - } - - .priority-medium .suggest-cat { - background: rgba(245, 200, 66, 0.12); - color: var(--yellow) - } - - .priority-low .suggest-cat { - background: rgba(34, 212, 123, 0.12); - color: var(--green) - } - - .suggest-title { - font-size: 0.78rem; - font-weight: 500 - } - - .suggest-desc { - font-size: 0.82rem; - color: var(--text2); - margin-bottom: 8px; - line-height: 1.5 - } - - .suggest-example { - font-family: var(--font-mono); - font-size: 0.73rem; - background: var(--bg); - padding: 8px 12px; - border-radius: 6px; - border: 1px solid var(--border); - color: var(--text2); - white-space: pre; - overflow-x: auto; - } - - /* ── Diff View ── */ - .diff-wrapper { - margin-top: 10px; - border-radius: var(--r2); - border: 1px solid var(--border); - overflow: hidden; - font-family: var(--font-mono); - font-size: 0.72rem; - } - - .diff-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 6px 12px; - background: var(--bg3); - border-bottom: 1px solid var(--border); - font-size: 0.7rem; - color: var(--text3); - font-family: var(--font-ui); - gap: 8px; - } - - .diff-header-labels { - display: flex; - gap: 16px; - flex: 1; - } - - .diff-label { - display: flex; - align-items: center; - gap: 5px; - font-weight: 600; - font-size: 0.68rem; - text-transform: uppercase; - letter-spacing: 0.04em; - } - - .diff-label-dot { - width: 7px; - height: 7px; - border-radius: 50%; - } - - .diff-label-before .diff-label-dot { background: var(--red); } - .diff-label-after .diff-label-dot { background: var(--green); } - - .diff-view { - display: grid; - grid-template-columns: 1fr 1fr; - border-top: none; - } - - @media (max-width: 640px) { - .diff-view { - grid-template-columns: 1fr; - } - .diff-col:first-child { - border-right: none; - border-bottom: 1px solid var(--border); - } - } - - .diff-col { - overflow-x: auto; - background: var(--bg); - } - - .diff-col:first-child { - border-right: 1px solid var(--border); - } - - .diff-line { - display: flex; - align-items: flex-start; - padding: 2px 0; - min-height: 22px; - line-height: 1.6; - white-space: pre; - } - - .diff-line-num { - min-width: 32px; - padding: 0 6px; - text-align: right; - color: var(--text3); - user-select: none; - font-size: 0.65rem; - flex-shrink: 0; - border-right: 1px solid var(--border); - margin-right: 8px; - line-height: 1.6; - } - - .diff-line-content { - padding-right: 12px; - word-break: break-all; - white-space: pre-wrap; - } - - .diff-line-removed { - background: rgba(242, 87, 87, 0.13); - } - - .diff-line-removed .diff-line-num { - background: rgba(242, 87, 87, 0.18); - color: var(--red); - } - - .diff-line-removed .diff-line-content { - color: var(--red); - } - - .diff-line-added { - background: rgba(34, 212, 123, 0.10); - } - - .diff-line-added .diff-line-num { - background: rgba(34, 212, 123, 0.15); - color: var(--green); - } - - .diff-line-added .diff-line-content { - color: var(--green); - } - - .diff-line-equal { - background: transparent; - } - - .diff-line-equal .diff-line-content { - color: var(--text2); - } - - .diff-line-placeholder { - background: var(--bg3); - opacity: 0.4; - } - - .btn-copy-fix { - display: inline-flex; - align-items: center; - gap: 5px; - padding: 4px 10px; - border-radius: 6px; - font-size: 0.7rem; - font-weight: 600; - font-family: var(--font-ui); - cursor: pointer; - border: 1px solid rgba(34, 212, 123, 0.3); - background: rgba(34, 212, 123, 0.08); - color: var(--green); - transition: all var(--transition); - white-space: nowrap; - flex-shrink: 0; - } - - .btn-copy-fix:hover { - background: rgba(34, 212, 123, 0.18); - border-color: var(--green); - transform: translateY(-1px); - } - - .btn-copy-fix:active { - transform: translateY(0); - } - - .btn-copy-fix svg { - flex-shrink: 0; - } - - /* ── Clean State ── */ - .clean-state { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 40px; - gap: 12px; - text-align: center; - } - - .clean-icon { - font-size: 40px; - animation: cleanBounce 0.5s ease both + display: none; } + + - @keyframes cleanBounce { - from { - transform: scale(0.5) - } - - to { - transform: scale(1) - } - } - - .clean-state .clean-title { - font-family: var(--font-disp); - font-size: 1.1rem; - font-weight: 700; - color: var(--green) - } - - .clean-state p { - font-size: 0.85rem; - color: var(--text2) - } - - /* ═══════════════════════════════════════════════════════════════ - BOTTOM PANELS — History & Favorites -═══════════════════════════════════════════════════════════════ */ - .bottom-grid { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 16px; - animation: fadeUp 0.6s 0.5s ease both; - } - - @media(max-width:700px) { - .bottom-grid { - grid-template-columns: 1fr - } - } - - .history-list, - .fav-list { - padding: 16px; - min-height: 120px; - max-height: 280px; - overflow-y: auto; - } - - .history-item, - .fav-item { - padding: 10px 14px; - border-radius: var(--r2); - border: 1px solid var(--border); - margin-bottom: 8px; - cursor: pointer; - transition: all var(--transition); - display: flex; - align-items: center; - gap: 10px; - } - - .history-item:hover, - .fav-item:hover { - background: var(--bg3); - border-color: var(--border2); - } - -/* Delete button */ - .delete-btn { - border: none; - outline: none; - box-shadow: none; - background: transparent; - color: var(--text-3); - cursor: pointer; - padding: 4px; - margin-left: 8px; - border-radius: 6px; - display: flex; - align-items: center; - justify-content: center; - transition: all var(--transition); - } - .delete-btn:focus, - .delete-btn:focus-visible { - outline: none; - box-shadow: none; - } - .delete-btn:hover { color: #ef4444; background: rgba(239, 68, 68, 0.12); - } - .delete-btn svg { width: 16px; height: 16px; - } - .history-thumb { - font-family: var(--font-mono); - font-size: 0.72rem; - color: var(--text3); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex: 1; - } - - .history-meta { - font-size: 0.7rem; - color: var(--text3); - flex-shrink: 0 - } - - .history-lang { - font-size: 0.65rem; - font-weight: 700; - padding: 2px 7px; - border-radius: 99px; - background: var(--bg3); - color: var(--accent); - border: 1px solid rgba(91, 156, 246, 0.2); - flex-shrink: 0; - } - - .history-score { - font-size: 0.65rem; - font-weight: 700; - padding: 2px 6px; - border-radius: 4px; - flex-shrink: 0; - } - .history-score.score-good { - background: rgba(34, 212, 123, 0.15); - color: var(--green); - border: 1px solid rgba(34, 212, 123, 0.25); - } - .history-score.score-warn { - background: rgba(245, 200, 66, 0.15); - color: var(--yellow); - border: 1px solid rgba(245, 200, 66, 0.25); - } - .history-score.score-bad { - background: rgba(242, 87, 87, 0.15); - color: var(--red); - border: 1px solid rgba(242, 87, 87, 0.25); - } - - .history-issues { - font-size: 0.65rem; - font-weight: 700; - padding: 2px 6px; - border-radius: 4px; - flex-shrink: 0; - } - .history-issues.issues-clean { - background: rgba(34, 212, 123, 0.15); - color: var(--green); - border: 1px solid rgba(34, 212, 123, 0.25); - } - .history-issues.issues-exist { - background: rgba(242, 87, 87, 0.15); - color: var(--red); - border: 1px solid rgba(242, 87, 87, 0.25); - } - - .btn-clear { - padding: 6px 14px; - border-radius: var(--r2); - background: none; - border: 1px solid var(--border); - color: var(--text3); - font-size: 0.75rem; - cursor: pointer; - transition: all var(--transition); - } - - .btn-clear:hover { - border-color: var(--red); - color: var(--red) - } - - .list-empty { - display: flex; - align-items: center; - justify-content: center; - height: 80px; - font-size: 0.82rem; - color: var(--text3); - } - - /* ═══════════════════════════════════════════════════════════════ - API CONFIG -═══════════════════════════════════════════════════════════════ */ - .api-config-row { - display: flex; - flex-direction: column; - gap: 8px; - padding: 12px 18px; - border-top: 1px solid var(--border); - font-size: 0.78rem; - } - - .api-config-inner { - display: flex; - align-items: center; - gap: 8px - } - - .api-status { - display: flex; - align-items: center; - gap: 6px; - color: var(--text3) - } - - .api-dot { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--text3); - animation: blink 2s infinite; - } - - .api-dot.connected { - background: var(--green) - } - - #apiUrl { - flex: 1; - padding: 7px 12px; - border-radius: var(--r2); - background: var(--bg); - border: 1px solid var(--border); - color: var(--text); - font-size: 0.78rem; - font-family: var(--font-mono); - outline: none; - transition: border-color var(--transition); - } - - #apiUrl:focus { - border-color: var(--accent) - } - - /* ═══════════════════════════════════════════════════════════════ - TOAST -═══════════════════════════════════════════════════════════════ */ - #toastContainer { - position: fixed; - bottom: 24px; - right: 24px; - display: flex; - flex-direction: column; - gap: 8px; - z-index: 9999; - } - - .toast { - padding: 12px 18px; - border-radius: var(--r2); - background: var(--bg2); - border: 1px solid var(--border2); - box-shadow: var(--shadow); - font-size: 0.84rem; - display: flex; - align-items: center; - gap: 10px; - min-width: 220px; - animation: toastIn 0.3s ease; - color: var(--text); - } - - @keyframes toastIn { - from { - opacity: 0; - transform: translateY(10px) scale(0.95) - } - - to { - opacity: 1; - transform: none - } - } - - .toast.fadeout { - animation: toastOut 0.3s ease forwards - } - - @keyframes toastOut { - to { - opacity: 0; - transform: translateY(10px) scale(0.95) - } - } - - .toast-icon { - display: flex; - align-items: center; - flex-shrink: 0 - } - - /* ═══════════════════════════════════════════════════════════════ - LOADING SHIMMER -═══════════════════════════════════════════════════════════════ */ - .shimmer-card { - height: 80px; - border-radius: var(--r2); - background: linear-gradient(90deg, var(--bg3) 25%, var(--bg2) 50%, var(--bg3) 75%); - background-size: 200% 100%; - animation: shimmer 1.4s ease infinite; - margin-bottom: 10px; - } - - @keyframes shimmer { - 0% { - background-position: 200% 0 - } - - 100% { - background-position: -200% 0 - } - } - - /* ═══════════════════════════════════════════════════════════════ - FOOTER -═══════════════════════════════════════════════════════════════ */ - footer { - text-align: center; - padding: 32px 0 24px; - border-top: 1px solid var(--border); - margin-top: 40px; - color: var(--text3); - font-size: 0.82rem; - } - - footer a { - color: var(--text3); - text-decoration: none; - transition: color var(--transition) - } - - footer a:hover { - color: var(--accent) - } - - .footer-logo { - font-family: var(--font-disp); - font-size: 1.1rem; - font-weight: 800; - color: var(--text2); - margin-bottom: 8px; - } - - /* ═══════════════════════════════════════════════════════════════ - RESULT ACTIONS BAR -═══════════════════════════════════════════════════════════════ */ - .result-actions { - display: flex; - align-items: center; - gap: 8px; - padding: 10px 16px; - border-top: 1px solid var(--border); - } - - .result-actions .icon-btn { - font-size: 11px; - gap: 4px; - width: auto; - padding: 0 10px; - height: 28px - } - - /* ═══════════════════════════════════════════════════════════════ - STAT BAR (quick summary at top of result) -═══════════════════════════════════════════════════════════════ */ -.stat-bar{ - display:flex;gap:8px;flex-wrap:wrap; - margin-bottom:16px; -} -.stat-chip{ - flex:1;min-width:80px; - padding:10px 14px;border-radius:var(--r2); - background:var(--bg3);border:1px solid var(--border); - text-align:center; -} -.stat-chip-num{ - font-family:var(--font-disp);font-size:1.4rem;font-weight:800; - line-height:1; -} -.stat-chip-label{font-size:0.7rem;color:var(--text3);margin-top:2px} -.stat-chip.error-chip .stat-chip-num{color:var(--red)} -.stat-chip.warn-chip .stat-chip-num{color:var(--yellow)} -.stat-chip.info-chip .stat-chip-num{color:var(--accent)} - -/* responsive */ -@media(max-width:600px){ - .hero h1{font-size:2.2rem} - nav{flex-wrap:wrap;gap:8px} - .nav-links .nav-link span{display:none} - .hero{padding:50px 0 40px} - .hero-sub{font-size:0.98rem} - .features-row{display:flex;flex-direction:column;gap:8px;max-width:340px;margin-inline:auto;padding:16px 0 40px} - .feat-pill{gap:10px;padding:10px 14px;min-width:0} - .feat-pill-icon{width:32px;height:32px;flex-shrink:0} - .feat-pill-info{min-width:0;overflow-wrap:break-word} - .feat-pill-info .feat-pill-title{font-size:0.82rem;line-height:1.25} - .feat-pill-info p{font-size:0.74rem;line-height:1.25} - .workspace{gap:14px} - #workspace > .panel{grid-column:1 !important;min-width:0} - .panel-header{padding:12px 14px} - .mode-row{gap:6px;padding:10px 14px} - .mode-btn{padding:8px 4px;font-size:0.74rem} - .analyze-row{padding:10px 14px} - .btn-analyze{padding:14px} - .result-content{min-height:280px;max-height:420px;padding:14px} - .bottom-grid{gap:14px} - .history-list,.fav-list{max-height:200px} - .score-ring-wrap{flex-direction:column;text-align:center;gap:12px} - .stat-bar{gap:6px} - .stat-chip{padding:8px 10px} - .stat-chip-num{font-size:1.2rem} - #toastContainer{bottom:12px;right:12px;left:12px} - .toast{min-width:unset;width:100%} - .hero-cta{gap:8px} - .btn{padding:11px 18px;font-size:0.85rem} -} -@media(max-width:400px){ - .app{padding:0 14px 60px} - .hero h1{font-size:1.9rem} - .lang-tab{padding:7px 10px;font-size:0.72rem} - .result-tab{padding:9px 12px;font-size:0.75rem} -} - -/* ── Live Collaboration ── */ -.collab-toolbar-btn { - display: inline-flex; - align-items: center; - gap: 7px; - min-height: 30px; - padding: 5px 10px; - border: 1px solid var(--border); - border-radius: var(--r2); - background: var(--bg3); - color: var(--text2); - font-family: var(--font-ui); - font-size: 0.76rem; - font-weight: 700; - cursor: pointer; - transition: all var(--transition); -} - -.collab-toolbar-btn:hover, -.collab-toolbar-btn[aria-expanded="true"] { - color: var(--text); - border-color: var(--accent); - background: rgba(91, 156, 246, 0.1); -} - -.collab-status-dot { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--text3); -} - -.collab-status-dot.connected { - background: var(--green); - box-shadow: 0 0 0 4px rgba(34, 212, 123, 0.12); -} - -.collab-user-count { - min-width: 18px; - padding: 1px 5px; - border-radius: 999px; - background: var(--bg); - color: var(--text3); - text-align: center; -} - -.collab-backdrop { - position: fixed; - inset: 0; - z-index: 1090; - background: rgba(0, 0, 0, 0.34); - backdrop-filter: blur(2px); -} - -.collab-drawer { - position: fixed; - top: 0; - right: 0; - z-index: 1100; - width: min(390px, 92vw); - height: 100vh; - overflow-y: auto; - padding: 18px; - background: var(--bg2); - border-left: 1px solid var(--border); - box-shadow: -18px 0 45px rgba(0, 0, 0, 0.25); - transform: translateX(105%); - visibility: hidden; - transition: transform 0.24s ease, visibility 0.24s ease; -} - -.collab-drawer.open { - transform: translateX(0); - visibility: visible; -} - -.collab-drawer-header { - display: flex; - justify-content: space-between; - gap: 12px; - padding-bottom: 14px; - border-bottom: 1px solid var(--border); -} - -.collab-drawer-header h2 { - margin: 0 0 4px; - font-family: var(--font-disp); - font-size: 1rem; -} - -.collab-drawer-header p { - margin: 0; - color: var(--text3); - font-size: 0.75rem; -} - -.collab-close-btn { - width: 32px; - height: 32px; - border: 1px solid var(--border); - border-radius: var(--r2); - background: var(--bg3); - color: var(--text2); - cursor: pointer; -} - -.collab-close-btn:hover { - color: var(--text); - border-color: var(--accent); -} - -.collab-drawer-section { - padding: 16px 0; - border-bottom: 1px solid var(--border); -} - -.collab-section-heading { - display: flex; - justify-content: space-between; - margin-bottom: 10px; - color: var(--text2); - font-size: 0.78rem; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.04em; -} - -.collab-panel-top, -.collab-comment-row { - display: grid; - grid-template-columns: 1fr; - gap: 8px; -} - -.collab-comment-row { - margin-top: 10px; -} - -.collab-drawer input { - width: 100%; - padding: 9px 10px; - border-radius: var(--r2); - border: 1px solid var(--border); - background: var(--bg3); - color: var(--text); - font-family: var(--font-ui); - font-size: 0.8rem; -} - -.collab-drawer button { - padding: 9px 12px; - border-radius: var(--r2); - border: 1px solid var(--border2); - background: rgba(91, 156, 246, 0.12); - color: var(--accent); - cursor: pointer; - font-weight: 700; - font-size: 0.78rem; -} - -.collab-drawer button:hover:not(:disabled) { - border-color: var(--accent); -} - -.collab-drawer button:disabled { - opacity: 0.55; - cursor: not-allowed; -} - -.collab-status { - margin-top: 8px; - font-size: 0.74rem; - color: var(--text2); -} - -.collab-notice { - margin-top: 14px; - padding: 10px 12px; - border: 1px solid rgba(245, 146, 62, 0.4); - border-radius: var(--r2); - background: rgba(245, 146, 62, 0.12); - color: var(--text); - font-size: 0.78rem; - line-height: 1.45; -} - -.collab-users { - display: flex; - flex-wrap: wrap; - gap: 6px; - margin-top: 8px; -} - -.collab-user-pill { - display: inline-flex; - align-items: center; - gap: 6px; - padding: 4px 8px; - border-radius: 999px; - background: var(--bg3); - border: 1px solid var(--border); - font-size: 0.72rem; - color: var(--text2); -} - -.collab-dot { - width: 8px; - height: 8px; - border-radius: 50%; -} - -.collab-comments { - margin-top: 10px; - display: grid; - gap: 6px; -} - -.collab-comment { - padding: 8px; - border-radius: var(--r2); - background: var(--bg3); - border: 1px solid var(--border); - font-size: 0.76rem; - color: var(--text2); -} - -.collab-comment strong { - color: var(--text); -} - -.collab-line-input { - max-width: 100%; -} - -.collab-editor-shell { - position: relative; - flex: 1; - min-width: 0; - height: 100%; -} - -.collab-editor-shell textarea { - width: 100%; - height: 100%; -} - -.remote-cursor-layer { - position: absolute; - inset: 0; - z-index: 4; - overflow: hidden; - pointer-events: none; -} - -.remote-cursor { - position: absolute; - width: 2px; - height: 22px; - border-radius: 1px; - pointer-events: none; -} - -.remote-cursor-label { - position: absolute; - left: 0; - bottom: 100%; - max-width: 130px; - padding: 2px 5px; - border-radius: 4px 4px 4px 0; - color: #fff; - font-family: var(--font-ui); - font-size: 10px; - font-weight: 700; - line-height: 1.3; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - - - - - -
-
- -
- - - - - -
-
-
- Open Source · AI-Powered · Free -
-

Debug. Understand.
Ship faster.

-

- Paste your code and get instant bug detection, plain-English explanations, and actionable improvement - suggestions — no account needed. -

-
- - - - - - - Star on GitHub - -
-
- - -
-
-
- - -
-
-

40+ Bug Patterns

-

Python, JS, TS, Java, C++

-
-
-
-
- - -
-
-

Code Explanation

-

Plain English breakdowns

-
-
-
-
- -
-
-

Smart Suggestions

-

Quality score + grade

-
-
-
-
- -
-
-

Dark / Light Mode

-

Persisted preference

-
-
-
-
- -
-
-

File Upload

-

.py .js .ts .java .cpp .kt .zip

-
-
-
- - -
- - -
-
-
- - - - -
-
- - -
- - - - - -
- -
- - -
1
- -
- - - -
- -
- - - - -
- - -
-
-
Analysis Results
-
-
- -
- - - -
-
- -
-
- -

No analysis yet

-

Paste your code and click Analyze to see results

-
- -
- -
-
- -

No bugs scanned

-

Run analysis to detect issues in your code

-
- -
- -
-
- -

No suggestions yet

-

Run analysis to get improvement ideas

-
- -
-
- - - -
-
- - -
-
-
-
Query History
- - - -
-
- Sort: - - Order: - -
-
-
No history yet. Run your first analysis.
-
-
- - Page 1 - -
-
-
-
-
Saved Favorites
- -
-
-
No favorites saved yet.
-
-
-
- -
- - - - - - -
- - - - - - + \ No newline at end of file