@nomideusz/svelte-calendar 0.6.4 → 0.6.5

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.
@@ -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;
@@ -297,15 +297,14 @@
297
297
  const result: PositionedEvent[] = infos.map(({ startMs: _s, endMs: _e, ...info }) => {
298
298
  const laneH = Math.max(MIN_EVENT_H, availH / info.groupMaxRow - EVENT_GAP);
299
299
  const topPx = contentTop + info.row * (availH / info.groupMaxRow);
300
- // Vertical text: text "width" = heightPx, content "height" = width
301
300
  const fit = measure.fitContent({
302
301
  title: info.ev.title,
303
302
  subtitle: info.ev.subtitle,
304
303
  location: info.ev.location,
305
304
  time: `${fmtTime(info.ev.start, locale)} – ${fmtTime(info.ev.end, locale)}`,
306
305
  tags: info.ev.tags,
307
- maxWidth: laneH - 16, // vertical: heightPx minus padding
308
- maxHeight: info.width - 16, // vertical: width minus padding
306
+ maxWidth: info.width - 16,
307
+ maxHeight: laneH - 16,
309
308
  });
310
309
  return { ...info, topPx, heightPx: laneH, isNext: info.isNext, fit };
311
310
  });
@@ -328,8 +327,8 @@
328
327
  subtitle: draggedEv.subtitle,
329
328
  location: draggedEv.location,
330
329
  tags: draggedEv.tags,
331
- maxWidth: dragH - 16,
332
- maxHeight: dragW - 16,
330
+ maxWidth: dragW - 16,
331
+ maxHeight: dragH - 16,
333
332
  }),
334
333
  });
335
334
  }
@@ -894,7 +893,7 @@
894
893
  bottom: 0;
895
894
  left: 0;
896
895
  width: 2px;
897
- background: var(--dt-accent, #ef4444);
896
+ background: var(--dt-accent, #2563eb);
898
897
  box-shadow: 0 0 8px var(--dt-glow, rgba(239, 68, 68, 0.35));
899
898
  }
900
899
  .fs-now-tag {
@@ -902,8 +901,8 @@
902
901
  top: 8px;
903
902
  left: 8px;
904
903
  font: 700 11px/1 var(--dt-mono, ui-monospace, monospace);
905
- color: var(--dt-accent, #ef4444);
906
- background: color-mix(in srgb, var(--dt-bg, #0b0e14) 92%, var(--dt-accent, #ef4444));
904
+ color: var(--dt-accent, #2563eb);
905
+ background: color-mix(in srgb, var(--dt-bg, #ffffff) 92%, var(--dt-accent, #2563eb));
907
906
  border: 1px solid var(--dt-accent-dim, rgba(239, 68, 68, 0.18));
908
907
  padding: 3px 6px;
909
908
  border-radius: 4px;
@@ -927,7 +926,7 @@
927
926
  letter-spacing: 0.04em;
928
927
  text-transform: uppercase;
929
928
  color: var(--dt-text, rgba(226, 232, 240, 0.85));
930
- background: color-mix(in srgb, var(--dt-surface, #10141c) 85%, transparent);
929
+ background: color-mix(in srgb, var(--dt-surface, var(--dt-bg, #ffffff)) 85%, transparent);
931
930
  backdrop-filter: blur(6px);
932
931
  -webkit-backdrop-filter: blur(6px);
933
932
  padding: 8px 16px;
@@ -945,7 +944,7 @@
945
944
  z-index: 20;
946
945
  display: flex;
947
946
  gap: 2px;
948
- background: color-mix(in srgb, var(--dt-surface, #10141c) 85%, transparent);
947
+ background: color-mix(in srgb, var(--dt-surface, var(--dt-bg, #ffffff)) 85%, transparent);
949
948
  backdrop-filter: blur(6px);
950
949
  -webkit-backdrop-filter: blur(6px);
951
950
  border-radius: 8px;
@@ -957,7 +956,7 @@
957
956
  background: transparent;
958
957
  color: var(--dt-text-2, rgba(148, 163, 184, 0.55));
959
958
  cursor: pointer;
960
- font: 600 11px / 1 var(--dt-sans, 'Outfit', system-ui, sans-serif);
959
+ font: 600 11px / 1 var(--dt-sans, system-ui, sans-serif);
961
960
  padding: 6px 12px;
962
961
  border-radius: 6px;
963
962
  letter-spacing: 0.04em;
@@ -984,7 +983,7 @@
984
983
  pointer-events: none;
985
984
  }
986
985
  .fs-nav-pill:focus-visible {
987
- outline: 2px solid color-mix(in srgb, var(--dt-accent, #ef4444) 55%, transparent);
986
+ outline: 2px solid color-mix(in srgb, var(--dt-accent, #2563eb) 55%, transparent);
988
987
  outline-offset: 2px;
989
988
  }
990
989
 
@@ -1009,7 +1008,7 @@
1009
1008
  gap: 4px;
1010
1009
  padding: 2px 8px;
1011
1010
  border-radius: 4px;
1012
- background: color-mix(in srgb, var(--ev-color) 18%, var(--dt-surface, #10141c));
1011
+ background: color-mix(in srgb, var(--ev-color) 18%, var(--dt-surface, var(--dt-bg, #ffffff)));
1013
1012
  border-left: 3px solid var(--ev-color);
1014
1013
  white-space: nowrap;
1015
1014
  flex-shrink: 0;
@@ -1017,14 +1016,14 @@
1017
1016
  transition: background 0.15s;
1018
1017
  }
1019
1018
  .fs-ad:hover {
1020
- background: color-mix(in srgb, var(--ev-color) 28%, var(--dt-surface, #10141c));
1019
+ background: color-mix(in srgb, var(--ev-color) 28%, var(--dt-surface, var(--dt-bg, #ffffff)));
1021
1020
  }
1022
1021
  .fs-ad:focus-visible {
1023
- outline: 2px solid color-mix(in srgb, var(--dt-accent, #ef4444) 55%, transparent);
1022
+ outline: 2px solid color-mix(in srgb, var(--dt-accent, #2563eb) 55%, transparent);
1024
1023
  outline-offset: 2px;
1025
1024
  }
1026
1025
  .fs-ad--selected {
1027
- background: color-mix(in srgb, var(--ev-color) 30%, var(--dt-surface, #10141c));
1026
+ background: color-mix(in srgb, var(--ev-color) 30%, var(--dt-surface, var(--dt-bg, #ffffff)));
1028
1027
  border-left-width: 4px;
1029
1028
  }
1030
1029
 
@@ -1057,7 +1056,7 @@
1057
1056
  z-index: 6;
1058
1057
  border-radius: 6px;
1059
1058
  cursor: pointer;
1060
- background: color-mix(in srgb, var(--ev-color) 15%, var(--dt-surface, #10141c));
1059
+ background: color-mix(in srgb, var(--ev-color) 15%, var(--dt-surface, var(--dt-bg, #ffffff)));
1061
1060
  overflow: hidden;
1062
1061
  display: flex;
1063
1062
  align-items: center;
@@ -1065,18 +1064,18 @@
1065
1064
  transition: box-shadow 120ms, background 120ms;
1066
1065
  }
1067
1066
  .fs-event:hover {
1068
- background: color-mix(in srgb, var(--ev-color) 25%, var(--dt-surface, #10141c));
1067
+ background: color-mix(in srgb, var(--ev-color) 25%, var(--dt-surface, var(--dt-bg, #ffffff)));
1069
1068
  box-shadow: 0 2px 12px color-mix(in srgb, var(--ev-color) 25%, transparent);
1070
1069
  }
1071
1070
  .fs-event--selected {
1072
1071
  box-shadow: 0 0 0 2px var(--ev-color), 0 2px 14px color-mix(in srgb, var(--ev-color) 35%, transparent);
1073
1072
  }
1074
1073
  .fs-event--current {
1075
- background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, #10141c));
1074
+ background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, var(--dt-bg, #ffffff)));
1076
1075
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ev-color) 20%, transparent);
1077
1076
  }
1078
1077
  .fs-event--next {
1079
- background: color-mix(in srgb, var(--ev-color) 12%, var(--dt-surface, #10141c));
1078
+ background: color-mix(in srgb, var(--ev-color) 12%, var(--dt-surface, var(--dt-bg, #ffffff)));
1080
1079
  border: 1px dashed color-mix(in srgb, var(--ev-color) 35%, transparent);
1081
1080
  }
1082
1081
  .fs-event--dragging {
@@ -1107,16 +1106,18 @@
1107
1106
  cursor: default;
1108
1107
  }
1109
1108
 
1110
- /* Event inner (vertical text, bottom-to-top reading) */
1109
+ /* Event inner */
1111
1110
  .fs-ev-inner {
1112
- writing-mode: vertical-rl;
1113
- transform: rotate(180deg);
1114
1111
  display: flex;
1115
- align-items: center;
1116
- gap: 6px;
1117
- max-height: 100%;
1112
+ flex-direction: column;
1113
+ align-items: flex-start;
1114
+ justify-content: center;
1115
+ gap: 3px;
1116
+ width: 100%;
1117
+ height: 100%;
1118
1118
  overflow: hidden;
1119
- padding: 8px 4px;
1119
+ box-sizing: border-box;
1120
+ padding: 6px 8px;
1120
1121
  }
1121
1122
  .fs-ev-live {
1122
1123
  flex-shrink: 0;
@@ -1164,7 +1165,7 @@
1164
1165
  overflow: hidden;
1165
1166
  text-overflow: ellipsis;
1166
1167
  }
1167
- .fs-ev-tags { display: flex; gap: 4px; }
1168
+ .fs-ev-tags { display: flex; gap: 4px; flex-wrap: wrap; }
1168
1169
  .fs-ev-tag {
1169
1170
  font: 500 8px/1 var(--dt-sans, system-ui, sans-serif);
1170
1171
  color: var(--ev-color, var(--dt-accent));
@@ -1176,7 +1177,7 @@
1176
1177
 
1177
1178
  /* ─── Focus-visible ──────────────────────────────── */
1178
1179
  .fs-event:focus-visible {
1179
- outline: 2px solid var(--dt-accent, #ef4444);
1180
+ outline: 2px solid var(--dt-accent, #2563eb);
1180
1181
  outline-offset: 2px;
1181
1182
  }
1182
1183
  </style>