@tasknotes/calendar 0.1.7 → 0.1.8

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.1.8
6
+
7
+ ### Changed
8
+
9
+ - Collision stacks show a quiet count and a preview of their contents. Tracked-time titles never split words in the side lane, and adjacent timed events retain a visible boundary.
10
+ - Calendar interaction colours and motion expose theme hooks. Keyboard focus, selected hover, touch, drag origin and preview, pending writes and rejected writes have distinct treatments; Escape removes the drag origin without changing data.
11
+ - Dragging near a scroll edge reveals more of the calendar; cancellation restores the original scroll position. Empty agenda ranges retain host-provided filter recovery alongside per-day creation.
12
+ - Agenda drag previews follow the pointer without shifting neighbouring rows. Releasing after Escape does not open the task underneath the cancelled drag.
13
+ - Compact Month shows narrow chips or dots consistently, with a quiet overflow count, and fits narrow grids. Selected dates carry into Day view.
14
+ - Time ranges follow event width rather than duration and stay visible during resize. Narrow Week headers fit dates and today's badge.
15
+ - Year reveals the anchor month when opened or navigated.
16
+ - Toolbars fit narrow widths, the date strip loads its complete window, and strip expansion stays on the labelled month control.
17
+ - A dim source stays at the original position during calendar drags, and linked hover is suppressed while dragging.
18
+
5
19
  ## 0.1.7
6
20
 
7
21
  ### Added
package/README.md CHANGED
@@ -76,6 +76,9 @@ and changes views through the same navigation lifecycle as the buttons.
76
76
 
77
77
  ### Month and list
78
78
 
79
+ - `monthDisplay: "chips"` uses compact filled title strips instead of dots, clipped without ellipses, with a counted overflow row. Set `--tnc-chip-h` to size the rows. Like dots, chips are passive summaries: the whole day cell is the keyboard and pointer target, and the host can open a full selected-day list through `onDateClick`.
80
+ - `gotoDate()` within the displayed month updates the navigation anchor without rebuilding its cells, preserving keyboard focus when a host selects a day. A subsequent view switch uses that selected date.
81
+
79
82
  - `listEmptyContent()` may return a host-owned DOM node for an empty list, such as an explanation and recovery action. The default translated empty message remains when omitted. The node is removed when the list gains items.
80
83
 
81
84
  - `monthDisplay: "dots"` draws every item in a month cell as a small dot (`--tnc-dot-size`, `--tnc-dot-gap`) that wraps across the cell, with "+N" when they do not fit; `dayMaxEvents` caps the dots (`false` lets cells grow). The day cell is the tap target: dots ignore the pointer, are `aria-hidden`, get no content hook, and the cell is labelled "<date>, N items" (`text.itemCount`). Items in dots have `variant: "indicator"`; colour them with `color` or `itemDidMount` setting `--tnc-c`.
@@ -154,6 +157,9 @@ overlapping event backgrounds. It is `100%` for non-overlapping placements.
154
157
  Additional semantic colours: `--tnc-theme-now`, `--tnc-theme-warn`,
155
158
  `--tnc-theme-ok`, `--tnc-theme-amber`. Item colours come from `color`,
156
159
  `backgroundColor`, `borderColor` and `textColor`.
160
+ Set an item's `timeDisplay: "start"` for deadlines or other point-in-time markers:
161
+ visible and accessible labels show only its exact start time. This presentation
162
+ option does not alter the item's stored dates, layout duration or hit area.
157
163
  Override sizing tokens such as `--tnc-font-size`, `--tnc-small`,
158
164
  `--tnc-radius`, `--tnc-bar-h`, `--tnc-more-h`, `--tnc-dot-size` and
159
165
  `--tnc-dot-gap` directly on `.tnc` (not just its ancestor).
package/dist/calendar.css CHANGED
@@ -21,6 +21,12 @@
21
21
  --tnc-ok: var(--tnc-theme-ok, #16a34a);
22
22
  --tnc-amber: var(--tnc-theme-amber, #d97706);
23
23
  --tnc-off: color-mix(in srgb, var(--tnc-text) 3.5%, transparent);
24
+ --tnc-hover: var(--tnc-theme-hover, var(--tnc-surface-2));
25
+ --tnc-active: var(--tnc-theme-active, var(--tnc-surface-3));
26
+ --tnc-selected: var(--tnc-theme-selected, var(--tnc-accent-soft));
27
+ --tnc-focus: var(--tnc-theme-focus, var(--tnc-accent));
28
+ --tnc-motion: var(--tnc-theme-motion, 100ms);
29
+ --tnc-drag-opacity: var(--tnc-theme-drag-opacity, 0.4);
24
30
  --tnc-shadow: 0 8px 24px rgb(0 0 0 / 0.16);
25
31
  --tnc-radius: 6px;
26
32
  /* Time-grid share for tracked ("actual") items where they overlap planned ones. */
@@ -123,8 +129,11 @@
123
129
  font-size: var(--tnc-font-size);
124
130
  line-height: 1.2;
125
131
  }
126
- .tnc-btn:hover {
127
- background: var(--tnc-surface-3);
132
+ @media (hover: hover) {
133
+ .tnc-btn:hover {
134
+ background: var(--tnc-surface-3);
135
+ }
136
+
128
137
  }
129
138
  .tnc-btn[aria-pressed="true"] {
130
139
  background: var(--tnc-accent-soft);
@@ -177,10 +186,12 @@
177
186
  cursor: pointer;
178
187
  text-align: inherit;
179
188
  }
180
- .tnc-navlink:hover {
181
- text-decoration: underline;
182
- }
189
+ @media (hover: hover) {
190
+ .tnc-navlink:hover {
191
+ text-decoration: underline;
192
+ }
183
193
 
194
+ }
184
195
  /* ---------------------------------------------------------------- items */
185
196
  .tnc-item {
186
197
  --c: var(--tnc-c, var(--tnc-item-c));
@@ -246,6 +257,7 @@
246
257
 
247
258
  /* timed (time grid) */
248
259
  .tnc-item--timed {
260
+ container-type: size;
249
261
  padding: 2px 5px 2px 6px;
250
262
  background: var(--tnc-bg, color-mix(in srgb, var(--c) 14%, var(--tnc-surface)));
251
263
  border: 1px solid var(--tnc-border, color-mix(in srgb, var(--c) 34%, transparent));
@@ -261,7 +273,7 @@
261
273
  -webkit-box-orient: vertical;
262
274
  -webkit-line-clamp: 6;
263
275
  white-space: normal;
264
- overflow-wrap: anywhere;
276
+ overflow-wrap: normal;
265
277
  }
266
278
  .tnc-item--timed.is-short {
267
279
  padding-top: 0;
@@ -281,8 +293,18 @@
281
293
  .tnc-item--timed.is-short .tnc-item-time {
282
294
  flex: none;
283
295
  }
284
- .tnc-item--timed.is-short .tnc-item-time-end {
285
- display: none;
296
+ @container (max-height: 50px) and (max-width: 239px) {
297
+ .tnc-item--timed .tnc-item-time {
298
+ display: none;
299
+ }
300
+ }
301
+ @container (max-width: 109px) {
302
+ .tnc-item--timed .tnc-item-time-end {
303
+ display: none;
304
+ }
305
+ }
306
+ .tnc:is(.tnc-dragging-resize-start, .tnc-dragging-resize-end) .tnc-item--timed.is-dragging .tnc-item-time-end {
307
+ display: inline;
286
308
  }
287
309
  .tnc-item--timed.is-cont-start {
288
310
  border-top-left-radius: 0;
@@ -348,10 +370,16 @@
348
370
  align-items: center;
349
371
  white-space: nowrap;
350
372
  }
351
- .tnc-item--dot:hover,
352
373
  .tnc-item--dot.is-hover {
353
374
  background: var(--tnc-surface-3);
354
375
  }
376
+
377
+ @media (hover: hover) {
378
+ .tnc-item--dot:hover {
379
+ background: var(--tnc-surface-3);
380
+ }
381
+
382
+ }
355
383
  .tnc-item--dot .tnc-item-main {
356
384
  gap: 4px;
357
385
  align-items: center;
@@ -442,9 +470,12 @@
442
470
  overflow: hidden;
443
471
  text-overflow: ellipsis;
444
472
  }
445
- .tnc-more:hover {
446
- background: var(--tnc-surface-3);
447
- color: var(--tnc-text);
473
+ @media (hover: hover) {
474
+ .tnc-more:hover {
475
+ background: var(--tnc-surface-3);
476
+ color: var(--tnc-text);
477
+ }
478
+
448
479
  }
449
480
  .tnc-more--stack {
450
481
  height: auto;
@@ -453,6 +484,45 @@
453
484
  background: var(--tnc-surface-3);
454
485
  z-index: 30;
455
486
  }
487
+ .tnc-more.tnc-more--collision {
488
+ display: grid;
489
+ grid-template-columns: auto minmax(0, 1fr);
490
+ align-content: center;
491
+ align-items: stretch;
492
+ justify-content: center;
493
+ gap: 2px 4px;
494
+ padding: 2px 4px;
495
+ border: 1px solid var(--tnc-line-strong);
496
+ border-radius: var(--tnc-radius);
497
+ background: var(--tnc-surface-2);
498
+ text-align: start;
499
+ white-space: normal;
500
+ }
501
+ .tnc-collision-count {
502
+ color: var(--tnc-text);
503
+ font-weight: 650;
504
+ white-space: nowrap;
505
+ flex: none;
506
+ line-height: 1.3;
507
+ }
508
+ .tnc-collision-range {
509
+ min-width: 0;
510
+ text-align: end;
511
+ color: var(--tnc-text);
512
+ font-size: var(--tnc-small);
513
+ white-space: nowrap;
514
+ overflow: hidden;
515
+ text-overflow: ellipsis;
516
+ }
517
+ .tnc-item--indicator .tnc-item-title {
518
+ white-space: nowrap;
519
+ overflow-wrap: normal;
520
+ text-overflow: ellipsis;
521
+ display: block;
522
+ }
523
+ .tnc-item--indicator .tnc-item-main {
524
+ min-width: 0;
525
+ }
456
526
 
457
527
  /* ------------------------------------------------------------ time grid */
458
528
  .tnc-tg {
@@ -481,16 +551,24 @@
481
551
  text-underline-offset: 3px;
482
552
  }
483
553
  .tnc-more--collision {
484
- display: flex;
485
- align-items: start;
486
- gap: 4px;
554
+ display: grid;
555
+ grid-template-columns: auto minmax(0, 1fr);
556
+ align-content: center;
557
+ align-items: center;
558
+ gap: 2px 4px;
559
+ padding: 2px 4px;
487
560
  min-height: 40px;
488
561
  white-space: normal;
489
562
  text-align: start;
490
563
  }
491
564
  .tnc-collision-title {
565
+ grid-column: 1 / -1;
492
566
  flex: 1;
493
567
  min-width: 0;
568
+ text-overflow: ellipsis;
569
+ white-space: nowrap;
570
+ color: var(--tnc-text);
571
+ font-weight: 500;
494
572
  display: -webkit-box;
495
573
  -webkit-box-orient: vertical;
496
574
  -webkit-line-clamp: 3;
@@ -531,6 +609,7 @@
531
609
  font-size: 10px;
532
610
  }
533
611
  .tnc-dh {
612
+ container-type: inline-size;
534
613
  min-width: 0;
535
614
  padding: 5px 6px 5px 7px;
536
615
  border-left: 1px solid var(--tnc-line);
@@ -559,6 +638,18 @@
559
638
  border-radius: 999px;
560
639
  padding: 0 7px;
561
640
  }
641
+ @container (max-width: 64px) {
642
+ .tnc-dh-label {
643
+ flex-direction: column;
644
+ align-items: center;
645
+ gap: 2px;
646
+ width: 100%;
647
+ }
648
+ .tnc-dh-link {
649
+ display: block;
650
+ width: 100%;
651
+ }
652
+ }
562
653
  .tnc-cap {
563
654
  position: relative;
564
655
  margin-top: 5px;
@@ -824,6 +915,9 @@
824
915
  overflow: hidden;
825
916
  pointer-events: none;
826
917
  }
918
+ .tnc-dg-dots[hidden] {
919
+ display: none;
920
+ }
827
921
  .tnc-dg-dots.is-unlimited {
828
922
  position: static;
829
923
  padding: 0 6px 4px;
@@ -849,6 +943,45 @@
849
943
  font-variant-numeric: tabular-nums;
850
944
  }
851
945
 
946
+ .tnc-dg--dots .tnc-dg-top {
947
+ justify-content: center;
948
+ }
949
+
950
+ .tnc-dg--dots .tnc-dg-dots {
951
+ justify-content: center;
952
+ align-content: flex-start;
953
+ }
954
+
955
+ .tnc-dg--chips {
956
+ --tnc-chip-h: 20px;
957
+ }
958
+ .tnc-dg--chips .tnc-dg-dots {
959
+ left: 2px;
960
+ right: 2px;
961
+ flex-direction: column;
962
+ flex-wrap: nowrap;
963
+ align-items: stretch;
964
+ justify-content: flex-start;
965
+ }
966
+ .tnc-dg--chips .tnc-dg-dots > .tnc-item--indicator {
967
+ width: 100%;
968
+ height: var(--tnc-chip-h);
969
+ border: 0;
970
+ border-radius: var(--tnc-radius);
971
+ padding: 0 2px;
972
+ color: var(--tnc-fg, var(--tnc-text));
973
+ font-size: 10px;
974
+ line-height: var(--tnc-chip-h);
975
+ }
976
+ .tnc-dg--chips .tnc-item-title {
977
+ display: block;
978
+ white-space: nowrap;
979
+ text-overflow: clip;
980
+ }
981
+ .tnc-dg--chips .tnc-dg-dots-more {
982
+ line-height: var(--tnc-chip-h);
983
+ }
984
+
852
985
  /* ------------------------------------------------------------------ list */
853
986
  .tnc-list {
854
987
  display: flex;
@@ -886,8 +1019,11 @@
886
1019
  border-radius: 0;
887
1020
  font-size: var(--tnc-font-size);
888
1021
  }
889
- .tnc-item--list:hover {
890
- background: var(--tnc-surface-2);
1022
+ @media (hover: hover) {
1023
+ .tnc-item--list:hover {
1024
+ background: var(--tnc-surface-2);
1025
+ }
1026
+
891
1027
  }
892
1028
  .tnc-item--list .tnc-item-main {
893
1029
  gap: 10px;
@@ -985,8 +1121,11 @@
985
1121
  .tnc-strip-today[hidden] {
986
1122
  display: none;
987
1123
  }
988
- .tnc-strip-today:hover {
989
- background: var(--tnc-surface-2);
1124
+ @media (hover: hover) {
1125
+ .tnc-strip-today:hover {
1126
+ background: var(--tnc-surface-2);
1127
+ }
1128
+
990
1129
  }
991
1130
  .tnc-strip-slot {
992
1131
  display: flex;
@@ -1006,9 +1145,12 @@
1006
1145
  line-height: 1;
1007
1146
  cursor: pointer;
1008
1147
  }
1009
- .tnc-strip-title:hover,
1010
- .tnc-strip-nav:hover {
1011
- background: var(--tnc-surface-2);
1148
+ @media (hover: hover) {
1149
+ .tnc-strip-title:hover,
1150
+ .tnc-strip-nav:hover {
1151
+ background: var(--tnc-surface-2);
1152
+ }
1153
+
1012
1154
  }
1013
1155
  .tnc-strip-dows,
1014
1156
  .tnc-strip-grid {
@@ -1081,11 +1223,17 @@
1081
1223
  .tnc-strip-day.is-in-range .tnc-strip-num {
1082
1224
  background: var(--tnc-accent-soft);
1083
1225
  }
1084
- .tnc-strip-day:hover .tnc-strip-num {
1085
- background: var(--tnc-surface-2);
1226
+ @media (hover: hover) {
1227
+ .tnc-strip-day:hover .tnc-strip-num {
1228
+ background: var(--tnc-surface-2);
1229
+ }
1230
+
1086
1231
  }
1087
- .tnc-strip-day.is-focus:hover .tnc-strip-num {
1088
- background: var(--tnc-accent);
1232
+ @media (hover: hover) {
1233
+ .tnc-strip-day.is-focus:hover .tnc-strip-num {
1234
+ background: var(--tnc-accent);
1235
+ }
1236
+
1089
1237
  }
1090
1238
  .tnc-strip-day.is-drop-target .tnc-strip-num {
1091
1239
  box-shadow: 0 0 0 2px var(--tnc-accent);
@@ -1162,9 +1310,12 @@
1162
1310
  font-weight: 700;
1163
1311
  text-align: center;
1164
1312
  }
1165
- .tnc-list-add:hover {
1166
- color: var(--tnc-accent);
1167
- background: var(--tnc-surface-2);
1313
+ @media (hover: hover) {
1314
+ .tnc-list-add:hover {
1315
+ color: var(--tnc-accent);
1316
+ background: var(--tnc-surface-2);
1317
+ }
1318
+
1168
1319
  }
1169
1320
  .tnc-list-add:focus-visible {
1170
1321
  outline: 2px solid var(--tnc-accent);
@@ -1189,10 +1340,22 @@
1189
1340
  padding: 12px;
1190
1341
  }
1191
1342
  .tnc-year-grid {
1343
+ --tnc-year-day-min: var(--tnc-theme-date-target, 40px);
1192
1344
  display: grid;
1193
- grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
1345
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, calc(7 * var(--tnc-year-day-min) + 12px)), 1fr));
1194
1346
  gap: 18px 16px;
1195
1347
  }
1348
+ .tnc-ym {
1349
+ min-width: 0;
1350
+ }
1351
+ .tnc .tnc-ym-title,
1352
+ .tnc .tnc-ym-day {
1353
+ appearance: none;
1354
+ box-shadow: none;
1355
+ background-image: none;
1356
+ font-family: inherit;
1357
+ color: var(--tnc-text);
1358
+ }
1196
1359
  .tnc-ym-title {
1197
1360
  display: block;
1198
1361
  border: 0;
@@ -1214,21 +1377,28 @@
1214
1377
  }
1215
1378
  .tnc-ym-day {
1216
1379
  position: relative;
1380
+ min-width: var(--tnc-year-day-min);
1381
+ min-height: var(--tnc-year-day-min);
1382
+ width: 100%;
1383
+ height: auto;
1217
1384
  aspect-ratio: 1;
1218
1385
  border: 0;
1219
1386
  border-radius: 5px;
1220
1387
  padding: 0;
1221
1388
  cursor: pointer;
1222
1389
  font-size: 11px;
1223
- background: color-mix(in srgb, var(--tnc-accent) calc(var(--tnc-heat, 0) * 38%), transparent);
1390
+ background: color-mix(in srgb, var(--tnc-accent) calc(var(--tnc-heat, 0) * 14%), transparent);
1224
1391
  display: flex;
1225
1392
  flex-direction: column;
1226
1393
  align-items: center;
1227
1394
  justify-content: center;
1228
1395
  gap: 1px;
1229
1396
  }
1230
- .tnc-ym-day:hover {
1231
- outline: 1px solid var(--tnc-line-strong);
1397
+ @media (hover: hover) {
1398
+ .tnc-ym-day:hover {
1399
+ outline: 1px solid var(--tnc-line-strong);
1400
+ }
1401
+
1232
1402
  }
1233
1403
  .tnc-ym-day.is-weekend .tnc-ym-num {
1234
1404
  color: var(--tnc-muted);
@@ -1248,16 +1418,14 @@
1248
1418
  width: 4px;
1249
1419
  height: 4px;
1250
1420
  border-radius: 50%;
1251
- background: var(--tnc-c, var(--tnc-accent));
1421
+ background: color-mix(in srgb, var(--tnc-c, var(--tnc-accent)) 65%, var(--tnc-text));
1252
1422
  }
1253
1423
 
1254
- /* Two months a row: each day is a shaded square, and its count is in its label. */
1255
1424
  @container (max-width: 520px) {
1256
1425
  .tnc-year-scroll {
1257
1426
  padding: 8px 4px;
1258
1427
  }
1259
1428
  .tnc-year-grid {
1260
- grid-template-columns: repeat(2, minmax(0, 1fr));
1261
1429
  gap: 14px 12px;
1262
1430
  }
1263
1431
  .tnc-ym-title {
@@ -1273,7 +1441,7 @@
1273
1441
  }
1274
1442
  /* Without dots, one item must still read as busy. */
1275
1443
  .tnc-ym-day.has-items {
1276
- background: color-mix(in srgb, var(--tnc-accent) calc((0.3 + var(--tnc-heat) * 0.7) * 50%), transparent);
1444
+ background: color-mix(in srgb, var(--tnc-accent) calc((0.3 + var(--tnc-heat) * 0.7) * 20%), transparent);
1277
1445
  }
1278
1446
  .tnc-ym-dots {
1279
1447
  display: none;
@@ -1542,13 +1710,19 @@
1542
1710
  .tnc-item--timeline.is-link-invalid > .tnc-item-main {
1543
1711
  box-shadow: 0 0 0 2px var(--tnc-warn);
1544
1712
  }
1545
- .tnc-item--timeline:hover .tnc-port,
1546
1713
  .tnc-item--timeline.is-hover .tnc-port,
1547
1714
  .tnc-item--timeline.is-selected .tnc-port,
1548
1715
  .tnc-item--timeline:focus-visible .tnc-port,
1549
1716
  .tnc-tl.is-linking .tnc-item--timeline .tnc-port {
1550
1717
  opacity: 1;
1551
1718
  }
1719
+
1720
+ @media (hover: hover) {
1721
+ .tnc-item--timeline:hover .tnc-port {
1722
+ opacity: 1;
1723
+ }
1724
+
1725
+ }
1552
1726
  @media (pointer: coarse) {
1553
1727
  .tnc-port {
1554
1728
  --tnc-port-hit: 44px;
@@ -1669,8 +1843,11 @@
1669
1843
  font-size: 16px;
1670
1844
  line-height: 1;
1671
1845
  }
1672
- .tnc-popover-close:hover {
1673
- background: var(--tnc-surface-3);
1846
+ @media (hover: hover) {
1847
+ .tnc-popover-close:hover {
1848
+ background: var(--tnc-surface-3);
1849
+ }
1850
+
1674
1851
  }
1675
1852
  .tnc-popover-body {
1676
1853
  min-height: 0;
@@ -1683,6 +1860,8 @@
1683
1860
  .tnc-popover-body .tnc-item {
1684
1861
  position: relative;
1685
1862
  flex: none;
1863
+ height: auto;
1864
+ min-height: 40px;
1686
1865
  }
1687
1866
  .tnc-popover-title {
1688
1867
  min-width: 0;
@@ -1690,10 +1869,6 @@
1690
1869
  text-overflow: ellipsis;
1691
1870
  white-space: nowrap;
1692
1871
  }
1693
- .tnc-popover-body .tnc-item {
1694
- height: auto;
1695
- min-height: 40px;
1696
- }
1697
1872
  .tnc-popover-body .tnc-item-main {
1698
1873
  min-height: 40px;
1699
1874
  }
@@ -1706,6 +1881,128 @@
1706
1881
  outline-offset: -2px;
1707
1882
  }
1708
1883
 
1884
+ .tnc .tnc-col-actual .tnc-item-title {
1885
+ white-space: nowrap;
1886
+ overflow-wrap: normal;
1887
+ display: block;
1888
+ text-overflow: ellipsis;
1889
+ }
1890
+ .tnc .tnc-col-actual .tnc-item-main {
1891
+ min-width: 0;
1892
+ }
1893
+ .tnc .tnc-col-actual .tnc-item--timed {
1894
+ border-top: 1px solid var(--tnc-surface);
1895
+ border-bottom: 1px solid var(--tnc-surface);
1896
+ }
1897
+ .tnc .tnc-item--timed {
1898
+ box-shadow: inset 0 -1px 0 var(--tnc-surface);
1899
+ }
1900
+ .tnc .tnc-item.is-draggable {
1901
+ cursor: grab;
1902
+ }
1903
+ .tnc .tnc-item.is-dragging {
1904
+ opacity: 0.96;
1905
+ box-shadow: var(--tnc-theme-drag-lift, var(--tnc-shadow));
1906
+ outline: 1px solid var(--tnc-focus);
1907
+ outline-offset: -1px;
1908
+ }
1909
+ .tnc .tnc-item--list.is-dragging:not(.tnc-drag-preview) {
1910
+ opacity: var(--tnc-drag-opacity);
1911
+ box-shadow: none;
1912
+ }
1913
+ .tnc .tnc-item.tnc-drag-source {
1914
+ opacity: var(--tnc-drag-opacity);
1915
+ pointer-events: none;
1916
+ box-shadow: none;
1917
+ outline: none;
1918
+ }
1919
+ .tnc .tnc-item.tnc-drag-preview {
1920
+ position: absolute;
1921
+ z-index: var(--tnc-theme-drag-z, 1000);
1922
+ pointer-events: none;
1923
+ opacity: 1;
1924
+ background: var(--tnc-theme-drag-surface, var(--tnc-surface));
1925
+ border: 1px solid var(--tnc-theme-drag-border, var(--tnc-line-strong));
1926
+ box-shadow: var(--tnc-theme-drag-shadow, var(--tnc-shadow));
1927
+ outline: none;
1928
+ }
1929
+ .tnc .tnc-item.is-write-pending {
1930
+ opacity: 0.65;
1931
+ cursor: progress;
1932
+ }
1933
+ .tnc .tnc-item.is-write-failed {
1934
+ outline: 2px dashed var(--tnc-warn);
1935
+ outline-offset: -2px;
1936
+ }
1937
+ .tnc.tnc-drop-denied .tnc-item.is-dragging {
1938
+ outline: 2px dashed var(--tnc-warn);
1939
+ outline-offset: -2px;
1940
+ }
1941
+ .tnc.tnc-drop-denied,
1942
+ .tnc.tnc-drop-denied .tnc-item.is-dragging {
1943
+ cursor: not-allowed;
1944
+ }
1945
+ .tnc .tnc-item.is-selected {
1946
+ background-color: var(--tnc-selected);
1947
+ outline: 2px solid var(--tnc-accent);
1948
+ outline-offset: -2px;
1949
+ }
1950
+ .tnc :is(.tnc-item, .tnc-more, .tnc-strip-day, .tnc-btn, .tnc-list-add):focus-visible {
1951
+ outline: 2px solid var(--tnc-focus);
1952
+ outline-offset: -2px;
1953
+ }
1954
+ .tnc :is(.tnc-more, .tnc-btn, .tnc-list-add):disabled {
1955
+ opacity: var(--tnc-drag-opacity);
1956
+ cursor: not-allowed;
1957
+ }
1958
+ .tnc :is(.tnc-more, .tnc-btn, .tnc-list-add):active {
1959
+ background: var(--tnc-active);
1960
+ }
1961
+ .tnc .tnc-strip-day:active .tnc-strip-num {
1962
+ background: var(--tnc-active);
1963
+ }
1964
+ .tnc .tnc-strip-day.is-focus:active .tnc-strip-num {
1965
+ background: var(--tnc-accent);
1966
+ }
1967
+ .tnc .tnc-popover {
1968
+ background: var(--tnc-surface);
1969
+ }
1970
+ @media (hover: hover) {
1971
+ .tnc .tnc-item:not(.is-selected):not(.is-dragging):hover {
1972
+ filter: none;
1973
+ background-color: var(--tnc-hover);
1974
+ transition: background-color var(--tnc-motion);
1975
+ }
1976
+ .tnc .tnc-item--list:hover {
1977
+ box-shadow: none;
1978
+ }
1979
+ .tnc .tnc-item.is-selected:hover {
1980
+ background-color: var(--tnc-theme-selected-hover, var(--tnc-selected));
1981
+ }
1982
+ .tnc .tnc-more:hover {
1983
+ background: var(--tnc-hover);
1984
+ }
1985
+ }
1986
+ @media (hover: none) {
1987
+ .tnc .tnc-item:hover {
1988
+ filter: none;
1989
+ }
1990
+ .tnc .tnc-item--list:not(.is-selected):hover {
1991
+ background: none;
1992
+ }
1993
+ .tnc .tnc-strip-day:not(.is-focus):hover .tnc-strip-num {
1994
+ background: none;
1995
+ }
1996
+ }
1997
+ @media (prefers-reduced-motion: no-preference) {
1998
+ .tnc-item.is-write-changed {
1999
+ animation: tnc-write-settle calc(var(--tnc-motion) * 2) ease-out;
2000
+ }
2001
+ }
2002
+ @keyframes tnc-write-settle {
2003
+ from { opacity: var(--tnc-drag-opacity); }
2004
+ to { opacity: 1; }
2005
+ }
1709
2006
  @media (prefers-reduced-motion: reduce) {
1710
2007
  .tnc * {
1711
2008
  transition: none !important;