:root{--color-bg:#f5f6f8;--color-surface:#fff;--color-border:#e2e5e9;--color-text:#1a1d23;--color-text-secondary:#6b7280;--color-primary:#4361ee;--color-primary-light:#eef2ff;--color-shift:#3a86ff;--color-reduce:#fb8500;--color-goto:#2a9d8f;--color-accept:#7209b7;--color-conflict:#ef233c;--color-highlight:#fff8e1;--color-highlight-border:#ffc107;--color-terminal-edge:#3a86ff;--color-nonterminal-edge:#2a9d8f;--color-node:#fff;--color-node-border:#adb5bd;--color-node-highlight:#ffc107;--radius:10px;--radius-sm:6px;--shadow:0 1px 4px #0000000f;--shadow-md:0 4px 12px #00000014;--font-mono:"SF Mono", "JetBrains Mono", "Fira Code", "Consolas", monospace;--header-height:48px;--mobile-tab-height:56px}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{width:100%;height:100%;overflow:hidden}body{background:var(--color-bg);color:var(--color-text);-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;line-height:1.5}.app-container{flex-direction:column;height:100vh;display:flex;overflow:hidden}.app-header{height:var(--header-height);min-height:var(--header-height);background:var(--color-surface);border-bottom:1px solid var(--color-border);z-index:100;box-shadow:var(--shadow);align-items:center;gap:16px;padding:0 20px;display:flex}.app-header h1{color:var(--color-primary);white-space:nowrap;font-size:1.05rem;font-weight:700}.app-header .controls{align-items:center;gap:10px;display:flex}.app-main{height:calc(100vh - var(--header-height));grid-template-columns:300px 1fr;display:grid;overflow:hidden}.sidebar{border-right:1px solid var(--color-border);background:var(--color-surface);flex-direction:column;gap:10px;padding:12px;display:flex;overflow-y:auto}.main-content{flex-direction:column;height:100%;display:flex;overflow:hidden}.graph-area{background:var(--color-bg);border-bottom:1px solid var(--color-border);flex:1;min-height:0;position:relative}.table-area{background:var(--color-surface);height:40%;min-height:160px;max-height:50%;padding:10px 14px;overflow:auto}.empty-state{color:var(--color-text-secondary);text-align:center;flex:1;justify-content:center;align-items:center;padding:20px;display:flex}.empty-title{margin-bottom:6px;font-size:1.1rem}.empty-subtitle{font-size:.82rem}.app-container.mobile{flex-direction:column;height:100dvh;display:flex;overflow:hidden}.app-container.mobile .app-header{gap:12px;height:50px;min-height:50px;padding:0 14px}.app-container.mobile .app-header h1{font-size:1.05rem}.mobile-content{flex-direction:column;flex:1;display:flex;overflow:hidden}.mobile-panel{-webkit-overflow-scrolling:touch;flex-direction:column;flex:1;gap:12px;padding:14px;display:flex;overflow-y:auto}.mobile-info-panels{flex-direction:column;gap:10px;display:flex}.mobile-table-panel{-webkit-overflow-scrolling:touch;flex:1;padding:12px;overflow:auto}.mobile-empty{color:var(--color-text-secondary);text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:40px 20px;display:flex}.mobile-empty p{font-size:.95rem}.app-container.mobile .graph-area{border-bottom:none;flex:1;min-height:0}.mobile-tabs{height:var(--mobile-tab-height);min-height:var(--mobile-tab-height);border-top:1px solid var(--color-border);background:var(--color-surface);padding-bottom:env(safe-area-inset-bottom,0px);display:flex;box-shadow:0 -1px 8px #0000000a}.mobile-tab-btn{color:var(--color-text-secondary);background:0 0;border:none;border-radius:0;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:3px;padding:6px 0;transition:all .2s;display:flex;position:relative}.mobile-tab-btn.active{color:var(--color-primary)}.mobile-tab-btn.active:after{content:"";background:var(--color-primary);border-radius:0 0 3px 3px;width:24px;height:3px;position:absolute;top:0;left:50%;transform:translate(-50%)}.mobile-tab-btn .tab-icon{font-size:1.3rem}.mobile-tab-btn .tab-label{font-size:.68rem;font-weight:500}button{cursor:pointer;border:1px solid var(--color-border);background:var(--color-surface);border-radius:var(--radius-sm);-webkit-tap-highlight-color:transparent;padding:8px 14px;font-size:.85rem;font-weight:500;transition:all .15s}button:active{transform:scale(.97)}button.primary{background:var(--color-primary);color:#fff;border-color:var(--color-primary);box-shadow:0 2px 8px #4361ee40}button.primary:active{background:#3651d4}select{border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);appearance:none;padding:8px 10px;font-size:.85rem}.grammar-editor{position:relative}.editor-header{justify-content:space-between;align-items:center;margin-bottom:8px;display:flex}.editor-label{font-size:.9rem;font-weight:600}.editor-actions{align-items:center;gap:6px;display:flex}.editor-actions select{padding:5px 8px;font-size:.78rem}.kb-toggle-btn{padding:5px 10px;font-size:.9rem;line-height:1}.grammar-textarea{width:100%;font-family:var(--font-mono);letter-spacing:1px;border:1px solid var(--color-border);border-radius:var(--radius);resize:none;background:var(--color-surface);min-height:100px;max-height:180px;padding:12px;font-size:.95rem;line-height:1.8;overflow-y:auto}.grammar-textarea:focus{border-color:var(--color-primary);outline:none;box-shadow:0 0 0 3px #4361ee1a}.compute-btn{border-radius:var(--radius);width:100%;margin-top:8px;padding:12px;font-size:.9rem;font-weight:600}.error-msg{color:var(--color-conflict);border-radius:var(--radius-sm);background:#fef2f2;border:1px solid #fecaca;margin-top:6px;padding:8px 10px;font-size:.82rem}.kb-sheet{z-index:900;padding:5px 4px calc(env(safe-area-inset-bottom,0px) + 6px);background:#d1d5db;flex-direction:column;gap:6px;display:flex;position:fixed;bottom:0;left:0;right:0;box-shadow:0 -2px 12px #0000001f}.kb-spacer{flex-shrink:0;height:260px}.kb-handle{cursor:pointer;justify-content:center;padding:4px 0 2px;display:flex}.kb-handle-bar{background:#9ca3af;border-radius:3px;width:40px;height:5px}.kb-row{justify-content:center;gap:5px;display:flex}.kb-row.kb-symbols{border-bottom:1px solid #b0b5bc;gap:4px;margin-bottom:2px;padding:0 2px 6px}.kb-key{min-width:32px;height:42px;font-family:var(--font-mono);background:var(--color-surface);cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;padding:0 7px;font-size:1rem;font-weight:400;transition:transform 60ms;display:flex;box-shadow:0 1px 2px #00000026}.kb-key:active{background:#e5e7eb;transform:scale(.9)}.kb-key-symbol{color:var(--color-primary);background:#eef2ff;font-size:.95rem;font-weight:600}.kb-key-symbol:active{background:var(--color-primary);color:#fff}.kb-key-mod{min-width:44px;color:var(--color-text);background:#b0b5bc;font-size:1.1rem}.kb-key-mod.active{background:var(--color-primary);color:#fff}.kb-key-space{max-width:180px;color:var(--color-text-secondary);background:var(--color-surface);flex:1;font-size:.8rem}.panel{border:1px solid var(--color-border);border-radius:var(--radius);background:var(--color-surface);overflow:hidden}.panel-header{background:var(--color-bg);cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;padding:10px 12px;font-size:.85rem;font-weight:600;display:flex}.panel-header:active{background:#e5e7eb}.panel-body{max-height:220px;padding:10px 12px;font-size:.82rem;overflow-y:auto}.tag{font-size:.75rem;font-weight:600;font-family:var(--font-mono);border-radius:4px;padding:2px 7px;display:inline-block}.tag-shift{color:var(--color-shift);background:#dbeafe}.tag-reduce{color:var(--color-reduce);background:#fff3e0}.tag-goto{color:var(--color-goto);background:#e0f2f1}.tag-accept{color:var(--color-accept);background:#f3e5f5}.tag-conflict{color:var(--color-conflict);background:#fef2f2;font-weight:700}.parse-table-wrapper{overflow-x:auto}.parse-table{border-collapse:collapse;font-size:.78rem;font-family:var(--font-mono);width:100%;min-width:max-content}.parse-table th,.parse-table td{border:1px solid var(--color-border);text-align:center;white-space:nowrap;padding:5px 7px}.parse-table thead th{background:var(--color-bg);z-index:2;font-weight:700;position:sticky;top:0}.parse-table .col-state{background:var(--color-bg);z-index:3;font-weight:700;position:sticky;left:0}.parse-table .section-action{background:#eef2ff}.parse-table .section-goto{background:#ecfdf5}.parse-table .cell-conflict{background:#fef2f2!important}.parse-table .row-highlight,.parse-table .row-highlight td{background:var(--color-highlight)!important}.card-view{flex-direction:column;gap:12px;display:flex}.state-card{border:1px solid var(--color-border);border-radius:var(--radius);background:var(--color-surface);box-shadow:var(--shadow);padding:14px;transition:border-color .2s}.state-card:active{border-color:var(--color-primary)}.state-card.highlight{border-color:var(--color-highlight-border);background:var(--color-highlight);box-shadow:0 0 0 2px #ffc10733}.state-card h4{color:var(--color-primary);margin-bottom:8px;font-size:.95rem;font-weight:700}.state-card .card-section{margin-bottom:8px}.state-card .card-section-title{color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.5px;margin-bottom:5px;font-size:.72rem;font-weight:700}.state-card .card-entries{flex-wrap:wrap;gap:5px;display:flex}.state-card .card-entry{font-family:var(--font-mono);border-radius:var(--radius-sm);background:var(--color-bg);border:1px solid var(--color-border);padding:4px 9px;font-size:.82rem}.graph-container{width:100%;height:100%}.graph-node{cursor:pointer}.graph-node rect{fill:var(--color-node);stroke:var(--color-node-border);stroke-width:1.5px;rx:6;ry:6}.graph-node.highlight rect{stroke:var(--color-node-highlight);stroke-width:3px;filter:drop-shadow(0 0 8px #ffc10766)}.graph-node.conflict rect{stroke:var(--color-conflict);stroke-width:2px}.graph-node text{font-size:10px;font-family:var(--font-mono);letter-spacing:.6px}.graph-node .node-title{font-size:11px;font-weight:700}.graph-node .node-item-kernel{font-weight:700}.graph-edge path{stroke-width:1.5px;fill:none}.graph-edge.terminal path{stroke:var(--color-terminal-edge)}.graph-edge.nonterminal path{stroke:var(--color-nonterminal-edge)}.graph-edge text{letter-spacing:.5px;font-size:11px;font-weight:600}.graph-edge.terminal text{fill:var(--color-terminal-edge)}.graph-edge.nonterminal text{fill:var(--color-nonterminal-edge)}.graph-toolbar{z-index:10;border-radius:var(--radius);border:1px solid var(--color-border);box-shadow:var(--shadow-md);background:#fffffff2;align-items:center;gap:6px;padding:6px 10px;display:flex;position:absolute;top:10px;right:10px}.graph-search-input{border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);width:80px;padding:5px 8px;font-size:.8rem}.graph-search-input:focus{border-color:var(--color-primary);outline:none}.graph-toolbar-btn{padding:4px 10px;font-size:.75rem}.graph-hint{color:var(--color-text-secondary);white-space:nowrap;font-size:.68rem}.summary-box{background:var(--color-primary-light);border-radius:var(--radius);border:1px solid #c7d2fe;padding:10px 14px;font-size:.85rem;line-height:1.6}.ff-tabs{gap:4px;margin-bottom:10px;display:flex}.ff-tab{border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);cursor:pointer;text-align:center;flex:1;padding:6px 8px;font-size:.78rem;font-weight:600;transition:all .15s}.ff-tab.active{background:var(--color-primary);color:#fff;border-color:var(--color-primary)}.ff-cards{flex-direction:column;gap:8px;display:flex}.ff-card{border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);padding:8px 10px}.ff-card-header{justify-content:space-between;align-items:center;margin-bottom:5px;display:flex}.ff-card-nt{font-family:var(--font-mono);color:var(--color-primary);font-size:.88rem;font-weight:700}.ff-card-label{color:var(--color-text-secondary);font-size:.68rem;font-family:var(--font-mono)}.ff-card-symbols{flex-wrap:wrap;gap:5px;display:flex}.ff-symbol{font-family:var(--font-mono);background:var(--color-surface);border:1px solid var(--color-border);border-radius:4px;padding:3px 8px;font-size:.8rem;font-weight:500;display:inline-block}.ff-symbol.dollar{color:var(--color-accept);background:#f3e5f5;border-color:#ce93d8}.ff-symbol.empty{color:var(--color-text-secondary);font-style:italic}.production-list{font-family:var(--font-mono);letter-spacing:.4px;font-size:.82rem}.production-list .prod-item{gap:8px;padding:3px 0;display:flex}.production-list .prod-id{color:var(--color-text-secondary);min-width:22px}.conflict-list{font-size:.82rem}.conflict-item{border-radius:var(--radius-sm);background:#fef2f2;border:1px solid #fecaca;margin-bottom:6px;padding:8px 10px}.conflict-item .conflict-type{color:var(--color-conflict);font-weight:700}.concentric-list{flex-direction:column;gap:6px;display:flex}.concentric-item{font-family:var(--font-mono);background:var(--color-bg);border-radius:var(--radius-sm);align-items:center;gap:8px;padding:6px 8px;font-size:.8rem;display:flex}.concentric-target{color:var(--color-primary);white-space:nowrap;font-weight:700}.concentric-arrow{color:var(--color-text-secondary)}.concentric-source-tag{font-size:.75rem}.concentric-note{color:var(--color-text-secondary);margin-top:8px;font-size:.75rem}.concentric-empty{color:var(--color-text-secondary);font-size:.82rem}@media (width>=769px) and (width<=1024px){.app-main{grid-template-columns:260px 1fr}.table-area{height:35%}}@media (width<=768px){.grammar-textarea{letter-spacing:1.2px;border-radius:var(--radius);min-height:90px;max-height:140px;padding:14px;font-size:1rem;line-height:1.8}.compute-btn{border-radius:var(--radius);padding:14px;font-size:.95rem}.summary-box{padding:12px 14px;font-size:.88rem}.panel-header{padding:11px 14px;font-size:.88rem}.panel-body{padding:10px 14px;font-size:.85rem}.production-list,.conflict-list{font-size:.85rem}.ff-card-nt{font-size:.92rem}.ff-symbol{padding:4px 10px;font-size:.85rem}.ff-tab{padding:8px;font-size:.82rem}.state-card h4{font-size:1rem}.state-card .card-entry{padding:5px 10px;font-size:.85rem}.concentric-item{padding:8px 10px;font-size:.85rem}.error-msg{font-size:.85rem}.editor-label{font-size:.95rem}.editor-actions select{padding:6px 10px;font-size:.82rem}.kb-toggle-btn{padding:6px 12px;font-size:1rem}.graph-toolbar{gap:5px;padding:5px 8px;top:8px;right:8px}.graph-search-input{width:64px;font-size:.78rem}.graph-hint{display:none}.kb-key{min-width:30px;height:40px;font-size:.95rem}.kb-key-symbol{min-width:28px;font-size:.9rem}.kb-key-mod{min-width:42px}.kb-row{gap:4px}.kb-row.kb-symbols{gap:3px}}@media (width<=380px){.kb-key{min-width:26px;height:36px;font-size:.88rem}.kb-key-symbol{min-width:24px}.kb-key-mod{min-width:36px}.kb-row{gap:3px}}.mode-selector{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius);gap:0;padding:3px;display:flex}.mode-btn{border-radius:var(--radius-sm);color:var(--color-text-secondary);box-shadow:none;background:0 0;border:none;padding:6px 12px;font-size:.8rem;font-weight:600;transition:all .15s}.mode-btn:active{transform:none}.mode-btn.active{background:var(--color-primary);color:#fff;box-shadow:0 1px 4px #4361ee4d}@media (width<=768px){.mode-btn{padding:8px 12px;font-size:.82rem}}.fullscreen-btn{min-width:auto;font-size:1.1rem;line-height:1}.signature{color:var(--color-text-secondary);white-space:nowrap;opacity:.7;margin-right:auto;font-size:.7rem;font-style:italic}.realtime-bar{z-index:800;border:1px solid var(--color-border);box-shadow:var(--shadow-md);-webkit-backdrop-filter:blur(8px);background:#fffffff2;border-radius:24px;align-items:center;gap:8px;padding:5px 10px 5px 12px;display:flex;position:fixed;bottom:70px;right:12px}.online-indicator{border-right:1px solid var(--color-border);align-items:center;gap:5px;padding-right:8px;display:flex}.online-dot{background:#22c55e;border-radius:50%;width:8px;height:8px;animation:2s infinite pulse-dot}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.5}}.online-count{color:var(--color-text);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:.72rem;font-weight:600}.recent-count{color:var(--color-text-secondary);border-right:1px solid var(--color-border);white-space:nowrap;font-variant-numeric:tabular-nums;padding:0 8px;font-size:.68rem}.reaction-buttons{gap:2px;display:flex}.reaction-btn{cursor:pointer;width:32px;height:32px;box-shadow:none;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;font-size:1.1rem;transition:transform .15s;display:flex}.reaction-btn:active{transform:scale(1.3)}.floating-emojis{pointer-events:none;z-index:9998;position:fixed;inset:0}.floating-emoji{will-change:transform, opacity;pointer-events:none;z-index:9999;font-size:2rem;animation:2.2s cubic-bezier(.2,.8,.3,1) forwards float-up;position:fixed}@keyframes float-up{0%{opacity:1;transform:translateY(0)scale(.4)rotate(0)}20%{opacity:1;transform:translateY(-30px)scale(1.3)rotate(-8deg)}50%{opacity:.9;transform:translateY(-120px)scale(1)rotate(5deg)}to{opacity:0;transform:translateY(-280px)scale(.6)rotate(-3deg)}}@media (width>=769px){.realtime-bar{bottom:16px;right:16px}}@media (width<=768px){.realtime-bar{bottom:calc(var(--mobile-tab-height) + 8px);padding:4px 8px 4px 10px;right:10px}.reaction-btn{width:30px;height:30px;font-size:1rem}.online-count{font-size:.75rem}}
