@bibobonking/opensol 0.0.0-stage → 3.0.2
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.
- package/.github/workflows/build.yml +25 -0
- package/README.md +74 -2
- package/dist/assets/index-BmN7pBji.css +1 -0
- package/dist/assets/index-DgNDjkOz.js +301 -0
- package/dist/favicon.svg +15 -0
- package/dist/index.html +55 -0
- package/dist/preview-host.html +33 -0
- package/index.html +54 -0
- package/package.json +43 -4
- package/postcss.config.js +6 -0
- package/public/favicon.svg +15 -0
- package/public/preview-host.html +33 -0
- package/server/README.md +75 -0
- package/server/daemon.mjs +1082 -0
- package/server/lib/checkpoints.mjs +124 -0
- package/server/lib/checkpoints.test.mjs +110 -0
- package/server/lib/deploy.mjs +436 -0
- package/server/lib/http.mjs +237 -0
- package/server/lib/plugins.mjs +321 -0
- package/server/lib/plugins.test.mjs +140 -0
- package/server/lib/providers.mjs +594 -0
- package/server/lib/store.mjs +491 -0
- package/server/lib/tools.mjs +990 -0
- package/server/opensol.mjs +202 -0
- package/server/package.json +42 -0
- package/shared/plugin-builder.test.mjs +43 -0
- package/shared/plugin-package.d.mts +34 -0
- package/shared/plugin-package.mjs +197 -0
- package/shared/plugin-package.test.mjs +94 -0
- package/src/App.tsx +152 -0
- package/src/agent/adapters/anthropic.ts +233 -0
- package/src/agent/adapters/gemini.ts +225 -0
- package/src/agent/adapters/openai-responses.ts +215 -0
- package/src/agent/adapters/openai.ts +200 -0
- package/src/agent/adapters/shared.ts +96 -0
- package/src/agent/approval.ts +20 -0
- package/src/agent/compact.ts +234 -0
- package/src/agent/index.ts +36 -0
- package/src/agent/model.ts +20 -0
- package/src/agent/prompt.ts +107 -0
- package/src/agent/queue.test.mjs +111 -0
- package/src/agent/queue.ts +84 -0
- package/src/agent/subagent.ts +109 -0
- package/src/agent/tools.ts +541 -0
- package/src/components/ChatView.tsx +403 -0
- package/src/components/CommandPalette.tsx +416 -0
- package/src/components/Composer.tsx +678 -0
- package/src/components/ContextBar.tsx +58 -0
- package/src/components/DeployModal.tsx +512 -0
- package/src/components/ErrorBoundary.tsx +75 -0
- package/src/components/HomeDashboard.tsx +189 -0
- package/src/components/Logo.tsx +41 -0
- package/src/components/Markdown.tsx +232 -0
- package/src/components/MessageItem.tsx +655 -0
- package/src/components/ModelPicker.tsx +487 -0
- package/src/components/PixleSol.tsx +243 -0
- package/src/components/PluginBuilder.tsx +285 -0
- package/src/components/PluginManager.tsx +341 -0
- package/src/components/PreviewPane.tsx +166 -0
- package/src/components/SettingsModal.tsx +2052 -0
- package/src/components/Sidebar.tsx +504 -0
- package/src/components/Splash.tsx +104 -0
- package/src/components/ToolCallCard.tsx +177 -0
- package/src/components/TopBar.tsx +182 -0
- package/src/components/TrajectoryView.tsx +178 -0
- package/src/components/WorkspacePanel.tsx +710 -0
- package/src/components/ui.tsx +311 -0
- package/src/core/kernel.ts +45 -0
- package/src/core/plugins/tools/fs.ts +219 -0
- package/src/core/plugins/tools/git.ts +83 -0
- package/src/core/plugins/tools/grep.ts +98 -0
- package/src/core/plugins/tools/shell.ts +88 -0
- package/src/core/plugins/tools/subagent.ts +36 -0
- package/src/core/plugins/tools/web.ts +97 -0
- package/src/core/services/agent-loop.ts +417 -0
- package/src/core/services/approval.ts +66 -0
- package/src/core/services/compaction.ts +45 -0
- package/src/core/services/llm.ts +32 -0
- package/src/core/services/sessions.ts +47 -0
- package/src/core/services/subagents.ts +15 -0
- package/src/core/services/system-prompt.ts +177 -0
- package/src/core/services/tools.ts +135 -0
- package/src/core/services/ui.ts +109 -0
- package/src/core/types.ts +139 -0
- package/src/data/providers.ts +125 -0
- package/src/data/skills.ts +68 -0
- package/src/index.css +776 -0
- package/src/lib/boot.ts +94 -0
- package/src/lib/context.ts +75 -0
- package/src/lib/conversation.test.mjs +64 -0
- package/src/lib/conversation.ts +59 -0
- package/src/lib/daemon.ts +475 -0
- package/src/lib/hooks.ts +33 -0
- package/src/lib/permissions.ts +60 -0
- package/src/lib/pixlesol.test.mjs +51 -0
- package/src/lib/pixlesol.ts +55 -0
- package/src/lib/plugin-folder.test.mjs +145 -0
- package/src/lib/plugin-folder.ts +96 -0
- package/src/lib/reasoning.ts +87 -0
- package/src/lib/sse.ts +75 -0
- package/src/lib/themes.test.mjs +72 -0
- package/src/lib/themes.ts +52 -0
- package/src/lib/usage.test.mjs +72 -0
- package/src/lib/usage.ts +155 -0
- package/src/lib/utils.ts +73 -0
- package/src/main.tsx +16 -0
- package/src/plugins/api.test.mjs +77 -0
- package/src/plugins/api.ts +113 -0
- package/src/plugins/bridge.d.mts +1 -0
- package/src/plugins/bridge.mjs +26 -0
- package/src/plugins/bridge.test.mjs +17 -0
- package/src/plugins/index.ts +52 -0
- package/src/plugins/preview.test.mjs +18 -0
- package/src/plugins/preview.ts +34 -0
- package/src/plugins/runtime.ts +194 -0
- package/src/plugins/types.ts +40 -0
- package/src/store/chats.ts +278 -0
- package/src/store/models.ts +120 -0
- package/src/store/settings.ts +445 -0
- package/src/store/ui.ts +132 -0
- package/src/store/workspace.ts +299 -0
- package/src/types.ts +337 -0
- package/src/vite-env.d.ts +1 -0
- package/tailwind.config.js +83 -0
- package/tsconfig.json +22 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vite.config.ts +19 -0
package/src/index.css
ADDED
|
@@ -0,0 +1,776 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
@layer base {
|
|
6
|
+
/* OpenSol Paper — near-white, hairline borders, one solar accent.
|
|
7
|
+
canvas = sidebar/chrome, panel = reading surface. */
|
|
8
|
+
:root,
|
|
9
|
+
[data-theme='light'] {
|
|
10
|
+
--canvas: 248 248 246;
|
|
11
|
+
--panel: 255 255 255;
|
|
12
|
+
--raised: 240 240 237;
|
|
13
|
+
--line: 232 232 228;
|
|
14
|
+
--ink: 23 23 21;
|
|
15
|
+
--muted: 98 98 93;
|
|
16
|
+
--faint: 148 148 141;
|
|
17
|
+
--accent: 217 119 6;
|
|
18
|
+
--accent-soft: 254 244 224;
|
|
19
|
+
--on-accent: 255 255 255;
|
|
20
|
+
--success: 22 128 74;
|
|
21
|
+
--warning: 180 100 8;
|
|
22
|
+
--danger: 207 56 48;
|
|
23
|
+
--syn-keyword: 124 58 237;
|
|
24
|
+
--syn-string: 21 128 61;
|
|
25
|
+
--syn-number: 194 85 8;
|
|
26
|
+
--syn-title: 37 99 235;
|
|
27
|
+
--syn-attr: 14 116 144;
|
|
28
|
+
--chat-font-size: 15px;
|
|
29
|
+
color-scheme: light;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* OpenSol Graphite — neutral near-black, no color cast. */
|
|
33
|
+
[data-theme='dark'] {
|
|
34
|
+
--canvas: 15 15 14;
|
|
35
|
+
--panel: 20 20 19;
|
|
36
|
+
--raised: 33 33 31;
|
|
37
|
+
--line: 42 42 39;
|
|
38
|
+
--ink: 237 237 233;
|
|
39
|
+
--muted: 160 160 153;
|
|
40
|
+
--faint: 112 112 106;
|
|
41
|
+
--accent: 245 158 11;
|
|
42
|
+
--accent-soft: 46 34 12;
|
|
43
|
+
--on-accent: 26 17 3;
|
|
44
|
+
--success: 74 205 130;
|
|
45
|
+
--warning: 245 180 70;
|
|
46
|
+
--danger: 248 113 104;
|
|
47
|
+
--syn-keyword: 196 160 255;
|
|
48
|
+
--syn-string: 130 218 160;
|
|
49
|
+
--syn-number: 244 184 110;
|
|
50
|
+
--syn-title: 140 184 255;
|
|
51
|
+
--syn-attr: 120 214 226;
|
|
52
|
+
--chat-font-size: 15px;
|
|
53
|
+
color-scheme: dark;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* Night Owl */
|
|
57
|
+
[data-theme='night-owl'] {
|
|
58
|
+
--canvas: 1 17 30;
|
|
59
|
+
--panel: 1 22 39;
|
|
60
|
+
--raised: 11 38 60;
|
|
61
|
+
--line: 22 55 82;
|
|
62
|
+
--ink: 214 222 235;
|
|
63
|
+
--muted: 141 168 197;
|
|
64
|
+
--faint: 95 122 153;
|
|
65
|
+
--accent: 130 170 255;
|
|
66
|
+
--accent-soft: 16 48 77;
|
|
67
|
+
--on-accent: 1 22 39;
|
|
68
|
+
--success: 34 210 156;
|
|
69
|
+
--warning: 236 196 141;
|
|
70
|
+
--danger: 239 83 80;
|
|
71
|
+
--syn-keyword: 197 147 249;
|
|
72
|
+
--syn-string: 144 209 148;
|
|
73
|
+
--syn-number: 247 190 116;
|
|
74
|
+
--syn-title: 130 170 255;
|
|
75
|
+
--syn-attr: 33 193 220;
|
|
76
|
+
color-scheme: dark;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* Claude Code — warm charcoal with terracotta. */
|
|
80
|
+
[data-theme='claude-code'] {
|
|
81
|
+
--canvas: 30 29 27;
|
|
82
|
+
--panel: 38 37 34;
|
|
83
|
+
--raised: 49 48 44;
|
|
84
|
+
--line: 62 61 56;
|
|
85
|
+
--ink: 232 230 224;
|
|
86
|
+
--muted: 175 171 162;
|
|
87
|
+
--faint: 129 126 118;
|
|
88
|
+
--accent: 217 119 87;
|
|
89
|
+
--accent-soft: 62 45 38;
|
|
90
|
+
--on-accent: 28 22 18;
|
|
91
|
+
--success: 143 191 140;
|
|
92
|
+
--warning: 222 178 112;
|
|
93
|
+
--danger: 224 122 112;
|
|
94
|
+
--syn-keyword: 213 145 122;
|
|
95
|
+
--syn-string: 143 187 137;
|
|
96
|
+
--syn-number: 221 176 116;
|
|
97
|
+
--syn-title: 158 184 222;
|
|
98
|
+
--syn-attr: 135 189 191;
|
|
99
|
+
color-scheme: dark;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Solar (id kept as "flame") — deep umber, bright sun. */
|
|
103
|
+
[data-theme='flame'] {
|
|
104
|
+
--canvas: 16 11 8;
|
|
105
|
+
--panel: 22 15 11;
|
|
106
|
+
--raised: 36 25 18;
|
|
107
|
+
--line: 56 38 27;
|
|
108
|
+
--ink: 250 238 224;
|
|
109
|
+
--muted: 190 160 138;
|
|
110
|
+
--faint: 134 106 88;
|
|
111
|
+
--accent: 255 138 30;
|
|
112
|
+
--accent-soft: 58 32 14;
|
|
113
|
+
--on-accent: 26 12 4;
|
|
114
|
+
--success: 146 206 138;
|
|
115
|
+
--warning: 250 200 100;
|
|
116
|
+
--danger: 255 106 92;
|
|
117
|
+
--syn-keyword: 255 150 90;
|
|
118
|
+
--syn-string: 170 210 138;
|
|
119
|
+
--syn-number: 250 194 108;
|
|
120
|
+
--syn-title: 250 176 128;
|
|
121
|
+
--syn-attr: 168 200 224;
|
|
122
|
+
color-scheme: dark;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
* {
|
|
126
|
+
border-color: rgb(var(--line));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
html,
|
|
130
|
+
body,
|
|
131
|
+
#root {
|
|
132
|
+
height: 100%;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
body {
|
|
136
|
+
@apply bg-panel font-sans text-ink antialiased;
|
|
137
|
+
font-feature-settings: 'ss01' 1, 'cv11' 1;
|
|
138
|
+
letter-spacing: -0.003em;
|
|
139
|
+
text-rendering: optimizeLegibility;
|
|
140
|
+
overscroll-behavior: none;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
::selection {
|
|
144
|
+
background: rgb(var(--accent) / 0.22);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
:focus-visible {
|
|
148
|
+
outline: 2px solid rgb(var(--accent) / 0.6);
|
|
149
|
+
outline-offset: 2px;
|
|
150
|
+
border-radius: 6px;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
button,
|
|
154
|
+
input,
|
|
155
|
+
textarea,
|
|
156
|
+
select {
|
|
157
|
+
font: inherit;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
button:not(:disabled) {
|
|
161
|
+
cursor: pointer;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
input::placeholder,
|
|
165
|
+
textarea::placeholder {
|
|
166
|
+
color: rgb(var(--faint));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
@layer components {
|
|
171
|
+
.icon-button {
|
|
172
|
+
@apply inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-muted transition-all duration-150 ease-out hover:bg-raised hover:text-ink active:scale-90 disabled:pointer-events-none disabled:opacity-40;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.chip {
|
|
176
|
+
@apply inline-flex h-8 items-center gap-1.5 rounded-lg border border-line bg-panel px-3 text-[12.5px] font-medium text-muted transition-all duration-150 hover:border-faint/40 hover:bg-raised/60 hover:text-ink active:scale-[0.97];
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.chip-active {
|
|
180
|
+
@apply border-accent/30 bg-accent-soft text-accent hover:border-accent/50 hover:text-accent;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.soft-label {
|
|
184
|
+
@apply text-[11px] font-medium text-faint;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.eyebrow {
|
|
188
|
+
@apply text-[10.5px] font-medium uppercase tracking-[0.14em] text-faint;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.sidebar-item {
|
|
192
|
+
@apply relative flex h-8 w-full items-center gap-2.5 rounded-lg px-2.5 text-left text-[13px] text-muted transition-all duration-150 hover:bg-raised/80 hover:text-ink;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.sidebar-item-active {
|
|
196
|
+
@apply bg-raised text-ink hover:bg-raised;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.sidebar-item-active::before {
|
|
200
|
+
content: '';
|
|
201
|
+
position: absolute;
|
|
202
|
+
left: 0;
|
|
203
|
+
top: 8px;
|
|
204
|
+
bottom: 8px;
|
|
205
|
+
width: 2px;
|
|
206
|
+
border-radius: 2px;
|
|
207
|
+
background: rgb(var(--accent));
|
|
208
|
+
animation: scalein 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.nav-item {
|
|
212
|
+
@apply flex h-8 w-full items-center gap-2.5 rounded-lg px-2.5 text-left text-[13px] text-muted transition-all duration-150 hover:bg-raised/80 hover:text-ink active:scale-[0.99];
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* Popovers, composer, modals. */
|
|
216
|
+
.surface-lift {
|
|
217
|
+
background: rgb(var(--panel));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.chat-text {
|
|
221
|
+
font-size: var(--chat-font-size, 15px);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.settings-row {
|
|
225
|
+
@apply flex flex-col gap-2 border-b border-line py-4 last:border-b-0 sm:flex-row sm:items-center sm:justify-between sm:gap-6;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.settings-label {
|
|
229
|
+
@apply text-[13px] font-medium text-ink;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.settings-hint {
|
|
233
|
+
@apply mt-0.5 text-[12px] leading-relaxed text-muted;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.settings-select {
|
|
237
|
+
@apply h-9 shrink-0 rounded-lg border border-line bg-panel px-2.5 text-[12.5px] text-ink outline-none transition-colors focus:border-accent/60;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* Markdown */
|
|
242
|
+
|
|
243
|
+
.md {
|
|
244
|
+
@apply font-sans leading-[1.72] text-ink;
|
|
245
|
+
font-size: var(--chat-font-size, 15px);
|
|
246
|
+
font-feature-settings: 'kern' 1, 'liga' 1;
|
|
247
|
+
word-break: break-word;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.md p,
|
|
251
|
+
.md li {
|
|
252
|
+
text-wrap: pretty;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.md h1,
|
|
256
|
+
.md h2,
|
|
257
|
+
.md h3,
|
|
258
|
+
.md h4 {
|
|
259
|
+
text-wrap: balance;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.md > :first-child {
|
|
263
|
+
margin-top: 0;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.md > :last-child {
|
|
267
|
+
margin-bottom: 0;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.md p {
|
|
271
|
+
margin: 0.7em 0;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.md h1,
|
|
275
|
+
.md h2,
|
|
276
|
+
.md h3,
|
|
277
|
+
.md h4 {
|
|
278
|
+
@apply font-semibold tracking-[-0.02em] text-ink;
|
|
279
|
+
margin: 1.4em 0 0.55em;
|
|
280
|
+
line-height: 1.3;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.md h1,
|
|
284
|
+
.md h2 {
|
|
285
|
+
@apply font-semibold;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.md h1 {
|
|
289
|
+
font-size: 1.45em;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.md h2 {
|
|
293
|
+
font-size: 1.22em;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.md h3 {
|
|
297
|
+
@apply font-semibold;
|
|
298
|
+
font-size: 1.08em;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.md h4 {
|
|
302
|
+
@apply font-semibold;
|
|
303
|
+
font-size: 1em;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.md ul,
|
|
307
|
+
.md ol {
|
|
308
|
+
margin: 0.65em 0;
|
|
309
|
+
padding-left: 1.35em;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.md ul {
|
|
313
|
+
list-style: disc;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.md ol {
|
|
317
|
+
list-style: decimal;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.md li {
|
|
321
|
+
margin: 0.28em 0;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.md li > p {
|
|
325
|
+
margin: 0.25em 0;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.md li::marker {
|
|
329
|
+
color: rgb(var(--faint));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.md a {
|
|
333
|
+
@apply text-accent underline decoration-accent/30 underline-offset-2 transition-colors hover:decoration-accent;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.md strong {
|
|
337
|
+
@apply font-semibold text-ink;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.md code {
|
|
341
|
+
@apply rounded-[5px] bg-raised px-[0.36em] py-[0.12em] font-mono text-[0.845em] text-ink;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.md pre code {
|
|
345
|
+
background: transparent;
|
|
346
|
+
padding: 0;
|
|
347
|
+
border-radius: 0;
|
|
348
|
+
font-size: inherit;
|
|
349
|
+
color: inherit;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.md blockquote {
|
|
353
|
+
margin: 0.9em 0;
|
|
354
|
+
border-left: 2px solid rgb(var(--accent) / 0.35);
|
|
355
|
+
padding: 0.15em 0 0.15em 0.9em;
|
|
356
|
+
color: rgb(var(--muted));
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.md hr {
|
|
360
|
+
margin: 1.5em 0;
|
|
361
|
+
border: 0;
|
|
362
|
+
border-top: 1px solid rgb(var(--line));
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.md table {
|
|
366
|
+
margin: 1em 0;
|
|
367
|
+
width: 100%;
|
|
368
|
+
border-collapse: collapse;
|
|
369
|
+
font-size: 0.9em;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
.md th,
|
|
373
|
+
.md td {
|
|
374
|
+
border: 1px solid rgb(var(--line));
|
|
375
|
+
padding: 0.45em 0.7em;
|
|
376
|
+
text-align: left;
|
|
377
|
+
vertical-align: top;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
.md th {
|
|
381
|
+
@apply bg-raised/70 font-medium;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
.md input[type='checkbox'] {
|
|
385
|
+
margin-right: 0.4em;
|
|
386
|
+
accent-color: rgb(var(--accent));
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.md img {
|
|
390
|
+
max-width: 100%;
|
|
391
|
+
border-radius: 10px;
|
|
392
|
+
border: 1px solid rgb(var(--line));
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.code-shell {
|
|
396
|
+
@apply my-4 overflow-hidden rounded-xl border border-line;
|
|
397
|
+
background: rgb(var(--canvas));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.code-head {
|
|
401
|
+
@apply flex h-9 items-center justify-between border-b border-line/70 bg-raised/40 px-3;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
.code-lang {
|
|
405
|
+
@apply font-mono text-[10.5px] tracking-wide text-faint;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
.code-pre {
|
|
409
|
+
@apply overflow-x-auto p-3.5 font-mono text-[12.5px] leading-[1.7];
|
|
410
|
+
tab-size: 2;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.code-pre code {
|
|
414
|
+
background: transparent !important;
|
|
415
|
+
padding: 0 !important;
|
|
416
|
+
font-size: inherit !important;
|
|
417
|
+
white-space: pre;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
.hljs {
|
|
421
|
+
color: rgb(var(--ink));
|
|
422
|
+
background: transparent;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.hljs-comment,
|
|
426
|
+
.hljs-quote {
|
|
427
|
+
color: rgb(var(--faint));
|
|
428
|
+
font-style: italic;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
.hljs-keyword,
|
|
432
|
+
.hljs-selector-tag,
|
|
433
|
+
.hljs-literal,
|
|
434
|
+
.hljs-type {
|
|
435
|
+
color: rgb(var(--syn-keyword));
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.hljs-string,
|
|
439
|
+
.hljs-regexp,
|
|
440
|
+
.hljs-addition {
|
|
441
|
+
color: rgb(var(--syn-string));
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.hljs-number,
|
|
445
|
+
.hljs-symbol,
|
|
446
|
+
.hljs-bullet {
|
|
447
|
+
color: rgb(var(--syn-number));
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
.hljs-title,
|
|
451
|
+
.hljs-section,
|
|
452
|
+
.hljs-name,
|
|
453
|
+
.hljs-selector-id,
|
|
454
|
+
.hljs-selector-class {
|
|
455
|
+
color: rgb(var(--syn-title));
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.hljs-attr,
|
|
459
|
+
.hljs-attribute,
|
|
460
|
+
.hljs-variable,
|
|
461
|
+
.hljs-template-variable,
|
|
462
|
+
.hljs-property {
|
|
463
|
+
color: rgb(var(--syn-attr));
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.hljs-built_in,
|
|
467
|
+
.hljs-class .hljs-title {
|
|
468
|
+
color: rgb(var(--syn-title));
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.hljs-meta,
|
|
472
|
+
.hljs-deletion {
|
|
473
|
+
color: rgb(var(--danger));
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/* Scrollbars */
|
|
477
|
+
|
|
478
|
+
.thin-scroll {
|
|
479
|
+
scrollbar-width: thin;
|
|
480
|
+
scrollbar-color: rgb(var(--line)) transparent;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.thin-scroll::-webkit-scrollbar {
|
|
484
|
+
width: 10px;
|
|
485
|
+
height: 10px;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
.thin-scroll::-webkit-scrollbar-track {
|
|
489
|
+
background: transparent;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.thin-scroll::-webkit-scrollbar-thumb {
|
|
493
|
+
border: 3px solid transparent;
|
|
494
|
+
border-radius: 999px;
|
|
495
|
+
background-clip: content-box;
|
|
496
|
+
background-color: rgb(var(--line));
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
.thin-scroll::-webkit-scrollbar-thumb:hover {
|
|
500
|
+
background-color: rgb(var(--faint) / 0.6);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/* Utilities */
|
|
504
|
+
|
|
505
|
+
.hero-wash {
|
|
506
|
+
background: radial-gradient(60% 50% at 50% 0%, rgb(var(--accent) / 0.07), transparent 70%);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
.bg-dots {
|
|
510
|
+
background-image: radial-gradient(rgb(var(--faint) / 0.28) 1px, transparent 1px);
|
|
511
|
+
background-size: 24px 24px;
|
|
512
|
+
-webkit-mask-image: radial-gradient(70% 60% at 50% 30%, #000 10%, transparent 75%);
|
|
513
|
+
mask-image: radial-gradient(70% 60% at 50% 30%, #000 10%, transparent 75%);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
.ambient-blob {
|
|
517
|
+
position: absolute;
|
|
518
|
+
border-radius: 9999px;
|
|
519
|
+
filter: blur(64px);
|
|
520
|
+
opacity: 0.35;
|
|
521
|
+
pointer-events: none;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.card-lift {
|
|
525
|
+
transition:
|
|
526
|
+
transform 0.3s cubic-bezier(0.16, 1, 0.3, 1),
|
|
527
|
+
box-shadow 0.3s ease,
|
|
528
|
+
border-color 0.2s ease,
|
|
529
|
+
background-color 0.2s ease;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
.card-lift:hover {
|
|
533
|
+
transform: translateY(-2px);
|
|
534
|
+
box-shadow: 0 14px 32px -20px rgba(0, 0, 0, 0.3);
|
|
535
|
+
border-color: rgb(var(--faint) / 0.4);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
@keyframes glow-pulse {
|
|
539
|
+
0%,
|
|
540
|
+
100% {
|
|
541
|
+
box-shadow: 0 0 0 0 rgb(var(--accent) / 0.2);
|
|
542
|
+
}
|
|
543
|
+
50% {
|
|
544
|
+
box-shadow: 0 0 0 7px rgb(var(--accent) / 0);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
.composer-glow {
|
|
549
|
+
animation: glow-pulse 1.9s ease-out infinite;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
.composer-shadow {
|
|
553
|
+
box-shadow:
|
|
554
|
+
0 1px 2px rgba(0, 0, 0, 0.04),
|
|
555
|
+
0 10px 30px -14px rgba(0, 0, 0, 0.14);
|
|
556
|
+
transition:
|
|
557
|
+
box-shadow 0.25s ease,
|
|
558
|
+
border-color 0.25s ease;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
.composer-shadow:focus-within {
|
|
562
|
+
border-color: rgb(var(--accent) / 0.45);
|
|
563
|
+
box-shadow:
|
|
564
|
+
0 0 0 4px rgb(var(--accent) / 0.08),
|
|
565
|
+
0 12px 34px -14px rgba(0, 0, 0, 0.18);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
.dark .composer-shadow {
|
|
569
|
+
box-shadow:
|
|
570
|
+
0 1px 1px rgba(0, 0, 0, 0.4),
|
|
571
|
+
0 16px 40px -16px rgba(0, 0, 0, 0.7);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
.dark .composer-shadow:focus-within {
|
|
575
|
+
box-shadow:
|
|
576
|
+
0 0 0 4px rgb(var(--accent) / 0.1),
|
|
577
|
+
0 16px 40px -16px rgba(0, 0, 0, 0.7);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
.dark .card-lift:hover {
|
|
581
|
+
box-shadow: 0 14px 32px -18px rgba(0, 0, 0, 0.8);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
.modal-panel {
|
|
585
|
+
animation: modal-in 0.28s cubic-bezier(0.16, 1, 0.3, 1) backwards;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
.modal-scrim {
|
|
589
|
+
animation: fade 0.2s ease-out both;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
@keyframes modal-in {
|
|
593
|
+
from {
|
|
594
|
+
opacity: 0;
|
|
595
|
+
transform: translateY(10px) scale(0.98);
|
|
596
|
+
}
|
|
597
|
+
to {
|
|
598
|
+
opacity: 1;
|
|
599
|
+
transform: translateY(0) scale(1);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/* Staggered entrance: children rise in sequence. */
|
|
604
|
+
.stagger > * {
|
|
605
|
+
animation: rise 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
606
|
+
}
|
|
607
|
+
.stagger > *:nth-child(1) { animation-delay: 40ms; }
|
|
608
|
+
.stagger > *:nth-child(2) { animation-delay: 110ms; }
|
|
609
|
+
.stagger > *:nth-child(3) { animation-delay: 180ms; }
|
|
610
|
+
.stagger > *:nth-child(4) { animation-delay: 250ms; }
|
|
611
|
+
.stagger > *:nth-child(5) { animation-delay: 320ms; }
|
|
612
|
+
.stagger > *:nth-child(6) { animation-delay: 390ms; }
|
|
613
|
+
|
|
614
|
+
/* Sun-gradient text for the wordmark / hero line. */
|
|
615
|
+
.text-solar {
|
|
616
|
+
background: linear-gradient(100deg, rgb(var(--ink)) 20%, rgb(var(--accent)) 120%);
|
|
617
|
+
-webkit-background-clip: text;
|
|
618
|
+
background-clip: text;
|
|
619
|
+
color: transparent;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/* Subtle shimmer bar used while loading. */
|
|
623
|
+
.loading-bar {
|
|
624
|
+
position: relative;
|
|
625
|
+
overflow: hidden;
|
|
626
|
+
background: rgb(var(--line));
|
|
627
|
+
}
|
|
628
|
+
.loading-bar::after {
|
|
629
|
+
content: '';
|
|
630
|
+
position: absolute;
|
|
631
|
+
inset: 0;
|
|
632
|
+
width: 40%;
|
|
633
|
+
border-radius: inherit;
|
|
634
|
+
background: linear-gradient(90deg, transparent, rgb(var(--accent)), transparent);
|
|
635
|
+
animation: sweep 1.4s cubic-bezier(0.65, 0, 0.35, 1) infinite;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/* Splash (boot) */
|
|
639
|
+
.splash {
|
|
640
|
+
position: fixed;
|
|
641
|
+
inset: 0;
|
|
642
|
+
z-index: 200;
|
|
643
|
+
display: flex;
|
|
644
|
+
align-items: center;
|
|
645
|
+
justify-content: center;
|
|
646
|
+
background: rgb(var(--panel));
|
|
647
|
+
transition:
|
|
648
|
+
opacity 0.5s ease,
|
|
649
|
+
transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
|
|
650
|
+
filter 0.5s ease;
|
|
651
|
+
}
|
|
652
|
+
.splash.is-leaving {
|
|
653
|
+
opacity: 0;
|
|
654
|
+
transform: scale(1.03);
|
|
655
|
+
filter: blur(6px);
|
|
656
|
+
pointer-events: none;
|
|
657
|
+
}
|
|
658
|
+
.splash-sun .ray {
|
|
659
|
+
stroke-dasharray: 8;
|
|
660
|
+
stroke-dashoffset: 8;
|
|
661
|
+
animation: draw 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
|
662
|
+
}
|
|
663
|
+
.splash-sun .core {
|
|
664
|
+
transform-origin: 32px 32px;
|
|
665
|
+
animation: core-in 0.7s cubic-bezier(0.34, 1.56, 0.64, 1) both;
|
|
666
|
+
}
|
|
667
|
+
.splash-sun .rays {
|
|
668
|
+
transform-origin: 32px 32px;
|
|
669
|
+
animation: spinslow 14s linear infinite;
|
|
670
|
+
}
|
|
671
|
+
.splash-word span {
|
|
672
|
+
display: inline-block;
|
|
673
|
+
opacity: 0;
|
|
674
|
+
animation: blurin 0.7s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
|
675
|
+
}
|
|
676
|
+
@keyframes draw {
|
|
677
|
+
to {
|
|
678
|
+
stroke-dashoffset: 0;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
@keyframes core-in {
|
|
682
|
+
from {
|
|
683
|
+
transform: scale(0);
|
|
684
|
+
opacity: 0;
|
|
685
|
+
}
|
|
686
|
+
to {
|
|
687
|
+
transform: scale(1);
|
|
688
|
+
opacity: 1;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
@keyframes spinslow {
|
|
692
|
+
to {
|
|
693
|
+
transform: rotate(360deg);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
.md.is-streaming > :last-child::after {
|
|
698
|
+
content: '';
|
|
699
|
+
display: inline-block;
|
|
700
|
+
width: 7px;
|
|
701
|
+
height: 1.05em;
|
|
702
|
+
margin-left: 2px;
|
|
703
|
+
border-radius: 2px;
|
|
704
|
+
vertical-align: -0.16em;
|
|
705
|
+
background: rgb(var(--accent));
|
|
706
|
+
animation: caret 1.1s ease-in-out infinite;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
@keyframes caret {
|
|
710
|
+
0%,
|
|
711
|
+
100% {
|
|
712
|
+
opacity: 1;
|
|
713
|
+
}
|
|
714
|
+
50% {
|
|
715
|
+
opacity: 0.15;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
@media (prefers-reduced-motion: reduce) {
|
|
720
|
+
*,
|
|
721
|
+
*::before,
|
|
722
|
+
*::after {
|
|
723
|
+
animation-duration: 0.01ms !important;
|
|
724
|
+
animation-iteration-count: 1 !important;
|
|
725
|
+
scroll-behavior: auto !important;
|
|
726
|
+
transition-duration: 0.01ms !important;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/* PixleSol ray twinkle — two ray sets alternate in hard steps (pixel-art feel). */
|
|
731
|
+
.pxs-a {
|
|
732
|
+
animation: px-a 1s steps(1) infinite;
|
|
733
|
+
}
|
|
734
|
+
.pxs-b {
|
|
735
|
+
animation: px-b 1s steps(1) infinite;
|
|
736
|
+
}
|
|
737
|
+
@keyframes px-a {
|
|
738
|
+
0%, 100% { opacity: 1; }
|
|
739
|
+
50% { opacity: 0.25; }
|
|
740
|
+
}
|
|
741
|
+
@keyframes px-b {
|
|
742
|
+
0%, 100% { opacity: 0.25; }
|
|
743
|
+
50% { opacity: 1; }
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/* Moving highlight across text while something is running. */
|
|
747
|
+
.text-shimmer {
|
|
748
|
+
background: linear-gradient(90deg, rgb(var(--muted)) 0%, rgb(var(--ink)) 45%, rgb(var(--accent)) 50%, rgb(var(--ink)) 55%, rgb(var(--muted)) 100%);
|
|
749
|
+
background-size: 250% 100%;
|
|
750
|
+
-webkit-background-clip: text;
|
|
751
|
+
background-clip: text;
|
|
752
|
+
color: transparent;
|
|
753
|
+
animation: shimmer 2.2s linear infinite;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
/* PixleSol eyes: blink and scan in hard steps so the pixels never blur. */
|
|
757
|
+
.pxs-blink,
|
|
758
|
+
.pxs-scan {
|
|
759
|
+
transform-box: fill-box;
|
|
760
|
+
transform-origin: center;
|
|
761
|
+
}
|
|
762
|
+
.pxs-blink {
|
|
763
|
+
animation: px-blink 4.2s steps(1) infinite;
|
|
764
|
+
}
|
|
765
|
+
.pxs-scan {
|
|
766
|
+
animation: px-scan 1.2s steps(1) infinite;
|
|
767
|
+
}
|
|
768
|
+
@keyframes px-blink {
|
|
769
|
+
0%, 94%, 100% { transform: scaleY(1); }
|
|
770
|
+
96% { transform: scaleY(0.2); }
|
|
771
|
+
}
|
|
772
|
+
@keyframes px-scan {
|
|
773
|
+
0%, 100% { transform: translateX(-1px); }
|
|
774
|
+
33% { transform: translateX(0); }
|
|
775
|
+
66% { transform: translateX(1px); }
|
|
776
|
+
}
|