@michelj/context-guard 0.4.3 → 0.6.1

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 (161) hide show
  1. package/Coordinator.md +88 -0
  2. package/Executor.md +53 -0
  3. package/README.md +89 -224
  4. package/README.zh-CN.md +89 -224
  5. package/SKILL.md +26 -684
  6. package/THIRD_PARTY_NOTICES.md +47 -0
  7. package/Tester.md +53 -0
  8. package/agents/openai.yaml +2 -2
  9. package/bin/build-runtime.mjs +96 -0
  10. package/bin/context-guard-skill.js +399 -78
  11. package/bin/postinstall.js +2 -2
  12. package/hooks.json +89 -13
  13. package/licenses/JSONParse-MIT.txt +24 -0
  14. package/licenses/Marked-MIT.txt +44 -0
  15. package/licenses/Portless-Apache-2.0.txt +201 -0
  16. package/package.json +35 -6
  17. package/prototype/LICENSES/Marked-MIT.txt +44 -0
  18. package/prototype/LICENSES/Ready-redistribution.txt +14 -0
  19. package/prototype/attachments.mjs +75 -0
  20. package/prototype/coordinator-markdown.mjs +283 -0
  21. package/prototype/coordinator-working-blot.mjs +124 -0
  22. package/prototype/vendor/marked.mjs +2189 -0
  23. package/prototype/workbench-app.js +5197 -0
  24. package/prototype/workbench-data.js +33 -0
  25. package/prototype/workbench-sync.mjs +898 -0
  26. package/prototype/workbench.css +1050 -0
  27. package/prototype/workbench.html +211 -0
  28. package/prototype/working-blot-atlas.png +0 -0
  29. package/references/agent-handoff.md +40 -0
  30. package/references/claude-runtime.md +120 -0
  31. package/references/cloud-sync-interface.md +66 -0
  32. package/references/design-current.md +14 -0
  33. package/references/map-mount.md +41 -0
  34. package/references/map-read.md +50 -0
  35. package/references/memory-definition.md +120 -0
  36. package/references/memory-filesystem-v2/Bug.en.md +162 -0
  37. package/references/memory-filesystem-v2/Bug.md +162 -0
  38. package/references/memory-filesystem-v2/Bug_Coordinater.md +8 -0
  39. package/references/memory-filesystem-v2/Bug_Executor.md +8 -0
  40. package/references/memory-filesystem-v2/Bug_Tester.md +7 -0
  41. package/references/memory-filesystem-v2/Idea.en.md +36 -0
  42. package/references/memory-filesystem-v2/Idea.md +36 -0
  43. package/references/memory-filesystem-v2/Node_Module_Index.en.md +88 -0
  44. package/references/memory-filesystem-v2/Node_Module_Index.md +88 -0
  45. package/references/memory-filesystem-v2/README.md +60 -0
  46. package/references/memory-filesystem-v2/Todo.en.md +137 -0
  47. package/references/memory-filesystem-v2/Todo.md +137 -0
  48. package/references/memory-filesystem-v2/Todo_Coordinater.md +7 -0
  49. package/references/memory-filesystem-v2/Todo_Executor.md +7 -0
  50. package/references/memory-filesystem-v2/Todo_Tester.md +7 -0
  51. package/references/named-workbench.md +124 -0
  52. package/references/plan-review.md +12 -0
  53. package/references/server-memory.md +276 -0
  54. package/references/test-check.md +7 -0
  55. package/references/user-reply.md +38 -0
  56. package/references/workbench-interface.md +531 -0
  57. package/roles.md +13 -0
  58. package/scripts/context_guard.py +1366 -7602
  59. package/scripts/context_guard_hook.py +1960 -711
  60. package/scripts/map_owns.py +699 -0
  61. package/scripts/shared/LICENSES/JSONParse-MIT.txt +24 -0
  62. package/scripts/shared/filesystem-v2.mjs +430 -0
  63. package/scripts/shared/io.mjs +117 -0
  64. package/scripts/shared/map-model.mjs +506 -0
  65. package/scripts/shared/memory-schema.mjs +13 -0
  66. package/scripts/shared/protocol-blobs.mjs +112 -0
  67. package/scripts/shared/protocol-map.mjs +146 -0
  68. package/scripts/shared/protocol-snapshots.mjs +84 -0
  69. package/scripts/shared/protocol-store.mjs +624 -0
  70. package/scripts/shared/protocol-workflow.mjs +226 -0
  71. package/scripts/shared/protocol.mjs +125 -0
  72. package/scripts/shared/vendor/jsonparse.cjs +413 -0
  73. package/scripts/workbench/access.mjs +496 -0
  74. package/scripts/workbench/attachments.mjs +92 -0
  75. package/scripts/workbench/browser-login.mjs +78 -0
  76. package/scripts/workbench/claude-runtime.mjs +372 -0
  77. package/scripts/workbench/cli.mjs +980 -0
  78. package/scripts/workbench/device-heartbeat.mjs +72 -0
  79. package/scripts/workbench/hook-status.mjs +38 -0
  80. package/scripts/workbench/inbox.mjs +155 -0
  81. package/scripts/workbench/journal.mjs +56 -0
  82. package/scripts/workbench/memory-merge.mjs +65 -0
  83. package/scripts/workbench/memory.mjs +252 -0
  84. package/scripts/workbench/named-proxy.mjs +108 -0
  85. package/scripts/workbench/named.mjs +152 -0
  86. package/scripts/workbench/portless-routes.mjs +51 -0
  87. package/scripts/workbench/project.mjs +327 -0
  88. package/scripts/workbench/projections.mjs +68 -0
  89. package/scripts/workbench/protocol-client.mjs +165 -0
  90. package/scripts/workbench/protocol-delivery.mjs +133 -0
  91. package/scripts/workbench/protocol-device.mjs +316 -0
  92. package/scripts/workbench/protocol-events.mjs +53 -0
  93. package/scripts/workbench/protocol-repository.mjs +58 -0
  94. package/scripts/workbench/reconcile.mjs +244 -0
  95. package/scripts/workbench/registry.mjs +111 -0
  96. package/scripts/workbench/runtime.mjs +54 -0
  97. package/scripts/workbench/server.mjs +1171 -0
  98. package/scripts/workbench/store.mjs +243 -0
  99. package/scripts/workbench/sync-coordinator.mjs +518 -0
  100. package/scripts/workbench/sync.mjs +86 -0
  101. package/references/context-template.md +0 -341
  102. package/references/feature-chain-methodology.md +0 -228
  103. package/references/register-template.md +0 -85
  104. package/references/task-case-template.md +0 -63
  105. package/tests/BC-20260618-063.sh +0 -116
  106. package/tests/BC-20260618-065.sh +0 -66
  107. package/tests/BC-20260626-080.sh +0 -48
  108. package/tests/BC-20260626-081.sh +0 -40
  109. package/tests/BC-20260626-082.sh +0 -32
  110. package/tests/BC-20260626-083.sh +0 -66
  111. package/tests/BC-20260627-084.sh +0 -74
  112. package/tests/BC-20260630-086.sh +0 -50
  113. package/tests/BC-20260630-087.sh +0 -103
  114. package/tests/BC-20260630-088.sh +0 -32
  115. package/tests/BC-20260630-089.sh +0 -63
  116. package/tests/BC-20260701-090.sh +0 -84
  117. package/tests/BC-20260702-096.sh +0 -48
  118. package/tests/BC-20260706-098.sh +0 -66
  119. package/tests/BC-20260707-099.sh +0 -47
  120. package/tests/BC-20260707-100.sh +0 -46
  121. package/tests/BC-20260707-101.sh +0 -47
  122. package/tests/BC-20260707-102.sh +0 -68
  123. package/tests/BC-20260707-103.sh +0 -59
  124. package/tests/BC-20260707-104.sh +0 -103
  125. package/tests/BC-20260707-105.sh +0 -109
  126. package/tests/BC-20260707-106.sh +0 -80
  127. package/tests/BC-20260707-107.sh +0 -74
  128. package/tests/BC-20260707-108.sh +0 -48
  129. package/tests/BC-20260707-109.sh +0 -56
  130. package/tests/BC-20260707-110.sh +0 -71
  131. package/tests/BC-20260707-111.sh +0 -70
  132. package/tests/BC-20260707-112.sh +0 -45
  133. package/tests/BC-20260707-113.sh +0 -73
  134. package/tests/BC-20260707-115.sh +0 -77
  135. package/tests/BC-20260707-116.sh +0 -77
  136. package/tests/BC-20260707-118.sh +0 -115
  137. package/tests/BC-20260707-119.sh +0 -47
  138. package/tests/BC-20260707-120.sh +0 -60
  139. package/tests/BC-20260707-121.sh +0 -66
  140. package/tests/BC-20260707-122.sh +0 -48
  141. package/tests/BC-20260707-123.sh +0 -43
  142. package/tests/BC-20260707-124.sh +0 -56
  143. package/tests/BC-20260707-125.sh +0 -64
  144. package/tests/BC-20260707-126.sh +0 -80
  145. package/tests/BC-20260707-127.sh +0 -88
  146. package/tests/BC-20260707-129.sh +0 -59
  147. package/tests/BC-20260707-130.sh +0 -69
  148. package/tests/BC-20260707-131.sh +0 -140
  149. package/tests/BC-20260707-132.sh +0 -150
  150. package/tests/BC-20260707-133.sh +0 -70
  151. package/tests/BC-20260708-136.sh +0 -210
  152. package/tests/BC-20260708-137.sh +0 -106
  153. package/tests/BC-20260708-138.sh +0 -168
  154. package/tests/BC-20260708-139.sh +0 -79
  155. package/tests/BC-20260709-002.sh +0 -63
  156. package/tests/BC-20260709-003.sh +0 -239
  157. package/tests/BC-20260709-006.sh +0 -76
  158. package/tests/BC-20260709-008.sh +0 -168
  159. package/tests/BC-20260710-001.sh +0 -61
  160. package/tests/BC-20260710-002.sh +0 -111
  161. package/tests/npm-install-smoke.sh +0 -53
@@ -0,0 +1,1050 @@
1
+ :root{
2
+ --chrome-top:58px;
3
+ --chrome-btn-h:36px;
4
+ --ink:#2d2d2d; --muted:#746c60; --paper:#fffdf8; --bg:#fefaf2; --line:#d7ccb8; --line-ink:#2d2d2d;
5
+ --green:#3a6e55; --green-soft:#efe6d2; --red:#e24b4b; --red-soft:#f8e4dc;
6
+ --blue:#2d5da1; --blue-soft:#e4ebf4; --gray:#9a9084;
7
+ --focus:#8a6d1f; --focus-soft:#f5eeda; --module:#2d5da1; --module-soft:#f3ead6;
8
+ --auth:#7a5ca8; --auth-soft:#f0eaf8;
9
+ --yellow:#ffe66d; --gold:#d4a017;
10
+ --dot-success:#6ed08a; --dot-dirty:#3d7ee8;
11
+ --shadow:3px 3px 0 #2d2d2d; --shadow-sm:2px 2px 0 #2d2d2d;
12
+ --font-ui:"Comic Neue","Trebuchet MS","PingFang SC","Microsoft YaHei",sans-serif;
13
+ --font-note:Georgia,"Libre Baskerville","Songti SC",serif;
14
+ --drawer-width:340px;
15
+ --drawer-height:42vh;
16
+ --bug-panel-width:240px;
17
+ --safe-top:env(safe-area-inset-top, 0px);
18
+ --safe-bottom:env(safe-area-inset-bottom, 0px);
19
+ }
20
+ *{box-sizing:border-box}
21
+ html,body{height:100%;height:100dvh}
22
+ html{overflow:hidden}
23
+ body{margin:0;background:var(--bg);color:var(--ink);overflow:hidden;
24
+ font-family:var(--font-ui);font-size:14px;overscroll-behavior:none;
25
+ -webkit-tap-highlight-color:transparent}
26
+ body.auth-mode{background:#f6f3fa}
27
+ body::before{
28
+ content:"";position:fixed;inset:0;z-index:0;pointer-events:none;opacity:.42;
29
+ background-image:
30
+ linear-gradient(rgba(45,45,45,.05) 1px, transparent 1px),
31
+ radial-gradient(rgba(45,45,45,.1) .7px, transparent 1px);
32
+ background-size:100% 34px, 18px 18px;
33
+ }
34
+
35
+ header.top{position:fixed;inset:0 0 auto 0;z-index:30;display:flex;align-items:center;gap:10px 13px;
36
+ padding:10px 18px;background:var(--paper);border-bottom:2px solid var(--line-ink);flex-wrap:nowrap;cursor:default}
37
+ header.top .brand{position:relative;flex:1 1 auto;min-width:0;display:flex;align-items:center}
38
+ header.top h1{margin:0;font-size:16px}
39
+ .repo-menu{display:none;position:absolute;left:0;top:100%;margin-top:8px;z-index:40;min-width:280px;
40
+ background:var(--paper);border:2px solid var(--line-ink);border-radius:10px;box-shadow:var(--shadow);padding:6px}
41
+ .repo-menu.open{display:block}
42
+ .repo-menu button{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;
43
+ text-align:left;border:0;background:transparent;padding:8px 10px;border-radius:8px;cursor:pointer}
44
+ .repo-menu button:hover,.repo-menu button.on{background:var(--module-soft)}
45
+ .repo-menu .src{font-size:11px;color:var(--muted)}
46
+ .repo-menu .tag{font-size:10.5px;color:var(--green)}
47
+ .repo-menu .tag.wait{color:var(--red)}
48
+ .repo-menu .reanalyze{margin-top:4px;font-size:11px;color:var(--red);text-decoration:underline;cursor:pointer}
49
+ .nav-crumbs{display:flex;align-items:center;gap:7px;font-size:13px;flex-wrap:nowrap;flex:1 1 auto;min-width:0;
50
+ overflow-x:auto;white-space:nowrap;scrollbar-width:thin;height:var(--chrome-btn-h)}
51
+ .top-tools{display:flex;align-items:center;gap:10px 13px;flex:0 0 auto;margin-left:auto;flex-wrap:nowrap;height:var(--chrome-btn-h)}
52
+ .workbench-tools{position:relative;flex:0 0 auto}
53
+ .workbench-tools>summary{display:flex;align-items:center;gap:8px;height:var(--chrome-btn-h);box-sizing:border-box;padding:0 12px;cursor:pointer;list-style:none;border:2px solid var(--line-ink);border-radius:10px;background:var(--paper);box-shadow:var(--shadow-sm);font-weight:700;white-space:nowrap}
54
+ .workbench-tools>summary::-webkit-details-marker{display:none}
55
+ .workbench-tools>summary::after{content:"▾"}
56
+ .workbench-tools[open]>summary::after{content:"▴"}
57
+ .workbench-tools>summary:focus-visible{outline:2px solid var(--module);outline-offset:3px}
58
+ .workbench-tools-menu{position:absolute;top:calc(100% + 10px);right:0;z-index:70;display:flex;align-items:center;justify-content:flex-end;gap:12px;padding:12px;max-width:calc(100vw - 32px);width:max-content;box-sizing:border-box;flex-wrap:wrap;background:var(--paper);border:2px solid var(--line-ink);border-radius:12px;box-shadow:var(--shadow)}
59
+ .workbench-tools:not([open])>.workbench-tools-menu{display:none}
60
+ .nav-crumbs a,.nav-crumbs .here,.nav-crumbs .sep,.nav-crumbs .bug-exit,.nav-crumbs .bug-tag{flex:0 0 auto;white-space:nowrap}
61
+ .nav-crumbs a,.nav-crumbs .here,.nav-crumbs .bug-exit,.nav-crumbs .bug-tag{
62
+ display:inline-flex;align-items:center;height:var(--chrome-btn-h);padding:0 12px;box-sizing:border-box;line-height:1}
63
+ .nav-crumbs a{color:var(--module);cursor:pointer;text-decoration:none;
64
+ border:2px solid transparent;border-radius:8px}
65
+ .nav-crumbs a:hover{border-color:var(--line);background:#fff}
66
+ .nav-crumbs .here{font-weight:700;background:var(--module-soft);border-radius:8px;color:var(--module);
67
+ border:2px solid transparent}
68
+ .nav-crumbs .here.switch{cursor:pointer;gap:6px}
69
+ .nav-crumbs .here .caret{font-size:11px;color:var(--muted)}
70
+ .nav-crumbs .sep{color:var(--line)}
71
+ .session-switch{position:relative;flex:0 0 auto}
72
+ .session-chip{display:flex;align-items:center;gap:7px;max-width:260px;height:var(--chrome-btn-h);padding:0 9px;border:1px solid var(--line);border-radius:8px;background:var(--paper);color:var(--ink);font-size:11px;font-weight:700;white-space:nowrap;cursor:pointer;box-shadow:none;box-sizing:border-box}
73
+ .session-chip:hover,.session-chip[aria-expanded="true"]{background:var(--module-soft);transform:none;box-shadow:none}
74
+ .session-chip #session-name{overflow:hidden;text-overflow:ellipsis}
75
+ .session-status{width:15px;height:15px;display:inline-grid;place-items:center;flex:0 0 auto}
76
+ .session-status.active{border:2px solid var(--module-soft);border-top-color:var(--module);border-radius:50%;animation:session-spin .8s linear infinite}
77
+ .session-status.online::before{content:"•";color:var(--green);font-size:24px;font-weight:900;line-height:12px}
78
+ .session-status.offline::before{content:"•";color:var(--red);font-size:24px;font-weight:900;line-height:12px}
79
+ .session-status.interrupted::before,.session-status.failed::before{content:"×";color:var(--red);font-size:20px;font-weight:900;line-height:12px}
80
+ .session-status.stopped::before{content:"✓";color:var(--green);font-size:15px;font-weight:900;line-height:1}
81
+ .session-status.unknown::before{content:"•";color:var(--muted);font-size:20px;font-weight:900;line-height:12px}
82
+ .session-status.empty{display:none}
83
+ .cloud-sync-status{width:28px;height:28px;display:inline-grid;place-items:center;flex:0 0 auto;border:1px solid var(--line);border-radius:8px;background:var(--paper)}
84
+ .cloud-sync-status[hidden]{display:none}
85
+ .cloud-sync-status::before{font-size:16px;font-weight:900;line-height:1}
86
+ .cloud-sync-status.syncing::before{content:"";width:13px;height:13px;border:2px solid var(--module-soft);border-top-color:var(--module);border-radius:50%;animation:session-spin .8s linear infinite}
87
+ .cloud-sync-status.synced{display:none}
88
+ .cloud-sync-status.conflict::before,.cloud-sync-status.error::before{content:"!";color:var(--red)}
89
+ @media(max-width:900px){
90
+ header.top{flex-wrap:wrap}
91
+ header.top .brand{flex:1 1 100%}
92
+ .top-tools{margin-left:0}
93
+ .workbench-tools-menu{left:0;right:auto}
94
+ }
95
+ .session-menu{position:fixed;z-index:70;width:max-content;min-width:210px;max-width:min(360px,calc(100vw - 16px));padding:5px;background:var(--paper);border:2px solid var(--line-ink);border-radius:10px;box-shadow:var(--shadow)}
96
+ .session-menu[hidden]{display:none}
97
+ .session-menu button{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;max-width:340px;padding:8px 10px;border:0;border-radius:7px;background:transparent;box-shadow:none;color:var(--ink);text-align:left;white-space:nowrap}
98
+ .session-menu button:hover{background:var(--module-soft);transform:none;box-shadow:none}
99
+ .session-menu button[aria-selected="true"]{background:var(--module-soft)}
100
+ .session-menu button:disabled{opacity:.55;cursor:not-allowed}
101
+ .session-menu button:disabled:hover{background:transparent}
102
+ .session-menu .session-option-copy{display:grid;min-width:0;gap:1px}
103
+ .session-menu .session-option-name{overflow:hidden;text-overflow:ellipsis}
104
+ .session-menu .session-option-context{overflow:hidden;color:var(--muted);font-size:9px;font-weight:600;text-overflow:ellipsis}
105
+ .session-menu .session-option-state{margin-left:auto;color:var(--muted);font-size:9px;font-weight:700}
106
+ .session-menu .session-option-state.online{color:var(--green)}
107
+ .session-menu .session-option-state.offline,.session-menu .session-option-state.interrupted,.session-menu .session-option-state.failed{color:var(--red)}
108
+ .session-menu .session-option-state.unknown{color:var(--gold)}
109
+ .bug-assign-dialog{width:min(520px,calc(100vw - 28px));padding:0;border:2px solid var(--line-ink);border-radius:12px;background:var(--paper);color:var(--ink);box-shadow:var(--shadow)}
110
+ .bug-assign-dialog::backdrop{background:rgba(35,31,25,.28)}
111
+ .bug-assign-dialog form{display:grid;gap:14px;padding:20px}
112
+ .bug-assign-dialog h3{margin:0;font-size:18px}
113
+ .bug-assign-dialog label{display:grid;gap:6px;font-size:12px;font-weight:800;color:var(--muted)}
114
+ .bug-assign-dialog input,.bug-assign-dialog textarea,.bug-assign-dialog select{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);padding:9px 10px;font:inherit}
115
+ .bug-assign-dialog textarea{min-height:84px;resize:vertical}
116
+ .bug-assign-dialog .scope-warning{padding:10px 12px;border:1px solid #e0b84f;border-radius:8px;background:var(--yellow);font-size:12px;font-weight:700;line-height:1.45}
117
+ .bug-assign-dialog .scope-warning[hidden]{display:none}
118
+ .bug-assign-dialog .dialog-actions{display:flex;justify-content:flex-end;gap:8px}
119
+ @keyframes session-spin{to{transform:rotate(360deg)}}
120
+ .tray-btn,.auth-btn{
121
+ height:var(--chrome-btn-h);min-height:var(--chrome-btn-h);padding:0 12px;font-size:12.5px;line-height:1;
122
+ display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;flex:0 0 auto}
123
+ #btn-auth{width:var(--chrome-btn-h);padding:0;font-size:16px}
124
+ .repo-status{font-size:12px;color:var(--muted);max-width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
125
+ .repo-status.ok{color:var(--green)}
126
+ .repo-status.err{color:var(--red)}
127
+ .lang-toggle,.rel-toggle{
128
+ display:flex;align-items:stretch;height:var(--chrome-btn-h);border:2px solid var(--line-ink);border-radius:8px;
129
+ overflow:hidden;flex:0 0 auto;box-sizing:border-box;box-shadow:var(--shadow-sm)}
130
+ .lang-toggle button,.rel-toggle button{
131
+ border:0;border-radius:0;height:auto;min-height:0;padding:0 12px;font-size:12.5px;line-height:1;
132
+ display:inline-flex;align-items:center;justify-content:center;background:var(--paper);color:var(--muted);cursor:pointer;font-weight:700}
133
+ .lang-toggle button{padding:0 10px;min-width:36px}
134
+ .lang-toggle button + button{border-left:2px solid var(--line-ink)}
135
+ .lang-toggle button:hover,.rel-toggle button:hover{color:var(--ink)}
136
+ .lang-toggle button.on,.rel-toggle button.on{background:var(--yellow);color:var(--ink);font-weight:800}
137
+ button.dir-toggle{
138
+ position:relative;display:grid;grid-template-columns:1fr 1fr;align-items:stretch;
139
+ width:60px;height:var(--chrome-btn-h);min-height:var(--chrome-btn-h);min-width:0;padding:3px;gap:0;
140
+ border:2px solid var(--line-ink);border-radius:8px;overflow:hidden;flex:0 0 auto;
141
+ box-sizing:border-box;box-shadow:var(--shadow-sm);background:var(--paper);color:var(--ink);
142
+ cursor:pointer;user-select:none;-webkit-user-select:none}
143
+ button.dir-toggle:hover,button.dir-toggle:focus,button.dir-toggle:active{
144
+ background:var(--paper);color:var(--ink);transform:none;box-shadow:var(--shadow-sm)}
145
+ .dir-toggle .dir-thumb{
146
+ position:absolute;top:3px;bottom:3px;left:3px;width:calc((100% - 6px)/2);z-index:2;
147
+ background:var(--yellow);border:2px solid var(--line-ink);border-radius:5px;pointer-events:none;
148
+ box-sizing:border-box;transform:translateX(100%);transition:transform .18s ease}
149
+ .dir-toggle.is-tb .dir-thumb{transform:translateX(0)}
150
+ .dir-toggle .dir-opt{
151
+ position:relative;z-index:1;display:flex;align-items:center;justify-content:center;
152
+ padding:0;font-size:10px;font-weight:800;line-height:1;color:var(--ink);white-space:nowrap;
153
+ pointer-events:none}
154
+ .dir-toggle .dir-opt.on{color:var(--ink)}
155
+ #rel-hint{display:none;font-size:12px;font-weight:700;color:var(--muted);white-space:nowrap}
156
+ body.rel-mode #rel-hint{display:inline}
157
+ body.rel-mode{background:#f3eee4}
158
+ body.rel-mode header.top{background:#f3eee4}
159
+ body.layout-tb .node .add-child{right:auto;left:50%;top:auto;bottom:-11px;transform:translateX(-50%)}
160
+ .first-use{display:none;position:fixed;inset:var(--chrome-top) 0 0 0;z-index:26;
161
+ align-items:center;justify-content:center;background:rgba(254,250,242,.82);cursor:default}
162
+ .first-use.open{display:flex}
163
+ .first-use .card{width:min(720px,94%);background:var(--paper);border:2px solid var(--line-ink);
164
+ border-radius:14px;padding:26px 26px 20px;box-shadow:var(--shadow)}
165
+ .first-use .card.wide{width:min(920px,96%);max-height:min(86vh,760px);overflow:auto}
166
+ .cut-list{display:flex;flex-direction:column;gap:10px;margin:14px 0 0}
167
+ /* 候选搁板:候选卡散落在画布四周,与主节点无连线 */
168
+ .lens-shelf{position:absolute;left:0;top:0;width:0;height:0;overflow:visible;z-index:5;pointer-events:none}
169
+ .lens-shelf .shelf-label,.lens-shelf .shelf-card{pointer-events:auto;position:absolute}
170
+ .lens-shelf .shelf-label{font-size:11px;font-weight:800;color:var(--muted);letter-spacing:.06em;white-space:nowrap}
171
+ .shelf-card{display:flex;flex-direction:column;gap:3px;width:168px;padding:9px 11px;border:1.5px dashed var(--line-ink);
172
+ border-radius:11px;background:rgba(255,255,255,.86);cursor:pointer;font:inherit;color:inherit;text-align:left;
173
+ box-shadow:var(--shadow-sm)}
174
+ .shelf-card b{font-size:13px}
175
+ .shelf-card .p{color:var(--muted);font-size:11.5px;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
176
+ .shelf-card:hover{background:var(--yellow)}
177
+ .shelf-card.taken{display:none}
178
+ .lens-bar{position:absolute;left:14px;bottom:14px;z-index:6;display:flex;align-items:center;gap:10px;
179
+ padding:9px 14px;border:2px solid var(--line-ink);border-radius:12px;background:var(--paper);box-shadow:var(--shadow)}
180
+ .lens-bar .cnt{font-weight:800}
181
+ .lens-bar .warn{color:var(--red);font-size:12px}
182
+ .lens-bar button{font:inherit;border:1.5px solid var(--line-ink);border-radius:9px;padding:5px 12px;cursor:pointer;background:#fff}
183
+ .lens-bar button.primary{background:var(--ink);color:var(--paper)}
184
+ .lens-bar button:disabled{opacity:.45;cursor:not-allowed}
185
+ .lens-pool{display:flex;flex-direction:column;gap:14px;margin:14px 0 0}
186
+ .lens-group{border:1px solid var(--line);border-radius:12px;background:#fff;overflow:hidden}
187
+ .lens-group>button.lens-head{display:flex;align-items:center;gap:8px;width:100%;text-align:left;
188
+ padding:10px 14px;border:0;background:var(--module-soft);cursor:pointer;font:inherit;color:inherit}
189
+ .lens-group>button.lens-head b{font-size:14px}
190
+ .lens-group>button.lens-head .why{color:var(--muted);font-size:12px;flex:1}
191
+ .lens-group>button.lens-head .cnt{font-size:12px;color:var(--muted)}
192
+ .lens-group .lens-items{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:8px;padding:12px}
193
+ .lens-group.collapsed .lens-items{display:none}
194
+ .lens-opt{display:flex;gap:9px;align-items:flex-start;text-align:left;border:1.5px solid var(--line);
195
+ background:#fff;border-radius:10px;padding:10px 11px;cursor:pointer;font:inherit;color:inherit;min-height:64px}
196
+ .lens-opt:hover{background:var(--yellow)}
197
+ .lens-opt.on{border-color:var(--ink);background:var(--yellow);box-shadow:var(--shadow-sm)}
198
+ .lens-opt .box{margin-top:2px;flex:none}
199
+ .lens-opt b{display:block;font-size:13.5px;margin:0 0 3px}
200
+ .lens-opt .p{color:var(--muted);font-size:12px;line-height:1.45}
201
+ .lens-tray{margin:14px 0 0;border:2px dashed var(--line-ink);border-radius:12px;padding:12px 14px;background:#fffdf3}
202
+ .lens-tray h4{margin:0 0 8px;font-size:13px;color:var(--ink)}
203
+ .lens-tray h4 .n{color:var(--red);font-weight:800}
204
+ .lens-tray ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
205
+ .lens-tray li{display:flex;align-items:center;gap:8px;font-size:13px}
206
+ .lens-tray li input[type=text]{flex:1;border:1px solid var(--line);border-radius:7px;padding:5px 8px;font:inherit}
207
+ .lens-tray li .src{color:var(--muted);font-size:11px;white-space:nowrap}
208
+ .lens-tray li .dup{color:var(--red);font-size:11px}
209
+ .lens-tray li button{border:0;background:none;color:var(--red);cursor:pointer;font-size:12px}
210
+ .lens-tray .empty{color:var(--muted);font-size:12.5px;margin:0}
211
+ .lens-tray .warn{color:var(--red);font-size:12px;margin:8px 0 0}
212
+ .cut-opt{display:block;width:100%;text-align:left;border:2px solid var(--line-ink);background:#fff;
213
+ border-radius:12px;padding:12px 14px;cursor:pointer;box-shadow:var(--shadow-sm);font:inherit;color:inherit}
214
+ .cut-opt:hover{background:var(--yellow)}
215
+ .cut-opt b{display:block;font-size:15px;margin:0 0 4px}
216
+ .cut-opt .why{color:var(--muted);font-size:12.5px;line-height:1.45;margin:0 0 8px}
217
+ .cut-opt .chips{display:flex;flex-wrap:wrap;gap:6px}
218
+ .cut-opt .chips span{font-size:11.5px;padding:3px 8px;background:var(--module-soft);border-radius:999px;color:var(--ink)}
219
+ .arch-md{margin:12px 0 0;max-height:280px;overflow:auto;padding:10px 12px;border:1px solid var(--line);
220
+ border-radius:8px;background:#fff;font-size:11.5px;line-height:1.45;white-space:pre-wrap;
221
+ font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--ink)}
222
+ .arch-md[hidden]{display:none}
223
+ .first-use .kicker{color:var(--red);font-weight:800;font-size:11px;letter-spacing:.12em;text-transform:uppercase}
224
+ .first-use h2{margin:8px 0 8px;font-size:18px}
225
+ .first-use p{margin:0 0 10px;color:var(--muted);font-size:13.5px;line-height:1.6}
226
+ .first-use .actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}
227
+ .analyze-log{list-style:none;margin:14px 0 0;padding:0}
228
+ .analyze-log li{padding:8px 0;border-top:1px solid var(--line);font-size:13px;color:var(--muted)}
229
+ .analyze-log li:first-child{border-top:0}
230
+ .analyze-log li.wait{opacity:.4}
231
+ .analyze-log li.on{color:var(--ink);font-weight:800}
232
+ .analyze-log li.done{color:var(--green)}
233
+ .analyze-log li.done:before{content:"✓ ";font-weight:800}
234
+ .analyze-log .find{display:block;margin-top:4px;font-size:12px;font-weight:400;color:var(--muted)}
235
+ .analyze-log li.on .find{color:var(--ink)}
236
+ .analyze-log li.done .find{color:var(--green)}
237
+ .auth-btn.on{background:var(--auth);border-color:var(--auth);color:#fff}
238
+ .dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
239
+ .node .dot[data-hint]{position:relative;cursor:help;z-index:1}
240
+ .node .dot[data-hint]:before{content:"";position:absolute;inset:-7px}
241
+ .dot.dirty{background:var(--dot-dirty)} .dot.success{background:var(--dot-success)}
242
+ .dot.failed{background:var(--red)} .dot.untested{background:var(--gold)}
243
+ .dot.module{background:var(--module);border-radius:2px}
244
+ .dot.module.dirty{background:var(--dot-dirty)}
245
+ .dot.module.untested{background:var(--gold)}
246
+ .dot.module.success{background:var(--dot-success)}
247
+ .dot.module.failed{background:var(--red)}
248
+ .dot.proposed{background:#c7ccc6} .dot.noauth{background:#cfcfcf}
249
+ .dot-picks{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:10px 0 0}
250
+ .dot-pick{display:flex;align-items:center;gap:7px;width:100%;text-align:left;
251
+ padding:7px 9px;font-size:12px;font-weight:700;line-height:1.25;
252
+ border:2px solid transparent;background:transparent;box-shadow:none}
253
+ .dot-pick:hover{background:var(--module-soft);transform:none;box-shadow:none;border-color:transparent}
254
+ .dot-pick.on{border-color:var(--line-ink);background:#fff;box-shadow:none}
255
+ .dot-pick .dot{width:10px;height:10px}
256
+
257
+ /* ---------- 画布 ---------- */
258
+ #viewport{position:absolute;inset:var(--chrome-top) var(--drawer-width) 0 0;cursor:default;z-index:1;touch-action:none;overflow:hidden;overflow:clip;contain:paint;isolation:isolate}
259
+ .node.edge-sliver{visibility:hidden;pointer-events:none}
260
+ #viewport.grabbing{cursor:move}
261
+ #world{position:absolute;left:0;top:0;transform-origin:0 0}
262
+ #world.map-transition-zoom{will-change:transform}
263
+ .map-transition-snapshot{position:absolute;inset:0;z-index:5;pointer-events:none;opacity:1;will-change:opacity}
264
+ .map-transition-snapshot-world{position:absolute;left:0;top:0;transform-origin:0 0;will-change:transform}
265
+ .map-transition-snapshot .node{pointer-events:none}
266
+ .map-transition-snapshot .map-transition-snapshot-anchor{visibility:hidden}
267
+ body.map-transition-revealing #world .node:not(.map-transition-anchor){
268
+ opacity:var(--map-node-opacity,0);transform:none;transition:none}
269
+ body.map-transition-revealing #world #links path{
270
+ opacity:var(--map-link-opacity,0);transition:none}
271
+ body.map-transitioning #viewport{cursor:wait}
272
+ #links{position:absolute;left:0;top:0;overflow:visible;pointer-events:none}
273
+ #links path.link{fill:none;stroke:#5c564c;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:opacity .2s}
274
+ #links path.link.dimmed{opacity:.18}
275
+ #links path.link.focus-link{stroke:var(--green);stroke-width:2.4}
276
+ #links path.link.proposed-link{stroke:#c4c4be;stroke-dasharray:4 7;opacity:.28}
277
+ #links path.link.noauth-link{stroke:#9a9a94}
278
+ #links path.link.stem{stroke:#5c564c;stroke-width:2}
279
+ #links path.link.rel-dim{opacity:.12}
280
+ #links path.flow{fill:none;stroke:#5a7a62;stroke-width:1.7;stroke-dasharray:6 5;stroke-linecap:round;stroke-linejoin:round;opacity:.82}
281
+ #links path.flow.dim{opacity:.1}
282
+ #links path.flow.hot{stroke:#2f6f4e;stroke-width:2.15;opacity:1;stroke-dasharray:7 5}
283
+ #flow-labs{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:4;overflow:visible}
284
+ .flow-lab{
285
+ position:absolute;transform:translate(-50%,-50%);
286
+ font-size:11px;font-weight:700;line-height:1.25;color:#2f6f4e;
287
+ font-family:var(--font-ui, inherit);background:var(--bg);padding:1px 6px;
288
+ border-radius:4px;white-space:nowrap;pointer-events:none;box-sizing:border-box}
289
+ .node.ghost{opacity:.8;border-style:dashed;box-shadow:none}
290
+ .node.ghost.module{background:#f4f1ea}
291
+ .node.ghost .add-child,.node.ghost .add-pick{display:none}
292
+ .node.rel-dim{opacity:.16;filter:grayscale(.55) brightness(.82)}
293
+ .node.rel-dim.selected,.node.rel-hot.selected{opacity:1;filter:none}
294
+ .node.rel-hot{opacity:1;filter:none}
295
+ #dot-hint{position:fixed;z-index:28;max-width:220px;padding:6px 9px;
296
+ background:var(--paper);color:var(--ink);border:2px solid var(--line-ink);border-radius:8px;
297
+ box-shadow:none;font-size:12px;font-weight:700;line-height:1.35;pointer-events:none}
298
+ #dot-hint[hidden]{display:none}
299
+ body.rel-mode .node.rel-dim:hover{opacity:.4;filter:grayscale(.2) brightness(.96)}
300
+ body.rel-mode .node .add-child,body.rel-mode .node .add-pick{display:none}
301
+ /* ===== 节点:小圆角胶囊 ===== */
302
+ .node{position:absolute;display:flex;align-items:center;gap:6px;white-space:nowrap;
303
+ width:max-content;max-width:280px;word-break:keep-all;overflow:visible;
304
+ background:var(--paper);border:2px solid var(--line-ink);border-radius:16px;
305
+ padding:5px 13px 5px 11px;font-size:12.5px;line-height:1.45;cursor:pointer;user-select:none;
306
+ box-shadow:var(--shadow-sm);transition:opacity .2s, transform .12s}
307
+ .node:hover{transform:none;box-shadow:1px 1px 0 var(--line-ink)}
308
+ .node.selected{background:var(--yellow)}
309
+ .node.dimmed{opacity:.18}
310
+
311
+ /* 项目根:大号圆角 */
312
+ .node.root:not(.module){font-size:18px;font-weight:800;padding:16px 24px;border-width:2px;
313
+ border-radius:14px;max-width:none}
314
+
315
+ /* ===== 模块:便签卡片 ===== */
316
+ .node.module{display:flex;flex-direction:column;align-items:stretch;white-space:normal;
317
+ width:252px;max-width:252px;
318
+ border:2px solid var(--line-ink);background:var(--module-soft);border-radius:8px;
319
+ padding:14px 16px 13px;box-shadow:var(--shadow);word-break:keep-all}
320
+ .node.module:hover{transform:none;box-shadow:2px 2px 0 var(--line-ink)}
321
+ .node.module .m-head{display:flex;align-items:flex-start;gap:8px;font-weight:800;font-size:18px;line-height:1.3;color:var(--ink)}
322
+ .node.module .m-head .dot,.node.module .m-head .lock,.node.module .m-head .part-tag,.node.module .m-head .auth-mark,.node.module .m-head .focus-mark{flex:0 0 auto;margin-top:4px}
323
+ .node.module .m-head span{flex:1;min-width:0;white-space:normal;overflow:visible;word-break:keep-all;overflow-wrap:break-word}
324
+ .node.module .m-blurb{margin-top:6px;color:#8a8278;font-family:var(--font-note);font-size:11px;font-weight:400;line-height:1.4;
325
+ display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
326
+ .node.module .m-blurb:empty{display:none;margin:0}
327
+ .node.module.selected{background:#fff3bf}
328
+ .node.root.module{font-size:18px;font-weight:800}
329
+
330
+ /* Agent 提议节点(圆角虚线胶囊) */
331
+ .node.work{display:flex;align-items:flex-start;white-space:normal;width:max-content;max-width:280px;
332
+ font-size:12.5px;line-height:1.35;padding:6px 12px 6px 10px;border-radius:14px;word-break:keep-all}
333
+ .node.work > span{white-space:normal;overflow:visible;word-break:keep-all;overflow-wrap:break-word}
334
+ /* Agent 提议:灰虚线草稿;绿点单独画,不要整卡降透明度把点洗灰 */
335
+ .node.proposed{border:1.5px dashed rgba(110,110,106,.55);background:rgba(130,130,126,.1);
336
+ color:#8a8a86;box-shadow:none}
337
+ .node.proposed.module{border-radius:8px;background:rgba(130,130,126,.08);color:#7a7a76}
338
+ .node.proposed.module .m-head,
339
+ .node.proposed.module .m-head span{color:#7a7a76}
340
+ .node.proposed.module .m-blurb{color:#949490}
341
+ .node.proposed .dot{background:#c4c4be !important}
342
+ .node.proposed:hover,.node.proposed.module:hover{background:rgba(255,230,109,.22);
343
+ color:#6a6a66;transform:none;box-shadow:none}
344
+ .node.proposed.selected,.node.proposed.module.selected{background:rgba(255,230,109,.32);
345
+ color:#5a5a56;border-color:rgba(110,110,106,.7);box-shadow:none}
346
+ .node.proposed.module.selected .m-head,
347
+ .node.proposed.module.selected .m-head span{color:#5a5a56}
348
+ .node .new-dot{position:absolute;top:-5px;right:-5px;width:12px;height:12px;border-radius:50%;
349
+ background:#2f9e44;border:2px solid #fff;box-shadow:0 0 0 1px rgba(47,158,68,.4);
350
+ animation:pulse 1.6s ease-in-out infinite;z-index:2}
351
+ @keyframes pulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.25);opacity:.7}}
352
+ .node .join-spin{position:absolute;top:-6px;right:-6px;width:14px;height:14px;border-radius:50%;
353
+ border:2px solid rgba(47,158,68,.22);border-top-color:#2f9e44;background:#fff;
354
+ animation:spin .7s linear infinite;z-index:2;box-shadow:0 0 0 1px #fff}
355
+ @keyframes spin{to{transform:rotate(360deg)}}
356
+
357
+ /* 无权限:整卡灰色,和已授权的米色模块卡分开。选中仍用黄底,方便点进检查器。 */
358
+ .node.noauth{background:#d4d4d0;border-color:#a3a39c;color:#5c5c58;
359
+ box-shadow:2px 2px 0 #a3a39c}
360
+ .node.noauth .dot{background:#9a9a94 !important}
361
+ .node.noauth.module{background:#d4d4d0;border-color:#a3a39c;color:#5c5c58}
362
+ .node.noauth.module .m-head,
363
+ .node.noauth.module .m-head span{color:#5a5a56}
364
+ .node.noauth .m-blurb,
365
+ .node.noauth.module .m-blurb{color:#8a8a84}
366
+ .node.noauth.selected{background:var(--yellow);color:var(--ink);
367
+ border-color:var(--line-ink);box-shadow:var(--shadow)}
368
+ .node.module.noauth.selected{background:#fff3bf;color:var(--ink);
369
+ border-color:var(--line-ink);box-shadow:var(--shadow)}
370
+ .node.module.noauth.selected .m-head,
371
+ .node.module.noauth.selected .m-head span{color:var(--ink)}
372
+ .node.module.noauth.selected .m-blurb{color:#8a8278}
373
+ .node .lock{font-size:11px;margin-left:1px}
374
+ .node .part-tag{font-size:10.5px;color:var(--auth);font-weight:600}
375
+
376
+ /* 对照页预览:?theme=44|48|1|4 只换模块卡,不改顶栏结构 */
377
+ html[data-node-theme="44"]{ --bg:#fffaf3; }
378
+ html[data-node-theme="44"] .node{
379
+ border-color:#e6d3a8; border-radius:20px; color:#4a3f32;
380
+ box-shadow:0 6px 16px rgba(180,140,60,.1);
381
+ font-family:"IBM Plex Sans","PingFang SC",sans-serif;
382
+ }
383
+ html[data-node-theme="44"] .node:hover{
384
+ transform:none; box-shadow:0 10px 28px rgba(180,140,60,.18);
385
+ }
386
+ html[data-node-theme="44"] .node.module{
387
+ background:#fff; border-width:2px; border-color:#e6d3a8; border-radius:20px;
388
+ box-shadow:0 10px 28px rgba(180,140,60,.12);
389
+ }
390
+ html[data-node-theme="44"] .node.module:hover{
391
+ transform:none; box-shadow:0 12px 32px rgba(180,140,60,.18);
392
+ }
393
+ html[data-node-theme="44"] .node.root:not(.module),
394
+ html[data-node-theme="44"] .node.root.module{background:#fff6e5}
395
+ html[data-node-theme="44"] .node.selected,
396
+ html[data-node-theme="44"] .node.module.selected,
397
+ html[data-node-theme="44"] .node.noauth.selected,
398
+ html[data-node-theme="44"] .node.module.noauth.selected{background:#ffe9b8; color:#4a3f32; border-color:#e6d3a8; box-shadow:0 10px 28px rgba(180,140,60,.12)}
399
+ html[data-node-theme="44"] .node.module .m-blurb,
400
+ html[data-node-theme="44"] .node.module.noauth.selected .m-blurb{color:#9a8b78}
401
+ html[data-node-theme="44"] .node.noauth,
402
+ html[data-node-theme="44"] .node.noauth.module{
403
+ background:#eee9e0; border-color:#d9ccb4; color:#5c5c58;
404
+ box-shadow:0 6px 16px rgba(160,140,100,.08);
405
+ }
406
+ html[data-node-theme="44"] .dot.module:not(.untested):not(.success):not(.failed){background:#d4a017}
407
+ html[data-node-theme="44"] #links path.link,
408
+ html[data-node-theme="44"] #links path.link.stem{stroke:#e6d3a8}
409
+
410
+ html[data-node-theme="48"]{ --bg:#f8f4ea; }
411
+ html[data-node-theme="48"] .node{
412
+ border-color:#cfc6b4; border-radius:10px; box-shadow:2px 2px 0 #cfc6b4;
413
+ }
414
+ html[data-node-theme="48"] .node:hover{box-shadow:1px 1px 0 #cfc6b4}
415
+ html[data-node-theme="48"] .node.module{
416
+ background:#e7eef8; border-width:1.5px; border-color:#cfc6b4; border-radius:10px;
417
+ box-shadow:3px 3px 0 #cfc6b4;
418
+ }
419
+ html[data-node-theme="48"] .node.module:hover{box-shadow:2px 2px 0 #cfc6b4}
420
+ html[data-node-theme="48"] .node.root:not(.module),
421
+ html[data-node-theme="48"] .node.root.module{background:#ffe08a}
422
+ html[data-node-theme="48"] .node.selected,
423
+ html[data-node-theme="48"] .node.module.selected,
424
+ html[data-node-theme="48"] .node.noauth.selected,
425
+ html[data-node-theme="48"] .node.module.noauth.selected{background:#fde2c8; border-color:#cfc6b4; box-shadow:3px 3px 0 #cfc6b4}
426
+ html[data-node-theme="48"] .node.noauth,
427
+ html[data-node-theme="48"] .node.noauth.module{
428
+ background:#e4e0d6; border-color:#cfc6b4; box-shadow:2px 2px 0 #cfc6b4;
429
+ }
430
+ html[data-node-theme="48"] #links path.link,
431
+ html[data-node-theme="48"] #links path.link.stem{stroke:#cfc6b4}
432
+
433
+ html[data-node-theme="4"]{ --bg:#f5f5f2; }
434
+ html[data-node-theme="4"] .node{
435
+ border:1px solid #bbb; border-radius:10px; box-shadow:none; color:#222;
436
+ font-family:"IBM Plex Sans","PingFang SC",sans-serif;
437
+ }
438
+ html[data-node-theme="4"] .node:hover,
439
+ html[data-node-theme="4"] .node.module:hover{transform:none; box-shadow:none; border-color:#999}
440
+ html[data-node-theme="4"] .node.module{
441
+ background:#eeeae2; border:1px solid #bbb; border-radius:10px; box-shadow:none;
442
+ }
443
+ html[data-node-theme="4"] .node.root:not(.module),
444
+ html[data-node-theme="4"] .node.root.module{background:#fff4c2}
445
+ html[data-node-theme="4"] .node.selected,
446
+ html[data-node-theme="4"] .node.module.selected,
447
+ html[data-node-theme="4"] .node.noauth.selected,
448
+ html[data-node-theme="4"] .node.module.noauth.selected{background:#ffe9a8; border-color:#bbb; box-shadow:none}
449
+ html[data-node-theme="4"] .node.module .m-blurb,
450
+ html[data-node-theme="4"] .node.module.noauth.selected .m-blurb{color:#777; font-family:var(--font-note)}
451
+ html[data-node-theme="4"] .node.noauth,
452
+ html[data-node-theme="4"] .node.noauth.module{
453
+ background:#ddd; border-color:#ccc; box-shadow:none;
454
+ }
455
+ html[data-node-theme="44"] .node.root.module.drilled-root:not(.noauth){background:#fff}
456
+ html[data-node-theme="48"] .node.root.module.drilled-root:not(.noauth){background:#e7eef8}
457
+ html[data-node-theme="4"] .node.root.module.drilled-root:not(.noauth){background:#eeeae2}
458
+ html[data-node-theme="4"] .dot.module:not(.untested):not(.success):not(.failed){background:#4a7ab5}
459
+ html[data-node-theme="4"] #links path.link,
460
+ html[data-node-theme="4"] #links path.link.stem{stroke:#bbb}
461
+
462
+ .theme-preview-banner{display:none;position:fixed;left:12px;bottom:12px;z-index:35;
463
+ padding:6px 10px;background:#fff;border:2px solid var(--line-ink);border-radius:8px;
464
+ font-size:12px;font-weight:700;box-shadow:var(--shadow-sm)}
465
+ html.theme-preview .theme-preview-banner{display:none}
466
+ .phone-preview-banner{display:none;position:fixed;left:12px;bottom:12px;z-index:35;
467
+ padding:6px 10px;background:#fff;border:2px solid var(--line-ink);border-radius:8px;
468
+ font-size:12px;font-weight:700;box-shadow:var(--shadow-sm)}
469
+ html.phone-preview .phone-preview-banner{display:block}
470
+ html.theme-preview.phone-preview .phone-preview-banner{bottom:52px}
471
+
472
+ .settings-wrap{position:relative;flex:0 0 auto}
473
+ #btn-settings{width:var(--chrome-btn-h);height:var(--chrome-btn-h);padding:0;display:inline-grid;place-items:center;flex:0 0 auto}
474
+ #btn-settings .gear-icon{width:18px;height:18px;display:block}
475
+ .settings-menu{display:none;position:absolute;right:0;top:100%;margin-top:8px;z-index:40;width:248px;
476
+ background:var(--paper);border:2px solid var(--line-ink);border-radius:10px;box-shadow:var(--shadow);padding:10px}
477
+ .settings-menu.open{display:block}
478
+ .settings-menu{max-height:calc(100dvh - 90px);overflow-y:auto}
479
+ .settings-menu .set-label{font-size:11px;font-weight:800;color:var(--muted);letter-spacing:.06em;margin:0 0 6px}
480
+ .settings-menu .set-block + .set-block{margin-top:12px;padding-top:10px;border-top:1px solid var(--line)}
481
+ .settings-menu .set-tools{display:flex;flex-direction:column;gap:6px}
482
+ .settings-menu .set-tools .rel-toggle,
483
+ .settings-menu .set-tools .tray-btn{width:100%;box-sizing:border-box}
484
+ .settings-menu .set-tools .rel-toggle button{width:100%}
485
+ #btn-tray.on{background:var(--yellow);font-weight:800}
486
+ #btn-beta-motion{display:flex;align-items:center;justify-content:flex-start;gap:8px;width:100%;box-sizing:border-box}
487
+ #btn-beta-motion.on{background:var(--yellow);font-weight:800}
488
+ .beta-badge{display:inline-flex;align-items:center;min-height:18px;padding:0 6px;border:1.5px solid var(--line-ink);border-radius:999px;background:var(--module-soft);font-size:9px;font-weight:900;letter-spacing:.08em;line-height:1}
489
+ #btn-beta-motion.on .beta-badge{background:var(--paper)}
490
+ .theme-picks{display:flex;flex-direction:column;gap:4px}
491
+ .theme-pick{display:flex;align-items:center;gap:8px;width:100%;text-align:left;
492
+ border:2px solid transparent;background:transparent;box-shadow:none;border-radius:8px;
493
+ padding:6px 8px;font-size:13px;font-weight:700}
494
+ .theme-pick:hover{background:var(--module-soft);transform:none;box-shadow:none;border-color:transparent}
495
+ .theme-pick.on{border-color:var(--line-ink);background:var(--yellow);box-shadow:var(--shadow-sm)}
496
+ .theme-pick .swatch{width:22px;height:14px;border-radius:4px;flex:0 0 auto;border:1.5px solid #2d2d2d}
497
+ .settings-menu .lang-toggle{width:100%}
498
+ .settings-menu .lang-toggle button{flex:1}
499
+ .sync-settings{font-size:12px}
500
+ .sync-settings summary{cursor:pointer;font-weight:700;color:var(--muted)}
501
+ .sync-settings p{line-height:1.5;overflow-wrap:anywhere}
502
+ .sync-actions{display:grid;gap:6px}
503
+ .sync-actions button{font-size:12px;padding:6px 8px;text-align:left}
504
+ .sync-settings label{display:block;margin-top:12px;color:var(--muted)}
505
+ .sync-settings select{display:block;width:100%;min-width:0;margin-top:5px;font:inherit}
506
+ .sync-notice{margin-left:8px;color:var(--red);font-size:12px;white-space:nowrap}
507
+ .publish-main{min-width:86px;white-space:nowrap}
508
+ .publish-main[data-status="ready"]{background:var(--yellow)}
509
+ .publish-main[data-status="published"]{color:var(--green);border-color:var(--green);background:var(--green-soft)}
510
+ .publish-main[data-status="waiting"],.publish-main[data-status="conflict"],.publish-main[data-status="error"]{color:var(--focus);background:#fff3bf}
511
+ .publish-main:disabled{cursor:default;opacity:.78;transform:none;box-shadow:var(--shadow-sm)}
512
+
513
+ /* 授权模式 */
514
+ body.auth-mode .node{cursor:cell}
515
+ .node .auth-mark{display:none;width:15px;height:15px;border-radius:50%;border:2px solid #c9bfdd;
516
+ align-items:center;justify-content:center;font-size:10px;color:#fff;flex:0 0 auto}
517
+ body.auth-mode .node .auth-mark{display:flex}
518
+ body.auth-mode .node .auth-mark.on{background:var(--auth);border-color:var(--auth)}
519
+ body.auth-mode .node:hover{border-color:var(--auth);box-shadow:0 2px 8px rgba(122,92,168,.25)}
520
+
521
+ .node .bug-badge{background:var(--red);color:#fff;border-radius:9px;min-width:17px;height:17px;
522
+ line-height:17px;text-align:center;font-size:11px;padding:0 5px}
523
+ .node .focus-mark{color:var(--focus);font-weight:700;font-size:11px}
524
+ .node .add-child{position:absolute;right:-10px;top:50%;transform:translateY(-50%);width:18px;height:18px;
525
+ border-radius:50%;border:2px solid;border-color:inherit;background:inherit;color:inherit;
526
+ font-size:12px;font-weight:600;line-height:14px;text-align:center;opacity:1;box-shadow:none;
527
+ cursor:pointer;transition:opacity .15s}
528
+ .node .add-pick{
529
+ display:none;position:absolute;left:calc(100% + 10px);top:50%;transform:translateY(-50%);
530
+ z-index:6;flex-direction:column;align-items:stretch;gap:2px;min-width:92px;padding:4px;
531
+ background:var(--paper);border:2px solid var(--line-ink);border-radius:10px;box-shadow:none;color:var(--ink)}
532
+ .node .add-pick button{
533
+ display:flex;align-items:center;justify-content:center;margin:0;height:auto;min-height:0;
534
+ padding:7px 10px;border:2px solid transparent;border-radius:8px;background:transparent;
535
+ box-shadow:none;font-size:12.5px;font-weight:700;line-height:1.2;color:var(--ink);cursor:pointer}
536
+ .node .add-pick button:hover,.node .add-pick button:focus{
537
+ background:var(--module-soft);transform:none;box-shadow:none;border-color:transparent}
538
+ .node.picking{z-index:5}
539
+ .node.picking .add-child{opacity:1}
540
+ .node.picking .add-pick{display:flex}
541
+ body.layout-tb .node .add-pick{
542
+ left:50%;top:auto;right:auto;bottom:-12px;transform:translate(-50%,100%)}
543
+ @media (hover:hover) and (pointer:fine){
544
+ .node .add-child{opacity:0}
545
+ .node:hover .add-child,.node.picking .add-child{opacity:.9}
546
+ }
547
+ .node .add-child:hover,.node.picking .add-child{opacity:1}
548
+ body.auth-mode .node .add-child,body.auth-mode .node .add-pick{display:none}
549
+
550
+ /* ---------- 已取消托盘 ---------- */
551
+ .tray{position:fixed;left:16px;top:calc(var(--chrome-top) + 8px);z-index:29;width:330px;background:var(--paper);
552
+ border:1px solid var(--line);border-radius:10px;box-shadow:0 6px 24px rgba(42,47,43,.14);
553
+ padding:14px 16px;display:none}
554
+ .tray.open{display:block}
555
+ .tray h3{margin:0 0 3px;font-size:14px}
556
+ .tray p.hint{margin:0 0 10px;font-size:12px;color:var(--muted)}
557
+ .tray ul{list-style:none;margin:0;padding:0}
558
+ .tray li{padding:9px 0;border-top:1px solid var(--line)}
559
+ .tray li:first-child{border-top:0}
560
+ .tray .t-title{font-size:13px;color:var(--muted);text-decoration:line-through}
561
+ .tray .t-actions{display:flex;gap:6px;margin-top:6px}
562
+ .tray .t-actions button{font-size:12px;padding:3px 9px}
563
+ .tray .t-actions .danger:hover{border-color:var(--red);color:var(--red)}
564
+ .tray .confirm-row{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:12.5px;color:var(--red)}
565
+ .tray .empty{color:var(--muted);font-size:12.5px;padding:6px 0}
566
+
567
+ /* ---------- 未修 Bug 面板 ---------- */
568
+ #btn-bugs.on,#btn-todos.on,#btn-coordinator[aria-expanded="true"]{background:var(--yellow);font-weight:800}
569
+ #btn-coordinator[hidden]{display:none}
570
+ .bug-panel{position:fixed;right:0;top:var(--chrome-top);bottom:0;z-index:22;width:var(--bug-panel-width);
571
+ background:var(--paper);border-left:2px solid var(--line-ink);overflow:auto;
572
+ padding:10px 0 20px;display:none;cursor:default}
573
+ .bug-panel.open{display:block}
574
+ body.bugs-open #viewport{right:var(--bug-panel-width)}
575
+ body.bugs-open .drawer{display:none}
576
+ body.bugs-open .drawer-split{right:calc(var(--bug-panel-width) - 12px)}
577
+ .bug-panel h3{margin:0 12px 6px;font-size:13px;font-weight:800}
578
+ .bug-panel ul{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
579
+ .bug-panel li{display:flex;align-items:center;gap:8px;
580
+ padding:8px 12px;border:0;border-bottom:1px solid var(--line);border-radius:0;cursor:pointer;margin:0}
581
+ .bug-panel li:hover{background:#fff}
582
+ .bug-panel li.on{background:#fff3bf;box-shadow:inset 3px 0 0 var(--line-ink)}
583
+ .bug-panel .bug-copy{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}
584
+ .bug-panel .bug-title{min-width:0;font-size:12.5px;font-weight:800;line-height:1.3;
585
+ display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
586
+ .bug-panel .bug-row{display:flex;align-items:center;flex:0 1 auto;max-width:52%;min-width:0;margin:0}
587
+ .bug-panel .bug-row .bug-status{max-width:100%}
588
+ .bug-panel .sess-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto}
589
+ .bug-panel .claim{font-size:11.5px;padding:0;border:0;box-shadow:none;background:transparent;color:var(--module);font-weight:800;white-space:nowrap}
590
+ .bug-panel .claim:hover{background:transparent;transform:none;box-shadow:none;text-decoration:underline}
591
+ .bug-panel li:not(.on) .claim{pointer-events:none;text-decoration:none}
592
+ .bug-panel .empty{color:var(--muted);font-size:12.5px;padding:8px 12px;border-bottom:0}
593
+ .bug-status{display:inline-flex;align-items:center;align-self:flex-start;max-width:100%;padding:2px 7px;border-radius:999px;
594
+ font-size:10.5px;font-weight:700;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
595
+ .bug-status.waiting{background:#fff3bf;color:var(--focus)}
596
+ .bug-status.processing{background:var(--blue-soft);color:var(--module)}
597
+ .bug-status.handoff{background:var(--red-soft);color:var(--red)}
598
+ .bug-status.settling,.bug-status.fixed,.bug-status.resolved{background:var(--green-soft);color:var(--green)}
599
+ .bug-status.unfixable{background:#eeeeec;color:var(--muted)}
600
+ .bug-main>.bug-status{margin:3px 0 0 8px}
601
+ body.bug-path-mode{background:#f7f1e6}
602
+ body.bug-path-mode header.top{background:#f7f1e6}
603
+ body.bug-path-mode .node .add-child,body.bug-path-mode .node .add-pick{display:none}
604
+ body.bug-path-mode .node.bug-target{border-color:var(--red);box-shadow:3px 3px 0 #c45c4a}
605
+ body.bug-path-mode .dir-toggle,
606
+ body.bug-path-mode .rel-toggle,
607
+ body.bug-path-mode #rel-hint{display:none}
608
+ body.bug-path-mode .drawer .lead{min-height:0;-webkit-line-clamp:2}
609
+ body.bug-path-mode .drawer .actions{margin-top:8px}
610
+ body.bug-path-mode .drawer h2{font-size:18px}
611
+ body.bug-path-mode .drawer .sess-dot{width:8px;height:8px;border-radius:50%;display:inline-block;align-self:center}
612
+ .nav-crumbs .bug-exit{font-size:12px;padding:3px 9px;margin-right:4px}
613
+ .nav-crumbs .bug-tag{background:var(--red-soft);color:var(--red);font-weight:800;padding:3px 9px;border-radius:6px}
614
+ #links path.link.bug-path{stroke:#8a5348;stroke-width:2.4}
615
+ #links path.current-flow{fill:none;stroke-width:4.6;stroke-dasharray:7 16;stroke-linecap:round;
616
+ opacity:1;filter:drop-shadow(0 0 5px #fff8) drop-shadow(0 0 7px);animation:current-run .65s linear infinite}
617
+ @keyframes current-run{to{stroke-dashoffset:-23}}
618
+ @media (prefers-reduced-motion:reduce){#links path.current-flow{animation:none}}
619
+ #currents{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:3;overflow:visible}
620
+ .current-bead{position:absolute;left:0;top:0;width:13px;height:13px;margin:-7px 0 0 -7px;
621
+ border-radius:50%;border:2px solid #fff;box-shadow:0 0 10px 3px rgba(255,255,255,.8);pointer-events:none;
622
+ offset-rotate:0deg;animation:bead-run .85s linear infinite}
623
+ .current-bead:after{content:"";position:absolute;inset:3px;border-radius:50%;background:#fff;opacity:.9}
624
+ @keyframes bead-run{from{offset-distance:0%}to{offset-distance:100%}}
625
+
626
+ /* ---------- 右侧抽屉 ---------- */
627
+ .drawer{position:fixed;top:var(--chrome-top);right:0;bottom:0;width:var(--drawer-width);z-index:20;background:var(--paper);
628
+ border-left:2px solid var(--line-ink);overflow:auto;padding:16px 16px 28px;cursor:default;
629
+ font-family:"IBM Plex Sans","Noto Sans SC","PingFang SC",sans-serif}
630
+ .drawer-split{position:fixed;top:var(--chrome-top);right:calc(var(--drawer-width) - 12px);width:24px;bottom:0;
631
+ z-index:25;cursor:col-resize;touch-action:none;background:rgba(45,45,45,.001)}
632
+ .drawer-split:before{content:"";position:absolute;top:0;bottom:0;left:11px;width:2px;background:transparent}
633
+ .drawer-split:hover:before,.drawer-split:focus-visible:before,body.drawer-resizing .drawer-split:before{
634
+ background:var(--line-ink)}
635
+ .drawer-split:hover,.drawer-split:focus-visible,body.drawer-resizing .drawer-split{
636
+ background:rgba(45,45,45,.08)}
637
+ body.drawer-resizing{cursor:col-resize;user-select:none}
638
+ body.drawer-resizing #viewport,
639
+ body.drawer-resizing .drawer,
640
+ body.drawer-resizing .bug-panel{pointer-events:none}
641
+ .crumbs{display:flex;flex-wrap:wrap;gap:6px;align-items:center;color:var(--muted);font-size:12px;margin-bottom:2px}
642
+ .crumbs a{color:var(--green);text-decoration:none;cursor:pointer}
643
+ .crumbs .sep{color:var(--line)}
644
+ .drawer h2{margin:4px 0 0;font-size:18px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-weight:700}
645
+ .drawer h2.detail-head{flex-wrap:nowrap;justify-content:space-between;width:100%}
646
+ .drawer h2 .head-main{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;flex:1}
647
+ .add-hint{margin:10px 0 0;font-size:12px;font-weight:700;color:var(--muted);line-height:1.4}
648
+ .delete-ask{margin:10px 0 0;padding:10px 12px;border:2px solid var(--line-ink);border-radius:10px;background:#fff;box-shadow:none}
649
+ .delete-ask p{margin:0 0 8px;font-size:12.5px;font-weight:700;line-height:1.4;color:var(--ink)}
650
+ .delete-ask .row{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
651
+ button.trash{
652
+ width:var(--chrome-btn-h);height:var(--chrome-btn-h);min-height:var(--chrome-btn-h);padding:0;
653
+ border:0;border-radius:8px;background:transparent;box-shadow:none;color:var(--red);
654
+ display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;overflow:visible}
655
+ button.trash:hover,button.trash:focus{
656
+ background:var(--red-soft);color:var(--red);transform:none;box-shadow:none;border-color:transparent}
657
+ button.trash svg{width:18px;height:18px;display:block;overflow:visible}
658
+ button.trash .lid{
659
+ transform-box:fill-box;transform-origin:center bottom;
660
+ transition:transform .22s cubic-bezier(.2,.8,.2,1)}
661
+ button.trash:hover .lid,button.trash:focus .lid{transform:rotate(-28deg) translate(-1px,-3px)}
662
+ @media (prefers-reduced-motion: reduce){
663
+ button.trash .lid{transition:none}
664
+ button.trash:hover .lid,button.trash:focus .lid{transform:none}
665
+ #world.map-transition-zoom,
666
+ body.map-transitioning #world .node,body.map-transitioning #world #links path{transition:none!important}
667
+ }
668
+ /* 荧光笔划在字上。线上是画廊 11 圆头笔。 */
669
+ .state-chip,
670
+ .g-chrome .st,
671
+ .g-add-mock .st,
672
+ .g-tr-mock .st{
673
+ --mark:#ffe66d;
674
+ position:relative;isolation:isolate;z-index:0;overflow:visible;
675
+ font-size:14px;font-weight:700;font-style:normal;flex:0 0 auto;
676
+ padding:0 5px;border-radius:0;background:transparent;color:var(--ink);
677
+ line-height:1.35}
678
+ .state-chip:before,
679
+ .g-chrome .st:before,
680
+ .g-add-mock .st:before,
681
+ .g-tr-mock .st:before{
682
+ content:"";position:absolute;z-index:-1;pointer-events:none;
683
+ left:-3px;right:-3px;top:.28em;bottom:.06em;
684
+ background:var(--mark);border-radius:10px;transform:skewX(-4deg);opacity:.92}
685
+ .state-chip.success{--mark:#c6ed6e}
686
+ .state-chip.untested{--mark:#ffe66d}
687
+ .state-chip.failed{--mark:#ffb3a6}
688
+ .state-chip.dirty{--mark:#a8cfff}
689
+ .state-chip.module{--mark:#f0e0b0}
690
+ .state-chip.proposed-chip{--mark:#e4e2dc;color:var(--muted)}
691
+ .state-chip.noauth-chip{--mark:#ecece8;color:#9a9d98}
692
+ .g-chrome .st,.g-add-mock .st,.g-tr-mock .st{--mark:#ffe66d}
693
+ .lead{margin:6px 0 0;color:var(--muted);font-size:12px;line-height:1.45;font-family:var(--font-note);
694
+ display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
695
+ min-height:2.9em}
696
+ .lead.ed{display:block;padding:6px 8px;min-height:1.5em;box-sizing:border-box}
697
+ .lead.ed:empty,
698
+ .lead.ed:focus{min-height:5.5em;padding:8px 10px;border:2px solid var(--line-ink);
699
+ border-radius:8px;background:#fff;overflow:auto;-webkit-line-clamp:unset}
700
+ .lead.ed:focus{background:var(--green-soft);border-color:var(--green);box-shadow:none}
701
+ .lead.ed:empty:before{content:"一句用途";color:var(--muted)}
702
+ html[lang="en"] .lead.ed:empty:before{content:"One-line purpose"}
703
+ .drawer .work-list{margin:8px 0 0;padding:0 0 0 18px;color:var(--muted);font-size:12px;line-height:1.45}
704
+ .drawer .work-list li{margin:0 0 2px}
705
+ .note{margin:8px 0 0;font-size:12.5px;color:var(--muted)}
706
+ .note.alert{color:var(--red)}
707
+ .proposal-evidence{margin:10px 0 0;padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:rgba(255,255,255,.48);font-size:12px;line-height:1.5;color:var(--muted)}
708
+ .proposal-evidence p{margin:0 0 4px}.proposal-evidence p:last-child{margin-bottom:0}.proposal-evidence b{color:var(--ink)}
709
+ .proposal-evidence code{font-family:var(--font-ui);font-size:11px;overflow-wrap:anywhere}
710
+ .actions{display:flex;gap:6px;margin:10px 0 0;flex-wrap:wrap;align-items:center}
711
+ .actions > button,.compose > button,.delete-ask .row button{
712
+ height:var(--chrome-btn-h);min-height:var(--chrome-btn-h);padding:0 12px;line-height:1;
713
+ display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box}
714
+ .files-row{margin-top:10px}
715
+ .compose{display:flex;gap:6px;margin-top:10px;align-items:stretch}
716
+ .compose .ed{flex:1;min-width:0;min-height:40px;padding:8px 12px;line-height:1.45;
717
+ display:block;box-sizing:border-box;border:2px solid var(--line-ink);border-radius:8px;background:#fff}
718
+ .compose .ed:focus{background:var(--green-soft);border-color:var(--green);box-shadow:none}
719
+ .confirm-row{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:12.5px;color:var(--red)}
720
+ button{font:inherit;font-size:13px;font-weight:700;padding:6px 12px;border:2px solid var(--line-ink);background:var(--paper);
721
+ border-radius:8px;cursor:pointer;color:var(--ink);box-shadow:var(--shadow-sm)}
722
+ button:hover{background:var(--yellow);color:var(--ink);transform:translate(1px,1px);box-shadow:1px 1px 0 var(--line-ink)}
723
+ button.primary{background:var(--red);border-color:var(--line-ink);color:#fffef9}
724
+ button.primary:hover{opacity:1;background:#c93d3d;color:#fffef9}
725
+ button.auth-primary{background:var(--auth);border-color:var(--line-ink);color:#fff}
726
+ button.auth-primary:hover{opacity:1;color:#fff}
727
+ button.warn:hover{border-color:var(--line-ink);background:var(--red-soft);color:var(--red)}
728
+ button.quiet{border-color:transparent;color:var(--muted);padding:6px 8px;box-shadow:none}
729
+ button.quiet:hover{border-color:var(--line-ink);color:var(--ink);box-shadow:var(--shadow-sm);background:var(--paper)}
730
+ .plus-btn{width:28px;height:28px;padding:0;display:inline-grid;place-items:center;
731
+ font-size:18px;line-height:1;font-weight:700;border-radius:8px;border:0;background:transparent;
732
+ color:var(--muted);box-shadow:none}
733
+ .plus-btn:hover{transform:none;box-shadow:none;background:transparent;color:var(--ink)}
734
+ section.block{margin-top:14px}
735
+ section.block .block-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 4px}
736
+ section.block>h3,section.block .block-head h3{margin:0;font-size:13px;color:var(--ink);letter-spacing:0;font-weight:800}
737
+ .mem-list{list-style:none;margin:0;padding:0}
738
+ .mem-list li{display:flex;gap:9px;align-items:flex-start;padding:10px 0;border-top:1px solid var(--line);font-size:12.5px;font-family:var(--font-note)}
739
+ .mem-list li:first-child{border-top:0}
740
+ .mem-list .dot{margin-top:5px}
741
+ .mem-list .src{color:var(--muted);font-size:11px;margin-left:6px;white-space:nowrap}
742
+ .mem-list li.dirty-item{color:var(--muted)}
743
+ .mem-body,.bug-main{flex:1;min-width:0}
744
+ .mem-body .txt{display:block;width:100%;box-sizing:border-box;line-height:1.5;
745
+ min-height:1.5em;padding:2px 4px;overflow:hidden}
746
+ .mem-body .txt:not(:focus):not(:empty){display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
747
+ .mem-body .txt:empty,
748
+ .mem-body .txt:focus{min-height:6em;padding:8px 10px;border:2px solid var(--line-ink);
749
+ border-radius:8px;background:#fff;overflow:auto;-webkit-line-clamp:unset}
750
+ .mem-body .txt:focus{background:var(--green-soft);border-color:var(--green);box-shadow:none}
751
+ .mem-body .txt:empty:before{content:"写一条记忆";color:var(--muted)}
752
+ .mem-body .txt[data-ed="idea"]:empty:before{content:"写一条 Idea"}
753
+ html[lang="en"] .mem-body .txt:empty:before{content:"Write a memory"}
754
+ html[lang="en"] .mem-body .txt[data-ed="idea"]:empty:before{content:"Write an idea"}
755
+ .empty{color:var(--muted);font-size:13px;padding:4px 0}
756
+ .ed{cursor:text;border-radius:6px;outline:none;-webkit-user-modify:read-write-plaintext-only;
757
+ min-height:1.6em;line-height:1.5;padding:4px 6px;box-sizing:border-box}
758
+ .ed:hover{background:rgba(47,125,99,.07)}
759
+ .ed:focus{background:var(--green-soft);box-shadow:inset 0 -2px 0 var(--green)}
760
+ .ed.ghost{color:var(--muted)}
761
+ .ed.ghost:focus{color:var(--ink)}
762
+ .text-link{color:#2467a6;text-decoration:underline;text-decoration-thickness:1px;
763
+ text-underline-offset:2px;overflow-wrap:anywhere;cursor:pointer}
764
+ .text-link:hover{color:#174a7a}
765
+ h2 .ed{flex:1 1 auto;min-width:4em;min-height:1.2em;padding:2px 4px}
766
+ .sec-block{margin-top:0;padding:16px 0 12px;border-top:1px solid var(--line)}
767
+ .sec-add{display:inline-flex;align-items:center;gap:6px}
768
+ .sec-block .mem-list,.sec-block .bug-list{margin-top:8px}
769
+ details.fold{margin-top:0;border-top:1px solid var(--line);padding:16px 0 12px}
770
+ details.fold>summary{cursor:pointer;color:var(--muted);font-size:13px;list-style:none;
771
+ display:flex;align-items:center;gap:8px;min-height:28px;line-height:1.4;padding:4px 0}
772
+ details.fold>summary .plus-btn{margin-left:auto}
773
+ details.fold>summary::-webkit-details-marker{display:none}
774
+ details.fold>summary:hover{color:var(--ink)}
775
+ details.fold .mem-list,details.fold .bug-list,details.fold .dormant-list{margin-top:2px}
776
+ details.fold .mem-list li,details.fold .bug-list li,details.fold .dormant-list li{padding:10px 0 8px}
777
+ .memory-document-editor{display:block;width:100%;min-height:160px;box-sizing:border-box;margin:10px 0;padding:10px;border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;resize:vertical}
778
+ .memory-document-editor:focus{outline:2px solid var(--green);outline-offset:1px}
779
+
780
+ .bug-list{list-style:none;margin:0;padding:0}
781
+ .bug-list li{display:flex;gap:10px;align-items:flex-start;padding:10px 0;border-top:1px solid var(--line)}
782
+ .bug-list li:first-child{border-top:0}
783
+ .bug-check{width:18px;height:18px;border:2px solid var(--red);border-radius:5px;cursor:pointer;
784
+ flex:0 0 auto;margin-top:1px;display:flex;align-items:center;justify-content:center;
785
+ font-size:12px;color:#fff;background:#fff}
786
+ .bug-check:hover{background:var(--red-soft)}
787
+ .bug-check.done{background:var(--green);border-color:var(--green)}
788
+ .bug-title{font-weight:700;font-size:13px;display:block;min-height:2.2em;padding:8px 10px;line-height:1.4;box-sizing:border-box}
789
+ .bug-title.ed:empty:before{content:"Bug 标题";color:var(--muted);font-weight:600}
790
+ html[lang="en"] .bug-title.ed:empty:before{content:"Bug title"}
791
+ .bug-title.ed:empty,
792
+ .bug-title.ed:focus{min-height:2.6em;border:2px solid var(--line-ink);border-radius:8px;background:#fff}
793
+ .bug-title.ed:focus{background:var(--green-soft);border-color:var(--green);box-shadow:none}
794
+ .bug-sub{color:var(--muted);font-size:11px;margin-top:2px;min-height:1.2em;font-family:var(--font-note)}
795
+ .bug-sub.ed:empty:before{content:"补充说明(可选)";color:#b5bab6}
796
+ html[lang="en"] .bug-sub.ed:empty:before{content:"Notes (optional)"}
797
+ .bug-pending .bug-title{text-decoration:line-through;color:var(--muted)}
798
+ .summarizing{color:var(--green);font-size:12px;margin-top:3px}
799
+ .todo-list{list-style:none;margin:8px 0 0;padding:0}
800
+ .todo-list li{display:flex;gap:10px;align-items:flex-start;padding:10px 0;border-top:1px solid var(--line)}
801
+ .todo-list li:first-child{border-top:0}
802
+ .todo-check{width:18px;height:18px;padding:0;border:2px solid var(--module);border-radius:5px;box-shadow:none;
803
+ flex:0 0 auto;margin-top:5px;display:grid;place-items:center;background:#fff;color:#fff;font-size:12px}
804
+ .todo-check:hover{transform:none;box-shadow:none;background:var(--blue-soft)}
805
+ .todo-check.done{background:var(--green);border-color:var(--green)}
806
+ .todo-main{flex:1;min-width:0}
807
+ .todo-text{display:block;min-height:1.6em;padding:4px 6px;font-weight:700;font-size:13px;line-height:1.45}
808
+ .todo-text.ed:empty,.todo-text.ed:focus{min-height:5em;padding:8px 10px;border:2px solid var(--line-ink);border-radius:8px;background:#fff}
809
+ .todo-text.ed:focus{background:var(--green-soft);border-color:var(--green);box-shadow:none}
810
+ .todo-text.ed:empty:before{content:"写一条 TODO";color:var(--muted);font-weight:600}
811
+ html[lang="en"] .todo-text.ed:empty:before{content:"Write a TODO"}
812
+ .todo-done .todo-text{text-decoration:line-through;color:var(--muted)}
813
+ .todo-main>.bug-status{margin:3px 0 0 6px}
814
+ .todo-inline-action{margin:5px 0 0 6px;padding:2px 7px;border-width:1px;box-shadow:none;font-size:11.5px}
815
+
816
+ .dormant-box input{width:100%;font:inherit;font-size:12.5px;padding:6px 10px;border:1px solid var(--line);
817
+ border-radius:6px;background:#fff;margin:8px 0}
818
+ .dormant-list{list-style:none;margin:0;padding:0}
819
+ .dormant-list li{padding:10px 0;border-top:1px solid var(--line);color:var(--muted);font-size:12.5px}
820
+ .dormant-list li:first-child{border-top:0}
821
+ .dormant-list b{color:var(--ink)}
822
+ .dormant-list .exp{display:block;margin-top:3px}
823
+
824
+ .files{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:6px}
825
+ [data-drop-files].is-drop{outline:2px dashed var(--module);outline-offset:3px;background:var(--module-soft);border-radius:8px}
826
+ .file-chip{display:inline-flex;align-items:center;gap:6px;max-width:100%;
827
+ border:1px solid var(--line);border-radius:8px;background:#fff;padding:3px 8px 3px 4px;font-size:11.5px}
828
+ .file-thumb{width:36px;height:36px;object-fit:cover;border-radius:4px;background:#f4f1ea}
829
+ .file-name{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:160px;font-family:var(--font-note)}
830
+ .file-chip .file-name{min-width:0}
831
+ .file-status{min-width:0;overflow-wrap:anywhere}
832
+ .file-retry{flex:0 0 auto;white-space:nowrap;min-width:52px;padding:6px 10px;font-size:12px}
833
+ .file-chip .file-x{flex:0 0 auto}
834
+ .file-x{border:0;background:transparent;box-shadow:none;padding:0 2px;color:var(--muted);font-size:14px;line-height:1}
835
+ .file-x:hover{color:var(--red);background:transparent;transform:none;box-shadow:none}
836
+ .clip-btn{width:24px;height:24px;padding:0;font-size:11px;font-weight:800;border-radius:6px;box-shadow:none;flex:0 0 auto}
837
+ .file-add{display:flex;flex-wrap:wrap;gap:4px;align-items:center;width:100%}
838
+ .file-path{flex:1;min-width:140px;font:inherit;font-size:13px;padding:8px 10px;min-height:36px;
839
+ border:2px solid var(--line-ink);border-radius:8px;background:#fff;box-sizing:border-box}
840
+ .file-path:focus{border-color:var(--green);background:var(--green-soft);outline:none}
841
+
842
+ /* ---------- 手机竖屏:顶栏换行、检查器改底栏 ---------- */
843
+ /* 用 html.cg-phone,不靠 max-width。Safari「桌面网站」会把宽度报成 ~980,媒体查询不会中。 */
844
+ html.cg-phone header.top{
845
+ flex-wrap:wrap;align-items:center;gap:6px 8px;
846
+ padding:calc(6px + var(--safe-top)) 10px 6px;
847
+ }
848
+ html.cg-phone{--chrome-top:96px}
849
+ html.cg-phone header.top .brand{order:1;flex:1 1 0;min-width:0}
850
+ html.cg-phone .settings-wrap{order:2;flex:0 0 auto;margin-left:0}
851
+ html.cg-phone .top-tools{
852
+ order:4;flex:1 1 100%;margin-left:0;min-width:0;
853
+ overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;
854
+ scrollbar-width:thin;padding:2px 0 4px;gap:6px 8px;
855
+ }
856
+ html.cg-phone .top-tools > *{flex:0 0 auto}
857
+ html.cg-phone .workbench-tools-menu{
858
+ position:fixed;top:calc(var(--chrome-top) + 4px);left:10px;right:auto;
859
+ max-height:calc(100dvh - var(--chrome-top) - var(--safe-bottom) - 12px);overflow-y:auto;
860
+ }
861
+ html.cg-phone .repo-status{max-width:42vw}
862
+ html.cg-phone .repo-menu{min-width:0;width:min(280px,calc(100vw - 20px));max-height:min(70vh,480px);overflow:auto}
863
+ html.cg-phone .settings-menu{width:min(260px,calc(100vw - 16px));max-height:min(70vh,520px);overflow:auto}
864
+ html.cg-phone #rel-hint{white-space:nowrap}
865
+ html.cg-phone .tray-btn,html.cg-phone .auth-btn,
866
+ html.cg-phone .dir-toggle,html.cg-phone .rel-toggle,html.cg-phone .lang-toggle,
867
+ html.cg-phone .rel-toggle button,html.cg-phone .lang-toggle button{
868
+ height:var(--chrome-btn-h);min-height:var(--chrome-btn-h)
869
+ }
870
+ html.cg-phone .rel-toggle button,html.cg-phone .lang-toggle button{
871
+ padding-top:0;padding-bottom:0
872
+ }
873
+ html.cg-phone #btn-settings,html.cg-phone #btn-auth{width:var(--chrome-btn-h);height:var(--chrome-btn-h);min-height:var(--chrome-btn-h);padding:0}
874
+ html.cg-phone #viewport{inset:var(--chrome-top) 0 var(--drawer-height) 0}
875
+ html.cg-phone body.bugs-open #viewport{right:0;bottom:var(--drawer-height)}
876
+ html.cg-phone .drawer{
877
+ top:auto;left:0;right:0;bottom:0;width:100%;height:var(--drawer-height);
878
+ border-left:none;border-top:2px solid var(--line-ink);
879
+ padding:18px 14px calc(20px + var(--safe-bottom));
880
+ }
881
+ html.cg-phone .drawer-split{
882
+ top:auto;left:0;right:0;bottom:var(--drawer-height);width:100%;height:24px;
883
+ cursor:row-resize;transform:translateY(12px);
884
+ }
885
+ html.cg-phone .drawer-split:before{
886
+ top:7px;bottom:auto;left:50%;width:42px;height:4px;margin-left:-21px;
887
+ border-radius:2px;background:var(--line-ink);opacity:.35
888
+ }
889
+ html.cg-phone .drawer-split:hover:before,html.cg-phone .drawer-split:focus-visible:before,
890
+ html.cg-phone body.drawer-resizing .drawer-split:before{opacity:.7}
891
+ html.cg-phone body.drawer-resizing{cursor:row-resize}
892
+ html.cg-phone body.bugs-open .drawer-split{display:block;right:0;width:100%}
893
+ html.cg-phone .bug-panel{
894
+ top:auto;left:0;right:0;width:100%;height:var(--drawer-height);
895
+ border-left:none;border-top:2px solid var(--line-ink);
896
+ padding-bottom:calc(16px + var(--safe-bottom));
897
+ }
898
+ html.cg-phone .tray{
899
+ left:8px;right:8px;width:auto;max-height:min(52vh,420px);overflow:auto;
900
+ z-index:32
901
+ }
902
+ html.cg-phone .node.module{width:min(252px,86vw);max-width:min(252px,86vw)}
903
+ html.cg-phone .node .add-child{width:22px;height:22px;line-height:18px;font-size:13px;right:-11px;opacity:0;pointer-events:none}
904
+ html.cg-phone .node.selected .add-child,html.cg-phone .node.drilled-root .add-child,html.cg-phone .node.picking .add-child{opacity:1;pointer-events:auto}
905
+ html.cg-phone .node .add-child:after{content:"";position:absolute;inset:-12px}
906
+ html.cg-phone .node .add-pick button{min-height:var(--chrome-btn-h)}
907
+ html.cg-phone body.layout-tb .node .add-child{bottom:-11px}
908
+ html.cg-phone .node:hover,html.cg-phone .node.module:hover{transform:none}
909
+ html.cg-phone .first-use.open{align-items:flex-start;overflow:auto;padding:12px 0 calc(16px + var(--safe-bottom))}
910
+ html.cg-phone .first-use .card{width:min(720px,calc(100% - 20px));padding:18px 16px 16px;margin:0 auto}
911
+ html.cg-phone .first-use .card.wide{width:min(920px,calc(100% - 16px));max-height:none}
912
+ html.cg-phone .first-use h2{font-size:17px}
913
+ html.cg-phone .first-use .actions{flex-direction:column}
914
+ html.cg-phone .first-use .actions button{width:100%;min-height:44px}
915
+ html.cg-phone .lens-bar{left:8px;right:8px;bottom:8px;flex-wrap:wrap;gap:8px}
916
+ html.cg-phone .lens-group .lens-items{grid-template-columns:1fr}
917
+ html.cg-phone .ed,html.cg-phone .file-path,html.cg-phone .dormant-box input,html.cg-phone .lens-tray li input[type=text]{font-size:16px}
918
+ html.cg-phone .file-path{min-width:0}
919
+ html.cg-phone .file-name{max-width:min(160px,46vw)}
920
+ html.cg-phone .plus-btn{width:36px;height:36px}
921
+ html.cg-phone .sec-add{min-height:36px}
922
+ html.cg-phone .dot-pick{min-height:40px}
923
+ html.cg-phone .theme-preview-banner,html.cg-phone .phone-preview-banner{display:none !important}
924
+ html.cg-phone .drawer h2{font-size:18px}
925
+
926
+ #detail.coordinator-open{overflow:hidden;display:flex;flex-direction:column}
927
+ #detail.coordinator-open > :not(#coordinator-panel){display:none!important}
928
+ #coordinator-panel {
929
+ position: static; width: 100%; height: 100%; min-width: 0; min-height: 0; padding: 0;
930
+ background: transparent; border: 0; border-radius: 0;
931
+ box-sizing: border-box; box-shadow: none;
932
+ color: #302d26; font: 15px/1.58 system-ui, -apple-system, "PingFang SC", sans-serif;
933
+ }
934
+ #coordinator-panel[open]{display:flex;flex:1;flex-direction:column}
935
+ #coordinator-panel:not([open]) { display: none; }
936
+ #coordinator-panel > .coordinator-toolbar{display:flex;align-items:center;column-gap:12px;row-gap:0;margin:0 0 12px}
937
+ #coordinator-panel .coordinator-heading{margin:0 auto 0 0;padding:0;border:0;background:transparent;box-shadow:none;font-size:18px;font-weight:700;cursor:pointer}
938
+ #coordinator-panel .coordinator-heading:hover,#coordinator-panel .coordinator-heading:focus{background:transparent;box-shadow:none;transform:none;text-decoration:underline}
939
+ #coordinator-panel .coordinator-toolbar-action{display:grid;place-items:center;width:28px;height:28px;margin:0;padding:0;border:1px solid var(--line);border-radius:8px;background:transparent;box-shadow:none;color:var(--muted);font-size:16px;font-weight:700;line-height:1}
940
+ #coordinator-panel .coordinator-toolbar-action:hover{background:var(--module-soft);color:var(--ink);transform:none}
941
+ #coordinator-panel .coordinator-toolbar-action:focus-visible{outline:2px solid var(--module);outline-offset:2px;background:var(--paper);color:var(--ink);transform:none}
942
+ #coordinator-panel .coordinator-toolbar-action:active{background:var(--focus-soft);transform:scale(.96)}
943
+ #coordinator-panel .coordinator-history{margin:-4px 0 12px;padding:10px;border:1px solid #dccfaa;border-radius:12px;background:#faf3dc}
944
+ #coordinator-panel .coordinator-history h3{margin:0 0 8px;font-size:13px;color:#746e5e}
945
+ #coordinator-panel .coordinator-history-list{display:grid;gap:6px}
946
+ #coordinator-panel .coordinator-history-list button{width:100%;margin:0;padding:8px 10px;text-align:left;background:#fffdf8;box-shadow:none}
947
+ #coordinator-panel .coordinator-history-list button[aria-current=true]{background:#fff2ad;font-weight:650}
948
+ #coordinator-panel .coordinator-history-list p{margin:2px 4px;color:#817660;font-size:12px}
949
+ #coordinator-panel > [role=status] { color: #746e5e; font-size: 12px; margin: 8px 0 12px; }
950
+ #coordinator-panel > [role=status]:empty { display: none; }
951
+ #coordinator-panel .coordinator-messages { flex:1;min-height:0;max-height:none;overflow:auto;overflow-anchor:none;overflow-wrap:anywhere;overscroll-behavior:contain;padding:0 16px 36px 6px;scroll-padding-bottom:36px;scrollbar-gutter:stable; }
952
+ #coordinator-panel .coordinator-messages-tail{pointer-events:none}
953
+ #coordinator-panel .coordinator-message { width:min(100%,880px);margin:0 0 16px; }
954
+ #coordinator-panel .coordinator-message.user { width:fit-content;max-width:min(82%,760px);margin-left:auto; }
955
+ #coordinator-panel .coordinator-question { margin: 12px 0; padding: 14px; background: #faf3dc; border-radius: 12px; border: 1px solid #dccfaa; }
956
+ #coordinator-panel .coordinator-answer-compose { position: relative; margin-top: 12px; }
957
+ #coordinator-panel .coordinator-answer-compose textarea { min-height: 64px; padding: 10px 74px 44px 12px; }
958
+ #coordinator-panel .coordinator-answer-compose button,#coordinator-panel .coordinator-input-shell > button { position: absolute; right: 10px; bottom: 10px; margin: 0; background: #ffe87e; font-weight: 600; }
959
+ #coordinator-panel .coordinator-choices button[aria-pressed=true] { background: #ffe87e; border-color: #766126; }
960
+ #coordinator-panel .coordinator-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
961
+ #coordinator-panel .coordinator-actions p { flex-basis: 100%; margin: 0; color: #746e5e; font-size: 13px; }
962
+ #coordinator-panel .coordinator-answer { white-space: pre-wrap; background: #fff0a9; padding: 10px; border-radius: 8px; }
963
+ #coordinator-panel .coordinator-question-status { color: #817660; font-size: 13px; }
964
+ #coordinator-panel .coordinator-typing{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
965
+ #coordinator-panel .coordinator-planning{margin:0 0 18px;padding:0 2px;color:#817660;font-size:13px}
966
+ #coordinator-panel .coordinator-typing-phase{display:inline-block;color:#9a9287;background-image:linear-gradient(90deg,var(--coordinator-shimmer-base) 0%,var(--coordinator-shimmer-base) 25%,var(--coordinator-shimmer-highlight) 60%,var(--coordinator-shimmer-base) 75%,var(--coordinator-shimmer-base) 100%);background-size:200% 100%;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;--coordinator-shimmer-base:color-mix(in srgb,#817660 60%,transparent);--coordinator-shimmer-highlight:#302d26;animation:coordinator-text-shimmer 1s linear infinite}
967
+ @keyframes coordinator-text-shimmer{from{background-position:100% 0}to{background-position:-100% 0}}
968
+ #coordinator-panel .coordinator-working-blot{width:36px;height:36px;pointer-events:none;opacity:0;clip-path:circle(0% at 50% 50%);transition:opacity 1s cubic-bezier(.42,0,.2,1),clip-path 1s cubic-bezier(.42,0,.2,1)}
969
+ #coordinator-panel .coordinator-streaming-text{display:block}
970
+ #coordinator-panel .coordinator-rise+.coordinator-rise{margin-top:.55em}
971
+ #coordinator-panel .coordinator-rise-body{opacity:1;transform:translate3d(0,0,0);-webkit-font-smoothing:antialiased;transition:opacity 1.05s cubic-bezier(.22,.7,.2,1),transform 1.05s cubic-bezier(.22,.7,.2,1)}
972
+ #coordinator-panel .coordinator-rise-body>:first-child{margin-top:0}
973
+ #coordinator-panel .coordinator-rise-body>:last-child{margin-bottom:0}
974
+ @starting-style{#coordinator-panel .coordinator-rise.is-entering .coordinator-rise-body{opacity:0;transform:translate3d(0,12px,0)}}
975
+ @media (prefers-reduced-motion:reduce){
976
+ #coordinator-panel .coordinator-rise-body{transition:none}
977
+ }
978
+ #coordinator-panel .user .coordinator-markdown { background: #fff0a9; border-radius: 14px 14px 4px 14px; padding: 9px 13px; }
979
+ #coordinator-panel .coordinator-markdown p { margin: 0 0 8px; }
980
+ #coordinator-panel .coordinator-markdown > :last-child { margin-bottom: 0; }
981
+ #coordinator-panel .coordinator-markdown h2,#coordinator-panel .coordinator-markdown h3,#coordinator-panel .coordinator-markdown h4 { font-size: 1.08em; line-height: 1.5; margin: 18px 0 8px; }
982
+ #coordinator-panel .coordinator-markdown ul,#coordinator-panel .coordinator-markdown ol { margin: 10px 0; padding-left: 24px; }
983
+ #coordinator-panel .coordinator-markdown li { margin: 5px 0; }
984
+ #coordinator-panel .coordinator-markdown li p { margin: 4px 0; }
985
+ #coordinator-panel .coordinator-markdown strong { font-weight: 650; }
986
+ #coordinator-panel .coordinator-markdown code { font: .86em/1.6 ui-monospace, SFMono-Regular, Consolas, monospace; background: #eee9db; border-radius: 4px; padding: 2px 4px; }
987
+ #coordinator-panel .coordinator-markdown pre { padding: 12px; border-radius: 10px; background: #f0ebdf; overflow: auto; white-space: pre; }
988
+ #coordinator-panel .coordinator-markdown pre code { background: none; padding: 0; }
989
+ #coordinator-panel .coordinator-markdown blockquote { border-left: 3px solid #c8b978; padding-left: 12px; margin: 12px 0; color: #675f51; }
990
+ #coordinator-panel .coordinator-markdown a { color: #27624b; text-decoration: underline; text-underline-offset: 3px; }
991
+ #coordinator-panel .coordinator-markdown hr { display: none; }
992
+ #coordinator-panel .coordinator-table { overflow-x: auto; }
993
+ #coordinator-panel .coordinator-markdown table { border-collapse: collapse; margin: 10px 0; width: 100%; }
994
+ #coordinator-panel .coordinator-markdown th,#coordinator-panel .coordinator-markdown td { border: 1px solid #ddd4bf; padding: 7px 10px; text-align: left; }
995
+ #coordinator-panel .coordinator-markdown th { background: #f3eddb; }
996
+ #coordinator-panel .coordinator-markdown input[type=checkbox] { margin-right: 6px; }
997
+ #coordinator-panel .coordinator-meta { padding-top: 10px; color: #817660; font-size: 12px; }
998
+ #coordinator-panel .coordinator-meta summary { cursor: pointer; }
999
+ #coordinator-panel .coordinator-meta .coordinator-markdown { padding: 8px 10px; margin-top: 8px; background: #f5efdf; border-radius: 8px; overflow-wrap: anywhere; }
1000
+ #coordinator-panel .coordinator-meta .coordinator-markdown p { margin: 0 0 6px; }
1001
+ #coordinator-panel .coordinator-meta .coordinator-message { margin: 0; }
1002
+ #coordinator-panel .coordinator-meta .coordinator-markdown code { font-size: .9em; }
1003
+ #coordinator-panel .coordinator-extras > section { border: 1px solid #dccfaa; background: #faf3dc; border-radius: 12px; padding: 12px; margin: 14px 0; }
1004
+ #coordinator-panel .coordinator-extras > section p { white-space: pre-wrap; margin: 0 0 8px; }
1005
+ #coordinator-panel .coordinator-extras > section > .coordinator-markdown { margin-bottom: 10px; }
1006
+ .coordinator-review-inline { margin-top: 12px; padding: 12px; border: 1px solid #c8b978; border-radius: 10px; background: #fff8d8; }
1007
+ .coordinator-review-inline h3 { margin: 0 0 8px; font-size: 1em; }
1008
+ .coordinator-review-inline label { display: block; font-size: 13px; font-weight: 600; }
1009
+ .coordinator-review-inline textarea { display: block; margin-top: 6px; min-height: 82px; }
1010
+ .coordinator-review-inline p { margin: 8px 0 0; color: #746e5e; font-size: 12px; }
1011
+ .coordinator-review-inline form > div { margin-top: 4px; }
1012
+ .coordinator-review-dialog { width: min(460px, calc(100vw - 32px)); border: 2px solid #333; border-radius: 16px; padding: 20px; background: #fffcf4; color: #302d26; box-shadow: 5px 6px 0 #333; }
1013
+ .coordinator-review-dialog::backdrop { background: rgb(48 45 38 / 28%); }
1014
+ .coordinator-review-dialog textarea { margin-top: 8px; min-height: 100px; }
1015
+ #coordinator-panel form { padding-top: 8px; margin-top: 2px; }
1016
+ #coordinator-panel textarea { width: 100%; box-sizing: border-box; border: 1px solid #cfc4aa; background: #fffdf8; border-radius: 12px; min-height: 48px; max-height: 140px; height: 48px; padding: 10px 12px; resize: none; overflow-y: auto; font: inherit; transition:border-color .18s ease,box-shadow .18s ease; }
1017
+ #coordinator-panel textarea:focus { outline: 2px solid #bba759; outline-offset: 1px; }
1018
+ #coordinator-panel .coordinator-input-shell { position:relative; }
1019
+ #coordinator-panel .coordinator-input-shell textarea { display:block; padding:10px 48px 10px 12px; }
1020
+ #coordinator-panel .coordinator-session-create { margin-top: 12px; padding: 12px; border: 1px solid #dccfaa; border-radius: 12px; background: #faf3dc; }
1021
+ #coordinator-panel .coordinator-session-create form { padding: 0; margin: 0; display: grid; grid-template-columns: minmax(0,1fr) minmax(130px,.8fr); gap: 8px; }
1022
+ #coordinator-panel .coordinator-session-create input,#coordinator-panel .coordinator-session-create select { min-width: 0; box-sizing: border-box; border: 1px solid #cfc4aa; background: #fffdf8; border-radius: 9px; padding: 8px 10px; font: inherit; }
1023
+ #coordinator-panel .coordinator-session-create button { margin: 0; }
1024
+ #coordinator-panel .coordinator-session-create p { margin: 9px 0 0; color: #746e5e; font-size: 12px; }
1025
+ #coordinator-panel .coordinator-session-create ul { margin: 9px 0 0; padding-left: 20px; color: #746e5e; font-size: 12px; }
1026
+ #coordinator-panel button { margin: 8px 8px 0 0; padding: 7px 16px; border: 1px solid #bdae89; border-radius: 9px; font: inherit; cursor: pointer; }
1027
+ #coordinator-panel .coordinator-input-shell > .coordinator-send{position:absolute;right:8px;top:50%;display:grid;place-items:center;width:32px;height:32px;min-height:32px;margin:0;padding:0;border:0;border-radius:50%;background:#2f6fd6;color:#fff;box-shadow:none;transform:translateY(-50%);transition:background 1s cubic-bezier(.42,0,.2,1),color 1s cubic-bezier(.42,0,.2,1),transform .16s ease}
1028
+ #coordinator-panel .coordinator-input-shell > .coordinator-send svg{width:19px;height:19px;opacity:1;transition:opacity 1s cubic-bezier(.42,0,.2,1)}
1029
+ #coordinator-panel .coordinator-input-shell > .coordinator-send svg{grid-area:1/1}
1030
+ #coordinator-panel .coordinator-input-shell > .coordinator-send canvas{position:absolute;left:50%;top:50%;margin:-18px 0 0 -18px}
1031
+ #coordinator-panel .coordinator-input-shell > .coordinator-send:not(:disabled):hover{background:#285fb8;transform:translateY(-50%);box-shadow:none}
1032
+ #coordinator-panel .coordinator-input-shell > .coordinator-send:not(:disabled):active{transform:translateY(-50%) scale(.94)}
1033
+ #coordinator-panel .coordinator-input-shell > .coordinator-send:focus-visible{outline:2px solid #2f6fd6;outline-offset:2px}
1034
+ #coordinator-panel .coordinator-input-shell > .coordinator-send:disabled{background:#deddd9;color:#8e8d89;opacity:1}
1035
+ #coordinator-panel .coordinator-input-shell > .coordinator-send.is-working:disabled{background:transparent;color:#b8891b;overflow:visible}
1036
+ #coordinator-panel .coordinator-input-shell > .coordinator-send .coordinator-ink-fallback{position:absolute;left:50%;top:50%;width:36px;height:36px;margin:-18px 0 0 -18px;opacity:0;fill:#bd391e;pointer-events:none;animation:coordinator-ink-hue 16s linear infinite paused}
1037
+ #coordinator-panel .coordinator-send.is-working svg:not(.coordinator-ink-fallback){opacity:0}
1038
+ #coordinator-panel .coordinator-send.is-working .coordinator-ink-fallback{opacity:1;animation-play-state:running}
1039
+ #coordinator-panel .coordinator-send.is-working-ready svg{opacity:0}
1040
+ #coordinator-panel .coordinator-send.is-working-ready .coordinator-ink-fallback{opacity:0}
1041
+ #coordinator-panel .coordinator-send.is-working-ready .coordinator-working-blot{opacity:1;clip-path:circle(75% at 50% 50%)}
1042
+ @keyframes coordinator-ink-hue{to{filter:hue-rotate(360deg)}}
1043
+ @media(prefers-reduced-motion:reduce){#coordinator-panel .coordinator-input-shell > .coordinator-send .coordinator-ink-fallback{animation:none}}
1044
+ @media (prefers-reduced-motion:reduce){#coordinator-panel .coordinator-input-shell > .coordinator-send,#coordinator-panel .coordinator-input-shell > .coordinator-send svg,#coordinator-panel .coordinator-working-blot{transition:none}#coordinator-panel .coordinator-typing-phase{animation:none;background-image:none;-webkit-text-fill-color:currentColor}}
1045
+ #coordinator-panel button[type=submit] { background: #ffe87e; font-weight: 600; }
1046
+ #coordinator-panel button:disabled { opacity: .5; cursor: default; }
1047
+ #coordinator-panel .coordinator-node-link { display: inline; margin: 0; padding: 2px 7px; color: #27624b; background: #fff2ad; font-weight: 650; vertical-align: baseline; }
1048
+ #coordinator-panel .coordinator-node-link:hover { background: #ffe87e; }
1049
+ #coordinator-panel .coordinator-node-link:focus-visible { outline: 2px solid #27624b; outline-offset: 2px; }
1050
+ @media(max-width: 520px){#coordinator-panel .coordinator-session-create form{grid-template-columns:1fr;}}