collabmd 0.1.18

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 (430) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +453 -0
  3. package/bin/collabmd.js +241 -0
  4. package/docker-compose.yml +43 -0
  5. package/package.json +93 -0
  6. package/public/assets/css/base.css +1 -0
  7. package/public/assets/css/style.css +1 -0
  8. package/public/assets/js/assets/Assistant-Bold-ZDZZ6JHA.woff2 +0 -0
  9. package/public/assets/js/assets/Assistant-Medium-DZ25RZU3.woff2 +0 -0
  10. package/public/assets/js/assets/Assistant-Regular-PLF2XOGW.woff2 +0 -0
  11. package/public/assets/js/assets/Assistant-SemiBold-CZ5MX6FK.woff2 +0 -0
  12. package/public/assets/js/chunks/CodeMirrorEditor-UCMRAMCV-MAKZFDBE.js +12 -0
  13. package/public/assets/js/chunks/apl-C5P5JBDI.js +1 -0
  14. package/public/assets/js/chunks/ar-SA-NXDWD63E-MF6HMEA4.js +8 -0
  15. package/public/assets/js/chunks/architecture-PBZL5I3N-55LDZ5WS.js +1 -0
  16. package/public/assets/js/chunks/architectureDiagram-2XIMDMQ5-2VP562X7.js +36 -0
  17. package/public/assets/js/chunks/asciiarmor-3NCLLELT.js +1 -0
  18. package/public/assets/js/chunks/asn1-KF4WXU3M.js +1 -0
  19. package/public/assets/js/chunks/asterisk-EA3VIN65.js +1 -0
  20. package/public/assets/js/chunks/az-AZ-MXSORGZV-AIGO4TNU.js +1 -0
  21. package/public/assets/js/chunks/bg-BG-O6MV2KSF-X6AVO2AF.js +5 -0
  22. package/public/assets/js/chunks/blockDiagram-WCTKOSBZ-KM56WWDE.js +132 -0
  23. package/public/assets/js/chunks/bn-BD-T2VJNT7N-7OMHRIGC.js +3 -0
  24. package/public/assets/js/chunks/bn-IN-MMW2ORAC-EPKMNKG7.js +3 -0
  25. package/public/assets/js/chunks/brainfuck-A3CTQVFD.js +1 -0
  26. package/public/assets/js/chunks/c4Diagram-IC4MRINW-KX6UEGQZ.js +10 -0
  27. package/public/assets/js/chunks/ca-ES-MKBCGNOG-U44SUUTN.js +8 -0
  28. package/public/assets/js/chunks/chunk-2NTQWLZD.js +25 -0
  29. package/public/assets/js/chunks/chunk-2YRP2AWD.js +1 -0
  30. package/public/assets/js/chunks/chunk-3BUCGSSJ.js +1 -0
  31. package/public/assets/js/chunks/chunk-47L7JGE3.js +1 -0
  32. package/public/assets/js/chunks/chunk-4BCHPULB.js +1 -0
  33. package/public/assets/js/chunks/chunk-4NKM6YFO.js +161 -0
  34. package/public/assets/js/chunks/chunk-4WGMPBK5.js +1 -0
  35. package/public/assets/js/chunks/chunk-55WF6Y2Q.js +1 -0
  36. package/public/assets/js/chunks/chunk-775E65SU.js +1 -0
  37. package/public/assets/js/chunks/chunk-AJRGTECU.js +70 -0
  38. package/public/assets/js/chunks/chunk-B2J3PHGY.js +1 -0
  39. package/public/assets/js/chunks/chunk-B4JKB3BC.js +1 -0
  40. package/public/assets/js/chunks/chunk-BBHPYU2R.js +1 -0
  41. package/public/assets/js/chunks/chunk-CGVY4PKT.js +13 -0
  42. package/public/assets/js/chunks/chunk-CVTRX3TE.js +220 -0
  43. package/public/assets/js/chunks/chunk-DW6KK6VF.js +1 -0
  44. package/public/assets/js/chunks/chunk-E2HMNOQL.js +189 -0
  45. package/public/assets/js/chunks/chunk-EPTJZP5H.js +7 -0
  46. package/public/assets/js/chunks/chunk-G7NUGGE7.js +13 -0
  47. package/public/assets/js/chunks/chunk-GI7LBIBP.js +1 -0
  48. package/public/assets/js/chunks/chunk-GXRL27M7.js +1 -0
  49. package/public/assets/js/chunks/chunk-H6EYDHRW.js +1 -0
  50. package/public/assets/js/chunks/chunk-HOCBCDA5.js +1 -0
  51. package/public/assets/js/chunks/chunk-HS2CUOC6.js +1 -0
  52. package/public/assets/js/chunks/chunk-HUAS4BYI.js +12 -0
  53. package/public/assets/js/chunks/chunk-HVNNEPP5.js +2 -0
  54. package/public/assets/js/chunks/chunk-I2GVZI7W.js +38 -0
  55. package/public/assets/js/chunks/chunk-I6PVWGBN.js +14 -0
  56. package/public/assets/js/chunks/chunk-IR2DOYV4.js +7 -0
  57. package/public/assets/js/chunks/chunk-IZ3V3F2A.js +1 -0
  58. package/public/assets/js/chunks/chunk-KPAQHIOI.js +1 -0
  59. package/public/assets/js/chunks/chunk-M3EW4V74.js +1 -0
  60. package/public/assets/js/chunks/chunk-MK3AFU3C.js +90 -0
  61. package/public/assets/js/chunks/chunk-NM6J3ND7.js +1 -0
  62. package/public/assets/js/chunks/chunk-NO7UPWTU.js +1 -0
  63. package/public/assets/js/chunks/chunk-OG2TNZEU.js +9 -0
  64. package/public/assets/js/chunks/chunk-OHGDMMWM.js +1 -0
  65. package/public/assets/js/chunks/chunk-OOT2HALX.js +1 -0
  66. package/public/assets/js/chunks/chunk-OQLLZFFN.js +1 -0
  67. package/public/assets/js/chunks/chunk-PF6TP4EI.js +1 -0
  68. package/public/assets/js/chunks/chunk-PMOZMECZ.js +85 -0
  69. package/public/assets/js/chunks/chunk-QBGS6DJR.js +1 -0
  70. package/public/assets/js/chunks/chunk-QF3ZQ6UQ.js +1 -0
  71. package/public/assets/js/chunks/chunk-QFXMAUW4.js +1 -0
  72. package/public/assets/js/chunks/chunk-QSTBGTWJ.js +1 -0
  73. package/public/assets/js/chunks/chunk-QYKIT2IH.js +41 -0
  74. package/public/assets/js/chunks/chunk-S75BI2UQ.js +1 -0
  75. package/public/assets/js/chunks/chunk-SKEZZ3H6.js +1 -0
  76. package/public/assets/js/chunks/chunk-SO6QBCB6.js +1 -0
  77. package/public/assets/js/chunks/chunk-SR3U53EQ.js +1 -0
  78. package/public/assets/js/chunks/chunk-TFP6LRYJ.js +53 -0
  79. package/public/assets/js/chunks/chunk-U6APNHAF.js +15 -0
  80. package/public/assets/js/chunks/chunk-VOODXHXA.js +1 -0
  81. package/public/assets/js/chunks/chunk-W7WJUTSA.js +3 -0
  82. package/public/assets/js/chunks/chunk-WNXFO2F2.js +1 -0
  83. package/public/assets/js/chunks/chunk-X6EEYWV4.js +6 -0
  84. package/public/assets/js/chunks/chunk-YVW3ZETS.js +1 -0
  85. package/public/assets/js/chunks/chunk-ZR2QRTBG.js +339 -0
  86. package/public/assets/js/chunks/chunk-ZZJX4LQ2.js +1 -0
  87. package/public/assets/js/chunks/classDiagram-VBA2DB6C-IYW4O2RM.js +1 -0
  88. package/public/assets/js/chunks/classDiagram-v2-RAHNMMFH-DNKVN2WD.js +1 -0
  89. package/public/assets/js/chunks/clike-RTBH33GE.js +1 -0
  90. package/public/assets/js/chunks/clojure-BR2VJ2JI.js +1 -0
  91. package/public/assets/js/chunks/cmake-2HEWVFEE.js +1 -0
  92. package/public/assets/js/chunks/cobol-V6EIK6DN.js +1 -0
  93. package/public/assets/js/chunks/coffeescript-JW3ZOGMD.js +1 -0
  94. package/public/assets/js/chunks/commonlisp-UCWSIHYK.js +1 -0
  95. package/public/assets/js/chunks/cose-bilkent-S5V4N54A-QVYRFFNC.js +1 -0
  96. package/public/assets/js/chunks/crystal-GR4VLC3M.js +1 -0
  97. package/public/assets/js/chunks/cs-CZ-V77HGUP7-OLBAKFG5.js +7 -0
  98. package/public/assets/js/chunks/css-C5DVWGB4.js +1 -0
  99. package/public/assets/js/chunks/cypher-K7FZM5GC.js +1 -0
  100. package/public/assets/js/chunks/d-CF3QNNH5.js +1 -0
  101. package/public/assets/js/chunks/da-DK-I5RFNTM4-QJIG2SEZ.js +2 -0
  102. package/public/assets/js/chunks/dagre-KLK3FWXG-KVNBUDOY.js +4 -0
  103. package/public/assets/js/chunks/de-CH-WLRDEVBV-4MMJDMVD.js +7 -0
  104. package/public/assets/js/chunks/de-DE-DTI4WUSC-ML7C46TT.js +7 -0
  105. package/public/assets/js/chunks/diagram-E7M64L7V-ZP33VRUC.js +24 -0
  106. package/public/assets/js/chunks/diagram-IFDJBPK2-ZG35YWOD.js +43 -0
  107. package/public/assets/js/chunks/diagram-P4PSJMXO-ZGIGM7D2.js +24 -0
  108. package/public/assets/js/chunks/diff-KOMSZU7O.js +1 -0
  109. package/public/assets/js/chunks/dist-7RQKSOUX.js +7 -0
  110. package/public/assets/js/chunks/dist-ARWGZ6MN.js +1 -0
  111. package/public/assets/js/chunks/dist-DPBSGC3Y.js +2 -0
  112. package/public/assets/js/chunks/dist-E36PJE5M.js +1 -0
  113. package/public/assets/js/chunks/dist-E5NM7OBW.js +1 -0
  114. package/public/assets/js/chunks/dist-ERADYPEK.js +1 -0
  115. package/public/assets/js/chunks/dist-F43RIHBZ.js +1 -0
  116. package/public/assets/js/chunks/dist-HAB5NIXI.js +1 -0
  117. package/public/assets/js/chunks/dist-HG23OLRA.js +1 -0
  118. package/public/assets/js/chunks/dist-IEJXBSDJ.js +1 -0
  119. package/public/assets/js/chunks/dist-IQA4KVJK.js +1 -0
  120. package/public/assets/js/chunks/dist-OIQTNVT2.js +3 -0
  121. package/public/assets/js/chunks/dist-PMZJ734S.js +1 -0
  122. package/public/assets/js/chunks/dist-RCQFQRLD.js +1 -0
  123. package/public/assets/js/chunks/dist-RQLC4GVI.js +1 -0
  124. package/public/assets/js/chunks/dist-RSJGLSKC.js +1 -0
  125. package/public/assets/js/chunks/dist-SGNQZVVX.js +1 -0
  126. package/public/assets/js/chunks/dist-VCFTF7Z6.js +1 -0
  127. package/public/assets/js/chunks/dist-VTO23SHH.js +1 -0
  128. package/public/assets/js/chunks/dist-XOODBV4L.js +1 -0
  129. package/public/assets/js/chunks/dist-ZFZNCRZY.js +1 -0
  130. package/public/assets/js/chunks/dockerfile-XCIKYOSI.js +1 -0
  131. package/public/assets/js/chunks/dtd-3XFH7W6Z.js +1 -0
  132. package/public/assets/js/chunks/dylan-3UWPKVOR.js +1 -0
  133. package/public/assets/js/chunks/ebnf-OLHTL3VN.js +1 -0
  134. package/public/assets/js/chunks/ecl-43LZ3ZRM.js +1 -0
  135. package/public/assets/js/chunks/editor-session-IHFTYG5D.js +22 -0
  136. package/public/assets/js/chunks/eiffel-ISPO2UJF.js +1 -0
  137. package/public/assets/js/chunks/el-GR-ZXDJ2OS4-WSCEIO6J.js +7 -0
  138. package/public/assets/js/chunks/elm-CLK576PK.js +1 -0
  139. package/public/assets/js/chunks/en-CTDJDZ6K-IC3QAUOI.js +1 -0
  140. package/public/assets/js/chunks/erDiagram-INFDFZHY-ZMS6H2TH.js +70 -0
  141. package/public/assets/js/chunks/erlang-AVQXQFOT.js +1 -0
  142. package/public/assets/js/chunks/es-ES-DYQHAD43-XGB5X5IM.js +7 -0
  143. package/public/assets/js/chunks/eu-ES-QDSYU5Y3-LA3JTIJ2.js +7 -0
  144. package/public/assets/js/chunks/excalidraw-mermaid-stub-NYXTOJ4H.js +1 -0
  145. package/public/assets/js/chunks/fa-IR-26LZG4PM-PFALMEDX.js +9 -0
  146. package/public/assets/js/chunks/factor-CRTVBD6Q.js +1 -0
  147. package/public/assets/js/chunks/fcl-FX24LKTH.js +1 -0
  148. package/public/assets/js/chunks/fi-FI-6YS4KDE4-ES5MV6P4.js +6 -0
  149. package/public/assets/js/chunks/flowDiagram-PKNHOUZH-QD4L5IE5.js +162 -0
  150. package/public/assets/js/chunks/forth-YKDKCTVS.js +1 -0
  151. package/public/assets/js/chunks/fortran-UJWC6SLU.js +1 -0
  152. package/public/assets/js/chunks/fr-FR-BRLLPTZC-VMFE22YV.js +12 -0
  153. package/public/assets/js/chunks/ganttDiagram-A5KZAMGK-VTMTQESP.js +292 -0
  154. package/public/assets/js/chunks/gas-MYEMWGRE.js +1 -0
  155. package/public/assets/js/chunks/gherkin-JWHAU2YG.js +1 -0
  156. package/public/assets/js/chunks/gitGraph-HDMCJU4V-YPHS74XX.js +1 -0
  157. package/public/assets/js/chunks/gitGraphDiagram-K3NZZRJ6-Z3EZ634T.js +65 -0
  158. package/public/assets/js/chunks/gl-ES-OKUZTLYG-GPT42ZHV.js +6 -0
  159. package/public/assets/js/chunks/groovy-QZIZQIAK.js +1 -0
  160. package/public/assets/js/chunks/haskell-JR3G7YNW.js +1 -0
  161. package/public/assets/js/chunks/haxe-TVLAIYEN.js +1 -0
  162. package/public/assets/js/chunks/he-IL-26MGYIU7-VQ5XQYYY.js +8 -0
  163. package/public/assets/js/chunks/hi-IN-Q4ZOGTP2-2Z766MXA.js +3 -0
  164. package/public/assets/js/chunks/http-YXQRE77G.js +1 -0
  165. package/public/assets/js/chunks/hu-HU-P2OXPSN5-6XDVPGTE.js +3 -0
  166. package/public/assets/js/chunks/id-ID-2EIKXYN6-J5GWSY2S.js +8 -0
  167. package/public/assets/js/chunks/idl-RAQGJ6LJ.js +1 -0
  168. package/public/assets/js/chunks/image-32MOCVDX-JN2EUMQG.js +1 -0
  169. package/public/assets/js/chunks/image-blob-reduce.esm-K5OWL55S.js +13 -0
  170. package/public/assets/js/chunks/info-3K5VOQVL-CXJSPNNP.js +1 -0
  171. package/public/assets/js/chunks/infoDiagram-LFFYTUFH-WQ34MUJA.js +2 -0
  172. package/public/assets/js/chunks/ishikawaDiagram-PHBUUO56-4IARWKJK.js +70 -0
  173. package/public/assets/js/chunks/it-IT-4CFKVXI2-NMBWUWFF.js +12 -0
  174. package/public/assets/js/chunks/ja-JP-MAND2Z4V-GQZYXXOC.js +7 -0
  175. package/public/assets/js/chunks/javascript-NM7KDJUE.js +1 -0
  176. package/public/assets/js/chunks/journeyDiagram-4ABVD52K-FJ4LF4SX.js +139 -0
  177. package/public/assets/js/chunks/julia-LG3BH25B.js +1 -0
  178. package/public/assets/js/chunks/kaa-HQRTCXTJ-7D6PAKDJ.js +1 -0
  179. package/public/assets/js/chunks/kab-KAB-JKIKKTGH-TNKFXNAX.js +4 -0
  180. package/public/assets/js/chunks/kanban-definition-K7BYSVSG-TY4EVYI3.js +89 -0
  181. package/public/assets/js/chunks/katex-5YJCUCFD.js +261 -0
  182. package/public/assets/js/chunks/kk-KZ-HXQ63ZFC-T4HCMWED.js +1 -0
  183. package/public/assets/js/chunks/km-KH-PKL3LSGX-HTLHEJV6.js +7 -0
  184. package/public/assets/js/chunks/ko-KR-KXLREZX3-QMR52QVI.js +5 -0
  185. package/public/assets/js/chunks/ku-TR-MJ4IER3X-K5CNY4UO.js +6 -0
  186. package/public/assets/js/chunks/livescript-4CVWVI4M.js +1 -0
  187. package/public/assets/js/chunks/lt-LT-H6WFQ6FJ-IW25FAGX.js +3 -0
  188. package/public/assets/js/chunks/lua-VWGE7DQ7.js +1 -0
  189. package/public/assets/js/chunks/lv-LV-GOCK6SJW-KTDFW5OH.js +4 -0
  190. package/public/assets/js/chunks/mathematica-D7APQSEU.js +1 -0
  191. package/public/assets/js/chunks/mbox-BN3XQBYX.js +1 -0
  192. package/public/assets/js/chunks/mermaid-runtime-BIFNJ2CT.js +18 -0
  193. package/public/assets/js/chunks/mindmap-definition-YRQLILUH-5B565RNP.js +68 -0
  194. package/public/assets/js/chunks/mirc-565WBI76.js +1 -0
  195. package/public/assets/js/chunks/mllike-VV3KS46B.js +1 -0
  196. package/public/assets/js/chunks/modelica-EGX44FZV.js +1 -0
  197. package/public/assets/js/chunks/mr-IN-IXVLDMEQ-PHM5DT7Q.js +9 -0
  198. package/public/assets/js/chunks/mscgen-GFGTHENT.js +1 -0
  199. package/public/assets/js/chunks/mumps-POZYWSMI.js +1 -0
  200. package/public/assets/js/chunks/my-MM-YG6MYTTD-ZHLCMEVA.js +1 -0
  201. package/public/assets/js/chunks/nb-NO-XGWJISD2-KSDFG6YU.js +8 -0
  202. package/public/assets/js/chunks/nginx-JUBX55EU.js +1 -0
  203. package/public/assets/js/chunks/nl-NL-XVDVCPNC-KVF3ZO2R.js +13 -0
  204. package/public/assets/js/chunks/nn-NO-EMX5MJX5-34QKSHNR.js +4 -0
  205. package/public/assets/js/chunks/nsis-RC4CREGM.js +1 -0
  206. package/public/assets/js/chunks/ntriples-4WK6CNVE.js +1 -0
  207. package/public/assets/js/chunks/oc-FR-ROEINTVO-5GP4AOYO.js +4 -0
  208. package/public/assets/js/chunks/octave-GOKFN2V7.js +1 -0
  209. package/public/assets/js/chunks/oz-OQUMNC63.js +1 -0
  210. package/public/assets/js/chunks/pa-IN-ZYN6SUDY-MVL7O44W.js +4 -0
  211. package/public/assets/js/chunks/packet-RMMSAZCW-D7XTR5TT.js +1 -0
  212. package/public/assets/js/chunks/pascal-BBWQWWWD.js +1 -0
  213. package/public/assets/js/chunks/percentages-5DKR754L-DG7W23CV.js +1 -0
  214. package/public/assets/js/chunks/perl-KTPJTTAM.js +1 -0
  215. package/public/assets/js/chunks/pica-6G3NROWT.js +17 -0
  216. package/public/assets/js/chunks/pie-UPGHQEXC-KGC3O6LN.js +1 -0
  217. package/public/assets/js/chunks/pieDiagram-SKSYHLDU-KWKRDEZS.js +30 -0
  218. package/public/assets/js/chunks/pig-IJMBS4FZ.js +1 -0
  219. package/public/assets/js/chunks/pl-PL-6VTG7PHC-VADRWSX4.js +12 -0
  220. package/public/assets/js/chunks/powershell-6YGCBHDP.js +1 -0
  221. package/public/assets/js/chunks/preview-render-compiler-WD3A76I6.js +25 -0
  222. package/public/assets/js/chunks/properties-5QTD3364.js +1 -0
  223. package/public/assets/js/chunks/protobuf-LTRWBIK3.js +1 -0
  224. package/public/assets/js/chunks/pt-BR-5YFKRR5G-HHF4UPO4.js +6 -0
  225. package/public/assets/js/chunks/pt-PT-GEIXXZ67-TUTAUZJK.js +8 -0
  226. package/public/assets/js/chunks/pug-U4PV3WLG.js +1 -0
  227. package/public/assets/js/chunks/puppet-WGYJPR3Y.js +1 -0
  228. package/public/assets/js/chunks/python-6YGH4S47.js +1 -0
  229. package/public/assets/js/chunks/q-VIG4IJLI.js +1 -0
  230. package/public/assets/js/chunks/quadrantDiagram-337W2JSQ-GWQRUFHQ.js +7 -0
  231. package/public/assets/js/chunks/quick-switcher-controller-JYDIJVAJ.js +5 -0
  232. package/public/assets/js/chunks/r-NVPCXGTR.js +1 -0
  233. package/public/assets/js/chunks/radar-KQ55EAFF-OPO64DRI.js +1 -0
  234. package/public/assets/js/chunks/requirementDiagram-Z7DCOOCP-ASW7IPJL.js +73 -0
  235. package/public/assets/js/chunks/ro-RO-E2P6TFZI-RJFCULYF.js +12 -0
  236. package/public/assets/js/chunks/roundRect-Z3DX3W5S.js +1 -0
  237. package/public/assets/js/chunks/rpm-UEA257HD.js +1 -0
  238. package/public/assets/js/chunks/ru-RU-YBIIY43T-BF27TNVK.js +10 -0
  239. package/public/assets/js/chunks/ruby-KPQRAJGE.js +1 -0
  240. package/public/assets/js/chunks/sankeyDiagram-WA2Y5GQK-W6BBWCLW.js +10 -0
  241. package/public/assets/js/chunks/sas-L7VATVH5.js +1 -0
  242. package/public/assets/js/chunks/scheme-T2NOWR3P.js +1 -0
  243. package/public/assets/js/chunks/sequenceDiagram-2WXFIKYE-H4G3ISLN.js +145 -0
  244. package/public/assets/js/chunks/shell-DLVDUNFA.js +1 -0
  245. package/public/assets/js/chunks/si-LK-673C2CI2-IOFGU4U2.js +1 -0
  246. package/public/assets/js/chunks/sieve-BKBZYDBU.js +1 -0
  247. package/public/assets/js/chunks/sk-SK-CKZHQ4AP-6O5JGN26.js +7 -0
  248. package/public/assets/js/chunks/sl-SI-557H2GWM-2NEHLV7W.js +6 -0
  249. package/public/assets/js/chunks/smalltalk-WRJQKJSD.js +1 -0
  250. package/public/assets/js/chunks/solr-66B3BIDL.js +1 -0
  251. package/public/assets/js/chunks/sparql-S25Z47JG.js +1 -0
  252. package/public/assets/js/chunks/spreadsheet-B272EF7Y.js +1 -0
  253. package/public/assets/js/chunks/sql-BPLIIUYC.js +1 -0
  254. package/public/assets/js/chunks/stateDiagram-RAJIS63D-OF5XXRUS.js +1 -0
  255. package/public/assets/js/chunks/stateDiagram-v2-FVOUBMTO-IV2CSQSQ.js +1 -0
  256. package/public/assets/js/chunks/stex-4IJY64QX.js +1 -0
  257. package/public/assets/js/chunks/stylus-PJUHLGPT.js +1 -0
  258. package/public/assets/js/chunks/subset-shared.chunk-4NMWHS4D.js +1 -0
  259. package/public/assets/js/chunks/subset-worker.chunk-NTLP7Y66.js +1 -0
  260. package/public/assets/js/chunks/sv-SE-XOPKKDWS-Q2L6KGFV.js +8 -0
  261. package/public/assets/js/chunks/swift-UYHTO4SX.js +1 -0
  262. package/public/assets/js/chunks/ta-IN-XBH7DQI3-ISSUGZAK.js +6 -0
  263. package/public/assets/js/chunks/tcl-OQ5J3VO2.js +1 -0
  264. package/public/assets/js/chunks/textile-NOGVBEYF.js +1 -0
  265. package/public/assets/js/chunks/th-TH-TOCWH3R4-TABEAMJA.js +1 -0
  266. package/public/assets/js/chunks/tiddlywiki-SYTK4QUE.js +1 -0
  267. package/public/assets/js/chunks/tiki-P7K4ZLOM.js +1 -0
  268. package/public/assets/js/chunks/timeline-definition-YZTLITO2-HBCANIUC.js +61 -0
  269. package/public/assets/js/chunks/toml-AUZYRP36.js +1 -0
  270. package/public/assets/js/chunks/tr-TR-GXW6CYY5-5NQRN52Y.js +4 -0
  271. package/public/assets/js/chunks/treemap-KZPCXAKY-WYMCT5F7.js +1 -0
  272. package/public/assets/js/chunks/troff-XFYJNQOJ.js +1 -0
  273. package/public/assets/js/chunks/ttcn-AK2IXWU6.js +1 -0
  274. package/public/assets/js/chunks/ttcn-cfg-3IDPIYPU.js +1 -0
  275. package/public/assets/js/chunks/turtle-OIDMF46P.js +1 -0
  276. package/public/assets/js/chunks/uk-UA-IJKTNUDG-2IIL3TO5.js +6 -0
  277. package/public/assets/js/chunks/uz-UZ-TBZZEA4V-X22KVKBP.js +1 -0
  278. package/public/assets/js/chunks/vb-J6K4XVA2.js +1 -0
  279. package/public/assets/js/chunks/vbscript-FM7DDZZE.js +1 -0
  280. package/public/assets/js/chunks/velocity-6KZFEOFD.js +1 -0
  281. package/public/assets/js/chunks/vennDiagram-LZ73GAT5-EBRF3MZR.js +34 -0
  282. package/public/assets/js/chunks/verilog-EWWQPMNN.js +1 -0
  283. package/public/assets/js/chunks/vhdl-CJ3M4IHI.js +1 -0
  284. package/public/assets/js/chunks/vi-VN-MULSGNVB-TENM65C7.js +7 -0
  285. package/public/assets/js/chunks/webidl-XVBHXCRV.js +1 -0
  286. package/public/assets/js/chunks/xquery-7WZOZ4UK.js +1 -0
  287. package/public/assets/js/chunks/xychartDiagram-JWTSCODW-WIFVRQPR.js +7 -0
  288. package/public/assets/js/chunks/yacas-MZ2ZZPF3.js +1 -0
  289. package/public/assets/js/chunks/z80-I447CBF7.js +1 -0
  290. package/public/assets/js/chunks/zh-CN-MVX3E32U-S5VA2BA5.js +11 -0
  291. package/public/assets/js/chunks/zh-HK-JNU5RLIE-A4VUKZFV.js +1 -0
  292. package/public/assets/js/chunks/zh-TW-LENVCA6T-KFB6KHMM.js +9 -0
  293. package/public/assets/js/excalidraw-editor-7ORML5YA.css +1 -0
  294. package/public/assets/js/excalidraw-editor-LKW2AZBU.js +347 -0
  295. package/public/assets/js/excalidraw-editor.css +1 -0
  296. package/public/assets/js/excalidraw-editor.js +1 -0
  297. package/public/assets/js/main.js +354 -0
  298. package/public/assets/js/preview-render-worker.js +30 -0
  299. package/public/assets/vendor/highlight/github-dark.min.css +10 -0
  300. package/public/assets/vendor/highlight/github.min.css +10 -0
  301. package/public/excalidraw-editor.html +31 -0
  302. package/public/index.html +549 -0
  303. package/scripts/cloudflare-tunnel.mjs +145 -0
  304. package/scripts/local-plantuml-compose.mjs +92 -0
  305. package/server.js +1 -0
  306. package/src/client/application/app-shell/chat-feature.js +363 -0
  307. package/src/client/application/app-shell/comments-feature.js +33 -0
  308. package/src/client/application/app-shell/git-feature.js +394 -0
  309. package/src/client/application/app-shell/presence-feature.js +229 -0
  310. package/src/client/application/app-shell/ui-feature.js +535 -0
  311. package/src/client/application/app-shell/workspace-feature.js +132 -0
  312. package/src/client/application/app-shell-elements.js +78 -0
  313. package/src/client/application/diagram-preview-hydrator.js +382 -0
  314. package/src/client/application/file-open-lifecycle.js +26 -0
  315. package/src/client/application/mermaid-preview-hydrator.js +570 -0
  316. package/src/client/application/plantuml-preview-hydrator.js +563 -0
  317. package/src/client/application/preview-diagram-utils.js +223 -0
  318. package/src/client/application/preview-render-compiler.js +426 -0
  319. package/src/client/application/preview-render-executor.js +153 -0
  320. package/src/client/application/preview-render-profile.js +63 -0
  321. package/src/client/application/preview-render-scheduler.js +73 -0
  322. package/src/client/application/preview-render-worker.js +19 -0
  323. package/src/client/application/preview-renderer.js +452 -0
  324. package/src/client/application/wiki-link-file-controller.js +58 -0
  325. package/src/client/application/workspace-chrome-controller.js +84 -0
  326. package/src/client/application/workspace-coordinator.js +238 -0
  327. package/src/client/application/workspace-preview-controller.js +237 -0
  328. package/src/client/application/workspace-route-controller.js +170 -0
  329. package/src/client/application/workspace-state-store.js +46 -0
  330. package/src/client/bootstrap/collabmd-app-shell.js +479 -0
  331. package/src/client/domain/diagram-action-icons.js +41 -0
  332. package/src/client/domain/excalidraw-collaboration.js +153 -0
  333. package/src/client/domain/excalidraw-scene.js +87 -0
  334. package/src/client/domain/markdown-formatting.js +370 -0
  335. package/src/client/domain/plantuml-language.js +226 -0
  336. package/src/client/domain/room.js +49 -0
  337. package/src/client/domain/runtime-paths.js +136 -0
  338. package/src/client/domain/vault-api-client.js +1 -0
  339. package/src/client/domain/vault-paths.js +80 -0
  340. package/src/client/domain/vault-utils.js +49 -0
  341. package/src/client/domain/wiki-link-completions.js +78 -0
  342. package/src/client/excalidraw-editor.js +630 -0
  343. package/src/client/excalidraw-mermaid-stub.js +7 -0
  344. package/src/client/infrastructure/auth-client.js +383 -0
  345. package/src/client/infrastructure/browser-navigation-port.js +19 -0
  346. package/src/client/infrastructure/browser-notification-port.js +40 -0
  347. package/src/client/infrastructure/browser-preferences-port.js +79 -0
  348. package/src/client/infrastructure/comment-thread-store.js +293 -0
  349. package/src/client/infrastructure/editor-collaboration-client.js +240 -0
  350. package/src/client/infrastructure/editor-session.js +255 -0
  351. package/src/client/infrastructure/editor-view-adapter.js +578 -0
  352. package/src/client/infrastructure/excalidraw-room-client.js +651 -0
  353. package/src/client/infrastructure/lobby-presence.js +304 -0
  354. package/src/client/infrastructure/runtime-config.js +65 -0
  355. package/src/client/infrastructure/tab-activity-lock.js +193 -0
  356. package/src/client/infrastructure/vault-api-client.js +61 -0
  357. package/src/client/infrastructure/yjs-provider-reset-guard.js +19 -0
  358. package/src/client/main.js +16 -0
  359. package/src/client/mermaid-runtime.js +3 -0
  360. package/src/client/presentation/backlinks-panel.js +188 -0
  361. package/src/client/presentation/comment-ui-controller.js +1235 -0
  362. package/src/client/presentation/comments-panel.js +531 -0
  363. package/src/client/presentation/excalidraw-embed-controller.js +968 -0
  364. package/src/client/presentation/excalidraw-embed-reconciler.js +37 -0
  365. package/src/client/presentation/file-action-controller.js +596 -0
  366. package/src/client/presentation/file-explorer-controller.js +81 -0
  367. package/src/client/presentation/file-explorer-view.js +256 -0
  368. package/src/client/presentation/file-tree-state.js +77 -0
  369. package/src/client/presentation/git-diff-view-controller.js +656 -0
  370. package/src/client/presentation/git-panel-controller.js +516 -0
  371. package/src/client/presentation/layout-controller.js +222 -0
  372. package/src/client/presentation/outline-controller.js +239 -0
  373. package/src/client/presentation/quick-switcher-controller.js +300 -0
  374. package/src/client/presentation/scroll-sync-controller.js +500 -0
  375. package/src/client/presentation/theme-controller.js +64 -0
  376. package/src/client/presentation/toast-controller.js +21 -0
  377. package/src/client/presentation/video-embed-controller.js +264 -0
  378. package/src/client/styles/base.css +58 -0
  379. package/src/client/styles/style.css +4245 -0
  380. package/src/domain/comment-threads.js +233 -0
  381. package/src/domain/excalidraw-room-codec.js +427 -0
  382. package/src/domain/file-kind.js +104 -0
  383. package/src/domain/wiki-link-resolver.js +75 -0
  384. package/src/server/auth/create-auth-service.js +272 -0
  385. package/src/server/auth/session-cookie.js +125 -0
  386. package/src/server/config/env.js +186 -0
  387. package/src/server/create-app-server.js +143 -0
  388. package/src/server/domain/backlink-index.js +291 -0
  389. package/src/server/domain/collaboration/collaboration-document-store.js +155 -0
  390. package/src/server/domain/collaboration/collaboration-room.js +603 -0
  391. package/src/server/domain/collaboration/protocol.js +2 -0
  392. package/src/server/domain/collaboration/room-client-state-store.js +28 -0
  393. package/src/server/domain/collaboration/room-persistence-controller.js +80 -0
  394. package/src/server/domain/collaboration/room-registry.js +94 -0
  395. package/src/server/domain/git-service.js +1 -0
  396. package/src/server/domain/plantuml-encoder.js +49 -0
  397. package/src/server/domain/plantuml-renderer.js +1 -0
  398. package/src/server/index.js +72 -0
  399. package/src/server/infrastructure/git/command-runner.js +48 -0
  400. package/src/server/infrastructure/git/concurrency.js +19 -0
  401. package/src/server/infrastructure/git/diff-service.js +389 -0
  402. package/src/server/infrastructure/git/errors.js +5 -0
  403. package/src/server/infrastructure/git/git-service.js +216 -0
  404. package/src/server/infrastructure/git/parsers.js +401 -0
  405. package/src/server/infrastructure/git/path-utils.js +65 -0
  406. package/src/server/infrastructure/git/responses.js +108 -0
  407. package/src/server/infrastructure/git/status-service.js +99 -0
  408. package/src/server/infrastructure/git/untracked-files.js +101 -0
  409. package/src/server/infrastructure/http/create-auth-api-handler.js +48 -0
  410. package/src/server/infrastructure/http/create-esm-proxy-handler.js +130 -0
  411. package/src/server/infrastructure/http/create-git-api-command-handler.js +170 -0
  412. package/src/server/infrastructure/http/create-git-api-handler.js +40 -0
  413. package/src/server/infrastructure/http/create-git-api-query-handler.js +62 -0
  414. package/src/server/infrastructure/http/create-plantuml-api-handler.js +43 -0
  415. package/src/server/infrastructure/http/create-request-handler.js +138 -0
  416. package/src/server/infrastructure/http/create-static-handler.js +167 -0
  417. package/src/server/infrastructure/http/create-vault-api-command-handler.js +161 -0
  418. package/src/server/infrastructure/http/create-vault-api-handler.js +43 -0
  419. package/src/server/infrastructure/http/create-vault-api-query-handler.js +82 -0
  420. package/src/server/infrastructure/http/http-errors.js +13 -0
  421. package/src/server/infrastructure/http/http-response.js +167 -0
  422. package/src/server/infrastructure/http/request-body.js +56 -0
  423. package/src/server/infrastructure/persistence/path-utils.js +90 -0
  424. package/src/server/infrastructure/persistence/sidecar-store.js +150 -0
  425. package/src/server/infrastructure/persistence/vault-content-adapter.js +49 -0
  426. package/src/server/infrastructure/persistence/vault-file-store.js +435 -0
  427. package/src/server/infrastructure/plantuml/plantuml-renderer.js +56 -0
  428. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +194 -0
  429. package/src/server/infrastructure/websocket/client-socket-session.js +151 -0
  430. package/src/server/startup/git-remote-bootstrap.js +435 -0
@@ -0,0 +1,4245 @@
1
+ /* CollabMD Design Tokens & Styles */
2
+
3
+ /* ===== TYPE SCALE ===== */
4
+ :root {
5
+ --text-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem);
6
+ --text-sm: clamp(0.875rem, 0.8rem + 0.35vw, 1rem);
7
+ --text-base: clamp(1rem, 0.9rem + 0.5vw, 1.125rem);
8
+ --text-lg: clamp(1.125rem, 0.95rem + 0.85vw, 1.5rem);
9
+ --text-xl: clamp(1.5rem, 1rem + 1.5vw, 2.25rem);
10
+ --text-2xl: clamp(2rem, 1.2rem + 2.5vw, 3.5rem);
11
+
12
+ /* Fonts */
13
+ --font-body: 'Inter', system-ui, sans-serif;
14
+ --font-display: 'Geist', 'Cal Sans', 'Inter', system-ui, sans-serif;
15
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
16
+
17
+ /* ===== SPACING (4px base) ===== */
18
+ --space-1: 0.25rem;
19
+ --space-2: 0.5rem;
20
+ --space-3: 0.75rem;
21
+ --space-4: 1rem;
22
+ --space-5: 1.25rem;
23
+ --space-6: 1.5rem;
24
+ --space-8: 2rem;
25
+ --space-10: 2.5rem;
26
+ --space-12: 3rem;
27
+ --space-16: 4rem;
28
+ --space-20: 5rem;
29
+ --space-24: 6rem;
30
+ --space-32: 8rem;
31
+
32
+ /* Radius */
33
+ --radius-sm: 0.375rem;
34
+ --radius-md: 0.5rem;
35
+ --radius-lg: 0.75rem;
36
+ --radius-xl: 1rem;
37
+ --radius-full: 9999px;
38
+
39
+ /* Transitions */
40
+ --transition-interactive: 180ms cubic-bezier(0.16, 1, 0.3, 1);
41
+
42
+ /* Content widths */
43
+ --content-narrow: 640px;
44
+ --content-default: 960px;
45
+ --content-wide: 1200px;
46
+
47
+ /* Toolbar height */
48
+ --toolbar-h: 48px;
49
+ }
50
+
51
+ /* ===== COLOR PALETTE ===== */
52
+
53
+ /* LIGHT MODE */
54
+ :root, [data-theme="light"] {
55
+ --color-bg: #f5f5f7;
56
+ --color-surface: #ffffff;
57
+ --color-surface-2: #fafafe;
58
+ --color-surface-offset: #eeeef2;
59
+ --color-surface-offset-2: #e6e6eb;
60
+ --color-surface-dynamic: #dddde3;
61
+ --color-divider: #d1d1d8;
62
+ --color-border: #c4c4ce;
63
+
64
+ --color-text: #1a1a2e;
65
+ --color-text-muted: #6b6b80;
66
+ --color-text-faint: #a0a0b0;
67
+ --color-text-inverse: #f5f5f7;
68
+
69
+ --color-primary: #4f46e5;
70
+ --color-primary-hover: #4338ca;
71
+ --color-primary-active: #3730a3;
72
+ --color-primary-highlight: #e0e0ff;
73
+ --color-comment: #4f46e5;
74
+ --color-comment-soft: rgba(79, 70, 229, 0.08);
75
+ --color-comment-strong: rgba(79, 70, 229, 0.14);
76
+ --color-comment-text: #3730a3;
77
+
78
+ --color-error: #dc2626;
79
+ --color-error-highlight: #fce8e8;
80
+ --color-success: #16a34a;
81
+ --color-success-highlight: #dcfce7;
82
+ --color-warning: #d97706;
83
+ --color-warning-highlight: #fef3c7;
84
+ --diff-add-bg: rgba(22, 163, 74, 0.06);
85
+ --diff-add-line-bg: rgba(22, 163, 74, 0.14);
86
+ --diff-add-text: #16a34a;
87
+ --diff-del-bg: rgba(220, 38, 38, 0.06);
88
+ --diff-del-line-bg: rgba(220, 38, 38, 0.14);
89
+ --diff-del-text: #dc2626;
90
+ --diff-hunk-bg: rgba(79, 70, 229, 0.08);
91
+ --diff-hunk-text: #4f46e5;
92
+ --diff-gutter: #a0a0b0;
93
+
94
+ --shadow-sm: 0 1px 2px oklch(0.2 0.02 260 / 0.06);
95
+ --shadow-md: 0 4px 12px oklch(0.2 0.02 260 / 0.08);
96
+ --shadow-lg: 0 12px 32px oklch(0.2 0.02 260 / 0.12);
97
+ }
98
+
99
+ /* DARK MODE (default) */
100
+ [data-theme="dark"] {
101
+ --color-bg: #0f1117;
102
+ --color-surface: #161822;
103
+ --color-surface-2: #1c1e2c;
104
+ --color-surface-offset: #1a1c28;
105
+ --color-surface-offset-2: #22243a;
106
+ --color-surface-dynamic: #2a2c3e;
107
+ --color-divider: #2e3044;
108
+ --color-border: #383a50;
109
+
110
+ --color-text: #e2e2ea;
111
+ --color-text-muted: #8b8ba0;
112
+ --color-text-faint: #5a5a70;
113
+ --color-text-inverse: #0f1117;
114
+
115
+ --color-primary: #818cf8;
116
+ --color-primary-hover: #6366f1;
117
+ --color-primary-active: #4f46e5;
118
+ --color-primary-highlight: #1e1e3a;
119
+ --color-comment: #818cf8;
120
+ --color-comment-soft: rgba(129, 140, 248, 0.1);
121
+ --color-comment-strong: rgba(129, 140, 248, 0.16);
122
+ --color-comment-text: #c7d2fe;
123
+
124
+ --color-error: #f87171;
125
+ --color-error-highlight: #2a1a1a;
126
+ --color-success: #4ade80;
127
+ --color-success-highlight: #1a2a1a;
128
+ --color-warning: #fbbf24;
129
+ --color-warning-highlight: #2a261a;
130
+ --diff-add-bg: rgba(74, 222, 128, 0.08);
131
+ --diff-add-line-bg: rgba(74, 222, 128, 0.15);
132
+ --diff-add-text: #4ade80;
133
+ --diff-del-bg: rgba(248, 113, 113, 0.08);
134
+ --diff-del-line-bg: rgba(248, 113, 113, 0.15);
135
+ --diff-del-text: #f87171;
136
+ --diff-hunk-bg: rgba(129, 140, 248, 0.1);
137
+ --diff-hunk-text: #818cf8;
138
+ --diff-gutter: #5a5a70;
139
+
140
+ --shadow-sm: 0 1px 2px oklch(0 0 0 / 0.25);
141
+ --shadow-md: 0 4px 12px oklch(0 0 0 / 0.35);
142
+ --shadow-lg: 0 12px 32px oklch(0 0 0 / 0.5);
143
+ }
144
+
145
+ @media (prefers-color-scheme: dark) {
146
+ :root:not([data-theme]) {
147
+ --color-bg: #0f1117;
148
+ --color-surface: #161822;
149
+ --color-surface-2: #1c1e2c;
150
+ --color-surface-offset: #1a1c28;
151
+ --color-surface-offset-2: #22243a;
152
+ --color-surface-dynamic: #2a2c3e;
153
+ --color-divider: #2e3044;
154
+ --color-border: #383a50;
155
+ --color-text: #e2e2ea;
156
+ --color-text-muted: #8b8ba0;
157
+ --color-text-faint: #5a5a70;
158
+ --color-text-inverse: #0f1117;
159
+ --color-primary: #818cf8;
160
+ --color-primary-hover: #6366f1;
161
+ --color-primary-active: #4f46e5;
162
+ --color-primary-highlight: #1e1e3a;
163
+ --color-comment: #818cf8;
164
+ --color-comment-soft: rgba(129, 140, 248, 0.1);
165
+ --color-comment-strong: rgba(129, 140, 248, 0.16);
166
+ --color-comment-text: #c7d2fe;
167
+ --color-error: #f87171;
168
+ --color-error-highlight: #2a1a1a;
169
+ --color-success: #4ade80;
170
+ --color-success-highlight: #1a2a1a;
171
+ --color-warning: #fbbf24;
172
+ --color-warning-highlight: #2a261a;
173
+ --shadow-sm: 0 1px 2px oklch(0 0 0 / 0.25);
174
+ --shadow-md: 0 4px 12px oklch(0 0 0 / 0.35);
175
+ --shadow-lg: 0 12px 32px oklch(0 0 0 / 0.5);
176
+ }
177
+ }
178
+
179
+
180
+ /* ===== SHARED COMPONENTS ===== */
181
+
182
+ .hidden { display: none !important; }
183
+
184
+ html[data-initial-file-requested="true"] .empty-state {
185
+ display: none !important;
186
+ }
187
+
188
+ html[data-initial-file-requested="true"] .editor-page.hidden {
189
+ display: flex !important;
190
+ }
191
+
192
+ .btn {
193
+ display: inline-flex;
194
+ align-items: center;
195
+ justify-content: center;
196
+ gap: var(--space-2);
197
+ padding: var(--space-2) var(--space-4);
198
+ border-radius: var(--radius-md);
199
+ font-size: var(--text-sm);
200
+ font-weight: 500;
201
+ transition: all var(--transition-interactive);
202
+ cursor: pointer;
203
+ white-space: nowrap;
204
+ border: none;
205
+ text-decoration: none;
206
+ }
207
+ .btn:active { transform: scale(0.97); }
208
+
209
+ .btn-primary {
210
+ background: var(--color-primary);
211
+ color: var(--color-text-inverse);
212
+ }
213
+ .btn-primary:hover { background: var(--color-primary-hover); }
214
+
215
+ .btn-secondary {
216
+ background: var(--color-surface-2);
217
+ color: var(--color-text);
218
+ border: 1px solid var(--color-border);
219
+ }
220
+ .btn-secondary:hover { background: var(--color-surface-dynamic); }
221
+
222
+ .btn-danger {
223
+ background: var(--color-error);
224
+ color: var(--color-text-inverse);
225
+ }
226
+ .btn-danger:hover { filter: brightness(0.95); }
227
+
228
+ .btn-ghost {
229
+ background: transparent;
230
+ color: var(--color-text-muted);
231
+ padding: var(--space-2);
232
+ }
233
+ .btn-ghost:hover { color: var(--color-text); background: var(--color-surface-offset); }
234
+
235
+ .btn-lg {
236
+ padding: var(--space-3) var(--space-6);
237
+ font-weight: 600;
238
+ }
239
+
240
+ .input {
241
+ padding: var(--space-2) var(--space-3);
242
+ border: 1px solid var(--color-border);
243
+ border-radius: var(--radius-md);
244
+ background: var(--color-surface);
245
+ font-size: var(--text-sm);
246
+ color: var(--color-text);
247
+ transition: border-color var(--transition-interactive);
248
+ width: 100%;
249
+ }
250
+ .input:focus {
251
+ outline: none;
252
+ border-color: var(--color-primary);
253
+ box-shadow: 0 0 0 3px oklch(from var(--color-primary) l c h / 0.15);
254
+ }
255
+ .input::placeholder { color: var(--color-text-faint); }
256
+
257
+
258
+ /* ===== LOADING STATE ===== */
259
+
260
+ .editor-loading {
261
+ display: flex;
262
+ flex-direction: column;
263
+ padding: var(--space-6) var(--space-8);
264
+ height: 100%;
265
+ gap: var(--space-2);
266
+ }
267
+ .editor-loading.hidden { display: none; }
268
+
269
+ .skeleton-line {
270
+ height: 16px;
271
+ background: var(--color-surface-offset);
272
+ border-radius: 4px;
273
+ animation: pulse-skeleton 1.5s ease-in-out infinite;
274
+ }
275
+
276
+ @keyframes pulse-skeleton {
277
+ 0% { opacity: 0.6; }
278
+ 50% { opacity: 0.3; }
279
+ 100% { opacity: 0.6; }
280
+ }
281
+
282
+
283
+ /* ===== APP SHELL ===== */
284
+
285
+ .app-shell {
286
+ display: flex;
287
+ height: 100dvh;
288
+ overflow: hidden;
289
+ }
290
+
291
+ /* ===== SIDEBAR ===== */
292
+
293
+ .sidebar {
294
+ width: 260px;
295
+ min-width: 260px;
296
+ max-width: 260px;
297
+ background: var(--color-surface);
298
+ border-right: 1px solid var(--color-divider);
299
+ display: flex;
300
+ flex-direction: column;
301
+ overflow: hidden;
302
+ transition: width 180ms cubic-bezier(0.16, 1, 0.3, 1), min-width 180ms cubic-bezier(0.16, 1, 0.3, 1);
303
+ }
304
+
305
+ .sidebar.collapsed {
306
+ width: 0;
307
+ min-width: 0;
308
+ border-right: none;
309
+ overflow: hidden;
310
+ }
311
+
312
+ .sidebar-header {
313
+ display: flex;
314
+ align-items: center;
315
+ justify-content: space-between;
316
+ padding: var(--space-3) var(--space-3);
317
+ border-bottom: 1px solid var(--color-divider);
318
+ min-height: var(--toolbar-h);
319
+ gap: var(--space-2);
320
+ }
321
+
322
+ .sidebar-brand {
323
+ display: flex;
324
+ align-items: center;
325
+ gap: var(--space-2);
326
+ }
327
+
328
+ .sidebar-title {
329
+ font-size: var(--text-sm);
330
+ font-weight: 700;
331
+ letter-spacing: -0.02em;
332
+ white-space: nowrap;
333
+ }
334
+
335
+ .sidebar-actions {
336
+ display: flex;
337
+ gap: 4px;
338
+ }
339
+
340
+ .sidebar-action-btn {
341
+ background: none;
342
+ border: none;
343
+ min-width: 28px;
344
+ min-height: 28px;
345
+ padding: 4px;
346
+ border-radius: var(--radius-sm);
347
+ color: var(--color-text-muted);
348
+ cursor: pointer;
349
+ display: inline-flex;
350
+ align-items: center;
351
+ justify-content: center;
352
+ transition: color var(--transition-interactive), background var(--transition-interactive);
353
+ }
354
+
355
+ .sidebar-action-btn:hover {
356
+ background: var(--color-surface-offset);
357
+ color: var(--color-text);
358
+ }
359
+
360
+ .sidebar-action-btn:active {
361
+ transform: scale(0.95);
362
+ }
363
+
364
+ .sidebar-close-btn {
365
+ display: none;
366
+ }
367
+
368
+ .sidebar-search {
369
+ padding: var(--space-2) var(--space-3);
370
+ border-bottom: 1px solid var(--color-divider);
371
+ }
372
+
373
+ .sidebar-search-input {
374
+ width: 100%;
375
+ background: var(--color-surface-offset);
376
+ border: 1px solid transparent;
377
+ border-radius: var(--radius-sm);
378
+ padding: var(--space-1) var(--space-2);
379
+ font-size: var(--text-xs);
380
+ color: var(--color-text);
381
+ outline: none;
382
+ transition: border-color var(--transition-interactive);
383
+ }
384
+
385
+ .sidebar-search-input::placeholder {
386
+ color: var(--color-text-faint);
387
+ }
388
+
389
+ .sidebar-search-input:focus {
390
+ border-color: var(--color-primary);
391
+ }
392
+
393
+ .sidebar-tabs {
394
+ display: flex;
395
+ border-bottom: 1px solid var(--color-divider);
396
+ padding: 0 var(--space-2);
397
+ }
398
+
399
+ .sidebar-tab {
400
+ flex: 1;
401
+ display: inline-flex;
402
+ align-items: center;
403
+ justify-content: center;
404
+ gap: 6px;
405
+ padding: var(--space-2) var(--space-3);
406
+ color: var(--color-text-muted);
407
+ border-bottom: 2px solid transparent;
408
+ font-size: var(--text-xs);
409
+ font-weight: 500;
410
+ transition: all var(--transition-interactive);
411
+ position: relative;
412
+ }
413
+
414
+ .sidebar-tab.has-changes::after {
415
+ content: "";
416
+ position: absolute;
417
+ top: 8px;
418
+ right: 12px;
419
+ width: 6px;
420
+ height: 6px;
421
+ background-color: var(--color-success);
422
+ border-radius: 50%;
423
+ animation: pulse-dot 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
424
+ }
425
+
426
+ @keyframes pulse-dot {
427
+ 0%, 100% { opacity: 1; transform: scale(1); }
428
+ 50% { opacity: 0.5; transform: scale(0.8); }
429
+ }
430
+
431
+ .sidebar-tab:hover {
432
+ background: var(--color-surface-offset);
433
+ color: var(--color-text);
434
+ }
435
+
436
+ .sidebar-tab.active {
437
+ color: var(--color-primary);
438
+ border-bottom-color: var(--color-primary);
439
+ }
440
+
441
+ /* File tree */
442
+
443
+ .file-tree {
444
+ flex: 1;
445
+ overflow-y: auto;
446
+ overflow-x: hidden;
447
+ padding: var(--space-2) 0;
448
+ }
449
+
450
+ .file-tree-empty {
451
+ padding: var(--space-4) var(--space-3);
452
+ font-size: var(--text-xs);
453
+ color: var(--color-text-faint);
454
+ text-align: center;
455
+ }
456
+ .file-tree-item {
457
+ display: flex;
458
+ align-items: center;
459
+ gap: var(--space-1);
460
+ width: 100%;
461
+ padding-top: 4px;
462
+ padding-bottom: 4px;
463
+ padding-right: 8px;
464
+ padding-left: calc(8px + var(--depth, 0) * 16px);
465
+ border: none;
466
+ background: none;
467
+ font-size: 13px;
468
+ font-family: var(--font-body);
469
+ color: var(--color-text-muted);
470
+ cursor: pointer;
471
+ text-align: left;
472
+ user-select: none;
473
+ position: relative;
474
+ }
475
+
476
+ .file-tree-item:not([data-depth="0"])::before {
477
+ content: "";
478
+ position: absolute;
479
+ top: 0;
480
+ bottom: 0;
481
+ left: calc(8px + (var(--depth, 1) - 1) * 16px + 6px);
482
+ width: 1px;
483
+ background-color: var(--color-border);
484
+ opacity: 0.3;
485
+ }
486
+
487
+ .file-tree-file {
488
+ padding-left: calc(8px + var(--depth, 0) * 16px + 18px);
489
+ }
490
+
491
+ .file-tree-item {
492
+ overflow: hidden;
493
+ text-overflow: ellipsis;
494
+ border-radius: 0;
495
+ transition: background var(--transition-interactive), color var(--transition-interactive);
496
+ }
497
+
498
+ .file-tree-item:hover {
499
+ background: var(--color-surface-offset);
500
+ color: var(--color-text);
501
+ }
502
+
503
+ .file-tree-file.active {
504
+ background: var(--color-primary-highlight);
505
+ color: var(--color-primary);
506
+ }
507
+
508
+ .file-tree-chevron {
509
+ flex-shrink: 0;
510
+ transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1);
511
+ }
512
+
513
+ .file-tree-chevron.expanded {
514
+ transform: rotate(90deg);
515
+ }
516
+
517
+ .file-tree-icon {
518
+ flex-shrink: 0;
519
+ opacity: 0.5;
520
+ }
521
+
522
+ .file-tree-name {
523
+ overflow: hidden;
524
+ text-overflow: ellipsis;
525
+ }
526
+
527
+ .file-tree-children {
528
+ /* Children indentation handled by paddingLeft on items */
529
+ }
530
+
531
+ /* Git sidebar */
532
+
533
+ .git-panel {
534
+ flex: 1;
535
+ display: flex;
536
+ flex-direction: column;
537
+ overflow-y: auto;
538
+ }
539
+
540
+ .git-panel.active {
541
+ display: flex;
542
+ }
543
+
544
+ .git-branch-bar {
545
+ display: flex;
546
+ flex-direction: column;
547
+ align-items: stretch;
548
+ gap: var(--space-2);
549
+ padding: var(--space-3);
550
+ border-bottom: 1px solid var(--color-divider);
551
+ font-size: var(--text-xs);
552
+ }
553
+
554
+ .git-branch-meta {
555
+ display: flex;
556
+ align-items: center;
557
+ justify-content: space-between;
558
+ gap: var(--space-3);
559
+ min-width: 0;
560
+ width: 100%;
561
+ }
562
+
563
+ .git-branch-name {
564
+ display: inline-flex;
565
+ align-items: center;
566
+ gap: 6px;
567
+ min-width: 0;
568
+ max-width: 100%;
569
+ padding: 3px 8px;
570
+ border-radius: var(--radius-sm);
571
+ background: var(--color-surface-offset);
572
+ color: var(--color-text);
573
+ font-family: var(--font-mono);
574
+ font-size: 12px;
575
+ font-weight: 500;
576
+ }
577
+
578
+ .git-branch-name svg {
579
+ flex-shrink: 0;
580
+ color: var(--color-primary);
581
+ }
582
+
583
+ .git-sync-info {
584
+ display: inline-flex;
585
+ gap: var(--space-2);
586
+ font-family: var(--font-mono);
587
+ font-size: 11px;
588
+ flex-shrink: 0;
589
+ }
590
+
591
+ .git-sync-info-muted {
592
+ color: var(--color-text-faint);
593
+ }
594
+
595
+ .git-change-stats {
596
+ display: inline-flex;
597
+ align-items: center;
598
+ gap: var(--space-2);
599
+ font-family: var(--font-mono);
600
+ font-size: 11px;
601
+ font-weight: 600;
602
+ flex-shrink: 0;
603
+ }
604
+
605
+ .git-branch-actions {
606
+ display: grid;
607
+ grid-template-columns: repeat(2, minmax(0, 1fr));
608
+ gap: 6px;
609
+ width: 100%;
610
+ }
611
+
612
+ .git-branch-action-btn {
613
+ display: inline-flex;
614
+ align-items: center;
615
+ justify-content: center;
616
+ gap: 5px;
617
+ width: 100%;
618
+ min-width: 0;
619
+ min-height: 30px;
620
+ padding: 0 12px;
621
+ border-radius: 999px;
622
+ border: 1px solid var(--color-border);
623
+ background: var(--color-surface-offset);
624
+ color: var(--color-text-muted);
625
+ font-size: 11px;
626
+ font-weight: 600;
627
+ transition: all var(--transition-interactive);
628
+ }
629
+
630
+ .git-branch-action-btn:hover:not(:disabled) {
631
+ background: var(--color-surface-dynamic);
632
+ color: var(--color-text);
633
+ }
634
+
635
+ .git-branch-action-btn:disabled {
636
+ opacity: 0.45;
637
+ cursor: not-allowed;
638
+ }
639
+
640
+ .git-branch-action-btn svg {
641
+ flex-shrink: 0;
642
+ }
643
+
644
+ .git-change-add {
645
+ color: var(--diff-add-text);
646
+ }
647
+
648
+ .git-change-del {
649
+ color: var(--diff-del-text);
650
+ }
651
+
652
+ .git-section {
653
+ border-bottom: 1px solid var(--color-divider);
654
+ }
655
+
656
+ .git-section-header {
657
+ display: flex;
658
+ align-items: center;
659
+ gap: 6px;
660
+ width: 100%;
661
+ padding: var(--space-2) var(--space-3);
662
+ background: transparent;
663
+ color: var(--color-text-muted);
664
+ font-size: 11px;
665
+ font-weight: 600;
666
+ letter-spacing: 0.05em;
667
+ text-transform: uppercase;
668
+ text-align: left;
669
+ }
670
+
671
+ .git-section-header:hover {
672
+ background: var(--color-surface-offset);
673
+ }
674
+
675
+ .git-section-count {
676
+ padding: 1px 6px;
677
+ border-radius: var(--radius-full);
678
+ background: var(--color-surface-dynamic);
679
+ color: var(--color-text-muted);
680
+ font-size: 10px;
681
+ font-weight: 600;
682
+ }
683
+
684
+ .git-section-chevron {
685
+ color: var(--color-text-faint);
686
+ transition: transform 150ms ease;
687
+ }
688
+
689
+ .git-section-chevron.collapsed {
690
+ transform: rotate(-90deg);
691
+ }
692
+
693
+ .git-file-list {
694
+ padding: var(--space-1) 0;
695
+ }
696
+
697
+ .git-file-row {
698
+ display: flex;
699
+ align-items: center;
700
+ gap: var(--space-2);
701
+ margin: 0 var(--space-2) 2px;
702
+ padding: 2px;
703
+ border-radius: var(--radius-md);
704
+ transition: background var(--transition-interactive), color var(--transition-interactive);
705
+ }
706
+
707
+ .git-file-row:hover {
708
+ background: var(--color-surface-offset);
709
+ }
710
+
711
+ .git-file-row.active {
712
+ background: var(--color-primary-highlight);
713
+ }
714
+
715
+ .git-file-item {
716
+ display: flex;
717
+ align-items: center;
718
+ gap: var(--space-2);
719
+ min-width: 0;
720
+ flex: 1;
721
+ padding: 5px var(--space-2) 5px calc(var(--space-2) + 10px);
722
+ border-radius: calc(var(--radius-md) - 2px);
723
+ background: transparent;
724
+ color: var(--color-text-muted);
725
+ text-align: left;
726
+ transition: color var(--transition-interactive);
727
+ }
728
+
729
+ .git-file-item:hover {
730
+ color: var(--color-text);
731
+ }
732
+
733
+ .git-file-item.active {
734
+ color: var(--color-primary);
735
+ }
736
+
737
+ .git-file-row.active .git-file-path {
738
+ color: color-mix(in oklab, var(--color-primary) 56%, var(--color-text-muted));
739
+ }
740
+
741
+ .git-file-icon {
742
+ flex-shrink: 0;
743
+ opacity: 0.5;
744
+ }
745
+
746
+ .git-file-copy {
747
+ flex: 1;
748
+ display: flex;
749
+ flex-direction: column;
750
+ min-width: 0;
751
+ }
752
+
753
+ .git-file-name {
754
+ overflow: hidden;
755
+ text-overflow: ellipsis;
756
+ white-space: nowrap;
757
+ font-size: 13px;
758
+ }
759
+
760
+ .git-file-path {
761
+ color: var(--color-text-faint);
762
+ font-size: 11px;
763
+ overflow: hidden;
764
+ text-overflow: ellipsis;
765
+ white-space: nowrap;
766
+ }
767
+
768
+ .git-status-badge {
769
+ flex-shrink: 0;
770
+ padding: 1px 5px;
771
+ border-radius: 3px;
772
+ font-family: var(--font-mono);
773
+ font-size: 10px;
774
+ font-weight: 600;
775
+ letter-spacing: 0.02em;
776
+ text-transform: uppercase;
777
+ }
778
+
779
+ .git-status-badge.modified {
780
+ color: var(--color-warning);
781
+ background: color-mix(in oklab, var(--color-warning) 14%, transparent);
782
+ }
783
+
784
+ .git-status-badge.added {
785
+ color: var(--color-success);
786
+ background: color-mix(in oklab, var(--color-success) 14%, transparent);
787
+ }
788
+
789
+ .git-status-badge.deleted {
790
+ color: var(--color-error);
791
+ background: color-mix(in oklab, var(--color-error) 14%, transparent);
792
+ }
793
+
794
+ .git-status-badge.renamed {
795
+ color: var(--color-primary);
796
+ background: color-mix(in oklab, var(--color-primary) 16%, transparent);
797
+ }
798
+
799
+ .git-status-badge.untracked {
800
+ color: var(--color-text-faint);
801
+ background: var(--color-surface-offset);
802
+ }
803
+
804
+ .git-file-actions {
805
+ display: inline-flex;
806
+ align-items: center;
807
+ gap: 4px;
808
+ flex-shrink: 0;
809
+ padding-right: 4px;
810
+ }
811
+
812
+ .git-file-action-btn {
813
+ display: inline-flex;
814
+ align-items: center;
815
+ justify-content: center;
816
+ width: 30px;
817
+ min-height: 26px;
818
+ padding: 0;
819
+ border: 1px solid transparent;
820
+ border-radius: 999px;
821
+ background: color-mix(in oklab, var(--color-surface-offset) 82%, transparent);
822
+ color: var(--color-text-muted);
823
+ font-size: 11px;
824
+ font-weight: 600;
825
+ letter-spacing: 0.02em;
826
+ text-transform: uppercase;
827
+ transition: background var(--transition-interactive), color var(--transition-interactive), border-color var(--transition-interactive);
828
+ }
829
+
830
+ .git-file-action-btn:hover:not(:disabled) {
831
+ background: var(--color-surface-dynamic);
832
+ color: var(--color-text);
833
+ }
834
+
835
+ .git-file-action-btn:disabled {
836
+ opacity: 0.6;
837
+ cursor: default;
838
+ }
839
+
840
+ .git-file-action-btn svg {
841
+ flex-shrink: 0;
842
+ }
843
+
844
+ .git-file-action-btn-primary {
845
+ background: color-mix(in oklab, var(--color-primary) 14%, transparent);
846
+ color: var(--color-primary);
847
+ border-color: color-mix(in oklab, var(--color-primary) 20%, transparent);
848
+ }
849
+
850
+ .git-file-row.active .git-file-action-btn {
851
+ background: color-mix(in oklab, var(--color-surface) 30%, var(--color-primary-highlight));
852
+ color: var(--color-text);
853
+ }
854
+
855
+ .git-file-row.active .git-file-action-btn-primary {
856
+ background: color-mix(in oklab, var(--color-primary) 18%, transparent);
857
+ color: var(--color-primary);
858
+ }
859
+
860
+ .git-panel-footer {
861
+ margin-top: auto;
862
+ padding: var(--space-3);
863
+ border-top: 1px solid var(--color-divider);
864
+ }
865
+
866
+ .git-panel-footer-actions {
867
+ display: flex;
868
+ flex-direction: column;
869
+ gap: var(--space-2);
870
+ }
871
+
872
+ .git-view-all-btn {
873
+ display: inline-flex;
874
+ align-items: center;
875
+ justify-content: center;
876
+ gap: 6px;
877
+ width: 100%;
878
+ padding: var(--space-2);
879
+ border-radius: var(--radius-md);
880
+ background: var(--color-surface-offset);
881
+ color: var(--color-text-muted);
882
+ font-size: var(--text-xs);
883
+ font-weight: 500;
884
+ transition: all var(--transition-interactive);
885
+ }
886
+
887
+ .git-view-all-btn:hover {
888
+ background: var(--color-surface-dynamic);
889
+ color: var(--color-text);
890
+ }
891
+
892
+ .git-footer-commit-btn {
893
+ display: inline-flex;
894
+ align-items: center;
895
+ justify-content: center;
896
+ width: 100%;
897
+ min-height: 34px;
898
+ padding: 0 var(--space-3);
899
+ border-radius: var(--radius-md);
900
+ border: 1px solid color-mix(in oklab, var(--color-primary) 22%, transparent);
901
+ background: color-mix(in oklab, var(--color-primary) 16%, transparent);
902
+ color: var(--color-primary);
903
+ font-size: var(--text-xs);
904
+ font-weight: 600;
905
+ transition: all var(--transition-interactive);
906
+ }
907
+
908
+ .git-footer-commit-btn:hover:not(:disabled) {
909
+ background: color-mix(in oklab, var(--color-primary) 22%, transparent);
910
+ }
911
+
912
+ .git-footer-commit-btn:disabled {
913
+ opacity: 0.45;
914
+ cursor: not-allowed;
915
+ }
916
+
917
+ .git-panel-empty {
918
+ padding: var(--space-4);
919
+ color: var(--color-text-faint);
920
+ font-size: var(--text-xs);
921
+ text-align: center;
922
+ }
923
+
924
+ /* Context menu */
925
+
926
+ .file-context-menu {
927
+ position: fixed;
928
+ z-index: 1000;
929
+ background: var(--color-surface);
930
+ border: 1px solid var(--color-border);
931
+ border-radius: var(--radius-md);
932
+ box-shadow: var(--shadow-md);
933
+ padding: var(--space-1);
934
+ min-width: 120px;
935
+ transform-origin: top left;
936
+ opacity: 1;
937
+ transform: scale(1);
938
+ transition: opacity 0.15s cubic-bezier(0.16, 1, 0.3, 1), transform 0.15s cubic-bezier(0.16, 1, 0.3, 1);
939
+ }
940
+
941
+ @starting-style {
942
+ .file-context-menu {
943
+ opacity: 0;
944
+ transform: scale(0.9);
945
+ }
946
+ }
947
+
948
+ .file-context-item {
949
+ display: block;
950
+ width: 100%;
951
+ padding: var(--space-1) var(--space-3);
952
+ border: none;
953
+ background: none;
954
+ font-size: 13px;
955
+ font-family: var(--font-body);
956
+ color: var(--color-text);
957
+ cursor: pointer;
958
+ text-align: left;
959
+ border-radius: var(--radius-sm);
960
+ transition: background var(--transition-interactive);
961
+ }
962
+
963
+ .file-context-item:hover {
964
+ background: var(--color-surface-offset);
965
+ }
966
+
967
+ .file-context-danger {
968
+ color: var(--color-error);
969
+ }
970
+
971
+ /* Wiki-link */
972
+
973
+ .wiki-link {
974
+ color: var(--color-primary);
975
+ text-decoration: underline;
976
+ text-decoration-style: dotted;
977
+ text-underline-offset: 2px;
978
+ cursor: pointer;
979
+ }
980
+
981
+ .wiki-link:hover {
982
+ text-decoration-style: solid;
983
+ }
984
+
985
+ .wiki-link-new {
986
+ color: var(--color-text-muted);
987
+ text-decoration-style: dashed;
988
+ opacity: 0.7;
989
+ }
990
+
991
+ .wiki-link-new:hover {
992
+ color: var(--color-primary);
993
+ opacity: 1;
994
+ text-decoration-style: dashed;
995
+ }
996
+
997
+ /* ===== MAIN AREA ===== */
998
+
999
+ .main-area {
1000
+ flex: 1;
1001
+ display: flex;
1002
+ flex-direction: column;
1003
+ overflow: hidden;
1004
+ min-width: 0;
1005
+ }
1006
+
1007
+ /* ===== EMPTY STATE ===== */
1008
+
1009
+ .empty-state {
1010
+ flex: 1;
1011
+ display: flex;
1012
+ align-items: center;
1013
+ justify-content: center;
1014
+ padding: var(--space-8);
1015
+ }
1016
+
1017
+ .empty-state-content {
1018
+ display: flex;
1019
+ flex-direction: column;
1020
+ align-items: center;
1021
+ text-align: center;
1022
+ gap: var(--space-2);
1023
+ max-width: 320px;
1024
+ }
1025
+
1026
+ .empty-state-logo {
1027
+ display: inline-flex;
1028
+ align-items: center;
1029
+ justify-content: center;
1030
+ width: 80px;
1031
+ height: 80px;
1032
+ margin-bottom: var(--space-2);
1033
+ border: 1px solid color-mix(in oklab, var(--color-primary) 22%, var(--color-divider));
1034
+ border-radius: 24px;
1035
+ background:
1036
+ radial-gradient(circle at top, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%),
1037
+ linear-gradient(180deg, color-mix(in oklab, var(--color-surface) 94%, white 2%), color-mix(in oklab, var(--color-surface-2) 88%, black 12%));
1038
+ box-shadow:
1039
+ 0 18px 36px rgb(0 0 0 / 0.18),
1040
+ inset 0 1px 0 rgb(255 255 255 / 0.04);
1041
+ }
1042
+
1043
+ .empty-state-logo svg {
1044
+ display: block;
1045
+ opacity: 0.72;
1046
+ }
1047
+
1048
+ .empty-state-title {
1049
+ font-size: var(--text-lg);
1050
+ font-weight: 600;
1051
+ margin: 0;
1052
+ letter-spacing: -0.02em;
1053
+ }
1054
+
1055
+ .empty-state-desc {
1056
+ margin: 0;
1057
+ font-size: var(--text-sm);
1058
+ color: var(--color-text-muted);
1059
+ line-height: 1.5;
1060
+ }
1061
+
1062
+ .empty-state-actions {
1063
+ display: flex;
1064
+ flex-direction: column;
1065
+ gap: var(--space-3);
1066
+ margin-top: var(--space-4);
1067
+ width: 100%;
1068
+ }
1069
+
1070
+ .empty-state-btn {
1071
+ justify-content: flex-start;
1072
+ padding: var(--space-3) var(--space-4);
1073
+ font-size: var(--text-sm);
1074
+ color: var(--color-text);
1075
+ background: var(--color-surface-offset);
1076
+ border: 1px solid var(--color-border);
1077
+ box-shadow: var(--shadow-sm);
1078
+ }
1079
+
1080
+ .empty-state-btn:hover {
1081
+ background: var(--color-surface-offset-2);
1082
+ border-color: var(--color-text-faint);
1083
+ }
1084
+
1085
+ .empty-state-kbd {
1086
+ margin-left: auto;
1087
+ font-family: var(--font-mono);
1088
+ font-size: 0.75rem;
1089
+ color: var(--color-text-muted);
1090
+ background: var(--color-surface);
1091
+ padding: 2px 6px;
1092
+ border-radius: 4px;
1093
+ border: 1px solid var(--color-divider);
1094
+ }
1095
+
1096
+
1097
+ /* ===== EDITOR PAGE ===== */
1098
+
1099
+ .editor-page {
1100
+ display: flex;
1101
+ flex-direction: column;
1102
+ flex: 1;
1103
+ overflow: hidden;
1104
+ }
1105
+
1106
+ .diff-page {
1107
+ display: flex;
1108
+ flex-direction: column;
1109
+ flex: 1;
1110
+ overflow: hidden;
1111
+ }
1112
+
1113
+ /* Toolbar */
1114
+ .toolbar {
1115
+ display: flex;
1116
+ align-items: center;
1117
+ justify-content: space-between;
1118
+ height: var(--toolbar-h);
1119
+ padding: 0 var(--space-3);
1120
+ background: var(--color-surface);
1121
+ border-bottom: 1px solid var(--color-divider);
1122
+ flex-shrink: 0;
1123
+ z-index: 10;
1124
+ gap: var(--space-2);
1125
+ }
1126
+
1127
+ .toolbar-left,
1128
+ .toolbar-right {
1129
+ display: flex;
1130
+ align-items: center;
1131
+ gap: var(--space-2);
1132
+ }
1133
+ .toolbar-left {
1134
+ min-width: 0;
1135
+ flex: 1;
1136
+ }
1137
+ .toolbar-right {
1138
+ flex-shrink: 0;
1139
+ }
1140
+
1141
+ .toolbar-logo {
1142
+ display: flex;
1143
+ align-items: center;
1144
+ padding: var(--space-1);
1145
+ border-radius: var(--radius-sm);
1146
+ transition: background var(--transition-interactive);
1147
+ flex-shrink: 0;
1148
+ }
1149
+ .toolbar-logo:hover {
1150
+ background: var(--color-surface-offset);
1151
+ }
1152
+
1153
+ .toolbar-room-info {
1154
+ display: flex;
1155
+ align-items: center;
1156
+ gap: var(--space-2);
1157
+ min-width: 0;
1158
+ }
1159
+ .toolbar-room-name {
1160
+ font-size: var(--text-sm);
1161
+ font-weight: 600;
1162
+ overflow: hidden;
1163
+ text-overflow: ellipsis;
1164
+ white-space: nowrap;
1165
+ }
1166
+ .toolbar-badge {
1167
+ font-size: 11px;
1168
+ font-weight: 500;
1169
+ padding: 2px var(--space-2);
1170
+ border-radius: var(--radius-full);
1171
+ background: var(--color-primary-highlight);
1172
+ color: var(--color-primary);
1173
+ white-space: nowrap;
1174
+ flex-shrink: 0;
1175
+ }
1176
+
1177
+ .toolbar-center {
1178
+ flex-shrink: 0;
1179
+ }
1180
+
1181
+ .view-toggle {
1182
+ display: flex;
1183
+ background: var(--color-surface-offset);
1184
+ border-radius: var(--radius-md);
1185
+ padding: 2px;
1186
+ gap: 2px;
1187
+ }
1188
+ .view-btn {
1189
+ display: flex;
1190
+ align-items: center;
1191
+ justify-content: center;
1192
+ width: 32px;
1193
+ height: 28px;
1194
+ border-radius: var(--radius-sm);
1195
+ color: var(--color-text-faint);
1196
+ transition: all var(--transition-interactive);
1197
+ }
1198
+ .view-btn:hover {
1199
+ color: var(--color-text-muted);
1200
+ }
1201
+ .view-btn.active {
1202
+ background: var(--color-surface);
1203
+ color: var(--color-text);
1204
+ box-shadow: var(--shadow-sm);
1205
+ }
1206
+
1207
+ .diff-mode-toggle {
1208
+ padding: 3px;
1209
+ }
1210
+
1211
+ .diff-mode-btn {
1212
+ width: auto;
1213
+ min-width: 72px;
1214
+ height: 28px;
1215
+ padding: 0 var(--space-3);
1216
+ font-size: 12px;
1217
+ font-weight: 600;
1218
+ }
1219
+
1220
+ /* Diff */
1221
+
1222
+ .diff-toolbar {
1223
+ display: flex;
1224
+ align-items: center;
1225
+ justify-content: space-between;
1226
+ gap: var(--space-3);
1227
+ padding: var(--space-2) var(--space-4);
1228
+ background: var(--color-surface-2);
1229
+ border-bottom: 1px solid var(--color-divider);
1230
+ }
1231
+
1232
+ .diff-toolbar-left,
1233
+ .diff-toolbar-right {
1234
+ display: flex;
1235
+ align-items: center;
1236
+ gap: var(--space-3);
1237
+ }
1238
+
1239
+ .diff-toolbar-actions {
1240
+ display: inline-flex;
1241
+ align-items: center;
1242
+ gap: var(--space-2);
1243
+ }
1244
+
1245
+ .diff-toolbar-actions-group {
1246
+ display: inline-flex;
1247
+ align-items: center;
1248
+ gap: var(--space-2);
1249
+ }
1250
+
1251
+ .diff-toolbar-actions-group-git {
1252
+ padding: 3px;
1253
+ border: 1px solid var(--color-divider);
1254
+ border-radius: 12px;
1255
+ background: color-mix(in oklab, var(--color-surface) 78%, transparent);
1256
+ box-shadow: inset 0 1px 0 color-mix(in oklab, var(--color-text) 4%, transparent);
1257
+ }
1258
+
1259
+ .diff-toolbar-actions-divider {
1260
+ width: 1px;
1261
+ height: 28px;
1262
+ background: var(--color-divider);
1263
+ opacity: 0.9;
1264
+ }
1265
+
1266
+ .diff-toolbar-actions .btn {
1267
+ min-height: 36px;
1268
+ padding: 0 14px;
1269
+ border-radius: 10px;
1270
+ font-size: 12px;
1271
+ font-weight: 600;
1272
+ white-space: nowrap;
1273
+ }
1274
+
1275
+ .diff-action-btn {
1276
+ min-width: 92px;
1277
+ border-radius: 9px;
1278
+ }
1279
+
1280
+ .diff-open-editor-btn {
1281
+ min-width: 116px;
1282
+ }
1283
+
1284
+ .diff-open-editor-btn:disabled {
1285
+ opacity: 0.45;
1286
+ cursor: not-allowed;
1287
+ }
1288
+
1289
+ .diff-file-nav {
1290
+ display: flex;
1291
+ align-items: center;
1292
+ gap: var(--space-2);
1293
+ }
1294
+
1295
+ .diff-nav-btn {
1296
+ width: 28px;
1297
+ height: 28px;
1298
+ display: inline-flex;
1299
+ align-items: center;
1300
+ justify-content: center;
1301
+ border-radius: var(--radius-sm);
1302
+ color: var(--color-text-muted);
1303
+ }
1304
+
1305
+ .diff-nav-btn:hover {
1306
+ background: var(--color-surface-offset);
1307
+ color: var(--color-text);
1308
+ }
1309
+
1310
+ .diff-nav-btn:disabled {
1311
+ opacity: 0.3;
1312
+ cursor: not-allowed;
1313
+ }
1314
+
1315
+ .diff-file-indicator {
1316
+ color: var(--color-text-muted);
1317
+ font-size: var(--text-xs);
1318
+ font-variant-numeric: tabular-nums;
1319
+ }
1320
+
1321
+ .diff-stats {
1322
+ display: inline-flex;
1323
+ align-items: center;
1324
+ gap: var(--space-2);
1325
+ font-family: var(--font-mono);
1326
+ font-size: 12px;
1327
+ white-space: nowrap;
1328
+ }
1329
+
1330
+ .diff-stats-add {
1331
+ color: var(--diff-add-text);
1332
+ }
1333
+
1334
+ .diff-stats-del {
1335
+ color: var(--diff-del-text);
1336
+ }
1337
+
1338
+ .diff-scroll {
1339
+ flex: 1;
1340
+ overflow: auto;
1341
+ }
1342
+
1343
+ .diff-content {
1344
+ min-width: fit-content;
1345
+ }
1346
+
1347
+ .diff-file-block {
1348
+ margin-bottom: 0;
1349
+ }
1350
+
1351
+ .diff-file-header {
1352
+ position: sticky;
1353
+ top: 0;
1354
+ z-index: 5;
1355
+ display: flex;
1356
+ align-items: center;
1357
+ gap: var(--space-2);
1358
+ padding: var(--space-2) var(--space-4);
1359
+ background: var(--color-surface-offset);
1360
+ border-top: 1px solid var(--color-divider);
1361
+ border-bottom: 1px solid var(--color-divider);
1362
+ }
1363
+
1364
+ .diff-file-header:first-child {
1365
+ border-top: none;
1366
+ }
1367
+
1368
+ .diff-file-path {
1369
+ color: var(--color-text);
1370
+ font-family: var(--font-mono);
1371
+ font-size: 12px;
1372
+ font-weight: 500;
1373
+ }
1374
+
1375
+ .diff-file-header-stats {
1376
+ margin-left: auto;
1377
+ display: inline-flex;
1378
+ gap: var(--space-2);
1379
+ font-family: var(--font-mono);
1380
+ font-size: 11px;
1381
+ }
1382
+
1383
+ .diff-hunk-header,
1384
+ .diff-split-hunk {
1385
+ padding: 4px var(--space-4);
1386
+ padding-left: 92px;
1387
+ background: var(--diff-hunk-bg);
1388
+ color: var(--diff-hunk-text);
1389
+ font-family: var(--font-mono);
1390
+ font-size: 12px;
1391
+ }
1392
+
1393
+ .diff-line {
1394
+ display: flex;
1395
+ align-items: stretch;
1396
+ min-height: 20px;
1397
+ font-family: var(--font-mono);
1398
+ font-size: 13px;
1399
+ line-height: 20px;
1400
+ }
1401
+
1402
+ .diff-line-numbers {
1403
+ display: flex;
1404
+ flex-shrink: 0;
1405
+ user-select: none;
1406
+ }
1407
+
1408
+ .diff-line-num {
1409
+ width: 40px;
1410
+ padding: 0 8px;
1411
+ color: var(--diff-gutter);
1412
+ text-align: right;
1413
+ font-size: 12px;
1414
+ border-right: 1px solid var(--color-divider);
1415
+ }
1416
+
1417
+ .diff-line-num:first-child {
1418
+ border-right: none;
1419
+ }
1420
+
1421
+ .diff-line-prefix {
1422
+ width: 20px;
1423
+ padding-left: 8px;
1424
+ flex-shrink: 0;
1425
+ font-weight: 500;
1426
+ user-select: none;
1427
+ }
1428
+
1429
+ .diff-line-content {
1430
+ flex: 1;
1431
+ padding: 0 var(--space-3);
1432
+ white-space: pre;
1433
+ tab-size: 4;
1434
+ }
1435
+
1436
+ .diff-line.addition {
1437
+ background: var(--diff-add-bg);
1438
+ }
1439
+
1440
+ .diff-line.addition .diff-line-num {
1441
+ background: var(--diff-add-line-bg);
1442
+ color: var(--diff-add-text);
1443
+ }
1444
+
1445
+ .diff-line.addition .diff-line-prefix {
1446
+ color: var(--diff-add-text);
1447
+ }
1448
+
1449
+ .diff-line.deletion {
1450
+ background: var(--diff-del-bg);
1451
+ }
1452
+
1453
+ .diff-line.deletion .diff-line-num {
1454
+ background: var(--diff-del-line-bg);
1455
+ color: var(--diff-del-text);
1456
+ }
1457
+
1458
+ .diff-line.deletion .diff-line-prefix {
1459
+ color: var(--diff-del-text);
1460
+ }
1461
+
1462
+ .diff-line.note {
1463
+ background: var(--color-surface-offset);
1464
+ color: var(--color-text-faint);
1465
+ }
1466
+
1467
+ .diff-highlight-add {
1468
+ background: color-mix(in oklab, var(--diff-add-text) 24%, transparent);
1469
+ border-radius: 2px;
1470
+ padding: 0 1px;
1471
+ }
1472
+
1473
+ .diff-highlight-del {
1474
+ background: color-mix(in oklab, var(--diff-del-text) 24%, transparent);
1475
+ border-radius: 2px;
1476
+ padding: 0 1px;
1477
+ }
1478
+
1479
+ .diff-split {
1480
+ display: block;
1481
+ }
1482
+
1483
+ .diff-split-row {
1484
+ display: grid;
1485
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1486
+ }
1487
+
1488
+ .diff-split-pane-header {
1489
+ display: none;
1490
+ }
1491
+
1492
+ .diff-split-line {
1493
+ display: flex;
1494
+ min-height: 20px;
1495
+ font-family: var(--font-mono);
1496
+ font-size: 13px;
1497
+ line-height: 20px;
1498
+ }
1499
+
1500
+ .diff-split-line:first-child {
1501
+ border-right: 1px solid var(--color-divider);
1502
+ }
1503
+
1504
+ .diff-split-num {
1505
+ width: 44px;
1506
+ padding: 0 8px;
1507
+ color: var(--diff-gutter);
1508
+ text-align: right;
1509
+ font-size: 12px;
1510
+ border-right: 1px solid var(--color-divider);
1511
+ }
1512
+
1513
+ .diff-split-content {
1514
+ flex: 1;
1515
+ padding: 0 var(--space-3);
1516
+ white-space: pre;
1517
+ tab-size: 4;
1518
+ }
1519
+
1520
+ .diff-split-line.addition {
1521
+ background: var(--diff-add-bg);
1522
+ }
1523
+
1524
+ .diff-split-line.addition .diff-split-num {
1525
+ background: var(--diff-add-line-bg);
1526
+ color: var(--diff-add-text);
1527
+ }
1528
+
1529
+ .diff-split-line.deletion {
1530
+ background: var(--diff-del-bg);
1531
+ }
1532
+
1533
+ .diff-split-line.deletion .diff-split-num {
1534
+ background: var(--diff-del-line-bg);
1535
+ color: var(--diff-del-text);
1536
+ }
1537
+
1538
+ .diff-split-line.empty {
1539
+ background: var(--color-surface-offset);
1540
+ opacity: 0.45;
1541
+ }
1542
+
1543
+ .diff-binary-message,
1544
+ .diff-empty-state {
1545
+ padding: var(--space-4);
1546
+ color: var(--color-text-faint);
1547
+ }
1548
+
1549
+ .diff-limit-card {
1550
+ display: flex;
1551
+ flex-direction: column;
1552
+ align-items: flex-start;
1553
+ gap: var(--space-2);
1554
+ padding: var(--space-4);
1555
+ color: var(--color-text-muted);
1556
+ border-top: 1px solid var(--color-divider);
1557
+ }
1558
+
1559
+ .diff-limit-card strong {
1560
+ color: var(--color-text);
1561
+ font-size: var(--text-sm);
1562
+ }
1563
+
1564
+ .diff-load-full-btn {
1565
+ margin-top: var(--space-1);
1566
+ font-size: 12px;
1567
+ font-weight: 600;
1568
+ }
1569
+
1570
+ .toolbar-btn {
1571
+ display: flex;
1572
+ align-items: center;
1573
+ gap: var(--space-1);
1574
+ padding: var(--space-1) var(--space-2);
1575
+ border-radius: var(--radius-md);
1576
+ font-size: var(--text-xs);
1577
+ }
1578
+ .toolbar-btn-label {
1579
+ font-size: var(--text-xs);
1580
+ }
1581
+ .toolbar-name-btn {
1582
+ max-width: 132px;
1583
+ }
1584
+ .toolbar-user-name {
1585
+ overflow: hidden;
1586
+ text-overflow: ellipsis;
1587
+ white-space: nowrap;
1588
+ }
1589
+
1590
+ /* Mobile view toggle — hidden on desktop */
1591
+ .mobile-view-toggle {
1592
+ display: none;
1593
+ }
1594
+
1595
+ .user-avatars {
1596
+ display: flex;
1597
+ align-items: center;
1598
+ }
1599
+ .user-avatar {
1600
+ width: 24px;
1601
+ height: 24px;
1602
+ border-radius: var(--radius-full);
1603
+ display: flex;
1604
+ align-items: center;
1605
+ justify-content: center;
1606
+ font-size: 11px;
1607
+ font-weight: 600;
1608
+ color: white;
1609
+ border: 2px solid var(--color-surface);
1610
+ margin-left: -4px;
1611
+ position: relative;
1612
+ z-index: 1;
1613
+ flex-shrink: 0;
1614
+ }
1615
+ .user-avatar-initial {
1616
+ display: inline-flex;
1617
+ align-items: center;
1618
+ justify-content: center;
1619
+ line-height: 1;
1620
+ }
1621
+ .user-avatar:first-child {
1622
+ margin-left: 0;
1623
+ }
1624
+ .user-avatar.is-local {
1625
+ width: auto;
1626
+ min-width: 44px;
1627
+ padding: 0 8px 0 6px;
1628
+ gap: 4px;
1629
+ border-radius: var(--radius-full);
1630
+ margin-right: 6px;
1631
+ box-shadow:
1632
+ 0 0 0 2px var(--color-surface),
1633
+ 0 0 0 4px oklch(from var(--color-primary) l c h / 0.18);
1634
+ z-index: 5;
1635
+ }
1636
+ .user-avatar.is-local + .user-avatar {
1637
+ margin-left: 0;
1638
+ }
1639
+ .user-avatar.is-local .user-avatar-initial {
1640
+ width: 14px;
1641
+ height: 14px;
1642
+ border-radius: var(--radius-full);
1643
+ background: rgb(255 255 255 / 0.22);
1644
+ font-size: 9px;
1645
+ }
1646
+ .user-avatar-self-label {
1647
+ padding: 2px 4px;
1648
+ border-radius: var(--radius-full);
1649
+ background: rgb(15 17 23 / 0.84);
1650
+ color: #ffffff;
1651
+ font-size: 9px;
1652
+ font-weight: 700;
1653
+ letter-spacing: 0.04em;
1654
+ line-height: 1;
1655
+ text-transform: uppercase;
1656
+ }
1657
+ .user-avatar-button {
1658
+ cursor: pointer;
1659
+ padding: 0;
1660
+ transition: transform var(--transition-interactive), box-shadow var(--transition-interactive);
1661
+ }
1662
+ .user-avatar-button:hover {
1663
+ transform: translateY(-1px);
1664
+ z-index: 2;
1665
+ }
1666
+ .user-avatar-button:focus-visible {
1667
+ outline: none;
1668
+ box-shadow: 0 0 0 2px var(--color-bg), 0 0 0 4px oklch(from var(--color-primary) l c h / 0.45);
1669
+ z-index: 3;
1670
+ }
1671
+ .user-avatar.is-following {
1672
+ box-shadow: 0 0 0 2px var(--color-primary), 0 0 0 4px oklch(from var(--color-primary) l c h / 0.2);
1673
+ z-index: 4;
1674
+ }
1675
+ .user-avatar-button.different-file {
1676
+ opacity: 0.55;
1677
+ }
1678
+ .user-avatar-button.different-file:hover {
1679
+ opacity: 0.85;
1680
+ }
1681
+
1682
+ .chat-container {
1683
+ position: relative;
1684
+ }
1685
+
1686
+ .chat-toggle-btn {
1687
+ position: relative;
1688
+ }
1689
+
1690
+ .chat-toggle-btn.is-active {
1691
+ color: var(--color-text);
1692
+ background: var(--color-surface-offset);
1693
+ }
1694
+
1695
+ .chat-toggle-btn.is-unread:not(.is-active) {
1696
+ color: var(--color-primary);
1697
+ background: oklch(from var(--color-primary) l c h / 0.12);
1698
+ box-shadow: inset 0 0 0 1px oklch(from var(--color-primary) l c h / 0.22);
1699
+ }
1700
+
1701
+ .chat-toggle-btn.is-unread:not(.is-active):hover {
1702
+ background: oklch(from var(--color-primary) l c h / 0.18);
1703
+ }
1704
+
1705
+ .chat-toggle-badge {
1706
+ min-width: 18px;
1707
+ height: 18px;
1708
+ padding: 0 5px;
1709
+ border-radius: var(--radius-full);
1710
+ background: var(--color-primary);
1711
+ color: var(--color-text-inverse);
1712
+ font-size: 10px;
1713
+ font-weight: 700;
1714
+ line-height: 18px;
1715
+ text-align: center;
1716
+ }
1717
+
1718
+ .chat-toggle-btn.is-unread:not(.is-active) .chat-toggle-badge {
1719
+ box-shadow: 0 0 0 3px oklch(from var(--color-primary) l c h / 0.16);
1720
+ }
1721
+
1722
+ .chat-panel {
1723
+ position: absolute;
1724
+ top: calc(100% + var(--space-2));
1725
+ right: 0;
1726
+ width: min(360px, calc(100vw - var(--space-6)));
1727
+ max-height: min(70vh, 520px);
1728
+ display: flex;
1729
+ flex-direction: column;
1730
+ gap: var(--space-3);
1731
+ padding: var(--space-3);
1732
+ border: 1px solid var(--color-border);
1733
+ border-radius: var(--radius-lg);
1734
+ background: oklch(from var(--color-surface) l c h / 0.98);
1735
+ box-shadow: var(--shadow-lg);
1736
+ backdrop-filter: blur(14px);
1737
+ z-index: 30;
1738
+ }
1739
+
1740
+ .chat-container > .chat-toast-container {
1741
+ position: fixed;
1742
+ top: calc(var(--toolbar-h) + var(--space-2));
1743
+ right: var(--space-3);
1744
+ width: min(360px, calc(100vw - var(--space-6)));
1745
+ align-items: flex-end;
1746
+ z-index: 60;
1747
+ }
1748
+
1749
+ .chat-toast-container .toast {
1750
+ width: 100%;
1751
+ max-width: 100%;
1752
+ padding: 12px 14px;
1753
+ border-width: 1px;
1754
+ border-style: solid;
1755
+ border-color: color-mix(in oklab, #f59e0b 78%, white 10%);
1756
+ border-left-width: 4px;
1757
+ background:
1758
+ linear-gradient(135deg,
1759
+ color-mix(in oklab, #f59e0b 32%, transparent),
1760
+ color-mix(in oklab, var(--color-surface) 86%, #0b1022 14%) 42%),
1761
+ color-mix(in oklab, var(--color-surface) 74%, #1b1320 26%);
1762
+ color: color-mix(in oklab, white 92%, #fef3c7 8%);
1763
+ font-size: 13px;
1764
+ font-weight: 600;
1765
+ box-shadow:
1766
+ 0 18px 34px rgb(0 0 0 / 0.38),
1767
+ 0 0 0 1px color-mix(in oklab, #f59e0b 18%, transparent);
1768
+ }
1769
+
1770
+ :root[data-theme="light"] .chat-toast-container .toast {
1771
+ border-color: color-mix(in oklab, #f59e0b 84%, #b45309 16%);
1772
+ background:
1773
+ linear-gradient(135deg,
1774
+ color-mix(in oklab, #fcd34d 42%, white 58%),
1775
+ color-mix(in oklab, white 94%, #fff7ed 6%) 42%),
1776
+ #fff8e7;
1777
+ color: #422006;
1778
+ box-shadow:
1779
+ 0 16px 30px rgb(84 46 10 / 0.18),
1780
+ 0 0 0 1px rgb(245 158 11 / 0.12);
1781
+ }
1782
+
1783
+ .chat-panel-header {
1784
+ display: flex;
1785
+ align-items: flex-start;
1786
+ justify-content: space-between;
1787
+ gap: var(--space-3);
1788
+ }
1789
+
1790
+ .chat-panel-title {
1791
+ margin: 0;
1792
+ font-size: var(--text-sm);
1793
+ font-weight: 700;
1794
+ }
1795
+
1796
+ .chat-panel-status {
1797
+ margin: var(--space-1) 0 0;
1798
+ font-size: 11px;
1799
+ color: var(--color-text-muted);
1800
+ }
1801
+
1802
+ .chat-alert-btn {
1803
+ flex-shrink: 0;
1804
+ padding: 6px 10px;
1805
+ font-size: 11px;
1806
+ }
1807
+
1808
+ .chat-alert-btn.is-enabled {
1809
+ border-color: oklch(from var(--color-success) l c h / 0.45);
1810
+ color: var(--color-success);
1811
+ background: oklch(from var(--color-success) l c h / 0.12);
1812
+ }
1813
+
1814
+ .chat-alert-btn.is-blocked {
1815
+ color: var(--color-warning);
1816
+ }
1817
+
1818
+ .chat-empty-state {
1819
+ padding: var(--space-4);
1820
+ border: 1px dashed var(--color-border);
1821
+ border-radius: var(--radius-md);
1822
+ font-size: 12px;
1823
+ color: var(--color-text-muted);
1824
+ background: var(--color-surface-2);
1825
+ }
1826
+
1827
+ .chat-messages {
1828
+ display: flex;
1829
+ flex-direction: column;
1830
+ gap: var(--space-3);
1831
+ overflow-y: auto;
1832
+ padding-right: var(--space-1);
1833
+ min-height: 140px;
1834
+ max-height: 320px;
1835
+ }
1836
+
1837
+ .chat-message {
1838
+ display: flex;
1839
+ align-items: flex-start;
1840
+ gap: var(--space-2);
1841
+ }
1842
+
1843
+ .chat-message.is-local {
1844
+ flex-direction: row-reverse;
1845
+ }
1846
+
1847
+ .chat-message-avatar {
1848
+ width: 28px;
1849
+ height: 28px;
1850
+ border-radius: var(--radius-full);
1851
+ display: flex;
1852
+ align-items: center;
1853
+ justify-content: center;
1854
+ color: white;
1855
+ font-size: 12px;
1856
+ font-weight: 700;
1857
+ flex-shrink: 0;
1858
+ }
1859
+
1860
+ .chat-message-body {
1861
+ min-width: 0;
1862
+ flex: 1;
1863
+ display: flex;
1864
+ flex-direction: column;
1865
+ align-items: flex-start;
1866
+ }
1867
+
1868
+ .chat-message.is-local .chat-message-body {
1869
+ align-items: flex-end;
1870
+ }
1871
+
1872
+ .chat-message-meta {
1873
+ display: flex;
1874
+ flex-wrap: wrap;
1875
+ align-items: center;
1876
+ gap: 6px;
1877
+ margin-bottom: 4px;
1878
+ }
1879
+
1880
+ .chat-message.is-local .chat-message-meta {
1881
+ justify-content: flex-end;
1882
+ }
1883
+
1884
+ .chat-message-author {
1885
+ font-size: 12px;
1886
+ font-weight: 600;
1887
+ color: var(--color-text);
1888
+ }
1889
+
1890
+ .chat-message-time,
1891
+ .chat-message-file {
1892
+ font-size: 10px;
1893
+ color: var(--color-text-muted);
1894
+ }
1895
+
1896
+ .chat-message-file {
1897
+ padding: 2px 6px;
1898
+ border-radius: var(--radius-full);
1899
+ background: var(--color-surface-offset);
1900
+ }
1901
+
1902
+ .chat-message-text {
1903
+ margin: 0;
1904
+ padding: 10px 12px;
1905
+ border-radius: var(--radius-md);
1906
+ background: var(--color-surface-2);
1907
+ border: 1px solid var(--color-divider);
1908
+ color: var(--color-text);
1909
+ font-size: 13px;
1910
+ line-height: 1.45;
1911
+ word-break: break-word;
1912
+ width: fit-content;
1913
+ max-width: 78%;
1914
+ }
1915
+
1916
+ .chat-message.is-local .chat-message-text {
1917
+ background: oklch(from var(--color-primary) l c h / 0.14);
1918
+ border-color: oklch(from var(--color-primary) l c h / 0.25);
1919
+ }
1920
+
1921
+ .chat-form {
1922
+ display: flex;
1923
+ align-items: center;
1924
+ gap: var(--space-2);
1925
+ }
1926
+
1927
+ .chat-input {
1928
+ font-size: 13px;
1929
+ }
1930
+
1931
+ .chat-send-btn {
1932
+ flex-shrink: 0;
1933
+ padding-inline: var(--space-4);
1934
+ }
1935
+
1936
+ .app-dialog {
1937
+ width: min(420px, calc(100vw - var(--space-6)));
1938
+ margin: auto;
1939
+ padding: 0;
1940
+ border: 1px solid var(--color-border);
1941
+ border-radius: var(--radius-xl);
1942
+ background: var(--color-surface);
1943
+ color: var(--color-text);
1944
+ box-shadow: var(--shadow-lg);
1945
+ opacity: 0;
1946
+ transform: scale(0.95);
1947
+ transition:
1948
+ opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1),
1949
+ transform 0.2s cubic-bezier(0.16, 1, 0.3, 1),
1950
+ display 0.2s cubic-bezier(0.16, 1, 0.3, 1) allow-discrete;
1951
+ }
1952
+
1953
+ .app-dialog[open] {
1954
+ opacity: 1;
1955
+ transform: scale(1);
1956
+ }
1957
+
1958
+ @starting-style {
1959
+ .app-dialog[open] {
1960
+ opacity: 0;
1961
+ transform: scale(0.95);
1962
+ }
1963
+ }
1964
+
1965
+ .app-dialog::backdrop {
1966
+ background: oklch(from var(--color-bg) l c h / 0.72);
1967
+ backdrop-filter: blur(6px);
1968
+ opacity: 0;
1969
+ transition:
1970
+ opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1),
1971
+ display 0.2s cubic-bezier(0.16, 1, 0.3, 1) allow-discrete;
1972
+ }
1973
+
1974
+ .app-dialog[open]::backdrop {
1975
+ opacity: 1;
1976
+ }
1977
+
1978
+ @starting-style {
1979
+ .app-dialog[open]::backdrop {
1980
+ opacity: 0;
1981
+ }
1982
+ }
1983
+ .app-dialog-form {
1984
+ display: grid;
1985
+ gap: var(--space-4);
1986
+ padding: var(--space-5);
1987
+ }
1988
+ .app-dialog-header {
1989
+ display: grid;
1990
+ gap: var(--space-1);
1991
+ }
1992
+ .app-dialog-title {
1993
+ font-size: var(--text-base);
1994
+ font-weight: 600;
1995
+ }
1996
+ .app-dialog-copy {
1997
+ color: var(--color-text-muted);
1998
+ font-size: var(--text-sm);
1999
+ }
2000
+ .app-dialog-field {
2001
+ display: grid;
2002
+ gap: var(--space-2);
2003
+ }
2004
+ .app-dialog-label {
2005
+ font-size: var(--text-xs);
2006
+ font-weight: 600;
2007
+ color: var(--color-text-muted);
2008
+ text-transform: uppercase;
2009
+ letter-spacing: 0.08em;
2010
+ }
2011
+ .app-dialog-hint {
2012
+ color: var(--color-text-muted);
2013
+ font-size: var(--text-xs);
2014
+ line-height: 1.5;
2015
+ }
2016
+ .app-dialog-note {
2017
+ border: 1px solid var(--color-border);
2018
+ border-radius: var(--radius-md);
2019
+ background: var(--color-surface-offset);
2020
+ color: var(--color-text);
2021
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
2022
+ font-size: var(--text-xs);
2023
+ line-height: 1.6;
2024
+ overflow-wrap: anywhere;
2025
+ padding: var(--space-3);
2026
+ }
2027
+ .app-dialog-note.is-danger {
2028
+ background: var(--color-error-highlight);
2029
+ border-color: oklch(from var(--color-error) l c h / 0.35);
2030
+ color: var(--color-error);
2031
+ }
2032
+ .app-dialog-actions {
2033
+ display: flex;
2034
+ justify-content: flex-end;
2035
+ gap: var(--space-2);
2036
+ }
2037
+
2038
+ .tab-lock-overlay {
2039
+ position: fixed;
2040
+ inset: 0;
2041
+ z-index: 1200;
2042
+ display: grid;
2043
+ place-items: center;
2044
+ padding: var(--space-6);
2045
+ background:
2046
+ radial-gradient(circle at top, oklch(from var(--color-primary) l c h / 0.16), transparent 38%),
2047
+ oklch(from var(--color-bg) l c h / 0.82);
2048
+ backdrop-filter: blur(10px);
2049
+ }
2050
+
2051
+ .tab-lock-card {
2052
+ width: min(520px, 100%);
2053
+ display: grid;
2054
+ gap: var(--space-4);
2055
+ padding: var(--space-6);
2056
+ border: 1px solid oklch(from var(--color-primary) l c h / 0.25);
2057
+ border-radius: var(--radius-xl);
2058
+ background: linear-gradient(180deg, var(--color-surface), var(--color-surface-2));
2059
+ box-shadow: var(--shadow-lg);
2060
+ }
2061
+
2062
+ .tab-lock-kicker {
2063
+ font-size: var(--text-xs);
2064
+ font-weight: 700;
2065
+ letter-spacing: 0.08em;
2066
+ text-transform: uppercase;
2067
+ color: var(--color-primary);
2068
+ }
2069
+
2070
+ .tab-lock-title {
2071
+ font-size: var(--text-lg);
2072
+ line-height: 1.2;
2073
+ }
2074
+
2075
+ .tab-lock-copy {
2076
+ color: var(--color-text-muted);
2077
+ font-size: var(--text-sm);
2078
+ line-height: 1.6;
2079
+ }
2080
+
2081
+ .tab-lock-actions {
2082
+ display: flex;
2083
+ justify-content: flex-start;
2084
+ }
2085
+
2086
+
2087
+ /* ===== EDITOR LAYOUT ===== */
2088
+
2089
+ .editor-layout {
2090
+ display: flex;
2091
+ flex: 1;
2092
+ overflow: hidden;
2093
+ position: relative;
2094
+ }
2095
+
2096
+ .editor-pane,
2097
+ .preview-pane {
2098
+ display: flex;
2099
+ flex-direction: column;
2100
+ overflow: hidden;
2101
+ }
2102
+ .editor-pane {
2103
+ flex: 1;
2104
+ min-width: 200px;
2105
+ }
2106
+ .preview-pane {
2107
+ flex: 1;
2108
+ min-width: 200px;
2109
+ }
2110
+
2111
+ .pane-header {
2112
+ display: flex;
2113
+ align-items: center;
2114
+ justify-content: space-between;
2115
+ padding: var(--space-1) var(--space-3);
2116
+ background: var(--color-surface-offset);
2117
+ border-bottom: 1px solid var(--color-divider);
2118
+ flex-shrink: 0;
2119
+ height: 28px;
2120
+ }
2121
+ .pane-header-actions {
2122
+ display: flex;
2123
+ align-items: center;
2124
+ gap: var(--space-1);
2125
+ }
2126
+ .pane-header-meta {
2127
+ display: flex;
2128
+ align-items: baseline;
2129
+ gap: var(--space-3);
2130
+ min-width: 0;
2131
+ }
2132
+ .pane-label {
2133
+ font-size: 11px;
2134
+ font-weight: 500;
2135
+ color: var(--color-text-muted);
2136
+ text-transform: uppercase;
2137
+ letter-spacing: 0.06em;
2138
+ }
2139
+ .pane-label-meta {
2140
+ font-size: 11px;
2141
+ font-family: var(--font-mono);
2142
+ color: var(--color-text-muted);
2143
+ }
2144
+
2145
+ /* Resizer */
2146
+ .resizer {
2147
+ width: 4px;
2148
+ cursor: col-resize;
2149
+ background: var(--color-divider);
2150
+ flex-shrink: 0;
2151
+ position: relative;
2152
+ transition: background var(--transition-interactive);
2153
+ z-index: 5;
2154
+ }
2155
+ .resizer:hover,
2156
+ .resizer.dragging {
2157
+ background: var(--color-primary);
2158
+ }
2159
+ .resizer::after {
2160
+ content: '';
2161
+ position: absolute;
2162
+ top: 0;
2163
+ left: -6px;
2164
+ right: -6px;
2165
+ bottom: 0;
2166
+ }
2167
+
2168
+ /* Editor container (CodeMirror) */
2169
+ .markdown-toolbar {
2170
+ display: flex;
2171
+ align-items: center;
2172
+ gap: var(--space-1);
2173
+ flex-wrap: wrap;
2174
+ padding: var(--space-1) var(--space-2);
2175
+ background: var(--color-surface);
2176
+ border-bottom: 1px solid var(--color-divider);
2177
+ flex-shrink: 0;
2178
+ }
2179
+
2180
+ .markdown-toolbar-btn {
2181
+ min-width: 36px;
2182
+ min-height: 28px;
2183
+ padding: 0;
2184
+ border-radius: var(--radius-sm);
2185
+ color: var(--color-text-muted);
2186
+ font-size: 11px;
2187
+ line-height: 1;
2188
+ }
2189
+
2190
+ .markdown-toolbar-btn svg {
2191
+ width: 14px;
2192
+ height: 14px;
2193
+ flex-shrink: 0;
2194
+ pointer-events: none;
2195
+ }
2196
+
2197
+ .markdown-toolbar-separator {
2198
+ width: 1px;
2199
+ height: 18px;
2200
+ background: var(--color-divider);
2201
+ margin: 0 2px;
2202
+ flex-shrink: 0;
2203
+ }
2204
+
2205
+ .markdown-toolbar-btn:hover {
2206
+ color: var(--color-text);
2207
+ background: var(--color-surface-offset);
2208
+ }
2209
+
2210
+ .markdown-toolbar-btn:active {
2211
+ transform: scale(0.95);
2212
+ }
2213
+
2214
+ .markdown-toolbar-btn:focus-visible {
2215
+ outline: 2px solid oklch(from var(--color-primary) l c h / 0.35);
2216
+ outline-offset: 1px;
2217
+ }
2218
+
2219
+ .editor-container {
2220
+ flex: 1;
2221
+ overflow: hidden;
2222
+ background: var(--color-bg);
2223
+ position: relative;
2224
+ }
2225
+
2226
+ .editor-container > .editor-loading {
2227
+ position: absolute;
2228
+ inset: 0;
2229
+ z-index: 2;
2230
+ background: var(--color-bg);
2231
+ }
2232
+
2233
+ .editor-container.is-loading-editor .cm-editor {
2234
+ visibility: hidden;
2235
+ }
2236
+
2237
+ .editor-container .cm-editor {
2238
+ height: 100%;
2239
+ font-family: var(--font-mono);
2240
+ font-size: 14px;
2241
+ }
2242
+ .editor-container .cm-editor .cm-scroller {
2243
+ overflow: auto;
2244
+ font-family: var(--font-mono);
2245
+ }
2246
+ .editor-container .cm-editor.cm-focused {
2247
+ outline: none;
2248
+ }
2249
+
2250
+ /* y-webrtc cursor styles */
2251
+ .cm-editor .cm-ySelectionInfo {
2252
+ font-family: var(--font-body);
2253
+ font-size: 11px;
2254
+ font-weight: 600;
2255
+ padding: 1px 4px;
2256
+ border-radius: 3px 3px 3px 0;
2257
+ opacity: 1;
2258
+ transition: opacity 0.3s;
2259
+ position: absolute;
2260
+ top: -1.2em;
2261
+ left: -1px;
2262
+ white-space: nowrap;
2263
+ z-index: 10;
2264
+ }
2265
+
2266
+ /* Preview body (contains preview + outline side by side) */
2267
+ .preview-body {
2268
+ display: flex;
2269
+ flex: 1;
2270
+ overflow: hidden;
2271
+ min-height: 0;
2272
+ position: relative;
2273
+ }
2274
+
2275
+ /* Preview container */
2276
+ .preview-container {
2277
+ flex: 1;
2278
+ overflow-y: auto;
2279
+ overflow-x: hidden;
2280
+ background: var(--color-bg);
2281
+ overscroll-behavior: contain;
2282
+ min-width: 0;
2283
+ }
2284
+
2285
+ .preview-content {
2286
+ padding: var(--space-6) var(--space-6) var(--space-12);
2287
+ max-width: 720px;
2288
+ margin: 0 auto;
2289
+ min-width: 0;
2290
+ overflow: hidden;
2291
+ position: relative;
2292
+ font-family: var(--font-body);
2293
+ font-size: var(--text-sm);
2294
+ line-height: 1.7;
2295
+ color: var(--color-text);
2296
+ }
2297
+ .preview-content[data-render-phase="shell"] {
2298
+ color: var(--color-text-muted);
2299
+ }
2300
+
2301
+ .preview-content.is-excalidraw-file-preview {
2302
+ display: flex;
2303
+ width: 100%;
2304
+ min-height: 100%;
2305
+ height: 100%;
2306
+ margin: 0;
2307
+ padding: var(--space-3);
2308
+ position: relative;
2309
+ box-sizing: border-box;
2310
+ max-width: none;
2311
+ }
2312
+
2313
+ .preview-content.is-plantuml-file-preview {
2314
+ width: 100%;
2315
+ min-height: 100%;
2316
+ max-width: none;
2317
+ }
2318
+
2319
+ .preview-content.is-mermaid-file-preview {
2320
+ width: 100%;
2321
+ min-height: 100%;
2322
+ max-width: none;
2323
+ }
2324
+
2325
+ .preview-content.is-mermaid-file-preview [data-preview-render-host="true"] {
2326
+ min-height: 100%;
2327
+ }
2328
+
2329
+ .preview-content.is-plantuml-file-preview [data-preview-render-host="true"] {
2330
+ min-height: 100%;
2331
+ }
2332
+
2333
+ .preview-content.is-excalidraw-file-preview [data-preview-render-host="true"] {
2334
+ display: flex;
2335
+ flex: 1;
2336
+ min-width: 0;
2337
+ min-height: 100%;
2338
+ }
2339
+
2340
+ .preview-content.is-mermaid-file-preview .mermaid-shell {
2341
+ margin: 0;
2342
+ min-height: 100%;
2343
+ }
2344
+
2345
+ .preview-content.is-plantuml-file-preview .plantuml-shell {
2346
+ margin: 0;
2347
+ min-height: 100%;
2348
+ }
2349
+
2350
+ .preview-content.is-excalidraw-file-preview .excalidraw-embed,
2351
+ .preview-content.is-excalidraw-file-preview .excalidraw-embed-placeholder {
2352
+ margin: 0;
2353
+ width: 100%;
2354
+ min-height: 100%;
2355
+ }
2356
+
2357
+ .preview-content.is-excalidraw-file-preview .excalidraw-embed {
2358
+ display: flex;
2359
+ flex-direction: column;
2360
+ height: 100%;
2361
+ }
2362
+
2363
+ .preview-content.is-excalidraw-file-preview .excalidraw-embed-placeholder {
2364
+ display: flex;
2365
+ align-items: stretch;
2366
+ }
2367
+
2368
+ .preview-content.is-excalidraw-file-preview .preview-shell {
2369
+ width: 100%;
2370
+ min-height: 100%;
2371
+ }
2372
+
2373
+ .preview-content.is-excalidraw-file-preview .excalidraw-embed-iframe {
2374
+ flex: 1;
2375
+ min-height: 0;
2376
+ height: 100% !important;
2377
+ }
2378
+
2379
+ .preview-content.is-excalidraw-file-preview .excalidraw-embed-resizer {
2380
+ display: none;
2381
+ }
2382
+
2383
+ .preview-content.is-excalidraw-file-preview .excalidraw-embed.is-maximized {
2384
+ position: absolute;
2385
+ inset: var(--space-3);
2386
+ margin: 0;
2387
+ z-index: 2;
2388
+ max-width: calc(100% - (var(--space-3) * 2));
2389
+ box-sizing: border-box;
2390
+ }
2391
+
2392
+ .preview-content.is-excalidraw-file-preview .excalidraw-embed.is-maximized .excalidraw-embed-iframe {
2393
+ height: 100% !important;
2394
+ }
2395
+
2396
+ .preview-shell {
2397
+ min-height: 60vh;
2398
+ display: flex;
2399
+ align-items: center;
2400
+ justify-content: center;
2401
+ font-size: var(--text-sm);
2402
+ color: var(--color-text-muted);
2403
+ }
2404
+
2405
+ /* ===== MARKDOWN PREVIEW STYLES ===== */
2406
+
2407
+ .preview-content h1 {
2408
+ font-size: var(--text-xl);
2409
+ font-weight: 700;
2410
+ margin: var(--space-8) 0 var(--space-4);
2411
+ padding-bottom: var(--space-2);
2412
+ border-bottom: 1px solid var(--color-divider);
2413
+ letter-spacing: -0.02em;
2414
+ }
2415
+ .preview-content h1:first-child {
2416
+ margin-top: 0;
2417
+ }
2418
+ .preview-content h2 {
2419
+ font-size: var(--text-lg);
2420
+ font-weight: 600;
2421
+ margin: var(--space-6) 0 var(--space-3);
2422
+ letter-spacing: -0.01em;
2423
+ }
2424
+ .preview-content h3 {
2425
+ font-size: var(--text-base);
2426
+ font-weight: 600;
2427
+ margin: var(--space-5) 0 var(--space-2);
2428
+ }
2429
+ .preview-content h4, .preview-content h5, .preview-content h6 {
2430
+ font-size: var(--text-sm);
2431
+ font-weight: 600;
2432
+ margin: var(--space-4) 0 var(--space-2);
2433
+ color: var(--color-text-muted);
2434
+ }
2435
+
2436
+ .preview-content p {
2437
+ margin-bottom: var(--space-4);
2438
+ max-width: 72ch;
2439
+ }
2440
+
2441
+ .preview-content p:has(> .excalidraw-embed-placeholder:only-child) {
2442
+ max-width: none;
2443
+ margin-bottom: 0;
2444
+ }
2445
+
2446
+ .preview-content p:has(> .video-embed-placeholder:only-child) {
2447
+ max-width: none;
2448
+ margin-bottom: 0;
2449
+ }
2450
+
2451
+ .preview-content p:has(> .plantuml-shell:only-child) {
2452
+ max-width: none;
2453
+ margin-bottom: 0;
2454
+ }
2455
+
2456
+ .preview-content a {
2457
+ color: var(--color-primary);
2458
+ text-decoration: none;
2459
+ border-bottom: 1px solid oklch(from var(--color-primary) l c h / 0.3);
2460
+ transition: border-color var(--transition-interactive);
2461
+ }
2462
+ .preview-content a:hover {
2463
+ border-bottom-color: var(--color-primary);
2464
+ }
2465
+
2466
+ .preview-content strong { font-weight: 600; }
2467
+ .preview-content em { font-style: italic; }
2468
+ .preview-content del { text-decoration: line-through; color: var(--color-text-muted); }
2469
+
2470
+ .preview-content ul,
2471
+ .preview-content ol {
2472
+ margin-bottom: var(--space-4);
2473
+ padding-left: var(--space-6);
2474
+ }
2475
+ .preview-content li {
2476
+ margin-bottom: var(--space-1);
2477
+ }
2478
+ .preview-content li > ul,
2479
+ .preview-content li > ol {
2480
+ margin-top: var(--space-1);
2481
+ margin-bottom: 0;
2482
+ }
2483
+
2484
+ /* Task list checkboxes */
2485
+ .preview-content .task-list-item {
2486
+ list-style: none;
2487
+ margin-left: calc(var(--space-6) * -1);
2488
+ padding-left: var(--space-1);
2489
+ }
2490
+ .preview-content .task-list-item input[type="checkbox"] {
2491
+ margin-right: var(--space-2);
2492
+ accent-color: var(--color-primary);
2493
+ vertical-align: middle;
2494
+ }
2495
+
2496
+ /* Blockquote */
2497
+ .preview-content blockquote {
2498
+ margin: var(--space-4) 0;
2499
+ padding: var(--space-3) var(--space-5);
2500
+ border-left: 3px solid var(--color-primary);
2501
+ background: var(--color-surface);
2502
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
2503
+ color: var(--color-text-muted);
2504
+ }
2505
+ .preview-content blockquote p:last-child {
2506
+ margin-bottom: 0;
2507
+ }
2508
+
2509
+ /* Inline code */
2510
+ .preview-content code {
2511
+ font-family: var(--font-mono);
2512
+ font-size: 0.875em;
2513
+ background: var(--color-surface-offset);
2514
+ padding: 2px 6px;
2515
+ border-radius: var(--radius-sm);
2516
+ color: var(--color-primary);
2517
+ }
2518
+
2519
+ /* Code blocks */
2520
+ .preview-content pre {
2521
+ margin: var(--space-4) 0;
2522
+ border-radius: var(--radius-lg);
2523
+ overflow-x: auto;
2524
+ -webkit-overflow-scrolling: touch;
2525
+ border: 1px solid var(--color-border);
2526
+ max-width: 100%;
2527
+ background: var(--color-surface);
2528
+ }
2529
+ .preview-content pre code {
2530
+ display: block;
2531
+ padding: var(--space-4);
2532
+ background: none;
2533
+ color: var(--color-text);
2534
+ font-size: 13px;
2535
+ line-height: 1.6;
2536
+ white-space: pre;
2537
+ word-wrap: normal;
2538
+ overflow-wrap: normal;
2539
+ width: fit-content;
2540
+ min-width: 100%;
2541
+ }
2542
+
2543
+ /* Tables */
2544
+ .preview-content .table-wrapper {
2545
+ margin: var(--space-4) 0;
2546
+ border: 1px solid var(--color-border);
2547
+ border-radius: var(--radius-md);
2548
+ overflow-x: auto;
2549
+ -webkit-overflow-scrolling: touch;
2550
+ }
2551
+ .preview-content table {
2552
+ width: 100%;
2553
+ min-width: 100%;
2554
+ border-collapse: collapse;
2555
+ white-space: nowrap;
2556
+ }
2557
+ .preview-content th,
2558
+ .preview-content td {
2559
+ padding: var(--space-2) var(--space-3);
2560
+ text-align: left;
2561
+ border-bottom: 1px solid var(--color-divider);
2562
+ font-size: var(--text-sm);
2563
+ }
2564
+ .preview-content th {
2565
+ background: var(--color-surface-offset);
2566
+ font-weight: 600;
2567
+ font-size: var(--text-xs);
2568
+ text-transform: uppercase;
2569
+ letter-spacing: 0.03em;
2570
+ color: var(--color-text-muted);
2571
+ }
2572
+ .preview-content tr:last-child td {
2573
+ border-bottom: none;
2574
+ }
2575
+ .preview-content tr:hover td {
2576
+ background: var(--color-surface-offset);
2577
+ }
2578
+
2579
+ /* Horizontal rule */
2580
+ .preview-content hr {
2581
+ border: none;
2582
+ height: 1px;
2583
+ background: var(--color-divider);
2584
+ margin: var(--space-8) 0;
2585
+ }
2586
+
2587
+ /* Images */
2588
+ .preview-content img {
2589
+ max-width: 100%;
2590
+ height: auto;
2591
+ border-radius: var(--radius-md);
2592
+ margin: var(--space-4) 0;
2593
+ }
2594
+
2595
+ .preview-content .video-embed-shell {
2596
+ display: block;
2597
+ background: #000;
2598
+ }
2599
+
2600
+ .preview-content .video-embed,
2601
+ .preview-content .video-embed-placeholder {
2602
+ display: block;
2603
+ transition: box-shadow 0.18s ease;
2604
+ }
2605
+
2606
+ .preview-content .video-embed-placeholder.is-hydrated {
2607
+ visibility: hidden;
2608
+ }
2609
+
2610
+ .video-embed-overlay-root {
2611
+ position: absolute;
2612
+ inset: 0;
2613
+ pointer-events: none;
2614
+ z-index: 1;
2615
+ }
2616
+
2617
+ .preview-content .video-embed-frame,
2618
+ .preview-content .video-embed,
2619
+ .preview-content .video-embed-placeholder {
2620
+ width: 100%;
2621
+ max-width: 100%;
2622
+ min-width: 0;
2623
+ }
2624
+
2625
+ .preview-content .video-embed-frame {
2626
+ height: 100%;
2627
+ }
2628
+
2629
+ .preview-content .video-embed-placeholder-card {
2630
+ border-radius: 0;
2631
+ min-height: 100%;
2632
+ }
2633
+
2634
+ .preview-content .video-embed-placeholder-copy {
2635
+ display: grid;
2636
+ gap: 2px;
2637
+ }
2638
+
2639
+ .preview-content .video-embed-iframe,
2640
+ .preview-content .video-embed-player {
2641
+ display: block;
2642
+ width: 100%;
2643
+ height: 100%;
2644
+ max-width: 100%;
2645
+ border: none;
2646
+ background: #000;
2647
+ }
2648
+
2649
+ .preview-content .video-embed-player {
2650
+ object-fit: contain;
2651
+ }
2652
+
2653
+ /* Mermaid diagrams */
2654
+ .preview-content .mermaid-shell {
2655
+ display: grid;
2656
+ gap: 0;
2657
+ }
2658
+ .preview-content .mermaid-placeholder-card {
2659
+ border-radius: 0;
2660
+ }
2661
+ .preview-content .mermaid-toolbar {
2662
+ justify-content: flex-end;
2663
+ }
2664
+ .preview-content .mermaid-zoom-btn {
2665
+ min-width: 32px;
2666
+ line-height: 1.5;
2667
+ }
2668
+ .preview-content .mermaid-zoom-btn:disabled {
2669
+ opacity: 0.5;
2670
+ cursor: not-allowed;
2671
+ }
2672
+ .preview-content .mermaid-frame {
2673
+ max-width: none;
2674
+ }
2675
+ .preview-content .mermaid-frame.is-pannable {
2676
+ cursor: grab;
2677
+ }
2678
+ .preview-content .mermaid-frame.is-dragging {
2679
+ cursor: grabbing;
2680
+ user-select: none;
2681
+ }
2682
+ .preview-content .mermaid-frame svg {
2683
+ display: block;
2684
+ }
2685
+ body.mermaid-maximized-open {
2686
+ overflow: hidden;
2687
+ }
2688
+ body.mermaid-maximized-open::before {
2689
+ content: '';
2690
+ position: fixed;
2691
+ inset: 0;
2692
+ background: oklch(0.1 0 0 / 0.42);
2693
+ backdrop-filter: blur(2px);
2694
+ z-index: 170;
2695
+ }
2696
+ .preview-content .mermaid-shell.is-maximized {
2697
+ position: fixed;
2698
+ inset: var(--space-4);
2699
+ width: auto;
2700
+ z-index: 171;
2701
+ margin: 0;
2702
+ max-width: none;
2703
+ box-shadow: var(--shadow-lg);
2704
+ grid-template-rows: auto minmax(0, 1fr);
2705
+ }
2706
+ .preview-content .mermaid-shell.is-maximized .mermaid-frame {
2707
+ max-height: none;
2708
+ height: 100%;
2709
+ }
2710
+
2711
+ /* PlantUML diagrams */
2712
+ .preview-content .plantuml-shell,
2713
+ .plantuml-maximized-root .plantuml-shell {
2714
+ display: grid;
2715
+ gap: 0;
2716
+ }
2717
+ .preview-content .plantuml-shell,
2718
+ .plantuml-maximized-root .plantuml-shell {
2719
+ min-width: 0;
2720
+ width: 100%;
2721
+ }
2722
+ .preview-content .plantuml-placeholder-card,
2723
+ .plantuml-maximized-root .plantuml-placeholder-card {
2724
+ border-radius: 0;
2725
+ }
2726
+ .preview-content .plantuml-tool-btn:disabled,
2727
+ .plantuml-maximized-root .plantuml-tool-btn:disabled {
2728
+ opacity: 0.5;
2729
+ cursor: not-allowed;
2730
+ }
2731
+ .preview-content .plantuml-toolbar,
2732
+ .plantuml-maximized-root .plantuml-toolbar {
2733
+ justify-content: flex-end;
2734
+ }
2735
+ .preview-content .plantuml-tool-btn,
2736
+ .plantuml-maximized-root .plantuml-tool-btn {
2737
+ min-width: 32px;
2738
+ line-height: 1.5;
2739
+ }
2740
+ .preview-content .plantuml-frame,
2741
+ .plantuml-maximized-root .plantuml-frame {
2742
+ max-width: 100%;
2743
+ }
2744
+ .preview-content .plantuml-frame.is-pannable,
2745
+ .plantuml-maximized-root .plantuml-frame.is-pannable {
2746
+ cursor: grab;
2747
+ }
2748
+ .preview-content .plantuml-frame.is-dragging,
2749
+ .plantuml-maximized-root .plantuml-frame.is-dragging {
2750
+ cursor: grabbing;
2751
+ user-select: none;
2752
+ }
2753
+ .preview-content .plantuml-frame svg,
2754
+ .plantuml-maximized-root .plantuml-frame svg {
2755
+ display: block;
2756
+ }
2757
+ body.plantuml-maximized-open {
2758
+ overflow: hidden;
2759
+ }
2760
+ body.plantuml-maximized-open::before {
2761
+ content: '';
2762
+ position: fixed;
2763
+ inset: 0;
2764
+ background: oklch(0.1 0 0 / 0.42);
2765
+ backdrop-filter: blur(2px);
2766
+ z-index: 170;
2767
+ }
2768
+ .plantuml-maximized-root {
2769
+ position: fixed;
2770
+ inset: 0;
2771
+ pointer-events: none;
2772
+ z-index: 171;
2773
+ }
2774
+ .preview-content .plantuml-shell.is-maximized,
2775
+ .plantuml-maximized-root .plantuml-shell.is-maximized {
2776
+ position: fixed;
2777
+ inset: var(--space-4);
2778
+ width: auto;
2779
+ z-index: 171;
2780
+ margin: 0;
2781
+ max-width: none;
2782
+ box-shadow: var(--shadow-lg);
2783
+ pointer-events: auto;
2784
+ grid-template-rows: auto minmax(0, 1fr);
2785
+ }
2786
+ .preview-content .plantuml-shell.is-maximized .plantuml-frame,
2787
+ .plantuml-maximized-root .plantuml-shell.is-maximized .plantuml-frame {
2788
+ max-height: none;
2789
+ height: 100%;
2790
+ }
2791
+
2792
+ /* ===== OUTLINE PANEL ===== */
2793
+
2794
+ .pane-header-btn {
2795
+ padding: 2px 6px;
2796
+ border-radius: var(--radius-sm);
2797
+ display: flex;
2798
+ align-items: center;
2799
+ gap: var(--space-1);
2800
+ font-size: 11px;
2801
+ color: var(--color-text-muted);
2802
+ white-space: nowrap;
2803
+ transition: color var(--transition-interactive), background var(--transition-interactive);
2804
+ }
2805
+ .pane-header-btn:hover {
2806
+ color: var(--color-text);
2807
+ background: var(--color-surface-dynamic);
2808
+ }
2809
+ .pane-header-btn.active {
2810
+ color: var(--color-primary);
2811
+ background: oklch(from var(--color-primary) l c h / 0.1);
2812
+ }
2813
+
2814
+ /* ===== COMMENTS ===== */
2815
+
2816
+ .comments-drawer {
2817
+ width: min(300px, 34vw);
2818
+ min-width: 240px;
2819
+ border-left: 1px solid var(--color-divider);
2820
+ background:
2821
+ linear-gradient(180deg, oklch(from var(--color-comment) l c h / 0.035), transparent 120px),
2822
+ color-mix(in srgb, var(--color-surface) 96%, var(--color-comment) 4%);
2823
+ display: flex;
2824
+ flex-direction: column;
2825
+ min-height: 0;
2826
+ box-shadow: inset 1px 0 0 oklch(from var(--color-comment) l c h / 0.06);
2827
+ }
2828
+
2829
+ .comments-drawer-header {
2830
+ padding: var(--space-4);
2831
+ border-bottom: 1px solid var(--color-divider);
2832
+ background: color-mix(in srgb, var(--color-surface) 97%, var(--color-comment) 3%);
2833
+ }
2834
+
2835
+ .comments-drawer-title {
2836
+ font-size: 12px;
2837
+ font-weight: 700;
2838
+ letter-spacing: 0.06em;
2839
+ text-transform: uppercase;
2840
+ color: var(--color-comment);
2841
+ }
2842
+
2843
+ .comments-drawer-empty {
2844
+ padding: var(--space-4);
2845
+ color: var(--color-text-muted);
2846
+ font-size: 12px;
2847
+ }
2848
+
2849
+ .comments-drawer-list {
2850
+ display: flex;
2851
+ flex-direction: column;
2852
+ gap: var(--space-3);
2853
+ overflow: auto;
2854
+ padding: var(--space-3);
2855
+ }
2856
+
2857
+ .comments-drawer-item {
2858
+ width: 100%;
2859
+ text-align: left;
2860
+ border: 1px solid color-mix(in srgb, var(--color-divider) 90%, var(--color-comment) 10%);
2861
+ border-radius: calc(var(--radius-lg) + 4px);
2862
+ padding: var(--space-4);
2863
+ background:
2864
+ linear-gradient(180deg, oklch(from var(--color-comment) l c h / 0.028), transparent 70%),
2865
+ color-mix(in srgb, var(--color-surface-2) 95%, var(--color-comment) 5%);
2866
+ transition: transform 140ms ease, border-color var(--transition-interactive), background var(--transition-interactive), box-shadow var(--transition-interactive);
2867
+ }
2868
+
2869
+ .comments-drawer-item:hover {
2870
+ transform: translateY(-1px);
2871
+ border-color: oklch(from var(--color-comment) l c h / 0.18);
2872
+ background:
2873
+ linear-gradient(180deg, oklch(from var(--color-comment) l c h / 0.042), transparent 70%),
2874
+ color-mix(in srgb, var(--color-surface-2) 92%, var(--color-comment) 8%);
2875
+ box-shadow: var(--shadow-md);
2876
+ }
2877
+
2878
+ .comments-drawer-item.is-active {
2879
+ border-color: color-mix(in srgb, var(--color-border) 78%, var(--color-comment) 22%);
2880
+ background:
2881
+ linear-gradient(180deg, oklch(from var(--color-comment) l c h / 0.055), transparent 72%),
2882
+ color-mix(in srgb, var(--color-surface-2) 90%, var(--color-comment) 10%);
2883
+ box-shadow: 0 0 0 1px oklch(from var(--color-comment) l c h / 0.14);
2884
+ }
2885
+
2886
+ .comments-drawer-item-header,
2887
+ .comments-drawer-item-footer {
2888
+ display: flex;
2889
+ align-items: center;
2890
+ justify-content: space-between;
2891
+ gap: var(--space-2);
2892
+ }
2893
+
2894
+ .comments-drawer-item-title {
2895
+ font-size: 11px;
2896
+ font-weight: 700;
2897
+ letter-spacing: 0.05em;
2898
+ text-transform: uppercase;
2899
+ color: var(--color-comment);
2900
+ }
2901
+
2902
+ .comments-drawer-item-count {
2903
+ min-width: 20px;
2904
+ height: 20px;
2905
+ border-radius: var(--radius-full);
2906
+ display: inline-flex;
2907
+ align-items: center;
2908
+ justify-content: center;
2909
+ background: var(--color-comment-soft);
2910
+ color: var(--color-comment);
2911
+ font-size: 11px;
2912
+ font-weight: 700;
2913
+ border: 1px solid oklch(from var(--color-comment) l c h / 0.18);
2914
+ }
2915
+
2916
+ .comments-drawer-item-quote {
2917
+ margin: var(--space-3) 0;
2918
+ padding: var(--space-3);
2919
+ border-radius: var(--radius-lg);
2920
+ border: 1px solid color-mix(in srgb, var(--color-divider) 90%, var(--color-comment) 10%);
2921
+ background: color-mix(in srgb, var(--color-surface-offset) 90%, var(--color-comment) 10%);
2922
+ color: var(--color-text-muted);
2923
+ font-family: var(--font-mono);
2924
+ font-size: 11.5px;
2925
+ line-height: 1.65;
2926
+ white-space: pre;
2927
+ overflow-x: auto;
2928
+ overflow-y: hidden;
2929
+ word-break: normal;
2930
+ text-wrap: nowrap;
2931
+ scrollbar-width: thin;
2932
+ padding-bottom: calc(var(--space-2) + 2px);
2933
+ }
2934
+
2935
+ .comments-drawer-item-footer {
2936
+ font-size: 11px;
2937
+ color: var(--color-text-muted);
2938
+ font-weight: 600;
2939
+ letter-spacing: 0.01em;
2940
+ }
2941
+
2942
+ .comment-editor-layer,
2943
+ .comment-preview-layer,
2944
+ .comment-preview-highlights {
2945
+ position: absolute;
2946
+ inset: 0;
2947
+ pointer-events: none;
2948
+ }
2949
+
2950
+ .comment-editor-badge,
2951
+ .comment-preview-badge {
2952
+ position: absolute;
2953
+ min-width: 28px;
2954
+ height: 24px;
2955
+ border-radius: var(--radius-full);
2956
+ background: color-mix(in srgb, var(--color-surface) 68%, var(--color-comment) 32%);
2957
+ color: var(--color-comment);
2958
+ border: 1px solid oklch(from var(--color-comment) l c h / 0.24);
2959
+ box-shadow: var(--shadow-md);
2960
+ display: inline-flex;
2961
+ align-items: center;
2962
+ justify-content: center;
2963
+ gap: 4px;
2964
+ padding: 0 7px;
2965
+ font-size: 10px;
2966
+ font-weight: 700;
2967
+ pointer-events: auto;
2968
+ transition: transform 140ms ease, box-shadow 140ms ease, background-color 140ms ease, border-color 140ms ease;
2969
+ }
2970
+
2971
+ .comment-editor-badge.is-active,
2972
+ .comment-preview-badge.is-active {
2973
+ background: color-mix(in srgb, var(--color-surface) 42%, var(--color-comment) 58%);
2974
+ border-color: oklch(from var(--color-comment) l c h / 0.32);
2975
+ color: var(--color-text-inverse);
2976
+ }
2977
+
2978
+ .comment-marker-icon {
2979
+ display: inline-flex;
2980
+ width: 12px;
2981
+ height: 12px;
2982
+ flex: 0 0 auto;
2983
+ }
2984
+
2985
+ .comment-marker-icon svg {
2986
+ width: 100%;
2987
+ height: 100%;
2988
+ display: block;
2989
+ }
2990
+
2991
+ .comment-marker-count {
2992
+ line-height: 1;
2993
+ }
2994
+
2995
+ .comment-editor-badge:hover,
2996
+ .comment-preview-badge:hover,
2997
+ .comment-selection-chip:hover {
2998
+ transform: translateY(-1px) scale(1.04);
2999
+ box-shadow: var(--shadow-lg);
3000
+ }
3001
+
3002
+ .comment-selection-chip {
3003
+ position: absolute;
3004
+ border-radius: var(--radius-full);
3005
+ padding: 6px 10px;
3006
+ min-width: 96px;
3007
+ background: color-mix(in srgb, var(--color-surface) 25%, var(--color-comment) 75%);
3008
+ color: var(--color-text-inverse);
3009
+ border: 1px solid oklch(from var(--color-comment) l c h / 0.22);
3010
+ font-size: 11px;
3011
+ font-weight: 700;
3012
+ letter-spacing: 0.02em;
3013
+ text-align: center;
3014
+ box-shadow: var(--shadow-md);
3015
+ pointer-events: auto;
3016
+ transition: transform 140ms ease, box-shadow 140ms ease;
3017
+ }
3018
+
3019
+ .comment-preview-highlight {
3020
+ position: absolute;
3021
+ border-radius: 6px;
3022
+ background: var(--color-comment-soft);
3023
+ border: 1px solid oklch(from var(--color-comment) l c h / 0.16);
3024
+ }
3025
+
3026
+ .comment-card-root {
3027
+ position: fixed;
3028
+ z-index: 50;
3029
+ }
3030
+
3031
+ .comment-card {
3032
+ width: min(100%, 360px);
3033
+ border-radius: 18px;
3034
+ border: 1px solid color-mix(in srgb, var(--color-border) 82%, var(--color-comment) 18%);
3035
+ background: color-mix(in srgb, var(--color-surface) 94%, var(--color-comment) 6%);
3036
+ box-shadow: 0 20px 56px oklch(0 0 0 / 0.24);
3037
+ padding: var(--space-4);
3038
+ display: flex;
3039
+ flex-direction: column;
3040
+ gap: var(--space-3);
3041
+ animation: comment-card-in 140ms cubic-bezier(0.16, 1, 0.3, 1);
3042
+ }
3043
+
3044
+ .comment-card-header,
3045
+ .comment-thread-card-header,
3046
+ .comment-message-card-meta,
3047
+ .comment-card-actions {
3048
+ display: flex;
3049
+ align-items: center;
3050
+ gap: var(--space-2);
3051
+ }
3052
+
3053
+ .comment-card-header,
3054
+ .comment-thread-card-header,
3055
+ .comment-card-actions {
3056
+ justify-content: space-between;
3057
+ }
3058
+
3059
+ .comment-card-title {
3060
+ font-size: 15px;
3061
+ font-weight: 700;
3062
+ letter-spacing: -0.01em;
3063
+ }
3064
+
3065
+ .comment-card-meta {
3066
+ margin-top: 2px;
3067
+ color: var(--color-comment);
3068
+ font-size: 11px;
3069
+ font-weight: 700;
3070
+ letter-spacing: 0.05em;
3071
+ text-transform: uppercase;
3072
+ }
3073
+
3074
+ .comment-card-close,
3075
+ .comment-thread-card-action {
3076
+ padding: 5px 8px;
3077
+ border-radius: var(--radius-full);
3078
+ font-size: 11px;
3079
+ font-weight: 700;
3080
+ color: var(--color-text-muted);
3081
+ background: color-mix(in srgb, var(--color-surface-offset) 88%, var(--color-comment) 12%);
3082
+ border: 1px solid transparent;
3083
+ transition: color var(--transition-interactive), background var(--transition-interactive), border-color var(--transition-interactive);
3084
+ }
3085
+
3086
+ .comment-card-close:hover,
3087
+ .comment-thread-card-action:hover {
3088
+ color: var(--color-text);
3089
+ border-color: oklch(from var(--color-comment) l c h / 0.16);
3090
+ }
3091
+
3092
+ .comment-thread-card-action.is-active {
3093
+ color: var(--color-text);
3094
+ background: color-mix(in srgb, var(--color-surface-offset) 72%, var(--color-comment) 28%);
3095
+ border-color: oklch(from var(--color-comment) l c h / 0.2);
3096
+ }
3097
+
3098
+ .comment-thread-card-action.is-danger {
3099
+ color: var(--color-error);
3100
+ }
3101
+
3102
+ .comment-card-quote,
3103
+ .comment-thread-card-excerpt {
3104
+ font-size: 12px;
3105
+ color: var(--color-text-muted);
3106
+ background: color-mix(in srgb, var(--color-surface-offset) 90%, var(--color-comment) 10%);
3107
+ border-radius: var(--radius-md);
3108
+ padding: var(--space-2) var(--space-3);
3109
+ border: 1px solid color-mix(in srgb, var(--color-divider) 88%, var(--color-comment) 12%);
3110
+ }
3111
+
3112
+ .comment-card-quote {
3113
+ white-space: pre;
3114
+ overflow-x: auto;
3115
+ overflow-y: hidden;
3116
+ word-break: normal;
3117
+ text-wrap: nowrap;
3118
+ font-family: var(--font-mono);
3119
+ font-size: 11.5px;
3120
+ line-height: 1.65;
3121
+ padding-bottom: calc(var(--space-2) + 2px);
3122
+ scrollbar-width: thin;
3123
+ }
3124
+
3125
+ .comment-card-form,
3126
+ .comment-reply-form {
3127
+ display: flex;
3128
+ flex-direction: column;
3129
+ gap: var(--space-3);
3130
+ }
3131
+
3132
+ .comment-card-input {
3133
+ resize: vertical;
3134
+ min-height: 88px;
3135
+ }
3136
+
3137
+ .comment-thread-card {
3138
+ display: flex;
3139
+ flex-direction: column;
3140
+ gap: var(--space-2);
3141
+ padding-top: var(--space-3);
3142
+ border-top: 1px solid var(--color-divider);
3143
+ }
3144
+
3145
+ .comment-thread-card-author,
3146
+ .comment-message-card-author {
3147
+ font-size: 12px;
3148
+ font-weight: 700;
3149
+ }
3150
+
3151
+ .comment-thread-card-time,
3152
+ .comment-message-card-time {
3153
+ font-size: 11px;
3154
+ color: var(--color-text-faint);
3155
+ }
3156
+
3157
+ .comment-thread-card-actions {
3158
+ display: inline-flex;
3159
+ gap: var(--space-1);
3160
+ margin-left: auto;
3161
+ }
3162
+
3163
+ .comment-message-card {
3164
+ border-radius: var(--radius-md);
3165
+ background: color-mix(in srgb, var(--color-surface-2) 92%, var(--color-comment) 8%);
3166
+ border: 1px solid color-mix(in srgb, var(--color-divider) 90%, var(--color-comment) 10%);
3167
+ padding: var(--space-2) var(--space-3);
3168
+ }
3169
+
3170
+ .comment-message-card-body {
3171
+ margin-top: var(--space-1);
3172
+ font-size: 12px;
3173
+ }
3174
+
3175
+ @keyframes comment-card-in {
3176
+ from {
3177
+ opacity: 0;
3178
+ transform: translateY(6px) scale(0.98);
3179
+ }
3180
+ to {
3181
+ opacity: 1;
3182
+ transform: translateY(0) scale(1);
3183
+ }
3184
+ }
3185
+
3186
+ /* ===== BACKLINKS PANEL ===== */
3187
+
3188
+ .backlinks-panel {
3189
+ border-top: 1px solid var(--color-divider);
3190
+ margin-top: var(--space-6);
3191
+ padding: 0 var(--space-4);
3192
+ }
3193
+ .backlinks-panel.hidden {
3194
+ display: none;
3195
+ }
3196
+ .backlinks-header {
3197
+ display: flex;
3198
+ align-items: center;
3199
+ gap: var(--space-2);
3200
+ padding: var(--space-3) 0;
3201
+ cursor: pointer;
3202
+ user-select: none;
3203
+ font-size: var(--text-sm);
3204
+ font-weight: 600;
3205
+ color: var(--color-text-muted);
3206
+ transition: color var(--transition-interactive);
3207
+ }
3208
+ .backlinks-header:hover {
3209
+ color: var(--color-text);
3210
+ }
3211
+ .backlinks-header-empty {
3212
+ cursor: default;
3213
+ opacity: 0.5;
3214
+ }
3215
+ .backlinks-header-empty:hover {
3216
+ color: var(--color-text-muted);
3217
+ }
3218
+ .backlinks-chevron {
3219
+ flex-shrink: 0;
3220
+ transition: transform var(--transition-interactive);
3221
+ }
3222
+ .backlinks-panel.expanded .backlinks-chevron {
3223
+ transform: rotate(90deg);
3224
+ }
3225
+ .backlinks-toggle {
3226
+ flex: 1;
3227
+ }
3228
+ .backlinks-count {
3229
+ font-size: var(--text-xs);
3230
+ font-weight: 600;
3231
+ color: var(--color-primary);
3232
+ background: oklch(from var(--color-primary) l c h / 0.12);
3233
+ border-radius: var(--radius-full);
3234
+ padding: 1px 8px;
3235
+ min-width: 0;
3236
+ }
3237
+ .backlinks-count:empty {
3238
+ display: none;
3239
+ }
3240
+ .backlinks-body {
3241
+ overflow: hidden;
3242
+ max-height: 0;
3243
+ transition: max-height 200ms ease;
3244
+ }
3245
+ .backlinks-panel.expanded .backlinks-body {
3246
+ max-height: 600px;
3247
+ overflow-y: auto;
3248
+ }
3249
+ .backlinks-list {
3250
+ padding-bottom: var(--space-4);
3251
+ display: flex;
3252
+ flex-direction: column;
3253
+ gap: var(--space-2);
3254
+ }
3255
+ .backlink-item {
3256
+ display: block;
3257
+ width: 100%;
3258
+ text-align: left;
3259
+ padding: var(--space-3);
3260
+ border-radius: var(--radius-md);
3261
+ border: 1px solid var(--color-divider);
3262
+ background: var(--color-surface);
3263
+ cursor: pointer;
3264
+ transition: border-color var(--transition-interactive), background var(--transition-interactive);
3265
+ }
3266
+ .backlink-item:hover {
3267
+ border-color: var(--color-primary);
3268
+ background: oklch(from var(--color-primary) l c h / 0.04);
3269
+ }
3270
+ .backlink-item:focus-visible {
3271
+ outline: none;
3272
+ box-shadow: 0 0 0 2px oklch(from var(--color-primary) l c h / 0.45);
3273
+ }
3274
+ .backlink-file-name {
3275
+ display: flex;
3276
+ align-items: center;
3277
+ gap: var(--space-2);
3278
+ font-size: var(--text-sm);
3279
+ font-weight: 600;
3280
+ color: var(--color-text);
3281
+ margin-bottom: var(--space-1);
3282
+ }
3283
+ .backlink-icon {
3284
+ flex-shrink: 0;
3285
+ color: var(--color-text-muted);
3286
+ }
3287
+ .backlink-dir {
3288
+ font-size: var(--text-xs);
3289
+ font-weight: 400;
3290
+ color: var(--color-text-faint);
3291
+ margin-left: auto;
3292
+ }
3293
+ .backlink-context {
3294
+ font-size: var(--text-xs);
3295
+ color: var(--color-text-muted);
3296
+ line-height: 1.6;
3297
+ padding-left: 22px;
3298
+ overflow: hidden;
3299
+ text-overflow: ellipsis;
3300
+ white-space: nowrap;
3301
+ }
3302
+ .backlink-more {
3303
+ font-style: italic;
3304
+ color: var(--color-text-faint);
3305
+ }
3306
+
3307
+ .outline-panel {
3308
+ width: 220px;
3309
+ flex-shrink: 0;
3310
+ border-left: 1px solid var(--color-divider);
3311
+ background: var(--color-surface-offset);
3312
+ display: flex;
3313
+ flex-direction: column;
3314
+ overflow: hidden;
3315
+ transition: width 0.2s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.15s ease;
3316
+ }
3317
+ .outline-panel.hidden {
3318
+ width: 0;
3319
+ border-left: none;
3320
+ opacity: 0;
3321
+ pointer-events: none;
3322
+ }
3323
+
3324
+ .outline-header {
3325
+ padding: var(--space-2) var(--space-3);
3326
+ border-bottom: 1px solid var(--color-divider);
3327
+ flex-shrink: 0;
3328
+ }
3329
+ .outline-title {
3330
+ font-size: 11px;
3331
+ font-weight: 600;
3332
+ text-transform: uppercase;
3333
+ letter-spacing: 0.05em;
3334
+ color: var(--color-text-muted);
3335
+ }
3336
+
3337
+ .outline-nav {
3338
+ flex: 1;
3339
+ overflow-y: auto;
3340
+ overflow-x: hidden;
3341
+ padding: var(--space-2) 0;
3342
+ }
3343
+ .outline-nav::-webkit-scrollbar {
3344
+ width: 4px;
3345
+ }
3346
+ .outline-nav::-webkit-scrollbar-thumb {
3347
+ background: var(--color-surface-dynamic);
3348
+ border-radius: var(--radius-full);
3349
+ }
3350
+
3351
+ .outline-item {
3352
+ display: block;
3353
+ width: 100%;
3354
+ text-align: left;
3355
+ padding: 3px var(--space-3);
3356
+ font-size: 12px;
3357
+ line-height: 1.5;
3358
+ color: var(--color-text-muted);
3359
+ background: none;
3360
+ border: none;
3361
+ border-left: 2px solid transparent;
3362
+ cursor: pointer;
3363
+ white-space: nowrap;
3364
+ overflow: hidden;
3365
+ text-overflow: ellipsis;
3366
+ transition: color var(--transition-interactive), border-color var(--transition-interactive), background var(--transition-interactive);
3367
+ font-family: var(--font-body);
3368
+ }
3369
+ .outline-item:hover {
3370
+ color: var(--color-text);
3371
+ background: var(--color-surface-dynamic);
3372
+ }
3373
+ .outline-item.active {
3374
+ color: var(--color-primary);
3375
+ border-left-color: var(--color-primary);
3376
+ background: oklch(from var(--color-primary) l c h / 0.06);
3377
+ }
3378
+
3379
+ .outline-item[data-level="1"] { padding-left: var(--space-3); font-weight: 600; }
3380
+ .outline-item[data-level="2"] { padding-left: calc(var(--space-3) + 12px); }
3381
+ .outline-item[data-level="3"] { padding-left: calc(var(--space-3) + 24px); font-size: 11px; }
3382
+ .outline-item[data-level="4"] { padding-left: calc(var(--space-3) + 36px); font-size: 11px; }
3383
+ .outline-item[data-level="5"] { padding-left: calc(var(--space-3) + 48px); font-size: 11px; }
3384
+ .outline-item[data-level="6"] { padding-left: calc(var(--space-3) + 60px); font-size: 11px; }
3385
+
3386
+ .outline-empty {
3387
+ padding: var(--space-4) var(--space-3);
3388
+ font-size: 12px;
3389
+ color: var(--color-text-faint);
3390
+ font-style: italic;
3391
+ }
3392
+
3393
+
3394
+ /* ===== VIEW MODES ===== */
3395
+
3396
+ .editor-layout[data-view="editor"] .preview-pane,
3397
+ .editor-layout[data-view="editor"] .resizer {
3398
+ display: none;
3399
+ }
3400
+ .editor-layout[data-view="preview"] .editor-pane,
3401
+ .editor-layout[data-view="preview"] .resizer {
3402
+ display: none;
3403
+ }
3404
+ .editor-layout[data-view="preview"] .preview-pane {
3405
+ flex: 1;
3406
+ }
3407
+ .editor-layout[data-view="preview"] .preview-content {
3408
+ max-width: 1080px;
3409
+ }
3410
+ .editor-layout[data-view="preview"] .preview-content.is-excalidraw-file-preview {
3411
+ max-width: none;
3412
+ }
3413
+ .editor-layout[data-view="preview"] .preview-content.is-mermaid-file-preview {
3414
+ max-width: none;
3415
+ }
3416
+ .editor-layout[data-view="preview"] .preview-content.is-plantuml-file-preview {
3417
+ max-width: none;
3418
+ }
3419
+ .editor-layout[data-view="preview"] .preview-content p {
3420
+ max-width: 84ch;
3421
+ }
3422
+
3423
+ .editor-layout[data-view="preview"] .preview-content p:has(> .excalidraw-embed-placeholder:only-child) {
3424
+ max-width: none;
3425
+ }
3426
+
3427
+ .editor-layout[data-view="preview"] .preview-content p:has(> .video-embed-placeholder:only-child) {
3428
+ max-width: none;
3429
+ }
3430
+
3431
+ .editor-layout[data-view="preview"] .preview-content p:has(> .mermaid-shell:only-child) {
3432
+ max-width: none;
3433
+ }
3434
+
3435
+ .editor-layout[data-view="preview"] .preview-content p:has(> .plantuml-shell:only-child) {
3436
+ max-width: none;
3437
+ }
3438
+ .editor-layout[data-view="editor"] .editor-pane {
3439
+ flex: 1;
3440
+ }
3441
+
3442
+
3443
+ /* ===== TOAST ===== */
3444
+
3445
+ .toast-container {
3446
+ position: fixed;
3447
+ bottom: var(--space-4);
3448
+ right: var(--space-4);
3449
+ display: flex;
3450
+ flex-direction: column;
3451
+ gap: var(--space-2);
3452
+ z-index: 100;
3453
+ pointer-events: none;
3454
+ }
3455
+ .toast {
3456
+ pointer-events: auto;
3457
+ padding: var(--space-2) var(--space-4);
3458
+ background: var(--color-surface-2);
3459
+ border: 1px solid var(--color-border);
3460
+ border-radius: var(--radius-md);
3461
+ font-size: var(--text-xs);
3462
+ color: var(--color-text);
3463
+ box-shadow: var(--shadow-md);
3464
+ max-width: 320px;
3465
+
3466
+ opacity: 1;
3467
+ transform: translateX(0) scale(1);
3468
+ transition: opacity 300ms cubic-bezier(0.16, 1, 0.3, 1), transform 300ms cubic-bezier(0.16, 1, 0.3, 1), display 300ms cubic-bezier(0.16, 1, 0.3, 1) allow-discrete;
3469
+ }
3470
+
3471
+ @starting-style {
3472
+ .toast {
3473
+ opacity: 0;
3474
+ transform: translateX(8px) scale(0.96);
3475
+ }
3476
+ }
3477
+
3478
+ .toast.leaving {
3479
+ opacity: 0;
3480
+ transform: translateX(8px) scale(0.96);
3481
+ pointer-events: none;
3482
+ }
3483
+
3484
+
3485
+ /* ===== MOBILE / RESPONSIVE ===== */
3486
+
3487
+ @media (max-width: 768px) {
3488
+ /* Keep mobile text inputs at 16px to prevent iOS Safari focus zoom. */
3489
+ .input,
3490
+ .sidebar-search-input,
3491
+ .qs-input,
3492
+ .chat-input,
3493
+ .editor-container .cm-editor {
3494
+ font-size: 16px;
3495
+ }
3496
+
3497
+ .sidebar {
3498
+ position: fixed;
3499
+ top: 0;
3500
+ left: 0;
3501
+ bottom: 0;
3502
+ z-index: 100;
3503
+ box-shadow: var(--shadow-lg);
3504
+ }
3505
+
3506
+ .sidebar.collapsed {
3507
+ display: none;
3508
+ }
3509
+
3510
+ .toolbar-btn-label { display: none; }
3511
+ .toolbar-center { display: none; }
3512
+ .mobile-view-toggle { display: flex !important; }
3513
+ .toolbar-name-btn { max-width: none; }
3514
+ .sidebar-close-btn { display: inline-flex; }
3515
+ .sidebar-tabs { padding: 0 var(--space-1); }
3516
+ .sidebar-tab { padding: var(--space-2); }
3517
+
3518
+ .editor-layout {
3519
+ flex-direction: column;
3520
+ }
3521
+ .resizer {
3522
+ display: none !important;
3523
+ }
3524
+
3525
+ /* On mobile, hide the non-active pane */
3526
+ .editor-layout[data-view="split"] .preview-pane {
3527
+ display: none;
3528
+ }
3529
+ .editor-layout[data-view="split"] .editor-pane {
3530
+ flex: 1;
3531
+ }
3532
+
3533
+ .preview-content {
3534
+ padding: var(--space-4);
3535
+ }
3536
+
3537
+ .diff-toolbar {
3538
+ flex-wrap: wrap;
3539
+ padding: var(--space-2) var(--space-3);
3540
+ }
3541
+
3542
+ .diff-toolbar-left,
3543
+ .diff-toolbar-right {
3544
+ width: 100%;
3545
+ justify-content: space-between;
3546
+ }
3547
+
3548
+ .diff-toolbar-left {
3549
+ flex-wrap: wrap;
3550
+ }
3551
+
3552
+ .diff-toolbar-actions {
3553
+ width: 100%;
3554
+ justify-content: space-between;
3555
+ }
3556
+
3557
+ .diff-toolbar-actions-group-git {
3558
+ flex: 1;
3559
+ }
3560
+
3561
+ .diff-toolbar-actions-group-git .diff-action-btn {
3562
+ flex: 1;
3563
+ min-width: 0;
3564
+ }
3565
+
3566
+ .diff-toolbar-actions-divider {
3567
+ display: none;
3568
+ }
3569
+
3570
+ .diff-mode-btn {
3571
+ min-width: 74px;
3572
+ }
3573
+
3574
+ .diff-split-row {
3575
+ grid-template-columns: 1fr;
3576
+ }
3577
+
3578
+ .diff-split-line:first-child {
3579
+ border-right: none;
3580
+ border-bottom: 1px solid var(--color-divider);
3581
+ }
3582
+
3583
+ .markdown-toolbar {
3584
+ overflow-x: auto;
3585
+ flex-wrap: nowrap;
3586
+ scrollbar-width: thin;
3587
+ }
3588
+
3589
+ .outline-panel {
3590
+ position: absolute;
3591
+ top: 0;
3592
+ right: 0;
3593
+ bottom: 0;
3594
+ left: 0;
3595
+ width: auto;
3596
+ border-left: none;
3597
+ border-top: 1px solid var(--color-divider);
3598
+ background: oklch(from var(--color-surface) l c h / 0.98);
3599
+ backdrop-filter: blur(10px);
3600
+ box-shadow: var(--shadow-lg);
3601
+ z-index: 6;
3602
+ }
3603
+ .outline-panel.hidden {
3604
+ display: none !important;
3605
+ }
3606
+ #outlineToggle {
3607
+ display: inline-flex !important;
3608
+ }
3609
+
3610
+ .toolbar {
3611
+ padding: 0 var(--space-2);
3612
+ }
3613
+ .toolbar-room-name {
3614
+ font-size: var(--text-xs);
3615
+ max-width: 120px;
3616
+ }
3617
+
3618
+ .chat-panel {
3619
+ position: fixed;
3620
+ top: calc(var(--toolbar-h) + var(--space-2));
3621
+ right: var(--space-2);
3622
+ left: var(--space-2);
3623
+ width: auto;
3624
+ max-height: calc(100vh - var(--toolbar-h) - var(--space-6));
3625
+ }
3626
+
3627
+ .chat-form {
3628
+ align-items: stretch;
3629
+ }
3630
+
3631
+ .chat-send-btn {
3632
+ padding-inline: var(--space-3);
3633
+ }
3634
+ }
3635
+
3636
+ @media (min-width: 769px) {
3637
+ .mobile-view-toggle { display: none !important; }
3638
+ }
3639
+
3640
+
3641
+ /* ===== LIGHT MODE OVERRIDES ===== */
3642
+
3643
+ [data-theme="light"] .preview-content pre,
3644
+ [data-theme="light"] .preview-content pre code,
3645
+ [data-theme="light"] .hljs {
3646
+ background: var(--color-surface) !important;
3647
+ }
3648
+
3649
+
3650
+ /* ===== SCROLLBAR STYLING ===== */
3651
+
3652
+ .preview-container,
3653
+ .cm-scroller,
3654
+ .file-tree,
3655
+ .git-panel,
3656
+ .diff-scroll,
3657
+ .comments-drawer-list,
3658
+ .comment-card-quote,
3659
+ .markdown-toolbar,
3660
+ .preview-content pre,
3661
+ .preview-content .table-wrapper,
3662
+ .preview-content .mermaid-frame,
3663
+ .preview-content .plantuml-frame,
3664
+ .plantuml-maximized-root .plantuml-frame {
3665
+ scrollbar-width: thin;
3666
+ scrollbar-color: var(--color-surface-dynamic) transparent;
3667
+ }
3668
+
3669
+ .preview-container::-webkit-scrollbar,
3670
+ .cm-scroller::-webkit-scrollbar,
3671
+ .file-tree::-webkit-scrollbar,
3672
+ .git-panel::-webkit-scrollbar,
3673
+ .diff-scroll::-webkit-scrollbar,
3674
+ .comments-drawer-list::-webkit-scrollbar,
3675
+ .comment-card-quote::-webkit-scrollbar,
3676
+ .markdown-toolbar::-webkit-scrollbar,
3677
+ .preview-content pre::-webkit-scrollbar,
3678
+ .preview-content .table-wrapper::-webkit-scrollbar,
3679
+ .preview-content .mermaid-frame::-webkit-scrollbar,
3680
+ .preview-content .plantuml-frame::-webkit-scrollbar,
3681
+ .plantuml-maximized-root .plantuml-frame::-webkit-scrollbar {
3682
+ width: 8px;
3683
+ height: 8px;
3684
+ }
3685
+ .preview-container::-webkit-scrollbar-track,
3686
+ .cm-scroller::-webkit-scrollbar-track,
3687
+ .file-tree::-webkit-scrollbar-track,
3688
+ .git-panel::-webkit-scrollbar-track,
3689
+ .diff-scroll::-webkit-scrollbar-track,
3690
+ .comments-drawer-list::-webkit-scrollbar-track,
3691
+ .comment-card-quote::-webkit-scrollbar-track,
3692
+ .markdown-toolbar::-webkit-scrollbar-track,
3693
+ .preview-content pre::-webkit-scrollbar-track,
3694
+ .preview-content .table-wrapper::-webkit-scrollbar-track,
3695
+ .preview-content .mermaid-frame::-webkit-scrollbar-track,
3696
+ .preview-content .plantuml-frame::-webkit-scrollbar-track,
3697
+ .plantuml-maximized-root .plantuml-frame::-webkit-scrollbar-track {
3698
+ background: transparent;
3699
+ }
3700
+ .preview-container::-webkit-scrollbar-thumb,
3701
+ .cm-scroller::-webkit-scrollbar-thumb,
3702
+ .file-tree::-webkit-scrollbar-thumb,
3703
+ .git-panel::-webkit-scrollbar-thumb,
3704
+ .diff-scroll::-webkit-scrollbar-thumb,
3705
+ .comments-drawer-list::-webkit-scrollbar-thumb,
3706
+ .comment-card-quote::-webkit-scrollbar-thumb,
3707
+ .markdown-toolbar::-webkit-scrollbar-thumb,
3708
+ .preview-content pre::-webkit-scrollbar-thumb,
3709
+ .preview-content .table-wrapper::-webkit-scrollbar-thumb,
3710
+ .preview-content .mermaid-frame::-webkit-scrollbar-thumb,
3711
+ .preview-content .plantuml-frame::-webkit-scrollbar-thumb,
3712
+ .plantuml-maximized-root .plantuml-frame::-webkit-scrollbar-thumb {
3713
+ background: var(--color-surface-dynamic);
3714
+ border-radius: var(--radius-full);
3715
+ }
3716
+ .preview-container::-webkit-scrollbar-thumb:hover,
3717
+ .cm-scroller::-webkit-scrollbar-thumb:hover,
3718
+ .file-tree::-webkit-scrollbar-thumb:hover,
3719
+ .git-panel::-webkit-scrollbar-thumb:hover,
3720
+ .diff-scroll::-webkit-scrollbar-thumb:hover,
3721
+ .comments-drawer-list::-webkit-scrollbar-thumb:hover,
3722
+ .comment-card-quote::-webkit-scrollbar-thumb:hover,
3723
+ .markdown-toolbar::-webkit-scrollbar-thumb:hover,
3724
+ .preview-content pre::-webkit-scrollbar-thumb:hover,
3725
+ .preview-content .table-wrapper::-webkit-scrollbar-thumb:hover,
3726
+ .preview-content .mermaid-frame::-webkit-scrollbar-thumb:hover,
3727
+ .preview-content .plantuml-frame::-webkit-scrollbar-thumb:hover,
3728
+ .plantuml-maximized-root .plantuml-frame::-webkit-scrollbar-thumb:hover {
3729
+ background: var(--color-text-faint);
3730
+ }
3731
+
3732
+ /* ===== WIKI-LINK AUTOCOMPLETE ===== */
3733
+
3734
+ .cm-tooltip-autocomplete {
3735
+ background: var(--color-surface) !important;
3736
+ border: 1px solid var(--color-divider) !important;
3737
+ border-radius: var(--radius-md) !important;
3738
+ box-shadow: var(--shadow-md) !important;
3739
+ overflow: hidden;
3740
+ font-family: var(--font-body);
3741
+ font-size: var(--text-sm);
3742
+ }
3743
+
3744
+ .cm-tooltip-autocomplete > ul {
3745
+ max-height: 240px !important;
3746
+ padding: var(--space-1) 0;
3747
+ }
3748
+
3749
+ .cm-tooltip-autocomplete > ul > li {
3750
+ padding: var(--space-2) var(--space-3) !important;
3751
+ line-height: 1.4;
3752
+ display: flex;
3753
+ align-items: center;
3754
+ gap: var(--space-2);
3755
+ }
3756
+
3757
+ .cm-tooltip-autocomplete > ul > li[aria-selected] {
3758
+ background: var(--color-primary) !important;
3759
+ color: var(--color-text-inverse) !important;
3760
+ }
3761
+
3762
+ .cm-tooltip-autocomplete .cm-completionLabel {
3763
+ flex: 1;
3764
+ overflow: hidden;
3765
+ text-overflow: ellipsis;
3766
+ white-space: nowrap;
3767
+ }
3768
+
3769
+ .cm-tooltip-autocomplete .cm-completionDetail {
3770
+ font-size: var(--text-xs);
3771
+ opacity: 0.6;
3772
+ margin-left: auto;
3773
+ white-space: nowrap;
3774
+ }
3775
+
3776
+ .cm-tooltip-autocomplete > ul > li[aria-selected] .cm-completionDetail {
3777
+ opacity: 0.85;
3778
+ }
3779
+
3780
+ .cm-completionIcon-text::after {
3781
+ content: '📄';
3782
+ font-size: 13px;
3783
+ }
3784
+
3785
+ /* ===== QUICK SWITCHER (Cmd+K) ===== */
3786
+
3787
+ .qs-overlay {
3788
+ position: fixed;
3789
+ inset: 0;
3790
+ z-index: 9999;
3791
+ display: flex;
3792
+ justify-content: center;
3793
+ padding-top: min(20vh, 160px);
3794
+ background: oklch(0.1 0 0 / 0.5);
3795
+ backdrop-filter: blur(4px);
3796
+ opacity: 0;
3797
+ visibility: hidden;
3798
+ transition: opacity 120ms ease, visibility 120ms ease, display 120ms ease allow-discrete;
3799
+ }
3800
+
3801
+ .qs-overlay.visible {
3802
+ opacity: 1;
3803
+ visibility: visible;
3804
+ }
3805
+
3806
+ @starting-style {
3807
+ .qs-overlay.visible {
3808
+ opacity: 0;
3809
+ }
3810
+ }
3811
+
3812
+ .qs-modal {
3813
+ width: min(560px, calc(100vw - 32px));
3814
+ max-height: min(440px, 60vh);
3815
+ display: flex;
3816
+ flex-direction: column;
3817
+ background: var(--color-surface);
3818
+ border: 1px solid var(--color-border);
3819
+ border-radius: var(--radius-lg);
3820
+ box-shadow: var(--shadow-lg);
3821
+ overflow: hidden;
3822
+ transform: translateY(-8px) scale(0.98);
3823
+ transition: transform 120ms cubic-bezier(0.16, 1, 0.3, 1);
3824
+ }
3825
+
3826
+ .qs-overlay.visible .qs-modal {
3827
+ transform: translateY(0) scale(1);
3828
+ }
3829
+
3830
+ @starting-style {
3831
+ .qs-overlay.visible .qs-modal {
3832
+ transform: translateY(-8px) scale(0.98);
3833
+ }
3834
+ }
3835
+
3836
+ .qs-input-wrap {
3837
+ display: flex;
3838
+ align-items: center;
3839
+ gap: var(--space-2);
3840
+ padding: var(--space-3) var(--space-4);
3841
+ border-bottom: 1px solid var(--color-divider);
3842
+ }
3843
+
3844
+ .qs-search-icon {
3845
+ flex-shrink: 0;
3846
+ color: var(--color-text-muted);
3847
+ }
3848
+
3849
+ .qs-input {
3850
+ flex: 1;
3851
+ border: none;
3852
+ outline: none;
3853
+ background: transparent;
3854
+ font-size: var(--text-sm);
3855
+ font-family: var(--font-body);
3856
+ color: var(--color-text);
3857
+ line-height: 1.5;
3858
+ }
3859
+
3860
+ .qs-input::placeholder {
3861
+ color: var(--color-text-faint);
3862
+ }
3863
+
3864
+ .qs-kbd {
3865
+ flex-shrink: 0;
3866
+ font-family: var(--font-body);
3867
+ font-size: 11px;
3868
+ line-height: 1;
3869
+ padding: 3px 6px;
3870
+ border-radius: var(--radius-sm);
3871
+ background: var(--color-surface-offset);
3872
+ border: 1px solid var(--color-divider);
3873
+ color: var(--color-text-muted);
3874
+ text-transform: uppercase;
3875
+ letter-spacing: 0.03em;
3876
+ }
3877
+
3878
+ .qs-results {
3879
+ overflow-y: auto;
3880
+ overscroll-behavior: contain;
3881
+ padding: var(--space-1) 0;
3882
+ }
3883
+
3884
+ .qs-result-item {
3885
+ display: flex;
3886
+ align-items: center;
3887
+ gap: var(--space-2);
3888
+ width: 100%;
3889
+ padding: var(--space-2) var(--space-4);
3890
+ border: none;
3891
+ background: transparent;
3892
+ color: var(--color-text);
3893
+ font-size: var(--text-sm);
3894
+ font-family: var(--font-body);
3895
+ text-align: left;
3896
+ cursor: pointer;
3897
+ transition: background 60ms ease;
3898
+ }
3899
+
3900
+ .qs-result-item:hover,
3901
+ .qs-result-item.selected {
3902
+ background: var(--color-surface-offset);
3903
+ }
3904
+
3905
+ .qs-result-item.selected {
3906
+ background: var(--color-primary-highlight);
3907
+ }
3908
+
3909
+ [data-theme="dark"] .qs-result-item.selected {
3910
+ background: oklch(from var(--color-primary) l c h / 0.18);
3911
+ }
3912
+
3913
+ .qs-result-icon {
3914
+ flex-shrink: 0;
3915
+ color: var(--color-text-muted);
3916
+ }
3917
+
3918
+ .qs-result-name {
3919
+ flex: 1;
3920
+ overflow: hidden;
3921
+ text-overflow: ellipsis;
3922
+ white-space: nowrap;
3923
+ }
3924
+
3925
+ .qs-result-name mark {
3926
+ background: oklch(from var(--color-primary) l c h / 0.2);
3927
+ color: var(--color-primary);
3928
+ border-radius: 2px;
3929
+ padding: 0 1px;
3930
+ }
3931
+
3932
+ .qs-result-path {
3933
+ flex-shrink: 0;
3934
+ font-size: var(--text-xs);
3935
+ color: var(--color-text-faint);
3936
+ max-width: 200px;
3937
+ overflow: hidden;
3938
+ text-overflow: ellipsis;
3939
+ white-space: nowrap;
3940
+ }
3941
+
3942
+ .qs-hint {
3943
+ padding: var(--space-4) var(--space-4);
3944
+ text-align: center;
3945
+ font-size: var(--text-xs);
3946
+ color: var(--color-text-muted);
3947
+ }
3948
+
3949
+ .qs-hint.hidden {
3950
+ display: none;
3951
+ }
3952
+
3953
+ /* ── Excalidraw Embeds ───────────────────────────────────────────── */
3954
+
3955
+ .diagram-preview-shell {
3956
+ margin: var(--space-4) 0;
3957
+ border: 1px solid var(--color-border);
3958
+ border-radius: 8px;
3959
+ overflow: hidden;
3960
+ background: var(--color-surface);
3961
+ width: 100%;
3962
+ max-width: 100%;
3963
+ box-sizing: border-box;
3964
+ }
3965
+
3966
+ .diagram-preview-placeholder-card {
3967
+ display: flex;
3968
+ align-items: center;
3969
+ justify-content: space-between;
3970
+ gap: var(--space-3);
3971
+ padding: var(--space-4);
3972
+ background: var(--color-surface);
3973
+ }
3974
+
3975
+ .diagram-preview-placeholder-copy {
3976
+ display: grid;
3977
+ gap: 2px;
3978
+ }
3979
+
3980
+ .diagram-preview-placeholder-copy strong {
3981
+ font-size: var(--text-sm);
3982
+ }
3983
+
3984
+ .diagram-preview-placeholder-copy span {
3985
+ color: var(--color-text-muted);
3986
+ font-size: var(--text-xs);
3987
+ }
3988
+
3989
+ .diagram-preview-placeholder-btn {
3990
+ flex-shrink: 0;
3991
+ appearance: none;
3992
+ border: 1px solid var(--color-border);
3993
+ background: var(--color-surface-2);
3994
+ color: var(--color-text);
3995
+ font-size: var(--text-xs);
3996
+ padding: 4px 10px;
3997
+ border-radius: 4px;
3998
+ cursor: pointer;
3999
+ }
4000
+
4001
+ .diagram-preview-placeholder-btn:hover {
4002
+ background: var(--color-surface-offset);
4003
+ }
4004
+
4005
+ .diagram-preview-toolbar {
4006
+ display: flex;
4007
+ align-items: center;
4008
+ gap: var(--space-2);
4009
+ padding: var(--space-2) var(--space-3);
4010
+ background: var(--color-surface-raised);
4011
+ border-bottom: 1px solid var(--color-border);
4012
+ font-size: var(--text-xs);
4013
+ color: var(--color-text-muted);
4014
+ user-select: none;
4015
+ min-width: 0;
4016
+ flex-wrap: wrap;
4017
+ }
4018
+
4019
+ .diagram-preview-action-btn {
4020
+ flex-shrink: 0;
4021
+ appearance: none;
4022
+ border: 1px solid var(--color-border);
4023
+ background: var(--color-surface-2);
4024
+ color: var(--color-text);
4025
+ font-size: var(--text-xs);
4026
+ padding: 2px 8px;
4027
+ border-radius: 4px;
4028
+ cursor: pointer;
4029
+ box-shadow: inset 0 1px 0 oklch(from var(--color-text) l c h / 0.04);
4030
+ transition: background 0.18s ease, color 0.18s ease, border-color 0.18s ease;
4031
+ }
4032
+
4033
+ .diagram-preview-action-btn.is-icon-only {
4034
+ display: inline-flex;
4035
+ align-items: center;
4036
+ justify-content: center;
4037
+ width: 30px;
4038
+ min-width: 30px;
4039
+ height: 30px;
4040
+ padding: 0;
4041
+ }
4042
+
4043
+ .diagram-preview-action-btn.is-icon-only svg {
4044
+ width: 14px;
4045
+ height: 14px;
4046
+ display: block;
4047
+ }
4048
+
4049
+ .diagram-preview-action-btn:hover:not(:disabled) {
4050
+ background: var(--color-surface-offset);
4051
+ border-color: oklch(from var(--color-border) calc(l + 0.08) c h);
4052
+ }
4053
+
4054
+ .diagram-preview-action-btn:disabled {
4055
+ opacity: 0.5;
4056
+ cursor: not-allowed;
4057
+ }
4058
+
4059
+ .diagram-preview-zoom-label {
4060
+ min-width: 52px;
4061
+ text-align: center;
4062
+ color: var(--color-text-muted);
4063
+ font-size: var(--text-xs);
4064
+ font-weight: 500;
4065
+ font-variant-numeric: tabular-nums;
4066
+ }
4067
+
4068
+ .diagram-preview-frame {
4069
+ overflow: auto;
4070
+ padding: var(--space-3);
4071
+ background: transparent;
4072
+ overscroll-behavior: contain;
4073
+ max-height: min(70vh, 720px);
4074
+ min-width: 0;
4075
+ max-width: 100%;
4076
+ }
4077
+
4078
+ .excalidraw-embed,
4079
+ .excalidraw-embed-placeholder {
4080
+ transition: box-shadow 0.18s ease;
4081
+ display: block;
4082
+ }
4083
+
4084
+ .excalidraw-embed-overlay-root {
4085
+ position: absolute;
4086
+ inset: 0;
4087
+ pointer-events: none;
4088
+ z-index: 1;
4089
+ }
4090
+
4091
+ .excalidraw-maximized-root {
4092
+ position: fixed;
4093
+ inset: 0;
4094
+ pointer-events: none;
4095
+ z-index: 171;
4096
+ }
4097
+
4098
+ body.excalidraw-maximized-open {
4099
+ overflow: hidden;
4100
+ }
4101
+
4102
+ body.excalidraw-maximized-open::before {
4103
+ content: '';
4104
+ position: fixed;
4105
+ inset: 0;
4106
+ background: oklch(0.1 0 0 / 0.42);
4107
+ backdrop-filter: blur(2px);
4108
+ z-index: 170;
4109
+ }
4110
+
4111
+ body.excalidraw-maximized-open .excalidraw-maximized-root {
4112
+ z-index: 171;
4113
+ }
4114
+
4115
+ body.excalidraw-maximized-open .resizer {
4116
+ opacity: 0;
4117
+ pointer-events: none;
4118
+ }
4119
+
4120
+ .excalidraw-embed:hover {
4121
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
4122
+ }
4123
+
4124
+ [data-theme="dark"] .excalidraw-embed:hover {
4125
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
4126
+ }
4127
+
4128
+ .excalidraw-embed-placeholder.is-hydrated {
4129
+ visibility: hidden;
4130
+ }
4131
+
4132
+ .excalidraw-embed-header {
4133
+ gap: var(--space-2);
4134
+ }
4135
+
4136
+ .excalidraw-embed-icon {
4137
+ display: flex;
4138
+ align-items: center;
4139
+ color: var(--color-primary);
4140
+ flex-shrink: 0;
4141
+ }
4142
+
4143
+ .excalidraw-embed-label {
4144
+ flex: 1;
4145
+ min-width: 0;
4146
+ overflow: hidden;
4147
+ text-overflow: ellipsis;
4148
+ white-space: nowrap;
4149
+ font-weight: 500;
4150
+ }
4151
+
4152
+ .excalidraw-embed-iframe {
4153
+ display: block;
4154
+ width: 100%;
4155
+ border: none;
4156
+ background: white;
4157
+ min-height: 200px;
4158
+ }
4159
+
4160
+ [data-theme="dark"] .excalidraw-embed-iframe {
4161
+ background: #121212;
4162
+ }
4163
+
4164
+ .excalidraw-embed.is-maximized {
4165
+ position: fixed;
4166
+ inset: var(--space-4);
4167
+ width: auto;
4168
+ margin: 0;
4169
+ z-index: 172;
4170
+ max-width: none;
4171
+ box-sizing: border-box;
4172
+ border-radius: 10px;
4173
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.35);
4174
+ display: flex;
4175
+ flex-direction: column;
4176
+ }
4177
+
4178
+ .excalidraw-embed.is-maximized .excalidraw-embed-header {
4179
+ flex-shrink: 0;
4180
+ }
4181
+
4182
+ .excalidraw-embed.is-maximized .excalidraw-embed-iframe {
4183
+ height: auto !important;
4184
+ min-height: 0;
4185
+ flex: 1;
4186
+ }
4187
+
4188
+ .excalidraw-embed.is-maximized .excalidraw-embed-resizer {
4189
+ display: none;
4190
+ }
4191
+
4192
+ [data-theme="dark"] .excalidraw-embed.is-maximized {
4193
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6);
4194
+ }
4195
+
4196
+ @media (max-width: 768px) {
4197
+ .excalidraw-embed.is-maximized {
4198
+ inset: var(--space-3);
4199
+ width: auto;
4200
+ }
4201
+
4202
+ .excalidraw-embed.is-maximized .excalidraw-embed-iframe {
4203
+ height: auto !important;
4204
+ }
4205
+ }
4206
+
4207
+ .excalidraw-embed-resizer {
4208
+ height: 6px;
4209
+ background: var(--color-border);
4210
+ cursor: ns-resize;
4211
+ transition: background 0.18s ease;
4212
+ position: relative;
4213
+ }
4214
+
4215
+ .excalidraw-embed-resizer::after {
4216
+ content: '';
4217
+ position: absolute;
4218
+ left: 50%;
4219
+ top: 50%;
4220
+ transform: translate(-50%, -50%);
4221
+ width: 32px;
4222
+ height: 3px;
4223
+ border-radius: 2px;
4224
+ background: var(--color-text-faint);
4225
+ opacity: 0;
4226
+ transition: opacity 0.18s ease;
4227
+ }
4228
+
4229
+ .excalidraw-embed-resizer:hover {
4230
+ background: var(--color-primary);
4231
+ }
4232
+
4233
+ .excalidraw-embed-resizer:hover::after {
4234
+ opacity: 1;
4235
+ }
4236
+
4237
+ /* File tree — excalidraw file icon */
4238
+
4239
+ .file-tree-file.is-excalidraw .file-tree-icon {
4240
+ color: var(--color-primary);
4241
+ }
4242
+
4243
+ .file-tree-file.is-mermaid .file-tree-icon {
4244
+ color: oklch(from var(--color-primary) calc(l * 0.96) calc(c * 0.86) 215);
4245
+ }