@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.
@@ -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, 'Outfit', system-ui, sans-serif);
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, #10141c) 85%, transparent);
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, #10141c) 85%, transparent);
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, 'Outfit', system-ui, sans-serif);
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, #ef4444) 55%, transparent);
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
- opacity: 0.4;
531
- pointer-events: none;
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, #10141c));
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, #10141c));
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, #ff6b4a);
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, #10141c));
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, #191919));
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, #191919));
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, #ff6b4a);
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, #191919));
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, #ff6b4a);
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, #191919));
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, #ff6b4a) 18%, transparent);
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, #191919));
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, #ff6b4a);
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, #191919));
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, #191919));
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, #ff6b4a);
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, #ff6b4a));
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, #ff6b4a));
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, #ff6b4a);
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, #ff6b4a);
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, #ff6b4a);
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, #10141c) 85%, transparent);
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, 'Outfit', system-ui, sans-serif);
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, #ef4444) 55%, transparent);
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, #10141c));
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, #10141c));
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, #ff6b4a);
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, #10141c));
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, #191919));
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, #191919));
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, #ff6b4a);
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, #191919));
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, #ff6b4a) 2%, transparent);
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, #ff6b4a);
780
- background: color-mix(in srgb, var(--dt-accent, #ff6b4a) 12%, transparent);
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, #ff6b4a);
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, #ff6b4a);
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, tick, untrack } from 'svelte';
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}% * (1 - ${GUTTER_W} / var(--mb-grid-w, 300)))`,
185
- width: `calc((100% - ${GUTTER_W}px) / ${info.totalCols} - 2px)`,
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
- <button
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
- onclick={() => handleDayTap(cell.ms)}
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
- <div
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
- </div>
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
- </button>
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
- opacity: 0.3;
322
- pointer-events: none;
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;