@nomideusz/svelte-calendar 0.9.0 → 0.10.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.
- package/README.md +15 -7
- package/dist/calendar/Calendar.svelte +167 -59
- package/dist/calendar/Calendar.svelte.d.ts +7 -0
- package/dist/core/locale.d.ts +15 -1
- package/dist/core/locale.js +9 -2
- package/dist/theme/auto.js +27 -6
- package/dist/theme/presets.d.ts +4 -4
- package/dist/theme/presets.js +11 -7
- package/dist/views/agenda/AgendaDay.svelte +259 -110
- package/dist/views/agenda/AgendaWeek.svelte +190 -65
- package/dist/views/mobile/MobileDay.svelte +408 -213
- package/dist/views/mobile/MobileWeek.svelte +136 -74
- package/dist/views/mobile/swipe.d.ts +28 -0
- package/dist/views/mobile/swipe.js +64 -0
- package/dist/views/month/MonthGrid.svelte +166 -30
- package/dist/views/planner/PlannerDay.svelte +155 -80
- package/dist/views/planner/PlannerWeek.svelte +1155 -630
- package/dist/views/planner/PlannerWeek.svelte.d.ts +2 -0
- package/dist/views/shared/context.svelte.d.ts +3 -0
- package/dist/views/shared/context.svelte.js +13 -9
- package/dist/views/shared/format.d.ts +2 -1
- package/dist/views/shared/format.js +8 -5
- package/dist/widget/CalendarWidget.svelte +33 -5
- package/dist/widget/CalendarWidget.svelte.d.ts +16 -2
- package/dist/widget/widget.d.ts +9 -0
- package/dist/widget/widget.js +59 -13
- package/package.json +1 -1
- package/widget/widget.js +3263 -2727
- package/widget/svelte-calendar.css +0 -3054
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
<script lang="ts">import { createClock } from "../../core/clock.svelte.js";
|
|
2
|
-
import { sod, DAY_MS, startOfWeek, dayNum, isAllDay, isMultiDay } from "../../core/time.js";
|
|
3
|
-
import { weekdayLong, monthLong
|
|
2
|
+
import { sod, DAY_MS, startOfWeek, dayNum, isAllDay, isMultiDay, segmentForDay } from "../../core/time.js";
|
|
3
|
+
import { weekdayLong, monthLong } from "../../core/locale.js";
|
|
4
4
|
import { useCalendarContext } from "../shared/context.svelte.js";
|
|
5
5
|
import EventContent from "../shared/EventContent.svelte";
|
|
6
6
|
import { fmtTime, duration, timeUntilMs, progress, groupIntoSlots } from "../shared/format.js";
|
|
7
|
-
const L = $derived(getLabels());
|
|
8
7
|
const ctx = useCalendarContext();
|
|
8
|
+
const L = $derived(ctx.labels);
|
|
9
9
|
let {
|
|
10
10
|
mondayStart = true,
|
|
11
11
|
locale,
|
|
12
|
-
height
|
|
12
|
+
height,
|
|
13
13
|
events = [],
|
|
14
14
|
style = "",
|
|
15
15
|
focusDate,
|
|
@@ -29,14 +29,17 @@ const oneventhover = $derived(ctx.oneventhover);
|
|
|
29
29
|
const disabledSet = $derived(ctx.disabledSet);
|
|
30
30
|
let swipeStartX = 0;
|
|
31
31
|
let swipeStartY = 0;
|
|
32
|
+
let swipeActive = false;
|
|
32
33
|
const SWIPE_THRESHOLD = 50;
|
|
33
34
|
function onPointerDown(e) {
|
|
34
|
-
if (!isMobile) return;
|
|
35
|
+
if (!isMobile || e.pointerType !== "touch") return;
|
|
36
|
+
swipeActive = true;
|
|
35
37
|
swipeStartX = e.clientX;
|
|
36
38
|
swipeStartY = e.clientY;
|
|
37
39
|
}
|
|
38
40
|
function onPointerUp(e) {
|
|
39
|
-
if (!
|
|
41
|
+
if (!swipeActive || e.pointerType !== "touch") return;
|
|
42
|
+
swipeActive = false;
|
|
40
43
|
const dx = e.clientX - swipeStartX;
|
|
41
44
|
const dy = e.clientY - swipeStartY;
|
|
42
45
|
if (Math.abs(dx) > SWIPE_THRESHOLD && Math.abs(dx) > Math.abs(dy) * 1.4) {
|
|
@@ -44,18 +47,19 @@ function onPointerUp(e) {
|
|
|
44
47
|
else viewState?.next();
|
|
45
48
|
}
|
|
46
49
|
}
|
|
50
|
+
function onPointerCancel() {
|
|
51
|
+
swipeActive = false;
|
|
52
|
+
}
|
|
53
|
+
let expandedDays = $state([]);
|
|
54
|
+
function toggleDayExpand(ms) {
|
|
55
|
+
expandedDays = expandedDays.includes(ms) ? expandedDays.filter((m) => m !== ms) : [...expandedDays, ms];
|
|
56
|
+
}
|
|
47
57
|
const fmt = (d) => fmtTime(d, locale);
|
|
48
|
-
const eta = (ms) => timeUntilMs(ms, clock.tick);
|
|
58
|
+
const eta = (ms) => timeUntilMs(ms, clock.tick, L);
|
|
49
59
|
const prog = (ev) => progress(ev, clock.tick);
|
|
50
60
|
function handleClick(ev) {
|
|
51
61
|
oneventclick?.(ev);
|
|
52
62
|
}
|
|
53
|
-
function handleKeydown(e, ev) {
|
|
54
|
-
if (e.key === "Enter" || e.key === " ") {
|
|
55
|
-
e.preventDefault();
|
|
56
|
-
oneventclick?.(ev);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
63
|
const weekStartMs = $derived(
|
|
60
64
|
focusDate ? viewState?.dayCount === 7 ? startOfWeek(sod(focusDate.getTime()), mondayStart) : sod(focusDate.getTime()) : viewState?.dayCount === 7 ? startOfWeek(clock.today, mondayStart) : clock.today
|
|
61
65
|
);
|
|
@@ -101,6 +105,7 @@ const weekDays = $derived.by(() => {
|
|
|
101
105
|
dayName: weekdayLong(ms, locale),
|
|
102
106
|
dateLabel: `${monthLong(ms, locale)} ${dayNum(ms)}`,
|
|
103
107
|
tier,
|
|
108
|
+
isToday: ms === todayMs,
|
|
104
109
|
events: dayEvts,
|
|
105
110
|
allDayEvents: allDayEvts,
|
|
106
111
|
timedEvents: timedEvts,
|
|
@@ -123,7 +128,8 @@ const weekDays = $derived.by(() => {
|
|
|
123
128
|
|
|
124
129
|
<!-- ═══ Shared event card snippet ═══ -->
|
|
125
130
|
{#snippet eventCard(ev: TimelineEvent, isNow: boolean, eta?: string)}
|
|
126
|
-
<
|
|
131
|
+
<button
|
|
132
|
+
type="button"
|
|
127
133
|
class="ag-card"
|
|
128
134
|
class:ag-card--selected={selectedEventId === ev.id}
|
|
129
135
|
class:ag-card--cancelled={ev.status === 'cancelled'}
|
|
@@ -131,12 +137,9 @@ const weekDays = $derived.by(() => {
|
|
|
131
137
|
class:ag-card--full={ev.status === 'full'}
|
|
132
138
|
class:ag-card--limited={ev.status === 'limited'}
|
|
133
139
|
style:--ev-color={ev.color || 'var(--dt-accent)'}
|
|
134
|
-
role="button"
|
|
135
|
-
tabindex="0"
|
|
136
140
|
aria-label="{ev.title}{ev.status === 'cancelled' ? ' (cancelled)' : ''}{ev.status === 'tentative' ? ' (tentative)' : ''}{ev.status === 'full' ? ' (full)' : ''}{ev.status === 'limited' ? ' (limited)' : ''}, {fmt(ev.start)} to {fmt(ev.end)}, {duration(ev)}"
|
|
137
141
|
onclick={() => handleClick(ev)}
|
|
138
142
|
onpointerenter={() => oneventhover?.(ev)}
|
|
139
|
-
onkeydown={(e) => handleKeydown(e, ev)}
|
|
140
143
|
>
|
|
141
144
|
<div class="ag-card-body">
|
|
142
145
|
<EventContent event={ev}>
|
|
@@ -168,11 +171,11 @@ const weekDays = $derived.by(() => {
|
|
|
168
171
|
</EventContent>
|
|
169
172
|
{#if isNow}
|
|
170
173
|
<div class="ag-card-progress">
|
|
171
|
-
<div class="ag-card-progress-fill" style:
|
|
174
|
+
<div class="ag-card-progress-fill" style:transform="scaleX({prog(ev)})"></div>
|
|
172
175
|
</div>
|
|
173
176
|
{/if}
|
|
174
177
|
</div>
|
|
175
|
-
</
|
|
178
|
+
</button>
|
|
176
179
|
{/snippet}
|
|
177
180
|
|
|
178
181
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
@@ -181,8 +184,10 @@ const weekDays = $derived.by(() => {
|
|
|
181
184
|
class:ag--mobile={isMobile}
|
|
182
185
|
class:ag--auto={autoHeight}
|
|
183
186
|
style={style || undefined}
|
|
187
|
+
style:height={height ? `${height}px` : undefined}
|
|
184
188
|
onpointerdown={onPointerDown}
|
|
185
189
|
onpointerup={onPointerUp}
|
|
190
|
+
onpointercancel={onPointerCancel}
|
|
186
191
|
>
|
|
187
192
|
<div class="ag-body" role="list" aria-label={L.weekAhead}>
|
|
188
193
|
{#each weekDays as day (day.ms)}
|
|
@@ -201,6 +206,11 @@ const weekDays = $derived.by(() => {
|
|
|
201
206
|
</div>
|
|
202
207
|
{/if}
|
|
203
208
|
</div>
|
|
209
|
+
{#if day.timedEvents.length > 0}
|
|
210
|
+
<div class="ag-wday-past-line ag-wday-past-line--summary">✓ {L.nCompleted(day.timedEvents.length)}</div>
|
|
211
|
+
{:else if day.events.length === 0}
|
|
212
|
+
<div class="ag-wday-past-line ag-wday-past-line--summary">{L.noEvents}</div>
|
|
213
|
+
{/if}
|
|
204
214
|
</div>
|
|
205
215
|
{:else}
|
|
206
216
|
<div
|
|
@@ -214,7 +224,7 @@ const weekDays = $derived.by(() => {
|
|
|
214
224
|
<!-- Day header -->
|
|
215
225
|
<div class="ag-wday-head">
|
|
216
226
|
<div class="ag-wday-head-left">
|
|
217
|
-
{#if day.
|
|
227
|
+
{#if day.isToday}
|
|
218
228
|
<span class="ag-wday-badge">{L.today}</span>
|
|
219
229
|
{:else if day.tier === 'tomorrow'}
|
|
220
230
|
<span class="ag-wday-badge ag-wday-badge--muted">{L.tomorrow}</span>
|
|
@@ -232,20 +242,23 @@ const weekDays = $derived.by(() => {
|
|
|
232
242
|
{#if day.allDayEvents.length > 0}
|
|
233
243
|
<div class="ag-allday">
|
|
234
244
|
{#each day.allDayEvents as ev (ev.id)}
|
|
235
|
-
|
|
245
|
+
{@const seg = segmentForDay(ev, day.ms)}
|
|
246
|
+
{@const isCont = seg !== null && seg.totalDays > 1}
|
|
247
|
+
<button
|
|
248
|
+
type="button"
|
|
236
249
|
class="ag-allday-chip"
|
|
237
250
|
class:ag-allday-chip--selected={selectedEventId === ev.id}
|
|
238
251
|
style:--ev-color={ev.color || 'var(--dt-accent)'}
|
|
239
|
-
|
|
240
|
-
tabindex="0"
|
|
241
|
-
aria-label="{ev.title}, {L.allDay}"
|
|
252
|
+
aria-label="{ev.title}, {isCont && seg ? L.dayNOfTotal(seg.dayIndex, seg.totalDays) : L.allDay}"
|
|
242
253
|
onclick={() => handleClick(ev)}
|
|
243
254
|
onpointerenter={() => oneventhover?.(ev)}
|
|
244
|
-
onkeydown={(e) => handleKeydown(e, ev)}
|
|
245
255
|
>
|
|
246
256
|
<span class="ag-allday-dot"></span>
|
|
247
257
|
<span class="ag-allday-title">{ev.title}</span>
|
|
248
|
-
|
|
258
|
+
{#if isCont && seg}
|
|
259
|
+
<span class="ag-allday-span">{seg.dayIndex}/{seg.totalDays}</span>
|
|
260
|
+
{/if}
|
|
261
|
+
</button>
|
|
249
262
|
{/each}
|
|
250
263
|
</div>
|
|
251
264
|
{/if}
|
|
@@ -256,7 +269,8 @@ const weekDays = $derived.by(() => {
|
|
|
256
269
|
<!-- Compact: minimal dot + time + title rows for all days -->
|
|
257
270
|
<div class="ag-wday-compact">
|
|
258
271
|
{#each day.timedEvents as ev (ev.id)}
|
|
259
|
-
<
|
|
272
|
+
<button
|
|
273
|
+
type="button"
|
|
260
274
|
class="ag-compact"
|
|
261
275
|
class:ag-compact--selected={selectedEventId === ev.id}
|
|
262
276
|
class:ag-compact--cancelled={ev.status === 'cancelled'}
|
|
@@ -264,12 +278,9 @@ const weekDays = $derived.by(() => {
|
|
|
264
278
|
class:ag-compact--full={ev.status === 'full'}
|
|
265
279
|
class:ag-compact--limited={ev.status === 'limited'}
|
|
266
280
|
style:--ev-color={ev.color || 'var(--dt-accent)'}
|
|
267
|
-
role="button"
|
|
268
|
-
tabindex="0"
|
|
269
281
|
aria-label="{ev.title}, {fmt(ev.start)}, {duration(ev)}"
|
|
270
282
|
onclick={() => handleClick(ev)}
|
|
271
283
|
onpointerenter={() => oneventhover?.(ev)}
|
|
272
|
-
onkeydown={(e) => handleKeydown(e, ev)}
|
|
273
284
|
>
|
|
274
285
|
<EventContent event={ev}>
|
|
275
286
|
<span class="ag-compact-dot"></span>
|
|
@@ -285,7 +296,7 @@ const weekDays = $derived.by(() => {
|
|
|
285
296
|
{/if}
|
|
286
297
|
<span class="ag-compact-dur">{duration(ev)}</span>
|
|
287
298
|
</EventContent>
|
|
288
|
-
</
|
|
299
|
+
</button>
|
|
289
300
|
{/each}
|
|
290
301
|
</div>
|
|
291
302
|
{:else if equalDays}
|
|
@@ -331,9 +342,11 @@ const weekDays = $derived.by(() => {
|
|
|
331
342
|
</div>
|
|
332
343
|
{:else}
|
|
333
344
|
<!-- Compact: future days get minimal rows -->
|
|
345
|
+
{@const dayExpanded = expandedDays.includes(day.ms)}
|
|
334
346
|
<div class="ag-wday-compact">
|
|
335
|
-
{#each day.timedEvents.slice(0, 4) as ev (ev.id)}
|
|
336
|
-
<
|
|
347
|
+
{#each (dayExpanded ? day.timedEvents : day.timedEvents.slice(0, 4)) as ev (ev.id)}
|
|
348
|
+
<button
|
|
349
|
+
type="button"
|
|
337
350
|
class="ag-compact"
|
|
338
351
|
class:ag-compact--selected={selectedEventId === ev.id}
|
|
339
352
|
class:ag-compact--cancelled={ev.status === 'cancelled'}
|
|
@@ -341,10 +354,9 @@ const weekDays = $derived.by(() => {
|
|
|
341
354
|
class:ag-compact--full={ev.status === 'full'}
|
|
342
355
|
class:ag-compact--limited={ev.status === 'limited'}
|
|
343
356
|
style:--ev-color={ev.color || 'var(--dt-accent)'}
|
|
344
|
-
role="button"
|
|
345
|
-
tabindex="0"
|
|
346
357
|
aria-label="{ev.title}, {fmt(ev.start)}, {duration(ev)}"
|
|
347
|
-
onclick={() => handleClick(ev)}
|
|
358
|
+
onclick={() => handleClick(ev)}
|
|
359
|
+
onpointerenter={() => oneventhover?.(ev)}
|
|
348
360
|
>
|
|
349
361
|
<EventContent event={ev}>
|
|
350
362
|
<span class="ag-compact-dot"></span>
|
|
@@ -363,10 +375,17 @@ const weekDays = $derived.by(() => {
|
|
|
363
375
|
{/if}
|
|
364
376
|
<span class="ag-compact-dur">{duration(ev)}</span>
|
|
365
377
|
</EventContent>
|
|
366
|
-
</
|
|
378
|
+
</button>
|
|
367
379
|
{/each}
|
|
368
380
|
{#if day.timedEvents.length > 4}
|
|
369
|
-
<
|
|
381
|
+
<button
|
|
382
|
+
type="button"
|
|
383
|
+
class="ag-compact-more"
|
|
384
|
+
aria-expanded={dayExpanded}
|
|
385
|
+
onclick={() => toggleDayExpand(day.ms)}
|
|
386
|
+
>
|
|
387
|
+
{dayExpanded ? L.showLess : L.nMore(day.timedEvents.length - 4)}
|
|
388
|
+
</button>
|
|
370
389
|
{/if}
|
|
371
390
|
</div>
|
|
372
391
|
{/if}
|
|
@@ -397,6 +416,22 @@ const weekDays = $derived.by(() => {
|
|
|
397
416
|
overflow: visible;
|
|
398
417
|
}
|
|
399
418
|
|
|
419
|
+
/* Button UA reset for interactive cards/rows (real <button>s for a11y).
|
|
420
|
+
Placed first so later component rules override it. */
|
|
421
|
+
.ag-card,
|
|
422
|
+
.ag-allday-chip,
|
|
423
|
+
.ag-compact,
|
|
424
|
+
.ag-compact-more {
|
|
425
|
+
font: inherit;
|
|
426
|
+
color: inherit;
|
|
427
|
+
text-align: left;
|
|
428
|
+
background: none;
|
|
429
|
+
border: none;
|
|
430
|
+
padding: 0;
|
|
431
|
+
margin: 0;
|
|
432
|
+
box-sizing: border-box;
|
|
433
|
+
}
|
|
434
|
+
|
|
400
435
|
/* ═══ Body ═══ */
|
|
401
436
|
.ag-body {
|
|
402
437
|
flex: 1;
|
|
@@ -437,13 +472,14 @@ const weekDays = $derived.by(() => {
|
|
|
437
472
|
cursor: pointer;
|
|
438
473
|
transition: background 0.15s, border-color 0.15s;
|
|
439
474
|
}
|
|
440
|
-
.ag-allday-chip:hover
|
|
475
|
+
.ag-allday-chip:hover,
|
|
476
|
+
.ag-allday-chip:active {
|
|
441
477
|
background: color-mix(in srgb, var(--ev-color) 22%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
442
478
|
border-color: color-mix(in srgb, var(--ev-color) 30%, transparent);
|
|
443
479
|
}
|
|
444
480
|
.ag-allday-chip:focus-visible {
|
|
445
|
-
outline:
|
|
446
|
-
|
|
481
|
+
outline: none;
|
|
482
|
+
box-shadow: 0 0 0 2px var(--dt-accent, #2563eb);
|
|
447
483
|
}
|
|
448
484
|
.ag-allday-chip--selected {
|
|
449
485
|
border-color: var(--ev-color);
|
|
@@ -461,6 +497,11 @@ const weekDays = $derived.by(() => {
|
|
|
461
497
|
color: var(--dt-text, rgba(0, 0, 0, 0.87));
|
|
462
498
|
white-space: nowrap;
|
|
463
499
|
}
|
|
500
|
+
.ag-allday-span {
|
|
501
|
+
font: 500 10px/1.2 var(--dt-mono, monospace);
|
|
502
|
+
color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
|
|
503
|
+
white-space: nowrap;
|
|
504
|
+
}
|
|
464
505
|
|
|
465
506
|
/* ═══ Shared: event card ═══ */
|
|
466
507
|
.ag-card {
|
|
@@ -473,13 +514,14 @@ const weekDays = $derived.by(() => {
|
|
|
473
514
|
cursor: pointer;
|
|
474
515
|
transition: background 150ms, border-color 150ms;
|
|
475
516
|
}
|
|
476
|
-
.ag-card:hover
|
|
517
|
+
.ag-card:hover,
|
|
518
|
+
.ag-card:active {
|
|
477
519
|
background: color-mix(in srgb, var(--ev-color) 20%, var(--dt-surface, var(--dt-bg, #ffffff)));
|
|
478
520
|
border-color: color-mix(in srgb, var(--ev-color) 30%, transparent);
|
|
479
521
|
}
|
|
480
522
|
.ag-card:focus-visible {
|
|
481
|
-
outline:
|
|
482
|
-
|
|
523
|
+
outline: none;
|
|
524
|
+
box-shadow: 0 0 0 2px var(--dt-accent, #2563eb);
|
|
483
525
|
}
|
|
484
526
|
.ag-card--selected {
|
|
485
527
|
border-color: var(--ev-color);
|
|
@@ -517,6 +559,11 @@ const weekDays = $derived.by(() => {
|
|
|
517
559
|
word-break: break-word;
|
|
518
560
|
flex: 1;
|
|
519
561
|
min-width: 0;
|
|
562
|
+
display: -webkit-box;
|
|
563
|
+
-webkit-box-orient: vertical;
|
|
564
|
+
-webkit-line-clamp: 2;
|
|
565
|
+
line-clamp: 2;
|
|
566
|
+
overflow: hidden;
|
|
520
567
|
}
|
|
521
568
|
.ag-card-meta {
|
|
522
569
|
display: flex;
|
|
@@ -532,10 +579,9 @@ const weekDays = $derived.by(() => {
|
|
|
532
579
|
}
|
|
533
580
|
.ag-card-eta {
|
|
534
581
|
margin-left: auto;
|
|
535
|
-
font-size:
|
|
582
|
+
font-size: 11px;
|
|
536
583
|
font-weight: 600;
|
|
537
|
-
color: color-mix(in srgb, var(--
|
|
538
|
-
opacity: 0.85;
|
|
584
|
+
color: color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 60%, var(--ev-color));
|
|
539
585
|
letter-spacing: 0.02em;
|
|
540
586
|
}
|
|
541
587
|
.ag-card-sub {
|
|
@@ -554,7 +600,7 @@ const weekDays = $derived.by(() => {
|
|
|
554
600
|
flex-wrap: wrap;
|
|
555
601
|
}
|
|
556
602
|
.ag-card-tag {
|
|
557
|
-
font: 500
|
|
603
|
+
font: 500 10px / 1 var(--dt-sans, system-ui, sans-serif);
|
|
558
604
|
color: var(--ev-color, var(--dt-accent));
|
|
559
605
|
background: color-mix(in srgb, var(--ev-color, var(--dt-accent)) 15%, transparent);
|
|
560
606
|
padding: 2px 5px;
|
|
@@ -570,9 +616,16 @@ const weekDays = $derived.by(() => {
|
|
|
570
616
|
}
|
|
571
617
|
.ag-card-progress-fill {
|
|
572
618
|
height: 100%;
|
|
619
|
+
width: 100%;
|
|
573
620
|
background: var(--ev-color, var(--dt-accent));
|
|
574
621
|
border-radius: 2px;
|
|
575
|
-
|
|
622
|
+
transform-origin: left;
|
|
623
|
+
transition: transform 1s linear;
|
|
624
|
+
}
|
|
625
|
+
@media (prefers-reduced-motion: reduce) {
|
|
626
|
+
.ag-card-progress-fill {
|
|
627
|
+
transition: none;
|
|
628
|
+
}
|
|
576
629
|
}
|
|
577
630
|
|
|
578
631
|
/* ═══ Week day groups ═══ */
|
|
@@ -588,11 +641,13 @@ const weekDays = $derived.by(() => {
|
|
|
588
641
|
.ag-wday--tomorrow .ag-card {
|
|
589
642
|
opacity: 0.82;
|
|
590
643
|
}
|
|
591
|
-
|
|
592
|
-
|
|
644
|
+
/* Past days: token-based text dim instead of subtree opacity (readability) */
|
|
645
|
+
.ag-wday--past .ag-wday-name {
|
|
646
|
+
color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
|
|
647
|
+
font-weight: 500;
|
|
593
648
|
}
|
|
594
649
|
.ag-wday--past .ag-wday-head {
|
|
595
|
-
padding: 8px 20px;
|
|
650
|
+
padding: 8px 20px 2px;
|
|
596
651
|
}
|
|
597
652
|
.ag-wday--disabled {
|
|
598
653
|
position: relative;
|
|
@@ -605,8 +660,8 @@ const weekDays = $derived.by(() => {
|
|
|
605
660
|
135deg,
|
|
606
661
|
transparent,
|
|
607
662
|
transparent 4px,
|
|
608
|
-
rgba(
|
|
609
|
-
rgba(
|
|
663
|
+
color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 8%, transparent) 4px,
|
|
664
|
+
color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 8%, transparent) 8px
|
|
610
665
|
);
|
|
611
666
|
pointer-events: none;
|
|
612
667
|
}
|
|
@@ -619,6 +674,10 @@ const weekDays = $derived.by(() => {
|
|
|
619
674
|
justify-content: space-between;
|
|
620
675
|
align-items: center;
|
|
621
676
|
padding: 8px 20px;
|
|
677
|
+
position: sticky;
|
|
678
|
+
top: 0;
|
|
679
|
+
background: var(--dt-bg, #fff);
|
|
680
|
+
z-index: 1;
|
|
622
681
|
}
|
|
623
682
|
.ag-wday-head-left {
|
|
624
683
|
display: flex;
|
|
@@ -676,7 +735,7 @@ const weekDays = $derived.by(() => {
|
|
|
676
735
|
padding: 2px 0;
|
|
677
736
|
}
|
|
678
737
|
.ag-wslot-now {
|
|
679
|
-
font-size:
|
|
738
|
+
font-size: 10px;
|
|
680
739
|
font-weight: 700;
|
|
681
740
|
letter-spacing: 0.08em;
|
|
682
741
|
text-transform: uppercase;
|
|
@@ -693,10 +752,12 @@ const weekDays = $derived.by(() => {
|
|
|
693
752
|
gap: 4px;
|
|
694
753
|
}
|
|
695
754
|
.ag-wday-past-line {
|
|
696
|
-
font-size:
|
|
755
|
+
font-size: 11px;
|
|
697
756
|
color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
|
|
698
757
|
padding: 6px 0 0;
|
|
699
|
-
|
|
758
|
+
}
|
|
759
|
+
.ag-wday-past-line--summary {
|
|
760
|
+
padding: 0 20px 8px;
|
|
700
761
|
}
|
|
701
762
|
|
|
702
763
|
/* Compact day events */
|
|
@@ -710,6 +771,7 @@ const weekDays = $derived.by(() => {
|
|
|
710
771
|
padding: 3px 0;
|
|
711
772
|
cursor: pointer;
|
|
712
773
|
min-width: 0;
|
|
774
|
+
width: 100%;
|
|
713
775
|
}
|
|
714
776
|
.ag-compact--selected {
|
|
715
777
|
background: color-mix(in srgb, var(--ev-color) 10%, transparent);
|
|
@@ -717,12 +779,18 @@ const weekDays = $derived.by(() => {
|
|
|
717
779
|
padding-left: 6px;
|
|
718
780
|
padding-right: 6px;
|
|
719
781
|
}
|
|
720
|
-
.ag-compact:hover .ag-compact-title
|
|
782
|
+
.ag-compact:hover .ag-compact-title,
|
|
783
|
+
.ag-compact:active .ag-compact-title {
|
|
721
784
|
color: var(--dt-text);
|
|
722
785
|
}
|
|
786
|
+
.ag-compact:active {
|
|
787
|
+
background: color-mix(in srgb, var(--ev-color) 8%, transparent);
|
|
788
|
+
border-radius: 4px;
|
|
789
|
+
}
|
|
723
790
|
.ag-compact:focus-visible {
|
|
724
|
-
outline:
|
|
725
|
-
|
|
791
|
+
outline: none;
|
|
792
|
+
box-shadow: 0 0 0 2px var(--dt-accent, #2563eb);
|
|
793
|
+
border-radius: 4px;
|
|
726
794
|
}
|
|
727
795
|
.ag-compact-dot {
|
|
728
796
|
width: 5px;
|
|
@@ -772,7 +840,7 @@ const weekDays = $derived.by(() => {
|
|
|
772
840
|
line-height: 1.4;
|
|
773
841
|
}
|
|
774
842
|
.ag-compact-loc {
|
|
775
|
-
font-size:
|
|
843
|
+
font-size: 10px;
|
|
776
844
|
color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
|
|
777
845
|
flex-shrink: 0;
|
|
778
846
|
white-space: nowrap;
|
|
@@ -796,7 +864,7 @@ const weekDays = $derived.by(() => {
|
|
|
796
864
|
opacity: 0.65;
|
|
797
865
|
}
|
|
798
866
|
.ag-compact-tag {
|
|
799
|
-
font: 500
|
|
867
|
+
font: 500 10px / 1 var(--dt-sans, system-ui, sans-serif);
|
|
800
868
|
color: var(--ev-color, var(--dt-accent));
|
|
801
869
|
background: color-mix(in srgb, var(--ev-color, var(--dt-accent)) 12%, transparent);
|
|
802
870
|
padding: 1px 4px;
|
|
@@ -809,8 +877,19 @@ const weekDays = $derived.by(() => {
|
|
|
809
877
|
}
|
|
810
878
|
.ag-compact-more {
|
|
811
879
|
font-size: 11px;
|
|
812
|
-
color: var(--dt-text
|
|
880
|
+
color: color-mix(in srgb, var(--dt-text, rgba(0, 0, 0, 0.87)) 72%, transparent);
|
|
813
881
|
padding: 2px 0 0 13px;
|
|
882
|
+
cursor: pointer;
|
|
883
|
+
display: block;
|
|
884
|
+
}
|
|
885
|
+
.ag-compact-more:hover,
|
|
886
|
+
.ag-compact-more:active {
|
|
887
|
+
color: var(--dt-text, rgba(0, 0, 0, 0.87));
|
|
888
|
+
}
|
|
889
|
+
.ag-compact-more:focus-visible {
|
|
890
|
+
outline: none;
|
|
891
|
+
box-shadow: 0 0 0 2px var(--dt-accent, #2563eb);
|
|
892
|
+
border-radius: 4px;
|
|
814
893
|
}
|
|
815
894
|
|
|
816
895
|
/* ═══ Mobile adaptations ═══ */
|
|
@@ -827,17 +906,63 @@ const weekDays = $derived.by(() => {
|
|
|
827
906
|
padding: 12px 14px;
|
|
828
907
|
}
|
|
829
908
|
.ag--mobile .ag-card-title {
|
|
830
|
-
font-size:
|
|
909
|
+
font-size: 15px;
|
|
910
|
+
}
|
|
911
|
+
.ag--mobile .ag-card-meta {
|
|
912
|
+
font-size: 12px;
|
|
913
|
+
}
|
|
914
|
+
.ag--mobile .ag-card-sub {
|
|
915
|
+
font-size: 12px;
|
|
916
|
+
}
|
|
917
|
+
.ag--mobile .ag-card-loc {
|
|
918
|
+
font-size: 12px;
|
|
919
|
+
}
|
|
920
|
+
.ag--mobile .ag-card-eta {
|
|
921
|
+
font-size: 12px;
|
|
922
|
+
}
|
|
923
|
+
.ag--mobile .ag-card-tag {
|
|
924
|
+
font-size: 11px;
|
|
831
925
|
}
|
|
832
926
|
.ag--mobile .ag-compact {
|
|
833
927
|
padding: 8px 0;
|
|
834
928
|
}
|
|
835
929
|
.ag--mobile .ag-compact-title {
|
|
836
|
-
font-size:
|
|
930
|
+
font-size: 15px;
|
|
837
931
|
}
|
|
838
932
|
.ag--mobile .ag-compact-time {
|
|
839
933
|
font-size: 12px;
|
|
840
934
|
}
|
|
935
|
+
.ag--mobile .ag-compact-dur {
|
|
936
|
+
font-size: 12px;
|
|
937
|
+
}
|
|
938
|
+
.ag--mobile .ag-compact-sub {
|
|
939
|
+
font-size: 12px;
|
|
940
|
+
}
|
|
941
|
+
.ag--mobile .ag-compact-loc {
|
|
942
|
+
font-size: 11px;
|
|
943
|
+
}
|
|
944
|
+
.ag--mobile .ag-compact-tag {
|
|
945
|
+
font-size: 11px;
|
|
946
|
+
}
|
|
947
|
+
.ag--mobile .ag-compact-more {
|
|
948
|
+
font-size: 12px;
|
|
949
|
+
padding-top: 6px;
|
|
950
|
+
}
|
|
951
|
+
.ag--mobile .ag-allday-span {
|
|
952
|
+
font-size: 11px;
|
|
953
|
+
}
|
|
954
|
+
.ag--mobile .ag-wday-badge {
|
|
955
|
+
font-size: 11px;
|
|
956
|
+
}
|
|
957
|
+
.ag--mobile .ag-wslot-now {
|
|
958
|
+
font-size: 11px;
|
|
959
|
+
}
|
|
960
|
+
.ag--mobile .ag-wday-empty {
|
|
961
|
+
font-size: 12px;
|
|
962
|
+
}
|
|
963
|
+
.ag--mobile .ag-wday-past-line {
|
|
964
|
+
font-size: 12px;
|
|
965
|
+
}
|
|
841
966
|
.ag--mobile .ag-wslot-cards--multi {
|
|
842
967
|
grid-template-columns: 1fr;
|
|
843
968
|
}
|