@tasknotes/calendar 0.0.0-stage → 0.1.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/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +163 -2
  4. package/dist/calendar.css +1345 -0
  5. package/dist/cjs/core.cjs +716 -0
  6. package/dist/cjs/index.cjs +4206 -0
  7. package/dist/cjs/react.cjs +4034 -0
  8. package/dist/esm/chunk-DVMZ5OXN.js +694 -0
  9. package/dist/esm/chunk-L4WKZ6WT.js +0 -0
  10. package/dist/esm/chunk-UWCSL5AN.js +3401 -0
  11. package/dist/esm/core.js +85 -0
  12. package/dist/esm/index.js +223 -0
  13. package/dist/esm/react.js +46 -0
  14. package/dist/types/core/date.d.cts +30 -0
  15. package/dist/types/core/date.d.ts +30 -0
  16. package/dist/types/core/index.d.cts +7 -0
  17. package/dist/types/core/index.d.ts +7 -0
  18. package/dist/types/core/layout.d.cts +82 -0
  19. package/dist/types/core/layout.d.ts +82 -0
  20. package/dist/types/core/order.d.cts +7 -0
  21. package/dist/types/core/order.d.ts +7 -0
  22. package/dist/types/core/plan.d.cts +42 -0
  23. package/dist/types/core/plan.d.ts +42 -0
  24. package/dist/types/core/store.d.cts +60 -0
  25. package/dist/types/core/store.d.ts +60 -0
  26. package/dist/types/core/types.d.cts +69 -0
  27. package/dist/types/core/types.d.ts +69 -0
  28. package/dist/types/core/zone.d.cts +43 -0
  29. package/dist/types/core/zone.d.ts +43 -0
  30. package/dist/types/dom/calendar.d.cts +206 -0
  31. package/dist/types/dom/calendar.d.ts +206 -0
  32. package/dist/types/dom/context.d.cts +107 -0
  33. package/dist/types/dom/context.d.ts +107 -0
  34. package/dist/types/dom/dom.d.cts +8 -0
  35. package/dist/types/dom/dom.d.ts +8 -0
  36. package/dist/types/dom/format.d.cts +30 -0
  37. package/dist/types/dom/format.d.ts +30 -0
  38. package/dist/types/dom/options.d.cts +401 -0
  39. package/dist/types/dom/options.d.ts +401 -0
  40. package/dist/types/dom/views/daygrid.d.cts +42 -0
  41. package/dist/types/dom/views/daygrid.d.ts +42 -0
  42. package/dist/types/dom/views/list.d.cts +27 -0
  43. package/dist/types/dom/views/list.d.ts +27 -0
  44. package/dist/types/dom/views/timegrid.d.cts +54 -0
  45. package/dist/types/dom/views/timegrid.d.ts +54 -0
  46. package/dist/types/dom/views/timeline.d.cts +83 -0
  47. package/dist/types/dom/views/timeline.d.ts +83 -0
  48. package/dist/types/dom/views/year.d.cts +26 -0
  49. package/dist/types/dom/views/year.d.ts +26 -0
  50. package/dist/types/index.d.cts +6 -0
  51. package/dist/types/index.d.ts +6 -0
  52. package/dist/types/react/index.d.cts +20 -0
  53. package/dist/types/react/index.d.ts +20 -0
  54. package/dist/types/tasknotes/bases.d.cts +50 -0
  55. package/dist/types/tasknotes/bases.d.ts +50 -0
  56. package/package.json +108 -5
@@ -0,0 +1,1345 @@
1
+ /*
2
+ * @tasknotes/calendar. Every colour and size is a custom property on `.tnc`,
3
+ * so hosts theme it by setting variables (Obsidian: map to --background-primary
4
+ * etc.). Nothing here targets elements outside `.tnc`.
5
+ */
6
+ .tnc {
7
+ --tnc-bg: initial;
8
+ --tnc-surface: var(--tnc-theme-bg, #fff);
9
+ --tnc-surface-2: var(--tnc-theme-bg-2, #f8f7f5);
10
+ --tnc-surface-3: var(--tnc-theme-bg-3, #efede9);
11
+ --tnc-line: var(--tnc-theme-line, #e7e4df);
12
+ --tnc-line-strong: var(--tnc-theme-line-strong, #d6d1ca);
13
+ --tnc-text: var(--tnc-theme-text, #1b1815);
14
+ --tnc-muted: var(--tnc-theme-muted, #6b645c);
15
+ --tnc-faint: var(--tnc-theme-faint, #9b948b);
16
+ --tnc-accent: var(--tnc-theme-accent, #7c5cf0);
17
+ --tnc-accent-text: var(--tnc-theme-accent-text, #fff);
18
+ --tnc-accent-soft: color-mix(in srgb, var(--tnc-accent) 13%, transparent);
19
+ --tnc-now: var(--tnc-theme-now, #e5484d);
20
+ --tnc-warn: var(--tnc-theme-warn, #d92a85);
21
+ --tnc-ok: var(--tnc-theme-ok, #16a34a);
22
+ --tnc-amber: var(--tnc-theme-amber, #d97706);
23
+ --tnc-off: color-mix(in srgb, var(--tnc-text) 3.5%, transparent);
24
+ --tnc-shadow: 0 8px 24px rgb(0 0 0 / 0.16);
25
+ --tnc-radius: 6px;
26
+ --tnc-font-size: 12px;
27
+ --tnc-small: 11px;
28
+ --tnc-bar-h: 20px;
29
+ /* "+N more" link height; rows make room for it. Hosts with taller (touch) links set this. */
30
+ --tnc-more-h: var(--tnc-bar-h);
31
+ /* Month dots (monthDisplay: "dots"). */
32
+ --tnc-dot-size: 8px;
33
+ --tnc-dot-gap: 3px;
34
+ --tnc-gutter-w: 52px;
35
+ --tnc-weeknum-w: 32px;
36
+ --tnc-dg-top-h: 24px;
37
+ --tnc-day-min-h: 92px;
38
+ --tnc-item-c: var(--tnc-accent);
39
+
40
+ position: relative;
41
+ display: flex;
42
+ flex-direction: column;
43
+ min-height: 0;
44
+ color: var(--tnc-text);
45
+ background: var(--tnc-surface);
46
+ font-size: var(--tnc-font-size);
47
+ line-height: 1.35;
48
+ -webkit-tap-highlight-color: transparent;
49
+ }
50
+ .tnc *,
51
+ .tnc *::before,
52
+ .tnc *::after {
53
+ box-sizing: border-box;
54
+ }
55
+ .tnc [hidden] {
56
+ display: none !important;
57
+ }
58
+ .tnc--height-fill {
59
+ height: 100%;
60
+ }
61
+ .tnc button {
62
+ font: inherit;
63
+ color: inherit;
64
+ }
65
+ .tnc-dragging,
66
+ .tnc-dragging * {
67
+ user-select: none !important;
68
+ -webkit-user-select: none !important;
69
+ }
70
+ .tnc-dragging-move,
71
+ .tnc-dragging-move * {
72
+ cursor: grabbing !important;
73
+ }
74
+ .tnc-dragging-resize-end .tnc-tg *,
75
+ .tnc-dragging-resize-start .tnc-tg * {
76
+ cursor: ns-resize !important;
77
+ }
78
+ .tnc-drop-denied,
79
+ .tnc-drop-denied * {
80
+ cursor: not-allowed !important;
81
+ }
82
+
83
+ /* ------------------------------------------------------------- toolbar */
84
+ .tnc-toolbar {
85
+ display: flex;
86
+ flex-wrap: wrap;
87
+ gap: 6px 12px;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ padding: 6px 8px;
91
+ border-bottom: 1px solid var(--tnc-line);
92
+ }
93
+ .tnc-toolbar-start,
94
+ .tnc-toolbar-end,
95
+ .tnc-toolbar-group {
96
+ display: flex;
97
+ gap: 4px;
98
+ align-items: center;
99
+ flex-wrap: wrap;
100
+ }
101
+ .tnc-toolbar-start {
102
+ gap: 10px;
103
+ }
104
+ .tnc-title {
105
+ margin: 0;
106
+ font-size: 14px;
107
+ font-weight: 650;
108
+ white-space: nowrap;
109
+ }
110
+ .tnc-btn {
111
+ min-height: 26px;
112
+ padding: 3px 10px;
113
+ border: 1px solid var(--tnc-line-strong);
114
+ border-radius: var(--tnc-radius);
115
+ background: var(--tnc-surface);
116
+ cursor: pointer;
117
+ font-size: var(--tnc-font-size);
118
+ line-height: 1.2;
119
+ }
120
+ .tnc-btn:hover {
121
+ background: var(--tnc-surface-3);
122
+ }
123
+ .tnc-btn[aria-pressed="true"] {
124
+ background: var(--tnc-accent-soft);
125
+ border-color: var(--tnc-accent);
126
+ color: var(--tnc-accent);
127
+ }
128
+ .tnc-btn-prev,
129
+ .tnc-btn-next {
130
+ min-width: 28px;
131
+ padding: 3px 6px;
132
+ font-size: 15px;
133
+ }
134
+ .tnc-btn:focus-visible,
135
+ .tnc-navlink:focus-visible,
136
+ .tnc-item:focus-visible,
137
+ .tnc-more:focus-visible,
138
+ .tnc-ym-day:focus-visible,
139
+ .tnc-dg-day[tabindex]:focus-visible {
140
+ outline: 2px solid var(--tnc-accent);
141
+ outline-offset: 1px;
142
+ }
143
+
144
+ .tnc-view {
145
+ position: relative;
146
+ flex: 1 1 auto;
147
+ min-height: 0;
148
+ display: flex;
149
+ flex-direction: column;
150
+ }
151
+ .tnc-view > * {
152
+ flex: 1 1 auto;
153
+ min-height: 0;
154
+ }
155
+ .tnc-navlink {
156
+ border: 0;
157
+ background: none;
158
+ padding: 0;
159
+ cursor: pointer;
160
+ text-align: inherit;
161
+ }
162
+ .tnc-navlink:hover {
163
+ text-decoration: underline;
164
+ }
165
+
166
+ /* ---------------------------------------------------------------- items */
167
+ .tnc-item {
168
+ --c: var(--tnc-c, var(--tnc-item-c));
169
+ position: absolute;
170
+ overflow: hidden;
171
+ border-radius: var(--tnc-radius);
172
+ color: var(--tnc-fg, var(--tnc-text));
173
+ font-size: var(--tnc-small);
174
+ line-height: 1.25;
175
+ cursor: pointer;
176
+ user-select: none;
177
+ -webkit-user-select: none;
178
+ -webkit-touch-callout: none;
179
+ }
180
+ .tnc-item-main {
181
+ display: flex;
182
+ min-width: 0;
183
+ overflow: hidden;
184
+ }
185
+ .tnc-item-title {
186
+ font-weight: 600;
187
+ overflow: hidden;
188
+ text-overflow: ellipsis;
189
+ min-width: 0;
190
+ }
191
+ .tnc-item-time {
192
+ color: color-mix(in srgb, var(--tnc-fg, var(--tnc-text)) 70%, transparent);
193
+ white-space: nowrap;
194
+ flex: none;
195
+ font-variant-numeric: tabular-nums;
196
+ }
197
+ .tnc-item-time:empty {
198
+ display: none;
199
+ }
200
+ .tnc-item.is-draggable {
201
+ /* Long-press drags need the browser not to claim the touch for panning; the calendar pans by hand. */
202
+ touch-action: none;
203
+ }
204
+ .tnc-item.is-completed {
205
+ opacity: 0.55;
206
+ }
207
+ .tnc-item.is-completed .tnc-item-title {
208
+ text-decoration: line-through;
209
+ }
210
+ .tnc-item.is-conflict {
211
+ box-shadow: 0 0 0 1.5px var(--tnc-warn);
212
+ }
213
+ .tnc-item.is-hover {
214
+ filter: brightness(0.97);
215
+ z-index: 20 !important;
216
+ }
217
+ .tnc-item.is-dragging {
218
+ z-index: 40 !important;
219
+ box-shadow: var(--tnc-shadow);
220
+ opacity: 0.92;
221
+ }
222
+ .tnc-item.is-mirror {
223
+ opacity: 0.8;
224
+ border-style: dashed !important;
225
+ pointer-events: none;
226
+ }
227
+
228
+ /* timed (time grid) */
229
+ .tnc-item--timed {
230
+ padding: 2px 5px 2px 6px;
231
+ background: var(--tnc-bg, color-mix(in srgb, var(--c) 14%, var(--tnc-surface)));
232
+ border: 1px solid var(--tnc-border, color-mix(in srgb, var(--c) 34%, transparent));
233
+ border-left: 3px solid var(--tnc-border, var(--c));
234
+ }
235
+ .tnc-item--timed .tnc-item-main {
236
+ flex-direction: column;
237
+ gap: 1px;
238
+ height: 100%;
239
+ }
240
+ .tnc-item--timed .tnc-item-title {
241
+ display: -webkit-box;
242
+ -webkit-box-orient: vertical;
243
+ -webkit-line-clamp: 6;
244
+ white-space: normal;
245
+ overflow-wrap: anywhere;
246
+ }
247
+ .tnc-item--timed.is-short {
248
+ padding-top: 0;
249
+ padding-bottom: 0;
250
+ }
251
+ .tnc-item--timed.is-short .tnc-item-main {
252
+ flex-direction: row;
253
+ align-items: center;
254
+ gap: 5px;
255
+ white-space: nowrap;
256
+ }
257
+ .tnc-item--timed.is-short .tnc-item-title {
258
+ -webkit-line-clamp: 1;
259
+ white-space: nowrap;
260
+ display: block;
261
+ }
262
+ .tnc-item--timed.is-short .tnc-item-time {
263
+ flex: none;
264
+ }
265
+ .tnc-item--timed.is-short .tnc-item-time-end {
266
+ display: none;
267
+ }
268
+ .tnc-item--timed.is-cont-start {
269
+ border-top-left-radius: 0;
270
+ border-top-right-radius: 0;
271
+ border-top-style: dashed;
272
+ }
273
+ .tnc-item--timed.is-cont-end {
274
+ border-bottom-left-radius: 0;
275
+ border-bottom-right-radius: 0;
276
+ border-bottom-style: dashed;
277
+ }
278
+ .tnc-item--timed.is-actual {
279
+ padding: 1px 3px;
280
+ border-left-width: 1px;
281
+ background: repeating-linear-gradient(
282
+ 45deg,
283
+ color-mix(in srgb, var(--c) 30%, var(--tnc-surface)) 0 4px,
284
+ color-mix(in srgb, var(--c) 14%, var(--tnc-surface)) 4px 8px
285
+ );
286
+ }
287
+ .tnc-item.is-background {
288
+ left: 0;
289
+ right: 0;
290
+ border-radius: 0;
291
+ background: var(--tnc-bg, color-mix(in srgb, var(--c) 12%, transparent));
292
+ pointer-events: none;
293
+ }
294
+
295
+ /* bars (all-day row, month spans, popover) */
296
+ .tnc-item--bar {
297
+ height: var(--tnc-bar-h);
298
+ padding: 0 6px;
299
+ display: flex;
300
+ align-items: center;
301
+ background: var(--tnc-bg, color-mix(in srgb, var(--c) 16%, var(--tnc-surface)));
302
+ border: 1px solid var(--tnc-border, color-mix(in srgb, var(--c) 42%, transparent));
303
+ white-space: nowrap;
304
+ }
305
+ .tnc-item--bar .tnc-item-main {
306
+ gap: 5px;
307
+ align-items: center;
308
+ width: 100%;
309
+ }
310
+ .tnc-item--bar.is-cont-start {
311
+ border-top-left-radius: 0;
312
+ border-bottom-left-radius: 0;
313
+ border-left-style: dashed;
314
+ }
315
+ .tnc-item--bar.is-cont-end {
316
+ border-top-right-radius: 0;
317
+ border-bottom-right-radius: 0;
318
+ border-right-style: dashed;
319
+ }
320
+
321
+ /* dots (timed items in day cells); dots have no border, even when a host sets a border style */
322
+ .tnc-item.tnc-item--dot {
323
+ border-width: 0;
324
+ }
325
+ .tnc-item--dot {
326
+ height: var(--tnc-bar-h);
327
+ padding: 0 4px;
328
+ display: flex;
329
+ align-items: center;
330
+ white-space: nowrap;
331
+ }
332
+ .tnc-item--dot:hover,
333
+ .tnc-item--dot.is-hover {
334
+ background: var(--tnc-surface-3);
335
+ }
336
+ .tnc-item--dot .tnc-item-main {
337
+ gap: 4px;
338
+ align-items: center;
339
+ width: 100%;
340
+ }
341
+ .tnc-item--dot .tnc-item-title {
342
+ font-weight: 500;
343
+ }
344
+ .tnc-item-dot {
345
+ width: 7px;
346
+ height: 7px;
347
+ border-radius: 50%;
348
+ flex: none;
349
+ background: var(--tnc-border, var(--c));
350
+ }
351
+
352
+ /* resize handles */
353
+ .tnc-resize {
354
+ position: absolute;
355
+ z-index: 2;
356
+ }
357
+ .tnc-resize.is-v {
358
+ left: 0;
359
+ right: 0;
360
+ height: 8px;
361
+ cursor: ns-resize;
362
+ }
363
+ .tnc-resize-end.is-v {
364
+ bottom: -1px;
365
+ }
366
+ .tnc-resize-start.is-v {
367
+ top: -1px;
368
+ }
369
+ .tnc-resize.is-h {
370
+ top: 0;
371
+ bottom: 0;
372
+ width: 8px;
373
+ cursor: ew-resize;
374
+ }
375
+ .tnc-resize-end.is-h {
376
+ right: -1px;
377
+ }
378
+ .tnc-resize-start.is-h {
379
+ left: -1px;
380
+ }
381
+
382
+ /* selection */
383
+ .tnc-sel-layer,
384
+ .tnc-more-layer {
385
+ position: absolute;
386
+ inset: 0;
387
+ pointer-events: none;
388
+ }
389
+ .tnc-more-layer > * {
390
+ pointer-events: auto;
391
+ }
392
+ .tnc-sel {
393
+ position: absolute;
394
+ left: 0;
395
+ right: 0;
396
+ background: var(--tnc-accent-soft);
397
+ border-radius: 4px;
398
+ }
399
+ .tnc-sel--mirror {
400
+ border: 1.5px dashed var(--tnc-accent);
401
+ color: var(--tnc-accent);
402
+ font-weight: 600;
403
+ font-size: var(--tnc-small);
404
+ padding: 2px 6px;
405
+ left: 2px;
406
+ right: 2px;
407
+ overflow: hidden;
408
+ }
409
+
410
+ .tnc-more {
411
+ position: absolute;
412
+ height: var(--tnc-more-h);
413
+ border: 0;
414
+ border-radius: 4px;
415
+ background: none;
416
+ padding: 0 4px;
417
+ text-align: left;
418
+ color: var(--tnc-muted);
419
+ font-size: var(--tnc-small);
420
+ font-weight: 600;
421
+ cursor: pointer;
422
+ white-space: nowrap;
423
+ overflow: hidden;
424
+ text-overflow: ellipsis;
425
+ }
426
+ .tnc-more:hover {
427
+ background: var(--tnc-surface-3);
428
+ color: var(--tnc-text);
429
+ }
430
+ .tnc-more--stack {
431
+ height: auto;
432
+ min-height: 20px;
433
+ text-align: center;
434
+ background: var(--tnc-surface-3);
435
+ z-index: 30;
436
+ }
437
+
438
+ /* ------------------------------------------------------------ time grid */
439
+ .tnc-tg {
440
+ position: relative;
441
+ display: flex;
442
+ flex-direction: column;
443
+ min-height: 0;
444
+ }
445
+ .tnc-tg-scroll {
446
+ flex: 1 1 auto;
447
+ min-height: 0;
448
+ overflow: auto;
449
+ overscroll-behavior: contain;
450
+ }
451
+ .tnc--height-auto .tnc-tg-scroll {
452
+ overflow: visible;
453
+ }
454
+ .tnc-tg-top {
455
+ position: sticky;
456
+ top: 0;
457
+ z-index: 50;
458
+ background: var(--tnc-surface);
459
+ box-shadow: 0 1px 0 var(--tnc-line-strong);
460
+ }
461
+ .tnc-tg-cols {
462
+ display: grid;
463
+ grid-template-columns: var(--tnc-cols);
464
+ }
465
+ .tnc-gutter-head {
466
+ display: flex;
467
+ align-items: flex-end;
468
+ justify-content: flex-end;
469
+ padding: 4px 6px;
470
+ color: var(--tnc-faint);
471
+ font-size: 10px;
472
+ }
473
+ .tnc-dh {
474
+ min-width: 0;
475
+ padding: 5px 6px 5px 7px;
476
+ border-left: 1px solid var(--tnc-line);
477
+ overflow: hidden;
478
+ }
479
+ .tnc-dh-label {
480
+ display: inline-flex;
481
+ gap: 5px;
482
+ align-items: baseline;
483
+ white-space: nowrap;
484
+ }
485
+ .tnc-dh-dow {
486
+ color: var(--tnc-muted);
487
+ font-size: var(--tnc-small);
488
+ text-transform: uppercase;
489
+ letter-spacing: 0.03em;
490
+ }
491
+ .tnc-dh-num {
492
+ font-size: 15px;
493
+ font-weight: 650;
494
+ line-height: 1.25;
495
+ }
496
+ .tnc-dh.is-today .tnc-dh-num {
497
+ background: var(--tnc-accent);
498
+ color: var(--tnc-accent-text);
499
+ border-radius: 999px;
500
+ padding: 0 7px;
501
+ }
502
+ .tnc-cap {
503
+ position: relative;
504
+ margin-top: 5px;
505
+ height: 4px;
506
+ border-radius: 2px;
507
+ background: var(--tnc-surface-3);
508
+ }
509
+ .tnc-cap i {
510
+ display: block;
511
+ height: 100%;
512
+ border-radius: 2px;
513
+ background: var(--tnc-ok);
514
+ transition: width 0.2s;
515
+ }
516
+ .tnc-cap.is-warn i {
517
+ background: var(--tnc-amber);
518
+ }
519
+ .tnc-cap.is-over i {
520
+ background: var(--tnc-warn);
521
+ }
522
+ .tnc-cap-txt {
523
+ position: absolute;
524
+ top: 5px;
525
+ left: 0;
526
+ font-size: 10px;
527
+ color: var(--tnc-faint);
528
+ white-space: nowrap;
529
+ }
530
+ .tnc-cap.is-over .tnc-cap-txt {
531
+ color: var(--tnc-warn);
532
+ font-weight: 600;
533
+ }
534
+ .tnc-dh:has(.tnc-cap) {
535
+ padding-bottom: 18px;
536
+ }
537
+ .tnc-tg-allday {
538
+ border-top: 1px solid var(--tnc-line);
539
+ }
540
+ .tnc-gutter-label {
541
+ padding: 4px 6px;
542
+ font-size: 10px;
543
+ color: var(--tnc-faint);
544
+ text-align: right;
545
+ line-height: 1.2;
546
+ }
547
+ .tnc-allday-layer {
548
+ position: relative;
549
+ grid-column: 2 / -1;
550
+ min-height: calc(var(--tnc-bar-h) + 8px);
551
+ border-left: 1px solid var(--tnc-line);
552
+ }
553
+ .tnc-tg--no-grid .tnc-allday-layer {
554
+ min-height: 160px;
555
+ }
556
+ .tnc-tg-body {
557
+ position: relative;
558
+ }
559
+ .tnc-gutter {
560
+ position: relative;
561
+ border-right: 1px solid var(--tnc-line);
562
+ }
563
+ .tnc-slot-label {
564
+ position: absolute;
565
+ right: 6px;
566
+ transform: translateY(-50%);
567
+ font-size: 10.5px;
568
+ color: var(--tnc-faint);
569
+ font-variant-numeric: tabular-nums;
570
+ white-space: nowrap;
571
+ }
572
+ .tnc-now-label {
573
+ position: absolute;
574
+ right: 0;
575
+ width: 6px;
576
+ height: 2px;
577
+ background: var(--tnc-now);
578
+ transform: translateY(-1px);
579
+ }
580
+ .tnc-col {
581
+ position: relative;
582
+ min-width: 0;
583
+ border-left: 1px solid var(--tnc-line);
584
+ background-image:
585
+ repeating-linear-gradient(to bottom, var(--tnc-line) 0 1px, transparent 1px var(--tnc-hour-px)),
586
+ repeating-linear-gradient(
587
+ to bottom,
588
+ color-mix(in srgb, var(--tnc-line) 55%, transparent) 0 1px,
589
+ transparent 1px var(--tnc-slot-px)
590
+ );
591
+ background-position: 0 var(--tnc-grid-offset, 0);
592
+ }
593
+ .tnc-col.is-weekend {
594
+ background-color: var(--tnc-off);
595
+ }
596
+ .tnc-col.is-today {
597
+ background-color: color-mix(in srgb, var(--tnc-accent) 5%, transparent);
598
+ }
599
+ .tnc-col-plan,
600
+ .tnc-col-bg,
601
+ .tnc-col-actual {
602
+ position: absolute;
603
+ top: 0;
604
+ bottom: 0;
605
+ }
606
+ .tnc-col-bg {
607
+ left: 0;
608
+ right: 0;
609
+ }
610
+ .tnc-col-plan {
611
+ left: 1px;
612
+ right: 8px;
613
+ }
614
+ .tnc-col-actual {
615
+ display: none;
616
+ right: 2px;
617
+ width: 22%;
618
+ }
619
+ .tnc-col.has-actual .tnc-col-plan {
620
+ right: calc(22% + 4px);
621
+ }
622
+ .tnc-col.has-actual .tnc-col-actual {
623
+ display: block;
624
+ }
625
+ .tnc-now {
626
+ position: absolute;
627
+ left: 0;
628
+ right: 0;
629
+ height: 2px;
630
+ background: var(--tnc-now);
631
+ z-index: 45;
632
+ pointer-events: none;
633
+ transform: translateY(-1px);
634
+ }
635
+ .tnc-now::before {
636
+ content: "";
637
+ position: absolute;
638
+ left: -5px;
639
+ top: -4px;
640
+ width: 10px;
641
+ height: 10px;
642
+ border-radius: 50%;
643
+ background: var(--tnc-now);
644
+ }
645
+
646
+ /* ----------------------------------------------------------------- month */
647
+ .tnc-dg {
648
+ display: flex;
649
+ flex-direction: column;
650
+ min-height: 0;
651
+ }
652
+ .tnc-dg-scroll {
653
+ flex: 1 1 auto;
654
+ min-height: 0;
655
+ overflow: auto;
656
+ }
657
+ .tnc-dg-grid {
658
+ display: flex;
659
+ flex-direction: column;
660
+ min-height: 100%;
661
+ }
662
+ .tnc-dg--auto .tnc-dg-grid {
663
+ min-height: 0;
664
+ }
665
+ .tnc-dg-head,
666
+ .tnc-dg-week {
667
+ display: grid;
668
+ grid-template-columns: var(--tnc-cols);
669
+ }
670
+ .tnc-dg-head {
671
+ position: sticky;
672
+ top: 0;
673
+ z-index: 5;
674
+ background: var(--tnc-surface);
675
+ border-bottom: 1px solid var(--tnc-line-strong);
676
+ }
677
+ .tnc-dg-dow {
678
+ padding: 5px 7px;
679
+ color: var(--tnc-muted);
680
+ font-size: var(--tnc-small);
681
+ text-transform: uppercase;
682
+ letter-spacing: 0.03em;
683
+ overflow: hidden;
684
+ white-space: nowrap;
685
+ }
686
+ .tnc-dg-week {
687
+ position: relative;
688
+ flex: 1 1 0;
689
+ /* --tnc-dg-need is the tallest cell's content, measured by the view (bars and the real "+N more" height). */
690
+ min-height: max(var(--tnc-day-min-h), var(--tnc-dg-need, 0px));
691
+ border-bottom: 1px solid var(--tnc-line);
692
+ }
693
+ .tnc-dg--auto .tnc-dg-week {
694
+ flex: none;
695
+ }
696
+ .tnc-weeknum,
697
+ .tnc-weeknum-head {
698
+ padding: 4px;
699
+ font-size: 10px;
700
+ color: var(--tnc-faint);
701
+ text-align: center;
702
+ border-right: 1px solid var(--tnc-line);
703
+ }
704
+ .tnc-dg-day {
705
+ min-width: 0;
706
+ border-left: 1px solid var(--tnc-line);
707
+ }
708
+ .tnc-dg-day:first-of-type {
709
+ border-left: 0;
710
+ }
711
+ .tnc-dg-day.is-weekend {
712
+ background: var(--tnc-off);
713
+ }
714
+ .tnc-dg-day.is-other-month .tnc-dg-num {
715
+ color: var(--tnc-faint);
716
+ }
717
+ .tnc-dg-day.is-today {
718
+ background: color-mix(in srgb, var(--tnc-accent) 6%, transparent);
719
+ }
720
+ .tnc-dg-top {
721
+ height: var(--tnc-dg-top-h);
722
+ padding: 3px 6px 0;
723
+ display: flex;
724
+ justify-content: flex-end;
725
+ }
726
+ .tnc-dg-num {
727
+ font-size: var(--tnc-small);
728
+ font-weight: 600;
729
+ line-height: 18px;
730
+ min-width: 18px;
731
+ text-align: center;
732
+ white-space: nowrap;
733
+ }
734
+ .tnc-dg-day.is-today .tnc-dg-num {
735
+ background: var(--tnc-accent);
736
+ color: var(--tnc-accent-text);
737
+ border-radius: 999px;
738
+ padding: 0 5px;
739
+ }
740
+ .tnc-dg-layer {
741
+ position: absolute;
742
+ inset: 0;
743
+ pointer-events: none;
744
+ }
745
+ .tnc-weeknum ~ .tnc-dg-layer,
746
+ .tnc-dg-week:has(.tnc-weeknum) .tnc-dg-layer {
747
+ left: var(--tnc-weeknum-w);
748
+ }
749
+ .tnc-dg-dates,
750
+ .tnc-dg-content {
751
+ display: contents;
752
+ }
753
+ .tnc-dg-layer .tnc-item {
754
+ pointer-events: auto;
755
+ }
756
+ .tnc-dg-layer .tnc-sel {
757
+ top: 0;
758
+ bottom: 0;
759
+ }
760
+
761
+ /* month dots: the day cell is the target; dots wrap and only indicate */
762
+ .tnc-dg--dots .tnc-dg-day {
763
+ position: relative;
764
+ cursor: pointer;
765
+ }
766
+ .tnc-dg-dots {
767
+ position: absolute;
768
+ top: var(--tnc-dg-top-h);
769
+ left: 6px;
770
+ right: 6px;
771
+ bottom: 4px;
772
+ display: flex;
773
+ flex-wrap: wrap;
774
+ align-content: flex-start;
775
+ align-items: center;
776
+ gap: var(--tnc-dot-gap);
777
+ overflow: hidden;
778
+ pointer-events: none;
779
+ }
780
+ .tnc-dg-dots.is-unlimited {
781
+ position: static;
782
+ padding: 0 6px 4px;
783
+ }
784
+ .tnc-dg-dots > .tnc-item--indicator {
785
+ position: static;
786
+ flex: none;
787
+ width: var(--tnc-dot-size);
788
+ height: var(--tnc-dot-size);
789
+ border-radius: 50%;
790
+ background: var(--tnc-border, var(--c));
791
+ pointer-events: none;
792
+ }
793
+ .tnc-dg-dots > .tnc-item--indicator.is-completed {
794
+ opacity: 0.4;
795
+ }
796
+ .tnc-dg-dots-more {
797
+ flex: none;
798
+ font-size: 10px;
799
+ line-height: var(--tnc-dot-size);
800
+ color: var(--tnc-muted);
801
+ font-weight: 600;
802
+ font-variant-numeric: tabular-nums;
803
+ }
804
+
805
+ /* ------------------------------------------------------------------ list */
806
+ .tnc-list {
807
+ display: flex;
808
+ flex-direction: column;
809
+ min-height: 0;
810
+ }
811
+ .tnc-list-scroll {
812
+ flex: 1 1 auto;
813
+ min-height: 0;
814
+ overflow: auto;
815
+ }
816
+ .tnc--height-auto .tnc-list-scroll {
817
+ overflow: visible;
818
+ }
819
+ .tnc-list-day {
820
+ position: sticky;
821
+ top: 0;
822
+ z-index: 2;
823
+ padding: 6px 10px;
824
+ background: var(--tnc-surface-2);
825
+ border-bottom: 1px solid var(--tnc-line);
826
+ font-weight: 650;
827
+ }
828
+ .tnc-list-day.is-today {
829
+ color: var(--tnc-accent);
830
+ }
831
+ .tnc-list-rows {
832
+ display: flex;
833
+ flex-direction: column;
834
+ }
835
+ .tnc-item--list {
836
+ position: relative;
837
+ padding: 7px 10px;
838
+ border-bottom: 1px solid var(--tnc-line);
839
+ border-radius: 0;
840
+ font-size: var(--tnc-font-size);
841
+ }
842
+ .tnc-item--list:hover {
843
+ background: var(--tnc-surface-2);
844
+ }
845
+ .tnc-item--list .tnc-item-main {
846
+ gap: 10px;
847
+ align-items: center;
848
+ }
849
+ .tnc-item--list .tnc-item-time {
850
+ width: 9.5em;
851
+ color: var(--tnc-muted);
852
+ }
853
+ .tnc-item--list .tnc-item-title {
854
+ font-weight: 500;
855
+ white-space: normal;
856
+ }
857
+ .tnc-list-empty {
858
+ padding: 40px 16px;
859
+ text-align: center;
860
+ color: var(--tnc-faint);
861
+ }
862
+
863
+ /* ------------------------------------------------------------------ year */
864
+ .tnc-year {
865
+ display: flex;
866
+ flex-direction: column;
867
+ min-height: 0;
868
+ }
869
+ .tnc-year-scroll {
870
+ flex: 1 1 auto;
871
+ min-height: 0;
872
+ overflow: auto;
873
+ padding: 12px;
874
+ }
875
+ .tnc-year-grid {
876
+ display: grid;
877
+ grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
878
+ gap: 18px 16px;
879
+ }
880
+ .tnc-ym-title {
881
+ display: block;
882
+ border: 0;
883
+ background: none;
884
+ padding: 0 0 6px;
885
+ font-weight: 650;
886
+ font-size: 13px;
887
+ cursor: pointer;
888
+ }
889
+ .tnc-ym-days {
890
+ display: grid;
891
+ grid-template-columns: repeat(7, 1fr);
892
+ gap: 2px;
893
+ }
894
+ .tnc-ym-dow {
895
+ font-size: 10px;
896
+ color: var(--tnc-faint);
897
+ text-align: center;
898
+ }
899
+ .tnc-ym-day {
900
+ position: relative;
901
+ aspect-ratio: 1;
902
+ border: 0;
903
+ border-radius: 5px;
904
+ padding: 0;
905
+ cursor: pointer;
906
+ font-size: 11px;
907
+ background: color-mix(in srgb, var(--tnc-accent) calc(var(--tnc-heat, 0) * 38%), transparent);
908
+ display: flex;
909
+ flex-direction: column;
910
+ align-items: center;
911
+ justify-content: center;
912
+ gap: 1px;
913
+ }
914
+ .tnc-ym-day:hover {
915
+ outline: 1px solid var(--tnc-line-strong);
916
+ }
917
+ .tnc-ym-day.is-weekend .tnc-ym-num {
918
+ color: var(--tnc-muted);
919
+ }
920
+ .tnc-ym-day.is-today .tnc-ym-num {
921
+ background: var(--tnc-accent);
922
+ color: var(--tnc-accent-text);
923
+ border-radius: 999px;
924
+ padding: 0 4px;
925
+ }
926
+ .tnc-ym-dots {
927
+ display: flex;
928
+ gap: 2px;
929
+ height: 4px;
930
+ }
931
+ .tnc-ym-dots i {
932
+ width: 4px;
933
+ height: 4px;
934
+ border-radius: 50%;
935
+ background: var(--tnc-c, var(--tnc-accent));
936
+ }
937
+
938
+ /* -------------------------------------------------------------- timeline */
939
+ .tnc-tl {
940
+ display: flex;
941
+ flex-direction: column;
942
+ min-height: 0;
943
+ }
944
+ .tnc-tl-scroll {
945
+ flex: 1 1 auto;
946
+ min-height: 0;
947
+ overflow: auto;
948
+ overscroll-behavior: contain;
949
+ }
950
+ .tnc-tl-canvas {
951
+ position: relative;
952
+ min-width: 100%;
953
+ }
954
+ .tnc-tl-head {
955
+ position: sticky;
956
+ top: 0;
957
+ z-index: 30;
958
+ display: flex;
959
+ height: 46px;
960
+ background: var(--tnc-surface);
961
+ border-bottom: 1px solid var(--tnc-line-strong);
962
+ }
963
+ .tnc-tl-corner {
964
+ position: sticky;
965
+ left: 0;
966
+ z-index: 2;
967
+ flex: none;
968
+ width: var(--tnc-tl-label-w);
969
+ background: var(--tnc-surface);
970
+ border-right: 1px solid var(--tnc-line);
971
+ }
972
+ .tnc-tl-ticks {
973
+ position: relative;
974
+ flex: 1 1 auto;
975
+ }
976
+ .tnc-tl-tier {
977
+ position: absolute;
978
+ left: 0;
979
+ right: 0;
980
+ height: 23px;
981
+ }
982
+ .tnc-tl-tier--major {
983
+ top: 0;
984
+ }
985
+ .tnc-tl-tier--minor {
986
+ top: 23px;
987
+ }
988
+ .tnc-tl-tick {
989
+ position: absolute;
990
+ top: 0;
991
+ bottom: 0;
992
+ border-left: 1px solid var(--tnc-line);
993
+ overflow: clip;
994
+ white-space: nowrap;
995
+ font-size: 10.5px;
996
+ color: var(--tnc-muted);
997
+ display: flex;
998
+ align-items: center;
999
+ padding: 0 4px;
1000
+ }
1001
+ .tnc-tl-tier--major .tnc-tl-tick {
1002
+ font-weight: 650;
1003
+ color: var(--tnc-text);
1004
+ }
1005
+ .tnc-tl-tier--major .tnc-tl-tick > span {
1006
+ position: sticky;
1007
+ left: calc(var(--tnc-tl-label-w) + 4px);
1008
+ }
1009
+ .tnc-tl-tier--minor .tnc-tl-tick {
1010
+ justify-content: center;
1011
+ font-variant-numeric: tabular-nums;
1012
+ }
1013
+ .tnc-tl-tick.is-today > span {
1014
+ background: var(--tnc-accent);
1015
+ color: var(--tnc-accent-text);
1016
+ border-radius: 4px;
1017
+ padding: 0 3px;
1018
+ }
1019
+ .tnc-tl-tick.is-weekend {
1020
+ background: var(--tnc-off);
1021
+ }
1022
+ .tnc-tl-rows {
1023
+ position: relative;
1024
+ }
1025
+ .tnc-tl-row {
1026
+ position: relative;
1027
+ display: flex;
1028
+ border-bottom: 1px solid var(--tnc-line);
1029
+ }
1030
+ .tnc-tl-row.is-group {
1031
+ background: var(--tnc-surface-2);
1032
+ }
1033
+ .tnc-tl-label {
1034
+ position: sticky;
1035
+ left: 0;
1036
+ z-index: 20;
1037
+ flex: none;
1038
+ width: var(--tnc-tl-label-w);
1039
+ display: flex;
1040
+ align-items: center;
1041
+ gap: 6px;
1042
+ padding-right: 8px;
1043
+ background: var(--tnc-surface);
1044
+ border-right: 1px solid var(--tnc-line);
1045
+ /* Cover the row's bottom border too, so lines and arrows never show through. */
1046
+ margin-bottom: -1px;
1047
+ border-bottom: 1px solid var(--tnc-line);
1048
+ overflow: hidden;
1049
+ white-space: nowrap;
1050
+ }
1051
+ .tnc-tl-row.is-group .tnc-tl-label {
1052
+ background: var(--tnc-surface-2);
1053
+ font-weight: 650;
1054
+ }
1055
+ .tnc-tl-label-text {
1056
+ overflow: hidden;
1057
+ text-overflow: ellipsis;
1058
+ }
1059
+ .tnc-tl-track {
1060
+ position: relative;
1061
+ flex: 1 1 auto;
1062
+ background-image: repeating-linear-gradient(to right, var(--tnc-line) 0 1px, transparent 1px var(--tnc-tl-col-w));
1063
+ background-size: auto;
1064
+ }
1065
+ .tnc-item--timeline {
1066
+ top: 0;
1067
+ height: var(--tnc-tl-row-h);
1068
+ padding: 5px 0;
1069
+ overflow: visible;
1070
+ background: none;
1071
+ border: 0;
1072
+ }
1073
+ .tnc-item--timeline > .tnc-item-main {
1074
+ height: 100%;
1075
+ align-items: center;
1076
+ padding: 0 7px;
1077
+ border-radius: 5px;
1078
+ background: var(--tnc-bg, color-mix(in srgb, var(--c) 72%, var(--tnc-surface)));
1079
+ border: 1px solid var(--tnc-border, var(--c));
1080
+ color: var(--tnc-fg, #fff);
1081
+ font-size: 10.5px;
1082
+ white-space: nowrap;
1083
+ overflow: hidden;
1084
+ gap: 5px;
1085
+ }
1086
+ .tnc-item--timeline.is-all-day > .tnc-item-main {
1087
+ background: var(--tnc-bg, color-mix(in srgb, var(--c) 24%, var(--tnc-surface)));
1088
+ color: var(--tnc-fg, var(--tnc-text));
1089
+ }
1090
+ .tnc-item--timeline.is-milestone {
1091
+ width: 0;
1092
+ overflow: visible;
1093
+ }
1094
+ .tnc-item--timeline.is-milestone > .tnc-item-main {
1095
+ position: absolute;
1096
+ top: 50%;
1097
+ left: 0;
1098
+ width: 13px;
1099
+ height: 13px;
1100
+ padding: 0;
1101
+ transform: translate(-50%, -50%) rotate(45deg);
1102
+ border-radius: 2px;
1103
+ font-size: 0;
1104
+ }
1105
+ .tnc-item--timeline.is-milestone .tnc-item-title,
1106
+ .tnc-item--timeline.is-milestone .tnc-item-time {
1107
+ display: none;
1108
+ }
1109
+ .tnc-item--timeline.is-conflict {
1110
+ box-shadow: none;
1111
+ }
1112
+ .tnc-item--timeline.is-conflict > .tnc-item-main {
1113
+ box-shadow: 0 0 0 2px var(--tnc-warn);
1114
+ }
1115
+ .tnc-item--timeline .tnc-resize.is-h {
1116
+ top: 5px;
1117
+ bottom: 5px;
1118
+ width: var(--tnc-grip, 8px);
1119
+ }
1120
+ .tnc-item--timeline .tnc-resize[tabindex]:focus-visible {
1121
+ outline: 2px solid var(--tnc-accent);
1122
+ outline-offset: 1px;
1123
+ border-radius: 2px;
1124
+ }
1125
+ /* Short bars hide clipped titles; narrow ones drop their grips and get a wider hit area so they still move and tap. */
1126
+ .tnc-item--timeline.is-compact > .tnc-item-main {
1127
+ padding: 0;
1128
+ }
1129
+ .tnc-item--timeline.is-compact .tnc-item-title,
1130
+ .tnc-item--timeline.is-compact .tnc-item-time {
1131
+ display: none;
1132
+ }
1133
+ .tnc-item--timeline.is-narrow .tnc-resize {
1134
+ display: none;
1135
+ }
1136
+ .tnc-item--timeline.is-narrow::after,
1137
+ .tnc-item--timeline.is-milestone::after {
1138
+ content: "";
1139
+ position: absolute;
1140
+ top: 0;
1141
+ bottom: 0;
1142
+ left: 50%;
1143
+ width: 20px;
1144
+ margin-left: -10px;
1145
+ }
1146
+ .tnc-item--timeline.is-selected > .tnc-item-main {
1147
+ outline: 2px solid var(--tnc-accent);
1148
+ outline-offset: 1px;
1149
+ }
1150
+ /* Link handles: a visible dot inside an invisible, larger hit area outside the bar. */
1151
+ .tnc-port {
1152
+ --tnc-port-hit: 16px;
1153
+ --tnc-port-dot: 10px;
1154
+ position: absolute;
1155
+ top: 50%;
1156
+ width: var(--tnc-port-hit);
1157
+ height: var(--tnc-port-hit);
1158
+ margin-top: calc(var(--tnc-port-hit) / -2);
1159
+ cursor: crosshair;
1160
+ opacity: 0;
1161
+ z-index: 3;
1162
+ touch-action: none;
1163
+ }
1164
+ .tnc-port::after {
1165
+ content: "";
1166
+ position: absolute;
1167
+ top: 50%;
1168
+ left: 50%;
1169
+ width: var(--tnc-port-dot);
1170
+ height: var(--tnc-port-dot);
1171
+ margin: calc(var(--tnc-port-dot) / -2) 0 0 calc(var(--tnc-port-dot) / -2);
1172
+ border-radius: 50%;
1173
+ border: 2px solid var(--c);
1174
+ background: var(--tnc-surface);
1175
+ }
1176
+ .tnc-port-start {
1177
+ left: calc(var(--tnc-port-hit) * -1);
1178
+ }
1179
+ .tnc-port-finish {
1180
+ right: calc(var(--tnc-port-hit) * -1);
1181
+ }
1182
+ .tnc-item--timeline.is-milestone .tnc-port-finish {
1183
+ right: auto;
1184
+ left: 8px;
1185
+ }
1186
+ .tnc-port.is-target::after {
1187
+ background: var(--c);
1188
+ transform: scale(1.3);
1189
+ }
1190
+ .tnc-port.is-invalid::after {
1191
+ border-color: var(--tnc-warn);
1192
+ background: var(--tnc-warn);
1193
+ }
1194
+ .tnc-item--timeline.is-link-target > .tnc-item-main {
1195
+ box-shadow: 0 0 0 2px var(--tnc-accent);
1196
+ }
1197
+ .tnc-item--timeline.is-link-invalid > .tnc-item-main {
1198
+ box-shadow: 0 0 0 2px var(--tnc-warn);
1199
+ }
1200
+ .tnc-item--timeline:hover .tnc-port,
1201
+ .tnc-item--timeline.is-hover .tnc-port,
1202
+ .tnc-item--timeline.is-selected .tnc-port,
1203
+ .tnc-item--timeline:focus-visible .tnc-port,
1204
+ .tnc-tl.is-linking .tnc-item--timeline .tnc-port {
1205
+ opacity: 1;
1206
+ }
1207
+ @media (pointer: coarse) {
1208
+ .tnc-port {
1209
+ --tnc-port-hit: 44px;
1210
+ --tnc-port-dot: 14px;
1211
+ }
1212
+ .tnc-item--timeline.is-milestone .tnc-port-finish {
1213
+ left: 8px;
1214
+ }
1215
+ .tnc-item--timeline.is-narrow::after,
1216
+ .tnc-item--timeline.is-milestone::after {
1217
+ width: 32px;
1218
+ margin-left: -16px;
1219
+ }
1220
+ }
1221
+ /* Without hover, handles show only on the selected bar (and on every bar while linking). */
1222
+ @media (hover: none) {
1223
+ .tnc-item--timeline:not(.is-selected) .tnc-port {
1224
+ visibility: hidden;
1225
+ }
1226
+ .tnc-tl.is-linking .tnc-item--timeline .tnc-port {
1227
+ visibility: visible;
1228
+ }
1229
+ }
1230
+ .tnc-tl-deps {
1231
+ position: absolute;
1232
+ top: 0;
1233
+ pointer-events: none;
1234
+ overflow: visible;
1235
+ z-index: 10;
1236
+ color: var(--tnc-muted);
1237
+ }
1238
+ .tnc-tl-deps path {
1239
+ fill: none;
1240
+ stroke: currentColor;
1241
+ stroke-width: 1.5;
1242
+ }
1243
+ .tnc-tl-deps path.is-conflict {
1244
+ stroke: var(--tnc-warn);
1245
+ stroke-dasharray: 5 3;
1246
+ }
1247
+ .tnc-tl-deps path.is-linking {
1248
+ stroke: var(--tnc-accent);
1249
+ stroke-dasharray: 4 3;
1250
+ }
1251
+ .tnc-tl-deps path.is-linking.is-invalid {
1252
+ stroke: var(--tnc-warn);
1253
+ }
1254
+ .tnc-tl-today-label {
1255
+ position: absolute;
1256
+ top: 1px;
1257
+ z-index: 1;
1258
+ transform: translateX(-50%);
1259
+ padding: 0 4px;
1260
+ border-radius: 3px;
1261
+ background: var(--tnc-now);
1262
+ color: var(--tnc-accent-text, #fff);
1263
+ font-size: 10px;
1264
+ font-weight: 650;
1265
+ line-height: 14px;
1266
+ white-space: nowrap;
1267
+ pointer-events: none;
1268
+ }
1269
+ .tnc-tl-today {
1270
+ position: absolute;
1271
+ top: 0;
1272
+ bottom: 0;
1273
+ width: 2px;
1274
+ margin-left: -1px;
1275
+ background: var(--tnc-now);
1276
+ z-index: 15;
1277
+ pointer-events: none;
1278
+ }
1279
+ .tnc-tl-sel {
1280
+ position: absolute;
1281
+ inset: 0;
1282
+ pointer-events: none;
1283
+ }
1284
+ .tnc-tl-sel .tnc-sel {
1285
+ right: auto;
1286
+ }
1287
+ .tnc-tl-sel .tnc-sel.is-column {
1288
+ border-left: 1.5px dashed var(--tnc-accent);
1289
+ border-right: 1.5px dashed var(--tnc-accent);
1290
+ border-radius: 0;
1291
+ }
1292
+
1293
+ /* ---------------------------------------------------------------- popover */
1294
+ .tnc-popover {
1295
+ position: absolute;
1296
+ z-index: 100;
1297
+ max-height: min(420px, calc(100% - 8px));
1298
+ display: flex;
1299
+ flex-direction: column;
1300
+ background: var(--tnc-surface);
1301
+ border: 1px solid var(--tnc-line-strong);
1302
+ border-radius: 8px;
1303
+ box-shadow: var(--tnc-shadow);
1304
+ outline: none;
1305
+ }
1306
+ .tnc-popover-head {
1307
+ display: flex;
1308
+ align-items: center;
1309
+ justify-content: space-between;
1310
+ gap: 8px;
1311
+ padding: 6px 6px 6px 10px;
1312
+ border-bottom: 1px solid var(--tnc-line);
1313
+ font-weight: 650;
1314
+ }
1315
+ .tnc-popover-close {
1316
+ min-width: 28px;
1317
+ min-height: 28px;
1318
+ border: 0;
1319
+ border-radius: 6px;
1320
+ background: none;
1321
+ cursor: pointer;
1322
+ font-size: 16px;
1323
+ line-height: 1;
1324
+ }
1325
+ .tnc-popover-close:hover {
1326
+ background: var(--tnc-surface-3);
1327
+ }
1328
+ .tnc-popover-body {
1329
+ display: flex;
1330
+ flex-direction: column;
1331
+ gap: 2px;
1332
+ padding: 6px;
1333
+ overflow: auto;
1334
+ }
1335
+ .tnc-popover-body .tnc-item {
1336
+ position: relative;
1337
+ flex: none;
1338
+ }
1339
+
1340
+ @media (prefers-reduced-motion: reduce) {
1341
+ .tnc * {
1342
+ transition: none !important;
1343
+ animation: none !important;
1344
+ }
1345
+ }