clay-server 2.7.1 → 2.8.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 (56) hide show
  1. package/lib/project.js +176 -20
  2. package/lib/public/app.js +846 -92
  3. package/lib/public/apple-touch-icon-dark.png +0 -0
  4. package/lib/public/apple-touch-icon.png +0 -0
  5. package/lib/public/clay-logo.png +0 -0
  6. package/lib/public/css/base.css +10 -0
  7. package/lib/public/css/filebrowser.css +1 -0
  8. package/lib/public/css/home-hub.css +455 -0
  9. package/lib/public/css/icon-strip.css +6 -5
  10. package/lib/public/css/loop.css +86 -29
  11. package/lib/public/css/messages.css +2 -0
  12. package/lib/public/css/mobile-nav.css +38 -12
  13. package/lib/public/css/overlays.css +205 -169
  14. package/lib/public/css/playbook.css +264 -0
  15. package/lib/public/css/profile.css +268 -0
  16. package/lib/public/css/scheduler-modal.css +883 -0
  17. package/lib/public/css/scheduler.css +379 -18
  18. package/lib/public/css/sidebar.css +305 -11
  19. package/lib/public/css/sticky-notes.css +23 -19
  20. package/lib/public/css/stt.css +155 -0
  21. package/lib/public/css/title-bar.css +14 -6
  22. package/lib/public/favicon-banded-32.png +0 -0
  23. package/lib/public/favicon-banded.png +0 -0
  24. package/lib/public/icon-192-dark.png +0 -0
  25. package/lib/public/icon-192.png +0 -0
  26. package/lib/public/icon-512-dark.png +0 -0
  27. package/lib/public/icon-512.png +0 -0
  28. package/lib/public/icon-banded-76.png +0 -0
  29. package/lib/public/icon-banded-96.png +0 -0
  30. package/lib/public/index.html +252 -32
  31. package/lib/public/modules/ascii-logo.js +389 -0
  32. package/lib/public/modules/filebrowser.js +2 -1
  33. package/lib/public/modules/markdown.js +108 -0
  34. package/lib/public/modules/notifications.js +50 -63
  35. package/lib/public/modules/playbook.js +578 -0
  36. package/lib/public/modules/profile.js +357 -0
  37. package/lib/public/modules/project-settings.js +4 -9
  38. package/lib/public/modules/scheduler.js +1620 -34
  39. package/lib/public/modules/server-settings.js +1 -1
  40. package/lib/public/modules/sidebar.js +378 -31
  41. package/lib/public/modules/sticky-notes.js +2 -0
  42. package/lib/public/modules/stt.js +272 -0
  43. package/lib/public/modules/terminal.js +32 -0
  44. package/lib/public/modules/theme.js +3 -10
  45. package/lib/public/modules/tools.js +2 -1
  46. package/lib/public/style.css +4 -0
  47. package/lib/public/sw.js +82 -3
  48. package/lib/public/wordmark-banded-20.png +0 -0
  49. package/lib/public/wordmark-banded-32.png +0 -0
  50. package/lib/public/wordmark-banded-64.png +0 -0
  51. package/lib/public/wordmark-banded-80.png +0 -0
  52. package/lib/scheduler.js +43 -3
  53. package/lib/sdk-bridge.js +3 -2
  54. package/lib/server.js +124 -3
  55. package/lib/sessions.js +34 -1
  56. package/package.json +1 -1
Binary file
Binary file
@@ -73,6 +73,16 @@
73
73
  ::-webkit-scrollbar-thumb { background: rgba(var(--overlay-rgb),0.15); border-radius: 3px; }
74
74
  ::-webkit-scrollbar-thumb:hover { background: rgba(var(--overlay-rgb),0.25); }
75
75
 
76
+ /* --- Global Twemoji baseline --- */
77
+ img.emoji {
78
+ height: 1.2em;
79
+ width: 1.2em;
80
+ vertical-align: -0.2em;
81
+ margin: 0 1px;
82
+ display: inline;
83
+ pointer-events: none;
84
+ }
85
+
76
86
  :root {
77
87
  --bg: #282a36;
78
88
  --bg-alt: #363447;
@@ -28,6 +28,7 @@
28
28
 
29
29
  #session-actions button .lucide { width: 16px; height: 16px; flex-shrink: 0; }
30
30
  #session-actions button:hover { background: var(--sidebar-hover); color: var(--text-secondary); }
31
+ #session-actions button.active { background: var(--sidebar-hover); color: var(--text); }
31
32
 
32
33
  .sidebar-badge {
33
34
  background: var(--accent);
@@ -0,0 +1,455 @@
1
+ /* ==========================================================================
2
+ Home Hub — Personalized command center & dashboard
3
+ ========================================================================== */
4
+
5
+ /* Hub covers #main-area (sidebar + chat), sits inside it with absolute */
6
+ #home-hub {
7
+ position: absolute;
8
+ inset: 0;
9
+ display: flex;
10
+ flex-direction: column;
11
+ align-items: center;
12
+ overflow-y: auto;
13
+ background: var(--bg);
14
+ z-index: 200;
15
+ padding: 48px 24px 40px;
16
+ border-top-left-radius: 8px;
17
+ animation: hubFadeIn 0.35s ease;
18
+ }
19
+ /* Close button (X / ESC) */
20
+ .home-hub-close-btn {
21
+ position: absolute;
22
+ top: 16px;
23
+ right: 20px;
24
+ display: flex;
25
+ flex-direction: column;
26
+ align-items: center;
27
+ width: 40px;
28
+ height: 40px;
29
+ border-radius: 50%;
30
+ border: 2px solid var(--text-dimmer);
31
+ background: none;
32
+ color: var(--text-dimmer);
33
+ cursor: pointer;
34
+ padding: 0;
35
+ justify-content: center;
36
+ transition: border-color 0.15s, color 0.15s;
37
+ z-index: 5;
38
+ }
39
+ .home-hub-close-btn .lucide {
40
+ width: 18px;
41
+ height: 18px;
42
+ }
43
+ .home-hub-close-btn span {
44
+ font-size: 10px;
45
+ font-weight: 600;
46
+ letter-spacing: 0.5px;
47
+ position: absolute;
48
+ top: calc(100% + 6px);
49
+ font-family: inherit;
50
+ }
51
+ .home-hub-close-btn:hover {
52
+ border-color: var(--text-secondary);
53
+ color: var(--text-secondary);
54
+ }
55
+ .home-hub-close-btn.hidden {
56
+ display: none;
57
+ }
58
+
59
+ #home-hub.hidden {
60
+ display: none;
61
+ }
62
+
63
+ @keyframes hubFadeIn {
64
+ from { opacity: 0; transform: translateY(8px); }
65
+ to { opacity: 1; transform: translateY(0); }
66
+ }
67
+
68
+ @keyframes hubCardIn {
69
+ from { opacity: 0; transform: translateY(6px); }
70
+ to { opacity: 1; transform: translateY(0); }
71
+ }
72
+
73
+ .home-hub-inner {
74
+ width: 100%;
75
+ max-width: 720px;
76
+ display: flex;
77
+ flex-direction: column;
78
+ gap: 14px;
79
+ }
80
+
81
+
82
+ /* --- Greeting --- */
83
+ .hub-greeting {
84
+ text-align: center;
85
+ padding: 8px 0 4px;
86
+ }
87
+ .hub-greeting h1 {
88
+ font-size: 28px;
89
+ font-weight: 700;
90
+ color: var(--text);
91
+ margin: 0;
92
+ letter-spacing: -0.5px;
93
+ }
94
+ .hub-greeting p {
95
+ font-size: 14px;
96
+ color: var(--text-muted);
97
+ margin: 6px 0 0;
98
+ font-weight: 400;
99
+ }
100
+ /* Twemoji sizing inherited from global img.emoji in base.css */
101
+
102
+ /* --- Card base --- */
103
+ .hub-card {
104
+ background: var(--bg-alt);
105
+ border: 1px solid var(--border-subtle);
106
+ border-radius: 12px;
107
+ padding: 16px;
108
+ }
109
+ .hub-card-header {
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: space-between;
113
+ margin-bottom: 12px;
114
+ }
115
+ .hub-card-title {
116
+ font-size: 12px;
117
+ font-weight: 600;
118
+ text-transform: uppercase;
119
+ letter-spacing: 0.6px;
120
+ color: var(--text-muted);
121
+ }
122
+ .hub-card-count {
123
+ font-size: 11px;
124
+ font-weight: 600;
125
+ color: var(--accent);
126
+ background: var(--accent-12);
127
+ padding: 2px 8px;
128
+ border-radius: 10px;
129
+ }
130
+
131
+ /* --- Two-column layout --- */
132
+ .hub-columns {
133
+ display: grid;
134
+ grid-template-columns: 1fr 1fr;
135
+ gap: 12px;
136
+ animation: hubCardIn 0.4s ease 0.08s both;
137
+ }
138
+
139
+ /* --- Upcoming tasks --- */
140
+ .hub-upcoming-list {
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: 2px;
144
+ }
145
+ .hub-upcoming-item {
146
+ display: flex;
147
+ align-items: center;
148
+ gap: 10px;
149
+ padding: 8px 10px;
150
+ border-radius: 8px;
151
+ cursor: pointer;
152
+ transition: background 0.15s ease;
153
+ }
154
+ .hub-upcoming-item:hover {
155
+ background: rgba(var(--overlay-rgb), 0.06);
156
+ }
157
+ .hub-upcoming-dot {
158
+ width: 8px;
159
+ height: 8px;
160
+ border-radius: 50%;
161
+ flex-shrink: 0;
162
+ background: var(--accent);
163
+ }
164
+ .hub-upcoming-time {
165
+ font-size: 12px;
166
+ font-weight: 500;
167
+ color: var(--text-muted);
168
+ min-width: 56px;
169
+ flex-shrink: 0;
170
+ font-variant-numeric: tabular-nums;
171
+ }
172
+ .hub-upcoming-name {
173
+ font-size: 13px;
174
+ color: var(--text);
175
+ flex: 1;
176
+ min-width: 0;
177
+ overflow: hidden;
178
+ text-overflow: ellipsis;
179
+ white-space: nowrap;
180
+ }
181
+ .hub-upcoming-project {
182
+ font-size: 11px;
183
+ color: var(--text-dimmer);
184
+ flex-shrink: 0;
185
+ max-width: 80px;
186
+ overflow: hidden;
187
+ text-overflow: ellipsis;
188
+ white-space: nowrap;
189
+ }
190
+ .hub-upcoming-more {
191
+ font-size: 12px;
192
+ color: var(--text-dimmer);
193
+ text-align: center;
194
+ padding: 4px 0;
195
+ }
196
+ /* Empty state */
197
+ .hub-upcoming-empty {
198
+ text-align: center;
199
+ padding: 16px 8px;
200
+ }
201
+ .hub-upcoming-empty-icon {
202
+ font-size: 24px;
203
+ margin-bottom: 8px;
204
+ opacity: 0.5;
205
+ }
206
+ .hub-upcoming-empty-text {
207
+ font-size: 13px;
208
+ color: var(--text-dimmer);
209
+ margin-bottom: 12px;
210
+ }
211
+ .hub-upcoming-cta {
212
+ display: inline-flex;
213
+ align-items: center;
214
+ gap: 6px;
215
+ padding: 6px 14px;
216
+ border-radius: 8px;
217
+ border: 1px solid var(--border-subtle);
218
+ background: none;
219
+ color: var(--accent);
220
+ font-size: 12px;
221
+ font-weight: 600;
222
+ cursor: pointer;
223
+ transition: background 0.15s ease, border-color 0.15s ease;
224
+ }
225
+ .hub-upcoming-cta:hover {
226
+ background: var(--accent-12);
227
+ border-color: var(--accent);
228
+ }
229
+ .hub-upcoming-cta svg {
230
+ width: 14px;
231
+ height: 14px;
232
+ }
233
+
234
+ /* --- Projects summary --- */
235
+ .hub-projects-list {
236
+ display: flex;
237
+ flex-direction: column;
238
+ gap: 2px;
239
+ }
240
+ .hub-project-item {
241
+ display: flex;
242
+ align-items: center;
243
+ gap: 10px;
244
+ padding: 8px 10px;
245
+ border-radius: 8px;
246
+ cursor: pointer;
247
+ transition: background 0.15s ease;
248
+ }
249
+ .hub-project-item:hover {
250
+ background: rgba(var(--overlay-rgb), 0.06);
251
+ }
252
+ .hub-project-dot {
253
+ width: 8px;
254
+ height: 8px;
255
+ border-radius: 50%;
256
+ flex-shrink: 0;
257
+ background: var(--text-dimmer);
258
+ transition: background 0.3s ease;
259
+ }
260
+ .hub-project-dot.processing {
261
+ background: var(--success);
262
+ box-shadow: 0 0 6px rgba(80, 250, 123, 0.4);
263
+ }
264
+ .hub-project-icon {
265
+ font-size: 14px;
266
+ width: 20px;
267
+ text-align: center;
268
+ flex-shrink: 0;
269
+ }
270
+ .hub-project-name {
271
+ font-size: 13px;
272
+ color: var(--text);
273
+ flex: 1;
274
+ min-width: 0;
275
+ overflow: hidden;
276
+ text-overflow: ellipsis;
277
+ white-space: nowrap;
278
+ }
279
+ .hub-project-sessions {
280
+ font-size: 11px;
281
+ color: var(--text-dimmer);
282
+ background: rgba(var(--overlay-rgb), 0.06);
283
+ padding: 2px 7px;
284
+ border-radius: 8px;
285
+ flex-shrink: 0;
286
+ }
287
+
288
+ /* --- Week strip --- */
289
+ .hub-week {
290
+ animation: hubCardIn 0.4s ease 0.16s both;
291
+ }
292
+ .hub-week-strip {
293
+ display: grid;
294
+ grid-template-columns: repeat(7, 1fr);
295
+ gap: 4px;
296
+ text-align: center;
297
+ }
298
+ .hub-week-day {
299
+ display: flex;
300
+ flex-direction: column;
301
+ align-items: center;
302
+ gap: 4px;
303
+ padding: 8px 4px;
304
+ border-radius: 10px;
305
+ cursor: default;
306
+ transition: background 0.15s ease;
307
+ }
308
+ .hub-week-day:hover {
309
+ background: rgba(var(--overlay-rgb), 0.04);
310
+ }
311
+ .hub-week-day.today {
312
+ background: var(--accent-12);
313
+ }
314
+ .hub-week-day.today .hub-week-num {
315
+ background: var(--accent);
316
+ color: var(--bg);
317
+ border-radius: 50%;
318
+ width: 28px;
319
+ height: 28px;
320
+ display: flex;
321
+ align-items: center;
322
+ justify-content: center;
323
+ }
324
+ .hub-week-label {
325
+ font-size: 11px;
326
+ font-weight: 500;
327
+ color: var(--text-dimmer);
328
+ text-transform: uppercase;
329
+ letter-spacing: 0.3px;
330
+ }
331
+ .hub-week-num {
332
+ font-size: 14px;
333
+ font-weight: 600;
334
+ color: var(--text);
335
+ width: 28px;
336
+ height: 28px;
337
+ display: flex;
338
+ align-items: center;
339
+ justify-content: center;
340
+ }
341
+ .hub-week-dots {
342
+ display: flex;
343
+ gap: 3px;
344
+ justify-content: center;
345
+ min-height: 6px;
346
+ }
347
+ .hub-week-dot {
348
+ width: 5px;
349
+ height: 5px;
350
+ border-radius: 50%;
351
+ background: var(--accent);
352
+ }
353
+
354
+ /* --- Tip Card --- */
355
+ .hub-tip {
356
+ background: var(--bg-alt);
357
+ border: 1px solid var(--border-subtle);
358
+ border-radius: 12px;
359
+ padding: 16px 18px;
360
+ display: flex;
361
+ align-items: flex-start;
362
+ gap: 12px;
363
+ animation: hubCardIn 0.4s ease 0.24s both;
364
+ }
365
+ .hub-tip-icon {
366
+ flex-shrink: 0;
367
+ width: 32px;
368
+ height: 32px;
369
+ border-radius: 8px;
370
+ background: var(--accent-12);
371
+ display: flex;
372
+ align-items: center;
373
+ justify-content: center;
374
+ font-size: 16px;
375
+ }
376
+ .hub-tip-body {
377
+ flex: 1;
378
+ min-width: 0;
379
+ }
380
+ .hub-tip-label {
381
+ font-size: 11px;
382
+ font-weight: 600;
383
+ text-transform: uppercase;
384
+ letter-spacing: 0.5px;
385
+ color: var(--accent);
386
+ margin-bottom: 4px;
387
+ }
388
+ .hub-tip-text {
389
+ font-size: 13.5px;
390
+ line-height: 1.5;
391
+ color: var(--text-secondary);
392
+ }
393
+ .hub-tip-nav {
394
+ flex-shrink: 0;
395
+ display: flex;
396
+ gap: 2px;
397
+ align-items: center;
398
+ }
399
+ .hub-tip-prev,
400
+ .hub-tip-next {
401
+ background: none;
402
+ border: none;
403
+ color: var(--text-dimmer);
404
+ cursor: pointer;
405
+ padding: 4px;
406
+ border-radius: 6px;
407
+ transition: color 0.15s, background 0.15s;
408
+ display: flex;
409
+ align-items: center;
410
+ justify-content: center;
411
+ }
412
+ .hub-tip-prev:hover,
413
+ .hub-tip-next:hover {
414
+ color: var(--text-muted);
415
+ background: rgba(var(--overlay-rgb), 0.06);
416
+ }
417
+ .hub-tip-prev svg,
418
+ .hub-tip-next svg {
419
+ width: 14px;
420
+ height: 14px;
421
+ }
422
+
423
+ /* Hide user island when hub is visible */
424
+ #main-area:has(#home-hub:not(.hidden)) ~ #user-island,
425
+ #layout-body:has(#home-hub:not(.hidden)) #user-island {
426
+ opacity: 0;
427
+ pointer-events: none;
428
+ transition: opacity 0.2s ease;
429
+ }
430
+
431
+ /* --- Mobile --- */
432
+ @media (max-width: 768px) {
433
+ #home-hub {
434
+ padding: 32px 16px 32px;
435
+ }
436
+ .hub-greeting h1 {
437
+ font-size: 22px;
438
+ }
439
+ .home-hub-inner {
440
+ max-width: 100%;
441
+ }
442
+ .hub-columns {
443
+ grid-template-columns: 1fr;
444
+ }
445
+ .hub-week-label {
446
+ font-size: 10px;
447
+ }
448
+ .hub-week-num {
449
+ font-size: 13px;
450
+ }
451
+ }
452
+
453
+ /* ==========================================================================
454
+ (Certificate section removed — now handled by Trust Certificate playbook)
455
+ ========================================================================== */
@@ -52,7 +52,7 @@
52
52
  object-fit: cover;
53
53
  }
54
54
 
55
- .icon-strip-home:hover .footer-mascot {
55
+ .icon-strip-home:hover .icon-strip-logo {
56
56
  opacity: 0.8;
57
57
  }
58
58
 
@@ -411,10 +411,11 @@
411
411
  width: 22px;
412
412
  height: 22px;
413
413
  filter:
414
- drop-shadow(1px 0 0 rgba(0,0,0,0.18))
415
- drop-shadow(-1px 0 0 rgba(0,0,0,0.18))
416
- drop-shadow(0 1px 0 rgba(0,0,0,0.18))
417
- drop-shadow(0 -1px 0 rgba(0,0,0,0.18));
414
+ drop-shadow(1px 0 0 rgba(0,0,0,0.25))
415
+ drop-shadow(-1px 0 0 rgba(0,0,0,0.25))
416
+ drop-shadow(0 1px 0 rgba(0,0,0,0.25))
417
+ drop-shadow(0 -1px 0 rgba(0,0,0,0.25))
418
+ drop-shadow(0 0 4px rgba(255,255,255,0.35));
418
419
  }
419
420
 
420
421
  /* --- Project context menu --- */
@@ -40,13 +40,7 @@
40
40
  }
41
41
  /* Ralph Loop sidebar section */
42
42
  #ralph-loop-section {
43
- border-left: 3px solid var(--accent);
44
- background: rgba(var(--overlay-rgb), 0.03);
45
- padding: 8px 12px;
46
- margin: 0 8px;
47
- border-radius: 6px;
48
- border-bottom: 1px solid var(--border);
49
- margin-bottom: 4px;
43
+ display: none;
50
44
  }
51
45
  .ralph-section-inner {
52
46
  display: flex;
@@ -699,10 +693,72 @@
699
693
  flex-direction: column;
700
694
  box-shadow: 0 8px 32px rgba(var(--shadow-rgb, 0,0,0), 0.5);
701
695
  }
696
+
697
+ /* Header — matches scheduler-detail-header */
698
+ .ralph-preview-header {
699
+ display: flex;
700
+ align-items: center;
701
+ gap: 12px;
702
+ padding: 16px 20px;
703
+ border-bottom: 1px solid rgba(var(--overlay-rgb, 0,0,0), 0.06);
704
+ flex-shrink: 0;
705
+ }
706
+ .ralph-preview-name {
707
+ font-weight: 700;
708
+ font-size: 16px;
709
+ color: var(--text);
710
+ flex: 1;
711
+ overflow: hidden;
712
+ text-overflow: ellipsis;
713
+ white-space: nowrap;
714
+ }
715
+ .ralph-preview-actions {
716
+ display: flex;
717
+ gap: 6px;
718
+ flex-shrink: 0;
719
+ }
720
+ .ralph-preview-action-btn {
721
+ display: inline-flex;
722
+ align-items: center;
723
+ gap: 5px;
724
+ background: var(--bg-alt);
725
+ border: 1px solid var(--border);
726
+ color: var(--text-secondary);
727
+ cursor: pointer;
728
+ padding: 5px 12px;
729
+ border-radius: 6px;
730
+ font-size: 12px;
731
+ font-weight: 600;
732
+ font-family: inherit;
733
+ transition: background 0.12s, color 0.12s, opacity 0.12s;
734
+ }
735
+ .ralph-preview-action-btn .lucide { width: 13px; height: 13px; }
736
+ .ralph-preview-action-btn:hover { background: var(--hover, rgba(var(--overlay-rgb), 0.06)); color: var(--text); }
737
+ .ralph-preview-action-btn.primary { background: var(--accent); color: #fff; border-color: var(--accent); }
738
+ .ralph-preview-action-btn.primary:hover { opacity: 0.9; }
739
+ .ralph-preview-action-btn:disabled { opacity: 0.4; pointer-events: none; }
740
+ .ralph-preview-action-icon {
741
+ display: flex;
742
+ align-items: center;
743
+ justify-content: center;
744
+ width: 30px;
745
+ height: 30px;
746
+ border: 1px solid var(--border);
747
+ border-radius: 6px;
748
+ background: none;
749
+ color: var(--text-muted);
750
+ cursor: pointer;
751
+ transition: background 0.12s, color 0.12s, border-color 0.12s;
752
+ }
753
+ .ralph-preview-action-icon .lucide { width: 14px; height: 14px; }
754
+ .ralph-preview-action-icon:hover { background: color-mix(in srgb, var(--error) 12%, transparent); color: var(--error); border-color: var(--error); }
755
+
756
+ /* Tabs */
702
757
  .ralph-preview-tabs {
703
758
  display: flex;
704
- border-bottom: 1px solid var(--border, #333);
705
- padding: 0 16px;
759
+ border-bottom: 1px solid rgba(var(--overlay-rgb, 0,0,0), 0.06);
760
+ padding: 0 20px;
761
+ flex-shrink: 0;
706
762
  }
707
763
  .ralph-tab {
708
764
  padding: 10px 16px;
@@ -712,8 +768,9 @@
712
768
  color: var(--text-secondary, #999);
713
769
  cursor: pointer;
714
770
  font-size: 13px;
715
- font-weight: 500;
716
- transition: color 0.15s, border-color 0.15s;
771
+ font-weight: 600;
772
+ font-family: inherit;
773
+ transition: color 0.12s, border-color 0.12s;
717
774
  }
718
775
  .ralph-tab:hover {
719
776
  color: var(--text, #fff);
@@ -722,10 +779,12 @@
722
779
  color: var(--text, #fff);
723
780
  border-bottom-color: var(--accent, #6c5ce7);
724
781
  }
782
+
783
+ /* Body */
725
784
  .ralph-preview-body {
726
785
  flex: 1;
727
786
  overflow-y: auto;
728
- padding: 16px 20px;
787
+ padding: 20px 24px;
729
788
  font-size: 13px;
730
789
  line-height: 1.6;
731
790
  color: var(--text, #fff);
@@ -742,10 +801,6 @@
742
801
  font-family: var(--font-mono, monospace);
743
802
  font-size: 12px;
744
803
  }
745
- .ralph-preview-dialog > .ralph-btn {
746
- margin: 0 16px 12px;
747
- align-self: flex-end;
748
- }
749
804
 
750
805
  /* Ralph Sticky (title-bar island, mirrors #todo-sticky pattern) */
751
806
  #ralph-sticky {
@@ -769,27 +824,29 @@
769
824
  user-select: none;
770
825
  }
771
826
  #ralph-sticky .ralph-sticky-header:hover { background: rgba(var(--overlay-rgb), 0.03); border-radius: 10px; }
827
+ #ralph-sticky .ralph-sticky-inner {
828
+ border-color: color-mix(in srgb, var(--accent, #6c5ce7) 40%, var(--border));
829
+ }
772
830
  #ralph-sticky .ralph-sticky-icon { display: inline-flex; color: var(--accent); }
773
831
  #ralph-sticky .ralph-sticky-icon .lucide { width: 14px; height: 14px; }
774
832
  #ralph-sticky .ralph-sticky-label { font-size: 12px; font-weight: 600; color: var(--text-secondary); }
775
- #ralph-sticky .ralph-sticky-status { font-size: 12px; color: var(--text-muted); }
833
+ #ralph-sticky .ralph-sticky-status { font-size: 12px; color: var(--accent); }
776
834
  #ralph-sticky .ralph-sticky-status .lucide { width: 12px; height: 12px; }
777
835
 
778
- /* Ready state — green accent with subtle pulse */
836
+ /* Ready state — accent color with glow */
779
837
  #ralph-sticky.ralph-ready .ralph-sticky-inner {
780
- border-color: var(--success, #27ae60);
838
+ border-color: var(--accent, #6c5ce7);
839
+ box-shadow: 0 0 12px 2px color-mix(in srgb, var(--accent, #6c5ce7) 35%, transparent);
840
+ animation: ralphReadyGlow 2s ease-in-out infinite;
781
841
  }
782
- #ralph-sticky.ralph-ready .ralph-sticky-icon { color: var(--success, #27ae60); }
842
+ #ralph-sticky.ralph-ready .ralph-sticky-icon { color: var(--accent, #6c5ce7); }
783
843
  #ralph-sticky.ralph-ready .ralph-sticky-status {
784
- color: var(--success, #27ae60);
844
+ color: var(--accent, #6c5ce7);
785
845
  font-weight: 600;
786
846
  }
787
- #ralph-sticky.ralph-ready .ralph-sticky-inner {
788
- animation: ralphReadyPulse 2.5s ease-in-out 3;
789
- }
790
- @keyframes ralphReadyPulse {
791
- 0%, 100% { box-shadow: 0 0 0 0 rgba(39, 174, 96, 0); }
792
- 50% { box-shadow: 0 0 8px 2px rgba(39, 174, 96, 0.25); }
847
+ @keyframes ralphReadyGlow {
848
+ 0%, 100% { box-shadow: 0 0 8px 1px color-mix(in srgb, var(--accent, #6c5ce7) 25%, transparent); }
849
+ 50% { box-shadow: 0 0 16px 4px color-mix(in srgb, var(--accent, #6c5ce7) 40%, transparent); }
793
850
  }
794
851
  #ralph-sticky .ralph-sticky-cancel {
795
852
  display: inline-flex;
@@ -823,8 +880,8 @@
823
880
  #ralph-sticky .ralph-sticky-action .lucide { width: 14px; height: 14px; }
824
881
  #ralph-sticky .ralph-sticky-action:hover { color: var(--accent); background: rgba(var(--overlay-rgb), 0.06); }
825
882
  #ralph-sticky .ralph-sticky-action:disabled { opacity: 0.3; cursor: not-allowed; }
826
- #ralph-sticky .ralph-sticky-start { color: var(--success, #27ae60); }
827
- #ralph-sticky .ralph-sticky-start:hover { color: var(--success, #27ae60); background: rgba(39, 174, 96, 0.1); }
883
+ #ralph-sticky .ralph-sticky-start { color: var(--accent, #6c5ce7); }
884
+ #ralph-sticky .ralph-sticky-start:hover { color: var(--accent, #6c5ce7); background: color-mix(in srgb, var(--accent, #6c5ce7) 12%, transparent); }
828
885
  #ralph-sticky .ralph-sticky-dismiss { color: var(--text-muted); margin-left: 0; }
829
886
  #ralph-sticky .ralph-sticky-dismiss:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb), 0.06); }
830
887
 
@@ -247,6 +247,8 @@
247
247
  text-align: start;
248
248
  }
249
249
 
250
+ /* Twemoji sizing inherited from global img.emoji in base.css */
251
+
250
252
  .md-content p { margin-bottom: 14px; }
251
253
  .md-content p:last-child { margin-bottom: 0; }
252
254