@nomideusz/svelte-calendar 0.6.4 → 0.6.7
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/README.md +9 -5
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +1 -0
- package/dist/adapters/jmap.d.ts +22 -0
- package/dist/adapters/jmap.js +130 -0
- package/dist/assets/favicon.svg +9 -1
- package/dist/calendar/Calendar.svelte +14 -14
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/primitives/DayHeader.svelte +6 -6
- package/dist/primitives/EmptySlot.svelte +3 -3
- package/dist/primitives/EventBlock.svelte +16 -16
- package/dist/primitives/NowIndicator.svelte +5 -5
- package/dist/views/agenda/AgendaDay.svelte +33 -28
- package/dist/views/agenda/AgendaWeek.svelte +18 -18
- package/dist/views/mobile/MobileDay.svelte +3 -6
- package/dist/views/mobile/MobileWeek.svelte +53 -18
- package/dist/views/planner/PlannerDay.svelte +39 -22
- package/dist/views/planner/PlannerWeek.svelte +124 -37
- package/package.json +78 -76
- package/widget/svelte-calendar.css +1 -1
- package/widget/widget.js +22 -104
|
@@ -444,11 +444,11 @@
|
|
|
444
444
|
left: 50%;
|
|
445
445
|
transform: translateX(-50%);
|
|
446
446
|
z-index: 20;
|
|
447
|
-
font: 600 11px/1 var(--dt-sans,
|
|
447
|
+
font: 600 11px/1 var(--dt-sans, system-ui, sans-serif);
|
|
448
448
|
letter-spacing: 0.04em;
|
|
449
449
|
text-transform: uppercase;
|
|
450
450
|
color: var(--dt-text, rgba(226, 232, 240, 0.85));
|
|
451
|
-
background: color-mix(in srgb, var(--dt-surface, #
|
|
451
|
+
background: color-mix(in srgb, var(--dt-surface, var(--dt-bg, #ffffff)) 85%, transparent);
|
|
452
452
|
backdrop-filter: blur(6px);
|
|
453
453
|
-webkit-backdrop-filter: blur(6px);
|
|
454
454
|
padding: 8px 16px;
|
|
@@ -466,7 +466,7 @@
|
|
|
466
466
|
z-index: 20;
|
|
467
467
|
display: flex;
|
|
468
468
|
gap: 2px;
|
|
469
|
-
background: color-mix(in srgb, var(--dt-surface, #
|
|
469
|
+
background: color-mix(in srgb, var(--dt-surface, var(--dt-bg, #ffffff)) 85%, transparent);
|
|
470
470
|
backdrop-filter: blur(6px);
|
|
471
471
|
-webkit-backdrop-filter: blur(6px);
|
|
472
472
|
border-radius: 8px;
|
|
@@ -478,7 +478,7 @@
|
|
|
478
478
|
background: transparent;
|
|
479
479
|
color: var(--dt-text-2, rgba(148, 163, 184, 0.55));
|
|
480
480
|
cursor: pointer;
|
|
481
|
-
font: 600 11px / 1 var(--dt-sans,
|
|
481
|
+
font: 600 11px / 1 var(--dt-sans, system-ui, sans-serif);
|
|
482
482
|
padding: 6px 12px;
|
|
483
483
|
border-radius: 6px;
|
|
484
484
|
letter-spacing: 0.04em;
|
|
@@ -505,7 +505,7 @@
|
|
|
505
505
|
pointer-events: none;
|
|
506
506
|
}
|
|
507
507
|
.ag-nav-pill:focus-visible {
|
|
508
|
-
outline: 2px solid color-mix(in srgb, var(--dt-accent, #
|
|
508
|
+
outline: 2px solid color-mix(in srgb, var(--dt-accent, #2563eb) 55%, transparent);
|
|
509
509
|
outline-offset: 2px;
|
|
510
510
|
}
|
|
511
511
|
|
|
@@ -527,8 +527,13 @@
|
|
|
527
527
|
.ag--auto { height: auto; overflow: visible; }
|
|
528
528
|
|
|
529
529
|
.ag--disabled {
|
|
530
|
-
|
|
531
|
-
|
|
530
|
+
background-image: repeating-linear-gradient(
|
|
531
|
+
135deg,
|
|
532
|
+
transparent,
|
|
533
|
+
transparent 6px,
|
|
534
|
+
color-mix(in srgb, var(--dt-text, rgba(255, 255, 255, 0.92)) 4%, transparent) 6px,
|
|
535
|
+
color-mix(in srgb, var(--dt-text, rgba(255, 255, 255, 0.92)) 4%, transparent) 12px
|
|
536
|
+
);
|
|
532
537
|
}
|
|
533
538
|
|
|
534
539
|
/* ═══ Body ═══ */
|
|
@@ -581,22 +586,22 @@
|
|
|
581
586
|
gap: 5px;
|
|
582
587
|
padding: 3px 10px;
|
|
583
588
|
border-radius: 6px;
|
|
584
|
-
background: color-mix(in srgb, var(--ev-color) 12%, var(--dt-surface, #
|
|
589
|
+
background: color-mix(in srgb, var(--ev-color) 12%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
585
590
|
border: 1px solid color-mix(in srgb, var(--ev-color) 20%, transparent);
|
|
586
591
|
cursor: pointer;
|
|
587
592
|
transition: background 0.15s, border-color 0.15s;
|
|
588
593
|
}
|
|
589
594
|
.ag-allday-chip:hover {
|
|
590
|
-
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, #
|
|
595
|
+
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
591
596
|
border-color: color-mix(in srgb, var(--ev-color) 35%, transparent);
|
|
592
597
|
}
|
|
593
598
|
.ag-allday-chip:focus-visible {
|
|
594
|
-
outline: 2px solid var(--dt-accent, #
|
|
599
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
595
600
|
outline-offset: 2px;
|
|
596
601
|
}
|
|
597
602
|
.ag-allday-chip--selected {
|
|
598
603
|
border-color: var(--ev-color);
|
|
599
|
-
background: color-mix(in srgb, var(--ev-color) 18%, var(--dt-surface, #
|
|
604
|
+
background: color-mix(in srgb, var(--ev-color) 18%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
600
605
|
}
|
|
601
606
|
.ag-allday-dot {
|
|
602
607
|
width: 6px;
|
|
@@ -616,23 +621,23 @@
|
|
|
616
621
|
display: flex;
|
|
617
622
|
align-items: stretch;
|
|
618
623
|
border-radius: 10px;
|
|
619
|
-
background: color-mix(in srgb, var(--ev-color) 15%, var(--dt-surface, #
|
|
624
|
+
background: color-mix(in srgb, var(--ev-color) 15%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
620
625
|
border: 1px solid color-mix(in srgb, var(--ev-color) 10%, var(--dt-border, rgba(255, 255, 255, 0.06)));
|
|
621
626
|
overflow: hidden;
|
|
622
627
|
cursor: pointer;
|
|
623
628
|
transition: background 150ms, border-color 150ms;
|
|
624
629
|
}
|
|
625
630
|
.ag-card:hover {
|
|
626
|
-
background: color-mix(in srgb, var(--ev-color) 25%, var(--dt-surface, #
|
|
631
|
+
background: color-mix(in srgb, var(--ev-color) 25%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
627
632
|
border-color: color-mix(in srgb, var(--ev-color) 40%, transparent);
|
|
628
633
|
}
|
|
629
634
|
.ag-card:focus-visible {
|
|
630
|
-
outline: 2px solid var(--dt-accent, #
|
|
635
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
631
636
|
outline-offset: 2px;
|
|
632
637
|
}
|
|
633
638
|
.ag-card--selected {
|
|
634
639
|
border-color: var(--ev-color);
|
|
635
|
-
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, #
|
|
640
|
+
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
636
641
|
}
|
|
637
642
|
.ag-card--cancelled {
|
|
638
643
|
opacity: 0.5;
|
|
@@ -724,12 +729,12 @@
|
|
|
724
729
|
font-size: 9px;
|
|
725
730
|
font-weight: 600;
|
|
726
731
|
letter-spacing: 0.04em;
|
|
727
|
-
color: var(--dt-accent, #
|
|
732
|
+
color: var(--dt-accent, #2563eb);
|
|
728
733
|
flex-shrink: 0;
|
|
729
734
|
white-space: nowrap;
|
|
730
735
|
}
|
|
731
736
|
.ag-card--hero {
|
|
732
|
-
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, #
|
|
737
|
+
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
733
738
|
border-color: color-mix(in srgb, var(--ev-color) 30%, transparent);
|
|
734
739
|
}
|
|
735
740
|
.ag-card--hero .ag-card-title {
|
|
@@ -738,7 +743,7 @@
|
|
|
738
743
|
}
|
|
739
744
|
.ag-card--hero .ag-card-eta {
|
|
740
745
|
font-size: 11px;
|
|
741
|
-
background: color-mix(in srgb, var(--dt-accent, #
|
|
746
|
+
background: color-mix(in srgb, var(--dt-accent, #2563eb) 18%, transparent);
|
|
742
747
|
padding: 2px 7px;
|
|
743
748
|
border-radius: 4px;
|
|
744
749
|
}
|
|
@@ -766,7 +771,7 @@
|
|
|
766
771
|
font-size: 14px;
|
|
767
772
|
}
|
|
768
773
|
.ag-card--first {
|
|
769
|
-
background: color-mix(in srgb, var(--ev-color) 20%, var(--dt-surface, #
|
|
774
|
+
background: color-mix(in srgb, var(--ev-color) 20%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
770
775
|
border-color: color-mix(in srgb, var(--ev-color) 25%, transparent);
|
|
771
776
|
}
|
|
772
777
|
.ag-card--first .ag-card-title {
|
|
@@ -876,24 +881,24 @@
|
|
|
876
881
|
font-size: 10px;
|
|
877
882
|
font-weight: 600;
|
|
878
883
|
font-family: var(--dt-mono, monospace);
|
|
879
|
-
color: var(--dt-accent, #
|
|
884
|
+
color: var(--dt-accent, #2563eb);
|
|
880
885
|
margin-left: 4px;
|
|
881
886
|
}
|
|
882
887
|
.ag-q-now {
|
|
883
888
|
padding: 8px 10px;
|
|
884
889
|
border-radius: 8px;
|
|
885
|
-
background: color-mix(in srgb, var(--ev-color, var(--dt-accent)) 15%, var(--dt-surface, #
|
|
890
|
+
background: color-mix(in srgb, var(--ev-color, var(--dt-accent)) 15%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
886
891
|
border: 1px solid color-mix(in srgb, var(--ev-color, var(--dt-accent)) 15%, transparent);
|
|
887
892
|
cursor: pointer;
|
|
888
893
|
transition: background 150ms, border-color 150ms;
|
|
889
894
|
margin-right: 10px;
|
|
890
895
|
}
|
|
891
896
|
.ag-q-now:hover {
|
|
892
|
-
background: color-mix(in srgb, var(--ev-color, var(--dt-accent)) 25%, var(--dt-surface, #
|
|
897
|
+
background: color-mix(in srgb, var(--ev-color, var(--dt-accent)) 25%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
893
898
|
border-color: color-mix(in srgb, var(--ev-color, var(--dt-accent)) 35%, transparent);
|
|
894
899
|
}
|
|
895
900
|
.ag-q-now:focus-visible {
|
|
896
|
-
outline: 2px solid var(--dt-accent, #
|
|
901
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
897
902
|
outline-offset: 2px;
|
|
898
903
|
}
|
|
899
904
|
.ag-q-now--selected {
|
|
@@ -903,7 +908,7 @@
|
|
|
903
908
|
width: 6px;
|
|
904
909
|
height: 6px;
|
|
905
910
|
border-radius: 50%;
|
|
906
|
-
background: var(--ev-color, var(--dt-accent, #
|
|
911
|
+
background: var(--ev-color, var(--dt-accent, #2563eb));
|
|
907
912
|
margin-bottom: 6px;
|
|
908
913
|
animation: ag-pulse 2.5s ease-in-out infinite;
|
|
909
914
|
}
|
|
@@ -935,7 +940,7 @@
|
|
|
935
940
|
}
|
|
936
941
|
.ag-q-now-fill {
|
|
937
942
|
height: 100%;
|
|
938
|
-
background: var(--ev-color, var(--dt-accent, #
|
|
943
|
+
background: var(--ev-color, var(--dt-accent, #2563eb));
|
|
939
944
|
border-radius: 1px;
|
|
940
945
|
transition: width 1s linear;
|
|
941
946
|
}
|
|
@@ -975,7 +980,7 @@
|
|
|
975
980
|
opacity: 0.6;
|
|
976
981
|
}
|
|
977
982
|
.ag-q-done-item:focus-visible {
|
|
978
|
-
outline: 2px solid var(--dt-accent, #
|
|
983
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
979
984
|
outline-offset: 2px;
|
|
980
985
|
opacity: 0.6;
|
|
981
986
|
}
|
|
@@ -1025,7 +1030,7 @@
|
|
|
1025
1030
|
opacity: 1;
|
|
1026
1031
|
}
|
|
1027
1032
|
.ag-log-row:focus-visible {
|
|
1028
|
-
outline: 2px solid var(--dt-accent, #
|
|
1033
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
1029
1034
|
outline-offset: 2px;
|
|
1030
1035
|
}
|
|
1031
1036
|
.ag-log-row--selected {
|
|
@@ -1096,7 +1101,7 @@
|
|
|
1096
1101
|
}
|
|
1097
1102
|
.ag-compact-row:hover .ag-compact-row-title { color: var(--dt-text); }
|
|
1098
1103
|
.ag-compact-row:focus-visible {
|
|
1099
|
-
outline: 2px solid var(--dt-accent, #
|
|
1104
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
1100
1105
|
outline-offset: 2px;
|
|
1101
1106
|
}
|
|
1102
1107
|
.ag-compact-row-dot {
|
|
@@ -484,7 +484,7 @@
|
|
|
484
484
|
z-index: 20;
|
|
485
485
|
display: flex;
|
|
486
486
|
gap: 2px;
|
|
487
|
-
background: color-mix(in srgb, var(--dt-surface, #
|
|
487
|
+
background: color-mix(in srgb, var(--dt-surface, var(--dt-bg, #ffffff)) 85%, transparent);
|
|
488
488
|
backdrop-filter: blur(6px);
|
|
489
489
|
-webkit-backdrop-filter: blur(6px);
|
|
490
490
|
border-radius: 8px;
|
|
@@ -496,7 +496,7 @@
|
|
|
496
496
|
background: transparent;
|
|
497
497
|
color: var(--dt-text-2, rgba(148, 163, 184, 0.55));
|
|
498
498
|
cursor: pointer;
|
|
499
|
-
font: 600 11px / 1 var(--dt-sans,
|
|
499
|
+
font: 600 11px / 1 var(--dt-sans, system-ui, sans-serif);
|
|
500
500
|
padding: 6px 12px;
|
|
501
501
|
border-radius: 6px;
|
|
502
502
|
letter-spacing: 0.04em;
|
|
@@ -523,7 +523,7 @@
|
|
|
523
523
|
pointer-events: none;
|
|
524
524
|
}
|
|
525
525
|
.ag-nav-pill:focus-visible {
|
|
526
|
-
outline: 2px solid color-mix(in srgb, var(--dt-accent, #
|
|
526
|
+
outline: 2px solid color-mix(in srgb, var(--dt-accent, #2563eb) 55%, transparent);
|
|
527
527
|
outline-offset: 2px;
|
|
528
528
|
}
|
|
529
529
|
|
|
@@ -552,6 +552,8 @@
|
|
|
552
552
|
min-width: 0;
|
|
553
553
|
overflow-y: auto;
|
|
554
554
|
overflow-x: hidden;
|
|
555
|
+
box-sizing: border-box;
|
|
556
|
+
padding-top: 44px;
|
|
555
557
|
scrollbar-width: thin;
|
|
556
558
|
scrollbar-color: var(--dt-border) transparent;
|
|
557
559
|
}
|
|
@@ -579,22 +581,22 @@
|
|
|
579
581
|
gap: 4px;
|
|
580
582
|
padding: 2px 8px;
|
|
581
583
|
border-radius: 5px;
|
|
582
|
-
background: color-mix(in srgb, var(--ev-color) 12%, var(--dt-surface, #
|
|
584
|
+
background: color-mix(in srgb, var(--ev-color) 12%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
583
585
|
border: 1px solid color-mix(in srgb, var(--ev-color) 18%, transparent);
|
|
584
586
|
cursor: pointer;
|
|
585
587
|
transition: background 0.15s, border-color 0.15s;
|
|
586
588
|
}
|
|
587
589
|
.ag-allday-chip:hover {
|
|
588
|
-
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, #
|
|
590
|
+
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
589
591
|
border-color: color-mix(in srgb, var(--ev-color) 30%, transparent);
|
|
590
592
|
}
|
|
591
593
|
.ag-allday-chip:focus-visible {
|
|
592
|
-
outline: 2px solid var(--dt-accent, #
|
|
594
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
593
595
|
outline-offset: 2px;
|
|
594
596
|
}
|
|
595
597
|
.ag-allday-chip--selected {
|
|
596
598
|
border-color: var(--ev-color);
|
|
597
|
-
background: color-mix(in srgb, var(--ev-color) 18%, var(--dt-surface, #
|
|
599
|
+
background: color-mix(in srgb, var(--ev-color) 18%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
598
600
|
}
|
|
599
601
|
.ag-allday-dot {
|
|
600
602
|
width: 5px;
|
|
@@ -614,23 +616,23 @@
|
|
|
614
616
|
display: flex;
|
|
615
617
|
align-items: stretch;
|
|
616
618
|
border-radius: 6px;
|
|
617
|
-
background: color-mix(in srgb, var(--ev-color) 12%, var(--dt-surface, #
|
|
619
|
+
background: color-mix(in srgb, var(--ev-color) 12%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
618
620
|
border: 1px solid color-mix(in srgb, var(--ev-color) 8%, var(--dt-border, rgba(255, 255, 255, 0.06)));
|
|
619
621
|
overflow: hidden;
|
|
620
622
|
cursor: pointer;
|
|
621
623
|
transition: background 150ms, border-color 150ms;
|
|
622
624
|
}
|
|
623
625
|
.ag-card:hover {
|
|
624
|
-
background: color-mix(in srgb, var(--ev-color) 20%, var(--dt-surface, #
|
|
626
|
+
background: color-mix(in srgb, var(--ev-color) 20%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
625
627
|
border-color: color-mix(in srgb, var(--ev-color) 30%, transparent);
|
|
626
628
|
}
|
|
627
629
|
.ag-card:focus-visible {
|
|
628
|
-
outline: 2px solid var(--dt-accent, #
|
|
630
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
629
631
|
outline-offset: 2px;
|
|
630
632
|
}
|
|
631
633
|
.ag-card--selected {
|
|
632
634
|
border-color: var(--ev-color);
|
|
633
|
-
background: color-mix(in srgb, var(--ev-color) 20%, var(--dt-surface, #
|
|
635
|
+
background: color-mix(in srgb, var(--ev-color) 20%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
634
636
|
}
|
|
635
637
|
.ag-card--cancelled {
|
|
636
638
|
opacity: 0.5;
|
|
@@ -727,7 +729,7 @@
|
|
|
727
729
|
border-bottom: 1px solid var(--dt-border, rgba(255, 255, 255, 0.06));
|
|
728
730
|
}
|
|
729
731
|
.ag-wday--today {
|
|
730
|
-
background: color-mix(in srgb, var(--dt-accent, #
|
|
732
|
+
background: color-mix(in srgb, var(--dt-accent, #2563eb) 2%, transparent);
|
|
731
733
|
}
|
|
732
734
|
.ag-wday--tomorrow .ag-card {
|
|
733
735
|
opacity: 0.82;
|
|
@@ -739,8 +741,6 @@
|
|
|
739
741
|
padding: 8px 20px;
|
|
740
742
|
}
|
|
741
743
|
.ag-wday--disabled {
|
|
742
|
-
opacity: 0.35;
|
|
743
|
-
pointer-events: none;
|
|
744
744
|
position: relative;
|
|
745
745
|
}
|
|
746
746
|
.ag-wday--disabled::after {
|
|
@@ -776,8 +776,8 @@
|
|
|
776
776
|
font-weight: 600;
|
|
777
777
|
letter-spacing: 0.08em;
|
|
778
778
|
text-transform: uppercase;
|
|
779
|
-
color: var(--dt-accent, #
|
|
780
|
-
background: color-mix(in srgb, var(--dt-accent, #
|
|
779
|
+
color: var(--dt-accent, #2563eb);
|
|
780
|
+
background: color-mix(in srgb, var(--dt-accent, #2563eb) 12%, transparent);
|
|
781
781
|
padding: 2px 7px;
|
|
782
782
|
border-radius: 3px;
|
|
783
783
|
}
|
|
@@ -824,7 +824,7 @@
|
|
|
824
824
|
font-weight: 700;
|
|
825
825
|
letter-spacing: 0.08em;
|
|
826
826
|
text-transform: uppercase;
|
|
827
|
-
color: var(--dt-accent, #
|
|
827
|
+
color: var(--dt-accent, #2563eb);
|
|
828
828
|
}
|
|
829
829
|
.ag-wslot-cards {
|
|
830
830
|
display: flex;
|
|
@@ -866,7 +866,7 @@
|
|
|
866
866
|
color: var(--dt-text);
|
|
867
867
|
}
|
|
868
868
|
.ag-compact:focus-visible {
|
|
869
|
-
outline: 2px solid var(--dt-accent, #
|
|
869
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
870
870
|
outline-offset: 2px;
|
|
871
871
|
}
|
|
872
872
|
.ag-compact-dot {
|
|
@@ -6,12 +6,10 @@
|
|
|
6
6
|
Events positioned absolutely within hour lanes.
|
|
7
7
|
-->
|
|
8
8
|
<script lang="ts">
|
|
9
|
-
import { onMount
|
|
9
|
+
import { onMount } from 'svelte';
|
|
10
10
|
import { useCalendarContext } from '../shared/context.svelte.js';
|
|
11
11
|
import { createClock } from '../../core/clock.svelte.js';
|
|
12
12
|
import type { TimelineEvent, BlockedSlot } from '../../core/types.js';
|
|
13
|
-
import type { DragState } from '../../engine/drag.svelte.js';
|
|
14
|
-
import type { ViewState } from '../../engine/view-state.svelte.js';
|
|
15
13
|
import { DAY_MS, HOUR_MS, sod, isAllDay, isMultiDay, segmentForDay } from '../../core/time.js';
|
|
16
14
|
import type { DaySegment } from '../../core/time.js';
|
|
17
15
|
import { fmtH, fmtTime, getLabels } from '../../core/locale.js';
|
|
@@ -181,8 +179,8 @@
|
|
|
181
179
|
ev: info.ev,
|
|
182
180
|
top: info.top,
|
|
183
181
|
height: info.height,
|
|
184
|
-
left: `calc(${GUTTER_W}px + ${(info.col / info.totalCols) * 100}%
|
|
185
|
-
width: `calc(
|
|
182
|
+
left: `calc(${GUTTER_W}px + ${(info.col / info.totalCols) * 100}% - ${(GUTTER_W * info.col) / info.totalCols}px)`,
|
|
183
|
+
width: `calc(${100 / info.totalCols}% - ${GUTTER_W / info.totalCols + 2}px)`,
|
|
186
184
|
isCurrent: info.isCurrent,
|
|
187
185
|
isNext: info.isNext,
|
|
188
186
|
col: info.col,
|
|
@@ -316,7 +314,6 @@
|
|
|
316
314
|
onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleGridClick(e as unknown as MouseEvent); }}
|
|
317
315
|
role="grid"
|
|
318
316
|
tabindex="-1"
|
|
319
|
-
style:--mb-grid-w="300"
|
|
320
317
|
>
|
|
321
318
|
<div class="mb-grid-inner" style:height="{gridHeight}px">
|
|
322
319
|
<!-- Hour lanes -->
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
import { useCalendarContext } from '../shared/context.svelte.js';
|
|
10
10
|
import { createClock } from '../../core/clock.svelte.js';
|
|
11
11
|
import type { TimelineEvent } from '../../core/types.js';
|
|
12
|
-
import type { ViewState } from '../../engine/view-state.svelte.js';
|
|
13
12
|
import { DAY_MS, sod, isAllDay, isMultiDay } from '../../core/time.js';
|
|
14
13
|
import { startOfWeek as sowFn } from '../../core/time.js';
|
|
15
14
|
import { fmtTime as _fmtTime, weekdayShort, getLabels } from '../../core/locale.js';
|
|
@@ -186,6 +185,12 @@
|
|
|
186
185
|
viewState.setView(dayView);
|
|
187
186
|
}
|
|
188
187
|
}
|
|
188
|
+
|
|
189
|
+
function handleDayKeydown(e: KeyboardEvent, dayMs: number) {
|
|
190
|
+
if (e.key !== 'Enter' && e.key !== ' ') return;
|
|
191
|
+
e.preventDefault();
|
|
192
|
+
handleDayTap(dayMs);
|
|
193
|
+
}
|
|
189
194
|
</script>
|
|
190
195
|
|
|
191
196
|
<div
|
|
@@ -202,15 +207,21 @@
|
|
|
202
207
|
<!-- Vertical day list -->
|
|
203
208
|
<div class="mw-list" role="list">
|
|
204
209
|
{#each dayCells as cell (cell.ms)}
|
|
205
|
-
<
|
|
210
|
+
<div
|
|
206
211
|
class="mw-row"
|
|
207
212
|
class:mw-row--today={cell.isToday}
|
|
208
213
|
class:mw-row--past={cell.isPast}
|
|
209
214
|
class:mw-row--weekend={cell.isWeekend}
|
|
210
215
|
class:mw-row--disabled={cell.isDisabled}
|
|
211
|
-
|
|
212
|
-
aria-label="{cell.dayName} {cell.dayNum}"
|
|
216
|
+
role="listitem"
|
|
213
217
|
>
|
|
218
|
+
<button
|
|
219
|
+
class="mw-row-target"
|
|
220
|
+
disabled={cell.isDisabled}
|
|
221
|
+
onclick={() => handleDayTap(cell.ms)}
|
|
222
|
+
onkeydown={(e) => handleDayKeydown(e, cell.ms)}
|
|
223
|
+
aria-label="{cell.dayName} {cell.dayNum}"
|
|
224
|
+
></button>
|
|
214
225
|
<!-- Date column -->
|
|
215
226
|
<div class="mw-date">
|
|
216
227
|
<span class="mw-day-name" class:mw-day-name--today={cell.isToday}>{cell.dayName}</span>
|
|
@@ -225,7 +236,8 @@
|
|
|
225
236
|
<span class="mw-empty">{L.noEvents}</span>
|
|
226
237
|
{:else}
|
|
227
238
|
{#each cell.events.slice(0, MAX_EVENTS) as ev (ev.id)}
|
|
228
|
-
<
|
|
239
|
+
<button
|
|
240
|
+
type="button"
|
|
229
241
|
class="mw-ev"
|
|
230
242
|
class:mw-ev--selected={selectedEventId === ev.id}
|
|
231
243
|
class:mw-ev--allday={isAllDay(ev) || isMultiDay(ev)}
|
|
@@ -235,8 +247,6 @@
|
|
|
235
247
|
class:mw-ev--full={ev.status === 'full'}
|
|
236
248
|
class:mw-ev--limited={ev.status === 'limited'}
|
|
237
249
|
style:--ev-color={ev.color ?? 'var(--dt-accent)'}
|
|
238
|
-
role="button"
|
|
239
|
-
tabindex="0"
|
|
240
250
|
onclick={(e) => { e.stopPropagation(); oneventclick?.(ev); }}
|
|
241
251
|
onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); e.stopPropagation(); oneventclick?.(ev); } }}
|
|
242
252
|
onpointerenter={() => oneventhover?.(ev)}
|
|
@@ -250,7 +260,7 @@
|
|
|
250
260
|
<span class="mw-ev-time">{fmtTime(ev.start)}</span>
|
|
251
261
|
{/if}
|
|
252
262
|
</div>
|
|
253
|
-
</
|
|
263
|
+
</button>
|
|
254
264
|
{/each}
|
|
255
265
|
{#if cell.totalCount > MAX_EVENTS}
|
|
256
266
|
<span class="mw-ev-more">{L.nMore(cell.totalCount - MAX_EVENTS)}</span>
|
|
@@ -260,7 +270,7 @@
|
|
|
260
270
|
|
|
261
271
|
<!-- Chevron -->
|
|
262
272
|
<svg class="mw-chevron" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="14" height="14" aria-hidden="true"><path d="M6 3l5 5-5 5"/></svg>
|
|
263
|
-
</
|
|
273
|
+
</div>
|
|
264
274
|
{/each}
|
|
265
275
|
</div>
|
|
266
276
|
</div>
|
|
@@ -294,10 +304,9 @@
|
|
|
294
304
|
display: flex;
|
|
295
305
|
align-items: center;
|
|
296
306
|
gap: 12px;
|
|
307
|
+
position: relative;
|
|
297
308
|
padding: 10px 12px;
|
|
298
|
-
border: none;
|
|
299
309
|
background: transparent;
|
|
300
|
-
cursor: pointer;
|
|
301
310
|
transition: background 120ms;
|
|
302
311
|
text-align: left;
|
|
303
312
|
width: 100%;
|
|
@@ -308,7 +317,7 @@
|
|
|
308
317
|
.mw-row:last-child {
|
|
309
318
|
border-bottom: none;
|
|
310
319
|
}
|
|
311
|
-
.mw-row:active {
|
|
320
|
+
.mw-row:has(.mw-row-target:active) {
|
|
312
321
|
background: color-mix(in srgb, var(--dt-accent, #2563eb) 6%, transparent);
|
|
313
322
|
}
|
|
314
323
|
.mw-row--today {
|
|
@@ -318,8 +327,30 @@
|
|
|
318
327
|
opacity: 0.5;
|
|
319
328
|
}
|
|
320
329
|
.mw-row--disabled {
|
|
321
|
-
|
|
322
|
-
|
|
330
|
+
background-image: repeating-linear-gradient(
|
|
331
|
+
135deg,
|
|
332
|
+
transparent,
|
|
333
|
+
transparent 6px,
|
|
334
|
+
color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 4%, transparent) 6px,
|
|
335
|
+
color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 4%, transparent) 12px
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
.mw-row-target {
|
|
339
|
+
position: absolute;
|
|
340
|
+
inset: 0;
|
|
341
|
+
z-index: 0;
|
|
342
|
+
border: none;
|
|
343
|
+
background: transparent;
|
|
344
|
+
cursor: pointer;
|
|
345
|
+
padding: 0;
|
|
346
|
+
-webkit-tap-highlight-color: transparent;
|
|
347
|
+
}
|
|
348
|
+
.mw-row-target:disabled {
|
|
349
|
+
cursor: default;
|
|
350
|
+
}
|
|
351
|
+
.mw-row-target:focus-visible {
|
|
352
|
+
outline: 2px solid var(--dt-accent, #2563eb);
|
|
353
|
+
outline-offset: -2px;
|
|
323
354
|
}
|
|
324
355
|
|
|
325
356
|
/* ─── Date column ────────────────────────────────── */
|
|
@@ -330,6 +361,9 @@
|
|
|
330
361
|
width: 40px;
|
|
331
362
|
flex-shrink: 0;
|
|
332
363
|
gap: 2px;
|
|
364
|
+
position: relative;
|
|
365
|
+
z-index: 1;
|
|
366
|
+
pointer-events: none;
|
|
333
367
|
}
|
|
334
368
|
|
|
335
369
|
.mw-day-name {
|
|
@@ -365,6 +399,8 @@
|
|
|
365
399
|
display: flex;
|
|
366
400
|
flex-direction: column;
|
|
367
401
|
gap: 4px;
|
|
402
|
+
position: relative;
|
|
403
|
+
z-index: 2;
|
|
368
404
|
}
|
|
369
405
|
|
|
370
406
|
.mw-empty {
|
|
@@ -462,13 +498,12 @@
|
|
|
462
498
|
.mw-chevron {
|
|
463
499
|
flex-shrink: 0;
|
|
464
500
|
color: var(--dt-text-3, rgba(0, 0, 0, 0.2));
|
|
501
|
+
position: relative;
|
|
502
|
+
z-index: 1;
|
|
503
|
+
pointer-events: none;
|
|
465
504
|
}
|
|
466
505
|
|
|
467
506
|
/* ─── Focus ──────────────────────────────────────── */
|
|
468
|
-
.mw-row:focus-visible {
|
|
469
|
-
outline: 2px solid var(--dt-accent, #2563eb);
|
|
470
|
-
outline-offset: -2px;
|
|
471
|
-
}
|
|
472
507
|
.mw-ev:focus-visible {
|
|
473
508
|
outline: 2px solid var(--ev-color, var(--dt-accent));
|
|
474
509
|
outline-offset: 1px;
|