@ammduncan/easel 0.2.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.
@@ -0,0 +1,717 @@
1
+ /* ============================================================
2
+ easel viewer — design tokens (light + dark)
3
+ Pushed iframes receive the same variable names so authors can
4
+ reference `var(--ds-ink)` etc. and theme for free.
5
+ ============================================================ */
6
+
7
+ /* =========================================================================
8
+ Design tokens — three presets × two modes.
9
+ Active = [data-preset][data-theme] on :root, both set by viewer.js bootstrap.
10
+ ========================================================================= */
11
+
12
+ /* --- SLATE (light) --- cool neutral, warm putty page */
13
+ :root[data-preset="slate"][data-theme="light"] {
14
+ --ds-bg: #ecebe5;
15
+ --ds-bg-elev: #f6f4ee;
16
+ --ds-surface: #f6f4ee;
17
+ --ds-surface-soft: #ecebe3;
18
+ --ds-ink: #1a1916;
19
+ --ds-ink-soft: #34322d;
20
+ --ds-muted: #76746c;
21
+ --ds-line: #d8d5cb;
22
+ --ds-line-soft: #e1ddd2;
23
+ --ds-accent: #2f5fd1;
24
+ --ds-accent-soft: #e4ebfb;
25
+ --ds-accent-ink: #ffffff;
26
+ --ds-success: #0f9d6b;
27
+ --ds-danger: #d64545;
28
+ --ds-shadow-sm: 0 1px 2px rgba(40, 30, 10, 0.05);
29
+ --ds-shadow-md: 0 1px 2px rgba(40, 30, 10, 0.05), 0 16px 32px rgba(40, 30, 10, 0.08);
30
+ --ds-code-bg: #1c1b18;
31
+ --ds-code-ink: #f1ede1;
32
+ --ds-topbar-bg: rgba(236, 235, 229, 0.85);
33
+ --ds-topbar-border: rgba(40, 30, 10, 0.1);
34
+ --ds-pattern-dot: rgba(40, 30, 10, 0.085);
35
+ --ds-canvas-bg-image: none;
36
+ color-scheme: light;
37
+ }
38
+
39
+ /* --- SLATE (dark) --- cool neutral, cyan accent */
40
+ :root[data-preset="slate"][data-theme="dark"] {
41
+ --ds-bg: #0c0d10;
42
+ --ds-bg-elev: #15171c;
43
+ --ds-surface: #15171c;
44
+ --ds-surface-soft: #1c1f25;
45
+ --ds-ink: #f5f5f5;
46
+ --ds-ink-soft: #d4d4d8;
47
+ --ds-muted: #9ca3af;
48
+ --ds-line: #23262d;
49
+ --ds-line-soft: #1c1f25;
50
+ --ds-accent: #7dd3fc;
51
+ --ds-accent-soft: rgba(125, 211, 252, 0.16);
52
+ --ds-accent-ink: #07242e;
53
+ --ds-success: #34d399;
54
+ --ds-danger: #f87171;
55
+ --ds-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);
56
+ --ds-shadow-md: 0 1px 2px rgba(0, 0, 0, 0.4), 0 12px 28px rgba(0, 0, 0, 0.45);
57
+ --ds-code-bg: #07080a;
58
+ --ds-code-ink: #f5f5f5;
59
+ --ds-topbar-bg: rgba(20, 22, 27, 0.8);
60
+ --ds-topbar-border: rgba(255, 255, 255, 0.06);
61
+ --ds-pattern-dot: rgba(255, 255, 255, 0.045);
62
+ --ds-canvas-bg-image: none;
63
+ color-scheme: dark;
64
+ }
65
+
66
+ /* --- PAPER (light) --- pitstop warm cream + deep amber */
67
+ :root[data-preset="paper"][data-theme="light"] {
68
+ --ds-bg: #f4efe2;
69
+ --ds-bg-elev: #f8f3e6;
70
+ --ds-surface: #faf6ee;
71
+ --ds-surface-soft: #f0ead9;
72
+ --ds-ink: #2a261e;
73
+ --ds-ink-soft: #524b3c;
74
+ --ds-muted: #756c57;
75
+ --ds-line: #d5cdb6;
76
+ --ds-line-soft: #e3dcc6;
77
+ --ds-accent: #c97a1c;
78
+ --ds-accent-soft: #f7e8c0;
79
+ --ds-accent-ink: #ffffff;
80
+ --ds-success: #2d8a4f;
81
+ --ds-danger: #c43e2f;
82
+ --ds-shadow-sm: 0 1px 2px rgba(70, 50, 10, 0.06);
83
+ --ds-shadow-md: 0 1px 2px rgba(70, 50, 10, 0.06), 0 18px 36px rgba(70, 50, 10, 0.1);
84
+ --ds-code-bg: #2a261e;
85
+ --ds-code-ink: #eae5d5;
86
+ --ds-topbar-bg: rgba(244, 239, 226, 0.86);
87
+ --ds-topbar-border: rgba(70, 50, 10, 0.12);
88
+ --ds-pattern-dot: rgba(70, 50, 10, 0.085);
89
+ --ds-canvas-bg-image: none;
90
+ color-scheme: light;
91
+ }
92
+
93
+ /* --- PAPER (dark) --- pitstop warm paper, single amber accent, layered depth */
94
+ :root[data-preset="paper"][data-theme="dark"] {
95
+ --ds-bg: #1c1b18;
96
+ --ds-bg-elev: #25241f;
97
+ --ds-surface: #25241f;
98
+ --ds-surface-soft: #20201c;
99
+ --ds-ink: #ede9e0;
100
+ --ds-ink-soft: #bbb5a8;
101
+ --ds-muted: #888273;
102
+ --ds-line: #423f37;
103
+ --ds-line-soft: #312f29;
104
+ --ds-accent: #f4bf5e;
105
+ --ds-accent-soft: #3d3322;
106
+ --ds-accent-ink: #1f1d18;
107
+ --ds-success: #74ce9a;
108
+ --ds-danger: #e9836b;
109
+ --ds-shadow-sm: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 1px 2px rgba(0, 0, 0, 0.5);
110
+ --ds-shadow-md: inset 0 1px 0 rgba(255, 255, 255, 0.045), 0 1px 2px rgba(0, 0, 0, 0.55), 0 18px 38px rgba(0, 0, 0, 0.45);
111
+ --ds-code-bg: #161514;
112
+ --ds-code-ink: #eae5d5;
113
+ --ds-topbar-bg: rgba(28, 27, 24, 0.85);
114
+ --ds-topbar-border: rgba(255, 255, 255, 0.06);
115
+ --ds-pattern-dot: rgba(255, 255, 255, 0.04);
116
+ --ds-canvas-bg-image: none;
117
+ color-scheme: dark;
118
+ }
119
+
120
+ /* --- AURORA (light) --- soft lavender canvas, violet accent */
121
+ :root[data-preset="aurora"][data-theme="light"] {
122
+ --ds-bg: #f5f3fa;
123
+ --ds-bg-elev: #fafaff;
124
+ --ds-surface: #ffffff;
125
+ --ds-surface-soft: #f0eef7;
126
+ --ds-ink: #1c1d24;
127
+ --ds-ink-soft: #4a4d5a;
128
+ --ds-muted: #7a7d8c;
129
+ --ds-line: #e1dff0;
130
+ --ds-line-soft: #ebe9f5;
131
+ --ds-accent: #6d4eff;
132
+ --ds-accent-soft: #ebe7ff;
133
+ --ds-accent-ink: #ffffff;
134
+ --ds-success: #19a473;
135
+ --ds-danger: #e25555;
136
+ --ds-shadow-sm: 0 1px 2px rgba(60, 50, 120, 0.05);
137
+ --ds-shadow-md: 0 1px 2px rgba(60, 50, 120, 0.05), 0 18px 36px rgba(60, 50, 120, 0.08);
138
+ --ds-code-bg: #1c1d24;
139
+ --ds-code-ink: #ebe7ff;
140
+ --ds-topbar-bg: rgba(245, 243, 250, 0.85);
141
+ --ds-topbar-border: rgba(60, 50, 120, 0.1);
142
+ --ds-pattern-dot: rgba(109, 78, 255, 0.07);
143
+ --ds-canvas-bg-image:
144
+ radial-gradient(60% 40% at 0% 0%, rgba(109, 78, 255, 0.08), transparent 60%),
145
+ radial-gradient(60% 40% at 100% 100%, rgba(70, 200, 255, 0.06), transparent 60%);
146
+ color-scheme: light;
147
+ }
148
+
149
+ /* --- AURORA (dark) --- deep canvas with violet/blue glow halos */
150
+ :root[data-preset="aurora"][data-theme="dark"] {
151
+ --ds-bg: #0d0f14;
152
+ --ds-bg-elev: #14171f;
153
+ --ds-surface: #161a23;
154
+ --ds-surface-soft: #11141a;
155
+ --ds-ink: #e7e9ee;
156
+ --ds-ink-soft: #b9bdc6;
157
+ --ds-muted: #8b909a;
158
+ --ds-line: rgba(143, 160, 200, 0.14);
159
+ --ds-line-soft: rgba(143, 160, 200, 0.08);
160
+ --ds-accent: #b8c8ff;
161
+ --ds-accent-soft: rgba(140, 170, 255, 0.12);
162
+ --ds-accent-ink: #0d0f14;
163
+ --ds-success: #6ee7b7;
164
+ --ds-danger: #ff9d9d;
165
+ --ds-shadow-sm: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 1px 2px rgba(0, 0, 0, 0.5);
166
+ --ds-shadow-md: inset 0 1px 0 rgba(255, 255, 255, 0.045), 0 0 0 1px rgba(123, 97, 255, 0.06), 0 24px 60px rgba(0, 0, 0, 0.55), 0 0 80px -20px rgba(123, 97, 255, 0.25);
167
+ --ds-code-bg: #07080a;
168
+ --ds-code-ink: #e7e9ee;
169
+ --ds-topbar-bg: rgba(13, 15, 20, 0.82);
170
+ --ds-topbar-border: rgba(143, 160, 200, 0.14);
171
+ --ds-pattern-dot: rgba(140, 170, 255, 0.06);
172
+ --ds-canvas-bg-image:
173
+ radial-gradient(60% 40% at 0% 0%, rgba(123, 97, 255, 0.10), transparent 60%),
174
+ radial-gradient(50% 40% at 100% 100%, rgba(70, 200, 255, 0.06), transparent 60%);
175
+ color-scheme: dark;
176
+ }
177
+
178
+ /* Default = paper / dark (when bootstrap hasn't run yet) */
179
+ :root:not([data-preset]):not([data-theme]),
180
+ :root[data-preset="paper"]:not([data-theme]),
181
+ :root:not([data-preset])[data-theme="dark"] {
182
+ --ds-bg: #1c1b18;
183
+ --ds-bg-elev: #25241f;
184
+ --ds-surface: #25241f;
185
+ --ds-surface-soft: #20201c;
186
+ --ds-ink: #ede9e0;
187
+ --ds-ink-soft: #bbb5a8;
188
+ --ds-muted: #888273;
189
+ --ds-line: #423f37;
190
+ --ds-line-soft: #312f29;
191
+ --ds-accent: #f4bf5e;
192
+ --ds-accent-soft: #3d3322;
193
+ --ds-accent-ink: #1f1d18;
194
+ --ds-shadow-md: inset 0 1px 0 rgba(255, 255, 255, 0.045), 0 1px 2px rgba(0, 0, 0, 0.55), 0 18px 38px rgba(0, 0, 0, 0.45);
195
+ --ds-topbar-bg: rgba(28, 27, 24, 0.85);
196
+ --ds-topbar-border: rgba(255, 255, 255, 0.06);
197
+ --ds-pattern-dot: rgba(255, 255, 255, 0.04);
198
+ --ds-canvas-bg-image: none;
199
+ color-scheme: dark;
200
+ }
201
+
202
+
203
+ /* ============================================================
204
+ Reset + page
205
+ ============================================================ */
206
+
207
+ * { box-sizing: border-box; }
208
+
209
+ html, body {
210
+ margin: 0;
211
+ padding: 0;
212
+ background: var(--ds-bg);
213
+ color: var(--ds-ink);
214
+ font-family:
215
+ "Inter",
216
+ -apple-system,
217
+ "SF Pro Text",
218
+ system-ui,
219
+ sans-serif;
220
+ font-size: 16px;
221
+ line-height: 1.55;
222
+ -webkit-font-smoothing: antialiased;
223
+ text-rendering: optimizeLegibility;
224
+ transition: background 200ms ease, color 200ms ease;
225
+ }
226
+
227
+ body {
228
+ min-height: 100vh;
229
+ background-image:
230
+ var(--ds-canvas-bg-image, none),
231
+ radial-gradient(circle at 1px 1px, var(--ds-pattern-dot) 1px, transparent 0);
232
+ background-size: auto, 22px 22px;
233
+ background-attachment: fixed;
234
+ background-repeat: no-repeat, repeat;
235
+ }
236
+
237
+ /* ============================================================
238
+ Topbar
239
+ ============================================================ */
240
+
241
+ .topbar {
242
+ position: sticky;
243
+ top: 0;
244
+ z-index: 10;
245
+ display: flex;
246
+ align-items: center;
247
+ justify-content: space-between;
248
+ gap: 12px;
249
+ padding: 12px 20px;
250
+ background: var(--ds-topbar-bg);
251
+ backdrop-filter: blur(14px) saturate(140%);
252
+ -webkit-backdrop-filter: blur(14px) saturate(140%);
253
+ border-bottom: 1px solid var(--ds-topbar-border);
254
+ flex-wrap: nowrap;
255
+ min-width: 0;
256
+ }
257
+
258
+ .topbar-left,
259
+ .topbar-right {
260
+ display: flex;
261
+ align-items: center;
262
+ gap: 12px;
263
+ min-width: 0;
264
+ flex-wrap: nowrap;
265
+ }
266
+
267
+ .topbar-left { flex: 1 1 auto; min-width: 0; }
268
+ .topbar-right { flex: 0 0 auto; }
269
+
270
+ .topbar * {
271
+ white-space: nowrap;
272
+ }
273
+
274
+ .session-pill {
275
+ max-width: clamp(80px, 30vw, 280px);
276
+ overflow: hidden;
277
+ text-overflow: ellipsis;
278
+ flex-shrink: 1;
279
+ min-width: 0;
280
+ }
281
+
282
+ .back-link { flex-shrink: 0; }
283
+ .brand { flex-shrink: 0; }
284
+ .brand > span:last-child { flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; max-width: clamp(60px, 18vw, 220px); display: inline-block; }
285
+ .count { flex-shrink: 0; }
286
+ .live { flex-shrink: 0; }
287
+
288
+ /* Progressive collapse for narrow windows */
289
+ @media (max-width: 1100px) {
290
+ .count { display: none; }
291
+ }
292
+ @media (max-width: 900px) {
293
+ .session-pill { max-width: 140px; }
294
+ .live span:not(.live-dot) { display: none; }
295
+ }
296
+ @media (max-width: 740px) {
297
+ .topbar { padding: 10px 14px; gap: 8px; }
298
+ .topbar-left, .topbar-right { gap: 8px; }
299
+ .back-link span { display: none; }
300
+ .back-link::before { content: "←"; font-size: 14px; }
301
+ .session-pill { max-width: 100px; font-size: 11px; padding: 4px 8px; }
302
+ }
303
+ @media (max-width: 600px) {
304
+ .preset-group { display: none; }
305
+ .brand > span:last-child { display: none; }
306
+ .session-pill { display: none; }
307
+ }
308
+
309
+ .brand {
310
+ display: flex;
311
+ align-items: center;
312
+ gap: 8px;
313
+ font-size: 14px;
314
+ font-weight: 600;
315
+ letter-spacing: -0.005em;
316
+ color: var(--ds-ink);
317
+ }
318
+
319
+ .brand > span:last-child {
320
+ cursor: text;
321
+ padding: 2px 6px;
322
+ margin: -2px -6px;
323
+ border-radius: 6px;
324
+ transition: background 120ms ease;
325
+ }
326
+ .brand > span:last-child:hover {
327
+ background: var(--ds-surface-soft);
328
+ }
329
+
330
+ .project-label-input {
331
+ height: 28px;
332
+ font: inherit;
333
+ font-size: 14px;
334
+ font-weight: 600;
335
+ background: var(--ds-surface);
336
+ color: var(--ds-ink);
337
+ border: 1px solid var(--ds-accent);
338
+ box-shadow: 0 0 0 3px var(--ds-accent-soft);
339
+ border-radius: 6px;
340
+ padding: 0 8px;
341
+ outline: none;
342
+ max-width: clamp(80px, 22vw, 260px);
343
+ }
344
+
345
+ .brand-mark {
346
+ width: 22px;
347
+ height: 22px;
348
+ border-radius: 6px;
349
+ background: linear-gradient(135deg, var(--ds-accent), color-mix(in srgb, var(--ds-accent) 60%, #ec4899));
350
+ position: relative;
351
+ overflow: hidden;
352
+ }
353
+
354
+ .brand-mark::after {
355
+ content: "";
356
+ position: absolute;
357
+ inset: 30% 30% 30% 30%;
358
+ border-radius: 999px;
359
+ background: var(--ds-bg-elev);
360
+ }
361
+
362
+ .session-pill {
363
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
364
+ font-size: 12px;
365
+ padding: 5px 10px;
366
+ border-radius: 999px;
367
+ background: var(--ds-accent-soft);
368
+ color: var(--ds-accent);
369
+ letter-spacing: 0.01em;
370
+ }
371
+
372
+ .count {
373
+ font-size: 13px;
374
+ color: var(--ds-muted);
375
+ }
376
+
377
+ .live {
378
+ display: flex;
379
+ align-items: center;
380
+ gap: 8px;
381
+ font-size: 12px;
382
+ color: var(--ds-muted);
383
+ }
384
+
385
+ .live-dot {
386
+ width: 9px;
387
+ height: 9px;
388
+ border-radius: 50%;
389
+ background: var(--ds-success);
390
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ds-success) 22%, transparent);
391
+ transition: background 200ms, box-shadow 200ms;
392
+ }
393
+
394
+ .live-dot.offline {
395
+ background: var(--ds-danger);
396
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ds-danger) 22%, transparent);
397
+ }
398
+
399
+ /* Theme toggle */
400
+ .theme-toggle {
401
+ display: inline-flex;
402
+ align-items: center;
403
+ justify-content: center;
404
+ width: 34px;
405
+ height: 34px;
406
+ border-radius: 10px;
407
+ border: 1px solid var(--ds-line);
408
+ background: var(--ds-surface);
409
+ color: var(--ds-ink-soft);
410
+ cursor: pointer;
411
+ transition:
412
+ background 150ms ease,
413
+ border-color 150ms ease,
414
+ color 150ms ease,
415
+ transform 120ms ease;
416
+ }
417
+
418
+ .theme-toggle:hover {
419
+ background: var(--ds-surface-soft);
420
+ color: var(--ds-ink);
421
+ }
422
+
423
+ .theme-toggle:active {
424
+ transform: scale(0.96);
425
+ }
426
+
427
+ .theme-toggle svg {
428
+ width: 16px;
429
+ height: 16px;
430
+ display: block;
431
+ }
432
+
433
+ :root[data-theme="dark"] .icon-sun { display: block; }
434
+ :root[data-theme="dark"] .icon-moon { display: none; }
435
+ :root[data-theme="light"] .icon-sun { display: none; }
436
+ :root[data-theme="light"] .icon-moon { display: block; }
437
+
438
+ /* ============================================================
439
+ Feed
440
+ ============================================================ */
441
+
442
+ .feed {
443
+ width: min(94vw, 1600px);
444
+ margin: 0 auto;
445
+ padding: 48px 28px 200px;
446
+ }
447
+
448
+ @media (min-width: 2000px) {
449
+ .feed { width: min(80vw, 1800px); }
450
+ }
451
+
452
+ @media (min-width: 2800px) {
453
+ .feed { width: min(70vw, 2000px); }
454
+ }
455
+
456
+ .pruned-marker {
457
+ text-align: center;
458
+ font-size: 12px;
459
+ color: var(--ds-muted);
460
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
461
+ padding: 14px 0;
462
+ border-bottom: 1px dashed var(--ds-line);
463
+ margin-bottom: 32px;
464
+ }
465
+
466
+ .empty-state {
467
+ text-align: center;
468
+ color: var(--ds-muted);
469
+ padding: 120px 24px;
470
+ }
471
+
472
+ .empty-state h2 {
473
+ font-size: 26px;
474
+ font-weight: 500;
475
+ margin: 0 0 10px;
476
+ color: var(--ds-ink);
477
+ letter-spacing: -0.015em;
478
+ }
479
+
480
+ .empty-state p {
481
+ font-size: 15px;
482
+ margin: 0;
483
+ max-width: 420px;
484
+ margin: 0 auto;
485
+ }
486
+
487
+ /* ============================================================
488
+ Push cards
489
+ ============================================================ */
490
+
491
+ .push {
492
+ background: var(--ds-surface);
493
+ border: 1px solid var(--ds-line);
494
+ border-radius: 16px;
495
+ box-shadow: var(--ds-shadow-md);
496
+ margin-bottom: 28px;
497
+ scroll-margin-top: 88px;
498
+ }
499
+
500
+ .push.fresh {
501
+ animation: pop-in 360ms cubic-bezier(0.2, 0.7, 0.2, 1);
502
+ }
503
+
504
+ @keyframes pop-in {
505
+ from { opacity: 0; transform: translateY(10px); }
506
+ to { opacity: 1; transform: none; }
507
+ }
508
+
509
+ .push-meta {
510
+ display: flex;
511
+ align-items: center;
512
+ gap: 14px;
513
+ padding: 14px 22px;
514
+ border-bottom: 1px solid var(--ds-line);
515
+ background: var(--ds-surface-soft);
516
+ font-size: 13px;
517
+ position: sticky;
518
+ top: 50px;
519
+ z-index: 5;
520
+ border-top-left-radius: 16px;
521
+ border-top-right-radius: 16px;
522
+ backdrop-filter: blur(8px);
523
+ -webkit-backdrop-filter: blur(8px);
524
+ }
525
+
526
+ .push-index {
527
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
528
+ color: var(--ds-muted);
529
+ }
530
+
531
+ .push-title {
532
+ flex: 1;
533
+ font-weight: 600;
534
+ color: var(--ds-ink);
535
+ overflow: hidden;
536
+ text-overflow: ellipsis;
537
+ white-space: nowrap;
538
+ letter-spacing: -0.005em;
539
+ }
540
+
541
+ .push-kind {
542
+ font-size: 11px;
543
+ padding: 4px 10px;
544
+ border-radius: 999px;
545
+ background: var(--ds-accent-soft);
546
+ color: var(--ds-accent);
547
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
548
+ letter-spacing: 0.02em;
549
+ text-transform: lowercase;
550
+ }
551
+
552
+ .push-time {
553
+ font-size: 11px;
554
+ color: var(--ds-muted);
555
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
556
+ }
557
+
558
+ .push-del,
559
+ .push-export {
560
+ display: inline-flex;
561
+ align-items: center;
562
+ justify-content: center;
563
+ width: 24px;
564
+ height: 24px;
565
+ padding: 0;
566
+ background: transparent;
567
+ border: 0;
568
+ border-radius: 6px;
569
+ color: var(--ds-muted);
570
+ cursor: pointer;
571
+ opacity: 0;
572
+ transition: opacity 120ms ease, background 120ms ease, color 120ms ease;
573
+ }
574
+ .push:hover .push-del,
575
+ .push:hover .push-export {
576
+ opacity: 0.7;
577
+ }
578
+ .push-del:hover {
579
+ background: var(--ds-surface-soft);
580
+ color: var(--ds-danger, #d64545);
581
+ opacity: 1 !important;
582
+ }
583
+ .push-export:hover {
584
+ background: var(--ds-surface-soft);
585
+ color: var(--ds-ink);
586
+ opacity: 1 !important;
587
+ }
588
+ .push-export[data-loading] {
589
+ opacity: 1 !important;
590
+ color: var(--ds-accent);
591
+ animation: easel-pulse 1.2s ease-in-out infinite;
592
+ }
593
+ @keyframes easel-pulse {
594
+ 0%, 100% { opacity: 0.55; }
595
+ 50% { opacity: 1; }
596
+ }
597
+ .push-del svg,
598
+ .push-export svg {
599
+ display: block;
600
+ }
601
+
602
+ .push-body {
603
+ background: var(--ds-bg-elev);
604
+ overflow: hidden;
605
+ border-bottom-left-radius: 16px;
606
+ border-bottom-right-radius: 16px;
607
+ }
608
+
609
+ .push-body iframe {
610
+ display: block;
611
+ width: 100%;
612
+ border: 0;
613
+ background: var(--ds-bg-elev);
614
+ overflow: hidden;
615
+ }
616
+
617
+ /* ============================================================
618
+ "↓ new" pill
619
+ ============================================================ */
620
+
621
+ /* =========================================================================
622
+ Density: flat — drop card chrome and use whitespace to separate pushes.
623
+ ========================================================================= */
624
+ :root[data-density="flat"] .push {
625
+ background: transparent;
626
+ border: 0;
627
+ border-radius: 0;
628
+ box-shadow: none;
629
+ margin-bottom: 0;
630
+ padding: 0 0 120px;
631
+ overflow: visible;
632
+ }
633
+ :root[data-density="flat"] .push:first-child { padding-top: 0; }
634
+ :root[data-density="flat"] .push:last-child { padding-bottom: 32px; }
635
+
636
+ :root[data-density="flat"] .push-meta {
637
+ position: static;
638
+ background: transparent;
639
+ border-bottom: 0;
640
+ border-radius: 0;
641
+ padding: 0;
642
+ margin-bottom: 32px;
643
+ font-size: 11.5px;
644
+ color: var(--ds-muted);
645
+ backdrop-filter: none;
646
+ -webkit-backdrop-filter: none;
647
+ }
648
+
649
+ :root[data-density="flat"] .push-title {
650
+ font-family: "Inter", -apple-system, system-ui, sans-serif;
651
+ font-size: 13px;
652
+ font-weight: 600;
653
+ color: var(--ds-ink);
654
+ letter-spacing: -0.005em;
655
+ }
656
+
657
+ :root[data-density="flat"] .push-body {
658
+ background: transparent;
659
+ overflow: visible;
660
+ border-radius: 0;
661
+ }
662
+
663
+ :root[data-density="flat"] .push-body iframe {
664
+ background: transparent;
665
+ }
666
+
667
+ .new-pill[hidden] {
668
+ display: none !important;
669
+ }
670
+
671
+ .new-pill {
672
+ position: fixed;
673
+ right: 32px;
674
+ bottom: 32px;
675
+ z-index: 20;
676
+ display: inline-flex;
677
+ align-items: center;
678
+ gap: 10px;
679
+ background: var(--ds-accent);
680
+ color: var(--ds-accent-ink);
681
+ padding: 11px 20px;
682
+ border: 0;
683
+ border-radius: 999px;
684
+ box-shadow:
685
+ 0 6px 24px color-mix(in srgb, var(--ds-accent) 40%, transparent),
686
+ 0 2px 6px rgba(0, 0, 0, 0.25);
687
+ font-family:
688
+ -apple-system,
689
+ "Inter",
690
+ system-ui,
691
+ sans-serif;
692
+ font-size: 14px;
693
+ font-weight: 600;
694
+ cursor: pointer;
695
+ transition: transform 120ms ease, box-shadow 200ms ease;
696
+ }
697
+
698
+ .new-pill:hover {
699
+ transform: translateY(-1px);
700
+ }
701
+
702
+ .new-pill:active {
703
+ transform: translateY(0);
704
+ }
705
+
706
+ .new-pill .pulse {
707
+ width: 8px;
708
+ height: 8px;
709
+ border-radius: 50%;
710
+ background: currentColor;
711
+ box-shadow: 0 0 0 4px color-mix(in srgb, currentColor 28%, transparent);
712
+ }
713
+
714
+ .new-pill .arrow {
715
+ font-size: 13px;
716
+ opacity: 0.9;
717
+ }