zettcode-gateway 0.3.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. zettcode/gateway/__init__.py +22 -0
  2. zettcode/gateway/app.py +454 -0
  3. zettcode/gateway/backend.py +368 -0
  4. zettcode/gateway/chat.py +142 -0
  5. zettcode/gateway/cli.py +495 -0
  6. zettcode/gateway/py.typed +0 -0
  7. zettcode/gateway/runfile.py +145 -0
  8. zettcode/gateway/service.py +1219 -0
  9. zettcode/gateway/settings.py +62 -0
  10. zettcode/gateway/static/app.css +1434 -0
  11. zettcode/gateway/static/app.js +3 -0
  12. zettcode/gateway/static/assets/KaTeX_AMS-Regular-U6PRYMIZ.woff2 +0 -0
  13. zettcode/gateway/static/assets/KaTeX_Caligraphic-Bold-5QL5CMTE.woff2 +0 -0
  14. zettcode/gateway/static/assets/KaTeX_Caligraphic-Regular-KX5MEWCF.woff2 +0 -0
  15. zettcode/gateway/static/assets/KaTeX_Fraktur-Bold-2QVFK6NQ.woff2 +0 -0
  16. zettcode/gateway/static/assets/KaTeX_Fraktur-Regular-2PEIFJSJ.woff2 +0 -0
  17. zettcode/gateway/static/assets/KaTeX_Main-Bold-YP5VVQRP.woff2 +0 -0
  18. zettcode/gateway/static/assets/KaTeX_Main-BoldItalic-N4V3DX7S.woff2 +0 -0
  19. zettcode/gateway/static/assets/KaTeX_Main-Italic-RELBIK7M.woff2 +0 -0
  20. zettcode/gateway/static/assets/KaTeX_Main-Regular-ARRPAO67.woff2 +0 -0
  21. zettcode/gateway/static/assets/KaTeX_Math-BoldItalic-K4WTGH3J.woff2 +0 -0
  22. zettcode/gateway/static/assets/KaTeX_Math-Italic-6KGCHLFN.woff2 +0 -0
  23. zettcode/gateway/static/assets/KaTeX_SansSerif-Bold-RRNVJFFW.woff2 +0 -0
  24. zettcode/gateway/static/assets/KaTeX_SansSerif-Italic-HMPFTM52.woff2 +0 -0
  25. zettcode/gateway/static/assets/KaTeX_SansSerif-Regular-XIQ62X4E.woff2 +0 -0
  26. zettcode/gateway/static/assets/KaTeX_Script-Regular-APUWIHLP.woff2 +0 -0
  27. zettcode/gateway/static/assets/KaTeX_Size1-Regular-5LRUTBFT.woff2 +0 -0
  28. zettcode/gateway/static/assets/KaTeX_Size2-Regular-LELKET5D.woff2 +0 -0
  29. zettcode/gateway/static/assets/KaTeX_Size3-Regular-WQRQ47UD.woff2 +0 -0
  30. zettcode/gateway/static/assets/KaTeX_Size4-Regular-CDMV7U5C.woff2 +0 -0
  31. zettcode/gateway/static/assets/KaTeX_Typewriter-Regular-VBYJ4NRC.woff2 +0 -0
  32. zettcode/gateway/static/chunks/chunk-Y6SLVHK3.js +1 -0
  33. zettcode/gateway/static/chunks/render-G6G3TSB3.js +341 -0
  34. zettcode/gateway/static/icon.png +0 -0
  35. zettcode/gateway/static/index.html +23 -0
  36. zettcode/gateway/static/logo.svg +205 -0
  37. zettcode/gateway/static/manifest.webmanifest +11 -0
  38. zettcode_gateway-0.3.4.dist-info/METADATA +21 -0
  39. zettcode_gateway-0.3.4.dist-info/RECORD +40 -0
  40. zettcode_gateway-0.3.4.dist-info/WHEEL +4 -0
@@ -0,0 +1,1434 @@
1
+ @font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url("./assets/KaTeX_AMS-Regular-U6PRYMIZ.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url("./assets/KaTeX_Caligraphic-Bold-5QL5CMTE.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Caligraphic-Regular-KX5MEWCF.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url("./assets/KaTeX_Fraktur-Bold-2QVFK6NQ.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Fraktur-Regular-2PEIFJSJ.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url("./assets/KaTeX_Main-Bold-YP5VVQRP.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url("./assets/KaTeX_Main-BoldItalic-N4V3DX7S.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url("./assets/KaTeX_Main-Italic-RELBIK7M.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Main-Regular-ARRPAO67.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url("./assets/KaTeX_Math-BoldItalic-K4WTGH3J.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url("./assets/KaTeX_Math-Italic-6KGCHLFN.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url("./assets/KaTeX_SansSerif-Bold-RRNVJFFW.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url("./assets/KaTeX_SansSerif-Italic-HMPFTM52.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url("./assets/KaTeX_SansSerif-Regular-XIQ62X4E.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Script-Regular-APUWIHLP.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Size1-Regular-5LRUTBFT.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Size2-Regular-LELKET5D.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Size3-Regular-WQRQ47UD.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Size4-Regular-CDMV7U5C.woff2") format("woff2")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url("./assets/KaTeX_Typewriter-Regular-VBYJ4NRC.woff2") format("woff2")}.katex{font: 1.21em KaTeX_Main,math,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.18.10"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.katex-newline{display:block}.katex .katex-base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .katex-base,.katex .katex-strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .katex-vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .katex-thinbox{display:inline-flex;flex-direction:row;max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .katex-hdashline,.katex .katex-hline,.katex .katex-overline .overline-line,.katex .katex-rule,.katex .katex-underline .underline-line,.katex .mfrac .frac-line{min-height:1px}.katex .mspace{display:inline-block}.katex .katex-smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.katex-inner,.katex .llap>.katex-inner,.katex .rlap>.katex-inner{position:absolute}.katex .clap>.katex-fix,.katex .llap>.katex-fix,.katex .rlap>.katex-fix{display:inline-block}.katex .llap>.katex-inner{right:0}.katex .clap>.katex-inner,.katex .rlap>.katex-inner{left:0}.katex .clap>.katex-inner>span{margin-left:-50%;margin-right:50%}.katex .katex-rule{border:0 solid;display:inline-block;position:relative}.katex .katex-hline,.katex .katex-overline .overline-line,.katex .katex-underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .katex-hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.katex-root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .katex-sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .katex-sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .katex-sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .katex-sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .katex-sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .katex-sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .katex-sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .katex-sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .katex-sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .katex-sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .katex-sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .katex-sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .katex-sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .katex-sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .katex-sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .katex-sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .katex-sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .katex-sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .katex-sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .katex-sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .katex-sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .katex-sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .katex-sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .katex-sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .katex-sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .katex-sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .katex-sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .katex-sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .katex-sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .katex-sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .katex-sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .katex-sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .katex-sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .katex-sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .katex-sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .katex-sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .katex-sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .katex-sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .katex-sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .katex-sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .katex-sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .katex-sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .katex-sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .katex-sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .katex-sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .katex-sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .katex-sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .katex-sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .katex-sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .katex-sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .katex-sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .katex-sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .katex-sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .katex-sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .katex-sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .katex-sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .katex-sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .katex-sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .katex-sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .katex-sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .katex-sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .katex-sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .katex-sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .katex-sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .katex-sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .katex-sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .katex-sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .katex-sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .katex-sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .katex-sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .katex-sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .katex-sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .katex-sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .katex-sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .katex-sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .katex-sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .katex-sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .katex-sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .katex-sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .katex-sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .katex-sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .katex-sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .katex-sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .katex-sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .katex-sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .katex-sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .katex-sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .katex-sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .katex-sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .katex-sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .katex-sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .katex-sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .katex-sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .katex-sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .katex-sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .katex-sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .katex-sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .katex-sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .katex-sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .katex-sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .katex-sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .katex-sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .katex-sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .katex-sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .katex-sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .katex-sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .katex-sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .katex-sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .katex-sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .katex-sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .katex-sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .katex-sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .katex-sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .katex-sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .katex-sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .katex-sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .katex-sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .katex-sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .katex-sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .katex-sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .katex-sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .katex-accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .katex-accent .accent-body{position:relative}.katex .katex-accent .accent-body:not(.accent-full){width:0}.katex .katex-overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .katex-stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .katex-stretchy:after,.katex .katex-stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .katex-sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .reflectbox{display:inline-block;transform:scaleX(-1)}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.katex-tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.katex-tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}:root{color-scheme:light dark;--font: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", Roboto, "Helvetica Neue", "PingFang SC", "Noto Sans CJK SC", "Microsoft YaHei", sans-serif;--mono: ui-monospace, "SF Mono", "Cascadia Mono", Menlo, Consolas, monospace;--rail: 72px;--pane: 360px;--radius: 14px;--bubble-radius: 18px;--row: 72px;--safe-top: env(safe-area-inset-top, 0px);--safe-bottom: env(safe-area-inset-bottom, 0px);--safe-left: env(safe-area-inset-left, 0px);--safe-right: env(safe-area-inset-right, 0px);--bg: #ffffff;--surface: #ffffff;--surface-2: #f4f4f5;--chat-bg-a: #ffffff;--chat-bg-b: #ffffff;--text: #0f1419;--muted: #707579;--divider: #e3e5e8;--accent: #3390ec;--accent-text: #ffffff;--accent-soft: rgba(51, 144, 236, .12);--in-bubble: #f1f3f5;--in-text: #0f1419;--out-bubble: #3390ec;--out-text: #ffffff;--out-meta: rgba(255, 255, 255, .78);--ok: #4fae4e;--warn: #e8960c;--bad: #e53935;--bad-soft: rgba(229, 57, 53, .13);--rail-bg: #f4f4f5;--hover: rgba(0, 0, 0, .05);--shadow: none;--sheet-shadow: 0 -8px 30px rgba(0, 0, 0, .18);--code-bg: rgba(0, 0, 0, .06);--scrim: rgba(0, 0, 0, .45);--chip-bg: rgba(0, 0, 0, .42);--code-block: #f6f8fa;--code-head: #eceff3;--via-user: #d97706;--via-agent: #4f6df5;--via-external: #0f9d6b;--graph-bg: #f6f7f9;--graph-dot: rgba(15, 20, 25, .14);--graph-card: rgba(255, 255, 255, .94);--graph-card-border: rgba(15, 20, 25, .1);--graph-edge: #5d6b7c;--graph-shadow: 0 10px 30px rgba(15, 20, 25, .16);--hl-fg: #24292f;--hl-comment: #6a737d;--hl-keyword: #cf222e;--hl-string: #0a3069;--hl-number: #0550ae;--hl-title: #8250df;--hl-type: #953800;--hl-attr: #0550ae;--hl-tag: #116329;--hl-meta: #6639ba;font-size:15px}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--bg: #17212b;--surface: #17212b;--surface-2: #0e1621;--chat-bg-a: #0e1621;--chat-bg-b: #0e1621;--text: #f5f5f5;--muted: #7f91a4;--divider: #0e1621;--accent: #5eb5f7;--accent-text: #0b1620;--accent-soft: rgba(94, 181, 247, .16);--in-bubble: #182533;--in-text: #f5f5f5;--out-bubble: #2b5278;--out-text: #ffffff;--out-meta: #7fc3f5;--rail-bg: #0e1621;--hover: rgba(255, 255, 255, .06);--shadow: none;--sheet-shadow: 0 -8px 30px rgba(0, 0, 0, .5);--code-bg: rgba(255, 255, 255, .08);--scrim: rgba(0, 0, 0, .6);--code-block: #0d1117;--code-head: #151b23;--via-user: #ffb454;--via-agent: #7aa2ff;--via-external: #4ade9b;--graph-bg: #0a111a;--graph-dot: rgba(255, 255, 255, .1);--graph-card: rgba(20, 30, 43, .94);--graph-card-border: rgba(255, 255, 255, .1);--graph-edge: #8fa3ba;--graph-shadow: 0 12px 36px rgba(0, 0, 0, .55);--hl-fg: #e6edf3;--hl-comment: #8b949e;--hl-keyword: #ff7b72;--hl-string: #a5d6ff;--hl-number: #79c0ff;--hl-title: #d2a8ff;--hl-type: #ffa657;--hl-attr: #79c0ff;--hl-tag: #7ee787;--hl-meta: #d2a8ff}}:root[data-theme=dark]{--bg: #17212b;--surface: #17212b;--surface-2: #0e1621;--chat-bg-a: #0e1621;--chat-bg-b: #0e1621;--text: #f5f5f5;--muted: #7f91a4;--divider: #0e1621;--accent: #5eb5f7;--accent-text: #0b1620;--accent-soft: rgba(94, 181, 247, .16);--in-bubble: #182533;--in-text: #f5f5f5;--out-bubble: #2b5278;--out-text: #ffffff;--out-meta: #7fc3f5;--rail-bg: #0e1621;--hover: rgba(255, 255, 255, .06);--shadow: none;--sheet-shadow: 0 -8px 30px rgba(0, 0, 0, .5);--code-bg: rgba(255, 255, 255, .08);--scrim: rgba(0, 0, 0, .6);--code-block: #0d1117;--code-head: #151b23;--via-user: #ffb454;--via-agent: #7aa2ff;--via-external: #4ade9b;--graph-bg: #0a111a;--graph-dot: rgba(255, 255, 255, .1);--graph-card: rgba(20, 30, 43, .94);--graph-card-border: rgba(255, 255, 255, .1);--graph-edge: #8fa3ba;--graph-shadow: 0 12px 36px rgba(0, 0, 0, .55);--hl-fg: #e6edf3;--hl-comment: #8b949e;--hl-keyword: #ff7b72;--hl-string: #a5d6ff;--hl-number: #79c0ff;--hl-title: #d2a8ff;--hl-type: #ffa657;--hl-attr: #79c0ff;--hl-tag: #7ee787;--hl-meta: #d2a8ff}:root[data-size=s]{font-size:14px}:root[data-size=l]{font-size:17px}@media(max-width:960px){:root{--pane: 310px}}@media(max-width:719px){:root{--row: 74px}}*{box-sizing:border-box}html,body{height:100%;margin:0;overflow:hidden}body{position:fixed;inset:0;width:100%;font-family:var(--font);background:var(--bg);color:var(--text);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;overscroll-behavior:none;touch-action:manipulation;text-rendering:optimizeLegibility}button,input,select,textarea{font:inherit;color:inherit}input,select,textarea{-webkit-appearance:none;appearance:none;border-radius:0;caret-color:var(--accent)}body{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.bubble,.md,pre,code,input,textarea,.kv span:last-child,.errcard{-webkit-user-select:text;user-select:text;-webkit-touch-callout:default}.iconbtn:active{background:var(--hover);color:var(--text)}a:active{opacity:.7}html{overscroll-behavior:none}button{cursor:pointer;background:none;border:0;padding:0}button:disabled{cursor:default}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.noscript{padding:2rem}#root{position:fixed;top:0;left:0;width:100%;height:var(--app-h, 100dvh);overflow:hidden;transform:translate3d(0,var(--app-top, 0px),0)}:root[data-keyboard=true]{--safe-bottom: 0px}@media(pointer:coarse),(max-width:719px){input,select,textarea{font-size:max(16px,1rem)!important}}svg.i{width:1.5rem;height:1.5rem;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}svg.i.fill{fill:currentColor;stroke:none}svg.i.sm{width:1.15rem;height:1.15rem}svg.i.xs{width:.95rem;height:.95rem}.badge{min-width:1.35rem;height:1.35rem;padding:0 .4rem;border-radius:.7rem;background:var(--accent);color:var(--accent-text);font-size:.74rem;font-weight:600;line-height:1.35rem;text-align:center;flex:none}.badge.muted{background:var(--muted);color:var(--bg)}.spin{width:18px;height:18px;border-radius:50%;border:2.5px solid currentColor;border-right-color:transparent;animation:spin .8s linear infinite;flex:none}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:0 20px;border-radius:12px;background:var(--accent);color:var(--accent-text);font-weight:600;transition:opacity .12s,transform .12s}.btn:active:not(:disabled){transform:scale(.98)}.btn:disabled{opacity:.5}.btn.block{display:flex;width:100%}.btn.ghost{background:var(--accent-soft);color:var(--accent)}.btn.danger{background:var(--bad-soft);color:var(--bad)}.btn.sm{min-height:34px;padding:0 14px;font-size:.9rem;border-radius:10px}.iconbtn{display:grid;place-items:center;width:44px;height:44px;border-radius:50%;flex:none;color:var(--muted);transition:background .12s,color .12s}.iconbtn:hover{background:var(--hover);color:var(--text)}.page-inner>*,.page-inner .card{animation:rise .42s cubic-bezier(.22,1,.36,1) both}.page-inner>:nth-child(2){animation-delay:.04s}.page-inner>:nth-child(3){animation-delay:.08s}.page-inner>:nth-child(4){animation-delay:.12s}.page-inner>:nth-child(n+5){animation-delay:.16s}.field-row,.switch-row,.menu-item,.kv{transition:background .18s ease}.field-row:active,.switch-row:active,.menu-item:active{background:var(--hover)}.field-row:focus-within{background:var(--accent-soft)}.card{transition:box-shadow .25s ease}.card{background:var(--surface);border-radius:var(--radius);overflow:hidden;margin:10px 0}.card-title{padding:14px 16px 4px;font-size:.8rem;font-weight:650;color:var(--accent);letter-spacing:.02em}.card-hint{margin:0;padding:4px 16px 12px;color:var(--muted);font-size:.84rem;line-height:1.4}.card-hint.warn{color:var(--warn)}.card-hint.bad{color:var(--bad)}.actions{display:flex;gap:10px;flex-wrap:wrap;padding:12px 16px}.field-row{display:flex;align-items:center;gap:10px;min-height:52px;padding:6px 16px}.field-row+.field-row{border-top:1px solid var(--divider)}.field-row label{flex:none;width:6.5rem;color:var(--muted);font-size:.95rem}.field-row input,.field-row select,.field-row textarea{flex:1;min-width:0;border:0;outline:0;background:none;color:var(--text);font-size:1rem;padding:8px 0}.field-row select{appearance:none;-webkit-appearance:none;cursor:pointer;text-align:right;text-align-last:right}.field-row select option{color:initial}.field-row textarea{resize:vertical;min-height:5rem}.field-row.stack{align-items:stretch;flex-direction:column;gap:2px;padding-top:10px}.field-row.stack label{width:auto}.kv{display:flex;gap:12px;padding:10px 16px;font-size:.95rem}.kv+.kv{border-top:1px solid var(--divider)}.kv span:first-child{color:var(--muted);flex:none;width:7.5rem}.kv span:last-child{flex:1;min-width:0;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.mono{font-family:var(--mono);font-size:.86em}.errcard{margin:10px 0;padding:12px 14px;border-radius:var(--radius);background:var(--bad-soft);font-size:.92rem;line-height:1.4}.errcard b{color:var(--bad)}.errcard pre{margin:8px 0 0;max-height:12rem;overflow:auto;white-space:pre-wrap;font-family:var(--mono);font-size:.78rem}.empty{padding:3rem 2rem;text-align:center;color:var(--muted);line-height:1.45}.empty b{display:block;color:var(--text);font-size:1.05rem;margin-bottom:6px}.empty .btn{margin-top:1rem}@keyframes spin{to{transform:rotate(360deg)}}@keyframes blink{0%,60%,to{opacity:.3;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}@keyframes pulse{0%,to{box-shadow:0 0 #e8960c80}50%{box-shadow:0 0 0 5px #e8960c00}}@keyframes pop{0%{opacity:0;transform:translateY(6px) scale(.98)}to{opacity:1;transform:none}}@keyframes fade{0%{opacity:0}to{opacity:1}}@keyframes rise{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}@keyframes drop{0%{opacity:0;transform:translateY(-16px) scale(.96)}to{opacity:1;transform:none}}@keyframes tick{0%{transform:scale(.3);opacity:0}to{transform:none;opacity:1}}@keyframes breathe{0%,to{opacity:.4}50%{opacity:1}}@keyframes unfold{0%{opacity:0;transform:translateY(-6px) scale(.98)}to{opacity:1;transform:none}}@keyframes spring{0%{opacity:0;transform:translateY(24px) scale(.97)}to{opacity:1;transform:none}}@keyframes slide{0%{transform:translate(28%);opacity:.4}to{transform:none;opacity:1}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
2
+
3
+ /* src/App.vue */
4
+
5
+ .app { display: grid; grid-template-columns: var(--rail) var(--pane) minmax(0, 1fr); height: 100%; background: var(--bg);
6
+ }
7
+ .pane { display: flex; flex-direction: column; min-width: 0; min-height: 0; background: var(--surface); border-right: 1px solid var(--divider);
8
+ }
9
+ .main { display: flex; flex-direction: column; min-width: 0; min-height: 0; background: var(--surface); position: relative;
10
+ }
11
+ @media (max-width: 719px) {
12
+ .app { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) auto;
13
+ }
14
+ .pane, .main { grid-row: 1; grid-column: 1; border-right: 0;
15
+ }
16
+ .app[data-view="pane"] .main { display: none;
17
+ }
18
+ .app[data-view="main"] .pane { display: none;
19
+ }
20
+ .app[data-view="main"] .main { animation: slide 0.22s ease-out;
21
+ }
22
+ .app[data-fullscreen="true"] .rail { display: none;
23
+ }
24
+ .app[data-fullscreen="true"] { grid-template-rows: minmax(0, 1fr);
25
+ }
26
+ }
27
+
28
+
29
+ /* src/components/chat/ChatHeader.vue */
30
+
31
+ .bar {
32
+ display: flex; align-items: center; gap: 6px; min-height: 56px; flex: none;
33
+ padding: calc(var(--safe-top) + 6px) 8px 6px calc(var(--safe-left) + 8px);
34
+ background: var(--surface); border-bottom: 1px solid var(--divider);
35
+ }
36
+ .bar .iconbtn.back { display: none; color: var(--accent); text-decoration: none;
37
+ }
38
+ .chat-who { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; padding: 2px 4px; border-radius: 12px; text-align: left;
39
+ }
40
+ .chat-title { min-width: 0; display: flex; flex-direction: column; gap: 1px;
41
+ }
42
+ .mode { margin-left: 8px; padding: 1px 8px; border-radius: 9px; font-size: 0.7rem; font-weight: 600; vertical-align: 2px;
43
+ }
44
+ .mode.ok { background: rgba(79, 174, 78, 0.16); color: var(--ok);
45
+ }
46
+ .mode.warn { background: rgba(232, 150, 12, 0.16); color: var(--warn);
47
+ }
48
+ .mode.bad { background: var(--bad-soft); color: var(--bad);
49
+ }
50
+ .chat-title b { font-size: 1.05rem; font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
51
+ }
52
+ .chat-title span { font-size: 0.82rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
53
+ }
54
+ .chat-title span.live { color: var(--accent);
55
+ }
56
+ @media (max-width: 719px) {
57
+ .bar .iconbtn.back { display: grid;
58
+ }
59
+ }
60
+
61
+
62
+ /* src/components/chat/ChatView.vue */
63
+
64
+ .chat { flex: 1; min-height: 0; display: flex; flex-direction: column;
65
+ }
66
+
67
+
68
+ /* src/components/chat/Composer.vue */
69
+
70
+ .composer {
71
+ flex: none; display: flex; align-items: flex-end; gap: 8px;
72
+ padding: 8px calc(var(--safe-right) + 12px) calc(8px + var(--safe-bottom)) calc(var(--safe-left) + 12px);
73
+ background: var(--surface); border-top: 1px solid var(--divider);
74
+ }
75
+ .composer-field {
76
+ flex: 1; min-width: 0; display: flex; align-items: flex-end; border-radius: 22px; background: var(--surface-2); padding: 0 4px 0 6px;
77
+ box-shadow: inset 0 0 0 1.5px transparent; transition: box-shadow 0.2s ease, background 0.2s ease;
78
+ }
79
+ .composer-field:focus-within { box-shadow: inset 0 0 0 1.5px var(--accent-soft);
80
+ }
81
+ .composer textarea {
82
+ flex: 1; min-width: 0; resize: none; border: 0; outline: 0; background: none; color: var(--text);
83
+ padding: 11px 6px; line-height: 1.35; max-height: 9.5rem; font-size: 1rem;
84
+ }
85
+ .composer textarea::placeholder { color: var(--muted);
86
+ }
87
+ .composer-count { align-self: center; font-size: 0.72rem; color: var(--warn); padding: 0 4px;
88
+ }
89
+ .composer-reply { width: 38px; height: 44px; display: grid; place-items: center; border-radius: 50%; color: var(--muted);
90
+ }
91
+ .composer-reply[aria-pressed="true"] { color: var(--accent);
92
+ }
93
+ .sendbtn {
94
+ flex: none; width: 46px; height: 46px; border-radius: 50%; display: grid; place-items: center;
95
+ background: var(--accent); color: var(--accent-text);
96
+ transition: transform 0.28s cubic-bezier(0.34, 1.56, 0.64, 1), background 0.2s, color 0.2s, opacity 0.2s;
97
+ }
98
+ .sendbtn:active:not(:disabled) { transform: scale(0.88);
99
+ }
100
+ .sendbtn:disabled { background: var(--surface-2); color: var(--muted); transform: scale(0.9);
101
+ }
102
+ .composer-reply { transition: color 0.2s, transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
103
+ }
104
+ .composer-reply:active { transform: scale(0.85);
105
+ }
106
+ .composer-reply[aria-pressed="true"] { transform: rotate(-12deg);
107
+ }
108
+ .sendbtn svg { margin-left: 2px;
109
+ }
110
+ .composer-note { flex: none; padding: 6px 14px; font-size: 0.82rem; background: var(--surface); border-top: 1px solid var(--divider); color: var(--warn);
111
+ }
112
+ .composer-file { display: none;
113
+ }
114
+ .composer-attach { flex: none; width: 40px; height: 46px; display: grid; place-items: center; border-radius: 50%; color: var(--muted); transition: color 0.2s, transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
115
+ }
116
+ .composer-attach:hover:not(:disabled) { color: var(--accent);
117
+ }
118
+ .composer-attach:active:not(:disabled) { transform: scale(0.88);
119
+ }
120
+ .composer-attach:disabled { opacity: 0.4;
121
+ }
122
+ .composer.dragging { box-shadow: inset 0 0 0 2px var(--accent);
123
+ }
124
+ .composer-pictures { flex: none; display: flex; gap: 8px; overflow-x: auto; padding: 8px calc(var(--safe-right) + 12px) 0 calc(var(--safe-left) + 12px); background: var(--surface); border-top: 1px solid var(--divider);
125
+ }
126
+ .composer-picture { position: relative; flex: none; width: 64px; height: 64px; border-radius: 10px; overflow: hidden; background: var(--surface-2); animation: pop 0.18s ease-out;
127
+ }
128
+ .composer-picture img { width: 100%; height: 100%; object-fit: cover; display: block;
129
+ }
130
+ .composer-picture button { position: absolute; top: 2px; right: 2px; width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center; background: rgba(0, 0, 0, 0.6); color: #fff;
131
+ }
132
+
133
+
134
+ /* src/components/chat/LockedBar.vue */
135
+
136
+ .locked {
137
+ flex: none; display: flex; align-items: center; justify-content: center; gap: 12px; flex-wrap: wrap;
138
+ padding: 12px 14px calc(12px + var(--safe-bottom)); background: var(--surface); border-top: 1px solid var(--divider); color: var(--muted);
139
+ }
140
+
141
+
142
+ /* src/components/chat/MessageBubble.vue */
143
+
144
+ .msg { display: flex; align-items: flex-start; gap: 8px; max-width: 100%; margin-top: 12px;
145
+ }
146
+ .msg.out { justify-content: flex-end;
147
+ }
148
+ .msg.out.cont { margin-top: 3px;
149
+ }
150
+ .msg-avatar { flex: none; width: 40px; height: 40px;
151
+ }
152
+ .bubble {
153
+ position: relative; min-width: 0; max-width: min(78%, 34rem); padding: 7px 11px 6px; border-radius: var(--bubble-radius);
154
+ box-shadow: var(--shadow); line-height: 1.38; overflow-wrap: anywhere; word-break: break-word; animation: pop 0.16s ease-out;
155
+ }
156
+ .msg.in .bubble { max-width: min(92%, 52rem); padding: 9px 14px 8px; background: var(--in-bubble); color: var(--in-text); border-bottom-left-radius: 6px;
157
+ }
158
+ .msg.out .bubble { background: var(--out-bubble); color: var(--out-text); border-bottom-right-radius: 6px;
159
+ }
160
+ .msg.out.cont .bubble { border-top-right-radius: 6px;
161
+ }
162
+ .msg.out .bubble a, .msg.out .bubble .md a { color: #fff;
163
+ }
164
+ .msg.out .bubble .md code { background: rgba(255, 255, 255, 0.2);
165
+ }
166
+ .msg.out .bubble .md blockquote { color: rgba(255, 255, 255, 0.8); border-color: rgba(255, 255, 255, 0.6);
167
+ }
168
+ .msg.out .bubble .msg-code { background: rgba(255, 255, 255, 0.2);
169
+ }
170
+ .bubble.reply { box-shadow: var(--shadow), inset 3px 0 0 var(--accent);
171
+ }
172
+ .bubble.err { box-shadow: var(--shadow), inset 0 0 0 1px var(--bad);
173
+ }
174
+ .bubble-who { display: block; font-size: 0.8rem; font-weight: 600; color: rgba(255, 255, 255, 0.85); margin-bottom: 2px;
175
+ }
176
+ .meta { display: inline-flex; align-items: center; gap: 3px; float: right; margin: 5px 0 -2px 10px; font-size: 0.72rem; color: var(--out-meta); user-select: none;
177
+ }
178
+ .meta-read { color: var(--out-meta);
179
+ }
180
+ .meta-bad { color: var(--bad);
181
+ }
182
+ .bubble-retry { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin-top: 8px; clear: both;
183
+ }
184
+ .bubble-pictures { display: grid; gap: 4px; margin: 2px 0 6px; grid-template-columns: 1fr;
185
+ }
186
+ .bubble-pictures.many { grid-template-columns: repeat(2, minmax(0, 1fr));
187
+ }
188
+ .bubble-picture { display: block; padding: 0; border-radius: 12px; overflow: hidden; background: rgba(0, 0, 0, 0.12); cursor: zoom-in; line-height: 0;
189
+ }
190
+ .bubble-picture img { display: block; width: 100%; max-height: 22rem; min-height: 4rem; object-fit: cover;
191
+ }
192
+ .bubble-pictures:not(.many) .bubble-picture img { width: auto; max-width: 100%; margin: 0 auto; object-fit: contain;
193
+ }
194
+ .zoom { position: fixed; inset: 0; z-index: 60; display: grid; place-items: center; padding: 16px; background: rgba(0, 0, 0, 0.82); cursor: zoom-out; animation: pop 0.16s ease-out;
195
+ }
196
+ .zoom img { max-width: 100%; max-height: 100%; object-fit: contain; border-radius: 6px;
197
+ }
198
+ .bubble-why { flex-basis: 100%; font-size: 0.82rem; color: #fff; line-height: 1.35;
199
+ }
200
+ @media (max-width: 719px) {
201
+ .msg { gap: 6px;
202
+ }
203
+ .msg-avatar { width: 32px; height: 32px;
204
+ }
205
+ .msg.in .bubble { max-width: calc(100% - 38px);
206
+ }
207
+ .msg.out .bubble { max-width: calc(86% - 38px);
208
+ }
209
+ }
210
+
211
+
212
+ /* src/components/chat/MessageList.vue */
213
+
214
+ .chat-bg {
215
+ flex: 1; position: relative; min-height: 0; display: flex; flex-direction: column;
216
+ background: var(--chat-bg-a);
217
+ }
218
+ .messages {
219
+ flex: 1; overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch;
220
+ padding: 12px calc(var(--safe-right) + 14px) 10px calc(var(--safe-left) + 14px);
221
+ display: flex; flex-direction: column; overflow-anchor: none;
222
+ }
223
+ .messages-body { display: flex; flex-direction: column; flex: none;
224
+ }
225
+ .messages-note { align-self: center; margin: 12px 0; padding: 4px 14px; border-radius: 14px; background: var(--chip-bg); color: #fff; font-size: 0.85rem;
226
+ }
227
+ .messages-more { align-self: center; margin: 4px 0 10px;
228
+ }
229
+ .fab {
230
+ position: absolute; right: calc(var(--safe-right) + 14px); bottom: 12px; width: 44px; height: 44px; border-radius: 50%;
231
+ display: grid; place-items: center; background: var(--surface); color: var(--muted); box-shadow: 0 2px 10px rgba(0, 0, 0, 0.25);
232
+ animation: pop 0.22s cubic-bezier(0.34, 1.56, 0.64, 1);
233
+ }
234
+ .fab .badge { position: absolute; top: -9px; left: 50%; transform: translateX(-50%);
235
+ }
236
+
237
+
238
+ /* src/components/chat/MessageText.vue */
239
+
240
+ .plain { white-space: pre-wrap;
241
+ }
242
+ .md { line-height: 1.55;
243
+ }
244
+ .md > :first-child { margin-top: 0;
245
+ }
246
+ .md > :last-child { margin-bottom: 0;
247
+ }
248
+ .md p { margin: 0.5em 0;
249
+ }
250
+ .md h1, .md h2, .md h3, .md h4 { margin: 0.9em 0 0.4em; line-height: 1.3; font-weight: 650;
251
+ }
252
+ .md h1 { font-size: 1.35em;
253
+ }
254
+ .md h2 { font-size: 1.2em;
255
+ }
256
+ .md h3 { font-size: 1.08em;
257
+ }
258
+ .md h4 { font-size: 1em;
259
+ }
260
+ .md ul, .md ol { margin: 0.4em 0; padding-left: 1.5em;
261
+ }
262
+ .md li { margin: 0.15em 0;
263
+ }
264
+ .md li > p { margin: 0.2em 0;
265
+ }
266
+ .md input[type="checkbox"] { margin-right: 0.4em;
267
+ }
268
+ .md blockquote { margin: 0.6em 0; padding: 0.1em 0 0.1em 0.9em; border-left: 3px solid var(--accent); color: var(--muted);
269
+ }
270
+ .md hr { border: 0; border-top: 1px solid var(--divider); margin: 0.9em 0;
271
+ }
272
+ .md a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; word-break: break-all;
273
+ }
274
+ .md a:hover { text-decoration-thickness: 2px;
275
+ }
276
+ .md img { max-width: 100%; height: auto; border-radius: 8px;
277
+ }
278
+ .md code { font-family: var(--mono); font-size: 0.88em; background: var(--code-bg); padding: 0.1em 0.38em; border-radius: 5px;
279
+ }
280
+ .md table { display: block; max-width: 100%; overflow-x: auto; border-collapse: collapse; margin: 0.6em 0; font-size: 0.93em;
281
+ }
282
+ .md th, .md td { border: 1px solid var(--divider); padding: 0.35em 0.7em; text-align: left;
283
+ }
284
+ .md th { background: var(--code-bg); font-weight: 600;
285
+ }
286
+ .md .katex-display { overflow-x: auto; overflow-y: hidden; padding: 0.2em 0;
287
+ }
288
+ .code { margin: 0.6em 0; border-radius: 10px; overflow: hidden; background: var(--code-block); border: 1px solid var(--divider);
289
+ }
290
+ .code-head { display: flex; align-items: center; justify-content: space-between; padding: 0.25em 0.4em 0.25em 0.8em; font-size: 0.78rem; color: var(--muted); background: var(--code-head);
291
+ }
292
+ .code-lang { font-family: var(--mono); text-transform: lowercase;
293
+ }
294
+ .code-copy { padding: 0.25em 0.7em; border-radius: 6px; color: var(--muted); font-size: 0.78rem;
295
+ }
296
+ .code-copy:hover { background: var(--hover); color: var(--text);
297
+ }
298
+ .md .code pre { margin: 0; padding: 0.7em 0.9em; overflow-x: auto; font-family: var(--mono); font-size: 0.84rem; line-height: 1.5; -webkit-overflow-scrolling: touch;
299
+ }
300
+ .md .code code { background: none; padding: 0; border-radius: 0; font-size: inherit; color: var(--hl-fg);
301
+ }
302
+
303
+ /* highlight.js tokens, one palette for light and one for dark, through variables */
304
+ .hljs-comment, .hljs-quote { color: var(--hl-comment); font-style: italic;
305
+ }
306
+ .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-doctag, .hljs-meta .hljs-keyword { color: var(--hl-keyword);
307
+ }
308
+ .hljs-string, .hljs-regexp, .hljs-addition, .hljs-meta .hljs-string { color: var(--hl-string);
309
+ }
310
+ .hljs-number, .hljs-symbol, .hljs-bullet, .hljs-variable.constant_ { color: var(--hl-number);
311
+ }
312
+ .hljs-title, .hljs-title.function_, .hljs-section, .hljs-selector-id { color: var(--hl-title);
313
+ }
314
+ .hljs-title.class_, .hljs-type, .hljs-built_in, .hljs-class .hljs-title { color: var(--hl-type);
315
+ }
316
+ .hljs-attr, .hljs-attribute, .hljs-property, .hljs-variable, .hljs-template-variable, .hljs-params { color: var(--hl-attr);
317
+ }
318
+ .hljs-name, .hljs-tag, .hljs-selector-class { color: var(--hl-tag);
319
+ }
320
+ .hljs-meta, .hljs-link, .hljs-subst { color: var(--hl-meta);
321
+ }
322
+ .hljs-deletion { color: var(--bad);
323
+ }
324
+ .hljs-emphasis { font-style: italic;
325
+ }
326
+ .hljs-strong { font-weight: 700;
327
+ }
328
+
329
+
330
+ /* src/components/chat/NoteBubble.vue */
331
+
332
+ .note { align-self: center; max-width: 92%; margin: 8px 0; padding: 4px 12px; border-radius: 14px; background: rgba(0, 0, 0, 0.28); color: #fff; font-size: 0.8rem; text-align: center;
333
+ }
334
+ .note summary { cursor: pointer; list-style: none;
335
+ }
336
+ .note summary::-webkit-details-marker { display: none;
337
+ }
338
+ .note p { margin: 6px 0 2px; text-align: left; white-space: pre-wrap;
339
+ }
340
+
341
+
342
+ /* src/components/chat/StepsGroup.vue */
343
+
344
+ .steps { align-self: flex-start; max-width: min(88%, 38rem); margin: 12px 0 0;
345
+ }
346
+ .steps > summary {
347
+ display: inline-flex; align-items: center; gap: 6px; max-width: 100%; padding: 4px 11px 4px 8px; border-radius: 14px;
348
+ background: var(--chip-bg); color: #fff; font-size: 0.8rem; cursor: pointer; list-style: none; user-select: none;
349
+ }
350
+ .steps summary::-webkit-details-marker { display: none;
351
+ }
352
+ .steps > summary > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
353
+ }
354
+ .steps-brief { opacity: 0.75;
355
+ }
356
+ .steps[open] > summary { background: rgba(0, 0, 0, 0.4);
357
+ }
358
+ .steps ol { list-style: none; margin: 4px 0 0; padding: 4px; border-radius: 12px; background: var(--in-bubble); color: var(--in-text); box-shadow: var(--shadow);
359
+ }
360
+ .steps li { padding: 5px 8px; font-size: 0.84rem;
361
+ }
362
+ .steps li + li { border-top: 1px solid var(--divider);
363
+ }
364
+ .steps-tool { display: flex; align-items: center; gap: 6px; cursor: pointer; list-style: none;
365
+ }
366
+ .steps-tool b { font-weight: 600;
367
+ }
368
+ .steps-tool code { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--muted); font-family: var(--mono); font-size: 0.9em;
369
+ }
370
+ .steps-ok { color: var(--ok); animation: tick 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
371
+ }
372
+ .steps-run { color: var(--muted); animation: breathe 1.4s ease-in-out infinite;
373
+ }
374
+ .steps { animation: pop 0.2s ease-out;
375
+ }
376
+ .steps[open] > ol { animation: unfold 0.24s cubic-bezier(0.22, 1, 0.36, 1); transform-origin: top left;
377
+ }
378
+ .steps-tool:active { opacity: 0.6;
379
+ }
380
+ .steps > summary { transition: background 0.2s, transform 0.15s;
381
+ }
382
+ .steps > summary:active { transform: scale(0.97);
383
+ }
384
+ .steps-fail { color: var(--bad);
385
+ }
386
+ .steps pre {
387
+ margin: 6px 0 2px; max-height: 14rem; overflow: auto; padding: 8px; border-radius: 8px; background: var(--code-bg);
388
+ font-family: var(--mono); font-size: 0.78rem; white-space: pre-wrap; word-break: break-word;
389
+ }
390
+
391
+
392
+ /* src/components/chat/ThreadInfo.vue */
393
+
394
+ .info-card { margin: 0 12px 8px; background: var(--surface-2);
395
+ }
396
+
397
+
398
+ /* src/components/chat/TypingBubble.vue */
399
+
400
+ .bubble.typing { display: inline-flex; gap: 4px; padding: 12px 14px;
401
+ }
402
+ .bubble.typing i { width: 7px; height: 7px; border-radius: 50%; background: var(--muted); animation: blink 1.2s infinite ease-in-out;
403
+ }
404
+ .bubble.typing i:nth-child(2) { animation-delay: 0.18s;
405
+ }
406
+ .bubble.typing i:nth-child(3) { animation-delay: 0.36s;
407
+ }
408
+
409
+
410
+ /* src/components/chats/ChatRow.vue */
411
+
412
+ .row {
413
+ position: relative; display: flex; align-items: center; gap: 12px; width: 100%;
414
+ padding: 8px 14px; min-height: var(--row); text-align: left; color: inherit; text-decoration: none !important;
415
+ transition: background 0.12s;
416
+ }
417
+ .row:hover { background: var(--hover);
418
+ }
419
+ .row[aria-current="true"] { background: var(--accent); color: var(--accent-text);
420
+ }
421
+ .row[aria-current="true"] .row-sub, .row[aria-current="true"] .row-time, .row[aria-current="true"] .row-kind { color: inherit; opacity: 0.85;
422
+ }
423
+ .row[aria-current="true"] .badge { background: var(--accent-text); color: var(--accent);
424
+ }
425
+ .row[aria-current="true"] .avatar .presence { border-color: var(--accent);
426
+ }
427
+ .row-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px;
428
+ }
429
+ .row-top, .row-bottom { display: flex; align-items: center; gap: 6px; min-width: 0;
430
+ }
431
+ .row-kind { color: var(--muted);
432
+ }
433
+ .row-name { flex: 1; min-width: 0; font-weight: 600; font-size: 1.03rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
434
+ }
435
+ .row-time { font-size: 0.78rem; color: var(--muted); flex: none;
436
+ }
437
+ .row-sub { flex: 1; min-width: 0; color: var(--muted); font-size: 0.92rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
438
+ }
439
+ .row-you, .row-typing { color: var(--accent);
440
+ }
441
+ .row[aria-current="true"] .row-you, .row[aria-current="true"] .row-typing { color: inherit;
442
+ }
443
+
444
+
445
+ /* src/components/chats/SearchBox.vue */
446
+
447
+ .search {
448
+ display: flex; align-items: center; gap: 8px; margin: 0 12px 8px; padding: 0 12px; height: 40px; border-radius: 20px;
449
+ background: var(--surface-2); color: var(--muted);
450
+ }
451
+ .search input { flex: 1; min-width: 0; height: 100%; border: 0; outline: 0; background: none; color: var(--text); font-size: 1rem;
452
+ }
453
+ .search input::placeholder { color: var(--muted);
454
+ }
455
+
456
+
457
+ /* src/components/common/Avatar.vue */
458
+
459
+ .avatar {
460
+ position: relative; flex: none; display: grid; place-items: center;
461
+ width: 54px; height: 54px; border-radius: 50%;
462
+ color: #fff; font-weight: 650; font-size: 1.2rem; letter-spacing: 0.02em;
463
+ background: linear-gradient(160deg, var(--a), var(--b));
464
+ user-select: none;
465
+ }
466
+ .avatar.sm { width: 40px; height: 40px; font-size: 0.98rem;
467
+ }
468
+ .avatar.xs { width: 30px; height: 30px; font-size: 0.8rem;
469
+ }
470
+ .avatar.xl { width: 84px; height: 84px; font-size: 1.9rem;
471
+ }
472
+ .avatar .presence {
473
+ position: absolute; right: -1px; bottom: -1px; width: 15px; height: 15px; border-radius: 50%;
474
+ border: 3px solid var(--surface); background: var(--muted);
475
+ }
476
+ .avatar.sm .presence { width: 13px; height: 13px; border-width: 2.5px;
477
+ }
478
+ .avatar.xs .presence { display: none;
479
+ }
480
+ .avatar .presence.idle { background: var(--ok);
481
+ }
482
+ .avatar .presence.working { background: var(--warn); animation: pulse 1.4s ease-in-out infinite;
483
+ }
484
+ .avatar .presence.dead { background: var(--bad);
485
+ }
486
+ .av0 { --a: #ff885e; --b: #ff516a;
487
+ }
488
+ .av1 { --a: #ffcd6a; --b: #ffa85c;
489
+ }
490
+ .av2 { --a: #82b1ff; --b: #665fff;
491
+ }
492
+ .av3 { --a: #a0de7e; --b: #54cb68;
493
+ }
494
+ .av4 { --a: #53edd6; --b: #28c9b7;
495
+ }
496
+ .av5 { --a: #72d5fd; --b: #2a9ef1;
497
+ }
498
+ .av6 { --a: #e0a2f3; --b: #d669ed;
499
+ }
500
+ .av7 { --a: #f7a3b6; --b: #ec5f87;
501
+ }
502
+
503
+
504
+ /* src/components/common/PageBar.vue */
505
+
506
+ .page-bar h2 { flex: 1; margin: 0 0 0 6px; font-size: 1.1rem; font-weight: 650; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
507
+ }
508
+ .page-bar .back + h2 { margin-left: 0;
509
+ }
510
+ .page { flex: 1; overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; background: var(--surface-2);
511
+ }
512
+ .page-inner { max-width: 640px; margin: 0 auto; padding: 8px 12px calc(24px + var(--safe-bottom));
513
+ }
514
+ @media (max-width: 719px) {
515
+ .page-inner { padding-left: 10px; padding-right: 10px;
516
+ }
517
+ }
518
+
519
+
520
+ /* src/components/common/Segmented.vue */
521
+
522
+ .seg { display: flex; margin: 8px 14px 12px; padding: 3px; border-radius: 11px; background: var(--surface-2); gap: 2px;
523
+ }
524
+ .seg button { flex: 1; min-height: 38px; border-radius: 9px; font-weight: 550; color: var(--muted); transition: background 0.25s ease, color 0.2s, box-shadow 0.25s, transform 0.15s;
525
+ }
526
+ .seg button:active:not(:disabled) { transform: scale(0.96);
527
+ }
528
+ .seg button[aria-checked="true"] { background: var(--surface); color: var(--text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.14);
529
+ }
530
+ .seg button:disabled { opacity: 0.4;
531
+ }
532
+
533
+
534
+ /* src/components/common/SheetHost.vue */
535
+
536
+ .backdrop { position: fixed; inset: 0; z-index: 30; background: var(--scrim); display: flex; align-items: flex-end; justify-content: center; animation: fade 0.25s ease-out; backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
537
+ }
538
+ .sheet {
539
+ width: 100%; max-width: 30rem; max-height: 82dvh; display: flex; flex-direction: column;
540
+ background: var(--surface); border-radius: 18px 18px 0 0; box-shadow: var(--sheet-shadow);
541
+ padding-bottom: var(--safe-bottom); animation: spring 0.38s cubic-bezier(0.22, 1, 0.36, 1);
542
+ }
543
+ .sheet-head { display: flex; align-items: center; gap: 6px; padding: 8px 8px 4px 18px; min-height: 52px;
544
+ }
545
+ .sheet-head h3 { flex: 1; margin: 0; font-size: 1.05rem; font-weight: 650;
546
+ }
547
+ .sheet-body { overflow-y: auto; overscroll-behavior: contain; padding: 0 0 8px;
548
+ }
549
+ @media (min-width: 720px) {
550
+ .backdrop { align-items: center;
551
+ }
552
+ .sheet { border-radius: 18px; max-height: 80dvh;
553
+ }
554
+ }
555
+
556
+
557
+ /* src/components/common/SimpleRow.vue */
558
+
559
+ .simple-row {
560
+ display: flex; align-items: center; gap: 14px; width: 100%; min-height: 58px; padding: 6px 16px;
561
+ text-align: left; color: inherit; text-decoration: none !important; transition: background 0.12s;
562
+ }
563
+ .simple-row:hover { background: var(--hover);
564
+ }
565
+ .simple-row[aria-current="true"] { background: var(--accent-soft);
566
+ }
567
+ .simple-icon { display: grid; place-items: center; width: 36px; height: 36px; border-radius: 10px; background: var(--accent-soft); color: var(--accent); flex: none;
568
+ }
569
+ .simple-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px;
570
+ }
571
+ .simple-text b { font-weight: 600; font-size: 1rem;
572
+ }
573
+ .simple-text small { color: var(--muted); font-size: 0.84rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
574
+ }
575
+ .simple-chev { color: var(--muted); flex: none;
576
+ }
577
+
578
+
579
+ /* src/components/common/SwitchRow.vue */
580
+
581
+ .switch-row { display: flex; align-items: center; gap: 12px; min-height: 54px; padding: 8px 16px;
582
+ }
583
+ .switch-row + .switch-row, .field-row + .switch-row, .switch-row + .field-row { border-top: 1px solid var(--divider);
584
+ }
585
+ .switch-row .grow { flex: 1; min-width: 0;
586
+ }
587
+ .switch-row small { display: block; color: var(--muted); font-size: 0.82rem; margin-top: 2px; line-height: 1.3;
588
+ }
589
+ .switch { position: relative; flex: none; width: 46px; height: 28px; border-radius: 14px; background: var(--divider); transition: background 0.25s ease;
590
+ }
591
+ .switch::after {
592
+ content: ""; position: absolute; top: 2px; left: 2px; width: 24px; height: 24px; border-radius: 50%;
593
+ background: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1), width 0.15s;
594
+ }
595
+ .switch[aria-checked="true"] { background: var(--ok);
596
+ }
597
+ .switch:active::after { width: 28px;
598
+ }
599
+ .switch[aria-checked="true"]::after { transform: translateX(18px);
600
+ }
601
+ .switch[aria-checked="true"]:active::after { transform: translateX(14px);
602
+ }
603
+
604
+
605
+ /* src/components/common/ToastHost.vue */
606
+
607
+ .toasts {
608
+ position: fixed; z-index: 40; left: 0; right: 0; top: calc(var(--safe-top) + 10px);
609
+ display: flex; flex-direction: column; align-items: center; gap: 8px; pointer-events: none; padding: 0 14px;
610
+ }
611
+ .toast {
612
+ max-width: 28rem; padding: 10px 16px; border-radius: 14px; background: rgba(28, 33, 38, 0.88); backdrop-filter: blur(14px) saturate(1.4); -webkit-backdrop-filter: blur(14px) saturate(1.4); color: #fff;
613
+ font-size: 0.92rem; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35); animation: drop 0.32s cubic-bezier(0.22, 1, 0.36, 1); pointer-events: auto;
614
+ }
615
+ .toast.bad { background: rgba(190, 40, 36, 0.96);
616
+ }
617
+
618
+
619
+ /* src/components/common/UserAvatar.vue */
620
+
621
+ .user-avatar { background: linear-gradient(160deg, #7cc4fa, #3390ec); overflow: hidden;
622
+ }
623
+ .user-avatar img { width: 100%; height: 100%; object-fit: cover;
624
+ }
625
+ .user-avatar svg { width: 58%; height: 58%; stroke-width: 1.7;
626
+ }
627
+
628
+
629
+ /* src/components/config/ModelForm.vue */
630
+
631
+ .model-form .unit { color: var(--muted);
632
+ }
633
+ .levels { display: flex; gap: 6px; flex-wrap: wrap; padding: 4px 16px 8px;
634
+ }
635
+ .level { min-height: 32px; padding: 0 12px; border-radius: 16px; background: var(--surface-2); color: var(--muted); font-size: 0.88rem; transition: background 0.2s, color 0.2s;
636
+ }
637
+ .level[aria-pressed="true"] { background: var(--accent); color: var(--accent-text);
638
+ }
639
+ .model-form .errcard { margin: 6px 16px;
640
+ }
641
+
642
+
643
+ /* src/components/graph/GraphPanel.vue */
644
+
645
+ .gp-card {
646
+ position: fixed; left: 0; top: 0; z-index: 60; width: 340px; max-width: calc(100vw - 16px); padding: 11px 13px; border-radius: 12px;
647
+ display: flex; flex-direction: column; gap: 5px; background: var(--graph-card); border: 1px solid var(--graph-card-border);
648
+ box-shadow: var(--graph-shadow); -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); color: var(--text); font-size: 0.8rem;
649
+ }
650
+ .gp-card.is-group { border-color: var(--grp);
651
+ }
652
+ .gp-card-head { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 0.92rem;
653
+ }
654
+ .gp-card-head b { font-weight: 650; overflow-wrap: anywhere;
655
+ }
656
+ .gp-card-row { display: flex; justify-content: space-between; gap: 18px;
657
+ }
658
+ .gp-card-row > span:first-child { color: var(--muted); flex: none;
659
+ }
660
+ .gp-card-row > span:last-child { text-align: right; overflow-wrap: anywhere; font-variant-numeric: tabular-nums;
661
+ }
662
+ .gp-card-text { margin-top: 3px; padding: 7px 9px; border-radius: 8px; background: var(--hover); line-height: 1.42; white-space: pre-wrap; overflow-wrap: anywhere; max-height: 240px; overflow: auto;
663
+ }
664
+ @media (hover: none) {
665
+ .gp-card { display: none;
666
+ }
667
+ }
668
+ .gp { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden;
669
+ }
670
+ .gp-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; padding: 4px 12px 10px;
671
+ }
672
+ .gp-stats > div { display: flex; flex-direction: column; gap: 1px; padding: 8px 10px; border-radius: 12px; background: var(--surface-2);
673
+ }
674
+ .gp-stats b { font-size: 1.25rem; font-weight: 650; font-variant-numeric: tabular-nums; letter-spacing: -0.01em;
675
+ }
676
+ .gp-stats span { font-size: 0.72rem; color: var(--muted);
677
+ }
678
+ .gp-legend { display: flex; flex-wrap: wrap; gap: 6px 14px; padding: 2px 16px 12px; border-bottom: 1px solid var(--divider); font-size: 0.75rem; color: var(--muted);
679
+ }
680
+ .gp-key { display: inline-flex; align-items: center; gap: 6px;
681
+ }
682
+ .gp-key i { display: inline-block; flex: none;
683
+ }
684
+ .gp-key .sw { width: 14px; height: 4px; border-radius: 2px;
685
+ }
686
+ .gp-key .ring { width: 11px; height: 11px; border-radius: 50%; border: 2px solid var(--muted);
687
+ }
688
+ .gp-key .ring.idle { border-color: var(--ok);
689
+ }
690
+ .gp-key .ring.working { border-color: var(--warn); animation: pulse 1.4s ease-in-out infinite;
691
+ }
692
+ .gp-key .hull { width: 16px; height: 11px; border-radius: 6px; border: 1px dashed var(--accent); background: var(--accent-soft);
693
+ }
694
+ .via-user { background: var(--via-user);
695
+ }
696
+ .via-agent { background: var(--via-agent);
697
+ }
698
+ .via-external { background: var(--via-external);
699
+ }
700
+ .gp-head { display: flex; align-items: center; padding: 10px 12px 4px 16px;
701
+ }
702
+ .gp-head h3 { flex: 1; margin: 0; font-size: 0.8rem; font-weight: 600; color: var(--accent); letter-spacing: 0.02em;
703
+ }
704
+ .gp-replay { width: 30px; height: 30px;
705
+ }
706
+ .gp-none { padding: 20px 16px; color: var(--muted); font-size: 0.85rem; line-height: 1.45;
707
+ }
708
+ .gp-feed { list-style: none; margin: 0; padding: 0 6px 10px; overflow-y: auto; overscroll-behavior: contain; flex: 1; min-height: 0;
709
+ }
710
+ .gp-item { display: flex; align-items: flex-start; gap: 10px; width: 100%; padding: 9px 10px; border-radius: 12px; text-align: left; animation: fade 0.25s ease-out;
711
+ }
712
+ .gp-item:hover { background: var(--hover);
713
+ }
714
+ .gp-item.is-group { background: color-mix(in srgb, var(--grp) 9%, transparent); box-shadow: inset 3px 0 0 var(--grp); border-radius: 4px 12px 12px 4px;
715
+ }
716
+ .gp-item.is-group:hover { background: color-mix(in srgb, var(--grp) 16%, transparent);
717
+ }
718
+ .gp-hash { display: grid; place-items: center; border-radius: 8px; background: var(--grp); color: #fff; font-weight: 700; font-size: 0.9rem; line-height: 1;
719
+ }
720
+ .gp-line b.grp { color: var(--grp);
721
+ }
722
+ .gp-tag { flex: none; padding: 0 6px; border-radius: 6px; font-size: 0.64rem; font-weight: 700; line-height: 1.5; color: var(--grp); border: 1px solid var(--grp); letter-spacing: 0.02em;
723
+ }
724
+ .gp-end { padding: 10px 12px 14px; text-align: center; font-size: 0.74rem; color: var(--muted);
725
+ }
726
+ .gp-retry { color: var(--accent); font-size: 0.74rem;
727
+ }
728
+ .gp-av { flex: none; width: 26px; height: 26px; border-radius: 50%; margin-top: 1px;
729
+ }
730
+ .gp-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px;
731
+ }
732
+ .gp-line { display: flex; align-items: baseline; gap: 5px; font-size: 0.82rem; min-width: 0;
733
+ }
734
+ .gp-line b { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
735
+ }
736
+ .gp-line b.grp { color: var(--accent);
737
+ }
738
+ .gp-arrow { color: var(--muted); flex: none;
739
+ }
740
+ .gp-via { flex: none; padding: 0 6px; border-radius: 999px; font-size: 0.64rem; font-weight: 600; line-height: 1.5; color: #fff;
741
+ }
742
+ .gp-line time { margin-left: auto; flex: none; font-size: 0.7rem; color: var(--muted); font-variant-numeric: tabular-nums;
743
+ }
744
+ .gp-text { font-size: 0.78rem; color: var(--muted); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow-wrap: anywhere;
745
+ }
746
+ @media (prefers-reduced-motion: reduce) {
747
+ .gp-item, .gp-key .ring.working { animation: none;
748
+ }
749
+ }
750
+
751
+
752
+ /* src/components/graph/GraphTip.vue */
753
+
754
+ .gt { display: flex; flex-direction: column; gap: 5px;
755
+ }
756
+ .gt-head { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 0.92rem;
757
+ }
758
+ .gt-head b { font-weight: 650; overflow-wrap: anywhere;
759
+ }
760
+ .gt-arrow { color: var(--muted);
761
+ }
762
+ .gt-sub { color: var(--muted); font-size: 0.8rem; overflow-wrap: anywhere;
763
+ }
764
+ .gt-row { display: flex; justify-content: space-between; gap: 18px; font-size: 0.8rem;
765
+ }
766
+ .gt-row > span:first-child { color: var(--muted); flex: none;
767
+ }
768
+ .gt-row > span:last-child { text-align: right; overflow-wrap: anywhere; font-variant-numeric: tabular-nums;
769
+ }
770
+ .gt-msg {
771
+ margin-top: 3px; padding: 6px 8px; border-radius: 8px; background: var(--hover);
772
+ font-size: 0.8rem; line-height: 1.4; overflow-wrap: anywhere; display: flex; flex-direction: column; gap: 2px;
773
+ }
774
+ .gt-full { white-space: pre-wrap; max-height: 220px; overflow: hidden;
775
+ }
776
+ .gt-meta { color: var(--muted); font-size: 0.72rem;
777
+ }
778
+ .gt-members { display: flex; flex-wrap: wrap; gap: 4px;
779
+ }
780
+ .gt-chip {
781
+ display: inline-flex; align-items: center; padding: 1px 7px; border-radius: 999px; font-size: 0.7rem; font-weight: 550;
782
+ background: var(--hover); color: var(--muted); line-height: 1.5;
783
+ }
784
+ .gt-chip.idle { background: color-mix(in srgb, var(--ok) 18%, transparent); color: var(--ok);
785
+ }
786
+ .gt-chip.working { background: color-mix(in srgb, var(--warn) 20%, transparent); color: var(--warn);
787
+ }
788
+
789
+
790
+ /* src/components/graph/GraphView.vue */
791
+
792
+ .gv-summary { margin-right: 6px; font-size: 0.78rem; color: var(--muted); white-space: nowrap;
793
+ }
794
+ .gv-feedbtn { display: none;
795
+ }
796
+ .gv {
797
+ position: relative; flex: 1; min-height: 0; overflow: hidden; background-color: var(--graph-bg);
798
+ background-image:
799
+ radial-gradient(ellipse 70% 60% at 50% 50%, color-mix(in srgb, var(--accent) 7%, transparent), transparent 70%),
800
+ radial-gradient(circle at 1px 1px, var(--graph-dot) 1px, transparent 1.2px);
801
+ background-size: auto, 22px 22px;
802
+ }
803
+ .gv-svg { position: absolute; inset: 0; display: block; user-select: none; -webkit-user-select: none;
804
+ }
805
+ .ghull-fill { fill: hsl(var(--h) 75% 55% / 0.1); stroke: hsl(var(--h) 75% 55% / 0.5); stroke-width: 1.3; stroke-dasharray: 5 5; transition: opacity 0.2s;
806
+ }
807
+ .ghull-hit { fill: none; stroke: transparent; stroke-width: 16; pointer-events: stroke;
808
+ }
809
+ .ghull.dim, .gpill.dim { opacity: 0.28;
810
+ }
811
+ .ghull, .gpill { transition: opacity 0.2s;
812
+ }
813
+ .gpill { cursor: default;
814
+ }
815
+ .gpill rect { fill: hsl(var(--h) 60% 22% / 0.92); stroke: hsl(var(--h) 75% 62% / 0.7); stroke-width: 1;
816
+ }
817
+ .gpill text { fill: hsl(var(--h) 90% 88%); font-size: 11.5px; font-weight: 600; text-anchor: middle; pointer-events: none;
818
+ }
819
+ :root[data-theme="light"] .gpill rect { fill: hsl(var(--h) 80% 95% / 0.96); stroke: hsl(var(--h) 60% 48% / 0.6);
820
+ }
821
+ :root[data-theme="light"] .gpill text { fill: hsl(var(--h) 70% 30%);
822
+ }
823
+ @media (prefers-color-scheme: light) {
824
+ :root:not([data-theme="dark"]) .gpill rect { fill: hsl(var(--h) 80% 95% / 0.96); stroke: hsl(var(--h) 60% 48% / 0.6);
825
+ }
826
+ :root:not([data-theme="dark"]) .gpill text { fill: hsl(var(--h) 70% 30%);
827
+ }
828
+ }
829
+ .gfx-hull { stroke-width: 2.5; fill-opacity: 0.08; pointer-events: none;
830
+ }
831
+ .gedge { transition: opacity 0.2s;
832
+ }
833
+ .gedge-line { fill: none; stroke: var(--graph-edge); stroke-linecap: round; transition: opacity 0.2s, stroke-width 0.2s;
834
+ }
835
+ .gedge.hot .gedge-line { stroke: var(--accent); opacity: 1 !important;
836
+ }
837
+ .gedge.dim { opacity: 0.2;
838
+ }
839
+ .gedge-hit { fill: none; stroke: transparent; stroke-width: 14; pointer-events: stroke;
840
+ }
841
+ .gfx-glow { fill: none; stroke: inherit; stroke-width: 2.2; stroke-linecap: round; pointer-events: none;
842
+ }
843
+ .gfx-glow.wide { stroke-width: 7; opacity: 0.25;
844
+ }
845
+ .gnode { cursor: default; outline: none; transition: opacity 0.2s;
846
+ }
847
+ .gnode.dim { opacity: 0.32;
848
+ }
849
+ .gnode.ghost { opacity: 0.55;
850
+ }
851
+ .gnode.ghost.dim { opacity: 0.2;
852
+ }
853
+ .gnode-halo { opacity: 0.28; pointer-events: none;
854
+ }
855
+ .gnode.ghost .gnode-halo { opacity: 0;
856
+ }
857
+ .gnode-ring { fill: none; stroke-width: 2.4;
858
+ }
859
+ .gnode-ring.idle { stroke: var(--ok); opacity: 0.85;
860
+ }
861
+ .gnode-ring.working { stroke: var(--warn); animation: gv-ring 1.5s ease-in-out infinite;
862
+ }
863
+ .gnode-ring.off { stroke: var(--muted); stroke-dasharray: 3 4; opacity: 0.7;
864
+ }
865
+ .gnode-aura { fill: none; stroke: var(--warn); stroke-width: 1.5; transform-box: fill-box; transform-origin: center; animation: gv-aura 1.5s ease-out infinite;
866
+ }
867
+ .gnode-face { stroke: var(--graph-bg); stroke-width: 2; transition: stroke 0.15s;
868
+ }
869
+ .gnode:hover .gnode-face, .gnode:focus-visible .gnode-face { stroke: var(--text);
870
+ }
871
+ .gnode:focus-visible .gnode-ring { stroke: var(--accent); stroke-width: 3.2; opacity: 1;
872
+ }
873
+ .gnode-text { fill: #fff; font-weight: 650; text-anchor: middle; pointer-events: none; letter-spacing: 0.02em;
874
+ }
875
+ .gnode.ghost .gnode-text { fill: var(--muted);
876
+ }
877
+ .gnode-label { fill: var(--text); font-size: 12px; font-weight: 550; text-anchor: middle; paint-order: stroke; stroke: var(--graph-bg); stroke-width: 4px; stroke-linejoin: round; pointer-events: none;
878
+ }
879
+ .gnode-badge circle { fill: var(--graph-bg); stroke: var(--via-external); stroke-width: 1.6;
880
+ }
881
+ .gnode-badge path { fill: none; stroke: var(--via-external); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round;
882
+ }
883
+ @keyframes gv-ring {
884
+ 0%, 100% { opacity: 0.55; stroke-width: 2.2;
885
+ }
886
+ 50% { opacity: 1; stroke-width: 3.6;
887
+ }
888
+ }
889
+ @keyframes gv-aura {
890
+ from { transform: scale(1); opacity: 0.7;
891
+ }
892
+ to { transform: scale(1.7); opacity: 0;
893
+ }
894
+ }
895
+ .gfx-ring { fill: none; stroke-width: 2.4; pointer-events: none;
896
+ }
897
+ .gpacket circle { pointer-events: none;
898
+ }
899
+ .gpacket-core { fill: #fff; stroke-width: 2;
900
+ }
901
+ .gpacket .gpacket-hit { fill: transparent; stroke: none; pointer-events: all; cursor: help;
902
+ }
903
+ .gv-tip {
904
+ position: absolute; left: 0; top: 0; z-index: 4; width: max-content; max-width: min(320px, calc(100% - 16px)); padding: 11px 13px; border-radius: 12px;
905
+ background: var(--graph-card); border: 1px solid var(--graph-card-border); box-shadow: var(--graph-shadow);
906
+ -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); color: var(--text); pointer-events: none;
907
+ }
908
+ .gv-banner {
909
+ position: absolute; top: 12px; left: 50%; transform: translateX(-50%); z-index: 3; display: flex; align-items: center; gap: 8px;
910
+ max-width: calc(100% - 24px); padding: 7px 14px; border-radius: 999px; font-size: 0.82rem;
911
+ background: var(--graph-card); border: 1px solid var(--graph-card-border); box-shadow: var(--graph-shadow); color: var(--warn);
912
+ }
913
+ .gv-badge {
914
+ position: absolute; top: 12px; left: 50%; transform: translateX(-50%); z-index: 3; display: flex; align-items: center; gap: 10px; max-width: calc(100% - 24px);
915
+ padding: 5px 6px 5px 14px; border-radius: 999px; font-size: 0.78rem; background: var(--graph-card); border: 1px solid var(--accent); box-shadow: var(--graph-shadow); color: var(--text);
916
+ }
917
+ .gv-badge b { font-weight: 650; letter-spacing: 0.04em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums;
918
+ }
919
+ .gv-badge .btn { min-height: 28px; padding: 0 12px; border-radius: 999px;
920
+ }
921
+ .gv-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--bad); animation: pulse 1.4s ease-in-out infinite;
922
+ }
923
+ .gv-banner.bad { color: var(--bad);
924
+ }
925
+ .gv-empty {
926
+ position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 1; width: min(340px, calc(100% - 48px));
927
+ display: flex; flex-direction: column; gap: 6px; text-align: center; color: var(--muted); font-size: 0.85rem; line-height: 1.45; pointer-events: none;
928
+ margin-top: 96px;
929
+ }
930
+ .gv-empty b { color: var(--text); font-size: 1rem; font-weight: 650;
931
+ }
932
+ .gv-scrim { position: absolute; inset: 0; z-index: 5; background: var(--scrim); animation: fade 0.18s ease-out;
933
+ }
934
+ .gv-sheet {
935
+ position: absolute; left: 0; right: 0; bottom: 0; z-index: 6; height: min(72%, 560px); display: flex; flex-direction: column;
936
+ padding-top: 14px; border-radius: 18px 18px 0 0; background: var(--surface); box-shadow: var(--sheet-shadow); animation: spring 0.3s ease-out;
937
+ }
938
+ .gv-close { position: absolute; right: 6px; top: 6px; width: 36px; height: 36px; z-index: 1;
939
+ }
940
+ @media (max-width: 719px) {
941
+ .gv-feedbtn { display: grid;
942
+ }
943
+ .gv-summary { display: none;
944
+ }
945
+ .gv-empty { margin-top: 70px;
946
+ }
947
+ .gv-badge { top: 8px; font-size: 0.72rem;
948
+ }
949
+ .gv-badge b { max-width: 60vw;
950
+ }
951
+ }
952
+ @media (min-width: 720px) {
953
+ .gv-sheet, .gv-scrim { display: none;
954
+ }
955
+ }
956
+ @media (prefers-reduced-motion: reduce) {
957
+ .gnode-ring.working, .gnode-aura { animation: none;
958
+ }
959
+ .gnode-aura { display: none;
960
+ }
961
+ .gv-dot { animation: none;
962
+ }
963
+ }
964
+
965
+
966
+ /* src/components/graph/ReplayBar.vue */
967
+
968
+ .rb { position: absolute; left: 0; right: 0; bottom: 0; z-index: 3; display: flex; justify-content: center; padding: 0 12px calc(12px + var(--safe-bottom, 0px)); pointer-events: none;
969
+ }
970
+ .rb > * { pointer-events: auto;
971
+ }
972
+ .rb.replay { padding-left: 12px; padding-right: 12px;
973
+ }
974
+ .rb-open {
975
+ display: inline-flex; align-items: center; gap: 7px; height: 36px; padding: 0 16px 0 13px; border-radius: 999px; font-size: 0.85rem; font-weight: 600;
976
+ color: var(--text); background: var(--graph-card); border: 1px solid var(--graph-card-border); box-shadow: var(--graph-shadow);
977
+ -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); transition: transform 0.12s, border-color 0.15s;
978
+ }
979
+ .rb-open svg { color: var(--accent);
980
+ }
981
+ .rb-open:hover { border-color: var(--accent);
982
+ }
983
+ .rb-open:active { transform: scale(0.97);
984
+ }
985
+ .rb-card {
986
+ width: min(880px, 100%); border-radius: 16px; padding: 12px 16px; background: var(--graph-card); border: 1px solid var(--graph-card-border);
987
+ box-shadow: var(--graph-shadow); -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); color: var(--text); animation: spring 0.25s ease-out;
988
+ }
989
+ .rb-picker { width: min(560px, 100%); display: flex; flex-direction: column; gap: 12px;
990
+ }
991
+ .rb-row { display: flex; align-items: center; gap: 10px; min-width: 0;
992
+ }
993
+ .rb-title { font-size: 0.95rem; font-weight: 650;
994
+ }
995
+ .rb-hint { flex: 1; min-width: 0; font-size: 0.76rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
996
+ }
997
+ .rb-x { width: 30px; height: 30px; margin-left: auto;
998
+ }
999
+ .rb-chips { display: flex; flex-wrap: wrap; gap: 6px;
1000
+ }
1001
+ .rb-chip { height: 30px; padding: 0 13px; border-radius: 999px; font-size: 0.8rem; font-weight: 550; background: var(--chip-bg, var(--surface-2)); color: var(--text); border: 1px solid transparent; transition: background 0.15s, color 0.15s;
1002
+ }
1003
+ .rb-chip:hover:not(:disabled) { background: var(--hover);
1004
+ }
1005
+ .rb-chip.on { background: var(--accent-soft); color: var(--accent); border-color: var(--accent);
1006
+ }
1007
+ .rb-chip:disabled { opacity: 0.5;
1008
+ }
1009
+ .rb-custom { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px;
1010
+ }
1011
+ .rb-custom label { display: flex; flex-direction: column; gap: 4px; font-size: 0.72rem; color: var(--muted); flex: 1; min-width: 150px;
1012
+ }
1013
+ .rb-custom input {
1014
+ height: 34px; padding: 0 10px; border-radius: 10px; font: inherit; font-size: 0.85rem; color: var(--text); background: var(--surface-2); border: 1px solid var(--divider);
1015
+ color-scheme: light dark; font-variant-numeric: tabular-nums;
1016
+ }
1017
+ .rb-custom input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px;
1018
+ }
1019
+ .rb-err { font-size: 0.78rem; color: var(--bad);
1020
+ }
1021
+ .rb-cut { font-size: 0.78rem; line-height: 1.35; color: var(--warn); padding: 0 2px 6px;
1022
+ }
1023
+ .rb-panel { display: flex; flex-direction: column; gap: 10px;
1024
+ }
1025
+ .rb-main { display: flex; align-items: center; gap: 16px; flex-wrap: nowrap;
1026
+ }
1027
+ .rb-ctl { display: flex; align-items: center; gap: 4px; flex: none;
1028
+ }
1029
+ .rb-btn { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; color: var(--text); transition: background 0.15s, transform 0.1s;
1030
+ }
1031
+ .rb-btn:hover { background: var(--hover);
1032
+ }
1033
+ .rb-btn:active { transform: scale(0.92);
1034
+ }
1035
+ .rb-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px;
1036
+ }
1037
+ .rb-btn.big { width: 42px; height: 42px; background: var(--accent); color: #fff; margin: 0 2px;
1038
+ }
1039
+ .rb-btn.big:hover { background: var(--accent); filter: brightness(1.08);
1040
+ }
1041
+ .rb-clock { display: flex; flex-direction: column; align-items: flex-start; line-height: 1.05; flex: none;
1042
+ }
1043
+ .rb-clock b { font-size: 1.7rem; font-weight: 650; letter-spacing: -0.01em; font-variant-numeric: tabular-nums; font-feature-settings: "tnum";
1044
+ }
1045
+ .rb-clock small { font-size: 0.7rem; color: var(--muted); margin-top: 2px;
1046
+ }
1047
+ .rb-opts { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; flex-wrap: wrap; justify-content: flex-end;
1048
+ }
1049
+ .rb-speed { display: inline-flex; align-items: center; gap: 6px; font-size: 0.75rem; color: var(--muted);
1050
+ }
1051
+ .rb-speed select {
1052
+ height: 30px; padding: 0 10px; border-radius: 9px; font: inherit; font-size: 0.82rem; font-weight: 550; color: var(--text); background: var(--surface-2); border: 1px solid var(--divider); cursor: pointer;
1053
+ }
1054
+ .rb-speed select:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px;
1055
+ }
1056
+ .rb-toggle { display: inline-flex; align-items: center; gap: 7px; height: 30px; padding: 0 10px 0 6px; border-radius: 999px; font-size: 0.78rem; font-weight: 550; color: var(--muted);
1057
+ }
1058
+ .rb-toggle i { position: relative; width: 26px; height: 16px; border-radius: 999px; background: var(--divider); transition: background 0.15s;
1059
+ }
1060
+ .rb-toggle i::after { content: ""; position: absolute; left: 2px; top: 2px; width: 12px; height: 12px; border-radius: 50%; background: #fff; transition: transform 0.15s;
1061
+ }
1062
+ .rb-toggle.on { color: var(--text);
1063
+ }
1064
+ .rb-toggle.on i { background: var(--accent);
1065
+ }
1066
+ .rb-toggle.on i::after { transform: translateX(10px);
1067
+ }
1068
+ .rb-toggle:focus-visible { outline: 2px solid var(--accent);
1069
+ }
1070
+ .rb-skipped { padding: 2px 9px; border-radius: 999px; font-size: 0.7rem; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--accent); background: var(--accent-soft); white-space: nowrap;
1071
+ }
1072
+ .rb-exit { flex: none;
1073
+ }
1074
+ .rb-plain { background: var(--surface-2); color: var(--text);
1075
+ }
1076
+ .rb-scrub { display: flex; align-items: center; gap: 10px;
1077
+ }
1078
+ .rb-end { flex: none; font-size: 0.72rem; color: var(--muted); font-variant-numeric: tabular-nums; min-width: 56px;
1079
+ }
1080
+ .rb-end:last-child { text-align: right;
1081
+ }
1082
+ .rb-track { position: relative; flex: 1; height: 38px; cursor: pointer; touch-action: none; border-radius: 8px; outline: none; user-select: none; -webkit-user-select: none;
1083
+ }
1084
+ .rb-track:focus-visible { box-shadow: 0 0 0 2px var(--accent);
1085
+ }
1086
+ .rb-hist { position: absolute; left: 0; right: 0; bottom: 8px; top: 2px; display: flex; align-items: flex-end; gap: 1px; pointer-events: none;
1087
+ }
1088
+ .rb-hist i { flex: 1; min-height: 0; border-radius: 1.5px 1.5px 0 0; background: color-mix(in srgb, var(--accent) 38%, transparent);
1089
+ }
1090
+ .rb-rail { position: absolute; left: 0; right: 0; bottom: 4px; height: 4px; border-radius: 2px; background: var(--divider); pointer-events: none;
1091
+ }
1092
+ .rb-rail i { display: block; height: 100%; border-radius: 2px; background: var(--accent);
1093
+ }
1094
+ .rb-knob { position: absolute; bottom: 6px; width: 16px; height: 16px; margin: 0 0 -8px -8px; border-radius: 50%; background: #fff; border: 3px solid var(--accent); box-shadow: 0 1px 6px rgba(0, 0, 0, 0.35); transition: transform 0.12s; pointer-events: none;
1095
+ }
1096
+ .rb-track:hover .rb-knob, .rb-knob.drag { transform: scale(1.18);
1097
+ }
1098
+ .rb-skel { display: flex; align-items: center; gap: 12px; min-height: 64px; font-size: 0.82rem; color: var(--muted);
1099
+ }
1100
+ .rb-skel .sk { display: block; height: 28px; border-radius: 8px; background: linear-gradient(90deg, var(--surface-2), var(--hover), var(--surface-2)); background-size: 200% 100%; animation: rb-shimmer 1.2s linear infinite;
1101
+ }
1102
+ .rb-skel .a { width: 42px; border-radius: 50%; height: 42px;
1103
+ }
1104
+ .rb-skel .b { width: 110px;
1105
+ }
1106
+ .rb-skel .c { flex: 1; max-width: 340px;
1107
+ }
1108
+ .rb-skel span { margin-left: auto;
1109
+ }
1110
+ @keyframes rb-shimmer {
1111
+ from { background-position: 100% 0;
1112
+ }
1113
+ to { background-position: -100% 0;
1114
+ }
1115
+ }
1116
+ .rb-bad { color: var(--bad);
1117
+ }
1118
+ .rb-errtext { flex: 1; min-width: 0; font-size: 0.85rem;
1119
+ }
1120
+ .rb-errtext small { display: block; font-size: 0.72rem; opacity: 0.8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1121
+ }
1122
+ .rb-emptytext { flex: 1; font-size: 0.9rem; color: var(--muted);
1123
+ }
1124
+ @media (max-width: 719px) {
1125
+ .rb { padding-left: 8px; padding-right: 8px;
1126
+ }
1127
+ .rb-card { padding: 10px 12px;
1128
+ }
1129
+ .rb-main { flex-wrap: wrap; gap: 8px 12px;
1130
+ }
1131
+ .rb-clock b { font-size: 1.4rem;
1132
+ }
1133
+ .rb-clock { order: 1; margin-left: auto; align-items: flex-end;
1134
+ }
1135
+ .rb-ctl { order: 0;
1136
+ }
1137
+ .rb-opts { order: 2; flex-basis: 100%; justify-content: flex-start;
1138
+ }
1139
+ .rb-exit { order: 3; margin-left: auto;
1140
+ }
1141
+ .rb-hint { display: none;
1142
+ }
1143
+ }
1144
+ @media (prefers-reduced-motion: reduce) {
1145
+ .rb-card, .rb-skel .sk { animation: none;
1146
+ }
1147
+ }
1148
+
1149
+
1150
+ /* src/components/groups/GroupMembers.vue */
1151
+
1152
+ .members { flex: none; width: 260px; display: flex; flex-direction: column; background: var(--surface); border-left: 1px solid var(--divider); overflow-y: auto;
1153
+ }
1154
+ .members-head { display: flex; align-items: center; gap: 8px; padding: 10px 8px 6px 14px; position: sticky; top: 0; background: var(--surface);
1155
+ }
1156
+ .members-head b { flex: 1;
1157
+ }
1158
+ .members-count { color: var(--muted); font-size: 0.85rem;
1159
+ }
1160
+ .members ul { list-style: none; margin: 0; padding: 0 0 8px;
1161
+ }
1162
+ .member { display: flex; align-items: center; gap: 10px; padding: 6px 14px; color: inherit; text-decoration: none !important;
1163
+ }
1164
+ a.member:hover { background: var(--hover);
1165
+ }
1166
+ .member-body { min-width: 0; display: flex; flex-direction: column;
1167
+ }
1168
+ .member-name { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1169
+ }
1170
+ .member-state { font-size: 0.8rem; color: var(--muted);
1171
+ }
1172
+ .member-state.on { color: var(--ok);
1173
+ }
1174
+ @media (max-width: 719px) {
1175
+ .members { position: absolute; inset: 56px 0 0 auto; width: min(82vw, 320px); z-index: 5; box-shadow: var(--shadow);
1176
+ }
1177
+ .group-body { position: relative;
1178
+ }
1179
+ }
1180
+
1181
+
1182
+ /* src/components/groups/GroupView.vue */
1183
+
1184
+ .group-body { flex: 1; min-height: 0; display: flex;
1185
+ }
1186
+ .group-main { flex: 1; min-width: 0; display: flex; flex-direction: column;
1187
+ }
1188
+ .group-who { display: block; font-size: 0.8rem; font-weight: 650; color: var(--accent); margin-bottom: 2px;
1189
+ }
1190
+ .group-time { display: block; text-align: right; margin-top: 3px; font-size: 0.7rem; opacity: 0.6; user-select: none;
1191
+ }
1192
+ .msg.out .group-time { color: var(--out-meta); opacity: 1;
1193
+ }
1194
+
1195
+
1196
+ /* src/components/logs/LogView.vue */
1197
+
1198
+ .log-tools { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin: 12px 0 0;
1199
+ }
1200
+ .log-chips { display: flex; gap: 6px; flex-wrap: wrap;
1201
+ }
1202
+ .log-chip { min-height: 32px; padding: 0 12px; border-radius: 16px; background: var(--surface); color: var(--muted); font-size: 0.86rem; transition: background 0.2s, color 0.2s;
1203
+ }
1204
+ .log-chip b { font-weight: 650; margin-left: 2px;
1205
+ }
1206
+ .log-chip[aria-checked="true"] { background: var(--accent); color: var(--accent-text);
1207
+ }
1208
+ .log-chip.is-bad:not([aria-checked="true"]) { color: var(--bad);
1209
+ }
1210
+ .log-search { flex: 1; min-width: 9rem; min-height: 34px; padding: 0 12px; border-radius: 17px; background: var(--surface); border: 1px solid transparent;
1211
+ }
1212
+ .log-search:focus { outline: none; border-color: var(--accent);
1213
+ }
1214
+ .logbox {
1215
+ margin: 10px 0 0; padding: 6px 0; border-radius: var(--radius); background: var(--surface); font-family: var(--mono);
1216
+ font-size: 0.78rem; line-height: 1.5; min-height: 8rem; max-height: 60dvh; overflow: auto;
1217
+ }
1218
+ .log-day { position: sticky; top: 0; padding: 4px 12px; background: var(--surface-2); color: var(--muted); font-size: 0.72rem; letter-spacing: 0.04em; z-index: 1;
1219
+ }
1220
+ .log-row { display: grid; grid-template-columns: 4.6rem 5.6rem 1fr; gap: 8px; padding: 2px 12px; align-items: baseline;
1221
+ }
1222
+ .log-row:hover { background: var(--hover);
1223
+ }
1224
+ .log-time { color: var(--muted); font-variant-numeric: tabular-nums;
1225
+ }
1226
+ .log-kind { color: var(--accent); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1227
+ }
1228
+ .log-text { white-space: pre-wrap; word-break: break-word; min-width: 0;
1229
+ }
1230
+ .log-row.is-turn { margin-top: 6px; border-top: 1px solid var(--divider); padding-top: 6px;
1231
+ }
1232
+ .log-row.is-turn .log-kind, .log-row.is-done .log-kind { color: var(--ok);
1233
+ }
1234
+ .log-row.is-info .log-kind { color: var(--muted);
1235
+ }
1236
+ .log-row.is-info .log-text { color: var(--muted);
1237
+ }
1238
+ .log-row.is-error .log-kind, .log-row.is-error .log-text { color: var(--bad);
1239
+ }
1240
+ .log-jump { margin-top: 8px;
1241
+ }
1242
+ .mute { display: block; padding: 8px 12px; color: var(--muted);
1243
+ }
1244
+ @media (max-width: 560px) {
1245
+ .log-row { grid-template-columns: 4.2rem 1fr;
1246
+ }
1247
+ .log-kind { grid-column: 2;
1248
+ }
1249
+ .log-text { grid-column: 2;
1250
+ }
1251
+ }
1252
+
1253
+
1254
+ /* src/components/settings/ProfileCard.vue */
1255
+
1256
+ .profile { display: flex; align-items: center; gap: 16px; padding: 16px;
1257
+ }
1258
+ .profile-side { display: flex; flex-direction: column; gap: 4px; min-width: 0;
1259
+ }
1260
+ .profile-side small { color: var(--muted); line-height: 1.35;
1261
+ }
1262
+ .profile-side .actions { padding: 8px 0 0;
1263
+ }
1264
+
1265
+
1266
+ /* src/components/sheets/ConfirmSheet.vue */
1267
+
1268
+ .confirm-text { padding-top: 8px; font-size: 0.95rem; color: var(--text);
1269
+ }
1270
+
1271
+
1272
+ /* src/components/sheets/MenuSheet.vue */
1273
+
1274
+ .menu-item { display: flex; align-items: center; gap: 14px; width: 100%; min-height: 50px; padding: 0 18px; text-align: left; font-size: 1rem;
1275
+ }
1276
+ .menu-item:hover { background: var(--hover);
1277
+ }
1278
+ .menu-item.danger { color: var(--bad);
1279
+ }
1280
+ .menu-item svg { color: var(--muted);
1281
+ }
1282
+ .menu-item.danger svg { color: var(--bad);
1283
+ }
1284
+
1285
+
1286
+ /* src/components/shell/ConnectionBanner.vue */
1287
+
1288
+ .banner {
1289
+ display: flex; align-items: center; gap: 8px; margin: 0 12px 8px; padding: 8px 12px; border-radius: 12px;
1290
+ background: var(--accent-soft); color: var(--text); font-size: 0.88rem;
1291
+ }
1292
+ .banner.bad { background: var(--bad-soft);
1293
+ }
1294
+ .banner .spin { width: 14px; height: 14px; border-width: 2px;
1295
+ }
1296
+
1297
+
1298
+ /* src/components/shell/LoginScreen.vue */
1299
+
1300
+ .login { height: 100%; display: grid; place-items: center; padding: 20px; background: var(--surface-2);
1301
+ }
1302
+ .login form { width: 100%; max-width: 22rem; padding: 28px 22px; border-radius: 20px; background: var(--surface); box-shadow: 0 8px 40px rgba(0, 0, 0, 0.2); display: flex; flex-direction: column; gap: 14px; text-align: center;
1303
+ }
1304
+ .login img { margin: 0 auto; object-fit: contain;
1305
+ }
1306
+ .login h1 { margin: 0; font-size: 1.35rem;
1307
+ }
1308
+ .login p { margin: 0; color: var(--muted); font-size: 0.92rem; line-height: 1.4;
1309
+ }
1310
+ .login input { height: 48px; padding: 0 14px; border-radius: 12px; border: 1px solid var(--divider); background: var(--surface-2); color: var(--text); font-size: 1rem; text-align: center;
1311
+ }
1312
+ .login .err { color: var(--bad); font-size: 0.9rem; min-height: 1.2em;
1313
+ }
1314
+
1315
+
1316
+ /* src/components/shell/PaneHeader.vue */
1317
+
1318
+ .pane-head {
1319
+ display: flex; align-items: center; gap: 8px; min-height: 56px;
1320
+ padding: calc(var(--safe-top) + 8px) 12px 8px;
1321
+ }
1322
+ .pane-head h1 { flex: 1; margin: 0; font-size: 1.2rem; font-weight: 650; letter-spacing: -0.01em;
1323
+ }
1324
+ .pane-list { flex: 1; overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; padding-bottom: 8px;
1325
+ }
1326
+ .pane-group { padding: 12px 16px 4px; font-size: 0.8rem; font-weight: 600; color: var(--accent); letter-spacing: 0.02em;
1327
+ }
1328
+ .pane-subgroup { padding: 8px 16px 2px; font-size: 0.74rem; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em;
1329
+ }
1330
+
1331
+
1332
+ /* src/components/shell/Rail.vue */
1333
+
1334
+ .rail {
1335
+ display: flex; flex-direction: column; align-items: stretch; gap: 2px;
1336
+ padding: calc(var(--safe-top) + 10px) 6px 10px calc(var(--safe-left) + 6px);
1337
+ background: var(--rail-bg); border-right: 1px solid var(--divider); min-height: 0;
1338
+ }
1339
+ .rail-logo { display: grid; place-items: center; height: 44px; margin-bottom: 6px;
1340
+ }
1341
+ .rail-logo img { object-fit: contain;
1342
+ }
1343
+ .rail-tab {
1344
+ position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
1345
+ min-height: 56px; border-radius: 12px; color: var(--muted); font-size: 0.68rem; font-weight: 500;
1346
+ transition: background 0.15s, color 0.15s; text-decoration: none !important;
1347
+ }
1348
+ .rail-tab:hover { background: var(--hover);
1349
+ }
1350
+ .rail-tab[aria-current="page"] { color: var(--accent);
1351
+ }
1352
+ .rail-tab .badge { position: absolute; top: 5px; left: calc(50% + 6px);
1353
+ }
1354
+ .rail-spacer { flex: 1;
1355
+ }
1356
+ .rail-status { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 8px 0; font-size: 0.62rem; color: var(--muted);
1357
+ }
1358
+ .rail-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--muted);
1359
+ }
1360
+ .rail-dot.ok { background: var(--ok);
1361
+ }
1362
+ .rail-dot.warn { background: var(--warn);
1363
+ }
1364
+ .rail-dot.bad { background: var(--bad);
1365
+ }
1366
+ @media (max-width: 719px) {
1367
+ .rail {
1368
+ grid-row: 2; grid-column: 1; flex-direction: row; align-items: stretch; justify-content: space-around; gap: 0;
1369
+ padding: 4px calc(var(--safe-right) + 4px) calc(4px + var(--safe-bottom)) calc(var(--safe-left) + 4px);
1370
+ border-right: 0; border-top: 1px solid var(--divider);
1371
+ }
1372
+ .rail-logo, .rail-spacer, .rail-status { display: none;
1373
+ }
1374
+ .rail-tab { flex: 1; min-height: 50px;
1375
+ }
1376
+ }
1377
+
1378
+
1379
+ /* src/components/shell/WelcomeMain.vue */
1380
+
1381
+ .welcome { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; padding: 24px; text-align: center; color: var(--muted); background: var(--surface-2);
1382
+ }
1383
+ .welcome img { object-fit: contain;
1384
+ }
1385
+ .welcome b { color: var(--text); font-size: 1.15rem;
1386
+ }
1387
+
1388
+
1389
+ /* src/components/spawn/FolderPicker.vue */
1390
+
1391
+ .picker-path { padding: 4px 18px 8px; font-family: var(--mono); font-size: 0.8rem; color: var(--muted); overflow-wrap: anywhere;
1392
+ }
1393
+ .picker-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1394
+ }
1395
+ .menu-item .chev { color: var(--muted);
1396
+ }
1397
+
1398
+
1399
+ /* src/components/spawn/NewPane.vue */
1400
+
1401
+ .template-row { display: flex; align-items: center;
1402
+ }
1403
+ .template-row .simple-row { flex: 1; min-width: 0;
1404
+ }
1405
+ .template-x { font-size: 1.4rem; line-height: 1;
1406
+ }
1407
+
1408
+
1409
+ /* src/components/spawn/SpawnExtra.vue */
1410
+
1411
+ .spawn-resume { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1412
+ }
1413
+
1414
+
1415
+ /* src/components/spawn/SpawnTemplates.vue */
1416
+
1417
+ /* A wide screen lists the templates in the pane beside the form. */
1418
+ @media (min-width: 720px) {
1419
+ .spawn-templates { display: none;
1420
+ }
1421
+ }
1422
+ .spawn-templates .chips { padding: 8px 4px 0;
1423
+ }
1424
+
1425
+
1426
+ /* src/components/spawn/SpawnWhere.vue */
1427
+
1428
+ .chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 4px 16px 12px;
1429
+ }
1430
+ .chip { max-width: 100%; padding: 5px 11px; border-radius: 14px; background: var(--surface-2); font-size: 0.84rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1431
+ }
1432
+ .chip:hover { background: var(--accent-soft);
1433
+ }
1434
+