@nomideusz/svelte-calendar 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -164,9 +164,11 @@ const weekDays = $derived.by(() => {
164
164
  out.push({
165
165
  ms,
166
166
  dayName: weekdayLong(ms, locale),
167
- dateLabel: `${monthLong(ms, locale)} ${dayNum(ms)}`,
167
+ month: monthLong(ms, locale),
168
+ num: dayNum(ms),
168
169
  tier,
169
- isToday: ms === todayMs,
170
+ // A dateless weekly template (showDates=false) has no today to mark.
171
+ isToday: showDates && ms === todayMs,
170
172
  events: dayEvts,
171
173
  allDayEvents: allDayEvts,
172
174
  timedEvents: timedEvts,
@@ -198,7 +200,7 @@ const weekDays = $derived.by(() => {
198
200
  class:ag-card--tentative={ev.status === 'tentative'}
199
201
  class:ag-card--full={ev.status === 'full'}
200
202
  class:ag-card--limited={ev.status === 'limited'}
201
- style:--ev-color={ev.color || 'var(--dt-accent)'}
203
+ style:--ev-color={ev.color || 'var(--dt-event, var(--dt-accent))'}
202
204
  aria-label="{ev.title}{statusText(ev)}, {fmt(ev.start)} – {fmt(ev.end)}, {duration(ev)}"
203
205
  class:ag-card--drag={dragId === String(ev.id)}
204
206
  draggable={canDrag(ev)}
@@ -210,12 +212,6 @@ const weekDays = $derived.by(() => {
210
212
  <div class="ag-card-body">
211
213
  <EventContent event={ev}>
212
214
  <span class="ag-card-title">{ev.title}</span>
213
- {#if ev.subtitle}
214
- <span class="ag-card-sub">{ev.subtitle}</span>
215
- {/if}
216
- {#if ev.location}
217
- <span class="ag-card-loc">{ev.location}</span>
218
- {/if}
219
215
  <span class="ag-card-meta">
220
216
  {#if isNow}
221
217
  {L.until} {fmt(ev.end)}
@@ -227,6 +223,12 @@ const weekDays = $derived.by(() => {
227
223
  <span class="ag-card-eta">{eta}</span>
228
224
  {/if}
229
225
  </span>
226
+ {#if ev.subtitle}
227
+ <span class="ag-card-sub">{ev.subtitle}</span>
228
+ {/if}
229
+ {#if ev.location}
230
+ <span class="ag-card-loc">{ev.location}</span>
231
+ {/if}
230
232
  {#if ev.tags?.length}
231
233
  <div class="ag-card-tags">
232
234
  {#each ev.tags as tag}
@@ -255,7 +257,7 @@ const weekDays = $derived.by(() => {
255
257
  class:ag-compact--tentative={ev.status === 'tentative'}
256
258
  class:ag-compact--full={ev.status === 'full'}
257
259
  class:ag-compact--limited={ev.status === 'limited'}
258
- style:--ev-color={ev.color || 'var(--dt-accent)'}
260
+ style:--ev-color={ev.color || 'var(--dt-event, var(--dt-accent))'}
259
261
  aria-label="{ev.title}{statusText(ev)}{done ? `, ${L.completed}` : ''}, {fmt(ev.start)}, {duration(ev)}"
260
262
  onclick={() => handleClick(ev)}
261
263
  onpointerenter={() => oneventhover?.(ev)}
@@ -326,8 +328,9 @@ const weekDays = $derived.by(() => {
326
328
  onkeydown={ondayclick ? (e) => dayKeydown(e, day.ms) : undefined}
327
329
  >
328
330
  <div class="ag-wday-head-left">
331
+ {#if showDates}<span class="ag-wday-num">{day.num}</span>{/if}
329
332
  <span class="ag-wday-name">{day.dayName}</span>
330
- {#if showDates}<span class="ag-wday-date">{day.dateLabel}</span>{/if}
333
+ {#if showDates}<span class="ag-wday-date">{day.month}</span>{/if}
331
334
  </div>
332
335
  {#if dayHeaderSnippet}
333
336
  <div class="ag-wday-custom-header">
@@ -382,13 +385,14 @@ const weekDays = $derived.by(() => {
382
385
  onkeydown={ondayclick ? (e) => dayKeydown(e, day.ms) : undefined}
383
386
  >
384
387
  <div class="ag-wday-head-left">
388
+ {#if showDates}<span class="ag-wday-num">{day.num}</span>{/if}
385
389
  {#if day.isToday}
386
- <span class="ag-wday-badge">{L.today}</span>
387
- {:else if day.tier === 'tomorrow'}
388
- <span class="ag-wday-badge ag-wday-badge--muted">{L.tomorrow}</span>
390
+ <span class="ag-wday-badge">{L.today}</span>
391
+ {:else if showDates && day.tier === 'tomorrow'}
392
+ <span class="ag-wday-badge ag-wday-badge--muted">{L.tomorrow}</span>
389
393
  {/if}
390
394
  <span class="ag-wday-name">{day.dayName}</span>
391
- {#if showDates}<span class="ag-wday-date">{day.dateLabel}</span>{/if}
395
+ {#if showDates}<span class="ag-wday-date">{day.month}</span>{/if}
392
396
  </div>
393
397
  {#if dayHeaderSnippet}
394
398
  <div class="ag-wday-custom-header">
@@ -526,7 +530,7 @@ const weekDays = $derived.by(() => {
526
530
  width: 100%;
527
531
  min-width: 0;
528
532
  box-sizing: border-box;
529
- color: var(--dt-text, rgba(0, 0, 0, 0.87));
533
+ color: var(--dt-text, rgba(15, 15, 15, 0.87));
530
534
  font-family: var(--dt-sans, system-ui, sans-serif);
531
535
  }
532
536
  .ag--auto {
@@ -589,8 +593,8 @@ const weekDays = $derived.by(() => {
589
593
  .ag-allday-chip {
590
594
  display: flex;
591
595
  align-items: center;
592
- gap: 4px;
593
- padding: 2px 8px;
596
+ gap: 6px;
597
+ padding: 4px 10px;
594
598
  border-radius: 0;
595
599
  border: none;
596
600
  background: var(--ev-color);
@@ -603,7 +607,7 @@ const weekDays = $derived.by(() => {
603
607
  }
604
608
  .ag-allday-chip:focus-visible {
605
609
  outline: none;
606
- box-shadow: inset 0 0 0 2px var(--dt-btn-text, #fff), 0 0 0 2px var(--dt-accent, #2563eb);
610
+ box-shadow: inset 0 0 0 2px var(--dt-btn-text, #fff), 0 0 0 2px var(--dt-accent, #1d4fd7);
607
611
  }
608
612
  .ag-allday-chip--selected {
609
613
  box-shadow: inset 0 0 0 2px var(--dt-btn-text, #fff);
@@ -612,15 +616,14 @@ const weekDays = $derived.by(() => {
612
616
  display: none;
613
617
  }
614
618
  .ag-allday-title {
615
- font: 500 0.7rem/1.2 var(--dt-sans, system-ui, sans-serif);
619
+ font: 500 13.5px/1.2 var(--dt-sans, system-ui, sans-serif);
616
620
  color: inherit;
617
621
  white-space: nowrap;
618
622
  }
619
623
  .ag-allday-span {
620
- font: 500 10px/1.2 var(--dt-sans, system-ui, sans-serif);
624
+ font: 400 12.5px/1.2 var(--dt-sans, system-ui, sans-serif);
621
625
  font-variant-numeric: tabular-nums;
622
626
  color: inherit;
623
- opacity: 0.8;
624
627
  white-space: nowrap;
625
628
  }
626
629
 
@@ -630,11 +633,14 @@ const weekDays = $derived.by(() => {
630
633
  .ag-card {
631
634
  position: relative;
632
635
  display: flex;
636
+ /* A <button> shrinks to its content; the NOW card sits outside the
637
+ stretching slot column, so it claims the row explicitly. */
638
+ width: 100%;
633
639
  align-items: stretch;
634
640
  border-radius: 0;
635
641
  background: transparent;
636
642
  border: none;
637
- border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.3));
643
+ border-bottom: 1px solid var(--dt-border, rgba(15, 15, 15, 0.3));
638
644
  overflow: hidden;
639
645
  cursor: pointer;
640
646
  transition: background 150ms, box-shadow 150ms;
@@ -650,18 +656,18 @@ const weekDays = $derived.by(() => {
650
656
  }
651
657
  .ag-card:hover,
652
658
  .ag-card:active {
653
- background: var(--dt-hover, rgba(0, 0, 0, 0.04));
659
+ background: var(--dt-hover, rgba(15, 15, 15, 0.04));
654
660
  }
655
661
  .ag-card:focus-visible {
656
662
  outline: none;
657
- box-shadow: 0 0 0 2px var(--dt-accent, #2563eb);
663
+ box-shadow: 0 0 0 2px var(--dt-accent, #1d4fd7);
658
664
  }
659
665
  .ag-card--selected {
660
666
  box-shadow: inset 0 0 0 1px var(--ev-color);
661
667
  }
662
668
  .ag-card--cancelled .ag-card-title {
663
669
  text-decoration: line-through;
664
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
670
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.54));
665
671
  }
666
672
  .ag-card--cancelled::before,
667
673
  .ag-card--full::before {
@@ -670,25 +676,26 @@ const weekDays = $derived.by(() => {
670
676
  .ag-card--tentative .ag-card-title,
671
677
  .ag-card--limited .ag-card-title,
672
678
  .ag-card--full .ag-card-title {
673
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
679
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.54));
674
680
  }
675
681
  .ag-card--tentative::before,
676
682
  .ag-card--limited::before {
677
683
  background: repeating-linear-gradient(180deg, var(--ev-color) 0 4px, transparent 4px 7px);
678
684
  }
685
+ /* Planner scale: title 15/500, time 14 tabular in ink, meta 12.5 in ink-2.
686
+ The body keeps a reading measure so meta never drifts across a wide row. */
679
687
  .ag-card-body {
680
- padding: 7px 10px 7px 13px;
688
+ padding: 8px 10px 8px 13px;
681
689
  display: flex;
682
690
  flex-direction: column;
683
- gap: 2px;
691
+ gap: 3px;
684
692
  min-width: 0;
693
+ max-width: 44rem;
685
694
  flex: 1;
686
695
  }
687
696
  .ag-card-title {
688
- font-size: 13px;
689
- font-weight: 500;
690
- color: var(--dt-text, rgba(0, 0, 0, 0.87));
691
- line-height: 1.3;
697
+ font: 500 15px/1.25 var(--dt-sans, system-ui, sans-serif);
698
+ color: var(--dt-text, rgba(15, 15, 15, 0.87));
692
699
  word-break: break-word;
693
700
  flex: 1;
694
701
  min-width: 0;
@@ -700,53 +707,34 @@ const weekDays = $derived.by(() => {
700
707
  }
701
708
  .ag-card-meta {
702
709
  display: flex;
703
- align-items: center;
704
- font-size: 11px;
705
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
706
- font-family: var(--dt-sans, system-ui, sans-serif);
710
+ align-items: baseline;
711
+ flex-wrap: wrap;
712
+ column-gap: 8px;
713
+ row-gap: 2px;
714
+ font: 400 14px/1.2 var(--dt-sans, system-ui, sans-serif);
707
715
  font-variant-numeric: tabular-nums;
708
- line-height: 1;
716
+ color: var(--dt-text, rgba(15, 15, 15, 0.87));
709
717
  }
710
- .ag-card-dur {
711
- margin-left: 6px;
712
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
713
- }
714
- .ag-card-eta {
715
- margin-left: auto;
716
- font-size: 11px;
717
- font-weight: 500;
718
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
719
- letter-spacing: 0.02em;
720
- }
721
- .ag-card-sub {
722
- font-size: 11px;
723
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
724
- line-height: 1;
725
- }
726
- .ag-card-loc {
727
- font-size: 10px;
728
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
729
- line-height: 1;
718
+ .ag-card-dur,
719
+ .ag-card-eta,
720
+ .ag-card-sub,
721
+ .ag-card-loc,
722
+ .ag-card-tag {
723
+ font: 400 12.5px/1.2 var(--dt-sans, system-ui, sans-serif);
724
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
730
725
  }
731
726
  .ag-card-tags {
732
727
  display: flex;
733
- gap: 4px;
728
+ column-gap: 10px;
729
+ row-gap: 2px;
734
730
  flex-wrap: wrap;
735
731
  }
736
732
  .ag-card-tag {
737
- font: 500 10.5px / 1 var(--dt-sans, system-ui, sans-serif);
738
- text-transform: uppercase;
739
- letter-spacing: 0.04em;
740
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
741
- background: transparent;
742
- border: 1px solid var(--dt-border-day, rgba(0, 0, 0, 0.6));
743
- padding: 2px 5px;
744
- border-radius: 0;
745
733
  white-space: nowrap;
746
734
  }
747
735
  .ag-card-progress {
748
736
  height: 3px;
749
- background: var(--dt-border, rgba(0, 0, 0, 0.08));
737
+ background: var(--dt-border, rgba(15, 15, 15, 0.08));
750
738
  border-radius: 0;
751
739
  overflow: hidden;
752
740
  margin-top: 2px;
@@ -767,21 +755,17 @@ const weekDays = $derived.by(() => {
767
755
 
768
756
  /* ═══ Week day groups ═══ */
769
757
  .ag-wday {
770
- border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.08));
758
+ border-bottom: 1px solid var(--dt-border, rgba(15, 15, 15, 0.08));
771
759
  }
772
760
  .ag-wday:last-child {
773
761
  border-bottom: none;
774
762
  }
775
763
  .ag-wday--today {
776
- background: color-mix(in srgb, var(--dt-accent, #2563eb) 2%, transparent);
777
- }
778
- .ag-wday--tomorrow .ag-card {
779
- opacity: 0.82;
764
+ background: color-mix(in srgb, var(--dt-accent, #1d4fd7) 2%, transparent);
780
765
  }
781
- /* Past days: token-based text dim instead of subtree opacity (readability) */
782
- .ag-wday--past .ag-wday-name {
783
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
784
- font-weight: 500;
766
+ /* Past days: quieter ink from the text tokens, no subtree opacity */
767
+ .ag-wday--past .ag-wday-num {
768
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
785
769
  }
786
770
  .ag-wday--past .ag-wday-head {
787
771
  padding: 8px 20px 2px;
@@ -797,8 +781,8 @@ const weekDays = $derived.by(() => {
797
781
  135deg,
798
782
  transparent,
799
783
  transparent 4px,
800
- color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 8%, transparent) 4px,
801
- color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 8%, transparent) 8px
784
+ color-mix(in srgb, var(--dt-text, rgba(15, 15, 15, 0.87)) 8%, transparent) 4px,
785
+ color-mix(in srgb, var(--dt-text, rgba(15, 15, 15, 0.87)) 8%, transparent) 8px
802
786
  );
803
787
  pointer-events: none;
804
788
  }
@@ -812,7 +796,7 @@ const weekDays = $derived.by(() => {
812
796
  }
813
797
  .ag-wday-head--click:focus-visible,
814
798
  .ag-wday-empty--click:focus-visible {
815
- outline: 2px solid var(--dt-accent, #2563eb);
799
+ outline: 2px solid var(--dt-accent, #1d4fd7);
816
800
  outline-offset: -2px;
817
801
  border-radius: 4px;
818
802
  }
@@ -823,7 +807,7 @@ const weekDays = $derived.by(() => {
823
807
  padding: 8px 20px;
824
808
  position: sticky;
825
809
  top: 0;
826
- background: var(--dt-bg, #fff);
810
+ background: var(--dt-bg, #efebe9);
827
811
  z-index: 1;
828
812
  /* Own compositor layer: without it, fast (async) scrolling repaints
829
813
  the pinned header a frame late and a gap flashes above it. */
@@ -835,34 +819,40 @@ const weekDays = $derived.by(() => {
835
819
  align-items: baseline;
836
820
  gap: 8px;
837
821
  }
838
- .ag-wday-badge {
839
- font-size: 10px;
840
- font-weight: 500;
822
+ /* The planner's header type: the day number is the typography (40/400,
823
+ narrowed), the weekday a tracked 12/500 label; today takes the accent. */
824
+ .ag-wday-num {
825
+ font: 400 40px/1 var(--dt-sans, system-ui, sans-serif);
826
+ font-stretch: 90%;
827
+ letter-spacing: -0.02em;
828
+ font-variant-numeric: tabular-nums;
829
+ color: var(--dt-text, rgba(15, 15, 15, 0.87));
830
+ margin-inline-end: 4px;
831
+ }
832
+ .ag-wday-badge,
833
+ .ag-wday-name {
834
+ font: 500 12px/1 var(--dt-sans, system-ui, sans-serif);
841
835
  letter-spacing: 0.08em;
842
836
  text-transform: uppercase;
843
- color: var(--dt-accent, #2563eb);
837
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
844
838
  }
845
- .ag-wday-badge--muted {
846
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
839
+ .ag-wday--today .ag-wday-num,
840
+ .ag-wday--today .ag-wday-name,
841
+ .ag-wday-badge {
842
+ color: var(--dt-accent, #1d4fd7);
847
843
  }
848
- .ag-wday-name {
849
- font-size: 13px;
850
- font-weight: 600;
851
- line-height: 1.2;
844
+ .ag-wday .ag-wday-badge--muted {
845
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
852
846
  }
853
847
  .ag-wday-date {
854
- font-size: 11px;
855
- font-family: var(--dt-sans, system-ui, sans-serif);
856
- font-variant-numeric: tabular-nums;
857
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
858
- line-height: 1.2;
848
+ font: 400 12.5px/1 var(--dt-sans, system-ui, sans-serif);
849
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
859
850
  }
860
851
 
861
852
  .ag-wday-empty {
862
- padding: 2px 20px 6px;
863
- font-size: 11px;
864
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
865
- font-style: italic;
853
+ padding: 2px 20px 8px;
854
+ font-size: 12.5px;
855
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
866
856
  }
867
857
 
868
858
  /* Expanded day */
@@ -879,11 +869,10 @@ const weekDays = $derived.by(() => {
879
869
  padding: 2px 0;
880
870
  }
881
871
  .ag-wslot-now {
882
- font-size: 10px;
883
- font-weight: 700;
872
+ font: 500 12px/1.2 var(--dt-sans, system-ui, sans-serif);
884
873
  letter-spacing: 0.08em;
885
874
  text-transform: uppercase;
886
- color: var(--dt-accent, #2563eb);
875
+ color: var(--dt-accent, #1d4fd7);
887
876
  }
888
877
  .ag-wslot-cards {
889
878
  display: flex;
@@ -896,8 +885,8 @@ const weekDays = $derived.by(() => {
896
885
  gap: 4px;
897
886
  }
898
887
  .ag-wday-past-line {
899
- font-size: 11px;
900
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
888
+ font-size: 12.5px;
889
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
901
890
  padding: 6px 0 0;
902
891
  }
903
892
  .ag-wday-past-line--summary {
@@ -915,11 +904,11 @@ const weekDays = $derived.by(() => {
915
904
  }
916
905
  .ag-past-toggle:hover,
917
906
  .ag-past-toggle:active {
918
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
907
+ color: var(--dt-text, rgba(15, 15, 15, 0.87));
919
908
  }
920
909
  .ag-past-toggle:focus-visible {
921
910
  outline: none;
922
- box-shadow: 0 0 0 2px var(--dt-accent, #2563eb);
911
+ box-shadow: 0 0 0 2px var(--dt-accent, #1d4fd7);
923
912
  border-radius: 4px;
924
913
  }
925
914
  .ag-past-chevron {
@@ -931,14 +920,14 @@ const weekDays = $derived.by(() => {
931
920
  @media (prefers-reduced-motion: reduce) {
932
921
  .ag-past-chevron { transition: none; }
933
922
  }
934
- /* Revealed completed events: dim + strike, single token layer */
935
- .ag-compact--done .ag-compact-title {
936
- text-decoration: line-through;
937
- text-decoration-color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
938
- }
923
+ /* Revealed completed events: quieter ink (single token layer). Strikethrough
924
+ is kept for cancelled only, so "done" and "called off" never read alike. */
925
+ .ag-compact--done .ag-compact-title,
939
926
  .ag-compact--done .ag-compact-time {
940
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
941
- font-weight: 400;
927
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
928
+ }
929
+ .ag-compact--done::before {
930
+ opacity: 0.45;
942
931
  }
943
932
 
944
933
  /* Compact day events */
@@ -950,9 +939,9 @@ const weekDays = $derived.by(() => {
950
939
  position: relative;
951
940
  display: flex;
952
941
  align-items: baseline;
953
- gap: 6px;
954
- padding: 3px 0 3px 9px;
955
- border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.3));
942
+ gap: 10px;
943
+ padding: 5px 0 5px 11px;
944
+ border-bottom: 1px solid var(--dt-border, rgba(15, 15, 15, 0.3));
956
945
  cursor: pointer;
957
946
  min-width: 0;
958
947
  width: 100%;
@@ -975,33 +964,33 @@ const weekDays = $derived.by(() => {
975
964
  }
976
965
  .ag-compact:hover,
977
966
  .ag-compact:active {
978
- background: var(--dt-hover, rgba(0, 0, 0, 0.04));
967
+ background: var(--dt-hover, rgba(15, 15, 15, 0.04));
979
968
  }
980
969
  .ag-compact:focus-visible {
981
970
  outline: none;
982
- box-shadow: 0 0 0 2px var(--dt-accent, #2563eb);
971
+ box-shadow: 0 0 0 2px var(--dt-accent, #1d4fd7);
983
972
  }
984
973
  .ag-compact-time {
985
- font-size: 11px;
986
- font-family: var(--dt-sans, system-ui, sans-serif);
974
+ font: 400 14px/1.3 var(--dt-sans, system-ui, sans-serif);
987
975
  font-variant-numeric: tabular-nums;
988
- font-weight: 400;
989
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
990
- min-width: 40px;
976
+ color: var(--dt-text, rgba(15, 15, 15, 0.87));
977
+ min-width: 4.4em;
991
978
  flex-shrink: 0;
992
979
  white-space: nowrap;
993
- line-height: 1.4;
994
980
  }
995
- /* Title + location + subtitle + tags cluster. One line while it fits; on
996
- mobile the metadata wraps to a second line instead of crushing the title. */
981
+ /* Title + location + subtitle + tags cluster, sized to its content so the
982
+ meta and duration sit beside the title instead of across a wide row.
983
+ One line while it fits; on mobile the metadata wraps to a second line
984
+ instead of crushing the title. */
997
985
  .ag-compact-main {
998
986
  display: flex;
999
987
  align-items: baseline;
1000
- gap: 6px;
1001
- flex: 1;
988
+ gap: 10px;
989
+ flex: 0 1 auto;
1002
990
  min-width: 0;
1003
991
  }
1004
992
  .ag--mobile .ag-compact-main {
993
+ flex: 1;
1005
994
  flex-wrap: wrap;
1006
995
  row-gap: 2px;
1007
996
  }
@@ -1018,52 +1007,46 @@ const weekDays = $derived.by(() => {
1018
1007
  max-width: 100%;
1019
1008
  }
1020
1009
  .ag-compact-title {
1021
- font-size: 12px;
1022
- font-weight: 500;
1023
- color: var(--dt-text, rgba(0, 0, 0, 0.87));
1024
- flex: 1;
1010
+ font: 500 15px/1.3 var(--dt-sans, system-ui, sans-serif);
1011
+ color: var(--dt-text, rgba(15, 15, 15, 0.87));
1012
+ flex: 0 1 auto;
1025
1013
  /* The title is the row's identity — never let subtitle/tags/duration
1026
1014
  squeeze it out on narrow screens (min-width: 0 resolves to 0px). */
1027
- min-width: 35%;
1015
+ min-width: 6em;
1028
1016
  white-space: nowrap;
1029
1017
  overflow: hidden;
1030
1018
  text-overflow: ellipsis;
1031
1019
  transition: color 150ms;
1032
- line-height: 1.4;
1020
+ }
1021
+ .ag-compact-dur,
1022
+ .ag-compact-sub,
1023
+ .ag-compact-loc,
1024
+ .ag-compact-tag {
1025
+ font: 400 12.5px/1.3 var(--dt-sans, system-ui, sans-serif);
1026
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
1027
+ white-space: nowrap;
1033
1028
  }
1034
1029
  .ag-compact-dur {
1035
- font-size: 10px;
1036
- font-family: var(--dt-sans, system-ui, sans-serif);
1037
1030
  font-variant-numeric: tabular-nums;
1038
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
1039
1031
  flex-shrink: 0;
1040
- white-space: nowrap;
1041
- line-height: 1.4;
1042
1032
  }
1043
1033
  .ag-compact-sub {
1044
- font-size: 10px;
1045
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
1046
1034
  flex-shrink: 3;
1047
1035
  min-width: 0;
1048
- white-space: nowrap;
1049
1036
  overflow: hidden;
1050
1037
  text-overflow: ellipsis;
1051
- max-width: 120px;
1052
- line-height: 1.4;
1038
+ max-width: 160px;
1053
1039
  }
1054
1040
  .ag-compact-loc {
1055
- font-size: 10px;
1056
- color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
1057
1041
  flex-shrink: 3;
1058
1042
  min-width: 0;
1059
- white-space: nowrap;
1060
1043
  overflow: hidden;
1061
1044
  text-overflow: ellipsis;
1062
- max-width: 100px;
1045
+ max-width: 140px;
1063
1046
  }
1064
1047
  .ag-compact--cancelled .ag-compact-title {
1065
1048
  text-decoration: line-through;
1066
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
1049
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.54));
1067
1050
  }
1068
1051
  .ag-compact--cancelled::before,
1069
1052
  .ag-compact--full::before {
@@ -1072,42 +1055,33 @@ const weekDays = $derived.by(() => {
1072
1055
  .ag-compact--tentative .ag-compact-title,
1073
1056
  .ag-compact--limited .ag-compact-title,
1074
1057
  .ag-compact--full .ag-compact-title {
1075
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
1058
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.54));
1076
1059
  }
1077
1060
  .ag-compact--tentative::before,
1078
1061
  .ag-compact--limited::before {
1079
1062
  background: repeating-linear-gradient(180deg, var(--ev-color) 0 4px, transparent 4px 7px);
1080
1063
  }
1081
1064
  .ag-compact-tag {
1082
- font: 500 10.5px / 1 var(--dt-sans, system-ui, sans-serif);
1083
- text-transform: uppercase;
1084
- letter-spacing: 0.04em;
1085
- color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
1086
- background: transparent;
1087
- border: 1px solid var(--dt-border-day, rgba(0, 0, 0, 0.6));
1088
- padding: 1px 4px;
1089
- border-radius: 0;
1090
- white-space: nowrap;
1091
1065
  flex-shrink: 1;
1092
1066
  min-width: 2.5em;
1093
- max-width: 80px;
1067
+ max-width: 120px;
1094
1068
  overflow: hidden;
1095
1069
  text-overflow: ellipsis;
1096
1070
  }
1097
1071
  .ag-compact-more {
1098
- font-size: 11px;
1099
- color: color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 72%, transparent);
1100
- padding: 2px 0 0 13px;
1072
+ font-size: 12.5px;
1073
+ color: var(--dt-text-2, rgba(15, 15, 15, 0.66));
1074
+ padding: 4px 0 0 11px;
1101
1075
  cursor: pointer;
1102
1076
  display: block;
1103
1077
  }
1104
1078
  .ag-compact-more:hover,
1105
1079
  .ag-compact-more:active {
1106
- color: var(--dt-text, rgba(0, 0, 0, 0.87));
1080
+ color: var(--dt-text, rgba(15, 15, 15, 0.87));
1107
1081
  }
1108
1082
  .ag-compact-more:focus-visible {
1109
1083
  outline: none;
1110
- box-shadow: 0 0 0 2px var(--dt-accent, #2563eb);
1084
+ box-shadow: 0 0 0 2px var(--dt-accent, #1d4fd7);
1111
1085
  border-radius: 0;
1112
1086
  }
1113
1087
 
@@ -1116,8 +1090,8 @@ const weekDays = $derived.by(() => {
1116
1090
  opacity: 0.4;
1117
1091
  }
1118
1092
  .ag-wday--drop {
1119
- background: var(--dt-hover, rgba(0, 0, 0, 0.04));
1120
- box-shadow: inset 0 0 0 1px var(--dt-accent, #2563eb);
1093
+ background: var(--dt-hover, rgba(15, 15, 15, 0.04));
1094
+ box-shadow: inset 0 0 0 1px var(--dt-accent, #1d4fd7);
1121
1095
  }
1122
1096
 
1123
1097
  /* ═══ Timetable columns (desktop) ═══ */
@@ -1128,7 +1102,7 @@ const weekDays = $derived.by(() => {
1128
1102
  /* Columns stretch to the tallest day, so the separator runs full height */
1129
1103
  .ag--cols .ag-wday {
1130
1104
  border-bottom: none;
1131
- border-inline-start: 1px solid var(--dt-border, rgba(0, 0, 0, 0.08));
1105
+ border-inline-start: 1px solid var(--dt-border, rgba(15, 15, 15, 0.08));
1132
1106
  min-width: 0;
1133
1107
  }
1134
1108
  .ag--cols .ag-wday:first-child {
@@ -1181,67 +1155,16 @@ const weekDays = $derived.by(() => {
1181
1155
  .ag--mobile .ag-wday-compact {
1182
1156
  padding: 0 16px 12px;
1183
1157
  }
1158
+ /* Type is already on the planner scale; phones only get bigger targets. */
1184
1159
  .ag--mobile .ag-card-body {
1185
1160
  padding: 12px 14px;
1186
1161
  }
1187
- .ag--mobile .ag-card-title {
1188
- font-size: 15px;
1189
- }
1190
- .ag--mobile .ag-card-meta {
1191
- font-size: 12px;
1192
- }
1193
- .ag--mobile .ag-card-sub {
1194
- font-size: 12px;
1195
- }
1196
- .ag--mobile .ag-card-loc {
1197
- font-size: 12px;
1198
- }
1199
- .ag--mobile .ag-card-eta {
1200
- font-size: 12px;
1201
- }
1202
- .ag--mobile .ag-card-tag {
1203
- font-size: 11px;
1204
- }
1205
1162
  .ag--mobile .ag-compact {
1206
- padding: 8px 0;
1207
- }
1208
- .ag--mobile .ag-compact-title {
1209
- font-size: 15px;
1210
- }
1211
- .ag--mobile .ag-compact-time {
1212
- font-size: 12px;
1213
- }
1214
- .ag--mobile .ag-compact-dur {
1215
- font-size: 12px;
1216
- }
1217
- .ag--mobile .ag-compact-sub {
1218
- font-size: 12px;
1219
- }
1220
- .ag--mobile .ag-compact-loc {
1221
- font-size: 11px;
1222
- }
1223
- .ag--mobile .ag-compact-tag {
1224
- font-size: 11px;
1163
+ padding: 8px 0 8px 11px;
1225
1164
  }
1226
1165
  .ag--mobile .ag-compact-more {
1227
- font-size: 12px;
1228
1166
  padding-top: 6px;
1229
1167
  }
1230
- .ag--mobile .ag-allday-span {
1231
- font-size: 11px;
1232
- }
1233
- .ag--mobile .ag-wday-badge {
1234
- font-size: 11px;
1235
- }
1236
- .ag--mobile .ag-wslot-now {
1237
- font-size: 11px;
1238
- }
1239
- .ag--mobile .ag-wday-empty {
1240
- font-size: 12px;
1241
- }
1242
- .ag--mobile .ag-wday-past-line {
1243
- font-size: 12px;
1244
- }
1245
1168
  .ag--mobile .ag-wslot-cards--multi {
1246
1169
  grid-template-columns: 1fr;
1247
1170
  }