studiograph 1.2.0-beta.9 → 1.2.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 (226) hide show
  1. package/README.md +13 -18
  2. package/dist/agent/orchestrator.d.ts +56 -0
  3. package/dist/agent/orchestrator.js +167 -22
  4. package/dist/agent/orchestrator.js.map +1 -1
  5. package/dist/agent/prompts/system.md +51 -63
  6. package/dist/agent/skill-loader.js +8 -0
  7. package/dist/agent/skill-loader.js.map +1 -1
  8. package/dist/agent/skills/entity-schema.md +4 -19
  9. package/dist/agent/skills/gather-context.md +1 -1
  10. package/dist/agent/tools/graph-tools.d.ts +41 -1
  11. package/dist/agent/tools/graph-tools.js +133 -57
  12. package/dist/agent/tools/graph-tools.js.map +1 -1
  13. package/dist/agent/tools/ops-tools.js +82 -0
  14. package/dist/agent/tools/ops-tools.js.map +1 -1
  15. package/dist/agent/tools/permission-tools.d.ts +90 -0
  16. package/dist/agent/tools/permission-tools.js +207 -0
  17. package/dist/agent/tools/permission-tools.js.map +1 -0
  18. package/dist/agent/tools/sync-tools.js +2 -2
  19. package/dist/agent/tools/sync-tools.js.map +1 -1
  20. package/dist/auth/github.d.ts +1 -1
  21. package/dist/auth/github.js +21 -13
  22. package/dist/auth/github.js.map +1 -1
  23. package/dist/cli/commands/access.d.ts +11 -0
  24. package/dist/cli/commands/access.js +156 -0
  25. package/dist/cli/commands/access.js.map +1 -0
  26. package/dist/cli/commands/app.js +25 -2
  27. package/dist/cli/commands/app.js.map +1 -1
  28. package/dist/cli/commands/clear.d.ts +5 -0
  29. package/dist/cli/commands/clear.js +36 -0
  30. package/dist/cli/commands/clear.js.map +1 -0
  31. package/dist/cli/commands/clone.js +3 -3
  32. package/dist/cli/commands/clone.js.map +1 -1
  33. package/dist/cli/commands/collection.d.ts +10 -0
  34. package/dist/cli/commands/collection.js +187 -0
  35. package/dist/cli/commands/collection.js.map +1 -0
  36. package/dist/cli/commands/commit.js +2 -1
  37. package/dist/cli/commands/commit.js.map +1 -1
  38. package/dist/cli/commands/config.d.ts +100 -0
  39. package/dist/cli/commands/config.js +1 -1
  40. package/dist/cli/commands/config.js.map +1 -1
  41. package/dist/cli/commands/deploy.js +10 -1
  42. package/dist/cli/commands/deploy.js.map +1 -1
  43. package/dist/cli/commands/index.js +1 -1
  44. package/dist/cli/commands/index.js.map +1 -1
  45. package/dist/cli/commands/init.js +32 -40
  46. package/dist/cli/commands/init.js.map +1 -1
  47. package/dist/cli/commands/join.d.ts +0 -6
  48. package/dist/cli/commands/join.js +26 -111
  49. package/dist/cli/commands/join.js.map +1 -1
  50. package/dist/cli/commands/lint.js +1 -2
  51. package/dist/cli/commands/lint.js.map +1 -1
  52. package/dist/cli/commands/mcp.js +6 -5
  53. package/dist/cli/commands/mcp.js.map +1 -1
  54. package/dist/cli/commands/org.d.ts +10 -0
  55. package/dist/cli/commands/org.js +132 -0
  56. package/dist/cli/commands/org.js.map +1 -0
  57. package/dist/cli/commands/orphans.js +1 -2
  58. package/dist/cli/commands/orphans.js.map +1 -1
  59. package/dist/cli/commands/provision.js +3 -3
  60. package/dist/cli/commands/provision.js.map +1 -1
  61. package/dist/cli/commands/resolve.d.ts +8 -0
  62. package/dist/cli/commands/resolve.js +85 -0
  63. package/dist/cli/commands/resolve.js.map +1 -0
  64. package/dist/cli/commands/serve.js +55 -25
  65. package/dist/cli/commands/serve.js.map +1 -1
  66. package/dist/cli/commands/start.js +22 -205
  67. package/dist/cli/commands/start.js.map +1 -1
  68. package/dist/cli/commands/sync.js +53 -8
  69. package/dist/cli/commands/sync.js.map +1 -1
  70. package/dist/cli/commands/team.d.ts +12 -0
  71. package/dist/cli/commands/team.js +185 -0
  72. package/dist/cli/commands/team.js.map +1 -0
  73. package/dist/cli/index.js +41 -34
  74. package/dist/cli/index.js.map +1 -1
  75. package/dist/cli/scaffolding.d.ts +5 -3
  76. package/dist/cli/scaffolding.js +191 -97
  77. package/dist/cli/scaffolding.js.map +1 -1
  78. package/dist/cli/setup-wizard.js +20 -10
  79. package/dist/cli/setup-wizard.js.map +1 -1
  80. package/dist/cli/sync-review-interactive.js +1 -1
  81. package/dist/cli/sync-review-interactive.js.map +1 -1
  82. package/dist/core/graph.d.ts +5 -10
  83. package/dist/core/graph.js +84 -85
  84. package/dist/core/graph.js.map +1 -1
  85. package/dist/core/migration-runner.d.ts +42 -0
  86. package/dist/core/migration-runner.js +232 -0
  87. package/dist/core/migration-runner.js.map +1 -0
  88. package/dist/core/migration-types.d.ts +101 -0
  89. package/dist/core/migration-types.js +21 -0
  90. package/dist/core/migration-types.js.map +1 -0
  91. package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
  92. package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
  93. package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
  94. package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
  95. package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
  96. package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
  97. package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
  98. package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
  99. package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
  100. package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
  101. package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
  102. package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
  103. package/dist/core/migrations/index.d.ts +11 -0
  104. package/dist/core/migrations/index.js +23 -0
  105. package/dist/core/migrations/index.js.map +1 -0
  106. package/dist/core/types.d.ts +19 -34
  107. package/dist/core/types.js +3 -21
  108. package/dist/core/types.js.map +1 -1
  109. package/dist/core/user-config.d.ts +27 -0
  110. package/dist/core/user-config.js +51 -0
  111. package/dist/core/user-config.js.map +1 -1
  112. package/dist/core/validation.d.ts +978 -2182
  113. package/dist/core/validation.js +242 -397
  114. package/dist/core/validation.js.map +1 -1
  115. package/dist/core/workspace-manager.d.ts +32 -31
  116. package/dist/core/workspace-manager.js +171 -186
  117. package/dist/core/workspace-manager.js.map +1 -1
  118. package/dist/core/workspace.d.ts +0 -5
  119. package/dist/core/workspace.js +33 -101
  120. package/dist/core/workspace.js.map +1 -1
  121. package/dist/lib/lib/utils.d.ts +2 -0
  122. package/dist/lib/lib/utils.js +6 -0
  123. package/dist/lib/lib/utils.js.map +1 -0
  124. package/dist/mcp/tools.js +13 -13
  125. package/dist/mcp/tools.js.map +1 -1
  126. package/dist/server/chrome/chrome.css +562 -0
  127. package/dist/server/chrome/chrome.js +540 -0
  128. package/dist/server/index.js +163 -10
  129. package/dist/server/index.js.map +1 -1
  130. package/dist/server/plugin-loader.d.ts +7 -0
  131. package/dist/server/plugin-loader.js +9 -1
  132. package/dist/server/plugin-loader.js.map +1 -1
  133. package/dist/server/routes/chat.d.ts +3 -2
  134. package/dist/server/routes/chat.js +67 -16
  135. package/dist/server/routes/chat.js.map +1 -1
  136. package/dist/server/routes/git-api.d.ts +9 -0
  137. package/dist/server/routes/git-api.js +82 -0
  138. package/dist/server/routes/git-api.js.map +1 -0
  139. package/dist/server/routes/graph-api.d.ts +2 -2
  140. package/dist/server/routes/graph-api.js +267 -3
  141. package/dist/server/routes/graph-api.js.map +1 -1
  142. package/dist/server/routes/permissions-api.d.ts +9 -0
  143. package/dist/server/routes/permissions-api.js +176 -0
  144. package/dist/server/routes/permissions-api.js.map +1 -0
  145. package/dist/server/routes/workspace-api.d.ts +9 -0
  146. package/dist/server/routes/workspace-api.js +283 -0
  147. package/dist/server/routes/workspace-api.js.map +1 -0
  148. package/dist/services/assets/base.d.ts +2 -2
  149. package/dist/services/assets/base.js +4 -4
  150. package/dist/services/assets/base.js.map +1 -1
  151. package/dist/services/assets/index.d.ts +6 -6
  152. package/dist/services/assets/index.js +12 -12
  153. package/dist/services/assets/index.js.map +1 -1
  154. package/dist/services/git.d.ts +35 -0
  155. package/dist/services/git.js +93 -0
  156. package/dist/services/git.js.map +1 -1
  157. package/dist/services/github-provisioner.js +1 -2
  158. package/dist/services/github-provisioner.js.map +1 -1
  159. package/dist/services/github-service.d.ts +99 -0
  160. package/dist/services/github-service.js +310 -0
  161. package/dist/services/github-service.js.map +1 -0
  162. package/dist/services/markdown.js +4 -9
  163. package/dist/services/markdown.js.map +1 -1
  164. package/dist/services/memory-service.d.ts +4 -0
  165. package/dist/services/memory-service.js +13 -1
  166. package/dist/services/memory-service.js.map +1 -1
  167. package/dist/services/sync/commit.d.ts +2 -0
  168. package/dist/services/sync/commit.js +21 -6
  169. package/dist/services/sync/commit.js.map +1 -1
  170. package/dist/services/sync/graphrag-indexer.js +2 -2
  171. package/dist/services/sync/graphrag-indexer.js.map +1 -1
  172. package/dist/utils/git.d.ts +5 -0
  173. package/dist/utils/git.js +10 -0
  174. package/dist/utils/git.js.map +1 -1
  175. package/dist/utils/merge-resolver.d.ts +33 -8
  176. package/dist/utils/merge-resolver.js +157 -55
  177. package/dist/utils/merge-resolver.js.map +1 -1
  178. package/dist/utils/preflight.d.ts +1 -1
  179. package/dist/utils/preflight.js +1 -1
  180. package/dist/web/_app/env.js +1 -0
  181. package/dist/web/_app/immutable/assets/0.CDbX4Cwz.css +1 -0
  182. package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
  183. package/dist/web/_app/immutable/assets/3.BJy7pVXi.css +1 -0
  184. package/dist/web/_app/immutable/assets/4.Ad16uh9o.css +1 -0
  185. package/dist/web/_app/immutable/assets/5.BhKgiXd2.css +1 -0
  186. package/dist/web/_app/immutable/assets/6.CeHKR5ZY.css +1 -0
  187. package/dist/web/_app/immutable/assets/AppShell.CJtUfb0N.css +1 -0
  188. package/dist/web/_app/immutable/assets/ChatPanel.RFD5GGYI.css +1 -0
  189. package/dist/web/_app/immutable/assets/editor.CPAf2SRV.css +1 -0
  190. package/dist/web/_app/immutable/chunks/3_5VIr68.js +1 -0
  191. package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
  192. package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
  193. package/dist/web/_app/immutable/chunks/BButMJ6M.js +1 -0
  194. package/dist/web/_app/immutable/chunks/BiubvAUI.js +2 -0
  195. package/dist/web/_app/immutable/chunks/CAXuTUkp.js +1 -0
  196. package/dist/web/_app/immutable/chunks/CQENNNNl.js +6 -0
  197. package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
  198. package/dist/web/_app/immutable/chunks/CV8ganSj.js +23 -0
  199. package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
  200. package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
  201. package/dist/web/_app/immutable/chunks/DKyztuK9.js +1 -0
  202. package/dist/web/_app/immutable/chunks/DdNsM6oV.js +64 -0
  203. package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
  204. package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
  205. package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
  206. package/dist/web/_app/immutable/chunks/F20aIBpJ.js +1 -0
  207. package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
  208. package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
  209. package/dist/web/_app/immutable/chunks/YFT1281h.js +2 -0
  210. package/dist/web/_app/immutable/chunks/aosHekRC.js +1 -0
  211. package/dist/web/_app/immutable/chunks/fwnBoL5x.js +1 -0
  212. package/dist/web/_app/immutable/chunks/hHxe9oXh.js +1 -0
  213. package/dist/web/_app/immutable/entry/app.BFVUP2fV.js +2 -0
  214. package/dist/web/_app/immutable/entry/start.BqsXHYP6.js +1 -0
  215. package/dist/web/_app/immutable/nodes/0.DQ5KdeNU.js +1 -0
  216. package/dist/web/_app/immutable/nodes/1.DwnzyOvm.js +1 -0
  217. package/dist/web/_app/immutable/nodes/2.FZxrWJeh.js +1 -0
  218. package/dist/web/_app/immutable/nodes/3.CQVWlbKr.js +1 -0
  219. package/dist/web/_app/immutable/nodes/4.CEh40Z_h.js +16 -0
  220. package/dist/web/_app/immutable/nodes/5.D_QsCLEf.js +4 -0
  221. package/dist/web/_app/immutable/nodes/6.CndEQ0o5.js +2 -0
  222. package/dist/web/_app/version.json +1 -0
  223. package/dist/web/index.html +43 -0
  224. package/package.json +21 -3
  225. package/dist/agent/skills/bundled/enrich-entities.md +0 -124
  226. package/dist/agent/skills/bundled/gather-context.md +0 -46
@@ -0,0 +1,562 @@
1
+ /* ── Studiograph Chrome — Shared App Header & Footer ──── */
2
+
3
+ /* ── Theme Variables ─────────────────────────────────────
4
+ Dual naming: --color-* (web UI convention) + legacy aliases */
5
+ :root,
6
+ [data-theme="dark"] {
7
+ --color-bg: #09090b;
8
+ --color-surface: #222222;
9
+ --color-surface-raised: #2a2a2a;
10
+ --color-bg-surface: #18181b;
11
+ --color-border: #333333;
12
+ --color-border-strong: #555555;
13
+ --color-border-focus: #4488ff;
14
+ --color-text: #e9e9e9;
15
+ --color-text-primary: #e9e9e9;
16
+ --color-text-secondary: #888888;
17
+ --color-text-tertiary: #555555;
18
+ --color-accent: #6e6ee8;
19
+ --color-accent-hover: #5c5cd6;
20
+ --color-accent-muted: rgba(110, 110, 232, 0.3);
21
+ --color-bg-hover: #1a1a1f;
22
+ --color-danger: #ff4444;
23
+ --color-success: #34a853;
24
+ --color-destructive: #ea4335;
25
+ --color-warning: #e0a030;
26
+ --color-font-ui: 'Inter', ui-sans-serif, system-ui, sans-serif;
27
+ --color-font-mono: 'JetBrains Mono', ui-monospace, monospace;
28
+
29
+ /* Legacy aliases */
30
+ --bg: var(--color-bg);
31
+ --surface: var(--color-surface);
32
+ --surface-raised: var(--color-surface-raised);
33
+ --border: var(--color-border);
34
+ --border-focus: var(--color-border-focus);
35
+ --text: var(--color-text);
36
+ --text-secondary: var(--color-text-secondary);
37
+ --text-tertiary: var(--color-text-tertiary);
38
+ --accent: var(--color-accent);
39
+ --accent-hover: var(--color-accent-hover);
40
+ --accent-muted: var(--color-accent-muted);
41
+ --bg-hover: var(--color-bg-hover);
42
+ --danger: var(--color-danger);
43
+ --warning: var(--color-warning);
44
+ --font-ui: var(--color-font-ui);
45
+ --font-mono: var(--color-font-mono);
46
+ }
47
+
48
+ [data-theme="light"] {
49
+ --color-bg: #f8f8fa;
50
+ --color-surface: #ffffff;
51
+ --color-surface-raised: #f0f0f0;
52
+ --color-bg-surface: #ffffff;
53
+ --color-border: #dadadf;
54
+ --color-border-strong: #bbbbbb;
55
+ --color-border-focus: #2266dd;
56
+ --color-text: #1a1a1a;
57
+ --color-text-primary: #1a1a1a;
58
+ --color-text-secondary: #666666;
59
+ --color-text-tertiary: #999999;
60
+ --color-accent: #6e6ee8;
61
+ --color-accent-hover: #5c5cd6;
62
+ --color-accent-muted: rgba(110, 110, 232, 0.2);
63
+ --color-bg-hover: #e2e2e8;
64
+ --color-danger: #dd3333;
65
+ --color-success: #34a853;
66
+ --color-destructive: #ea4335;
67
+ --color-warning: #cc8800;
68
+ }
69
+
70
+ /* ── Layout ──────────────────────────────────────────────
71
+ When chrome is active, body becomes a flex column so app
72
+ content naturally fills the space between header and footer */
73
+ body.sg-chrome-active {
74
+ display: flex;
75
+ flex-direction: column;
76
+ height: 100vh;
77
+ margin: 0;
78
+ font-family: var(--font-ui, 'Inter', ui-sans-serif, system-ui, sans-serif);
79
+ -webkit-font-smoothing: antialiased;
80
+ -moz-osx-font-smoothing: grayscale;
81
+ background: var(--bg);
82
+ color: var(--text);
83
+ }
84
+
85
+ body.sg-chrome-active > :not(.sg-chrome-header):not(.sg-chrome-footer) {
86
+ flex: 1;
87
+ min-height: 0;
88
+ overflow: hidden;
89
+ }
90
+
91
+ /* Prevent iframes from stealing mouse events during drag-resize */
92
+ body.sg-dragging iframe { pointer-events: none; }
93
+
94
+ /* ── Header ────────────────────────────────────────────── */
95
+ .sg-chrome-header {
96
+ display: flex;
97
+ align-items: center;
98
+ justify-content: space-between;
99
+ height: 40px;
100
+ padding: 0 16px;
101
+ background: var(--bg);
102
+ border-bottom: 1px solid var(--border);
103
+ flex-shrink: 0;
104
+ z-index: 50;
105
+ }
106
+
107
+ .sg-chrome-header-left {
108
+ display: flex;
109
+ align-items: center;
110
+ gap: 8px;
111
+ min-width: 0;
112
+ }
113
+
114
+ .sg-chrome-back {
115
+ display: inline-flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ width: 28px;
119
+ height: 28px;
120
+ border-radius: 6px;
121
+ color: var(--text-tertiary);
122
+ text-decoration: none;
123
+ transition: color 0.15s, background 0.15s;
124
+ flex-shrink: 0;
125
+ }
126
+ .sg-chrome-back:hover { color: var(--text-secondary); background: var(--bg-hover); text-decoration: none; }
127
+
128
+ .sg-chrome-breadcrumb {
129
+ font-size: 13px;
130
+ color: var(--text-secondary);
131
+ white-space: nowrap;
132
+ overflow: hidden;
133
+ text-overflow: ellipsis;
134
+ }
135
+
136
+ .sg-chrome-breadcrumb .sg-chrome-sep {
137
+ color: var(--text-tertiary);
138
+ margin: 0 6px;
139
+ }
140
+
141
+ .sg-chrome-header-right {
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 4px;
145
+ }
146
+
147
+ .sg-chrome-save-status {
148
+ font-size: 12px;
149
+ color: var(--text-secondary);
150
+ margin-right: 4px;
151
+ }
152
+
153
+ .sg-chrome-divider {
154
+ width: 1px;
155
+ height: 18px;
156
+ background: var(--border);
157
+ margin: 0 2px;
158
+ }
159
+
160
+ /* Header buttons */
161
+ .sg-chrome-btn {
162
+ display: inline-flex;
163
+ align-items: center;
164
+ gap: 5px;
165
+ height: 28px;
166
+ padding: 0 12px;
167
+ border: 1px solid var(--border);
168
+ border-radius: 4px;
169
+ background: var(--surface);
170
+ color: var(--text);
171
+ font-family: var(--font-ui, 'Inter', ui-sans-serif, system-ui, sans-serif);
172
+ font-size: 12px;
173
+ font-weight: 400;
174
+ cursor: pointer;
175
+ transition: color 0.15s, background 0.15s;
176
+ white-space: nowrap;
177
+ }
178
+ .sg-chrome-btn:hover { background: var(--bg-hover); }
179
+ .sg-chrome-btn svg { flex-shrink: 0; }
180
+ .sg-chrome-btn-accent { background: var(--accent); color: #fff; border-color: var(--accent); }
181
+ .sg-chrome-btn-accent:hover { background: var(--accent-hover); }
182
+ .sg-chrome-btn-primary { background: var(--accent); color: #fff; border-color: var(--accent); font-weight: 500; }
183
+ .sg-chrome-btn-primary:hover { background: var(--accent-hover); }
184
+ .sg-chrome-btn:disabled { opacity: 0.5; cursor: default; pointer-events: none; }
185
+
186
+ /* Save status */
187
+ .sg-chrome-save-error { color: var(--color-destructive, #e55); }
188
+
189
+ /* View button slot */
190
+ .sg-chrome-view-slot { display: inline-flex; align-items: center; }
191
+
192
+ /* Overflow menu */
193
+ .sg-chrome-overflow-wrapper { position: relative; }
194
+
195
+ .sg-chrome-overflow-btn {
196
+ display: inline-flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ width: 28px;
200
+ height: 28px;
201
+ border: none;
202
+ border-radius: 4px;
203
+ background: transparent;
204
+ color: var(--text-tertiary);
205
+ cursor: pointer;
206
+ transition: color 0.15s, background 0.15s;
207
+ }
208
+ .sg-chrome-overflow-btn:hover { color: var(--text-secondary); background: var(--bg-hover); }
209
+
210
+ .sg-chrome-overflow-menu {
211
+ position: absolute;
212
+ top: calc(100% + 4px);
213
+ right: 0;
214
+ background: var(--surface);
215
+ border: 1px solid var(--border);
216
+ border-radius: 6px;
217
+ padding: 4px;
218
+ min-width: 180px;
219
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
220
+ z-index: 100;
221
+ display: none;
222
+ }
223
+ .sg-chrome-overflow-menu.open { display: block; }
224
+
225
+ .sg-chrome-menu-item {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: 8px;
229
+ width: 100%;
230
+ height: 28px;
231
+ padding: 0 12px;
232
+ border: none;
233
+ border-radius: 6px;
234
+ background: transparent;
235
+ color: var(--text);
236
+ font-family: var(--font-ui, 'Inter', ui-sans-serif, system-ui, sans-serif);
237
+ font-size: 13px;
238
+ cursor: pointer;
239
+ text-align: left;
240
+ transition: background 80ms ease;
241
+ }
242
+ .sg-chrome-menu-item:hover { background: var(--bg-hover); }
243
+ .sg-chrome-menu-item svg { flex-shrink: 0; color: var(--text-secondary); }
244
+ .sg-chrome-menu-item.sg-chrome-danger:hover { background: rgba(255,70,70,0.1); color: var(--danger); }
245
+ .sg-chrome-menu-item.sg-chrome-danger:hover svg { color: var(--danger); }
246
+
247
+ .sg-chrome-menu-sep {
248
+ height: 1px;
249
+ background: var(--border);
250
+ margin: 4px 8px;
251
+ }
252
+
253
+ /* ── Footer (matches StatusBar.svelte) ─────────────────── */
254
+ .sg-chrome-footer {
255
+ height: 36px;
256
+ flex-shrink: 0;
257
+ display: flex;
258
+ align-items: center;
259
+ justify-content: space-between;
260
+ padding: 0 16px 0 18px;
261
+ position: relative;
262
+ background: var(--color-bg);
263
+ border-top: 1px solid var(--color-border);
264
+ font-size: 12px;
265
+ z-index: 50;
266
+ box-sizing: border-box;
267
+ width: 100%;
268
+ }
269
+
270
+ .sg-chrome-footer-left {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 10px;
274
+ }
275
+
276
+ .sg-chrome-footer-center {
277
+ position: absolute;
278
+ left: 50%;
279
+ transform: translateX(-50%);
280
+ display: flex;
281
+ align-items: center;
282
+ gap: 8px;
283
+ }
284
+
285
+ .sg-chrome-footer-right {
286
+ display: flex;
287
+ align-items: center;
288
+ gap: 8px;
289
+ }
290
+
291
+ /* Theme toggle — in footer left */
292
+ .sg-chrome-theme-toggle {
293
+ display: flex;
294
+ align-items: center;
295
+ justify-content: center;
296
+ width: 22px;
297
+ height: 22px;
298
+ border: 1px solid var(--color-border);
299
+ background: transparent;
300
+ color: var(--color-text-tertiary);
301
+ cursor: pointer;
302
+ border-radius: 4px;
303
+ transition: color 0.15s, border-color 0.15s;
304
+ }
305
+ .sg-chrome-theme-toggle:hover {
306
+ color: var(--color-text-primary);
307
+ border-color: var(--color-border-strong);
308
+ }
309
+
310
+ /* Workspace stats */
311
+ .sg-chrome-stat {
312
+ color: var(--color-text-tertiary);
313
+ font-size: 12px;
314
+ }
315
+ .sg-chrome-stat-sep {
316
+ color: var(--color-text-tertiary);
317
+ opacity: 0.5;
318
+ margin: 0 4px;
319
+ }
320
+
321
+ /* Revert button — plain text */
322
+ .sg-chrome-revert-btn {
323
+ display: inline-flex;
324
+ align-items: center;
325
+ height: 24px;
326
+ padding: 0 10px;
327
+ border: none;
328
+ background: transparent;
329
+ color: var(--color-text-tertiary);
330
+ font-family: inherit;
331
+ font-size: 12px;
332
+ cursor: pointer;
333
+ border-radius: 4px;
334
+ transition: color 0.15s, background 0.15s;
335
+ }
336
+ .sg-chrome-revert-btn:hover:not(:disabled) {
337
+ color: var(--color-text-secondary);
338
+ background: var(--color-bg-hover);
339
+ }
340
+ .sg-chrome-revert-btn:disabled { opacity: 0.5; cursor: default; }
341
+ .sg-chrome-revert-btn[hidden] { display: none; }
342
+
343
+ /* Commit button — accent filled */
344
+ .sg-chrome-commit-btn {
345
+ display: inline-flex;
346
+ align-items: center;
347
+ gap: 4px;
348
+ height: 24px;
349
+ padding: 0 8px;
350
+ border: none;
351
+ background: var(--color-accent);
352
+ color: white;
353
+ font-family: inherit;
354
+ font-size: 12px;
355
+ font-weight: 500;
356
+ cursor: pointer;
357
+ border-radius: 4px;
358
+ transition: background 0.15s;
359
+ }
360
+ .sg-chrome-commit-btn:hover:not(:disabled) { background: var(--color-accent-hover); }
361
+ .sg-chrome-commit-btn:disabled { opacity: 0.7; cursor: default; }
362
+ .sg-chrome-commit-btn[hidden] { display: none; }
363
+
364
+ /* Sync buttons (Pull / Push) */
365
+ .sg-chrome-sync-btn {
366
+ display: inline-flex;
367
+ align-items: center;
368
+ gap: 4px;
369
+ height: 24px;
370
+ padding: 0 8px;
371
+ border: none;
372
+ background: transparent;
373
+ color: var(--color-text-tertiary);
374
+ font-family: inherit;
375
+ font-size: 12px;
376
+ cursor: pointer;
377
+ border-radius: 4px;
378
+ transition: color 0.15s, background 0.15s;
379
+ }
380
+ .sg-chrome-sync-btn:hover:not(:disabled) {
381
+ color: var(--color-text-secondary);
382
+ background: var(--color-bg-hover);
383
+ }
384
+ .sg-chrome-sync-btn:disabled { opacity: 0.5; cursor: default; }
385
+ .sg-chrome-sync-btn svg { flex-shrink: 0; }
386
+
387
+ /* Push accent when ahead */
388
+ .sg-chrome-sync-btn-accent {
389
+ background: var(--color-accent);
390
+ color: white;
391
+ }
392
+ .sg-chrome-sync-btn-accent:hover:not(:disabled) {
393
+ background: var(--color-accent-hover);
394
+ color: white;
395
+ }
396
+
397
+ /* Badge count */
398
+ .sg-chrome-sync-count {
399
+ display: inline-flex;
400
+ align-items: center;
401
+ justify-content: center;
402
+ min-width: 16px;
403
+ height: 16px;
404
+ padding: 0 4px;
405
+ border-radius: 8px;
406
+ font-size: 10px;
407
+ font-weight: 600;
408
+ background: rgba(255, 255, 255, 0.2);
409
+ }
410
+ .sg-chrome-sync-btn:not(.sg-chrome-sync-btn-accent) .sg-chrome-sync-count {
411
+ background: var(--color-bg-surface);
412
+ color: var(--color-text-secondary);
413
+ }
414
+
415
+ /* ── Hover tooltips ───────────────────────────────────── */
416
+ .sg-chrome-tooltip-anchor {
417
+ position: relative;
418
+ }
419
+ .sg-chrome-tooltip-popup {
420
+ display: none;
421
+ position: absolute;
422
+ bottom: calc(100% + 8px);
423
+ left: 50%;
424
+ transform: translateX(-50%);
425
+ background: var(--color-bg-surface);
426
+ border: 1px solid var(--color-border);
427
+ border-radius: 6px;
428
+ padding: 8px 12px;
429
+ min-width: 200px;
430
+ max-width: 420px;
431
+ max-height: 240px;
432
+ overflow-y: auto;
433
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
434
+ z-index: 100;
435
+ font-size: 11px;
436
+ line-height: 1.5;
437
+ }
438
+ .sg-chrome-tooltip-anchor:hover .sg-chrome-tooltip-popup:not(:empty) {
439
+ display: block;
440
+ }
441
+ .sg-chrome-tooltip-popup-right {
442
+ left: auto;
443
+ right: 0;
444
+ transform: none;
445
+ min-width: auto;
446
+ width: max-content;
447
+ }
448
+ .sg-chrome-tooltip-file {
449
+ color: var(--color-text-secondary);
450
+ white-space: nowrap;
451
+ overflow: hidden;
452
+ display: flex;
453
+ align-items: center;
454
+ gap: 0;
455
+ }
456
+ .sg-chrome-tooltip-file .sg-path-sep {
457
+ flex-shrink: 0;
458
+ margin: 0 4px;
459
+ color: var(--color-text-tertiary);
460
+ }
461
+ .sg-chrome-tooltip-file .sg-path-repo {
462
+ overflow: hidden;
463
+ text-overflow: ellipsis;
464
+ flex-shrink: 2;
465
+ min-width: 20px;
466
+ }
467
+ .sg-chrome-tooltip-file .sg-path-type {
468
+ overflow: hidden;
469
+ text-overflow: ellipsis;
470
+ flex-shrink: 3;
471
+ min-width: 20px;
472
+ }
473
+ .sg-chrome-tooltip-file .sg-path-entity {
474
+ overflow: hidden;
475
+ text-overflow: ellipsis;
476
+ flex-shrink: 1;
477
+ min-width: 30px;
478
+ }
479
+ .sg-chrome-tooltip-dot {
480
+ width: 6px;
481
+ height: 6px;
482
+ border-radius: 3px;
483
+ flex-shrink: 0;
484
+ margin-right: 8px;
485
+ }
486
+ .sg-chrome-tooltip-dot.sg-chrome-status-modified {
487
+ background: var(--color-accent);
488
+ }
489
+ .sg-chrome-tooltip-dot.sg-chrome-status-added {
490
+ background: var(--color-success, #34a853);
491
+ }
492
+ .sg-chrome-tooltip-dot.sg-chrome-status-deleted {
493
+ background: var(--color-destructive, #ea4335);
494
+ }
495
+
496
+ /* ── Floating Toolbar (shared across app editors) ──── */
497
+ .sg-chrome-ftb {
498
+ position: absolute;
499
+ left: 50%;
500
+ transform: translateX(-50%);
501
+ display: flex;
502
+ align-items: center;
503
+ gap: 2px;
504
+ padding: 4px;
505
+ background: var(--color-surface);
506
+ border: 1px solid var(--color-border);
507
+ border-radius: 6px;
508
+ box-shadow: 0 2px 8px rgba(0,0,0,0.15);
509
+ z-index: 10;
510
+ pointer-events: auto;
511
+ }
512
+ .sg-chrome-ftb[hidden] { display: none; }
513
+
514
+ .sg-chrome-ftb-btn {
515
+ display: inline-flex;
516
+ align-items: center;
517
+ justify-content: center;
518
+ width: 28px;
519
+ height: 28px;
520
+ border: none;
521
+ border-radius: 4px;
522
+ background: transparent;
523
+ color: var(--color-text-secondary);
524
+ font-family: var(--color-font-ui);
525
+ font-size: 13px;
526
+ font-weight: 600;
527
+ cursor: pointer;
528
+ transition: color 100ms ease, background 100ms ease;
529
+ }
530
+ .sg-chrome-ftb-btn:hover {
531
+ color: var(--color-text);
532
+ background: var(--color-surface-raised);
533
+ }
534
+ .sg-chrome-ftb-btn:focus-visible {
535
+ outline: 2px solid var(--color-accent);
536
+ outline-offset: 1px;
537
+ }
538
+
539
+ .sg-chrome-ftb-btn-accent {
540
+ color: var(--color-accent);
541
+ }
542
+ .sg-chrome-ftb-btn-accent:hover {
543
+ background: var(--color-accent-muted);
544
+ }
545
+
546
+ .sg-chrome-ftb-sep {
547
+ width: 1px;
548
+ height: 18px;
549
+ background: var(--color-border);
550
+ margin: 0 4px;
551
+ }
552
+
553
+ /* ── Focus rings ───────────────────────────────────────── */
554
+ .sg-chrome-btn:focus-visible,
555
+ .sg-chrome-theme-toggle:focus-visible,
556
+ .sg-chrome-overflow-btn:focus-visible,
557
+ .sg-chrome-revert-btn:focus-visible,
558
+ .sg-chrome-commit-btn:focus-visible,
559
+ .sg-chrome-sync-btn:focus-visible {
560
+ outline: 2px solid var(--accent);
561
+ outline-offset: 1px;
562
+ }