clay-server 2.7.2 → 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 (58) hide show
  1. package/bin/cli.js +2 -1
  2. package/lib/config.js +7 -4
  3. package/lib/project.js +343 -15
  4. package/lib/public/app.js +1043 -135
  5. package/lib/public/apple-touch-icon-dark.png +0 -0
  6. package/lib/public/apple-touch-icon.png +0 -0
  7. package/lib/public/clay-logo.png +0 -0
  8. package/lib/public/css/base.css +10 -0
  9. package/lib/public/css/filebrowser.css +1 -0
  10. package/lib/public/css/home-hub.css +455 -0
  11. package/lib/public/css/icon-strip.css +6 -5
  12. package/lib/public/css/loop.css +141 -23
  13. package/lib/public/css/messages.css +2 -0
  14. package/lib/public/css/mobile-nav.css +38 -12
  15. package/lib/public/css/overlays.css +205 -169
  16. package/lib/public/css/playbook.css +264 -0
  17. package/lib/public/css/profile.css +268 -0
  18. package/lib/public/css/scheduler-modal.css +1429 -0
  19. package/lib/public/css/scheduler.css +1305 -0
  20. package/lib/public/css/sidebar.css +305 -11
  21. package/lib/public/css/sticky-notes.css +23 -19
  22. package/lib/public/css/stt.css +155 -0
  23. package/lib/public/css/title-bar.css +14 -6
  24. package/lib/public/favicon-banded-32.png +0 -0
  25. package/lib/public/favicon-banded.png +0 -0
  26. package/lib/public/icon-192-dark.png +0 -0
  27. package/lib/public/icon-192.png +0 -0
  28. package/lib/public/icon-512-dark.png +0 -0
  29. package/lib/public/icon-512.png +0 -0
  30. package/lib/public/icon-banded-76.png +0 -0
  31. package/lib/public/icon-banded-96.png +0 -0
  32. package/lib/public/index.html +335 -42
  33. package/lib/public/modules/ascii-logo.js +389 -0
  34. package/lib/public/modules/filebrowser.js +2 -1
  35. package/lib/public/modules/markdown.js +118 -0
  36. package/lib/public/modules/notifications.js +50 -63
  37. package/lib/public/modules/playbook.js +578 -0
  38. package/lib/public/modules/profile.js +357 -0
  39. package/lib/public/modules/project-settings.js +4 -9
  40. package/lib/public/modules/scheduler.js +2826 -0
  41. package/lib/public/modules/server-settings.js +1 -1
  42. package/lib/public/modules/sidebar.js +378 -31
  43. package/lib/public/modules/sticky-notes.js +2 -0
  44. package/lib/public/modules/stt.js +272 -0
  45. package/lib/public/modules/terminal.js +32 -0
  46. package/lib/public/modules/theme.js +3 -10
  47. package/lib/public/modules/tools.js +2 -1
  48. package/lib/public/style.css +6 -0
  49. package/lib/public/sw.js +82 -3
  50. package/lib/public/wordmark-banded-20.png +0 -0
  51. package/lib/public/wordmark-banded-32.png +0 -0
  52. package/lib/public/wordmark-banded-64.png +0 -0
  53. package/lib/public/wordmark-banded-80.png +0 -0
  54. package/lib/scheduler.js +402 -0
  55. package/lib/sdk-bridge.js +3 -2
  56. package/lib/server.js +124 -3
  57. package/lib/sessions.js +35 -2
  58. package/package.json +1 -1
@@ -0,0 +1,1429 @@
1
+ /* ============================
2
+ Scheduler — Edit Modal
3
+ ============================ */
4
+
5
+ #schedule-edit-modal {
6
+ position: fixed;
7
+ inset: 0;
8
+ z-index: 310;
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ }
13
+ #schedule-edit-modal.hidden { display: none; }
14
+
15
+ .schedule-edit-dialog {
16
+ width: 420px;
17
+ max-width: 90vw;
18
+ border-radius: 12px;
19
+ overflow: hidden;
20
+ }
21
+
22
+ .schedule-edit-header {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ padding: 14px 16px;
27
+ border-bottom: 1px solid var(--border);
28
+ background: var(--bg-alt);
29
+ }
30
+
31
+ .schedule-edit-title {
32
+ font-weight: 700;
33
+ font-size: 15px;
34
+ color: var(--text);
35
+ }
36
+
37
+ .schedule-edit-close {
38
+ background: none;
39
+ border: none;
40
+ color: var(--text-muted);
41
+ cursor: pointer;
42
+ font-size: 20px;
43
+ line-height: 1;
44
+ padding: 2px 4px;
45
+ }
46
+
47
+ .schedule-edit-close:hover {
48
+ color: var(--text);
49
+ }
50
+
51
+ .schedule-edit-body {
52
+ padding: 16px;
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: 14px;
56
+ max-height: 60vh;
57
+ overflow-y: auto;
58
+ }
59
+
60
+ /* --- Form fields --- */
61
+ .sched-field {
62
+ display: flex;
63
+ flex-direction: column;
64
+ gap: 4px;
65
+ }
66
+
67
+ .sched-field-label {
68
+ font-size: 12px;
69
+ font-weight: 700;
70
+ color: var(--text-secondary);
71
+ text-transform: uppercase;
72
+ letter-spacing: 0.04em;
73
+ }
74
+
75
+ .sched-field-input {
76
+ background: var(--input-bg, var(--bg-alt));
77
+ border: 1px solid var(--border);
78
+ border-radius: 6px;
79
+ padding: 8px 10px;
80
+ font-size: 14px;
81
+ color: var(--text);
82
+ outline: none;
83
+ font-family: inherit;
84
+ }
85
+
86
+ .sched-field-input:focus {
87
+ border-color: var(--accent);
88
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 20%, transparent);
89
+ }
90
+
91
+ .sched-field-select {
92
+ background: var(--input-bg, var(--bg-alt));
93
+ border: 1px solid var(--border);
94
+ border-radius: 6px;
95
+ padding: 8px 10px;
96
+ font-size: 14px;
97
+ color: var(--text);
98
+ outline: none;
99
+ cursor: pointer;
100
+ appearance: none;
101
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
102
+ background-repeat: no-repeat;
103
+ background-position: right 10px center;
104
+ padding-right: 30px;
105
+ }
106
+
107
+ .sched-field-select:focus {
108
+ border-color: var(--accent);
109
+ }
110
+
111
+ .sched-field-hint {
112
+ font-size: 11px;
113
+ color: var(--text-muted);
114
+ }
115
+
116
+ /* --- Repeat preset buttons --- */
117
+ .sched-preset-group {
118
+ display: flex;
119
+ flex-wrap: wrap;
120
+ gap: 6px;
121
+ }
122
+
123
+ .sched-preset-btn {
124
+ background: var(--bg-alt);
125
+ border: 1px solid var(--border);
126
+ color: var(--text-secondary);
127
+ cursor: pointer;
128
+ padding: 5px 12px;
129
+ border-radius: 6px;
130
+ font-size: 12px;
131
+ font-weight: 600;
132
+ transition: all 0.12s;
133
+ }
134
+
135
+ .sched-preset-btn:hover {
136
+ background: var(--hover);
137
+ color: var(--text);
138
+ }
139
+
140
+ .sched-preset-btn.active {
141
+ background: var(--accent);
142
+ color: #fff;
143
+ border-color: var(--accent);
144
+ }
145
+
146
+ /* --- Day-of-week picker --- */
147
+ .sched-dow-row {
148
+ display: flex;
149
+ gap: 4px;
150
+ }
151
+
152
+ .sched-dow-btn {
153
+ width: 36px;
154
+ height: 36px;
155
+ border-radius: 50%;
156
+ border: 1px solid var(--border);
157
+ background: var(--bg-alt);
158
+ color: var(--text-secondary);
159
+ cursor: pointer;
160
+ font-size: 12px;
161
+ font-weight: 700;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ transition: all 0.12s;
166
+ }
167
+
168
+ .sched-dow-btn:hover {
169
+ background: var(--hover);
170
+ color: var(--text);
171
+ }
172
+
173
+ .sched-dow-btn.active {
174
+ background: var(--accent);
175
+ color: #fff;
176
+ border-color: var(--accent);
177
+ }
178
+
179
+ /* --- Time picker --- */
180
+ .sched-time-row {
181
+ display: flex;
182
+ align-items: center;
183
+ gap: 8px;
184
+ }
185
+
186
+ .sched-time-input {
187
+ background: var(--input-bg, var(--bg-alt));
188
+ border: 1px solid var(--border);
189
+ border-radius: 6px;
190
+ padding: 8px 10px;
191
+ font-size: 16px;
192
+ font-weight: 600;
193
+ color: var(--text);
194
+ outline: none;
195
+ width: 110px;
196
+ font-family: "Roboto Mono", monospace;
197
+ }
198
+
199
+ .sched-time-input:focus {
200
+ border-color: var(--accent);
201
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 20%, transparent);
202
+ }
203
+
204
+ /* --- Cron preview --- */
205
+ .sched-cron-preview {
206
+ background: var(--bg-alt);
207
+ border: 1px solid var(--border);
208
+ border-radius: 6px;
209
+ padding: 8px 12px;
210
+ font-size: 12px;
211
+ font-family: "Roboto Mono", monospace;
212
+ color: var(--text-muted);
213
+ }
214
+
215
+ .sched-cron-preview .human {
216
+ color: var(--text);
217
+ font-family: inherit;
218
+ font-weight: 600;
219
+ display: block;
220
+ margin-bottom: 2px;
221
+ }
222
+
223
+ /* --- Toggle switch --- */
224
+ .sched-toggle-row {
225
+ display: flex;
226
+ align-items: center;
227
+ justify-content: space-between;
228
+ }
229
+
230
+ .sched-toggle {
231
+ position: relative;
232
+ width: 40px;
233
+ height: 22px;
234
+ cursor: pointer;
235
+ }
236
+
237
+ .sched-toggle input {
238
+ display: none;
239
+ }
240
+
241
+ .sched-toggle-track {
242
+ position: absolute;
243
+ inset: 0;
244
+ border-radius: 11px;
245
+ background: var(--border);
246
+ transition: background 0.2s;
247
+ }
248
+
249
+ .sched-toggle input:checked + .sched-toggle-track {
250
+ background: var(--accent);
251
+ }
252
+
253
+ .sched-toggle-thumb {
254
+ position: absolute;
255
+ top: 2px;
256
+ left: 2px;
257
+ width: 18px;
258
+ height: 18px;
259
+ border-radius: 50%;
260
+ background: #fff;
261
+ transition: transform 0.2s;
262
+ box-shadow: 0 1px 3px rgba(0,0,0,0.2);
263
+ }
264
+
265
+ .sched-toggle input:checked ~ .sched-toggle-thumb {
266
+ transform: translateX(18px);
267
+ }
268
+
269
+ /* --- History list --- */
270
+ .sched-history {
271
+ max-height: 150px;
272
+ overflow-y: auto;
273
+ border: 1px solid var(--border);
274
+ border-radius: 6px;
275
+ }
276
+
277
+ .sched-history-empty {
278
+ padding: 16px;
279
+ text-align: center;
280
+ color: var(--text-muted);
281
+ font-size: 12px;
282
+ }
283
+
284
+ .sched-history-item {
285
+ display: flex;
286
+ align-items: center;
287
+ gap: 8px;
288
+ padding: 6px 10px;
289
+ border-bottom: 1px solid var(--border-subtle, var(--border));
290
+ font-size: 12px;
291
+ }
292
+
293
+ .sched-history-item:last-child {
294
+ border-bottom: none;
295
+ }
296
+
297
+ .sched-history-dot {
298
+ width: 8px;
299
+ height: 8px;
300
+ border-radius: 50%;
301
+ flex-shrink: 0;
302
+ }
303
+
304
+ .sched-history-dot.pass {
305
+ background: var(--success);
306
+ }
307
+
308
+ .sched-history-dot.fail, .sched-history-dot.error, .sched-history-dot.max_iterations {
309
+ background: var(--error);
310
+ }
311
+
312
+ .sched-history-date {
313
+ color: var(--text-muted);
314
+ flex-shrink: 0;
315
+ font-family: "Roboto Mono", monospace;
316
+ font-size: 11px;
317
+ }
318
+
319
+ .sched-history-result {
320
+ color: var(--text-secondary);
321
+ font-weight: 600;
322
+ }
323
+
324
+ .sched-history-iterations {
325
+ color: var(--text-muted);
326
+ margin-left: auto;
327
+ }
328
+
329
+ /* --- Footer buttons --- */
330
+ .schedule-edit-footer {
331
+ display: flex;
332
+ justify-content: flex-end;
333
+ gap: 8px;
334
+ padding: 12px 16px;
335
+ border-top: 1px solid var(--border);
336
+ background: var(--bg-alt);
337
+ }
338
+
339
+ .sched-btn {
340
+ padding: 7px 16px;
341
+ border-radius: 6px;
342
+ font-size: 13px;
343
+ font-weight: 600;
344
+ cursor: pointer;
345
+ border: 1px solid transparent;
346
+ transition: all 0.12s;
347
+ }
348
+
349
+ .sched-btn-cancel {
350
+ background: var(--bg-alt);
351
+ border-color: var(--border);
352
+ color: var(--text-secondary);
353
+ }
354
+
355
+ .sched-btn-cancel:hover {
356
+ background: var(--hover);
357
+ color: var(--text);
358
+ }
359
+
360
+ .sched-btn-save {
361
+ background: var(--accent);
362
+ color: #fff;
363
+ }
364
+
365
+ .sched-btn-save:hover {
366
+ filter: brightness(1.1);
367
+ }
368
+
369
+ .sched-btn-delete {
370
+ background: none;
371
+ border-color: var(--border);
372
+ color: var(--error);
373
+ margin-right: auto;
374
+ }
375
+
376
+ .sched-btn-delete:hover {
377
+ background: color-mix(in srgb, var(--error) 12%, transparent);
378
+ border-color: var(--error);
379
+ }
380
+
381
+ /* --- Scheduler tabs (Calendar / Tasks) --- */
382
+ .scheduler-tab {
383
+ background: none;
384
+ border: none;
385
+ color: var(--text-muted);
386
+ cursor: pointer;
387
+ padding: 10px 16px;
388
+ font-size: 13px;
389
+ font-weight: 700;
390
+ border-bottom: 2px solid transparent;
391
+ transition: all 0.12s;
392
+ }
393
+
394
+ .scheduler-tab.active {
395
+ color: var(--accent);
396
+ border-bottom-color: var(--accent);
397
+ }
398
+
399
+ .scheduler-tab:not(.active):hover {
400
+ color: var(--text);
401
+ }
402
+
403
+ /* --- Tasks list --- */
404
+ .scheduler-library {
405
+ flex: 1;
406
+ min-height: 0;
407
+ overflow-y: auto;
408
+ padding: 16px 24px;
409
+ }
410
+
411
+ .job-library-list {
412
+ display: flex;
413
+ flex-direction: column;
414
+ gap: 6px;
415
+ }
416
+
417
+ .job-library-item {
418
+ background: var(--bg-alt);
419
+ border: 1px solid var(--border);
420
+ border-radius: 8px;
421
+ padding: 10px 12px;
422
+ transition: border-color 0.12s;
423
+ }
424
+
425
+ .job-library-item:hover {
426
+ border-color: var(--accent);
427
+ }
428
+
429
+ .job-library-header {
430
+ display: flex;
431
+ align-items: center;
432
+ gap: 8px;
433
+ margin-bottom: 4px;
434
+ }
435
+
436
+ .job-library-name {
437
+ font-weight: 700;
438
+ font-size: 13px;
439
+ color: var(--text);
440
+ }
441
+
442
+ .job-library-badge {
443
+ font-size: 10px;
444
+ font-weight: 700;
445
+ padding: 2px 8px;
446
+ border-radius: 10px;
447
+ text-transform: uppercase;
448
+ letter-spacing: 0.03em;
449
+ }
450
+
451
+ .job-library-badge.scheduled {
452
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
453
+ color: var(--accent);
454
+ }
455
+
456
+ .job-library-badge.oneoff {
457
+ background: var(--bg);
458
+ color: var(--text-muted);
459
+ border: 1px solid var(--border);
460
+ }
461
+
462
+ .job-library-meta {
463
+ font-size: 12px;
464
+ color: var(--text-secondary);
465
+ margin-bottom: 6px;
466
+ }
467
+
468
+ .job-library-task {
469
+ color: var(--text-muted);
470
+ margin-bottom: 2px;
471
+ }
472
+
473
+ .job-library-cron {
474
+ font-weight: 600;
475
+ }
476
+
477
+ .job-library-last-run {
478
+ font-size: 11px;
479
+ color: var(--text-muted);
480
+ }
481
+
482
+ .job-library-last-run .pass {
483
+ color: var(--success);
484
+ }
485
+
486
+ .job-library-last-run .fail {
487
+ color: var(--error);
488
+ }
489
+
490
+ .job-library-actions {
491
+ display: flex;
492
+ gap: 6px;
493
+ margin-top: 6px;
494
+ }
495
+
496
+ .job-lib-btn {
497
+ background: var(--bg);
498
+ border: 1px solid var(--border);
499
+ color: var(--text-secondary);
500
+ cursor: pointer;
501
+ padding: 4px 10px;
502
+ border-radius: 6px;
503
+ font-size: 11px;
504
+ font-weight: 600;
505
+ transition: all 0.12s;
506
+ }
507
+
508
+ .job-lib-btn:hover {
509
+ background: var(--hover);
510
+ color: var(--text);
511
+ }
512
+
513
+ .job-lib-btn.danger:hover {
514
+ background: color-mix(in srgb, var(--error) 12%, transparent);
515
+ color: var(--error);
516
+ border-color: var(--error);
517
+ }
518
+
519
+ /* --- Ralph wizard repeat select --- */
520
+ .ralph-input-select {
521
+ background: var(--input-bg, var(--bg-alt));
522
+ border: 1px solid var(--border);
523
+ border-radius: 6px;
524
+ padding: 6px 28px 6px 8px;
525
+ font-size: 13px;
526
+ color: var(--text);
527
+ outline: none;
528
+ cursor: pointer;
529
+ appearance: none;
530
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
531
+ background-repeat: no-repeat;
532
+ background-position: right 8px center;
533
+ font-family: inherit;
534
+ }
535
+
536
+ .ralph-input-select:focus {
537
+ border-color: var(--accent);
538
+ }
539
+
540
+ @media (max-width: 480px) {
541
+ .schedule-edit-dialog {
542
+ width: 100vw;
543
+ max-width: none;
544
+ border-radius: 0;
545
+ }
546
+ }
547
+
548
+ /* ============================
549
+ Scheduler — Create Popover (inline)
550
+ ============================ */
551
+
552
+ .sched-create-popover {
553
+ position: fixed;
554
+ z-index: 320;
555
+ width: 360px;
556
+ background: var(--bg);
557
+ border: 1px solid var(--border);
558
+ border-radius: 12px;
559
+ box-shadow: 0 8px 32px rgba(0,0,0,0.28), 0 2px 8px rgba(0,0,0,0.12);
560
+ display: flex;
561
+ flex-direction: column;
562
+ overflow: visible;
563
+ }
564
+
565
+ .sched-create-popover.hidden {
566
+ display: none;
567
+ }
568
+
569
+ /* --- Top row: date + time + close --- */
570
+ .sched-create-top-row {
571
+ display: flex;
572
+ align-items: center;
573
+ justify-content: space-between;
574
+ padding: 10px 12px;
575
+ gap: 6px;
576
+ }
577
+
578
+ .sched-create-date-chips {
579
+ display: flex;
580
+ align-items: center;
581
+ gap: 4px;
582
+ }
583
+
584
+ .sched-create-date-input,
585
+ .sched-create-time-input {
586
+ background: var(--input-bg, var(--bg-alt));
587
+ border: 1px solid var(--border);
588
+ border-radius: 6px;
589
+ padding: 5px 8px;
590
+ font-size: 12px;
591
+ color: var(--text);
592
+ font-family: inherit;
593
+ outline: none;
594
+ color-scheme: dark;
595
+ height: 30px;
596
+ box-sizing: border-box;
597
+ }
598
+
599
+ .sched-create-date-input:focus,
600
+ .sched-create-time-input:focus {
601
+ border-color: var(--accent);
602
+ }
603
+
604
+ .sched-create-time-input {
605
+ width: 80px;
606
+ }
607
+
608
+ .sched-create-recurrence-btn {
609
+ background: none;
610
+ border: 1px solid var(--border);
611
+ border-radius: 6px;
612
+ color: var(--text-muted);
613
+ cursor: pointer;
614
+ padding: 4px 5px;
615
+ display: flex;
616
+ align-items: center;
617
+ transition: all 0.12s;
618
+ }
619
+
620
+ .sched-create-recurrence-btn:hover {
621
+ color: var(--accent);
622
+ border-color: var(--accent);
623
+ }
624
+
625
+ .sched-create-recurrence-btn.has-recurrence {
626
+ color: var(--accent);
627
+ border-color: var(--accent);
628
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
629
+ }
630
+
631
+ .sched-create-recurrence-btn svg {
632
+ width: 13px;
633
+ height: 13px;
634
+ }
635
+
636
+ /* --- Close button --- */
637
+ .sched-create-close-btn {
638
+ background: none;
639
+ border: none;
640
+ color: var(--text-muted);
641
+ cursor: pointer;
642
+ padding: 3px;
643
+ border-radius: 4px;
644
+ display: flex;
645
+ align-items: center;
646
+ flex-shrink: 0;
647
+ margin-left: auto;
648
+ }
649
+
650
+ .sched-create-close-btn:hover {
651
+ color: var(--text);
652
+ background: var(--hover);
653
+ }
654
+
655
+ .sched-create-close-btn svg {
656
+ width: 15px;
657
+ height: 15px;
658
+ }
659
+
660
+ /* --- Title row --- */
661
+ .sched-create-title-row {
662
+ display: flex;
663
+ align-items: center;
664
+ gap: 10px;
665
+ padding: 10px 14px;
666
+ border-top: 1px solid var(--border-subtle, var(--border));
667
+ }
668
+
669
+ .sched-create-color-picker-wrap {
670
+ position: relative;
671
+ flex-shrink: 0;
672
+ }
673
+
674
+ .sched-create-color-btn {
675
+ background: none;
676
+ border: none;
677
+ cursor: pointer;
678
+ padding: 2px;
679
+ display: flex;
680
+ align-items: center;
681
+ border-radius: 50%;
682
+ transition: opacity 0.12s;
683
+ }
684
+
685
+ .sched-create-color-btn:hover {
686
+ opacity: 0.75;
687
+ }
688
+
689
+ .sched-create-color-dot {
690
+ width: 14px;
691
+ height: 14px;
692
+ border-radius: 50%;
693
+ background: var(--accent, #ffb86c);
694
+ display: block;
695
+ }
696
+
697
+ .sched-create-color-palette {
698
+ position: absolute;
699
+ top: calc(100% + 6px);
700
+ left: 0;
701
+ background: var(--bg);
702
+ border: 1px solid var(--border);
703
+ border-radius: 8px;
704
+ box-shadow: 0 6px 20px rgba(0,0,0,0.25);
705
+ padding: 8px;
706
+ display: grid;
707
+ grid-template-columns: repeat(6, 1fr);
708
+ gap: 6px;
709
+ z-index: 340;
710
+ }
711
+
712
+ .sched-create-color-palette.hidden {
713
+ display: none;
714
+ }
715
+
716
+ .sched-color-swatch {
717
+ width: 22px;
718
+ height: 22px;
719
+ border-radius: 50%;
720
+ border: 2px solid transparent;
721
+ cursor: pointer;
722
+ padding: 0;
723
+ transition: transform 0.1s, border-color 0.1s;
724
+ }
725
+
726
+ .sched-color-swatch:hover {
727
+ transform: scale(1.15);
728
+ }
729
+
730
+ .sched-color-swatch.active {
731
+ border-color: var(--text);
732
+ }
733
+
734
+ .sched-create-title-input {
735
+ flex: 1;
736
+ background: none;
737
+ border: none;
738
+ outline: none;
739
+ font-size: 15px;
740
+ font-weight: 600;
741
+ color: var(--text);
742
+ padding: 2px 0;
743
+ font-family: inherit;
744
+ }
745
+
746
+ .sched-create-title-input::placeholder {
747
+ color: var(--text-muted);
748
+ font-weight: 400;
749
+ }
750
+
751
+ /* --- Row (task, description) --- */
752
+ .sched-create-row {
753
+ display: flex;
754
+ align-items: flex-start;
755
+ gap: 10px;
756
+ padding: 6px 14px;
757
+ }
758
+
759
+ .sched-create-row-icon {
760
+ width: 15px;
761
+ height: 15px;
762
+ color: var(--text-dimmer);
763
+ flex-shrink: 0;
764
+ margin-top: 4px;
765
+ }
766
+
767
+ .sched-create-row-textarea {
768
+ flex: 1;
769
+ background: none;
770
+ border: none;
771
+ outline: none;
772
+ font-size: 13px;
773
+ color: var(--text-secondary);
774
+ padding: 3px 0;
775
+ font-family: inherit;
776
+ resize: none;
777
+ min-height: 44px;
778
+ }
779
+
780
+ .sched-create-row-textarea:focus {
781
+ color: var(--text);
782
+ }
783
+
784
+ .sched-create-row-textarea::placeholder {
785
+ color: var(--text-dimmer);
786
+ }
787
+
788
+ /* --- Task dropdown (JS) --- */
789
+ .sched-create-task-dropdown {
790
+ flex: 1;
791
+ position: relative;
792
+ }
793
+
794
+ .sched-create-task-btn {
795
+ display: flex;
796
+ align-items: center;
797
+ justify-content: space-between;
798
+ width: 100%;
799
+ background: none;
800
+ border: none;
801
+ padding: 3px 0;
802
+ font-size: 13px;
803
+ color: var(--text-muted);
804
+ cursor: pointer;
805
+ font-family: inherit;
806
+ transition: color 0.12s;
807
+ }
808
+
809
+ .sched-create-task-btn:hover {
810
+ color: var(--text);
811
+ }
812
+
813
+ .sched-create-task-btn.has-value .sched-create-task-label {
814
+ color: var(--text);
815
+ font-weight: 500;
816
+ }
817
+
818
+ .sched-create-task-label {
819
+ overflow: hidden;
820
+ text-overflow: ellipsis;
821
+ white-space: nowrap;
822
+ }
823
+
824
+ .sched-create-task-btn svg {
825
+ width: 12px;
826
+ height: 12px;
827
+ color: var(--text-dimmer);
828
+ flex-shrink: 0;
829
+ }
830
+
831
+ .sched-create-task-btn.invalid .sched-create-task-label {
832
+ color: var(--error, #ff5555);
833
+ }
834
+
835
+ .sched-create-task-list {
836
+ position: absolute;
837
+ top: calc(100% + 6px);
838
+ left: -26px;
839
+ right: -14px;
840
+ background: var(--bg);
841
+ border: 1px solid var(--border);
842
+ border-radius: 8px;
843
+ box-shadow: 0 6px 20px rgba(0,0,0,0.25);
844
+ z-index: 340;
845
+ max-height: 200px;
846
+ overflow-y: auto;
847
+ padding: 4px;
848
+ }
849
+
850
+ .sched-create-task-list.hidden {
851
+ display: none;
852
+ }
853
+
854
+ .sched-create-task-item {
855
+ padding: 7px 10px;
856
+ font-size: 13px;
857
+ color: var(--text);
858
+ cursor: pointer;
859
+ border-radius: 6px;
860
+ transition: background 0.1s;
861
+ overflow: hidden;
862
+ text-overflow: ellipsis;
863
+ white-space: nowrap;
864
+ }
865
+
866
+ .sched-create-task-item:hover {
867
+ background: var(--hover);
868
+ }
869
+
870
+ .sched-create-task-item.selected {
871
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
872
+ color: var(--accent);
873
+ font-weight: 600;
874
+ }
875
+
876
+ .sched-create-task-empty {
877
+ padding: 10px;
878
+ font-size: 12px;
879
+ color: var(--text-dimmer);
880
+ text-align: center;
881
+ }
882
+
883
+ /* --- Bottom bar --- */
884
+ .sched-create-bottom {
885
+ display: flex;
886
+ align-items: center;
887
+ justify-content: space-between;
888
+ padding: 10px 14px;
889
+ border-top: 1px solid var(--border-subtle, var(--border));
890
+ margin-top: 2px;
891
+ }
892
+
893
+ .sched-create-save-btn {
894
+ background: var(--accent);
895
+ color: #fff;
896
+ border: none;
897
+ border-radius: 6px;
898
+ padding: 7px 20px;
899
+ font-size: 13px;
900
+ font-weight: 600;
901
+ cursor: pointer;
902
+ transition: filter 0.12s;
903
+ }
904
+
905
+ .sched-create-save-btn:hover {
906
+ filter: brightness(1.1);
907
+ }
908
+
909
+ .sched-create-bottom-right {
910
+ display: flex;
911
+ align-items: center;
912
+ gap: 8px;
913
+ }
914
+
915
+ .sched-create-delete-btn {
916
+ display: inline-flex;
917
+ align-items: center;
918
+ justify-content: center;
919
+ background: none;
920
+ border: 1px solid var(--border);
921
+ border-radius: 6px;
922
+ padding: 6px 8px;
923
+ cursor: pointer;
924
+ color: var(--text-secondary);
925
+ transition: color 0.12s, border-color 0.12s, background 0.12s;
926
+ }
927
+ .sched-create-delete-btn .lucide { width: 15px; height: 15px; }
928
+ .sched-create-delete-btn:hover {
929
+ color: #e55;
930
+ border-color: #e55;
931
+ background: rgba(238, 85, 85, 0.08);
932
+ }
933
+ .sched-create-delete-btn.hidden { display: none; }
934
+
935
+ /* Delete recurring event — standalone dialog */
936
+ .sched-delete-dialog-backdrop {
937
+ position: fixed;
938
+ inset: 0;
939
+ z-index: 400;
940
+ background: rgba(0, 0, 0, 0.45);
941
+ display: flex;
942
+ align-items: center;
943
+ justify-content: center;
944
+ animation: sched-delete-backdrop-in 0.15s ease-out;
945
+ }
946
+ .sched-delete-dialog-backdrop.hidden { display: none; }
947
+ @keyframes sched-delete-backdrop-in {
948
+ from { opacity: 0; }
949
+ to { opacity: 1; }
950
+ }
951
+ .sched-delete-dialog {
952
+ background: var(--bg);
953
+ border: 1px solid var(--border);
954
+ border-radius: 12px;
955
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35);
956
+ width: 320px;
957
+ max-width: 90vw;
958
+ overflow: hidden;
959
+ animation: sched-delete-dialog-in 0.15s ease-out;
960
+ }
961
+ @keyframes sched-delete-dialog-in {
962
+ from { opacity: 0; transform: scale(0.95) translateY(8px); }
963
+ to { opacity: 1; transform: scale(1) translateY(0); }
964
+ }
965
+ .sched-delete-dialog-title {
966
+ font-size: 14px;
967
+ font-weight: 700;
968
+ color: var(--text);
969
+ padding: 16px 18px 8px;
970
+ }
971
+ .sched-delete-dialog-body {
972
+ display: flex;
973
+ flex-direction: column;
974
+ gap: 6px;
975
+ padding: 8px 18px 12px;
976
+ }
977
+ .sched-delete-dialog-body.hidden { display: none; }
978
+ .sched-delete-dialog-footer {
979
+ border-top: 1px solid var(--border-subtle, var(--border));
980
+ padding: 10px 18px;
981
+ display: flex;
982
+ justify-content: flex-end;
983
+ gap: 8px;
984
+ }
985
+ .sched-delete-confirm-btn {
986
+ color: #fff !important;
987
+ background: #e55 !important;
988
+ border-color: #e55 !important;
989
+ border-radius: 8px;
990
+ padding: 7px 18px;
991
+ font-weight: 600;
992
+ }
993
+ .sched-delete-confirm-btn:hover {
994
+ background: #d44 !important;
995
+ border-color: #d44 !important;
996
+ }
997
+ .sched-delete-confirm-btn.hidden { display: none; }
998
+ .sched-delete-option {
999
+ background: none;
1000
+ border: 1px solid var(--border);
1001
+ border-radius: 8px;
1002
+ padding: 9px 14px;
1003
+ font-size: 13px;
1004
+ font-weight: 500;
1005
+ color: var(--text);
1006
+ cursor: pointer;
1007
+ text-align: left;
1008
+ transition: background 0.12s, border-color 0.12s;
1009
+ width: 100%;
1010
+ }
1011
+ .sched-delete-option:hover {
1012
+ background: rgba(var(--overlay-rgb), 0.06);
1013
+ border-color: var(--text-secondary);
1014
+ }
1015
+ .sched-delete-option[data-delete="all"] {
1016
+ color: #e55;
1017
+ }
1018
+ .sched-delete-option[data-delete="all"]:hover {
1019
+ background: rgba(238, 85, 85, 0.08);
1020
+ border-color: #e55;
1021
+ }
1022
+ .sched-delete-option.cancel {
1023
+ color: var(--text-muted);
1024
+ border: none;
1025
+ text-align: center;
1026
+ padding: 7px 14px;
1027
+ }
1028
+ .sched-delete-option.cancel:hover {
1029
+ background: rgba(var(--overlay-rgb), 0.04);
1030
+ }
1031
+
1032
+ /* --- Recurrence dropdown (floating) --- */
1033
+ .sched-create-recurrence-dropdown {
1034
+ position: fixed;
1035
+ width: 280px;
1036
+ background: var(--bg);
1037
+ border: 1px solid var(--border);
1038
+ border-radius: 8px;
1039
+ box-shadow: 0 6px 20px rgba(0,0,0,0.25);
1040
+ z-index: 330;
1041
+ overflow: hidden;
1042
+ }
1043
+
1044
+ .sched-create-recurrence-dropdown.hidden {
1045
+ display: none;
1046
+ }
1047
+
1048
+ .sched-recurrence-options {
1049
+ padding: 4px;
1050
+ display: flex;
1051
+ flex-direction: column;
1052
+ max-height: 260px;
1053
+ overflow-y: auto;
1054
+ }
1055
+
1056
+ .sched-recurrence-option {
1057
+ background: none;
1058
+ border: none;
1059
+ color: var(--text);
1060
+ cursor: pointer;
1061
+ padding: 7px 10px;
1062
+ font-size: 13px;
1063
+ font-weight: 400;
1064
+ text-align: left;
1065
+ transition: background 0.1s;
1066
+ border-radius: 6px;
1067
+ }
1068
+
1069
+ .sched-recurrence-option:hover {
1070
+ background: var(--hover);
1071
+ }
1072
+
1073
+ .sched-recurrence-option.active {
1074
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
1075
+ color: var(--accent);
1076
+ font-weight: 600;
1077
+ }
1078
+
1079
+ /* --- Custom repeat panel --- */
1080
+ .sched-custom-repeat-panel {
1081
+ padding: 0;
1082
+ display: flex;
1083
+ flex-direction: column;
1084
+ }
1085
+
1086
+ .sched-custom-repeat-panel.hidden {
1087
+ display: none;
1088
+ }
1089
+
1090
+ .sched-custom-header {
1091
+ padding: 8px 12px;
1092
+ border-bottom: 1px solid var(--border-subtle, var(--border));
1093
+ }
1094
+
1095
+ .sched-custom-back {
1096
+ background: none;
1097
+ border: none;
1098
+ color: var(--text);
1099
+ cursor: pointer;
1100
+ font-size: 12px;
1101
+ font-weight: 600;
1102
+ padding: 0;
1103
+ display: flex;
1104
+ align-items: center;
1105
+ gap: 1px;
1106
+ }
1107
+
1108
+ .sched-custom-back svg {
1109
+ width: 13px;
1110
+ height: 13px;
1111
+ }
1112
+
1113
+ .sched-custom-back:hover {
1114
+ color: var(--accent);
1115
+ }
1116
+
1117
+ .sched-custom-row {
1118
+ display: flex;
1119
+ align-items: center;
1120
+ gap: 8px;
1121
+ padding: 8px 12px;
1122
+ }
1123
+
1124
+ .sched-custom-label {
1125
+ font-size: 12px;
1126
+ font-weight: 600;
1127
+ color: var(--text-secondary);
1128
+ min-width: 36px;
1129
+ }
1130
+
1131
+ .sched-custom-interval {
1132
+ background: var(--input-bg, var(--bg-alt));
1133
+ border: 1px solid var(--border);
1134
+ border-radius: 6px;
1135
+ padding: 5px 6px;
1136
+ font-size: 12px;
1137
+ color: var(--text);
1138
+ outline: none;
1139
+ width: 46px;
1140
+ text-align: center;
1141
+ font-family: inherit;
1142
+ }
1143
+
1144
+ .sched-custom-interval:focus {
1145
+ border-color: var(--accent);
1146
+ }
1147
+
1148
+ .sched-custom-unit {
1149
+ flex: 1;
1150
+ max-width: 100px;
1151
+ }
1152
+
1153
+ .sched-custom-repeat-panel .sched-field-select {
1154
+ padding: 5px 26px 5px 8px;
1155
+ font-size: 12px;
1156
+ border-radius: 6px;
1157
+ background-position: right 6px center;
1158
+ }
1159
+
1160
+ .sched-custom-dow-section {
1161
+ display: flex;
1162
+ align-items: center;
1163
+ gap: 8px;
1164
+ padding: 4px 12px 8px;
1165
+ }
1166
+
1167
+ .sched-custom-dow-section .sched-dow-row {
1168
+ flex: 1;
1169
+ display: flex;
1170
+ gap: 4px;
1171
+ }
1172
+
1173
+ .sched-custom-dow-section .sched-dow-btn {
1174
+ width: 28px;
1175
+ height: 28px;
1176
+ border-radius: 6px;
1177
+ font-size: 10px;
1178
+ font-weight: 600;
1179
+ }
1180
+
1181
+ .sched-custom-actions {
1182
+ display: flex;
1183
+ gap: 8px;
1184
+ padding: 10px 12px;
1185
+ border-top: 1px solid var(--border-subtle, var(--border));
1186
+ }
1187
+
1188
+ .sched-custom-actions .sched-btn {
1189
+ flex: 1;
1190
+ text-align: center;
1191
+ }
1192
+
1193
+ /* --- End row variants --- */
1194
+ .sched-custom-end-row {
1195
+ flex-wrap: wrap;
1196
+ }
1197
+
1198
+ /* End JS dropdown */
1199
+ .sched-custom-end-dropdown {
1200
+ position: relative;
1201
+ }
1202
+
1203
+ .sched-custom-end-btn {
1204
+ display: flex;
1205
+ align-items: center;
1206
+ gap: 4px;
1207
+ background: var(--input-bg, var(--bg-alt));
1208
+ border: 1px solid var(--border);
1209
+ border-radius: 6px;
1210
+ padding: 5px 8px;
1211
+ font-size: 12px;
1212
+ color: var(--text);
1213
+ cursor: pointer;
1214
+ font-family: inherit;
1215
+ transition: border-color 0.12s;
1216
+ white-space: nowrap;
1217
+ }
1218
+
1219
+ .sched-custom-end-btn:hover {
1220
+ border-color: var(--accent);
1221
+ }
1222
+
1223
+ .sched-custom-end-btn svg {
1224
+ width: 10px;
1225
+ height: 10px;
1226
+ color: var(--text-dimmer);
1227
+ flex-shrink: 0;
1228
+ }
1229
+
1230
+ .sched-custom-end-list {
1231
+ position: fixed;
1232
+ min-width: 80px;
1233
+ background: var(--bg);
1234
+ border: 1px solid var(--border);
1235
+ border-radius: 6px;
1236
+ box-shadow: 0 4px 12px rgba(0,0,0,0.25);
1237
+ z-index: 350;
1238
+ padding: 3px;
1239
+ display: flex;
1240
+ flex-direction: column;
1241
+ }
1242
+
1243
+ .sched-custom-end-list.hidden {
1244
+ display: none;
1245
+ }
1246
+
1247
+ .sched-custom-end-item {
1248
+ background: none;
1249
+ border: none;
1250
+ padding: 6px 10px;
1251
+ font-size: 12px;
1252
+ color: var(--text);
1253
+ cursor: pointer;
1254
+ text-align: left;
1255
+ border-radius: 4px;
1256
+ font-family: inherit;
1257
+ transition: background 0.1s;
1258
+ white-space: nowrap;
1259
+ }
1260
+
1261
+ .sched-custom-end-item:hover {
1262
+ background: var(--hover);
1263
+ }
1264
+
1265
+ .sched-custom-end-item.active {
1266
+ color: var(--accent);
1267
+ font-weight: 600;
1268
+ }
1269
+
1270
+ .sched-custom-end-date-btn {
1271
+ background: var(--input-bg, var(--bg-alt));
1272
+ border: 1px solid var(--border);
1273
+ border-radius: 6px;
1274
+ padding: 5px 10px;
1275
+ font-size: 12px;
1276
+ color: var(--text);
1277
+ cursor: pointer;
1278
+ font-family: inherit;
1279
+ transition: border-color 0.12s;
1280
+ white-space: nowrap;
1281
+ }
1282
+
1283
+ .sched-custom-end-date-btn:hover {
1284
+ border-color: var(--accent);
1285
+ }
1286
+
1287
+ .sched-custom-end-date-btn.hidden,
1288
+ .sched-custom-end-after.hidden {
1289
+ display: none;
1290
+ }
1291
+
1292
+ .sched-custom-end-after {
1293
+ display: flex;
1294
+ align-items: center;
1295
+ gap: 6px;
1296
+ }
1297
+
1298
+ .sched-custom-end-after-input {
1299
+ width: 52px;
1300
+ }
1301
+
1302
+ .sched-custom-end-after-suffix {
1303
+ font-size: 12px;
1304
+ color: var(--text-secondary);
1305
+ }
1306
+
1307
+ /* --- Inline calendar for Until --- */
1308
+ .sched-custom-end-calendar {
1309
+ padding: 8px 12px 4px;
1310
+ }
1311
+
1312
+ .sched-custom-end-calendar.hidden {
1313
+ display: none;
1314
+ }
1315
+
1316
+ .sched-cal-header {
1317
+ display: flex;
1318
+ align-items: center;
1319
+ justify-content: space-between;
1320
+ padding: 0 0 8px;
1321
+ }
1322
+
1323
+ .sched-cal-title {
1324
+ font-size: 13px;
1325
+ font-weight: 600;
1326
+ color: var(--text);
1327
+ }
1328
+
1329
+ .sched-cal-nav {
1330
+ display: flex;
1331
+ gap: 2px;
1332
+ }
1333
+
1334
+ .sched-cal-nav-btn {
1335
+ background: none;
1336
+ border: none;
1337
+ color: var(--text-muted);
1338
+ cursor: pointer;
1339
+ padding: 2px;
1340
+ border-radius: 4px;
1341
+ display: flex;
1342
+ align-items: center;
1343
+ justify-content: center;
1344
+ transition: color 0.1s;
1345
+ }
1346
+
1347
+ .sched-cal-nav-btn svg {
1348
+ width: 14px;
1349
+ height: 14px;
1350
+ }
1351
+
1352
+ .sched-cal-nav-btn:hover {
1353
+ color: var(--text);
1354
+ }
1355
+
1356
+ .sched-cal-weekdays {
1357
+ display: grid;
1358
+ grid-template-columns: repeat(7, 1fr);
1359
+ text-align: center;
1360
+ font-size: 10px;
1361
+ font-weight: 600;
1362
+ color: var(--text-muted);
1363
+ padding-bottom: 4px;
1364
+ }
1365
+
1366
+ .sched-cal-grid {
1367
+ display: grid;
1368
+ grid-template-columns: repeat(7, 1fr);
1369
+ gap: 2px;
1370
+ }
1371
+
1372
+ .sched-cal-day {
1373
+ display: flex;
1374
+ align-items: center;
1375
+ justify-content: center;
1376
+ width: 100%;
1377
+ aspect-ratio: 1;
1378
+ font-size: 11px;
1379
+ color: var(--text);
1380
+ background: none;
1381
+ border: none;
1382
+ border-radius: 50%;
1383
+ cursor: pointer;
1384
+ padding: 0;
1385
+ transition: background 0.1s;
1386
+ }
1387
+
1388
+ .sched-cal-day:hover {
1389
+ background: var(--hover);
1390
+ }
1391
+
1392
+ .sched-cal-day.other-month {
1393
+ color: var(--text-dimmer);
1394
+ }
1395
+
1396
+ .sched-cal-day.selected {
1397
+ background: var(--accent);
1398
+ color: #fff;
1399
+ font-weight: 700;
1400
+ }
1401
+
1402
+ .sched-cal-day.today {
1403
+ font-weight: 700;
1404
+ color: var(--accent);
1405
+ }
1406
+
1407
+ .sched-cal-day.today.selected {
1408
+ color: #fff;
1409
+ }
1410
+
1411
+ /* Calendar cell clickable */
1412
+ .scheduler-cell {
1413
+ cursor: pointer;
1414
+ }
1415
+
1416
+ .scheduler-cell:hover {
1417
+ background: color-mix(in srgb, var(--accent) 5%, transparent);
1418
+ }
1419
+
1420
+ @media (max-width: 480px) {
1421
+ .sched-create-popover {
1422
+ width: calc(100vw - 20px);
1423
+ left: 10px !important;
1424
+ right: 10px !important;
1425
+ }
1426
+ .sched-create-recurrence-dropdown {
1427
+ width: calc(100vw - 24px);
1428
+ }
1429
+ }