@tasknotes/calendar 0.0.0-stage → 0.1.1

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