myjsbook 1.0.0

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 (242) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +263 -0
  3. package/package.json +38 -0
  4. package/public/app.js +6686 -0
  5. package/public/components/constants.js +421 -0
  6. package/public/components/elements.js +118 -0
  7. package/public/components/state.js +53 -0
  8. package/public/icons/audio.svg +1 -0
  9. package/public/icons/azure.svg +1 -0
  10. package/public/icons/babel.svg +1 -0
  11. package/public/icons/bun.svg +1 -0
  12. package/public/icons/bun_light.svg +1 -0
  13. package/public/icons/c.svg +1 -0
  14. package/public/icons/chrome.svg +1 -0
  15. package/public/icons/citation.svg +1 -0
  16. package/public/icons/claude.svg +1 -0
  17. package/public/icons/console.svg +1 -0
  18. package/public/icons/cpp.svg +1 -0
  19. package/public/icons/css-map.svg +1 -0
  20. package/public/icons/css.svg +1 -0
  21. package/public/icons/database.svg +1 -0
  22. package/public/icons/docker.svg +1 -0
  23. package/public/icons/document.svg +1 -0
  24. package/public/icons/ejs.svg +1 -0
  25. package/public/icons/exe.svg +1 -0
  26. package/public/icons/favicon.svg +1 -0
  27. package/public/icons/figma.svg +1 -0
  28. package/public/icons/firebase.svg +1 -0
  29. package/public/icons/folder-admin-open.svg +1 -0
  30. package/public/icons/folder-admin.svg +1 -0
  31. package/public/icons/folder-api-open.svg +1 -0
  32. package/public/icons/folder-api.svg +1 -0
  33. package/public/icons/folder-app-open.svg +1 -0
  34. package/public/icons/folder-app.svg +1 -0
  35. package/public/icons/folder-archive-open.svg +1 -0
  36. package/public/icons/folder-archive.svg +1 -0
  37. package/public/icons/folder-attachment-open.svg +1 -0
  38. package/public/icons/folder-attachment.svg +1 -0
  39. package/public/icons/folder-aws-open.svg +1 -0
  40. package/public/icons/folder-aws.svg +1 -0
  41. package/public/icons/folder-backup-open.svg +1 -0
  42. package/public/icons/folder-backup.svg +1 -0
  43. package/public/icons/folder-class-open.svg +1 -0
  44. package/public/icons/folder-class.svg +1 -0
  45. package/public/icons/folder-claude-open.svg +1 -0
  46. package/public/icons/folder-claude.svg +1 -0
  47. package/public/icons/folder-client-open.svg +1 -0
  48. package/public/icons/folder-client.svg +1 -0
  49. package/public/icons/folder-command-open.svg +1 -0
  50. package/public/icons/folder-command.svg +1 -0
  51. package/public/icons/folder-components-open.svg +1 -0
  52. package/public/icons/folder-components.svg +1 -0
  53. package/public/icons/folder-config-open.svg +1 -0
  54. package/public/icons/folder-config.svg +1 -0
  55. package/public/icons/folder-connection-open.svg +1 -0
  56. package/public/icons/folder-connection.svg +1 -0
  57. package/public/icons/folder-console-open.svg +1 -0
  58. package/public/icons/folder-console.svg +1 -0
  59. package/public/icons/folder-container-open.svg +1 -0
  60. package/public/icons/folder-container.svg +1 -0
  61. package/public/icons/folder-content-open.svg +1 -0
  62. package/public/icons/folder-content.svg +1 -0
  63. package/public/icons/folder-context-open.svg +1 -0
  64. package/public/icons/folder-context.svg +1 -0
  65. package/public/icons/folder-controller-open.svg +1 -0
  66. package/public/icons/folder-controller.svg +1 -0
  67. package/public/icons/folder-core-open.svg +1 -0
  68. package/public/icons/folder-core.svg +1 -0
  69. package/public/icons/folder-css-open.svg +1 -0
  70. package/public/icons/folder-css.svg +1 -0
  71. package/public/icons/folder-custom-open.svg +1 -0
  72. package/public/icons/folder-custom.svg +1 -0
  73. package/public/icons/folder-database-open.svg +1 -0
  74. package/public/icons/folder-database.svg +1 -0
  75. package/public/icons/folder-decorators-open.svg +1 -0
  76. package/public/icons/folder-decorators.svg +1 -0
  77. package/public/icons/folder-desktop-open.svg +1 -0
  78. package/public/icons/folder-desktop.svg +1 -0
  79. package/public/icons/folder-dist-open.svg +1 -0
  80. package/public/icons/folder-dist.svg +1 -0
  81. package/public/icons/folder-docs-open.svg +1 -0
  82. package/public/icons/folder-docs.svg +1 -0
  83. package/public/icons/folder-download-open.svg +1 -0
  84. package/public/icons/folder-download.svg +1 -0
  85. package/public/icons/folder-dtos-open.svg +1 -0
  86. package/public/icons/folder-dtos.svg +1 -0
  87. package/public/icons/folder-element-open.svg +1 -0
  88. package/public/icons/folder-element.svg +1 -0
  89. package/public/icons/folder-environment-open.svg +1 -0
  90. package/public/icons/folder-environment.svg +1 -0
  91. package/public/icons/folder-error-open.svg +1 -0
  92. package/public/icons/folder-error.svg +1 -0
  93. package/public/icons/folder-event-open.svg +1 -0
  94. package/public/icons/folder-event.svg +1 -0
  95. package/public/icons/folder-examples-open.svg +1 -0
  96. package/public/icons/folder-examples.svg +1 -0
  97. package/public/icons/folder-expo-open.svg +1 -0
  98. package/public/icons/folder-expo.svg +1 -0
  99. package/public/icons/folder-export-open.svg +1 -0
  100. package/public/icons/folder-export.svg +1 -0
  101. package/public/icons/folder-features-open.svg +1 -0
  102. package/public/icons/folder-features.svg +1 -0
  103. package/public/icons/folder-filter-open.svg +1 -0
  104. package/public/icons/folder-filter.svg +1 -0
  105. package/public/icons/folder-firebase-open.svg +1 -0
  106. package/public/icons/folder-firebase.svg +1 -0
  107. package/public/icons/folder-firestore-open.svg +1 -0
  108. package/public/icons/folder-firestore.svg +1 -0
  109. package/public/icons/folder-font-open.svg +1 -0
  110. package/public/icons/folder-font.svg +1 -0
  111. package/public/icons/folder-functions-open.svg +1 -0
  112. package/public/icons/folder-functions.svg +1 -0
  113. package/public/icons/folder-gemini-ai-open.svg +1 -0
  114. package/public/icons/folder-gemini-ai.svg +1 -0
  115. package/public/icons/folder-git-open.svg +1 -0
  116. package/public/icons/folder-git.svg +1 -0
  117. package/public/icons/folder-github-open.svg +1 -0
  118. package/public/icons/folder-github.svg +1 -0
  119. package/public/icons/folder-helper-open.svg +1 -0
  120. package/public/icons/folder-helper.svg +1 -0
  121. package/public/icons/folder-home-open.svg +1 -0
  122. package/public/icons/folder-home.svg +1 -0
  123. package/public/icons/folder-icons-open.svg +1 -0
  124. package/public/icons/folder-icons.svg +1 -0
  125. package/public/icons/folder-images-open.svg +1 -0
  126. package/public/icons/folder-images.svg +1 -0
  127. package/public/icons/folder-interface-open.svg +1 -0
  128. package/public/icons/folder-interface.svg +1 -0
  129. package/public/icons/folder-ios-open.svg +1 -0
  130. package/public/icons/folder-ios.svg +1 -0
  131. package/public/icons/folder-java-open.svg +1 -0
  132. package/public/icons/folder-java.svg +1 -0
  133. package/public/icons/folder-javascript-open.svg +1 -0
  134. package/public/icons/folder-javascript.svg +1 -0
  135. package/public/icons/folder-middleware-open.svg +1 -0
  136. package/public/icons/folder-middleware.svg +1 -0
  137. package/public/icons/folder-migrations-open.svg +1 -0
  138. package/public/icons/folder-migrations.svg +1 -0
  139. package/public/icons/folder-other-open.svg +1 -0
  140. package/public/icons/folder-other.svg +1 -0
  141. package/public/icons/folder-packages-open.svg +1 -0
  142. package/public/icons/folder-packages.svg +1 -0
  143. package/public/icons/folder-pdf-open.svg +1 -0
  144. package/public/icons/folder-pdf.svg +1 -0
  145. package/public/icons/folder-plugin-open.svg +1 -0
  146. package/public/icons/folder-plugin.svg +1 -0
  147. package/public/icons/folder-project-open.svg +1 -0
  148. package/public/icons/folder-project.svg +1 -0
  149. package/public/icons/folder-public-open.svg +1 -0
  150. package/public/icons/folder-public.svg +1 -0
  151. package/public/icons/folder-python-open.svg +1 -0
  152. package/public/icons/folder-python.svg +1 -0
  153. package/public/icons/folder-repository-open.svg +1 -0
  154. package/public/icons/folder-repository.svg +1 -0
  155. package/public/icons/folder-routes-open.svg +1 -0
  156. package/public/icons/folder-routes.svg +1 -0
  157. package/public/icons/folder-rules-open.svg +1 -0
  158. package/public/icons/folder-rules.svg +1 -0
  159. package/public/icons/folder-sass-open.svg +1 -0
  160. package/public/icons/folder-sass.svg +1 -0
  161. package/public/icons/folder-scripts-open.svg +1 -0
  162. package/public/icons/folder-scripts.svg +1 -0
  163. package/public/icons/folder-server-open.svg +1 -0
  164. package/public/icons/folder-server.svg +1 -0
  165. package/public/icons/folder-serverless-open.svg +1 -0
  166. package/public/icons/folder-serverless.svg +1 -0
  167. package/public/icons/folder-skills-open.svg +1 -0
  168. package/public/icons/folder-skills.svg +1 -0
  169. package/public/icons/folder-src-open.svg +1 -0
  170. package/public/icons/folder-src.svg +1 -0
  171. package/public/icons/folder-stack-open.svg +1 -0
  172. package/public/icons/folder-stack.svg +1 -0
  173. package/public/icons/folder-store-open.svg +1 -0
  174. package/public/icons/folder-store.svg +1 -0
  175. package/public/icons/folder-supabase-open.svg +1 -0
  176. package/public/icons/folder-supabase.svg +1 -0
  177. package/public/icons/folder-svg-open.svg +1 -0
  178. package/public/icons/folder-svg.svg +1 -0
  179. package/public/icons/folder-target-open.svg +1 -0
  180. package/public/icons/folder-target.svg +1 -0
  181. package/public/icons/folder-tasks-open.svg +1 -0
  182. package/public/icons/folder-tasks.svg +1 -0
  183. package/public/icons/folder-temp-open.svg +1 -0
  184. package/public/icons/folder-temp.svg +1 -0
  185. package/public/icons/folder-template-open.svg +1 -0
  186. package/public/icons/folder-template.svg +1 -0
  187. package/public/icons/folder-test-open.svg +1 -0
  188. package/public/icons/folder-test.svg +1 -0
  189. package/public/icons/folder-tools-open.svg +1 -0
  190. package/public/icons/folder-tools.svg +1 -0
  191. package/public/icons/folder-typescript-open.svg +1 -0
  192. package/public/icons/folder-typescript.svg +1 -0
  193. package/public/icons/folder-ui-open.svg +1 -0
  194. package/public/icons/folder-ui.svg +1 -0
  195. package/public/icons/folder-upload-open.svg +1 -0
  196. package/public/icons/folder-upload.svg +1 -0
  197. package/public/icons/folder-utils-open.svg +1 -0
  198. package/public/icons/folder-utils.svg +1 -0
  199. package/public/icons/folder-video-open.svg +1 -0
  200. package/public/icons/folder-video.svg +1 -0
  201. package/public/icons/folder-views-open.svg +1 -0
  202. package/public/icons/folder-views.svg +1 -0
  203. package/public/icons/font.svg +1 -0
  204. package/public/icons/gemini-ai.svg +1 -0
  205. package/public/icons/gemini.svg +1 -0
  206. package/public/icons/git.svg +1 -0
  207. package/public/icons/google.svg +1 -0
  208. package/public/icons/graphql.svg +1 -0
  209. package/public/icons/html.svg +1 -0
  210. package/public/icons/image.svg +1 -0
  211. package/public/icons/java.svg +1 -0
  212. package/public/icons/javaclass.svg +1 -0
  213. package/public/icons/javascript.svg +1 -0
  214. package/public/icons/jsconfig.svg +1 -0
  215. package/public/icons/json.svg +1 -0
  216. package/public/icons/markdown.svg +1 -0
  217. package/public/icons/nodejs.svg +1 -0
  218. package/public/icons/nodejs_alt.svg +1 -0
  219. package/public/icons/nodemon.svg +1 -0
  220. package/public/icons/npm.svg +1 -0
  221. package/public/icons/pdf.svg +1 -0
  222. package/public/icons/prettier.svg +1 -0
  223. package/public/icons/prisma.svg +1 -0
  224. package/public/icons/python.svg +1 -0
  225. package/public/icons/react.svg +1 -0
  226. package/public/icons/react_ts.svg +1 -0
  227. package/public/icons/readme.svg +1 -0
  228. package/public/icons/remark.svg +1 -0
  229. package/public/icons/sass.svg +1 -0
  230. package/public/icons/svg.svg +1 -0
  231. package/public/icons/tailwindcss.svg +1 -0
  232. package/public/icons/typescript-def.svg +1 -0
  233. package/public/icons/typescript.svg +1 -0
  234. package/public/icons/zip.svg +1 -0
  235. package/public/index.html +1342 -0
  236. package/public/styles.css +4736 -0
  237. package/src/cli.js +175 -0
  238. package/src/lib/files.js +143 -0
  239. package/src/lib/notebook.js +141 -0
  240. package/src/lib/package-exports.js +331 -0
  241. package/src/lib/session.js +1003 -0
  242. package/src/server.js +2232 -0
@@ -0,0 +1,4736 @@
1
+ /* ═══════════════════════════════════════════════════════════
2
+ NODEBOOK — Design System v2
3
+ Figma: dark bg #0B0F1A · accent green #00C896
4
+ ═══════════════════════════════════════════════════════════ */
5
+
6
+ /* ── DESIGN TOKENS ─────────────────────────────────────── */
7
+ :root {
8
+ /* Typography */
9
+ --font-sans: -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
10
+ --font-mono: "JetBrains Mono", "Fira Code", "SF Mono", "Cascadia Code", Consolas, monospace;
11
+
12
+ /* Radii */
13
+ --r-sm: 6px;
14
+ --r-md: 10px;
15
+ --r-lg: 14px;
16
+ --r-xl: 20px;
17
+ --r-full: 999px;
18
+
19
+ /* Transitions */
20
+ --t-fast: 100ms ease;
21
+ --t-normal: 180ms ease;
22
+ --t-slow: 280ms ease;
23
+
24
+ /* Layout */
25
+ --sidebar-w: 220px;
26
+ --nb-panel-w: 220px;
27
+ --header-h: 54px;
28
+ }
29
+
30
+ /* ══════════════════════════════════════════════════════════
31
+ THEME TOKENS — one block per theme, keyed by data-theme
32
+ ══════════════════════════════════════════════════════════ */
33
+
34
+ /* ── Obsidian (default dark — modern violet) ────────────── */
35
+ :root,
36
+ [data-theme="obsidian"] {
37
+ --bg-base: #0E0E16;
38
+ --bg-surface: #13131F;
39
+ --bg-raised: #1A1A2C;
40
+ --bg-elevated: #202033;
41
+ --bg-hover: rgba(167,139,250,0.07);
42
+ --bg-active: rgba(167,139,250,0.14);
43
+
44
+ --border: rgba(167,139,250,0.12);
45
+ --border-strong: rgba(167,139,250,0.22);
46
+ --border-accent: #A78BFA;
47
+
48
+ --text: #E2E0F0;
49
+ --text-secondary: #9E9BC8;
50
+ --text-muted: #88879c;
51
+ --text-accent: #A78BFA;
52
+
53
+ --accent: #A78BFA;
54
+ --accent-soft: rgba(167,139,250,0.14);
55
+ --accent-glow: rgba(167,139,250,0.30);
56
+ --green: #34D399;
57
+ --green-soft: rgba(52,211,153,0.14);
58
+ --green-glow: rgba(52,211,153,0.28);
59
+ --blue: #60A5FA;
60
+ --blue-soft: rgba(96,165,250,0.14);
61
+ --orange: #FB923C;
62
+ --orange-soft: rgba(251,146,60,0.14);
63
+ --pink: #F472B6;
64
+ --pink-soft: rgba(244,114,182,0.14);
65
+ --purple: #A78BFA;
66
+ --purple-soft: rgba(167,139,250,0.14);
67
+ --yellow: #FBBF24;
68
+ --yellow-soft: rgba(251,191,36,0.16);
69
+ --red: #F87171;
70
+ --red-soft: rgba(248,113,113,0.14);
71
+
72
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.55);
73
+ --shadow-md: 0 6px 18px rgba(0,0,0,0.55);
74
+ --shadow-lg: 0 10px 36px rgba(0,0,0,0.6);
75
+ --shadow-glow: 0 0 0 1px var(--accent-soft), 0 8px 36px var(--accent-glow);
76
+ }
77
+
78
+ /* ── Antariksha (Aurora Borealis dark) ───────────────────── */
79
+ [data-theme="antariksha"] {
80
+ --bg-base: #070D18;
81
+ --bg-surface: #0A1220;
82
+ --bg-raised: #0C1E35;
83
+ --bg-elevated: #0F2540;
84
+ --bg-hover: rgba(181,212,244,0.05);
85
+ --bg-active: rgba(93,202,165,0.10);
86
+
87
+ --border: rgba(181,212,244,0.08);
88
+ --border-strong: rgba(181,212,244,0.16);
89
+ --border-accent: #5DCAA5;
90
+
91
+ --text: #B5D4F4;
92
+ --text-secondary: #6A9EC2;
93
+ --text-muted: #61819f;
94
+ --text-accent: #5DCAA5;
95
+
96
+ --accent: #5DCAA5;
97
+ --accent-soft: rgba(93,202,165,0.12);
98
+ --accent-glow: rgba(93,202,165,0.25);
99
+ --green: #5DCAA5;
100
+ --green-soft: rgba(93,202,165,0.12);
101
+ --green-glow: rgba(93,202,165,0.25);
102
+ --blue: #378ADD;
103
+ --blue-soft: rgba(55,138,221,0.14);
104
+ --orange: #F0997B;
105
+ --orange-soft: rgba(240,153,123,0.14);
106
+ --pink: #AFA9EC;
107
+ --pink-soft: rgba(175,169,236,0.14);
108
+ --purple: #AFA9EC;
109
+ --purple-soft: rgba(175,169,236,0.14);
110
+ --yellow: #FAC775;
111
+ --yellow-soft: rgba(250,199,117,0.14);
112
+ --red: #F0997B;
113
+ --red-soft: rgba(240,153,123,0.14);
114
+
115
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.5);
116
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.6);
117
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.7);
118
+ --shadow-glow: 0 0 0 1px var(--accent-soft), 0 4px 24px var(--accent-glow);
119
+ }
120
+
121
+ /* ── Vriksha (Neon Jungle dark) ─────────────────────────── */
122
+ [data-theme="vriksha"] {
123
+ --bg-base: #040D09;
124
+ --bg-surface: #071410;
125
+ --bg-raised: #0D1F1A;
126
+ --bg-elevated: #112618;
127
+ --bg-hover: rgba(159,225,203,0.05);
128
+ --bg-active: rgba(93,202,165,0.10);
129
+
130
+ --border: rgba(159,225,203,0.08);
131
+ --border-strong: rgba(159,225,203,0.16);
132
+ --border-accent: #5DCAA5;
133
+
134
+ --text: #9FE1CB;
135
+ --text-secondary: #3B8C6A;
136
+ --text-muted: #52856d;
137
+ --text-accent: #EF9F27;
138
+
139
+ --accent: #EF9F27;
140
+ --accent-soft: rgba(239,159,39,0.12);
141
+ --accent-glow: rgba(239,159,39,0.25);
142
+ --green: #5DCAA5;
143
+ --green-soft: rgba(93,202,165,0.12);
144
+ --green-glow: rgba(93,202,165,0.25);
145
+ --blue: #97C459;
146
+ --blue-soft: rgba(151,196,89,0.12);
147
+ --orange: #EF9F27;
148
+ --orange-soft: rgba(239,159,39,0.12);
149
+ --pink: #C0DD97;
150
+ --pink-soft: rgba(192,221,151,0.12);
151
+ --purple: #FAC775;
152
+ --purple-soft: rgba(250,199,117,0.12);
153
+ --yellow: #FAC775;
154
+ --yellow-soft: rgba(250,199,117,0.12);
155
+ --red: #EF9F27;
156
+ --red-soft: rgba(239,159,39,0.12);
157
+
158
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.5);
159
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.6);
160
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.7);
161
+ --shadow-glow: 0 0 0 1px var(--accent-soft), 0 4px 24px var(--accent-glow);
162
+ }
163
+
164
+ /* ── Lumen (Crisp light) ─────────────────────────────────── */
165
+ [data-theme="lumen"] {
166
+ --bg-base: #F7F8FB;
167
+ --bg-surface: #FFFFFF;
168
+ --bg-raised: #EEF2F7;
169
+ --bg-elevated: #E5EBF5;
170
+ --bg-hover: rgba(15,23,42,0.04);
171
+ --bg-active: rgba(37,99,235,0.10);
172
+
173
+ --border: rgba(15,23,42,0.10);
174
+ --border-strong: rgba(15,23,42,0.18);
175
+ --border-accent: #2563EB;
176
+
177
+ --text: #0F172A;
178
+ --text-secondary: #334155;
179
+ --text-muted: #94A3B8;
180
+ --text-accent: #2563EB;
181
+
182
+ --accent: #2563EB;
183
+ --accent-soft: rgba(37,99,235,0.12);
184
+ --accent-glow: rgba(37,99,235,0.22);
185
+ --green: #0F9D58;
186
+ --green-soft: rgba(15,157,88,0.12);
187
+ --green-glow: rgba(15,157,88,0.22);
188
+ --blue: #2563EB;
189
+ --blue-soft: rgba(37,99,235,0.12);
190
+ --orange: #C2410C;
191
+ --orange-soft: rgba(194,65,12,0.12);
192
+ --pink: #7C3AED;
193
+ --pink-soft: rgba(124,58,237,0.12);
194
+ --purple: #7C3AED;
195
+ --purple-soft: rgba(124,58,237,0.12);
196
+ --yellow: #F59E0B;
197
+ --yellow-soft: rgba(245,158,11,0.14);
198
+ --red: #E11D48;
199
+ --red-soft: rgba(225,29,72,0.12);
200
+
201
+ --shadow-sm: 0 1px 3px rgba(15,23,42,0.08);
202
+ --shadow-md: 0 6px 18px rgba(15,23,42,0.12);
203
+ --shadow-lg: 0 12px 36px rgba(15,23,42,0.16);
204
+ --shadow-glow: 0 0 0 1px var(--accent-soft), 0 6px 26px var(--accent-glow);
205
+ }
206
+
207
+ /* ── Champa (Warm Parchment light) ──────────────────────── */
208
+ [data-theme="champa"] {
209
+ --bg-base: #F4F2ED;
210
+ --bg-surface: #FAFAF8;
211
+ --bg-raised: #EEECEA;
212
+ --bg-elevated: #E8E6E2;
213
+ --bg-hover: rgba(44,44,42,0.04);
214
+ --bg-active: rgba(83,74,183,0.07);
215
+
216
+ --border: rgba(44,44,42,0.10);
217
+ --border-strong: rgba(44,44,42,0.18);
218
+ --border-accent: #534AB7;
219
+
220
+ --text: #2C2C2A;
221
+ --text-secondary: #5F5E5A;
222
+ --text-muted: #898057;
223
+ --text-accent: #534AB7;
224
+
225
+ --accent: #534AB7;
226
+ --accent-soft: rgba(83,74,183,0.10);
227
+ --accent-glow: rgba(83,74,183,0.20);
228
+ --green: #0F6E56;
229
+ --green-soft: rgba(15,110,86,0.10);
230
+ --green-glow: rgba(15,110,86,0.20);
231
+ --blue: #185FA5;
232
+ --blue-soft: rgba(24,95,165,0.10);
233
+ --orange: #BA7517;
234
+ --orange-soft: rgba(186,117,23,0.10);
235
+ --pink: #534AB7;
236
+ --pink-soft: rgba(83,74,183,0.10);
237
+ --purple: #534AB7;
238
+ --purple-soft: rgba(83,74,183,0.10);
239
+ --yellow: #BA7517;
240
+ --yellow-soft: rgba(186,117,23,0.10);
241
+ --red: #993C1D;
242
+ --red-soft: rgba(153,60,29,0.10);
243
+
244
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.08);
245
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.10);
246
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.13);
247
+ --shadow-glow: 0 0 0 1px var(--accent-soft), 0 4px 24px var(--accent-glow);
248
+ }
249
+
250
+ /* ── Varuna (Arctic Frost light) ────────────────────────── */
251
+ [data-theme="varuna"] {
252
+ --bg-base: #EAF3FC;
253
+ --bg-surface: #F4F9FF;
254
+ --bg-raised: #E0EEF8;
255
+ --bg-elevated: #D5E7F5;
256
+ --bg-hover: rgba(4,44,83,0.04);
257
+ --bg-active: rgba(24,95,165,0.07);
258
+
259
+ --border: rgba(4,44,83,0.09);
260
+ --border-strong: rgba(4,44,83,0.17);
261
+ --border-accent: #185FA5;
262
+
263
+ --text: #042C53;
264
+ --text-secondary: #2D5A8A;
265
+ --text-muted: #275a90;
266
+ --text-accent: #185FA5;
267
+
268
+ --accent: #185FA5;
269
+ --accent-soft: rgba(24,95,165,0.10);
270
+ --accent-glow: rgba(24,95,165,0.20);
271
+ --green: #0F6E56;
272
+ --green-soft: rgba(15,110,86,0.10);
273
+ --green-glow: rgba(15,110,86,0.20);
274
+ --blue: #378ADD;
275
+ --blue-soft: rgba(55,138,221,0.12);
276
+ --orange: #BA7517;
277
+ --orange-soft: rgba(186,117,23,0.10);
278
+ --pink: #185FA5;
279
+ --pink-soft: rgba(24,95,165,0.10);
280
+ --purple: #378ADD;
281
+ --purple-soft: rgba(55,138,221,0.10);
282
+ --yellow: #BA7517;
283
+ --yellow-soft: rgba(186,117,23,0.10);
284
+ --red: #993C1D;
285
+ --red-soft: rgba(153,60,29,0.10);
286
+
287
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.07);
288
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.09);
289
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.13);
290
+ --shadow-glow: 0 0 0 1px var(--accent-soft), 0 4px 24px var(--accent-glow);
291
+ }
292
+
293
+ /* ── Surya (Golden Hour light) ──────────────────────────── */
294
+ [data-theme="surya"] {
295
+ --bg-base: #FDF6E4;
296
+ --bg-surface: #FFFBF2;
297
+ --bg-raised: #F5EDD4;
298
+ --bg-elevated: #EDE4C8;
299
+ --bg-hover: rgba(65,36,2,0.04);
300
+ --bg-active: rgba(133,79,11,0.07);
301
+
302
+ --border: rgba(65,36,2,0.10);
303
+ --border-strong: rgba(65,36,2,0.18);
304
+ --border-accent: #854F0B;
305
+
306
+ --text: #412402;
307
+ --text-secondary: #6B3D0E;
308
+ --text-muted: #C8A060;
309
+ --text-accent: #854F0B;
310
+
311
+ --accent: #854F0B;
312
+ --accent-soft: rgba(133,79,11,0.10);
313
+ --accent-glow: rgba(133,79,11,0.20);
314
+ --green: #3B6D11;
315
+ --green-soft: rgba(59,109,17,0.10);
316
+ --green-glow: rgba(59,109,17,0.20);
317
+ --blue: #185FA5;
318
+ --blue-soft: rgba(24,95,165,0.10);
319
+ --orange: #BA7517;
320
+ --orange-soft: rgba(186,117,23,0.12);
321
+ --pink: #854F0B;
322
+ --pink-soft: rgba(133,79,11,0.10);
323
+ --purple: #633806;
324
+ --purple-soft: rgba(99,56,6,0.10);
325
+ --yellow: #EF9F27;
326
+ --yellow-soft: rgba(239,159,39,0.14);
327
+ --red: #993C1D;
328
+ --red-soft: rgba(153,60,29,0.10);
329
+
330
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.07);
331
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.09);
332
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.13);
333
+ --shadow-glow: 0 0 0 1px var(--accent-soft), 0 4px 24px var(--accent-glow);
334
+ }
335
+
336
+ /* ── Haritha (Mint Console light) ───────────────────────── */
337
+ [data-theme="haritha"] {
338
+ --bg-base: #E4F5EE;
339
+ --bg-surface: #F0FBF6;
340
+ --bg-raised: #D8EFE7;
341
+ --bg-elevated: #CCE8DD;
342
+ --bg-hover: rgba(4,52,44,0.04);
343
+ --bg-active: rgba(15,110,86,0.07);
344
+
345
+ --border: rgba(4,52,44,0.09);
346
+ --border-strong: rgba(4,52,44,0.17);
347
+ --border-accent: #0F6E56;
348
+
349
+ --text: #04342C;
350
+ --text-secondary: #0F5A45;
351
+ --text-muted: #429278;
352
+ --text-accent: #0F6E56;
353
+
354
+ --accent: #0F6E56;
355
+ --accent-soft: rgba(15,110,86,0.10);
356
+ --accent-glow: rgba(15,110,86,0.20);
357
+ --green: #1D9E75;
358
+ --green-soft: rgba(29,158,117,0.12);
359
+ --green-glow: rgba(29,158,117,0.22);
360
+ --blue: #185FA5;
361
+ --blue-soft: rgba(24,95,165,0.10);
362
+ --orange: #BA7517;
363
+ --orange-soft: rgba(186,117,23,0.10);
364
+ --pink: #0F6E56;
365
+ --pink-soft: rgba(15,110,86,0.10);
366
+ --purple: #3B6D11;
367
+ --purple-soft: rgba(59,109,17,0.10);
368
+ --yellow: #639922;
369
+ --yellow-soft: rgba(99,153,34,0.12);
370
+ --red: #3B6D11;
371
+ --red-soft: rgba(59,109,17,0.10);
372
+
373
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.07);
374
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.09);
375
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.13);
376
+ --shadow-glow: 0 0 0 1px var(--accent-soft), 0 4px 24px var(--accent-glow);
377
+ }
378
+
379
+ /* ── RESET & BASE ──────────────────────────────────────── */
380
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
381
+
382
+ html, body {
383
+ height: 100%;
384
+ overflow: hidden;
385
+ }
386
+
387
+ body {
388
+ background: var(--bg-base);
389
+ color: var(--text);
390
+ font-family: var(--font-sans);
391
+ font-size: 14px;
392
+ line-height: 1.5;
393
+ -webkit-font-smoothing: antialiased;
394
+ }
395
+
396
+ ::selection { background: var(--accent-soft); color: var(--text); }
397
+
398
+ .hidden { display: none !important; }
399
+
400
+ /* ── SCROLLBARS ────────────────────────────────────────── */
401
+ ::-webkit-scrollbar { width: 5px; height: 5px; }
402
+ ::-webkit-scrollbar-track { background: transparent; }
403
+ ::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 4px; }
404
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
405
+
406
+ /* ═══════════════════════════════════════════════════════════
407
+ APP SHELL — Sidebar + Main layout
408
+ ═══════════════════════════════════════════════════════════ */
409
+ .app-shell {
410
+ display: flex;
411
+ height: 100vh;
412
+ overflow: hidden;
413
+ }
414
+
415
+ /* ── SIDEBAR ─────────────────────────────────────────────── */
416
+ .sidebar {
417
+ width: var(--sidebar-w);
418
+ flex-shrink: 0;
419
+ background: var(--bg-surface);
420
+ border-right: 1px solid var(--border);
421
+ transition: width 220ms ease, border-color 220ms ease, opacity 220ms ease;
422
+ overflow: hidden;
423
+ }
424
+ /* Sidebar collapsed to logo-strip (layout state 2) */
425
+ .sidebar.is-hidden {
426
+ /* Keep a narrow strip — exactly header height tall for the brand — so the
427
+ logo stays visible and creates a continuous top bar with the header. */
428
+ width: 54px;
429
+ overflow: hidden;
430
+ }
431
+ /* Hide everything inside the collapsed sidebar except the brand logo */
432
+ .sidebar.is-hidden .sidebar-nav,
433
+ .sidebar.is-hidden .sidebar-bottom,
434
+ .sidebar.is-hidden .brand-text {
435
+ display: none;
436
+ }
437
+ /* Center the logo mark and match header height so they read as one row */
438
+ .sidebar.is-hidden .sidebar-brand {
439
+ justify-content: center;
440
+ padding: 0;
441
+ min-height: var(--header-h);
442
+ border-bottom: 1px solid var(--border);
443
+ }
444
+
445
+ /* Brand */
446
+ .sidebar-brand {
447
+ display: flex !important;
448
+ align-items: center;
449
+ gap: 10px;
450
+ padding: 16px 14px 14px;
451
+ border-bottom: 1px solid var(--border);
452
+ flex-shrink: 0;
453
+ }
454
+
455
+ .brand-logo {
456
+ display: flex;
457
+ align-items: center;
458
+ justify-content: center;
459
+ flex-shrink: 0;
460
+ /* remove the old coloured box — the SVGs are self-contained */
461
+ width: auto;
462
+ height: auto;
463
+ background: none;
464
+ border: none;
465
+ border-radius: 0;
466
+ }
467
+
468
+ /* Logo visibility: dark themes → light SVG; light themes → dark SVG */
469
+ .brand-logo-dark-theme { display: block; }
470
+ .brand-logo-light-theme { display: none; }
471
+
472
+ [data-theme-base="light"] .brand-logo-dark-theme { display: none; }
473
+ [data-theme-base="light"] .brand-logo-light-theme { display: block; }
474
+
475
+ .brand-name {
476
+ display: block;
477
+ font-size: 13px;
478
+ font-weight: 700;
479
+ color: #ffffff; /* white on dark themes */
480
+ letter-spacing: -0.01em;
481
+ }
482
+
483
+ .marsbook-mars,
484
+ .marsbook-book {
485
+ color: inherit;
486
+ }
487
+
488
+ .brand-version {
489
+ display: block;
490
+ font-size: 10px;
491
+ color: rgba(255,255,255,0.55); /* muted white on dark themes */
492
+ letter-spacing: 0.02em;
493
+ }
494
+
495
+ /* Light themes: dark text */
496
+ [data-theme-base="light"] .brand-name { color: #1a1a1a; }
497
+ [data-theme-base="light"] .brand-version { color: #555555; }
498
+
499
+ /* Nav */
500
+ .sidebar-nav {
501
+ display: flex;
502
+ flex-direction: column;
503
+ gap: 1px;
504
+ padding: 10px 8px;
505
+ flex-shrink: 0;
506
+ }
507
+
508
+ .nav-item {
509
+ display: flex;
510
+ align-items: center;
511
+ gap: 9px;
512
+ padding: 8px 10px;
513
+ border-radius: var(--r-md);
514
+ color: var(--text-secondary);
515
+ text-decoration: none;
516
+ font-size: 13px;
517
+ font-weight: 500;
518
+ transition: background var(--t-fast), color var(--t-fast);
519
+ cursor: pointer;
520
+ }
521
+
522
+ .nav-item:hover {
523
+ background: var(--bg-hover);
524
+ color: var(--text);
525
+ }
526
+
527
+ .nav-item.is-active {
528
+ background: var(--bg-active);
529
+ color: var(--green);
530
+ }
531
+
532
+ .nav-item.is-active svg {
533
+ stroke: var(--green);
534
+ }
535
+
536
+ .nav-item svg {
537
+ flex-shrink: 0;
538
+ opacity: 0.8;
539
+ }
540
+
541
+ [data-theme-base="light"] .nav-item svg {
542
+ opacity: 1;
543
+ color: var(--text-secondary);
544
+ stroke: currentColor;
545
+ }
546
+ [data-theme-base="light"] .nav-item.is-active svg {
547
+ color: var(--accent);
548
+ stroke: currentColor;
549
+ }
550
+
551
+ /* Light theme: improved contrast for nav, sidebar, and text elements */
552
+ [data-theme-base="light"] .nav-item {
553
+ color: var(--text-secondary);
554
+ font-weight: 500;
555
+ }
556
+ [data-theme-base="light"] .nav-item:hover {
557
+ color: var(--text);
558
+ }
559
+ [data-theme-base="light"] .nav-item.is-active {
560
+ color: var(--accent);
561
+ background: var(--accent-soft);
562
+ }
563
+ [data-theme-base="light"] .sidebar-section-label {
564
+ color: var(--text-secondary);
565
+ font-weight: 600;
566
+ }
567
+ /* brand-name / brand-version light-theme colours are set near .brand-logo above */
568
+ [data-theme-base="light"] .nlp-item-name {
569
+ color: var(--text);
570
+ }
571
+ [data-theme-base="light"] .nlp-item:hover .nlp-item-name {
572
+ color: var(--text);
573
+ }
574
+ [data-theme-base="light"] .sidebar-env-btn {
575
+ color: var(--text-secondary);
576
+ border-color: var(--border-strong);
577
+ }
578
+ [data-theme-base="light"] .sidebar-env-btn:hover {
579
+ color: var(--text);
580
+ background: var(--bg-hover);
581
+ }
582
+ [data-theme-base="light"] .cell-status-badge {
583
+ color: var(--text-secondary);
584
+ border-color: var(--border-strong);
585
+ }
586
+ [data-theme-base="light"] .output-pre {
587
+ color: var(--text);
588
+ background: var(--bg-raised);
589
+ border-color: var(--border);
590
+ }
591
+ [data-theme-base="light"] .page-greeting {
592
+ color: var(--text);
593
+ }
594
+ [data-theme-base="light"] .stat-value {
595
+ color: var(--text);
596
+ }
597
+ [data-theme-base="light"] .stat-label {
598
+ color: var(--text-secondary);
599
+ }
600
+ [data-theme-base="light"] .notebook-card-title {
601
+ color: var(--text);
602
+ }
603
+ [data-theme-base="light"] .notebook-card-meta {
604
+ color: var(--text-secondary);
605
+ }
606
+
607
+ /* Sidebar sections */
608
+ .sidebar-section {
609
+ padding: 0 8px 8px;
610
+ flex-shrink: 0;
611
+ }
612
+
613
+ .sidebar-section-label {
614
+ font-size: 10px;
615
+ font-weight: 600;
616
+ text-transform: uppercase;
617
+ letter-spacing: 0.08em;
618
+ color: var(--text-muted);
619
+ padding: 6px 10px 4px;
620
+ }
621
+
622
+ .sidebar-file-list {
623
+ display: flex;
624
+ flex-direction: column;
625
+ gap: 1px;
626
+ }
627
+
628
+ .sidebar-file-item {
629
+ display: flex;
630
+ align-items: center;
631
+ gap: 7px;
632
+ padding: 5px 10px;
633
+ border-radius: var(--r-sm);
634
+ font-size: 12px;
635
+ color: var(--text-secondary);
636
+ cursor: pointer;
637
+ transition: background var(--t-fast), color var(--t-fast);
638
+ overflow: hidden;
639
+ white-space: nowrap;
640
+ text-overflow: ellipsis;
641
+ }
642
+
643
+ .sidebar-file-item:hover {
644
+ background: var(--bg-hover);
645
+ color: var(--text);
646
+ }
647
+
648
+ .sidebar-file-item.is-active {
649
+ background: var(--bg-active);
650
+ color: var(--green);
651
+ }
652
+
653
+ /* Spacer */
654
+ .sidebar-spacer { flex: 1; }
655
+
656
+ /* Sidebar shell section */
657
+ .sidebar-shell-section {
658
+ padding: 10px 12px 6px;
659
+ flex-shrink: 0;
660
+ border-top: 1px solid var(--border);
661
+ }
662
+
663
+ .sidebar-section-label {
664
+ font-size: 9px;
665
+ font-weight: 700;
666
+ text-transform: uppercase;
667
+ letter-spacing: 0.08em;
668
+ color: var(--text-muted);
669
+ margin: 0 0 5px 2px;
670
+ }
671
+
672
+ .sidebar-shell-row {
673
+ display: flex;
674
+ align-items: center;
675
+ gap: 5px;
676
+ }
677
+
678
+ .sidebar-shell-input {
679
+ flex: 1;
680
+ background: var(--bg-raised);
681
+ border: 1px solid var(--border);
682
+ border-radius: var(--r-sm);
683
+ color: var(--text);
684
+ font-size: 11.5px;
685
+ font-family: var(--font-mono);
686
+ padding: 5px 8px;
687
+ outline: none;
688
+ transition: border-color var(--t-fast);
689
+ min-width: 0;
690
+ }
691
+ .sidebar-shell-input:focus { border-color: var(--green); }
692
+ .sidebar-shell-input::placeholder { color: var(--text-muted); }
693
+
694
+ /* Sidebar env button */
695
+ .sidebar-env-btn {
696
+ display: flex;
697
+ align-items: center;
698
+ gap: 8px;
699
+ width: 100%;
700
+ padding: 9px 14px;
701
+ background: none;
702
+ border: none;
703
+ border-top: 1px solid var(--border);
704
+ color: var(--text-secondary);
705
+ font-size: 12.5px;
706
+ font-weight: 500;
707
+ font-family: inherit;
708
+ cursor: pointer;
709
+ transition: background var(--t-fast), color var(--t-fast);
710
+ text-align: left;
711
+ flex-shrink: 0;
712
+ }
713
+ .sidebar-env-btn:hover { background: var(--bg-hover); color: var(--text); }
714
+ .sidebar-env-btn svg { flex-shrink: 0; color: var(--green); }
715
+
716
+ /* Footer (kept for legacy, hidden) */
717
+ .sidebar-footer {
718
+ display: flex;
719
+ align-items: center;
720
+ gap: 8px;
721
+ padding: 10px 12px;
722
+ border-top: 1px solid var(--border);
723
+ flex-shrink: 0;
724
+ }
725
+
726
+ .theme-toggle-btn {
727
+ width: 28px;
728
+ height: 28px;
729
+ border-radius: var(--r-sm);
730
+ background: var(--bg-raised);
731
+ border: 1px solid var(--border);
732
+ color: var(--text-secondary);
733
+ display: flex;
734
+ align-items: center;
735
+ justify-content: center;
736
+ cursor: pointer;
737
+ transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast);
738
+ flex-shrink: 0;
739
+ }
740
+
741
+ .theme-toggle-btn:hover {
742
+ background: var(--bg-elevated);
743
+ color: var(--text);
744
+ border-color: var(--border-strong);
745
+ }
746
+
747
+ /* ── THEME SELECT ─────────────────────────────────────────── */
748
+ .theme-select {
749
+ appearance: none;
750
+ -webkit-appearance: none;
751
+ background: var(--bg-raised);
752
+ border: 1px solid var(--border-strong);
753
+ border-radius: var(--r-md);
754
+ color: var(--text);
755
+ font-size: 12px;
756
+ font-family: inherit;
757
+ font-weight: 500;
758
+ padding: 5px 28px 5px 10px;
759
+ cursor: pointer;
760
+ outline: none;
761
+ transition: border-color var(--t-fast), background var(--t-fast);
762
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23888' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
763
+ background-repeat: no-repeat;
764
+ background-position: right 8px center;
765
+ min-width: 130px;
766
+ flex-shrink: 0;
767
+ }
768
+ .theme-select:hover { border-color: var(--border-accent); }
769
+ .theme-select:focus { border-color: var(--border-accent); box-shadow: 0 0 0 2px var(--accent-soft); }
770
+ .theme-select option { background: var(--bg-surface); color: var(--text); }
771
+ .theme-select optgroup { background: var(--bg-raised); color: var(--text-muted); font-size: 11px; }
772
+
773
+ .user-avatar {
774
+ width: 28px;
775
+ height: 28px;
776
+ border-radius: var(--r-full);
777
+ background: linear-gradient(135deg, var(--green) 0%, var(--blue) 100%);
778
+ color: #fff;
779
+ font-size: 11px;
780
+ font-weight: 700;
781
+ display: flex;
782
+ align-items: center;
783
+ justify-content: center;
784
+ flex-shrink: 0;
785
+ }
786
+
787
+ .user-info {
788
+ flex: 1;
789
+ min-width: 0;
790
+ display: flex;
791
+ flex-direction: column;
792
+ overflow: hidden;
793
+ }
794
+
795
+ .user-name {
796
+ font-size: 12px;
797
+ font-weight: 600;
798
+ color: var(--text);
799
+ white-space: nowrap;
800
+ overflow: hidden;
801
+ text-overflow: ellipsis;
802
+ }
803
+
804
+ .user-plan {
805
+ font-size: 10px;
806
+ color: var(--green);
807
+ }
808
+
809
+ /* ── MAIN CONTENT ─────────────────────────────────────────── */
810
+ .main-content {
811
+ flex: 1;
812
+ min-width: 0;
813
+ display: flex;
814
+ flex-direction: column;
815
+ overflow: hidden;
816
+ position: relative;
817
+ }
818
+
819
+ /* ── PAGE VIEW ────────────────────────────────────────────── */
820
+ .page-view {
821
+ flex: 1;
822
+ display: flex;
823
+ flex-direction: column;
824
+ overflow: hidden;
825
+ height: 100%;
826
+ }
827
+
828
+ /* ═══════════════════════════════════════════════════════════
829
+ SHARED COMPONENTS
830
+ ═══════════════════════════════════════════════════════════ */
831
+
832
+ /* Icon button */
833
+ .icon-button {
834
+ width: 28px;
835
+ height: 28px;
836
+ border-radius: var(--r-sm);
837
+ background: transparent;
838
+ border: none;
839
+ color: var(--text-secondary);
840
+ display: flex;
841
+ align-items: center;
842
+ justify-content: center;
843
+ cursor: pointer;
844
+ transition: background var(--t-fast), color var(--t-fast);
845
+ flex-shrink: 0;
846
+ }
847
+
848
+ .icon-button:hover {
849
+ background: var(--bg-hover);
850
+ color: var(--text);
851
+ }
852
+
853
+ /* Primary button */
854
+ .btn-primary {
855
+ display: inline-flex;
856
+ align-items: center;
857
+ gap: 6px;
858
+ padding: 7px 14px;
859
+ border-radius: var(--r-md);
860
+ background: var(--green);
861
+ color: #000;
862
+ font-size: 13px;
863
+ font-weight: 600;
864
+ border: none;
865
+ cursor: pointer;
866
+ transition: opacity var(--t-fast), transform var(--t-fast);
867
+ white-space: nowrap;
868
+ flex-shrink: 0;
869
+ }
870
+
871
+ .btn-primary:hover { opacity: 0.9; }
872
+ .btn-primary:active { transform: scale(0.97); }
873
+ .btn-primary:disabled { opacity: 0.4; cursor: not-allowed; }
874
+
875
+ /* Ghost button */
876
+ .btn-ghost {
877
+ display: inline-flex;
878
+ align-items: center;
879
+ gap: 6px;
880
+ padding: 6px 12px;
881
+ border-radius: var(--r-md);
882
+ background: transparent;
883
+ border: 1px solid var(--border);
884
+ color: var(--text-secondary);
885
+ font-size: 13px;
886
+ font-weight: 500;
887
+ cursor: pointer;
888
+ transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast);
889
+ white-space: nowrap;
890
+ }
891
+
892
+ .btn-ghost:hover {
893
+ background: var(--bg-hover);
894
+ border-color: var(--border-strong);
895
+ color: var(--text);
896
+ }
897
+
898
+ .btn-ghost.small {
899
+ padding: 4px 10px;
900
+ font-size: 12px;
901
+ }
902
+
903
+ .btn-danger {
904
+ display: inline-flex;
905
+ align-items: center;
906
+ gap: 6px;
907
+ padding: 7px 14px;
908
+ border-radius: var(--r-md);
909
+ background: var(--red);
910
+ color: #0b0b0b;
911
+ font-size: 13px;
912
+ font-weight: 600;
913
+ border: none;
914
+ cursor: pointer;
915
+ transition: opacity var(--t-fast), transform var(--t-fast);
916
+ }
917
+
918
+ .btn-danger:hover { opacity: 0.9; }
919
+ .btn-danger:active { transform: scale(0.97); }
920
+ .btn-danger.is-danger { background: var(--red); }
921
+
922
+ /* Page header */
923
+ .page-header {
924
+ display: flex;
925
+ align-items: center;
926
+ justify-content: space-between;
927
+ padding: 20px 28px 16px;
928
+ border-bottom: 1px solid var(--border);
929
+ flex-shrink: 0;
930
+ background: var(--bg-base);
931
+ gap: 16px;
932
+ }
933
+
934
+ .page-header-left { display: flex; flex-direction: column; gap: 2px; }
935
+ .page-header-right { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
936
+
937
+ .page-title {
938
+ font-size: 20px;
939
+ font-weight: 700;
940
+ color: var(--text);
941
+ letter-spacing: -0.02em;
942
+ }
943
+
944
+ .page-subtitle {
945
+ font-size: 12px;
946
+ color: var(--text-muted);
947
+ }
948
+
949
+ .page-greeting {
950
+ font-size: 22px;
951
+ font-weight: 700;
952
+ color: var(--text);
953
+ letter-spacing: -0.02em;
954
+ }
955
+
956
+ /* Search bar (dashboard) */
957
+ .search-bar {
958
+ display: flex;
959
+ align-items: center;
960
+ gap: 8px;
961
+ background: var(--bg-raised);
962
+ border: 1px solid var(--border);
963
+ border-radius: var(--r-full);
964
+ padding: 6px 14px;
965
+ min-width: 220px;
966
+ transition: border-color var(--t-fast);
967
+ }
968
+
969
+ .search-bar:focus-within {
970
+ border-color: var(--border-accent);
971
+ }
972
+
973
+ .search-bar svg { color: var(--text-muted); flex-shrink: 0; }
974
+
975
+ .search-bar input {
976
+ background: none;
977
+ border: none;
978
+ outline: none;
979
+ color: var(--text);
980
+ font-size: 13px;
981
+ font-family: inherit;
982
+ width: 100%;
983
+ }
984
+
985
+ .search-bar input::placeholder { color: var(--text-muted); }
986
+
987
+ /* Select */
988
+ select, .select-sm {
989
+ background: var(--bg-raised);
990
+ border: 1px solid var(--border);
991
+ color: var(--text);
992
+ border-radius: var(--r-sm);
993
+ padding: 4px 8px;
994
+ font-size: 12px;
995
+ font-family: inherit;
996
+ cursor: pointer;
997
+ outline: none;
998
+ }
999
+
1000
+ select:focus, .select-sm:focus { border-color: var(--border-accent); }
1001
+
1002
+ /* ═══════════════════════════════════════════════════════════
1003
+ DASHBOARD PAGE
1004
+ ═══════════════════════════════════════════════════════════ */
1005
+ #page-dashboard {
1006
+ overflow-y: auto;
1007
+ padding-bottom: 40px;
1008
+ }
1009
+
1010
+ /* Stat grid */
1011
+ .stat-grid {
1012
+ display: grid;
1013
+ grid-template-columns: repeat(4, 1fr);
1014
+ gap: 16px;
1015
+ padding: 20px 28px 0;
1016
+ }
1017
+
1018
+ .stat-card {
1019
+ background: var(--bg-surface);
1020
+ border: 1px solid var(--border);
1021
+ border-radius: var(--r-lg);
1022
+ padding: 20px;
1023
+ position: relative;
1024
+ overflow: hidden;
1025
+ transition: transform var(--t-fast), box-shadow var(--t-fast);
1026
+ }
1027
+
1028
+ .stat-card::before {
1029
+ content: '';
1030
+ position: absolute;
1031
+ top: 0;
1032
+ left: 0;
1033
+ right: 0;
1034
+ height: 3px;
1035
+ }
1036
+
1037
+ .stat-card:hover {
1038
+ transform: translateY(-2px);
1039
+ box-shadow: var(--shadow-md);
1040
+ }
1041
+
1042
+ .stat-card--green::before { background: var(--green); }
1043
+ .stat-card--blue::before { background: var(--blue); }
1044
+ .stat-card--orange::before { background: var(--orange); }
1045
+ .stat-card--pink::before { background: var(--pink); }
1046
+
1047
+ .stat-header-row {
1048
+ display: flex;
1049
+ align-items: center;
1050
+ justify-content: space-between;
1051
+ gap: 10px;
1052
+ }
1053
+
1054
+ .stat-reset-btn {
1055
+ border: 1px solid var(--border);
1056
+ background: var(--bg-hover);
1057
+ color: var(--text-secondary);
1058
+ border-radius: var(--r-sm);
1059
+ font-size: 11px;
1060
+ padding: 4px 8px;
1061
+ cursor: pointer;
1062
+ transition: color var(--t-fast), border-color var(--t-fast), background var(--t-fast);
1063
+ }
1064
+
1065
+ .stat-reset-btn:hover {
1066
+ color: var(--text);
1067
+ border-color: var(--border-strong);
1068
+ background: var(--bg-active);
1069
+ }
1070
+
1071
+ .stat-value {
1072
+ font-size: 32px;
1073
+ font-weight: 800;
1074
+ color: var(--text);
1075
+ letter-spacing: -0.03em;
1076
+ line-height: 1.1;
1077
+ margin-bottom: 6px;
1078
+ font-variant-numeric: tabular-nums;
1079
+ }
1080
+
1081
+ .stat-label {
1082
+ font-size: 12px;
1083
+ font-weight: 600;
1084
+ color: var(--text-secondary);
1085
+ text-transform: uppercase;
1086
+ letter-spacing: 0.05em;
1087
+ margin-bottom: 4px;
1088
+ }
1089
+
1090
+ .stat-sub {
1091
+ font-size: 11px;
1092
+ color: var(--text-muted);
1093
+ }
1094
+
1095
+ /* Dashboard sections */
1096
+ .dashboard-section {
1097
+ padding: 24px 28px 0;
1098
+ }
1099
+
1100
+ .section-header {
1101
+ display: flex;
1102
+ align-items: center;
1103
+ gap: 12px;
1104
+ margin-bottom: 16px;
1105
+ flex-wrap: wrap;
1106
+ }
1107
+
1108
+ .section-title {
1109
+ font-size: 16px;
1110
+ font-weight: 700;
1111
+ color: var(--text);
1112
+ letter-spacing: -0.01em;
1113
+ margin-right: auto;
1114
+ }
1115
+
1116
+ .view-all-link {
1117
+ font-size: 12px;
1118
+ color: var(--green);
1119
+ text-decoration: none;
1120
+ font-weight: 500;
1121
+ opacity: 0.85;
1122
+ transition: opacity var(--t-fast);
1123
+ }
1124
+
1125
+ .view-all-link:hover { opacity: 1; }
1126
+
1127
+ /* Filter tabs */
1128
+ .filter-tabs {
1129
+ display: flex;
1130
+ gap: 2px;
1131
+ background: var(--bg-raised);
1132
+ border-radius: var(--r-full);
1133
+ padding: 2px;
1134
+ }
1135
+
1136
+ .filter-tab {
1137
+ padding: 4px 12px;
1138
+ border-radius: var(--r-full);
1139
+ background: transparent;
1140
+ border: none;
1141
+ color: var(--text-secondary);
1142
+ font-size: 12px;
1143
+ font-weight: 500;
1144
+ cursor: pointer;
1145
+ transition: background var(--t-fast), color var(--t-fast);
1146
+ }
1147
+
1148
+ .filter-tab:hover { color: var(--text); }
1149
+
1150
+ .filter-tab.is-active {
1151
+ background: var(--bg-surface);
1152
+ color: var(--text);
1153
+ box-shadow: var(--shadow-sm);
1154
+ }
1155
+
1156
+ /* Notebook grid */
1157
+ .notebook-grid {
1158
+ display: grid;
1159
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
1160
+ gap: 14px;
1161
+ }
1162
+
1163
+ .notebook-grid-empty {
1164
+ grid-column: 1/-1;
1165
+ padding: 48px;
1166
+ text-align: center;
1167
+ color: var(--text-muted);
1168
+ font-size: 13px;
1169
+ }
1170
+
1171
+ /* Notebook card */
1172
+ .notebook-card {
1173
+ background: var(--bg-surface);
1174
+ border: 1px solid var(--border);
1175
+ border-radius: var(--r-lg);
1176
+ padding: 18px;
1177
+ cursor: pointer;
1178
+ transition: border-color var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast);
1179
+ display: flex;
1180
+ flex-direction: column;
1181
+ gap: 10px;
1182
+ text-decoration: none;
1183
+ color: inherit;
1184
+ position: relative;
1185
+ }
1186
+
1187
+ .notebook-card:hover {
1188
+ border-color: var(--border-strong);
1189
+ box-shadow: var(--shadow-md);
1190
+ transform: translateY(-1px);
1191
+ }
1192
+
1193
+ .notebook-card-delete {
1194
+ display: flex;
1195
+ align-items: center;
1196
+ justify-content: center;
1197
+ width: 26px;
1198
+ height: 26px;
1199
+ flex-shrink: 0;
1200
+ border: 1px solid transparent;
1201
+ background: transparent;
1202
+ color: var(--text-muted);
1203
+ border-radius: var(--r-sm);
1204
+ cursor: pointer;
1205
+ transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast), opacity var(--t-fast);
1206
+ opacity: 0;
1207
+ margin-left: auto;
1208
+ }
1209
+
1210
+ .notebook-card:hover .notebook-card-delete {
1211
+ opacity: 1;
1212
+ }
1213
+
1214
+ .notebook-card-delete:hover {
1215
+ background: var(--red-soft);
1216
+ color: var(--red);
1217
+ border-color: var(--red-soft);
1218
+ }
1219
+
1220
+ .notebook-card-header {
1221
+ display: flex;
1222
+ align-items: flex-start;
1223
+ justify-content: space-between;
1224
+ gap: 8px;
1225
+ position: relative;
1226
+ }
1227
+
1228
+ .notebook-card-icon {
1229
+ width: 36px;
1230
+ height: 36px;
1231
+ border-radius: var(--r-md);
1232
+ display: flex;
1233
+ align-items: center;
1234
+ justify-content: center;
1235
+ font-size: 16px;
1236
+ flex-shrink: 0;
1237
+ }
1238
+
1239
+ .notebook-card-icon.ts { background: var(--blue-soft); }
1240
+ .notebook-card-icon.js { background: var(--orange-soft); }
1241
+ .notebook-card-icon.ai { background: var(--pink-soft); }
1242
+
1243
+ .notebook-card-badges {
1244
+ display: flex;
1245
+ gap: 5px;
1246
+ align-items: center;
1247
+ flex-wrap: wrap;
1248
+ }
1249
+
1250
+ .lang-badge {
1251
+ padding: 2px 8px;
1252
+ border-radius: var(--r-full);
1253
+ font-size: 10px;
1254
+ font-weight: 700;
1255
+ letter-spacing: 0.04em;
1256
+ text-transform: uppercase;
1257
+ }
1258
+
1259
+ .lang-badge.ts { background: var(--blue-soft); color: var(--blue); }
1260
+ .lang-badge.js { background: var(--orange-soft); color: var(--orange); }
1261
+ .lang-badge.ai, .lang-badge.prompt { background: var(--pink-soft); color: var(--pink); }
1262
+ .lang-badge.md { background: var(--green-soft); color: var(--green); }
1263
+
1264
+ .notebook-card-title {
1265
+ font-size: 14px;
1266
+ font-weight: 600;
1267
+ color: var(--text);
1268
+ line-height: 1.3;
1269
+ letter-spacing: -0.01em;
1270
+ }
1271
+
1272
+ .notebook-card-meta {
1273
+ font-size: 11px;
1274
+ color: var(--text-muted);
1275
+ display: flex;
1276
+ align-items: center;
1277
+ gap: 6px;
1278
+ }
1279
+
1280
+ .notebook-card-meta-sep { opacity: 0.4; }
1281
+
1282
+ /* Activity feed */
1283
+ .activity-layout {
1284
+ display: grid;
1285
+ grid-template-columns: 1fr 220px;
1286
+ gap: 16px;
1287
+ align-items: start;
1288
+ }
1289
+
1290
+ .activity-feed {
1291
+ background: var(--bg-surface);
1292
+ border: 1px solid var(--border);
1293
+ border-radius: var(--r-lg);
1294
+ overflow: hidden;
1295
+ }
1296
+
1297
+ .activity-empty {
1298
+ padding: 32px;
1299
+ text-align: center;
1300
+ color: var(--text-muted);
1301
+ font-size: 13px;
1302
+ }
1303
+
1304
+ .activity-item {
1305
+ display: flex;
1306
+ align-items: center;
1307
+ gap: 12px;
1308
+ padding: 12px 16px;
1309
+ border-bottom: 1px solid var(--border);
1310
+ font-size: 13px;
1311
+ transition: background var(--t-fast);
1312
+ }
1313
+
1314
+ .activity-item:last-child { border-bottom: none; }
1315
+ .activity-item:hover { background: var(--bg-hover); }
1316
+
1317
+ .activity-dot {
1318
+ width: 8px;
1319
+ height: 8px;
1320
+ border-radius: var(--r-full);
1321
+ flex-shrink: 0;
1322
+ }
1323
+
1324
+ .activity-dot.run { background: var(--green); }
1325
+ .activity-dot.save { background: var(--blue); }
1326
+ .activity-dot.create { background: var(--orange); }
1327
+ .activity-dot.error { background: var(--red); }
1328
+
1329
+ .activity-text { flex: 1; color: var(--text-secondary); }
1330
+ .activity-text strong { color: var(--text); }
1331
+ .activity-time { font-size: 11px; color: var(--text-muted); flex-shrink: 0; }
1332
+
1333
+ /* Metric cards */
1334
+ .activity-metrics {
1335
+ display: flex;
1336
+ flex-direction: column;
1337
+ gap: 10px;
1338
+ }
1339
+
1340
+ .metric-card {
1341
+ background: var(--bg-surface);
1342
+ border: 1px solid var(--border);
1343
+ border-radius: var(--r-lg);
1344
+ padding: 16px;
1345
+ position: relative;
1346
+ overflow: hidden;
1347
+ }
1348
+
1349
+ .metric-card::before {
1350
+ content: '';
1351
+ position: absolute;
1352
+ left: 0;
1353
+ top: 0;
1354
+ bottom: 0;
1355
+ width: 3px;
1356
+ }
1357
+
1358
+ .metric-card--green::before { background: var(--green); }
1359
+ .metric-card--blue::before { background: var(--blue); }
1360
+ .metric-card--orange::before { background: var(--orange); }
1361
+
1362
+ .metric-value {
1363
+ font-size: 22px;
1364
+ font-weight: 800;
1365
+ color: var(--text);
1366
+ letter-spacing: -0.02em;
1367
+ line-height: 1.2;
1368
+ font-variant-numeric: tabular-nums;
1369
+ }
1370
+
1371
+ .metric-label {
1372
+ font-size: 11px;
1373
+ font-weight: 600;
1374
+ color: var(--text-secondary);
1375
+ margin-top: 3px;
1376
+ }
1377
+
1378
+ .metric-sub {
1379
+ font-size: 10px;
1380
+ color: var(--text-muted);
1381
+ margin-top: 2px;
1382
+ }
1383
+
1384
+ /* Placeholder pages */
1385
+ .placeholder-page {
1386
+ display: flex;
1387
+ flex-direction: column;
1388
+ align-items: center;
1389
+ justify-content: center;
1390
+ gap: 16px;
1391
+ flex: 1;
1392
+ color: var(--text-muted);
1393
+ opacity: 0.5;
1394
+ }
1395
+
1396
+ .placeholder-page p { font-size: 15px; }
1397
+
1398
+ /* ═══════════════════════════════════════════════════════════
1399
+ NOTEBOOK EDITOR PAGE
1400
+ ═══════════════════════════════════════════════════════════ */
1401
+ #page-notebook {
1402
+ overflow: hidden;
1403
+ flex-direction: column;
1404
+ }
1405
+
1406
+ /* Notebook header bar */
1407
+ .notebook-header {
1408
+ display: flex;
1409
+ align-items: center;
1410
+ justify-content: space-between;
1411
+ padding: 10px 16px;
1412
+ border-bottom: 1px solid var(--border);
1413
+ background: var(--bg-surface);
1414
+ flex-shrink: 0;
1415
+ gap: 16px;
1416
+ min-height: var(--header-h);
1417
+ }
1418
+
1419
+ .notebook-header-left {
1420
+ display: flex;
1421
+ align-items: flex-start;
1422
+ gap: 8px;
1423
+ min-width: 0;
1424
+ }
1425
+
1426
+ /* Explorer toggle button in header */
1427
+ .explorer-toggle-btn {
1428
+ width: 30px;
1429
+ height: 30px;
1430
+ flex-shrink: 0;
1431
+ background: var(--bg-raised);
1432
+ border: 1px solid var(--border);
1433
+ border-radius: var(--r-sm);
1434
+ color: var(--text-secondary);
1435
+ display: flex;
1436
+ align-items: center;
1437
+ justify-content: center;
1438
+ cursor: pointer;
1439
+ transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast);
1440
+ margin-top: 2px;
1441
+ }
1442
+ .explorer-toggle-btn:hover { background: var(--bg-elevated); color: var(--text); border-color: var(--border-strong); }
1443
+ .explorer-toggle-btn.is-active { background: var(--bg-active); color: var(--green); border-color: var(--green); }
1444
+
1445
+ /* Header left column (breadcrumb + meta row stacked) */
1446
+ .notebook-header-left-col {
1447
+ display: flex;
1448
+ flex-direction: column;
1449
+ gap: 2px;
1450
+ min-width: 0;
1451
+ flex: 1;
1452
+ }
1453
+
1454
+ .notebook-header-right {
1455
+ display: flex;
1456
+ align-items: center;
1457
+ gap: 8px;
1458
+ flex-shrink: 0;
1459
+ }
1460
+
1461
+ /* Breadcrumb */
1462
+ .breadcrumb {
1463
+ display: flex;
1464
+ align-items: center;
1465
+ gap: 5px;
1466
+ font-size: 12px;
1467
+ }
1468
+
1469
+ .breadcrumb-item { color: var(--text-muted); }
1470
+ .breadcrumb-sep { color: var(--text-muted); opacity: 0.5; }
1471
+ .crumb-link { cursor: pointer; transition: color var(--t-fast); }
1472
+ .crumb-link:hover { color: var(--text); }
1473
+ .crumb-current { color: var(--text-secondary); }
1474
+
1475
+ /* Notebook meta row */
1476
+ .notebook-meta-row {
1477
+ display: flex;
1478
+ align-items: center;
1479
+ gap: 8px;
1480
+ min-width: 0;
1481
+ }
1482
+
1483
+ .notebook-title-display {
1484
+ font-size: 15px;
1485
+ font-weight: 700;
1486
+ color: var(--text);
1487
+ letter-spacing: -0.01em;
1488
+ white-space: nowrap;
1489
+ overflow: hidden;
1490
+ text-overflow: ellipsis;
1491
+ cursor: pointer;
1492
+ transition: color var(--t-fast);
1493
+ max-width: 280px;
1494
+ }
1495
+
1496
+ .notebook-title-display:hover { color: var(--green); }
1497
+
1498
+ .notebook-title-input {
1499
+ font-size: 15px;
1500
+ font-weight: 700;
1501
+ background: var(--bg-raised);
1502
+ border: 1px solid var(--border-accent);
1503
+ border-radius: var(--r-sm);
1504
+ color: var(--text);
1505
+ padding: 2px 8px;
1506
+ outline: none;
1507
+ font-family: inherit;
1508
+ }
1509
+
1510
+ .nb-meta-badge {
1511
+ padding: 2px 8px;
1512
+ border-radius: var(--r-full);
1513
+ font-size: 10px;
1514
+ font-weight: 700;
1515
+ letter-spacing: 0.04em;
1516
+ text-transform: uppercase;
1517
+ background: var(--blue-soft);
1518
+ color: var(--blue);
1519
+ flex-shrink: 0;
1520
+ }
1521
+
1522
+ .nb-meta-badge.js { background: var(--orange-soft); color: var(--orange); }
1523
+
1524
+ .nb-meta-text {
1525
+ font-size: 11px;
1526
+ color: var(--text-muted);
1527
+ white-space: nowrap;
1528
+ }
1529
+
1530
+ .nb-meta-sep { color: var(--text-muted); opacity: 0.4; font-size: 11px; }
1531
+
1532
+ /* Kernel pill */
1533
+ .kernel-pill {
1534
+ display: flex;
1535
+ align-items: center;
1536
+ gap: 6px;
1537
+ padding: 4px 10px;
1538
+ border-radius: var(--r-full);
1539
+ background: var(--bg-raised);
1540
+ border: 1px solid var(--border);
1541
+ font-size: 11px;
1542
+ font-weight: 500;
1543
+ color: var(--text-secondary);
1544
+ }
1545
+
1546
+ .kernel-dot {
1547
+ width: 6px;
1548
+ height: 6px;
1549
+ border-radius: var(--r-full);
1550
+ background: var(--green);
1551
+ box-shadow: 0 0 6px var(--green);
1552
+ animation: pulse-dot 2.5s ease-in-out infinite;
1553
+ }
1554
+
1555
+ @keyframes pulse-dot {
1556
+ 0%, 100% { opacity: 1; }
1557
+ 50% { opacity: 0.4; }
1558
+ }
1559
+
1560
+ .kernel-pill.disconnected .kernel-dot { background: var(--red); box-shadow: 0 0 6px var(--red); }
1561
+ .kernel-pill.running .kernel-dot { background: var(--orange); box-shadow: 0 0 6px var(--orange); }
1562
+
1563
+ /* Notebook action buttons */
1564
+ .btn-ai-assist {
1565
+ display: inline-flex;
1566
+ align-items: center;
1567
+ gap: 6px;
1568
+ padding: 6px 12px;
1569
+ border-radius: var(--r-md);
1570
+ background: var(--pink-soft);
1571
+ border: 1px solid rgba(233,110,191,0.2);
1572
+ color: var(--pink);
1573
+ font-size: 12px;
1574
+ font-weight: 600;
1575
+ cursor: pointer;
1576
+ transition: background var(--t-fast), opacity var(--t-fast);
1577
+ white-space: nowrap;
1578
+ }
1579
+
1580
+ .btn-ai-assist:hover { background: rgba(233,110,191,0.18); opacity: 0.9; }
1581
+
1582
+ .btn-run-all {
1583
+ display: inline-flex;
1584
+ align-items: center;
1585
+ gap: 6px;
1586
+ padding: 6px 12px;
1587
+ border-radius: var(--r-md);
1588
+ background: var(--green-soft);
1589
+ border: 1px solid rgba(0,200,150,0.2);
1590
+ color: var(--green);
1591
+ font-size: 12px;
1592
+ font-weight: 600;
1593
+ cursor: pointer;
1594
+ transition: background var(--t-fast);
1595
+ white-space: nowrap;
1596
+ }
1597
+
1598
+ .btn-run-all:hover { background: rgba(0,200,150,0.18); }
1599
+ .btn-run-all:disabled { opacity: 0.4; cursor: not-allowed; }
1600
+
1601
+ .btn-clear-outputs {
1602
+ display: inline-flex;
1603
+ align-items: center;
1604
+ gap: 6px;
1605
+ padding: 6px 12px;
1606
+ border-radius: var(--r-md);
1607
+ background: rgba(255, 100, 80, 0.1);
1608
+ border: 1px solid rgba(255, 100, 80, 0.22);
1609
+ color: #ff6450;
1610
+ font-size: 12px;
1611
+ font-weight: 600;
1612
+ cursor: pointer;
1613
+ transition: background var(--t-fast);
1614
+ white-space: nowrap;
1615
+ }
1616
+ .btn-clear-outputs:hover { background: rgba(255, 100, 80, 0.22); }
1617
+ .btn-clear-outputs:disabled { opacity: 0.4; cursor: not-allowed; }
1618
+
1619
+ /* ── NOTEBOOK BODY ─────────────────────────────────────── */
1620
+ .notebook-body {
1621
+ display: flex;
1622
+ flex: 1;
1623
+ overflow: hidden;
1624
+ }
1625
+
1626
+ /* LEFT: Notebook list panel */
1627
+ .notebook-list-panel {
1628
+ width: var(--nb-panel-w);
1629
+ flex-shrink: 0;
1630
+ border-right: 1px solid var(--border);
1631
+ background: var(--bg-surface);
1632
+ display: flex;
1633
+ flex-direction: column;
1634
+ overflow: hidden;
1635
+ transition: width 220ms ease, border-color 220ms ease;
1636
+ }
1637
+ /* Collapsed state — width collapses to 0 */
1638
+ .notebook-list-panel.is-collapsed {
1639
+ width: 0;
1640
+ border-right-color: transparent;
1641
+ }
1642
+
1643
+ .nlp-header {
1644
+ display: flex;
1645
+ align-items: center;
1646
+ justify-content: space-between;
1647
+ padding: 12px 12px 8px;
1648
+ flex-shrink: 0;
1649
+ }
1650
+
1651
+ .nlp-title {
1652
+ font-size: 11px;
1653
+ font-weight: 700;
1654
+ text-transform: uppercase;
1655
+ letter-spacing: 0.07em;
1656
+ color: var(--text-muted);
1657
+ }
1658
+
1659
+ .nlp-search {
1660
+ display: flex;
1661
+ align-items: center;
1662
+ gap: 6px;
1663
+ background: var(--bg-raised);
1664
+ border: 1px solid var(--border);
1665
+ border-radius: var(--r-sm);
1666
+ padding: 5px 8px;
1667
+ margin: 0 8px 8px;
1668
+ flex-shrink: 0;
1669
+ transition: border-color var(--t-fast);
1670
+ }
1671
+
1672
+ .nlp-search:focus-within { border-color: var(--border-accent); }
1673
+ .nlp-search svg { color: var(--text-muted); flex-shrink: 0; }
1674
+
1675
+ .nlp-search input {
1676
+ background: none;
1677
+ border: none;
1678
+ outline: none;
1679
+ color: var(--text);
1680
+ font-size: 12px;
1681
+ font-family: inherit;
1682
+ width: 100%;
1683
+ }
1684
+
1685
+ .nlp-search input::placeholder { color: var(--text-muted); }
1686
+
1687
+ .nlp-list {
1688
+ flex: 1;
1689
+ overflow-y: auto;
1690
+ padding: 0 6px 8px;
1691
+ display: flex;
1692
+ flex-direction: column;
1693
+ gap: 1px;
1694
+ }
1695
+
1696
+ .nlp-empty {
1697
+ text-align: center;
1698
+ padding: 24px 12px;
1699
+ color: var(--text-muted);
1700
+ font-size: 12px;
1701
+ }
1702
+
1703
+ /* Folder expand/collapse chevron (▶ / ▼) */
1704
+ .nlp-item-chevron {
1705
+ display: inline-flex;
1706
+ align-items: center;
1707
+ justify-content: center;
1708
+ width: 12px;
1709
+ flex-shrink: 0;
1710
+ font-size: 8px;
1711
+ color: var(--text-muted);
1712
+ line-height: 1;
1713
+ transition: color var(--t-fast);
1714
+ }
1715
+ .nlp-item:hover .nlp-item-chevron { color: var(--text-secondary); }
1716
+
1717
+ /* NLP notebook item */
1718
+ .nlp-item {
1719
+ display: flex;
1720
+ align-items: center;
1721
+ gap: 4px;
1722
+ padding: 6px 8px;
1723
+ border-radius: var(--r-sm);
1724
+ cursor: pointer;
1725
+ transition: background var(--t-fast);
1726
+ }
1727
+
1728
+ .nlp-item:hover { background: var(--bg-hover); }
1729
+ .nlp-item.is-active { background: var(--bg-active); }
1730
+
1731
+ .nlp-item-icon {
1732
+ width: 20px;
1733
+ height: 20px;
1734
+ border-radius: 4px;
1735
+ display: flex;
1736
+ align-items: center;
1737
+ justify-content: center;
1738
+ font-size: 10px;
1739
+ font-weight: 800;
1740
+ flex-shrink: 0;
1741
+ }
1742
+
1743
+ .nlp-item-icon.ts { background: var(--blue-soft); color: var(--blue); }
1744
+ .nlp-item-icon.js { background: var(--orange-soft); color: var(--orange); }
1745
+ .nlp-item-icon.ai { background: var(--pink-soft); color: var(--pink); }
1746
+ .nlp-item-icon.md { background: var(--green-soft); color: var(--green); }
1747
+
1748
+ .nlp-item-name {
1749
+ font-size: 12px;
1750
+ color: var(--text-secondary);
1751
+ white-space: nowrap;
1752
+ overflow: hidden;
1753
+ text-overflow: ellipsis;
1754
+ flex: 1;
1755
+ min-width: 0;
1756
+ }
1757
+
1758
+ .nlp-item.is-active .nlp-item-name { color: var(--green); }
1759
+
1760
+ .nlp-item-delete {
1761
+ margin-left: auto;
1762
+ flex-shrink: 0;
1763
+ border: 1px solid var(--border);
1764
+ background: var(--bg-surface);
1765
+ color: var(--text-secondary);
1766
+ border-radius: var(--r-sm);
1767
+ padding: 2px 6px;
1768
+ font-size: 11px;
1769
+ cursor: pointer;
1770
+ opacity: 0;
1771
+ pointer-events: none;
1772
+ transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast), opacity var(--t-fast);
1773
+ }
1774
+
1775
+ /* Show delete button only on row hover */
1776
+ .nlp-item:hover .nlp-item-delete {
1777
+ opacity: 1;
1778
+ pointer-events: auto;
1779
+ }
1780
+
1781
+ .nlp-item-delete:hover {
1782
+ background: var(--bg-active);
1783
+ color: #ef5350;
1784
+ border-color: #ef5350;
1785
+ }
1786
+
1787
+ /* Explorer icon — SVG file icons from /icons/ */
1788
+ .explorer-icon {
1789
+ width: 16px;
1790
+ height: 16px;
1791
+ flex-shrink: 0;
1792
+ display: flex;
1793
+ align-items: center;
1794
+ justify-content: center;
1795
+ line-height: 1;
1796
+ user-select: none;
1797
+ }
1798
+ .explorer-icon img {
1799
+ display: block;
1800
+ width: 16px;
1801
+ height: 16px;
1802
+ flex-shrink: 0;
1803
+ object-fit: contain;
1804
+ pointer-events: none;
1805
+ }
1806
+
1807
+ /* ── File-tree (workspace explorer) ── */
1808
+ .file-tree-group { }
1809
+
1810
+ .file-tree-row {
1811
+ display: flex;
1812
+ align-items: center;
1813
+ gap: 4px;
1814
+ padding: 2px 8px;
1815
+ border-radius: 4px;
1816
+ cursor: default;
1817
+ user-select: none;
1818
+ font-size: 13px;
1819
+ color: var(--text-secondary);
1820
+ transition: background var(--t-fast);
1821
+ min-height: 22px;
1822
+ }
1823
+
1824
+ .file-tree-row.is-openable { cursor: pointer; }
1825
+ .file-tree-row:hover { background: var(--bg-hover); }
1826
+ .file-tree-row.is-active {
1827
+ background: var(--bg-active);
1828
+ color: var(--text);
1829
+ }
1830
+
1831
+ .file-tree-indent {
1832
+ display: inline-block;
1833
+ width: 16px;
1834
+ flex-shrink: 0;
1835
+ }
1836
+
1837
+ .file-tree-chevron {
1838
+ display: inline-flex;
1839
+ align-items: center;
1840
+ justify-content: center;
1841
+ width: 16px;
1842
+ flex-shrink: 0;
1843
+ font-size: 9px; /* VS Code uses small filled triangles */
1844
+ color: var(--text-muted);
1845
+ transition: color var(--t-fast);
1846
+ line-height: 1;
1847
+ }
1848
+
1849
+ .file-tree-row:hover .file-tree-chevron { color: var(--text-secondary); }
1850
+
1851
+ .file-tree-name {
1852
+ flex: 1;
1853
+ white-space: nowrap;
1854
+ overflow: hidden;
1855
+ text-overflow: ellipsis;
1856
+ font-size: 13px;
1857
+ }
1858
+
1859
+ .file-tree-children {
1860
+ /* children are indented by the next depth level's indent span */
1861
+ }
1862
+
1863
+ /* Divider */
1864
+ .nlp-divider {
1865
+ height: 1px;
1866
+ background: var(--border);
1867
+ margin: 4px 8px;
1868
+ flex-shrink: 0;
1869
+ }
1870
+
1871
+ /* Shell section */
1872
+ .nlp-shell-section {
1873
+ padding: 8px;
1874
+ flex-shrink: 0;
1875
+ }
1876
+
1877
+ .nlp-section-label {
1878
+ font-size: 10px;
1879
+ font-weight: 700;
1880
+ text-transform: uppercase;
1881
+ letter-spacing: 0.07em;
1882
+ color: var(--text-muted);
1883
+ margin-bottom: 5px;
1884
+ }
1885
+
1886
+ .nlp-shell-row {
1887
+ display: flex;
1888
+ gap: 5px;
1889
+ }
1890
+
1891
+ .nlp-shell-input {
1892
+ flex: 1;
1893
+ background: var(--bg-raised);
1894
+ border: 1px solid var(--border);
1895
+ border-radius: var(--r-sm);
1896
+ color: var(--text);
1897
+ font-size: 11px;
1898
+ font-family: var(--font-mono);
1899
+ padding: 4px 7px;
1900
+ outline: none;
1901
+ transition: border-color var(--t-fast);
1902
+ }
1903
+
1904
+ .nlp-shell-input:focus { border-color: var(--border-accent); }
1905
+ .nlp-shell-input::placeholder { color: var(--text-muted); }
1906
+
1907
+ .btn-shell-run {
1908
+ padding: 4px 10px;
1909
+ border-radius: var(--r-sm);
1910
+ background: var(--bg-elevated);
1911
+ border: 1px solid var(--border);
1912
+ color: var(--text-secondary);
1913
+ font-size: 11px;
1914
+ font-weight: 600;
1915
+ cursor: pointer;
1916
+ transition: background var(--t-fast), color var(--t-fast);
1917
+ white-space: nowrap;
1918
+ }
1919
+
1920
+ .btn-shell-run:hover {
1921
+ background: var(--green-soft);
1922
+ border-color: var(--green);
1923
+ color: var(--green);
1924
+ }
1925
+
1926
+ /* Env button */
1927
+ .nlp-env-btn {
1928
+ display: flex;
1929
+ align-items: center;
1930
+ gap: 7px;
1931
+ width: 100%;
1932
+ padding: 8px;
1933
+ background: transparent;
1934
+ border: none;
1935
+ border-top: 1px solid var(--border);
1936
+ color: var(--text-muted);
1937
+ font-size: 11px;
1938
+ font-weight: 500;
1939
+ cursor: pointer;
1940
+ transition: color var(--t-fast), background var(--t-fast);
1941
+ font-family: inherit;
1942
+ flex-shrink: 0;
1943
+ }
1944
+
1945
+ .nlp-env-btn:hover {
1946
+ background: var(--bg-hover);
1947
+ color: var(--text-secondary);
1948
+ }
1949
+
1950
+ /* CENTER: Notebook canvas */
1951
+ .notebook-canvas-wrap {
1952
+ flex: 1;
1953
+ overflow-y: auto;
1954
+ display: flex;
1955
+ flex-direction: column;
1956
+ background: var(--bg-base);
1957
+ }
1958
+
1959
+ /* Shell panel */
1960
+ .shell-panel {
1961
+ background: var(--bg-surface);
1962
+ border-bottom: 1px solid var(--border);
1963
+ flex-shrink: 0;
1964
+ }
1965
+
1966
+ .shell-header {
1967
+ display: flex;
1968
+ align-items: center;
1969
+ gap: 8px;
1970
+ padding: 8px 14px;
1971
+ border-bottom: 1px solid var(--border);
1972
+ }
1973
+
1974
+ .shell-prompt {
1975
+ font-family: var(--font-mono);
1976
+ color: var(--green);
1977
+ font-size: 12px;
1978
+ font-weight: 700;
1979
+ }
1980
+
1981
+ .shell-last-command {
1982
+ font-family: var(--font-mono);
1983
+ font-size: 12px;
1984
+ color: var(--text-secondary);
1985
+ flex: 1;
1986
+ }
1987
+
1988
+ .shell-output {
1989
+ font-family: var(--font-mono);
1990
+ font-size: 12px;
1991
+ color: var(--text-secondary);
1992
+ white-space: pre-wrap;
1993
+ padding: 10px 14px;
1994
+ max-height: 200px;
1995
+ overflow-y: auto;
1996
+ }
1997
+
1998
+ /* Notebook canvas — cells list */
1999
+ .notebook-canvas {
2000
+ flex: 1;
2001
+ padding: 16px 20px;
2002
+ display: flex;
2003
+ flex-direction: column;
2004
+ gap: 10px;
2005
+ min-height: 200px;
2006
+ }
2007
+
2008
+ .notebook-empty-state {
2009
+ display: flex;
2010
+ flex-direction: column;
2011
+ align-items: center;
2012
+ justify-content: center;
2013
+ flex: 1;
2014
+ padding: 80px 20px;
2015
+ text-align: center;
2016
+ color: var(--text-primary, #e2e8f0);
2017
+ }
2018
+
2019
+ .notebook-loading-state {
2020
+ display: flex;
2021
+ flex-direction: column;
2022
+ align-items: center;
2023
+ justify-content: center;
2024
+ flex: 1;
2025
+ padding: 80px 20px;
2026
+ text-align: center;
2027
+ color: var(--text-primary, #e2e8f0);
2028
+ }
2029
+
2030
+ .nb-spinner {
2031
+ width: 32px;
2032
+ height: 32px;
2033
+ border: 3px solid rgba(255,255,255,0.15);
2034
+ border-top-color: var(--accent, #6366f1);
2035
+ border-radius: 50%;
2036
+ animation: nb-spin 0.7s linear infinite;
2037
+ }
2038
+
2039
+ @keyframes nb-spin {
2040
+ to { transform: rotate(360deg); }
2041
+ }
2042
+
2043
+ /* Add cell bar — positioned at top of canvas */
2044
+ .add-cell-bar {
2045
+ display: flex;
2046
+ align-items: center;
2047
+ gap: 0;
2048
+ padding: 10px 20px;
2049
+ flex-shrink: 0;
2050
+ background: var(--bg-surface);
2051
+ border-bottom: 1px solid var(--border);
2052
+ border-radius: var(--r-md) var(--r-md) 0 0;
2053
+ position: sticky;
2054
+ top: 0;
2055
+ z-index: 10;
2056
+ }
2057
+
2058
+ .add-cell-label {
2059
+ font-size: 12px;
2060
+ color: var(--text-muted);
2061
+ margin-right: 8px;
2062
+ }
2063
+
2064
+ .add-cell-type-btn {
2065
+ background: none;
2066
+ border: none;
2067
+ color: var(--text-secondary);
2068
+ font-size: 12px;
2069
+ font-weight: 500;
2070
+ cursor: pointer;
2071
+ padding: 4px 8px;
2072
+ border-radius: var(--r-sm);
2073
+ transition: background var(--t-fast), color var(--t-fast);
2074
+ font-family: inherit;
2075
+ }
2076
+
2077
+ .add-cell-type-btn:hover {
2078
+ background: var(--bg-raised);
2079
+ color: var(--green);
2080
+ }
2081
+
2082
+ .add-cell-dot {
2083
+ color: var(--text-muted);
2084
+ font-size: 12px;
2085
+ padding: 0 2px;
2086
+ }
2087
+
2088
+ /* File preview */
2089
+ .file-preview {
2090
+ flex: 1;
2091
+ padding: 24px;
2092
+ overflow-y: auto;
2093
+ display: flex;
2094
+ flex-direction: column;
2095
+ }
2096
+
2097
+ /* File preview card */
2098
+ .file-preview-card {
2099
+ display: flex;
2100
+ flex-direction: column;
2101
+ gap: 12px;
2102
+ flex: 1;
2103
+ min-height: 0;
2104
+ }
2105
+
2106
+ .file-preview-header {
2107
+ display: flex;
2108
+ align-items: center;
2109
+ gap: 10px;
2110
+ flex-shrink: 0;
2111
+ }
2112
+
2113
+ .file-preview-title {
2114
+ font-size: 15px;
2115
+ font-weight: 600;
2116
+ color: var(--text);
2117
+ margin: 0;
2118
+ }
2119
+
2120
+ .file-preview-badge {
2121
+ font-size: 10px;
2122
+ font-weight: 700;
2123
+ font-family: var(--font-mono);
2124
+ padding: 2px 7px;
2125
+ border-radius: var(--r-full);
2126
+ background: var(--bg-elevated);
2127
+ color: var(--text-muted);
2128
+ text-transform: uppercase;
2129
+ letter-spacing: 0.05em;
2130
+ }
2131
+
2132
+ /* Image: constrained to available space */
2133
+ .file-preview-image-wrap {
2134
+ flex: 1;
2135
+ display: flex;
2136
+ align-items: flex-start;
2137
+ justify-content: center;
2138
+ min-height: 0;
2139
+ overflow: hidden;
2140
+ }
2141
+
2142
+ .file-preview-image {
2143
+ max-width: 100%;
2144
+ max-height: calc(100vh - 160px);
2145
+ object-fit: contain;
2146
+ border-radius: var(--r-md);
2147
+ box-shadow: var(--shadow-md);
2148
+ }
2149
+
2150
+ /* PDF: fill remaining height */
2151
+ .file-preview-pdf {
2152
+ flex: 1;
2153
+ width: 100%;
2154
+ min-height: 0;
2155
+ height: calc(100vh - 140px);
2156
+ border: none;
2157
+ border-radius: var(--r-md);
2158
+ }
2159
+
2160
+ /* Text/code preview */
2161
+ .file-preview-text {
2162
+ flex: 1;
2163
+ background: var(--bg-raised);
2164
+ border: 1px solid var(--border);
2165
+ border-radius: var(--r-md);
2166
+ padding: 16px;
2167
+ font-family: var(--font-mono);
2168
+ font-size: 13px;
2169
+ color: var(--text-secondary);
2170
+ overflow-y: auto;
2171
+ white-space: pre-wrap;
2172
+ word-break: break-word;
2173
+ margin: 0;
2174
+ }
2175
+
2176
+ /* ═══════════════════════════════════════════════════════════
2177
+ CELLS
2178
+ ═══════════════════════════════════════════════════════════ */
2179
+ .notebook-cell {
2180
+ position: relative;
2181
+ }
2182
+
2183
+ .cell-content {
2184
+ display: flex;
2185
+ flex-direction: column;
2186
+ gap: 0;
2187
+ }
2188
+
2189
+ .cell-frame {
2190
+ background: var(--bg-surface);
2191
+ border: 1px solid var(--border);
2192
+ border-radius: var(--r-lg);
2193
+ overflow: hidden;
2194
+ transition: border-color var(--t-fast), box-shadow var(--t-fast);
2195
+ }
2196
+
2197
+ .notebook-cell:hover .cell-frame,
2198
+ .notebook-cell.is-focused .cell-frame {
2199
+ border-color: var(--border-strong);
2200
+ }
2201
+
2202
+ .notebook-cell.is-focused .cell-frame {
2203
+ border-color: var(--green);
2204
+ box-shadow: 0 0 0 1px var(--green-soft);
2205
+ }
2206
+
2207
+ /* Cell topbar */
2208
+ .cell-topbar {
2209
+ display: flex;
2210
+ align-items: center;
2211
+ justify-content: space-between;
2212
+ padding: 8px 12px;
2213
+ border-bottom: 1px solid var(--border);
2214
+ background: var(--bg-raised);
2215
+ gap: 8px;
2216
+ }
2217
+
2218
+ .cell-topbar-left {
2219
+ display: flex;
2220
+ align-items: center;
2221
+ gap: 8px;
2222
+ min-width: 0;
2223
+ }
2224
+
2225
+ .execution-count {
2226
+ font-family: var(--font-mono);
2227
+ font-size: 10px;
2228
+ color: var(--text-muted);
2229
+ min-width: 24px;
2230
+ flex-shrink: 0;
2231
+ }
2232
+
2233
+ .cell-type-badge {
2234
+ font-size: 10px;
2235
+ font-weight: 700;
2236
+ letter-spacing: 0.04em;
2237
+ padding: 2px 7px;
2238
+ border-radius: var(--r-full);
2239
+ background: var(--blue-soft);
2240
+ color: var(--blue);
2241
+ text-transform: uppercase;
2242
+ flex-shrink: 0;
2243
+ }
2244
+
2245
+ .cell-type-badge.js { background: var(--orange-soft); color: var(--orange); }
2246
+ .cell-type-badge.md, .cell-type-badge.markdown { background: var(--green-soft); color: var(--green); }
2247
+ .cell-type-badge.prompt, .cell-type-badge.ai { background: var(--pink-soft); color: var(--pink); }
2248
+ .cell-type-badge.sql { background: var(--purple-soft); color: var(--purple); }
2249
+
2250
+ .cell-status-badge {
2251
+ font-size: 10px;
2252
+ font-weight: 600;
2253
+ color: var(--text-muted);
2254
+ }
2255
+
2256
+ .cell-status-badge.running { color: var(--orange); }
2257
+ .cell-status-badge.success { color: var(--green); }
2258
+ .cell-status-badge.error { color: var(--red); }
2259
+
2260
+ .cell-timing {
2261
+ font-size: 10px;
2262
+ font-family: var(--font-mono);
2263
+ color: var(--text-muted);
2264
+ }
2265
+
2266
+ /* Cell tools */
2267
+ .cell-tools {
2268
+ display: flex;
2269
+ align-items: center;
2270
+ gap: 2px;
2271
+ opacity: 0;
2272
+ transition: opacity var(--t-fast);
2273
+ }
2274
+
2275
+ .notebook-cell:hover .cell-tools,
2276
+ .notebook-cell.is-focused .cell-tools {
2277
+ opacity: 1;
2278
+ }
2279
+
2280
+ .cell-tool-btn {
2281
+ width: 24px;
2282
+ height: 24px;
2283
+ border-radius: var(--r-sm);
2284
+ background: transparent;
2285
+ border: none;
2286
+ color: var(--text-muted);
2287
+ display: flex;
2288
+ align-items: center;
2289
+ justify-content: center;
2290
+ cursor: pointer;
2291
+ transition: background var(--t-fast), color var(--t-fast);
2292
+ font-size: 10px;
2293
+ font-weight: 700;
2294
+ font-family: var(--font-mono);
2295
+ }
2296
+
2297
+ .cell-tool-btn:hover {
2298
+ background: var(--bg-elevated);
2299
+ color: var(--text);
2300
+ }
2301
+
2302
+ .cell-tool-btn.delete-cell:hover {
2303
+ background: var(--red-soft);
2304
+ color: var(--red);
2305
+ }
2306
+
2307
+ .cell-tool-btn.ai-assist-button:hover {
2308
+ background: var(--pink-soft);
2309
+ color: var(--pink);
2310
+ }
2311
+
2312
+ /* Run button */
2313
+ .cell-run-button {
2314
+ display: inline-flex;
2315
+ align-items: center;
2316
+ gap: 4px;
2317
+ padding: 3px 10px;
2318
+ border-radius: var(--r-sm);
2319
+ background: var(--green-soft);
2320
+ border: 1px solid rgba(0,200,150,0.2);
2321
+ color: var(--green);
2322
+ font-size: 11px;
2323
+ font-weight: 600;
2324
+ cursor: pointer;
2325
+ transition: background var(--t-fast), opacity var(--t-fast);
2326
+ font-family: inherit;
2327
+ }
2328
+
2329
+ .cell-run-button:hover { background: rgba(0,200,150,0.2); }
2330
+ .cell-run-button:disabled { opacity: 0.4; cursor: not-allowed; }
2331
+
2332
+ .cell-run-button.running {
2333
+ background: var(--orange-soft);
2334
+ border-color: rgba(247,137,79,0.2);
2335
+ color: var(--orange);
2336
+ }
2337
+
2338
+ /* Stop button (shown during cell execution) */
2339
+ .cell-run-button.is-stop {
2340
+ background: rgba(239, 68, 68, 0.12);
2341
+ border-color: rgba(239, 68, 68, 0.25);
2342
+ color: #ef4444;
2343
+ }
2344
+ .cell-run-button.is-stop:hover {
2345
+ background: rgba(239, 68, 68, 0.22);
2346
+ }
2347
+
2348
+ /* Array output toggle */
2349
+ .array-output-wrapper { display: flex; flex-direction: column; gap: 4px; }
2350
+ .array-output-header {
2351
+ display: flex;
2352
+ align-items: center;
2353
+ justify-content: flex-end;
2354
+ padding: 0 2px;
2355
+ }
2356
+ .array-toggle-btn {
2357
+ display: inline-flex;
2358
+ align-items: center;
2359
+ gap: 4px;
2360
+ padding: 2px 8px;
2361
+ border-radius: var(--r-sm);
2362
+ background: var(--bg-elevated);
2363
+ border: 1px solid var(--border);
2364
+ color: var(--text-secondary);
2365
+ font-size: 11px;
2366
+ font-weight: 500;
2367
+ cursor: pointer;
2368
+ font-family: inherit;
2369
+ transition: background var(--t-fast), color var(--t-fast);
2370
+ }
2371
+ .array-toggle-btn:hover { background: var(--bg-hover); color: var(--text); }
2372
+ .array-toggle-btn.is-active {
2373
+ background: var(--bg-active);
2374
+ border-color: var(--border-accent);
2375
+ color: var(--accent);
2376
+ }
2377
+
2378
+ /* Cell body */
2379
+ .cell-body {
2380
+ display: flex;
2381
+ flex-direction: column;
2382
+ }
2383
+
2384
+ .editor-host {
2385
+ min-height: 60px;
2386
+ }
2387
+
2388
+ .markdown-editor,
2389
+ .prompt-editor,
2390
+ .prompt-system-input {
2391
+ width: 100%;
2392
+ background: transparent;
2393
+ border: none;
2394
+ color: var(--text);
2395
+ font-family: var(--font-mono);
2396
+ font-size: 13px;
2397
+ line-height: 1.6;
2398
+ padding: 14px 16px;
2399
+ resize: none;
2400
+ outline: none;
2401
+ min-height: 80px;
2402
+ }
2403
+
2404
+ .markdown-editor::placeholder,
2405
+ .prompt-editor::placeholder,
2406
+ .prompt-system-input::placeholder { color: var(--text-muted); }
2407
+
2408
+ /* Prompt panel */
2409
+ .prompt-panel {
2410
+ display: flex;
2411
+ flex-direction: column;
2412
+ }
2413
+
2414
+ .prompt-toolbar {
2415
+ display: flex;
2416
+ align-items: center;
2417
+ gap: 10px;
2418
+ padding: 8px 12px;
2419
+ border-bottom: 1px solid var(--border);
2420
+ background: var(--bg-raised);
2421
+ }
2422
+
2423
+ .prompt-temp-label {
2424
+ display: flex;
2425
+ align-items: center;
2426
+ gap: 6px;
2427
+ font-size: 11px;
2428
+ color: var(--text-secondary);
2429
+ }
2430
+
2431
+ .prompt-temperature-input {
2432
+ width: 54px;
2433
+ background: var(--bg-elevated);
2434
+ border: 1px solid var(--border);
2435
+ border-radius: var(--r-sm);
2436
+ color: var(--text);
2437
+ font-size: 11px;
2438
+ padding: 2px 6px;
2439
+ outline: none;
2440
+ font-family: inherit;
2441
+ }
2442
+
2443
+ .prompt-token-count {
2444
+ font-size: 11px;
2445
+ color: var(--text-muted);
2446
+ margin-left: auto;
2447
+ }
2448
+
2449
+ .prompt-system-input {
2450
+ border-bottom: 1px solid var(--border);
2451
+ background: var(--bg-raised);
2452
+ font-size: 12px;
2453
+ min-height: 48px;
2454
+ padding: 10px 14px;
2455
+ }
2456
+
2457
+ /* Markdown preview */
2458
+ .markdown-preview {
2459
+ padding: 16px 20px;
2460
+ color: var(--text);
2461
+ line-height: 1.7;
2462
+ }
2463
+
2464
+ .rendered-markdown h1, .rendered-markdown h2, .rendered-markdown h3 {
2465
+ color: var(--text);
2466
+ font-weight: 700;
2467
+ margin-bottom: 8px;
2468
+ letter-spacing: -0.01em;
2469
+ }
2470
+ .rendered-markdown h1 { font-size: 20px; }
2471
+ .rendered-markdown h2 { font-size: 16px; }
2472
+ .rendered-markdown h3 { font-size: 14px; }
2473
+ .rendered-markdown p { margin-bottom: 10px; color: var(--text-secondary); }
2474
+ .rendered-markdown code {
2475
+ font-family: var(--font-mono);
2476
+ font-size: 12px;
2477
+ background: var(--bg-raised);
2478
+ border-radius: 3px;
2479
+ padding: 1px 5px;
2480
+ }
2481
+ .rendered-markdown pre {
2482
+ background: var(--bg-raised);
2483
+ border: 1px solid var(--border);
2484
+ border-radius: var(--r-md);
2485
+ padding: 14px;
2486
+ overflow-x: auto;
2487
+ margin-bottom: 12px;
2488
+ }
2489
+ .rendered-markdown pre code { background: none; padding: 0; }
2490
+ .rendered-markdown a { color: var(--green); text-decoration: none; }
2491
+ .rendered-markdown a:hover { text-decoration: underline; }
2492
+ .rendered-markdown ul, .rendered-markdown ol { padding-left: 20px; margin-bottom: 10px; color: var(--text-secondary); }
2493
+ .rendered-markdown blockquote {
2494
+ border-left: 3px solid var(--green);
2495
+ padding-left: 14px;
2496
+ color: var(--text-muted);
2497
+ margin-bottom: 10px;
2498
+ }
2499
+ .rendered-markdown .md-table {
2500
+ border-collapse: collapse;
2501
+ width: 100%;
2502
+ margin-bottom: 14px;
2503
+ font-size: 13px;
2504
+ table-layout: auto;
2505
+ }
2506
+ .rendered-markdown .md-table th,
2507
+ .rendered-markdown .md-table td {
2508
+ border: 1px solid var(--border);
2509
+ padding: 7px 14px;
2510
+ text-align: left;
2511
+ vertical-align: top;
2512
+ word-break: break-word;
2513
+ }
2514
+ .rendered-markdown .md-table th {
2515
+ background: var(--bg-elevated);
2516
+ font-weight: 600;
2517
+ color: var(--text);
2518
+ white-space: nowrap;
2519
+ }
2520
+ .rendered-markdown .md-table td {
2521
+ color: var(--text-secondary);
2522
+ line-height: 1.5;
2523
+ }
2524
+ .rendered-markdown .md-table tr:hover td {
2525
+ background: var(--bg-hover);
2526
+ }
2527
+
2528
+ /* Output panel */
2529
+ .output-panel {
2530
+ border-top: 1px solid var(--border);
2531
+ background: var(--bg-raised);
2532
+ font-size: 13px;
2533
+ font-family: var(--font-mono);
2534
+ overflow-x: auto;
2535
+ max-height: 480px;
2536
+ overflow-y: auto;
2537
+ padding-top: 10px;
2538
+ padding-bottom: 10px;
2539
+ }
2540
+
2541
+ .output-meta {
2542
+ padding: 10px 16px 6px;
2543
+ color: var(--text-secondary);
2544
+ font-size: 11px;
2545
+ font-family: var(--font-mono);
2546
+ border-bottom: 1px solid var(--border);
2547
+ }
2548
+
2549
+ /* Simplified output body — no header, no collapse */
2550
+ .output-body {
2551
+ padding: 4px 16px;
2552
+ font-size: 13px;
2553
+ font-family: var(--font-mono);
2554
+ }
2555
+ .output-body + .output-body {
2556
+ border-top: none;
2557
+ }
2558
+ .output-body.output-error { color: var(--red); }
2559
+ .output-body.output-result { color: var(--green); }
2560
+
2561
+ /* ── Inline input widget (Jupyter-style) ─────────────────── */
2562
+ .inline-input-widget {
2563
+ display: flex;
2564
+ align-items: center;
2565
+ gap: 8px;
2566
+ padding: 8px 16px;
2567
+ flex-wrap: wrap;
2568
+ }
2569
+ .inline-input-label {
2570
+ color: var(--text-secondary);
2571
+ font-family: var(--font-mono);
2572
+ font-size: 13px;
2573
+ white-space: pre;
2574
+ }
2575
+ .inline-input-field {
2576
+ flex: 1;
2577
+ min-width: 120px;
2578
+ max-width: 360px;
2579
+ background: var(--bg-elevated);
2580
+ border: 1px solid var(--accent);
2581
+ border-radius: var(--r-sm);
2582
+ color: var(--text-primary);
2583
+ font-family: var(--font-mono);
2584
+ font-size: 13px;
2585
+ padding: 4px 8px;
2586
+ outline: none;
2587
+ caret-color: var(--accent);
2588
+ }
2589
+ .inline-input-field:focus {
2590
+ border-color: var(--accent);
2591
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 20%, transparent);
2592
+ }
2593
+ .inline-input-submit {
2594
+ background: var(--accent);
2595
+ color: #000;
2596
+ border: none;
2597
+ border-radius: var(--r-sm);
2598
+ font-size: 12px;
2599
+ font-weight: 600;
2600
+ padding: 4px 12px;
2601
+ cursor: pointer;
2602
+ transition: opacity var(--t-fast);
2603
+ }
2604
+ .inline-input-submit:hover { opacity: 0.85; }
2605
+ .inline-input-echo {
2606
+ color: var(--text-secondary);
2607
+ font-family: var(--font-mono);
2608
+ font-size: 13px;
2609
+ white-space: pre-wrap;
2610
+ }
2611
+
2612
+ .output-line { line-height: 1.6; color: var(--text-secondary); white-space: pre-wrap; word-break: break-all; }
2613
+ .output-line.stdout { color: var(--text-secondary); }
2614
+ .output-line.stderr, .output-error { color: var(--red); }
2615
+ .output-line.result { color: var(--green); }
2616
+
2617
+ .output-table {
2618
+ border-collapse: collapse;
2619
+ width: 100%;
2620
+ font-size: 12px;
2621
+ }
2622
+
2623
+ .output-table th {
2624
+ background: var(--bg-elevated);
2625
+ color: var(--text-secondary);
2626
+ font-weight: 600;
2627
+ padding: 6px 10px;
2628
+ text-align: left;
2629
+ border-bottom: 1px solid var(--border);
2630
+ white-space: nowrap;
2631
+ }
2632
+
2633
+ .output-table td {
2634
+ color: var(--text);
2635
+ padding: 5px 10px;
2636
+ border-bottom: 1px solid var(--border);
2637
+ }
2638
+
2639
+ .output-table tr:last-child td { border-bottom: none; }
2640
+ .output-table tr:hover td { background: var(--bg-hover); }
2641
+
2642
+ .output-image img {
2643
+ max-width: 100%;
2644
+ border-radius: var(--r-md);
2645
+ }
2646
+
2647
+
2648
+ .output-json {
2649
+ font-family: var(--font-mono);
2650
+ font-size: 12px;
2651
+ color: var(--text-secondary);
2652
+ white-space: pre-wrap;
2653
+ }
2654
+
2655
+ /* Insert row — always occupies space (no layout shift / flicker) */
2656
+ .insert-row {
2657
+ display: flex;
2658
+ align-items: center;
2659
+ justify-content: center;
2660
+ gap: 8px;
2661
+ height: 28px; /* fixed height so cells never jump */
2662
+ padding: 0 8px;
2663
+ opacity: 0;
2664
+ pointer-events: none;
2665
+ transition: opacity var(--t-fast);
2666
+ }
2667
+
2668
+ /* Show insert buttons on hover without changing layout */
2669
+ .notebook-cell:hover .insert-row,
2670
+ .notebook-cell:focus-within .insert-row {
2671
+ opacity: 1;
2672
+ pointer-events: all;
2673
+ }
2674
+
2675
+ .insert-btn {
2676
+ background: none;
2677
+ border: 1px dashed var(--border);
2678
+ color: var(--text-muted);
2679
+ font-size: 11px;
2680
+ font-weight: 500;
2681
+ padding: 3px 10px;
2682
+ border-radius: var(--r-full);
2683
+ cursor: pointer;
2684
+ transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
2685
+ font-family: inherit;
2686
+ }
2687
+
2688
+ .insert-btn:hover {
2689
+ border-color: var(--green);
2690
+ color: var(--green);
2691
+ background: var(--green-soft);
2692
+ }
2693
+
2694
+ /* Per-cell lang toggle (legacy, kept for compat) */
2695
+ .lang-toggle {
2696
+ font-family: var(--font-mono);
2697
+ font-size: 10px;
2698
+ font-weight: 700;
2699
+ padding: 2px 7px;
2700
+ border-radius: var(--r-sm);
2701
+ }
2702
+
2703
+ /* Global notebook-level language toggle */
2704
+ .nb-lang-toggle {
2705
+ display: inline-flex;
2706
+ align-items: center;
2707
+ gap: 5px;
2708
+ font-family: var(--font-mono);
2709
+ font-size: 11px;
2710
+ font-weight: 600;
2711
+ padding: 3px 10px 3px 8px;
2712
+ border-radius: var(--r-full);
2713
+ border: 1px solid var(--border);
2714
+ background: var(--bg-raised);
2715
+ color: var(--text-secondary);
2716
+ cursor: pointer;
2717
+ transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
2718
+ white-space: nowrap;
2719
+ flex-shrink: 0;
2720
+ }
2721
+ .nb-lang-toggle::before {
2722
+ content: "";
2723
+ width: 7px;
2724
+ height: 7px;
2725
+ border-radius: 50%;
2726
+ background: var(--blue);
2727
+ flex-shrink: 0;
2728
+ }
2729
+ .nb-lang-toggle:hover {
2730
+ border-color: var(--border-strong);
2731
+ color: var(--text);
2732
+ background: var(--bg-elevated);
2733
+ }
2734
+ .nb-lang-toggle[data-lang="js"]::before { background: var(--yellow); }
2735
+ .nb-lang-toggle[data-lang="ts"]::before { background: var(--blue); }
2736
+
2737
+ /* ═══════════════════════════════════════════════════════════
2738
+ PACKAGE MANAGER PAGE
2739
+ ═══════════════════════════════════════════════════════════ */
2740
+ #page-packages {
2741
+ overflow: hidden;
2742
+ flex-direction: column;
2743
+ }
2744
+
2745
+ /* Search row */
2746
+ .pkg-search-row {
2747
+ display: flex;
2748
+ align-items: center;
2749
+ gap: 10px;
2750
+ padding: 14px 24px;
2751
+ border-bottom: 1px solid var(--border);
2752
+ background: var(--bg-surface);
2753
+ flex-shrink: 0;
2754
+ }
2755
+
2756
+ .pkg-search-bar {
2757
+ display: flex;
2758
+ align-items: center;
2759
+ gap: 9px;
2760
+ flex: 1;
2761
+ background: var(--bg-raised);
2762
+ border: 1px solid var(--border);
2763
+ border-radius: var(--r-md);
2764
+ padding: 8px 14px;
2765
+ transition: border-color var(--t-fast);
2766
+ }
2767
+
2768
+ .pkg-search-bar:focus-within { border-color: var(--border-accent); }
2769
+ .pkg-search-bar svg { color: var(--text-muted); flex-shrink: 0; }
2770
+
2771
+ .pkg-search-bar input {
2772
+ background: none;
2773
+ border: none;
2774
+ outline: none;
2775
+ color: var(--text);
2776
+ font-size: 13px;
2777
+ font-family: inherit;
2778
+ width: 100%;
2779
+ }
2780
+
2781
+ .pkg-search-bar input::placeholder { color: var(--text-muted); }
2782
+
2783
+ .btn-pkg-install {
2784
+ display: inline-flex;
2785
+ align-items: center;
2786
+ gap: 5px;
2787
+ padding: 8px 16px;
2788
+ border-radius: var(--r-md);
2789
+ background: var(--green);
2790
+ color: #000;
2791
+ font-size: 13px;
2792
+ font-weight: 700;
2793
+ border: none;
2794
+ cursor: pointer;
2795
+ transition: opacity var(--t-fast);
2796
+ white-space: nowrap;
2797
+ flex-shrink: 0;
2798
+ }
2799
+
2800
+ .btn-pkg-install:hover { opacity: 0.9; }
2801
+
2802
+ /* CDN divider + input removed — hidden via display:none if still in DOM */
2803
+ .pkg-cdn-divider, .pkg-cdn-input { display: none; }
2804
+
2805
+ /* Stats row */
2806
+ .pkg-stats-row {
2807
+ display: flex;
2808
+ align-items: center;
2809
+ gap: 24px;
2810
+ padding: 10px 24px;
2811
+ background: var(--bg-raised);
2812
+ border-bottom: 1px solid var(--border);
2813
+ flex-shrink: 0;
2814
+ }
2815
+
2816
+ .pkg-stat {
2817
+ display: flex;
2818
+ align-items: baseline;
2819
+ gap: 6px;
2820
+ }
2821
+
2822
+ .pkg-stat-value {
2823
+ font-size: 18px;
2824
+ font-weight: 800;
2825
+ color: var(--text);
2826
+ font-variant-numeric: tabular-nums;
2827
+ letter-spacing: -0.02em;
2828
+ }
2829
+
2830
+ .pkg-stat-label {
2831
+ font-size: 11px;
2832
+ color: var(--text-muted);
2833
+ }
2834
+
2835
+ /* Package layout */
2836
+ .pkg-layout {
2837
+ display: flex;
2838
+ flex: 1;
2839
+ overflow: hidden;
2840
+ }
2841
+
2842
+ /* Categories sidebar */
2843
+ .pkg-categories {
2844
+ width: 180px;
2845
+ flex-shrink: 0;
2846
+ border-right: 1px solid var(--border);
2847
+ background: var(--bg-surface);
2848
+ display: flex;
2849
+ flex-direction: column;
2850
+ gap: 1px;
2851
+ padding: 10px 8px;
2852
+ overflow-y: auto;
2853
+ }
2854
+
2855
+ .pkg-cat-item {
2856
+ display: flex;
2857
+ align-items: center;
2858
+ justify-content: space-between;
2859
+ gap: 8px;
2860
+ padding: 8px 10px;
2861
+ border-radius: var(--r-md);
2862
+ background: transparent;
2863
+ border: none;
2864
+ color: var(--text-secondary);
2865
+ font-size: 13px;
2866
+ font-weight: 500;
2867
+ cursor: pointer;
2868
+ transition: background var(--t-fast), color var(--t-fast);
2869
+ text-align: left;
2870
+ font-family: inherit;
2871
+ }
2872
+
2873
+ .pkg-cat-item:hover {
2874
+ background: var(--bg-hover);
2875
+ color: var(--text);
2876
+ }
2877
+
2878
+ .pkg-cat-item.is-active {
2879
+ background: var(--bg-active);
2880
+ color: var(--green);
2881
+ }
2882
+
2883
+ .pkg-cat-badge {
2884
+ background: var(--bg-elevated);
2885
+ color: var(--text-muted);
2886
+ font-size: 10px;
2887
+ font-weight: 700;
2888
+ padding: 1px 6px;
2889
+ border-radius: var(--r-full);
2890
+ min-width: 20px;
2891
+ text-align: center;
2892
+ transition: background var(--t-fast), color var(--t-fast);
2893
+ }
2894
+
2895
+ .pkg-cat-item.is-active .pkg-cat-badge {
2896
+ background: var(--green-soft);
2897
+ color: var(--green);
2898
+ }
2899
+
2900
+ /* Package main area — within sidebar layout */
2901
+ .pkg-main {
2902
+ flex: 1;
2903
+ overflow-y: auto;
2904
+ display: flex;
2905
+ flex-direction: column;
2906
+ }
2907
+
2908
+ /* Full-width package area — no sidebar */
2909
+ .pkg-main-solo {
2910
+ flex: 1;
2911
+ overflow-y: auto;
2912
+ display: flex;
2913
+ flex-direction: column;
2914
+ }
2915
+
2916
+ .pkg-list-header {
2917
+ display: flex;
2918
+ align-items: center;
2919
+ justify-content: space-between;
2920
+ padding: 14px 20px;
2921
+ border-bottom: 1px solid var(--border);
2922
+ flex-shrink: 0;
2923
+ }
2924
+
2925
+ .pkg-list-title {
2926
+ font-size: 15px;
2927
+ font-weight: 700;
2928
+ color: var(--text);
2929
+ letter-spacing: -0.01em;
2930
+ }
2931
+
2932
+ .pkg-sort {
2933
+ font-size: 12px;
2934
+ color: var(--text-muted);
2935
+ display: flex;
2936
+ align-items: center;
2937
+ gap: 4px;
2938
+ }
2939
+
2940
+ .pkg-sort-btn {
2941
+ background: none;
2942
+ border: none;
2943
+ color: var(--text-secondary);
2944
+ font-size: 12px;
2945
+ cursor: pointer;
2946
+ padding: 2px 6px;
2947
+ border-radius: var(--r-sm);
2948
+ font-family: inherit;
2949
+ transition: background var(--t-fast);
2950
+ }
2951
+
2952
+ .pkg-sort-btn:hover { background: var(--bg-raised); }
2953
+
2954
+ /* Package list */
2955
+ .pkg-list {
2956
+ display: flex;
2957
+ flex-direction: column;
2958
+ gap: 0;
2959
+ padding: 8px 16px;
2960
+ }
2961
+
2962
+ .pkg-loading {
2963
+ padding: 40px;
2964
+ text-align: center;
2965
+ color: var(--text-muted);
2966
+ font-size: 13px;
2967
+ }
2968
+
2969
+ /* Package item */
2970
+ .pkg-item {
2971
+ display: flex;
2972
+ align-items: center;
2973
+ gap: 14px;
2974
+ padding: 12px;
2975
+ border-radius: var(--r-md);
2976
+ border: 1px solid transparent;
2977
+ cursor: pointer;
2978
+ transition: background var(--t-fast), border-color var(--t-fast);
2979
+ position: relative;
2980
+ }
2981
+
2982
+ .pkg-item:hover {
2983
+ background: var(--bg-raised);
2984
+ border-color: var(--border);
2985
+ }
2986
+
2987
+ .pkg-item-accent {
2988
+ width: 3px;
2989
+ height: 36px;
2990
+ border-radius: var(--r-full);
2991
+ flex-shrink: 0;
2992
+ }
2993
+
2994
+ .pkg-item-accent.ai { background: var(--pink); }
2995
+ .pkg-item-accent.utils { background: var(--blue); }
2996
+ .pkg-item-accent.types { background: var(--purple); }
2997
+ .pkg-item-accent.data { background: var(--orange); }
2998
+ .pkg-item-accent.default { background: var(--green); }
2999
+
3000
+ .pkg-item-info {
3001
+ flex: 1;
3002
+ min-width: 0;
3003
+ }
3004
+
3005
+ .pkg-item-name {
3006
+ font-size: 13px;
3007
+ font-weight: 600;
3008
+ color: var(--text);
3009
+ white-space: nowrap;
3010
+ overflow: hidden;
3011
+ text-overflow: ellipsis;
3012
+ }
3013
+
3014
+ .pkg-item-version {
3015
+ font-size: 10px;
3016
+ font-family: var(--font-mono);
3017
+ color: var(--text-muted);
3018
+ margin-left: 6px;
3019
+ }
3020
+
3021
+ .pkg-item-desc {
3022
+ font-size: 11px;
3023
+ color: var(--text-muted);
3024
+ white-space: nowrap;
3025
+ overflow: hidden;
3026
+ text-overflow: ellipsis;
3027
+ margin-top: 2px;
3028
+ }
3029
+
3030
+ .pkg-item-actions {
3031
+ display: flex;
3032
+ align-items: center;
3033
+ gap: 6px;
3034
+ flex-shrink: 0;
3035
+ }
3036
+
3037
+ .btn-pkg-action {
3038
+ padding: 4px 10px;
3039
+ border-radius: var(--r-sm);
3040
+ font-size: 11px;
3041
+ font-weight: 600;
3042
+ cursor: pointer;
3043
+ transition: opacity var(--t-fast), background var(--t-fast);
3044
+ font-family: inherit;
3045
+ white-space: nowrap;
3046
+ }
3047
+
3048
+ .btn-pkg-action.install {
3049
+ background: var(--green-soft);
3050
+ border: 1px solid rgba(0,200,150,0.2);
3051
+ color: var(--green);
3052
+ }
3053
+
3054
+ .btn-pkg-action.install:hover { background: rgba(0,200,150,0.2); }
3055
+
3056
+ .btn-pkg-action.uninstall {
3057
+ background: var(--red-soft);
3058
+ border: 1px solid rgba(247,95,95,0.2);
3059
+ color: var(--red);
3060
+ }
3061
+
3062
+ .btn-pkg-action.uninstall:hover { background: rgba(247,95,95,0.2); }
3063
+
3064
+ /* Remove-in-progress state */
3065
+ @keyframes pkg-removing {
3066
+ 0% { opacity: 1; }
3067
+ 50% { opacity: 0.4; }
3068
+ 100% { opacity: 1; }
3069
+ }
3070
+ .btn-pkg-action.is-removing {
3071
+ animation: pkg-removing 900ms ease infinite;
3072
+ pointer-events: none;
3073
+ cursor: not-allowed;
3074
+ }
3075
+
3076
+ .btn-pkg-action.docs {
3077
+ background: var(--bg-elevated);
3078
+ border: 1px solid var(--border);
3079
+ color: var(--text-secondary);
3080
+ }
3081
+
3082
+ .btn-pkg-action.docs:hover {
3083
+ background: var(--bg-hover);
3084
+ color: var(--text);
3085
+ }
3086
+
3087
+ /* Suggestions section */
3088
+ .pkg-suggestions-section {
3089
+ padding: 20px 16px;
3090
+ border-top: 1px solid var(--border);
3091
+ }
3092
+
3093
+ .pkg-suggestions-section .pkg-list-title {
3094
+ margin-bottom: 14px;
3095
+ }
3096
+
3097
+ .pkg-suggestions-grid {
3098
+ display: grid;
3099
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
3100
+ gap: 10px;
3101
+ max-height: 300px;
3102
+ overflow-y: scroll;
3103
+ }
3104
+
3105
+ /* Suggestion card */
3106
+ .pkg-suggestion-card {
3107
+ background: var(--bg-surface);
3108
+ border: 1px solid var(--border);
3109
+ border-radius: var(--r-lg);
3110
+ padding: 14px;
3111
+ cursor: pointer;
3112
+ transition: border-color var(--t-fast), box-shadow var(--t-fast);
3113
+ display: flex;
3114
+ flex-direction: column;
3115
+ gap: 8px;
3116
+ }
3117
+
3118
+ .pkg-suggestion-card:hover {
3119
+ border-color: var(--border-strong);
3120
+ box-shadow: var(--shadow-md);
3121
+ }
3122
+
3123
+ .pkg-suggestion-name {
3124
+ font-size: 13px;
3125
+ font-weight: 700;
3126
+ color: var(--text);
3127
+ font-family: var(--font-mono);
3128
+ }
3129
+
3130
+ .pkg-suggestion-desc {
3131
+ font-size: 11px;
3132
+ color: var(--text-muted);
3133
+ line-height: 1.5;
3134
+ }
3135
+
3136
+ .pkg-suggestion-add {
3137
+ display: inline-flex;
3138
+ align-items: center;
3139
+ gap: 4px;
3140
+ font-size: 11px;
3141
+ font-weight: 600;
3142
+ color: var(--green);
3143
+ background: none;
3144
+ border: none;
3145
+ cursor: pointer;
3146
+ padding: 0;
3147
+ font-family: inherit;
3148
+ margin-top: auto;
3149
+ transition: opacity var(--t-fast);
3150
+ }
3151
+
3152
+ .pkg-suggestion-add:hover { opacity: 0.8; }
3153
+
3154
+ /* ═══════════════════════════════════════════════════════════
3155
+ OVERLAYS & BOTTOM SHEETS
3156
+ ═══════════════════════════════════════════════════════════ */
3157
+
3158
+ /* Scrim */
3159
+ .bottom-sheet-scrim {
3160
+ position: fixed;
3161
+ inset: 0;
3162
+ background: rgba(0, 0, 0, 0.5);
3163
+ z-index: 100;
3164
+ cursor: pointer;
3165
+ backdrop-filter: blur(2px);
3166
+ /* hidden by default; shown when sheet opens */
3167
+ opacity: 0;
3168
+ pointer-events: none;
3169
+ transition: opacity var(--t-slow) ease;
3170
+ }
3171
+ .bottom-sheet-scrim.is-open {
3172
+ opacity: 1;
3173
+ pointer-events: all;
3174
+ }
3175
+
3176
+ /* Bottom sheet — max 1200px, centered in viewport */
3177
+ .bottom-sheet {
3178
+ position: fixed;
3179
+ bottom: 0;
3180
+ left: 50%;
3181
+ transform: translateX(-50%) translateY(100%);
3182
+ width: min(1200px, 100vw);
3183
+ background: var(--bg-surface);
3184
+ border-top: 1px solid var(--border);
3185
+ border-radius: var(--r-xl) var(--r-xl) 0 0;
3186
+ z-index: 101;
3187
+ display: flex;
3188
+ flex-direction: column;
3189
+ box-shadow: var(--shadow-lg);
3190
+ transition: transform 320ms cubic-bezier(0.32, 0.72, 0, 1);
3191
+ }
3192
+ .bottom-sheet.is-open {
3193
+ transform: translateX(-50%) translateY(0);
3194
+ }
3195
+
3196
+ /* Keep keyframe for fallback (no-op now, transition does the work) */
3197
+ @keyframes slide-up {
3198
+ from { transform: translateY(100%); }
3199
+ to { transform: translateY(0); }
3200
+ }
3201
+
3202
+ .bottom-sheet-handle {
3203
+ width: 36px;
3204
+ height: 4px;
3205
+ background: var(--border-strong);
3206
+ border-radius: var(--r-full);
3207
+ margin: 10px auto 0;
3208
+ flex-shrink: 0;
3209
+ }
3210
+
3211
+ .env-sheet { height: 380px; }
3212
+ .ai-sheet { height: 500px; }
3213
+ .terminal-sheet { height: 460px; }
3214
+
3215
+ /* ── Terminal header ── */
3216
+ .terminal-header {
3217
+ display: flex;
3218
+ align-items: center;
3219
+ justify-content: space-between;
3220
+ padding: 10px 16px;
3221
+ border-bottom: 1px solid var(--border);
3222
+ flex-shrink: 0;
3223
+ }
3224
+ .terminal-header-left {
3225
+ display: flex;
3226
+ align-items: center;
3227
+ gap: 8px;
3228
+ color: var(--text-muted);
3229
+ }
3230
+ .terminal-header-right {
3231
+ display: flex;
3232
+ align-items: center;
3233
+ gap: 6px;
3234
+ }
3235
+ .terminal-title {
3236
+ font-size: 13px;
3237
+ font-weight: 700;
3238
+ color: var(--text);
3239
+ }
3240
+ .terminal-cwd-label {
3241
+ font-size: 11px;
3242
+ color: var(--text-muted);
3243
+ font-family: var(--font-mono);
3244
+ max-width: 300px;
3245
+ overflow: hidden;
3246
+ text-overflow: ellipsis;
3247
+ white-space: nowrap;
3248
+ }
3249
+
3250
+ /* ── Terminal history (scrollable output area) ── */
3251
+ .terminal-history {
3252
+ flex: 1;
3253
+ overflow-y: auto;
3254
+ padding: 12px 16px;
3255
+ font-family: var(--font-mono);
3256
+ font-size: 12.5px;
3257
+ background: var(--bg-raised);
3258
+ }
3259
+ .terminal-welcome {
3260
+ color: var(--text-muted);
3261
+ font-size: 12px;
3262
+ padding: 8px 0;
3263
+ }
3264
+ .terminal-entry { margin-bottom: 14px; }
3265
+ .terminal-entry:last-child { margin-bottom: 2px; }
3266
+ .terminal-cmd-line {
3267
+ display: flex;
3268
+ align-items: flex-start;
3269
+ gap: 7px;
3270
+ margin-bottom: 4px;
3271
+ }
3272
+ .terminal-cmd-prompt {
3273
+ color: var(--green);
3274
+ font-weight: 700;
3275
+ user-select: none;
3276
+ flex-shrink: 0;
3277
+ }
3278
+ .terminal-cmd-text { color: var(--text); word-break: break-all; }
3279
+ .terminal-output-text {
3280
+ white-space: pre-wrap;
3281
+ word-break: break-all;
3282
+ line-height: 1.55;
3283
+ color: var(--text-secondary);
3284
+ padding-left: 16px;
3285
+ margin: 0;
3286
+ }
3287
+ .terminal-output-text.is-error { color: var(--red); }
3288
+ .terminal-output-text.is-running { color: var(--text-muted); font-style: italic; }
3289
+
3290
+ /* ── Terminal input row (fixed bottom bar) ── */
3291
+ .terminal-input-row {
3292
+ display: flex;
3293
+ align-items: center;
3294
+ gap: 8px;
3295
+ padding: 9px 14px;
3296
+ border-top: 1px solid var(--border);
3297
+ background: var(--bg-surface);
3298
+ flex-shrink: 0;
3299
+ }
3300
+ .terminal-prompt-symbol {
3301
+ color: var(--green);
3302
+ font-family: var(--font-mono);
3303
+ font-size: 14px;
3304
+ font-weight: 700;
3305
+ user-select: none;
3306
+ flex-shrink: 0;
3307
+ }
3308
+ .terminal-input {
3309
+ flex: 1;
3310
+ background: none;
3311
+ border: none;
3312
+ outline: none;
3313
+ color: var(--text);
3314
+ font-family: var(--font-mono);
3315
+ font-size: 13px;
3316
+ caret-color: var(--green);
3317
+ min-width: 0;
3318
+ }
3319
+ .terminal-input::placeholder { color: var(--text-muted); }
3320
+ .terminal-run-btn {
3321
+ padding: 4px 12px;
3322
+ font-size: 12px;
3323
+ font-family: var(--font-mono);
3324
+ background: var(--green-soft);
3325
+ color: var(--green);
3326
+ border: 1px solid var(--green);
3327
+ border-radius: var(--r-sm);
3328
+ cursor: pointer;
3329
+ flex-shrink: 0;
3330
+ transition: background var(--t-fast), color var(--t-fast);
3331
+ }
3332
+ .terminal-run-btn:hover { background: var(--green); color: var(--bg-base); }
3333
+
3334
+ /* ── Terminal open button (in page headers) ── */
3335
+ .btn-terminal {
3336
+ display: inline-flex;
3337
+ align-items: center;
3338
+ gap: 5px;
3339
+ padding: 5px 10px;
3340
+ font-size: 12px;
3341
+ font-weight: 500;
3342
+ font-family: var(--font-sans);
3343
+ border: 1px solid var(--border);
3344
+ border-radius: var(--r-sm);
3345
+ background: var(--bg-elevated);
3346
+ color: var(--text-secondary);
3347
+ cursor: pointer;
3348
+ transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
3349
+ white-space: nowrap;
3350
+ }
3351
+ .btn-terminal:hover {
3352
+ border-color: var(--border-accent);
3353
+ color: var(--text);
3354
+ background: var(--bg-raised);
3355
+ }
3356
+ .btn-terminal.is-active {
3357
+ border-color: var(--green);
3358
+ color: var(--green);
3359
+ background: var(--green-soft);
3360
+ }
3361
+
3362
+ /* ── File editor (Monaco for .js/.ts files) ── */
3363
+ .file-editor-wrap {
3364
+ display: flex;
3365
+ flex-direction: column;
3366
+ height: 100%;
3367
+ overflow: hidden;
3368
+ }
3369
+ .file-editor-toolbar {
3370
+ display: flex;
3371
+ align-items: center;
3372
+ justify-content: space-between;
3373
+ padding: 8px 14px;
3374
+ border-bottom: 1px solid var(--border);
3375
+ background: var(--bg-surface);
3376
+ flex-shrink: 0;
3377
+ gap: 12px;
3378
+ }
3379
+ .file-editor-name {
3380
+ font-size: 13px;
3381
+ font-weight: 600;
3382
+ color: var(--text);
3383
+ font-family: var(--font-mono);
3384
+ overflow: hidden;
3385
+ text-overflow: ellipsis;
3386
+ white-space: nowrap;
3387
+ }
3388
+ .file-editor-actions {
3389
+ display: flex;
3390
+ align-items: center;
3391
+ gap: 10px;
3392
+ flex-shrink: 0;
3393
+ }
3394
+ .file-editor-status {
3395
+ font-size: 11px;
3396
+ color: var(--text-muted);
3397
+ font-family: var(--font-mono);
3398
+ }
3399
+ .file-editor-host {
3400
+ flex: 1;
3401
+ overflow: hidden;
3402
+ min-height: 0;
3403
+ }
3404
+
3405
+ /* Run button inside file editor toolbar */
3406
+ .btn-file-run {
3407
+ display: inline-flex;
3408
+ align-items: center;
3409
+ gap: 5px;
3410
+ padding: 4px 10px;
3411
+ border-radius: var(--r-sm);
3412
+ border: 1px solid var(--green);
3413
+ background: transparent;
3414
+ color: var(--green);
3415
+ font-size: 11px;
3416
+ font-weight: 600;
3417
+ cursor: pointer;
3418
+ transition: background var(--t-fast), color var(--t-fast);
3419
+ }
3420
+ .btn-file-run:hover {
3421
+ background: var(--green);
3422
+ color: #000;
3423
+ }
3424
+
3425
+ .env-header {
3426
+ display: flex;
3427
+ align-items: flex-start;
3428
+ justify-content: space-between;
3429
+ padding: 14px 20px 12px;
3430
+ border-bottom: 1px solid var(--border);
3431
+ flex-shrink: 0;
3432
+ }
3433
+
3434
+ .env-title {
3435
+ font-size: 15px;
3436
+ font-weight: 700;
3437
+ color: var(--text);
3438
+ }
3439
+
3440
+ .sheet-subtitle {
3441
+ font-size: 11px;
3442
+ color: var(--text-muted);
3443
+ margin-top: 2px;
3444
+ }
3445
+
3446
+ .bottom-sheet-actions {
3447
+ display: flex;
3448
+ align-items: center;
3449
+ gap: 10px;
3450
+ }
3451
+
3452
+ /* Confirm modal */
3453
+ .modal-scrim {
3454
+ position: fixed;
3455
+ inset: 0;
3456
+ background: rgba(0,0,0,0.55);
3457
+ z-index: 140;
3458
+ opacity: 0;
3459
+ pointer-events: none;
3460
+ transition: opacity var(--t-slow);
3461
+ }
3462
+ .modal-scrim.is-open { opacity: 1; pointer-events: all; }
3463
+
3464
+ .confirm-modal {
3465
+ position: fixed;
3466
+ inset: 0;
3467
+ display: flex;
3468
+ align-items: center;
3469
+ justify-content: center;
3470
+ z-index: 141;
3471
+ opacity: 0;
3472
+ pointer-events: none;
3473
+ transition: opacity var(--t-slow);
3474
+ }
3475
+ .confirm-modal.is-open { opacity: 1; pointer-events: all; }
3476
+
3477
+ .confirm-card {
3478
+ background: var(--bg-surface);
3479
+ border: 1px solid var(--border);
3480
+ border-radius: var(--r-lg);
3481
+ padding: 22px 22px 16px;
3482
+ width: min(440px, 92vw);
3483
+ box-shadow: var(--shadow-lg);
3484
+ }
3485
+
3486
+ .confirm-card h3 {
3487
+ margin: 0 0 8px;
3488
+ font-size: 17px;
3489
+ color: var(--text);
3490
+ }
3491
+
3492
+ .confirm-card p {
3493
+ margin: 0 0 18px;
3494
+ color: var(--text-secondary);
3495
+ font-size: 13px;
3496
+ line-height: 1.5;
3497
+ }
3498
+
3499
+ .confirm-actions {
3500
+ display: flex;
3501
+ justify-content: flex-end;
3502
+ gap: 10px;
3503
+ }
3504
+
3505
+ /* AI model selector in sheet header */
3506
+ .ai-model-wrap {
3507
+ display: flex;
3508
+ flex-direction: column;
3509
+ gap: 2px;
3510
+ }
3511
+
3512
+ .ai-model-label {
3513
+ font-size: 9px;
3514
+ font-weight: 700;
3515
+ text-transform: uppercase;
3516
+ letter-spacing: 0.07em;
3517
+ color: var(--text-muted);
3518
+ padding-left: 2px;
3519
+ }
3520
+
3521
+ .ai-model-select {
3522
+ background: var(--bg-raised);
3523
+ border: 1.5px solid var(--border);
3524
+ border-radius: var(--r-md);
3525
+ color: var(--text);
3526
+ font-size: 12px;
3527
+ font-family: var(--font-mono);
3528
+ padding: 5px 10px 5px 8px;
3529
+ cursor: pointer;
3530
+ outline: none;
3531
+ transition: border-color var(--t-fast);
3532
+ min-width: 200px;
3533
+ max-width: 300px;
3534
+ }
3535
+
3536
+ .ai-model-select:focus { border-color: var(--green); }
3537
+ .ai-model-select:disabled { opacity: 0.5; cursor: not-allowed; }
3538
+
3539
+ /* Env list */
3540
+ .env-list {
3541
+ flex: 1;
3542
+ overflow-y: auto;
3543
+ padding: 12px 20px;
3544
+ display: flex;
3545
+ flex-direction: column;
3546
+ gap: 8px;
3547
+ }
3548
+
3549
+ .env-row {
3550
+ display: grid;
3551
+ grid-template-columns: 1fr 2fr 28px;
3552
+ gap: 8px;
3553
+ align-items: center;
3554
+ }
3555
+
3556
+ .env-field-wrap {
3557
+ display: flex;
3558
+ flex-direction: column;
3559
+ gap: 3px;
3560
+ }
3561
+
3562
+ .env-field-label {
3563
+ font-size: 10px;
3564
+ font-weight: 600;
3565
+ text-transform: uppercase;
3566
+ letter-spacing: 0.06em;
3567
+ color: var(--text-muted);
3568
+ padding-left: 2px;
3569
+ }
3570
+
3571
+ .env-key-input, .env-val-input {
3572
+ width: 100%;
3573
+ background: var(--bg-raised);
3574
+ border: 1.5px solid var(--border);
3575
+ border-radius: var(--r-md);
3576
+ color: var(--text);
3577
+ font-size: 12.5px;
3578
+ font-family: var(--font-mono);
3579
+ padding: 7px 12px;
3580
+ outline: none;
3581
+ transition: border-color var(--t-fast), box-shadow var(--t-fast), background var(--t-fast);
3582
+ box-sizing: border-box;
3583
+ }
3584
+
3585
+ .env-key-input::placeholder, .env-val-input::placeholder {
3586
+ color: var(--text-muted);
3587
+ }
3588
+
3589
+ .env-key-input:hover, .env-val-input:hover {
3590
+ border-color: var(--border-strong);
3591
+ background: var(--bg-elevated);
3592
+ }
3593
+
3594
+ .env-key-input:focus, .env-val-input:focus {
3595
+ border-color: var(--green);
3596
+ background: var(--bg-raised);
3597
+ box-shadow: 0 0 0 3px var(--green-soft);
3598
+ }
3599
+
3600
+ .env-remove-btn {
3601
+ width: 28px;
3602
+ height: 28px;
3603
+ background: none;
3604
+ border: none;
3605
+ color: var(--text-muted);
3606
+ cursor: pointer;
3607
+ border-radius: var(--r-sm);
3608
+ display: flex;
3609
+ align-items: center;
3610
+ justify-content: center;
3611
+ transition: color var(--t-fast), background var(--t-fast);
3612
+ flex-shrink: 0;
3613
+ align-self: end;
3614
+ margin-bottom: 1px;
3615
+ }
3616
+
3617
+ .env-remove-btn:hover { color: var(--red); background: var(--red-soft); }
3618
+
3619
+ /* AI assistant sheet */
3620
+ .ai-missing-key {
3621
+ background: var(--orange-soft);
3622
+ border: 1px solid rgba(247,137,79,0.2);
3623
+ color: var(--orange);
3624
+ font-size: 12px;
3625
+ padding: 10px 20px;
3626
+ margin: 12px 20px 0;
3627
+ border-radius: var(--r-md);
3628
+ }
3629
+
3630
+ .ai-missing-key code {
3631
+ font-family: var(--font-mono);
3632
+ background: rgba(247,137,79,0.15);
3633
+ border-radius: 3px;
3634
+ padding: 1px 4px;
3635
+ }
3636
+
3637
+ .ai-chat-list {
3638
+ flex: 1;
3639
+ overflow-y: auto;
3640
+ padding: 12px 20px;
3641
+ display: flex;
3642
+ flex-direction: column;
3643
+ gap: 12px;
3644
+ }
3645
+
3646
+ .ai-message {
3647
+ display: flex;
3648
+ flex-direction: column;
3649
+ gap: 4px;
3650
+ }
3651
+
3652
+ .ai-message-role {
3653
+ font-size: 10px;
3654
+ font-weight: 700;
3655
+ text-transform: uppercase;
3656
+ letter-spacing: 0.08em;
3657
+ color: var(--text-muted);
3658
+ }
3659
+
3660
+ .ai-message-role.user { color: var(--blue); }
3661
+ .ai-message-role.assistant { color: var(--green); }
3662
+
3663
+ .ai-message-content {
3664
+ font-size: 13px;
3665
+ color: var(--text-secondary);
3666
+ line-height: 1.6;
3667
+ white-space: pre-wrap;
3668
+ }
3669
+
3670
+ .ai-chat-form {
3671
+ display: flex;
3672
+ gap: 10px;
3673
+ padding: 12px 20px;
3674
+ border-top: 1px solid var(--border);
3675
+ flex-shrink: 0;
3676
+ }
3677
+
3678
+ .ai-input {
3679
+ flex: 1;
3680
+ background: var(--bg-raised);
3681
+ border: 1.5px solid var(--border);
3682
+ border-radius: var(--r-md);
3683
+ color: var(--text);
3684
+ font-size: 13px;
3685
+ font-family: inherit;
3686
+ padding: 10px 12px;
3687
+ outline: none;
3688
+ resize: none;
3689
+ transition: border-color var(--t-fast), box-shadow var(--t-fast);
3690
+ line-height: 1.5;
3691
+ min-height: 42px;
3692
+ }
3693
+
3694
+ .ai-input:focus {
3695
+ border-color: var(--green);
3696
+ box-shadow: 0 0 0 3px var(--green-soft);
3697
+ }
3698
+ .ai-input::placeholder { color: var(--text-muted); }
3699
+
3700
+ /* Send hint below the form */
3701
+ .ai-send-hint {
3702
+ font-size: 10px;
3703
+ color: var(--text-muted);
3704
+ padding: 2px 0 6px;
3705
+ text-align: right;
3706
+ flex-shrink: 0;
3707
+ }
3708
+
3709
+ /* Package docs drawer */
3710
+ .pkg-docs-scrim {
3711
+ position: fixed;
3712
+ inset: 0;
3713
+ background: rgba(0,0,0,0.4);
3714
+ z-index: 98;
3715
+ border: none;
3716
+ cursor: pointer;
3717
+ opacity: 0;
3718
+ pointer-events: none;
3719
+ transition: opacity var(--t-normal);
3720
+ }
3721
+
3722
+ .pkg-docs-scrim.is-open {
3723
+ opacity: 1;
3724
+ pointer-events: auto;
3725
+ }
3726
+
3727
+ .pkg-docs-drawer {
3728
+ position: fixed;
3729
+ top: 0;
3730
+ right: 0;
3731
+ bottom: 0;
3732
+ width: 400px;
3733
+ background: var(--bg-surface);
3734
+ border-left: 1px solid var(--border);
3735
+ z-index: 99;
3736
+ display: flex;
3737
+ flex-direction: column;
3738
+ transform: translateX(100%);
3739
+ transition: transform var(--t-slow);
3740
+ box-shadow: var(--shadow-lg);
3741
+ }
3742
+
3743
+ .pkg-docs-drawer.is-open {
3744
+ transform: translateX(0);
3745
+ }
3746
+
3747
+ .pkg-docs-header {
3748
+ display: flex;
3749
+ align-items: flex-start;
3750
+ justify-content: space-between;
3751
+ padding: 18px 20px;
3752
+ border-bottom: 1px solid var(--border);
3753
+ flex-shrink: 0;
3754
+ }
3755
+
3756
+ .pkg-docs-label {
3757
+ font-size: 10px;
3758
+ font-weight: 700;
3759
+ text-transform: uppercase;
3760
+ letter-spacing: 0.08em;
3761
+ color: var(--text-muted);
3762
+ margin-bottom: 4px;
3763
+ }
3764
+
3765
+ .pkg-docs-title {
3766
+ font-size: 16px;
3767
+ font-weight: 700;
3768
+ color: var(--text);
3769
+ }
3770
+
3771
+ .pkg-docs-version {
3772
+ font-size: 11px;
3773
+ color: var(--text-muted);
3774
+ font-family: var(--font-mono);
3775
+ margin-top: 2px;
3776
+ }
3777
+
3778
+ .pkg-docs-status {
3779
+ padding: 24px 20px;
3780
+ color: var(--text-muted);
3781
+ font-size: 13px;
3782
+ }
3783
+
3784
+ .pkg-docs-content {
3785
+ flex: 1;
3786
+ overflow-y: auto;
3787
+ padding: 16px 20px;
3788
+ color: var(--text-secondary);
3789
+ line-height: 1.7;
3790
+ font-size: 13px;
3791
+ }
3792
+
3793
+ /* Official docs card — clickable link that opens in browser */
3794
+ .pkg-official-docs-card {
3795
+ display: flex;
3796
+ align-items: center;
3797
+ gap: 12px;
3798
+ padding: 12px 14px;
3799
+ margin-bottom: 16px;
3800
+ border-radius: 10px;
3801
+ border: 1px solid var(--border-strong);
3802
+ background: color-mix(in srgb, var(--accent) 7%, var(--bg-elevated));
3803
+ text-decoration: none;
3804
+ color: var(--text);
3805
+ transition: background 0.15s, border-color 0.15s, transform 0.1s;
3806
+ cursor: pointer;
3807
+ }
3808
+
3809
+ .pkg-official-docs-card:hover {
3810
+ background: color-mix(in srgb, var(--accent) 14%, var(--bg-elevated));
3811
+ border-color: var(--accent);
3812
+ transform: translateY(-1px);
3813
+ }
3814
+
3815
+ .pkg-official-docs-icon {
3816
+ flex-shrink: 0;
3817
+ width: 34px;
3818
+ height: 34px;
3819
+ border-radius: 8px;
3820
+ background: color-mix(in srgb, var(--accent) 18%, var(--bg-elevated));
3821
+ display: flex;
3822
+ align-items: center;
3823
+ justify-content: center;
3824
+ color: var(--accent);
3825
+ }
3826
+
3827
+ .pkg-official-docs-text {
3828
+ flex: 1;
3829
+ min-width: 0;
3830
+ }
3831
+
3832
+ .pkg-official-docs-label {
3833
+ font-size: 12px;
3834
+ font-weight: 700;
3835
+ color: var(--text);
3836
+ margin-bottom: 2px;
3837
+ }
3838
+
3839
+ .pkg-official-docs-url {
3840
+ font-size: 11px;
3841
+ color: var(--text-muted);
3842
+ white-space: nowrap;
3843
+ overflow: hidden;
3844
+ text-overflow: ellipsis;
3845
+ }
3846
+
3847
+ .pkg-official-docs-arrow {
3848
+ flex-shrink: 0;
3849
+ color: var(--text-muted);
3850
+ transition: color 0.15s;
3851
+ }
3852
+
3853
+ .pkg-official-docs-card:hover .pkg-official-docs-arrow {
3854
+ color: var(--accent);
3855
+ }
3856
+
3857
+ .package-docs-summary {
3858
+ font-size: 13px;
3859
+ color: var(--text-secondary);
3860
+ margin: 0 0 16px;
3861
+ line-height: 1.6;
3862
+ }
3863
+
3864
+ .package-docs-section-title {
3865
+ font-size: 10px;
3866
+ font-weight: 700;
3867
+ letter-spacing: 0.8px;
3868
+ text-transform: uppercase;
3869
+ color: var(--text-muted);
3870
+ margin: 0 0 10px;
3871
+ }
3872
+
3873
+ .package-docs-readme {
3874
+ font-size: 13px;
3875
+ line-height: 1.7;
3876
+ color: var(--text-secondary);
3877
+ }
3878
+
3879
+ .package-docs-title-link {
3880
+ color: inherit;
3881
+ text-decoration: none;
3882
+ }
3883
+ .package-docs-title-link:hover {
3884
+ text-decoration: underline;
3885
+ }
3886
+
3887
+ /* ═══════════════════════════════════════════════════════════
3888
+ TOAST NOTIFICATIONS — redesigned with icons + colour bands
3889
+ ═══════════════════════════════════════════════════════════ */
3890
+ .toast-region {
3891
+ position: fixed;
3892
+ bottom: 24px;
3893
+ right: 24px;
3894
+ z-index: 200;
3895
+ display: flex;
3896
+ flex-direction: column-reverse;
3897
+ gap: 10px;
3898
+ pointer-events: none;
3899
+ }
3900
+
3901
+ .toast {
3902
+ display: flex;
3903
+ align-items: flex-start;
3904
+ gap: 10px;
3905
+ background: var(--bg-elevated);
3906
+ border: 1px solid var(--border-strong);
3907
+ border-radius: 10px;
3908
+ padding: 12px 14px 12px 12px;
3909
+ font-size: 13px;
3910
+ color: var(--text);
3911
+ box-shadow: 0 8px 24px rgba(0,0,0,0.25), 0 2px 6px rgba(0,0,0,0.15);
3912
+ pointer-events: auto;
3913
+ animation: toast-in 240ms cubic-bezier(0.22, 1, 0.36, 1);
3914
+ max-width: 340px;
3915
+ min-width: 220px;
3916
+ line-height: 1.4;
3917
+ }
3918
+
3919
+ /* Coloured left accent border per tone */
3920
+ .toast.success { border-left: 4px solid var(--green); }
3921
+ .toast.error { border-left: 4px solid var(--red); }
3922
+ .toast.info { border-left: 4px solid var(--accent); }
3923
+ .toast.warning { border-left: 4px solid var(--orange); }
3924
+
3925
+ /* Error gets a tinted background so it stands out more */
3926
+ .toast.error {
3927
+ background: color-mix(in srgb, var(--red) 8%, var(--bg-elevated));
3928
+ }
3929
+ .toast.warning {
3930
+ background: color-mix(in srgb, var(--orange) 6%, var(--bg-elevated));
3931
+ }
3932
+
3933
+ /* Icon circle */
3934
+ .toast-icon {
3935
+ flex-shrink: 0;
3936
+ width: 20px;
3937
+ height: 20px;
3938
+ border-radius: 50%;
3939
+ display: flex;
3940
+ align-items: center;
3941
+ justify-content: center;
3942
+ margin-top: 0px;
3943
+ }
3944
+ .toast.success .toast-icon { background: color-mix(in srgb, var(--green) 18%, transparent); color: var(--green); }
3945
+ .toast.error .toast-icon { background: color-mix(in srgb, var(--red) 18%, transparent); color: var(--red); }
3946
+ .toast.info .toast-icon { background: color-mix(in srgb, var(--accent) 18%, transparent); color: var(--accent); }
3947
+ .toast.warning .toast-icon { background: color-mix(in srgb, var(--orange) 18%, transparent); color: var(--orange); }
3948
+
3949
+ .toast-body {
3950
+ flex: 1;
3951
+ min-width: 0;
3952
+ }
3953
+ .toast-title {
3954
+ font-weight: 600;
3955
+ font-size: 12px;
3956
+ letter-spacing: 0.01em;
3957
+ margin-bottom: 2px;
3958
+ }
3959
+ .toast.success .toast-title { color: var(--green); }
3960
+ .toast.error .toast-title { color: var(--red); }
3961
+ .toast.info .toast-title { color: var(--accent); }
3962
+ .toast.warning .toast-title { color: var(--orange); }
3963
+
3964
+ .toast-message {
3965
+ color: var(--text);
3966
+ font-size: 13px;
3967
+ }
3968
+
3969
+ @keyframes toast-in {
3970
+ from { opacity: 0; transform: translateX(20px) scale(0.97); }
3971
+ to { opacity: 1; transform: translateX(0) scale(1); }
3972
+ }
3973
+
3974
+ /* ── Global env banner ──────────────────────────────────────── */
3975
+ .env-global-banner {
3976
+ display: flex;
3977
+ align-items: center;
3978
+ gap: 6px;
3979
+ font-size: 11px;
3980
+ font-weight: 500;
3981
+ color: var(--accent);
3982
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
3983
+ border: 1px solid color-mix(in srgb, var(--accent) 25%, transparent);
3984
+ border-radius: var(--r-md);
3985
+ padding: 6px 10px;
3986
+ margin-bottom: 8px;
3987
+ }
3988
+
3989
+ /* ═══════════════════════════════════════════════════════════
3990
+ KEYBOARD SHORTCUTS MODAL
3991
+ ═══════════════════════════════════════════════════════════ */
3992
+ .shortcuts-overlay {
3993
+ position: fixed;
3994
+ inset: 0;
3995
+ background: rgba(0,0,0,0.6);
3996
+ z-index: 150;
3997
+ display: flex;
3998
+ align-items: center;
3999
+ justify-content: center;
4000
+ backdrop-filter: blur(4px);
4001
+ }
4002
+
4003
+ .shortcuts-modal {
4004
+ background: var(--bg-surface);
4005
+ border: 1px solid var(--border);
4006
+ border-radius: var(--r-xl);
4007
+ padding: 24px;
4008
+ width: 520px;
4009
+ max-height: 80vh;
4010
+ overflow-y: auto;
4011
+ box-shadow: var(--shadow-lg);
4012
+ }
4013
+
4014
+ .shortcuts-title {
4015
+ font-size: 18px;
4016
+ font-weight: 700;
4017
+ color: var(--text);
4018
+ margin-bottom: 20px;
4019
+ }
4020
+
4021
+ .shortcuts-section {
4022
+ margin-bottom: 16px;
4023
+ }
4024
+
4025
+ .shortcuts-section-title {
4026
+ font-size: 10px;
4027
+ font-weight: 700;
4028
+ text-transform: uppercase;
4029
+ letter-spacing: 0.08em;
4030
+ color: var(--text-muted);
4031
+ margin-bottom: 8px;
4032
+ }
4033
+
4034
+ .shortcut-row {
4035
+ display: flex;
4036
+ justify-content: space-between;
4037
+ align-items: center;
4038
+ padding: 6px 0;
4039
+ border-bottom: 1px solid var(--border);
4040
+ }
4041
+
4042
+ .shortcut-row:last-child { border-bottom: none; }
4043
+
4044
+ .shortcut-desc {
4045
+ font-size: 13px;
4046
+ color: var(--text-secondary);
4047
+ }
4048
+
4049
+ .shortcut-keys {
4050
+ display: flex;
4051
+ gap: 4px;
4052
+ }
4053
+
4054
+ kbd {
4055
+ background: var(--bg-raised);
4056
+ border: 1px solid var(--border-strong);
4057
+ border-radius: 4px;
4058
+ padding: 2px 7px;
4059
+ font-size: 11px;
4060
+ font-family: var(--font-mono);
4061
+ color: var(--text);
4062
+ }
4063
+
4064
+ /* ═══════════════════════════════════════════════════════════
4065
+ UTILITY CLASSES
4066
+ ═══════════════════════════════════════════════════════════ */
4067
+ .text-green { color: var(--green); }
4068
+ .text-blue { color: var(--blue); }
4069
+ .text-orange { color: var(--orange); }
4070
+ .text-pink { color: var(--pink); }
4071
+ .text-red { color: var(--red); }
4072
+ .text-muted { color: var(--text-muted); }
4073
+
4074
+ .mt-auto { margin-top: auto; }
4075
+
4076
+ /* Monaco editor host sizing */
4077
+ .editor-host .monaco-editor {
4078
+ border-radius: 0;
4079
+ }
4080
+
4081
+ /* ── Markdown preview mode — clean reading, no chrome ─────────────────── */
4082
+ .notebook-cell.is-markdown-preview .cell-frame {
4083
+ border-color: transparent;
4084
+ background: transparent;
4085
+ box-shadow: none;
4086
+ }
4087
+ .notebook-cell.is-markdown-preview:hover .cell-frame,
4088
+ .notebook-cell.is-markdown-preview.is-focused .cell-frame {
4089
+ border-color: var(--border);
4090
+ box-shadow: none;
4091
+ }
4092
+ .notebook-cell.is-markdown-preview .cell-topbar {
4093
+ display: none;
4094
+ }
4095
+ .notebook-cell.is-markdown-preview .cell-body {
4096
+ background: transparent;
4097
+ }
4098
+ .notebook-cell.is-markdown-preview .markdown-preview {
4099
+ padding: 6px 4px;
4100
+ cursor: text;
4101
+ }
4102
+ .notebook-cell.is-markdown-preview .insert-row {
4103
+ opacity: 0;
4104
+ transition: opacity var(--t-fast);
4105
+ }
4106
+ .notebook-cell.is-markdown-preview:hover .insert-row {
4107
+ opacity: 1;
4108
+ }
4109
+ /* Subtle "double-click to edit" hint visible on hover */
4110
+ .notebook-cell.is-markdown-preview .cell-frame {
4111
+ position: relative;
4112
+ }
4113
+ .notebook-cell.is-markdown-preview:hover .cell-frame::after {
4114
+ content: 'double-click to edit';
4115
+ position: absolute;
4116
+ top: 6px;
4117
+ right: 10px;
4118
+ font-size: 10px;
4119
+ color: var(--text-muted);
4120
+ opacity: 0.55;
4121
+ pointer-events: none;
4122
+ font-style: italic;
4123
+ }
4124
+
4125
+ /* Markdown preview image support */
4126
+ .markdown-preview img,
4127
+ .rendered-markdown img {
4128
+ max-width: 100%;
4129
+ max-height: 250px;
4130
+ object-fit: contain;
4131
+ border-radius: var(--r-md);
4132
+ margin: 6px 0;
4133
+ display: block;
4134
+ }
4135
+
4136
+ /* Markdown editor auto-height */
4137
+ .markdown-editor {
4138
+ overflow-y: hidden;
4139
+ max-height: 400px;
4140
+ overflow-y: auto;
4141
+ transition: height 0.1s ease;
4142
+ }
4143
+
4144
+ /* Collapsed cell */
4145
+ .notebook-cell.is-collapsed .cell-body {
4146
+ display: none;
4147
+ }
4148
+
4149
+ .notebook-cell.is-collapsed .output-panel {
4150
+ display: none;
4151
+ }
4152
+
4153
+ /* Running indicator */
4154
+ .cell-frame.is-running {
4155
+ border-color: var(--orange);
4156
+ }
4157
+
4158
+ .cell-frame.has-error {
4159
+ border-color: var(--red);
4160
+ }
4161
+
4162
+ /* Responsive breakpoints */
4163
+ @media (max-width: 1399px) {
4164
+ /* On narrower screens, hide text labels — show icons only */
4165
+ .notebook-header-right .btn-label,
4166
+ .kernel-pill #kernel-pill-label {
4167
+ display: none;
4168
+ }
4169
+ /* Keep the kernel-pill icon visible but tighten padding */
4170
+ .kernel-pill { padding: 4px 8px; }
4171
+ }
4172
+
4173
+ @media (max-width: 1100px) {
4174
+ .stat-grid { grid-template-columns: repeat(2, 1fr); }
4175
+ .activity-layout { grid-template-columns: 1fr; }
4176
+ .activity-metrics { flex-direction: row; }
4177
+ }
4178
+
4179
+ @media (max-width: 800px) {
4180
+ :root { --sidebar-w: 0px; }
4181
+ .sidebar { display: none; }
4182
+ /* bottom-sheet already uses left:0 globally */
4183
+ }
4184
+
4185
+ /* ═══════════════════════════════════════════════════════════
4186
+ MONACO EDITOR OVERRIDES
4187
+ ═══════════════════════════════════════════════════════════ */
4188
+ .monaco-editor,
4189
+ .monaco-editor .overflow-guard {
4190
+ border-radius: 0 !important;
4191
+ }
4192
+
4193
+ .monaco-editor .minimap { display: none; }
4194
+
4195
+ /* ══════════════════════════════════════════════════════════
4196
+ LIGHT THEME BASE — shared shadow/selection adjustments
4197
+ ══════════════════════════════════════════════════════════ */
4198
+ [data-theme-base="light"] ::selection {
4199
+ background: var(--accent-soft);
4200
+ color: var(--text);
4201
+ }
4202
+ [data-theme-base="dark"] ::selection {
4203
+ background: var(--accent-soft);
4204
+ color: var(--text);
4205
+ }
4206
+
4207
+ /* Stat card accents use accent color per theme */
4208
+ [data-theme="lumen"] .stat-card--green::before,
4209
+ [data-theme="champa"] .stat-card--green::before,
4210
+ [data-theme="varuna"] .stat-card--green::before,
4211
+ [data-theme="surya"] .stat-card--green::before,
4212
+ [data-theme="haritha"] .stat-card--green::before { background: var(--green); }
4213
+ [data-theme="obsidian"] .stat-card--green::before,
4214
+ [data-theme="antariksha"] .stat-card--green::before,
4215
+ [data-theme="vriksha"] .stat-card--green::before { background: var(--green); }
4216
+
4217
+ /* Brand logo is now a plain SVG — no coloured box */
4218
+
4219
+ /* Active nav uses accent */
4220
+ .nav-item.is-active { color: var(--accent); background: var(--bg-active); }
4221
+ .nav-item.is-active svg { stroke: var(--accent); }
4222
+ .sidebar-env-btn svg { color: var(--accent); }
4223
+ .user-plan { color: var(--accent); }
4224
+ .view-all-link { color: var(--accent); }
4225
+ .sidebar-shell-input:focus { border-color: var(--border-accent); }
4226
+ .search-bar:focus-within { border-color: var(--border-accent); }
4227
+ select:focus, .select-sm:focus { border-color: var(--border-accent); }
4228
+ .ai-input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
4229
+ .btn-primary { background: var(--accent); }
4230
+ .sidebar-file-item.is-active { color: var(--accent); background: var(--bg-active); }
4231
+ .text-green { color: var(--accent); }
4232
+ .nlp-item.is-active { color: var(--accent); background: var(--bg-active); }
4233
+ .ai-message-role.assistant { color: var(--accent); }
4234
+ .cell-frame.is-running { border-color: var(--orange); }
4235
+ .cell-run-button { background: var(--accent); color: #fff; }
4236
+
4237
+ /* ═══════════════════════════════════════════════════════════
4238
+ INSTALLED PACKAGES — CARD VIEW
4239
+ ═══════════════════════════════════════════════════════════ */
4240
+
4241
+ .pkg-list {
4242
+ display: grid;
4243
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
4244
+ gap: 10px;
4245
+ padding: 16px;
4246
+ }
4247
+
4248
+ .pkg-installed-card {
4249
+ background: var(--bg-surface);
4250
+ border: 1px solid var(--border);
4251
+ border-radius: var(--r-lg);
4252
+ padding: 14px;
4253
+ display: flex;
4254
+ flex-direction: column;
4255
+ gap: 8px;
4256
+ transition: border-color var(--t-fast), box-shadow var(--t-fast);
4257
+ }
4258
+
4259
+ .pkg-installed-card:hover {
4260
+ border-color: var(--border-strong);
4261
+ box-shadow: var(--shadow-md);
4262
+ }
4263
+
4264
+ .pkg-installed-card-top {
4265
+ display: flex;
4266
+ align-items: flex-start;
4267
+ justify-content: space-between;
4268
+ gap: 8px;
4269
+ }
4270
+
4271
+ .pkg-installed-name {
4272
+ font-size: 13px;
4273
+ font-weight: 700;
4274
+ color: var(--text);
4275
+ font-family: var(--font-mono);
4276
+ word-break: break-all;
4277
+ flex: 1;
4278
+ }
4279
+
4280
+ .pkg-installed-badge {
4281
+ font-size: 10px;
4282
+ font-weight: 700;
4283
+ padding: 2px 7px;
4284
+ border-radius: var(--r-full);
4285
+ flex-shrink: 0;
4286
+ letter-spacing: 0.4px;
4287
+ text-transform: uppercase;
4288
+ }
4289
+
4290
+ .badge-ai { background: color-mix(in srgb, var(--pink) 15%, transparent); color: var(--pink); }
4291
+ .badge-types { background: color-mix(in srgb, var(--purple) 15%, transparent); color: var(--purple); }
4292
+ .badge-utils { background: color-mix(in srgb, var(--blue) 15%, transparent); color: var(--blue); }
4293
+ .badge-default { background: color-mix(in srgb, var(--green) 15%, transparent); color: var(--green); }
4294
+
4295
+ .pkg-installed-desc {
4296
+ font-size: 11px;
4297
+ color: var(--text-muted);
4298
+ line-height: 1.5;
4299
+ flex: 1;
4300
+ }
4301
+
4302
+ .pkg-installed-actions {
4303
+ display: flex;
4304
+ gap: 8px;
4305
+ margin-top: auto;
4306
+ }
4307
+
4308
+ .pkg-installed-docs,
4309
+ .pkg-installed-remove {
4310
+ font-size: 11px;
4311
+ font-weight: 600;
4312
+ padding: 3px 10px;
4313
+ border-radius: var(--r-sm);
4314
+ border: 1px solid var(--border);
4315
+ background: transparent;
4316
+ cursor: pointer;
4317
+ font-family: inherit;
4318
+ transition: all var(--t-fast);
4319
+ }
4320
+
4321
+ .pkg-installed-docs { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 30%, transparent); }
4322
+ .pkg-installed-docs:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); }
4323
+
4324
+ .pkg-installed-remove { color: var(--text-muted); }
4325
+ .pkg-installed-remove:hover { color: var(--red); border-color: color-mix(in srgb, var(--red) 30%, transparent); background: color-mix(in srgb, var(--red) 8%, transparent); }
4326
+ .pkg-installed-remove:disabled { opacity: 0.5; cursor: not-allowed; }
4327
+
4328
+ /* ═══════════════════════════════════════════════════════════
4329
+ ENV VARIABLES — TABLE LAYOUT + SAVE BUTTON
4330
+ ═══════════════════════════════════════════════════════════ */
4331
+
4332
+ .btn-env-save {
4333
+ font-size: 12px;
4334
+ font-weight: 600;
4335
+ padding: 5px 16px;
4336
+ border-radius: var(--r-md);
4337
+ border: 1px solid var(--green);
4338
+ background: color-mix(in srgb, var(--green) 12%, transparent);
4339
+ color: var(--green);
4340
+ cursor: pointer;
4341
+ font-family: inherit;
4342
+ transition: all var(--t-fast);
4343
+ }
4344
+
4345
+ .btn-env-save:hover { background: color-mix(in srgb, var(--green) 20%, transparent); }
4346
+ .btn-env-save.is-saved { background: var(--green); color: #000; border-color: var(--green); }
4347
+
4348
+ .env-table-header {
4349
+ display: grid;
4350
+ grid-template-columns: 1fr 2fr 28px;
4351
+ gap: 8px;
4352
+ padding: 6px 20px 4px;
4353
+ border-bottom: 1px solid var(--border);
4354
+ }
4355
+
4356
+ .env-table-header.hidden { display: none; }
4357
+
4358
+ .env-th {
4359
+ font-size: 10px;
4360
+ font-weight: 700;
4361
+ text-transform: uppercase;
4362
+ letter-spacing: 0.6px;
4363
+ color: var(--text-muted);
4364
+ }
4365
+
4366
+ .env-row-dirty {
4367
+ background: color-mix(in srgb, var(--orange) 5%, transparent);
4368
+ border-radius: var(--r-sm);
4369
+ }
4370
+
4371
+ /* Value field with show/hide toggle */
4372
+ .env-val-wrap {
4373
+ position: relative;
4374
+ display: flex;
4375
+ align-items: center;
4376
+ }
4377
+
4378
+ .env-val-wrap .env-val-input {
4379
+ width: 100%;
4380
+ padding-right: 32px;
4381
+ }
4382
+
4383
+ .env-val-toggle {
4384
+ position: absolute;
4385
+ right: 6px;
4386
+ background: none;
4387
+ border: none;
4388
+ cursor: pointer;
4389
+ color: var(--text-muted);
4390
+ padding: 2px;
4391
+ display: flex;
4392
+ align-items: center;
4393
+ transition: color var(--t-fast);
4394
+ }
4395
+
4396
+ .env-val-toggle:hover { color: var(--text); }
4397
+ .env-val-toggle.is-active { color: var(--accent); }
4398
+
4399
+ /* ═══════════════════════════════════════════════════════════
4400
+ SETTINGS MODAL (font size + future prefs)
4401
+ ═══════════════════════════════════════════════════════════ */
4402
+
4403
+ .btn-settings {
4404
+ display: inline-flex;
4405
+ align-items: center;
4406
+ justify-content: center;
4407
+ width: 30px;
4408
+ height: 30px;
4409
+ border-radius: var(--r-md);
4410
+ border: none;
4411
+ background: transparent;
4412
+ color: var(--text-secondary);
4413
+ cursor: pointer;
4414
+ transition: background var(--t-fast), color var(--t-fast);
4415
+ flex-shrink: 0;
4416
+ }
4417
+
4418
+ .btn-settings:hover { background: var(--bg-raised); color: var(--text); }
4419
+
4420
+ .settings-modal-scrim {
4421
+ position: fixed;
4422
+ inset: 0;
4423
+ background: rgba(0,0,0,0.4);
4424
+ z-index: 900;
4425
+ backdrop-filter: blur(2px);
4426
+ }
4427
+
4428
+ .settings-modal-scrim.hidden { display: none; }
4429
+
4430
+ .settings-modal {
4431
+ position: fixed;
4432
+ top: 50%;
4433
+ left: 50%;
4434
+ transform: translate(-50%, -50%);
4435
+ z-index: 901;
4436
+ background: var(--bg-surface);
4437
+ border: 1px solid var(--border);
4438
+ border-radius: var(--r-xl);
4439
+ box-shadow: var(--shadow-lg);
4440
+ width: 360px;
4441
+ max-width: calc(100vw - 32px);
4442
+ overflow: hidden;
4443
+ }
4444
+
4445
+ .settings-modal.hidden { display: none; }
4446
+
4447
+ .settings-modal-header {
4448
+ display: flex;
4449
+ align-items: center;
4450
+ justify-content: space-between;
4451
+ padding: 16px 20px;
4452
+ border-bottom: 1px solid var(--border);
4453
+ }
4454
+
4455
+ .settings-modal-title {
4456
+ font-size: 14px;
4457
+ font-weight: 700;
4458
+ color: var(--text);
4459
+ }
4460
+
4461
+ .settings-modal-body {
4462
+ padding: 20px;
4463
+ display: flex;
4464
+ flex-direction: column;
4465
+ gap: 20px;
4466
+ }
4467
+
4468
+ .settings-row {
4469
+ display: flex;
4470
+ align-items: center;
4471
+ justify-content: space-between;
4472
+ gap: 16px;
4473
+ }
4474
+
4475
+ .settings-label {
4476
+ font-size: 13px;
4477
+ font-weight: 600;
4478
+ color: var(--text-secondary);
4479
+ }
4480
+
4481
+ .settings-control {
4482
+ display: flex;
4483
+ align-items: center;
4484
+ gap: 12px;
4485
+ }
4486
+
4487
+ .font-size-step {
4488
+ width: 32px;
4489
+ height: 32px;
4490
+ border-radius: var(--r-md);
4491
+ border: 1px solid var(--border);
4492
+ background: var(--bg-raised);
4493
+ color: var(--text);
4494
+ font-size: 16px;
4495
+ font-weight: 600;
4496
+ cursor: pointer;
4497
+ display: flex;
4498
+ align-items: center;
4499
+ justify-content: center;
4500
+ transition: background var(--t-fast), border-color var(--t-fast);
4501
+ }
4502
+
4503
+ .font-size-step:hover { background: var(--bg-elevated); border-color: var(--border-strong); }
4504
+
4505
+ .font-size-display {
4506
+ font-size: 14px;
4507
+ font-weight: 700;
4508
+ color: var(--accent);
4509
+ font-family: var(--font-mono);
4510
+ min-width: 36px;
4511
+ text-align: center;
4512
+ }
4513
+
4514
+ /* font-family row: let the control side expand to fill available space */
4515
+ .settings-row:has(.font-family-select) .settings-control {
4516
+ flex: 1;
4517
+ }
4518
+
4519
+ .font-family-select {
4520
+ width: 100%;
4521
+ max-width: 220px;
4522
+ padding: 7px 10px;
4523
+ font-size: 13px;
4524
+ font-family: inherit;
4525
+ background: var(--bg-raised);
4526
+ border: 1px solid var(--border);
4527
+ border-radius: var(--r-md);
4528
+ color: var(--text-primary);
4529
+ cursor: pointer;
4530
+ outline: none;
4531
+ transition: border-color var(--t-fast);
4532
+ }
4533
+ .font-family-select:hover { border-color: var(--border-strong); }
4534
+ .font-family-select:focus { border-color: var(--accent); }
4535
+
4536
+ .settings-preview {
4537
+ font-family: 'Menlo', 'Monaco', 'Courier New', monospace;
4538
+ font-size: 13px;
4539
+ color: var(--text-secondary);
4540
+ background: var(--bg-raised);
4541
+ border: 1px solid var(--border);
4542
+ border-radius: var(--r-md);
4543
+ padding: 10px 14px;
4544
+ margin: 0;
4545
+ transition: font-size var(--t-fast);
4546
+ white-space: pre;
4547
+ overflow: hidden;
4548
+ text-overflow: ellipsis;
4549
+ }
4550
+
4551
+ /* ═══════════════════════════════════════════════════════════
4552
+ marsbook BRAND
4553
+ ═══════════════════════════════════════════════════════════ */
4554
+
4555
+ /* Override the old box-icon style for the new SVG mark */
4556
+ .marsbook-logo-mark {
4557
+ background: transparent !important;
4558
+ border: none !important;
4559
+ width: 34px;
4560
+ height: 34px;
4561
+ display: flex;
4562
+ align-items: center;
4563
+ justify-content: center;
4564
+ flex-shrink: 0;
4565
+ }
4566
+
4567
+ /* Two-tone wordmark */
4568
+ .marsbook-name {
4569
+ font-size: 14px !important;
4570
+ font-weight: 400 !important;
4571
+ letter-spacing: -0.3px;
4572
+ }
4573
+
4574
+ .marsbook-mars {
4575
+ color: var(--text-secondary);
4576
+ font-weight: 300;
4577
+ }
4578
+
4579
+ .marsbook-book {
4580
+ color: var(--accent);
4581
+ font-weight: 800;
4582
+ }
4583
+
4584
+ /* ═══════════════════════════════════════════════════════════
4585
+ GROQ API KEY SETUP GUIDE (inside AI assistant sheet)
4586
+ ═══════════════════════════════════════════════════════════ */
4587
+
4588
+ /* Override old minimal banner style */
4589
+ .ai-missing-key {
4590
+ background: none !important;
4591
+ border: none !important;
4592
+ color: inherit !important;
4593
+ font-size: inherit !important;
4594
+ padding: 0 !important;
4595
+ margin: 0 !important;
4596
+ border-radius: 0 !important;
4597
+ display: flex;
4598
+ flex-direction: column;
4599
+ gap: 0;
4600
+ overflow-y: auto;
4601
+ flex: 1;
4602
+ }
4603
+
4604
+ .ai-key-hero {
4605
+ display: flex;
4606
+ flex-direction: column;
4607
+ align-items: center;
4608
+ text-align: center;
4609
+ padding: 28px 24px 20px;
4610
+ background: linear-gradient(160deg, color-mix(in srgb, var(--accent) 8%, transparent), transparent 70%);
4611
+ border-bottom: 1px solid var(--border);
4612
+ gap: 8px;
4613
+ }
4614
+
4615
+ .ai-key-icon {
4616
+ color: var(--accent);
4617
+ opacity: 0.85;
4618
+ margin-bottom: 4px;
4619
+ }
4620
+
4621
+ .ai-key-title {
4622
+ font-size: 15px;
4623
+ font-weight: 700;
4624
+ color: var(--text);
4625
+ margin: 0;
4626
+ }
4627
+
4628
+ .ai-key-sub {
4629
+ font-size: 12px;
4630
+ color: var(--text-muted);
4631
+ line-height: 1.6;
4632
+ margin: 0;
4633
+ max-width: 320px;
4634
+ }
4635
+
4636
+ /* Numbered steps */
4637
+ .ai-key-steps {
4638
+ list-style: none;
4639
+ margin: 0;
4640
+ padding: 16px 20px;
4641
+ display: flex;
4642
+ flex-direction: column;
4643
+ gap: 0;
4644
+ }
4645
+
4646
+ .ai-key-steps li {
4647
+ display: flex;
4648
+ gap: 14px;
4649
+ align-items: flex-start;
4650
+ padding: 14px 0;
4651
+ border-bottom: 1px solid var(--border);
4652
+ }
4653
+
4654
+ .ai-key-steps li:last-child {
4655
+ border-bottom: none;
4656
+ }
4657
+
4658
+ .ai-step-num {
4659
+ flex-shrink: 0;
4660
+ width: 24px;
4661
+ height: 24px;
4662
+ border-radius: 50%;
4663
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
4664
+ color: var(--accent);
4665
+ font-size: 11px;
4666
+ font-weight: 800;
4667
+ display: flex;
4668
+ align-items: center;
4669
+ justify-content: center;
4670
+ margin-top: 1px;
4671
+ }
4672
+
4673
+ .ai-step-body {
4674
+ display: flex;
4675
+ flex-direction: column;
4676
+ gap: 3px;
4677
+ flex: 1;
4678
+ }
4679
+
4680
+ .ai-step-body strong {
4681
+ font-size: 12px;
4682
+ font-weight: 700;
4683
+ color: var(--text);
4684
+ }
4685
+
4686
+ .ai-step-body span {
4687
+ font-size: 12px;
4688
+ color: var(--text-muted);
4689
+ line-height: 1.55;
4690
+ }
4691
+
4692
+ .ai-step-body em {
4693
+ font-style: normal;
4694
+ color: var(--text-secondary);
4695
+ font-weight: 500;
4696
+ }
4697
+
4698
+ .ai-step-body code {
4699
+ font-family: var(--font-mono);
4700
+ font-size: 11px;
4701
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
4702
+ color: var(--accent);
4703
+ border-radius: 3px;
4704
+ padding: 1px 5px;
4705
+ }
4706
+
4707
+ .ai-step-link {
4708
+ color: var(--accent);
4709
+ text-decoration: none;
4710
+ font-weight: 600;
4711
+ }
4712
+
4713
+ .ai-step-link:hover {
4714
+ text-decoration: underline;
4715
+ }
4716
+
4717
+ /* CTA button at the bottom of the guide */
4718
+ .ai-key-env-btn {
4719
+ display: flex;
4720
+ align-items: center;
4721
+ justify-content: center;
4722
+ gap: 8px;
4723
+ margin: 0 20px 20px;
4724
+ padding: 10px 20px;
4725
+ background: var(--accent);
4726
+ color: #fff;
4727
+ border: none;
4728
+ border-radius: var(--r-md);
4729
+ font-size: 13px;
4730
+ font-weight: 600;
4731
+ font-family: inherit;
4732
+ cursor: pointer;
4733
+ transition: opacity var(--t-fast);
4734
+ }
4735
+
4736
+ .ai-key-env-btn:hover { opacity: 0.85; }