@nomideusz/svelte-calendar 0.6.9 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -417,7 +417,7 @@
417
417
  padding: 4px 8px;
418
418
  overflow-x: auto;
419
419
  scrollbar-width: none;
420
- border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.06));
420
+ border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.08));
421
421
  flex-shrink: 0;
422
422
  align-items: center;
423
423
  }
@@ -481,7 +481,7 @@
481
481
  overflow-x: hidden;
482
482
  -webkit-overflow-scrolling: touch;
483
483
  scrollbar-width: thin;
484
- scrollbar-color: var(--dt-scrollbar, rgba(0, 0, 0, 0.08)) transparent;
484
+ scrollbar-color: var(--dt-scrollbar, rgba(0, 0, 0, 0.1)) transparent;
485
485
  position: relative;
486
486
  padding-top: 8px;
487
487
  }
@@ -668,7 +668,7 @@
668
668
 
669
669
  .mb-ev-loc {
670
670
  font: 400 10px/1 var(--dt-sans, system-ui, sans-serif);
671
- color: var(--dt-text-3, rgba(0, 0, 0, 0.3));
671
+ color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
672
672
  white-space: nowrap;
673
673
  overflow: hidden;
674
674
  text-overflow: ellipsis;
@@ -295,7 +295,7 @@
295
295
  overflow-y: auto;
296
296
  -webkit-overflow-scrolling: touch;
297
297
  scrollbar-width: thin;
298
- scrollbar-color: var(--dt-scrollbar, rgba(0, 0, 0, 0.08)) transparent;
298
+ scrollbar-color: var(--dt-scrollbar, rgba(0, 0, 0, 0.1)) transparent;
299
299
  }
300
300
  .mw--auto .mw-list { overflow-y: visible; }
301
301
 
@@ -311,7 +311,7 @@
311
311
  text-align: left;
312
312
  width: 100%;
313
313
  -webkit-tap-highlight-color: transparent;
314
- border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.06));
314
+ border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.08));
315
315
  min-height: 56px;
316
316
  }
317
317
  .mw-row:last-child {
@@ -405,7 +405,7 @@
405
405
 
406
406
  .mw-empty {
407
407
  font: 400 12px/1 var(--dt-sans, system-ui, sans-serif);
408
- color: var(--dt-text-3, rgba(0, 0, 0, 0.25));
408
+ color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
409
409
  font-style: italic;
410
410
  }
411
411
 
@@ -497,7 +497,7 @@
497
497
  /* ─── Chevron ────────────────────────────────────── */
498
498
  .mw-chevron {
499
499
  flex-shrink: 0;
500
- color: var(--dt-text-3, rgba(0, 0, 0, 0.2));
500
+ color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
501
501
  position: relative;
502
502
  z-index: 1;
503
503
  pointer-events: none;
@@ -66,8 +66,6 @@
66
66
  const commitDragCtx = $derived(ctx.commitDrag);
67
67
  const viewState = $derived(ctx.viewState);
68
68
  const loadRangeCtx = $derived(ctx.loadRange);
69
- const showNav = $derived(ctx.showNav);
70
- const showDates = $derived(ctx.showDates);
71
69
  const blockedSlots = $derived(ctx.blockedSlots);
72
70
  const dayHeaderSnippet = $derived(ctx.dayHeaderSnippet);
73
71
  const minDuration = $derived(ctx.minDuration);
@@ -105,18 +103,6 @@
105
103
  const hourCount = $derived(Math.max(1, endHour - startHour));
106
104
  const DAY_GAP = 2;
107
105
 
108
- const dateLabel = $derived(
109
- showDates
110
- ? new Date(visibleDayMs).toLocaleDateString(locale ?? 'en-US', {
111
- weekday: 'long',
112
- month: 'long',
113
- day: 'numeric',
114
- })
115
- : new Date(visibleDayMs).toLocaleDateString(locale ?? 'en-US', {
116
- weekday: 'long',
117
- })
118
- );
119
-
120
106
  const count = 1 + 2 * BUFFER_DAYS;
121
107
  const origin = $derived(internalCenterMs - BUFFER_DAYS * DAY_MS);
122
108
 
@@ -346,7 +332,8 @@
346
332
  lastExternalMs = ext;
347
333
  internalCenterMs = ext;
348
334
  visibleDayMs = ext;
349
- following = false;
335
+ // Landing on today (e.g. header "Today" button) resumes auto-follow.
336
+ following = ext === clock.today;
350
337
  // After DOM update, recenter scroll on focus day.
351
338
  tick().then(() => {
352
339
  if (el) {
@@ -716,35 +703,6 @@
716
703
  </div>
717
704
  {/if}
718
705
 
719
- <div class="fs-date-label">{dateLabel}</div>
720
-
721
- {#if showNav}
722
- <nav class="fs-nav" aria-label={L.dayNavigation}>
723
- <button
724
- class="fs-nav-pill fs-nav-today"
725
- class:fs-nav-today--hidden={following}
726
- onclick={() => { internalCenterMs = clock.today; lastExternalMs = clock.today; viewState?.goToday(); following = true; }}
727
- aria-label={L.goToToday}
728
- tabindex={following ? -1 : 0}
729
- >
730
- {L.today}
731
- </button>
732
- <button
733
- class="fs-nav-pill"
734
- onclick={() => { const prev = internalCenterMs - DAY_MS; internalCenterMs = prev; lastExternalMs = prev; viewState?.prev(); following = false; }}
735
- aria-label={L.previousDay}
736
- >
737
- <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="12" height="12" aria-hidden="true"><path d="M10 3 5 8l5 5"/></svg>
738
- </button>
739
- <button
740
- class="fs-nav-pill"
741
- onclick={() => { const next = internalCenterMs + DAY_MS; internalCenterMs = next; lastExternalMs = next; viewState?.next(); following = false; }}
742
- aria-label={L.nextDay}
743
- >
744
- <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="12" height="12" aria-hidden="true"><path d="M6 3l5 5-5 5"/></svg>
745
- </button>
746
- </nav>
747
- {/if}
748
706
  </div>
749
707
 
750
708
  <style>
@@ -766,12 +724,12 @@
766
724
  touch-action: pan-x;
767
725
  cursor: default;
768
726
  scrollbar-width: thin;
769
- scrollbar-color: var(--dt-scrollbar, rgba(0, 0, 0, 0.08)) transparent;
727
+ scrollbar-color: var(--dt-scrollbar, rgba(0, 0, 0, 0.1)) transparent;
770
728
  }
771
729
  .fs--auto .fs-scroll { height: auto; overflow: visible; }
772
730
  .fs-scroll::-webkit-scrollbar { height: 5px; }
773
731
  .fs-scroll::-webkit-scrollbar-thumb {
774
- background: var(--dt-scrollbar, rgba(0, 0, 0, 0.08));
732
+ background: var(--dt-scrollbar, rgba(0, 0, 0, 0.1));
775
733
  border-radius: 4px;
776
734
  }
777
735
  .fs-scroll::-webkit-scrollbar-track { background: transparent; }
@@ -788,11 +746,11 @@
788
746
  position: absolute;
789
747
  top: 0;
790
748
  height: 100%;
791
- border-left: 1px solid var(--dt-border-day, rgba(148, 163, 184, 0.14));
749
+ border-left: 1px solid var(--dt-border-day, rgba(0, 0, 0, 0.14));
792
750
  box-sizing: border-box;
793
751
  }
794
752
  .fs-day:first-of-type { border-left: none; }
795
- .fs-today { background: var(--dt-today-bg, rgba(239, 68, 68, 0.025)); }
753
+ .fs-today { background: var(--dt-today-bg, rgba(37, 99, 235, 0.04)); }
796
754
  .fs-past { opacity: 0.7; }
797
755
 
798
756
  /* ─── Disabled day ───────────────────────────────── */
@@ -802,8 +760,8 @@
802
760
  45deg,
803
761
  transparent,
804
762
  transparent 6px,
805
- var(--dt-border, rgba(148, 163, 184, 0.07)) 6px,
806
- var(--dt-border, rgba(148, 163, 184, 0.07)) 7px
763
+ var(--dt-border, rgba(0, 0, 0, 0.08)) 6px,
764
+ var(--dt-border, rgba(0, 0, 0, 0.08)) 7px
807
765
  ) !important;
808
766
  }
809
767
 
@@ -815,8 +773,8 @@
815
773
  z-index: 3;
816
774
  background: repeating-linear-gradient(
817
775
  -45deg,
818
- color-mix(in srgb, var(--dt-text, rgba(148, 163, 184, 0.85)) 4%, transparent),
819
- color-mix(in srgb, var(--dt-text, rgba(148, 163, 184, 0.85)) 4%, transparent) 4px,
776
+ color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 4%, transparent),
777
+ color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 4%, transparent) 4px,
820
778
  transparent 4px,
821
779
  transparent 8px
822
780
  );
@@ -830,7 +788,7 @@
830
788
 
831
789
  .fs-blocked-label {
832
790
  font: 500 9px/1 var(--dt-sans, system-ui, sans-serif);
833
- color: var(--dt-text-3, rgba(100, 116, 139, 0.55));
791
+ color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
834
792
  text-transform: uppercase;
835
793
  letter-spacing: 0.04em;
836
794
  white-space: nowrap;
@@ -860,14 +818,14 @@
860
818
  top: 18px;
861
819
  bottom: 0;
862
820
  width: 1px;
863
- background: var(--dt-border, rgba(148, 163, 184, 0.07));
821
+ background: var(--dt-border, rgba(0, 0, 0, 0.08));
864
822
  }
865
823
  .fs-tick-lb {
866
824
  position: absolute;
867
825
  top: 2px;
868
826
  left: 5px;
869
827
  font: 500 10px/1 var(--dt-mono, ui-monospace, monospace);
870
- color: var(--dt-text-3, rgba(100, 116, 139, 0.7));
828
+ color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
871
829
  white-space: nowrap;
872
830
  pointer-events: none;
873
831
  }
@@ -895,7 +853,7 @@
895
853
  left: 0;
896
854
  width: 2px;
897
855
  background: var(--dt-accent, #2563eb);
898
- box-shadow: 0 0 8px var(--dt-glow, rgba(239, 68, 68, 0.35));
856
+ box-shadow: 0 0 8px var(--dt-glow, rgba(37, 99, 235, 0.25));
899
857
  }
900
858
  .fs-now-tag {
901
859
  position: absolute;
@@ -904,7 +862,7 @@
904
862
  font: 700 11px/1 var(--dt-mono, ui-monospace, monospace);
905
863
  color: var(--dt-accent, #2563eb);
906
864
  background: color-mix(in srgb, var(--dt-bg, #ffffff) 92%, var(--dt-accent, #2563eb));
907
- border: 1px solid var(--dt-accent-dim, rgba(239, 68, 68, 0.18));
865
+ border: 1px solid var(--dt-accent-dim, rgba(37, 99, 235, 0.12));
908
866
  padding: 3px 6px;
909
867
  border-radius: 4px;
910
868
  white-space: nowrap;
@@ -916,78 +874,6 @@
916
874
  font-size: 10px;
917
875
  }
918
876
 
919
- /* ─── Floating date label ────────────────────────── */
920
- .fs-date-label {
921
- position: absolute;
922
- top: 22px;
923
- left: 50%;
924
- transform: translateX(-50%);
925
- z-index: 20;
926
- font: 600 11px/1 var(--dt-sans, system-ui, sans-serif);
927
- letter-spacing: 0.04em;
928
- text-transform: uppercase;
929
- color: var(--dt-text, rgba(226, 232, 240, 0.85));
930
- background: color-mix(in srgb, var(--dt-surface, var(--dt-bg, #ffffff)) 85%, transparent);
931
- backdrop-filter: blur(6px);
932
- -webkit-backdrop-filter: blur(6px);
933
- padding: 8px 16px;
934
- border-radius: 8px;
935
- border: 1px solid var(--dt-border, rgba(148, 163, 184, 0.07));
936
- pointer-events: none;
937
- white-space: nowrap;
938
- }
939
-
940
- /* ─── Navigation pills ────────────────────────────── */
941
- .fs-nav {
942
- position: absolute;
943
- top: 22px;
944
- right: 14px;
945
- z-index: 20;
946
- display: flex;
947
- gap: 2px;
948
- background: color-mix(in srgb, var(--dt-surface, var(--dt-bg, #ffffff)) 85%, transparent);
949
- backdrop-filter: blur(6px);
950
- -webkit-backdrop-filter: blur(6px);
951
- border-radius: 8px;
952
- padding: 2px;
953
- border: 1px solid var(--dt-border, rgba(148, 163, 184, 0.07));
954
- }
955
- .fs-nav-pill {
956
- border: none;
957
- background: transparent;
958
- color: var(--dt-text-2, rgba(148, 163, 184, 0.55));
959
- cursor: pointer;
960
- font: 600 11px / 1 var(--dt-sans, system-ui, sans-serif);
961
- padding: 6px 12px;
962
- border-radius: 6px;
963
- letter-spacing: 0.04em;
964
- text-transform: uppercase;
965
- transition: background 100ms, color 100ms;
966
- display: inline-flex;
967
- align-items: center;
968
- justify-content: center;
969
- }
970
- .fs-nav-pill:hover {
971
- color: var(--dt-text, rgba(226, 232, 240, 0.85));
972
- }
973
- .fs-nav-today {
974
- max-width: 60px;
975
- overflow: hidden;
976
- white-space: nowrap;
977
- transition: max-width 250ms ease, padding 250ms ease, opacity 200ms ease;
978
- }
979
- .fs-nav-today--hidden {
980
- max-width: 0;
981
- padding-left: 0;
982
- padding-right: 0;
983
- opacity: 0;
984
- pointer-events: none;
985
- }
986
- .fs-nav-pill:focus-visible {
987
- outline: 2px solid color-mix(in srgb, var(--dt-accent, #2563eb) 55%, transparent);
988
- outline-offset: 2px;
989
- }
990
-
991
877
  /* ─── All-day strip ─────────────────────────────── */
992
878
  .fs-allday {
993
879
  position: absolute;
@@ -1039,7 +925,7 @@
1039
925
  .fs-ad-title {
1040
926
  font-size: 0.7rem;
1041
927
  font-weight: 500;
1042
- color: var(--dt-text, #e2e8f0);
928
+ color: var(--dt-text, rgba(0, 0, 0, 0.87));
1043
929
  max-width: 120px;
1044
930
  overflow: hidden;
1045
931
  text-overflow: ellipsis;
@@ -1047,7 +933,7 @@
1047
933
 
1048
934
  .fs-ad-span {
1049
935
  font-size: 0.6rem;
1050
- color: var(--dt-text-2, rgba(148, 163, 184, 0.55));
936
+ color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
1051
937
  flex-shrink: 0;
1052
938
  }
1053
939
 
@@ -1062,7 +948,10 @@
1062
948
  display: flex;
1063
949
  align-items: center;
1064
950
  justify-content: center;
1065
- transition: box-shadow 120ms, background 120ms;
951
+ /* top/height only: lane reflow animates on drop; left/width stay instant so
952
+ mount-time width measurement and infinite-scroll rebases don't slide cards */
953
+ transition: box-shadow 120ms, background 120ms,
954
+ top 180ms cubic-bezier(0.2, 0.8, 0.2, 1), height 180ms cubic-bezier(0.2, 0.8, 0.2, 1);
1066
955
  }
1067
956
  .fs-event:hover {
1068
957
  background: color-mix(in srgb, var(--ev-color) 25%, var(--dt-surface, var(--dt-bg, #ffffff)));
@@ -1084,7 +973,15 @@
1084
973
  z-index: 50;
1085
974
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.35);
1086
975
  cursor: grabbing;
1087
- transition: none;
976
+ /* fast ease toward the snapped cursor position */
977
+ transition: left 80ms ease-out, width 80ms ease-out;
978
+ }
979
+
980
+ @media (prefers-reduced-motion: reduce) {
981
+ .fs-event,
982
+ .fs-event--dragging {
983
+ transition: box-shadow 120ms, background 120ms;
984
+ }
1088
985
  }
1089
986
  .fs-event--cancelled {
1090
987
  opacity: 0.5;
@@ -1143,7 +1040,7 @@
1143
1040
  }
1144
1041
  .fs-ev-title {
1145
1042
  font: 600 13px/1.15 var(--dt-sans, system-ui, sans-serif);
1146
- color: var(--dt-text, rgba(226, 232, 240, 0.92));
1043
+ color: var(--dt-text, rgba(0, 0, 0, 0.87));
1147
1044
  overflow: hidden;
1148
1045
  text-overflow: ellipsis;
1149
1046
  white-space: nowrap;
@@ -1152,14 +1049,14 @@
1152
1049
  }
1153
1050
  .fs-ev-time {
1154
1051
  font: 400 10px/1 var(--dt-mono, ui-monospace, monospace);
1155
- color: var(--dt-text-2, rgba(148, 163, 184, 0.72));
1052
+ color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
1156
1053
  opacity: 0.7;
1157
1054
  white-space: nowrap;
1158
1055
  flex-shrink: 0;
1159
1056
  }
1160
1057
  .fs-ev-sub {
1161
1058
  font: 400 11px/1 var(--dt-sans, system-ui, sans-serif);
1162
- color: var(--dt-text-2, rgba(148, 163, 184, 0.72));
1059
+ color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
1163
1060
  opacity: 0.6;
1164
1061
  white-space: nowrap;
1165
1062
  overflow: hidden;
@@ -1169,7 +1066,7 @@
1169
1066
  }
1170
1067
  .fs-ev-loc {
1171
1068
  font: 400 10px/1 var(--dt-sans, system-ui, sans-serif);
1172
- color: var(--dt-text-3, rgba(148, 163, 184, 0.5));
1069
+ color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
1173
1070
  white-space: nowrap;
1174
1071
  overflow: hidden;
1175
1072
  text-overflow: ellipsis;