@schukai/monster 5.1.1 → 5.2.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/CHANGELOG.md +20 -0
- package/package.json +1 -1
- package/source/components/datatable/stylesheet/datatable.mjs +1 -1
- package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +1 -1
- package/source/components/form/stylesheet/digits.mjs +1 -1
- package/source/components/form/stylesheet/field-layout.mjs +1 -1
- package/source/components/form/stylesheet/field-set.mjs +1 -1
- package/source/components/form/stylesheet/form.mjs +1 -1
- package/source/components/form/stylesheet/input-group.mjs +1 -1
- package/source/components/form/stylesheet/login.mjs +1 -1
- package/source/components/form/stylesheet/popper-button.mjs +1 -1
- package/source/components/form/stylesheet/register-wizard.mjs +1 -1
- package/source/components/host/stylesheet/host.mjs +1 -1
- package/source/components/layout/stylesheet/overlay.mjs +1 -1
- package/source/components/style/form.css +1 -1
- package/source/components/style/form.pcss +5 -0
- package/source/components/stylesheet/form.mjs +1 -1
- package/source/components/time/month-calendar.mjs +553 -42
- package/source/components/time/style/month-calendar.pcss +26 -0
- package/source/components/time/stylesheet/month-calendar.mjs +1 -1
- package/source/components/tree-menu/stylesheet/tree-menu.mjs +1 -1
- package/source/types/version.mjs +1 -1
- package/test/cases/components/style/form-controls.mjs +9 -0
- package/test/cases/components/time/month-calendar.mjs +392 -2
- package/test/cases/dom/early-options-contract.mjs +2 -1
|
@@ -4,16 +4,66 @@ import { ATTRIBUTE_ERRORMESSAGE } from "../../../../source/dom/constants.mjs";
|
|
|
4
4
|
|
|
5
5
|
describe("MonthCalendar date configuration", () => {
|
|
6
6
|
let MonthCalendar;
|
|
7
|
+
let MonthCalendarStyleSheet;
|
|
7
8
|
before(async () => {
|
|
8
9
|
await initJSDOM();
|
|
9
10
|
({ MonthCalendar } = await import(
|
|
10
11
|
"../../../../source/components/time/month-calendar.mjs"
|
|
11
12
|
));
|
|
13
|
+
({ MonthCalendarStyleSheet } = await import(
|
|
14
|
+
"../../../../source/components/time/stylesheet/month-calendar.mjs"
|
|
15
|
+
));
|
|
12
16
|
});
|
|
13
17
|
afterEach(() => document.getElementById("mocks").replaceChildren());
|
|
14
18
|
const updates = () => new Promise((resolve) => setTimeout(resolve, 30));
|
|
15
19
|
const currentDays = (calendar) =>
|
|
16
20
|
calendar.getOption("calendarDays").filter((day) => day.isCurrentMonth);
|
|
21
|
+
const createPointerEvent = (type, options) => {
|
|
22
|
+
const event = new window.MouseEvent(type, {
|
|
23
|
+
bubbles: true,
|
|
24
|
+
cancelable: true,
|
|
25
|
+
composed: true,
|
|
26
|
+
clientX: options.clientX,
|
|
27
|
+
clientY: options.clientY,
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperties(event, {
|
|
30
|
+
pointerId: { value: options.pointerId ?? 1 },
|
|
31
|
+
pointerType: { value: options.pointerType ?? "touch" },
|
|
32
|
+
});
|
|
33
|
+
return event;
|
|
34
|
+
};
|
|
35
|
+
const createAppointmentCalendar = async ({ showWeekend = true } = {}) => {
|
|
36
|
+
const calendar = document.createElement("monster-month-calendar");
|
|
37
|
+
calendar.setOptions({
|
|
38
|
+
startDate: "2026-10-01",
|
|
39
|
+
features: { showWeekend, appointmentMove: true },
|
|
40
|
+
});
|
|
41
|
+
document.getElementById("mocks").append(calendar);
|
|
42
|
+
await updates();
|
|
43
|
+
await updates();
|
|
44
|
+
await updates();
|
|
45
|
+
const columns = showWeekend ? 7 : 5;
|
|
46
|
+
const cells = calendar.shadowRoot.querySelector(
|
|
47
|
+
'[data-monster-role="cells"]',
|
|
48
|
+
);
|
|
49
|
+
cells.getBoundingClientRect = () => ({
|
|
50
|
+
left: 0,
|
|
51
|
+
top: 0,
|
|
52
|
+
right: columns * 100,
|
|
53
|
+
bottom: 600,
|
|
54
|
+
width: columns * 100,
|
|
55
|
+
height: 600,
|
|
56
|
+
});
|
|
57
|
+
calendar.shadowRoot.querySelector(
|
|
58
|
+
'[data-monster-role="control"]',
|
|
59
|
+
).getBoundingClientRect = () => ({ width: columns * 100 });
|
|
60
|
+
calendar.shadowRoot
|
|
61
|
+
.querySelectorAll('[data-monster-role="day-cell"]')
|
|
62
|
+
.forEach((cell) => {
|
|
63
|
+
cell.getBoundingClientRect = () => ({ height: 1000, width: 100 });
|
|
64
|
+
});
|
|
65
|
+
return calendar;
|
|
66
|
+
};
|
|
17
67
|
it("applies JSON options and refreshes the rendered grid after setOption", async () => {
|
|
18
68
|
const mocks = document.getElementById("mocks");
|
|
19
69
|
mocks.innerHTML =
|
|
@@ -55,7 +105,8 @@ describe("MonthCalendar date configuration", () => {
|
|
|
55
105
|
const weekdayGrid = calendar.shadowRoot.querySelector(
|
|
56
106
|
'[data-monster-role="weekdays"]',
|
|
57
107
|
);
|
|
58
|
-
const hiddenWeekendColumns =
|
|
108
|
+
const hiddenWeekendColumns =
|
|
109
|
+
getComputedStyle(weekdayGrid).gridTemplateColumns;
|
|
59
110
|
if (hiddenWeekendColumns !== "none")
|
|
60
111
|
expect(hiddenWeekendColumns.split(" ")).to.have.length(5);
|
|
61
112
|
|
|
@@ -68,7 +119,8 @@ describe("MonthCalendar date configuration", () => {
|
|
|
68
119
|
.querySelector('[data-monster-role="control"]')
|
|
69
120
|
.style.getPropertyValue("--monster-month-calendar-columns"),
|
|
70
121
|
).to.equal("7");
|
|
71
|
-
const visibleWeekendColumns =
|
|
122
|
+
const visibleWeekendColumns =
|
|
123
|
+
getComputedStyle(weekdayGrid).gridTemplateColumns;
|
|
72
124
|
if (visibleWeekendColumns !== "none")
|
|
73
125
|
expect(visibleWeekendColumns.split(" ")).to.have.length(7);
|
|
74
126
|
});
|
|
@@ -263,4 +315,342 @@ describe("MonthCalendar date configuration", () => {
|
|
|
263
315
|
await updates();
|
|
264
316
|
expect(calendar.getOption("calendarDays")).to.equal(days);
|
|
265
317
|
});
|
|
318
|
+
|
|
319
|
+
describe("appointment moving issue #605", () => {
|
|
320
|
+
const appointments = [
|
|
321
|
+
{
|
|
322
|
+
id: "release",
|
|
323
|
+
label: "Release window",
|
|
324
|
+
startDate: "2026-10-05",
|
|
325
|
+
endDate: "2026-10-08",
|
|
326
|
+
color: "rgb(30, 90, 160)",
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
id: "review",
|
|
330
|
+
label: "Review",
|
|
331
|
+
startDate: "2026-10-06",
|
|
332
|
+
endDate: "2026-10-07",
|
|
333
|
+
color: "rgb(180, 120, 20)",
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
id: "migration",
|
|
337
|
+
label: "Migration",
|
|
338
|
+
startDate: "2026-10-05",
|
|
339
|
+
endDate: "2026-10-12",
|
|
340
|
+
color: "rgb(90, 40, 130)",
|
|
341
|
+
},
|
|
342
|
+
];
|
|
343
|
+
|
|
344
|
+
const renderAppointments = async (calendar, data = appointments) => {
|
|
345
|
+
calendar.setOption(
|
|
346
|
+
"data",
|
|
347
|
+
data.map((appointment) => ({ ...appointment })),
|
|
348
|
+
);
|
|
349
|
+
await updates();
|
|
350
|
+
await updates();
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
it("keeps appointment moving opt-in and generates its interaction states", () => {
|
|
354
|
+
const calendar = document.createElement("monster-month-calendar");
|
|
355
|
+
expect(calendar.getOption("features.appointmentMove")).to.equal(false);
|
|
356
|
+
const generatedStyle = [...MonthCalendarStyleSheet.cssRules]
|
|
357
|
+
.map((rule) => rule.cssText)
|
|
358
|
+
.join("\n");
|
|
359
|
+
expect(generatedStyle).to.include("data-monster-dragging");
|
|
360
|
+
expect(generatedStyle).to.include("data-monster-drop-target");
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it("moves a whole multi-day appointment with a cancelable public event", async () => {
|
|
364
|
+
const calendar = await createAppointmentCalendar();
|
|
365
|
+
await renderAppointments(calendar);
|
|
366
|
+
const segment = calendar.shadowRoot.querySelector(
|
|
367
|
+
'[data-monster-appointment-index="0"]',
|
|
368
|
+
);
|
|
369
|
+
expect(segment.draggable).to.equal(true);
|
|
370
|
+
expect(segment.tabIndex).to.equal(0);
|
|
371
|
+
|
|
372
|
+
let detail;
|
|
373
|
+
calendar.addEventListener("monster-appointment-move", (event) => {
|
|
374
|
+
detail = event.detail;
|
|
375
|
+
});
|
|
376
|
+
for (const key of [" ", "ArrowRight", "Enter"]) {
|
|
377
|
+
segment.dispatchEvent(
|
|
378
|
+
new window.KeyboardEvent("keydown", {
|
|
379
|
+
key,
|
|
380
|
+
bubbles: true,
|
|
381
|
+
cancelable: true,
|
|
382
|
+
composed: true,
|
|
383
|
+
}),
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
await updates();
|
|
387
|
+
|
|
388
|
+
expect(detail.appointmentId).to.equal("release");
|
|
389
|
+
expect(detail.dayDelta).to.equal(1);
|
|
390
|
+
expect(detail.inputType).to.equal("keyboard");
|
|
391
|
+
expect(detail.source).to.deep.include({
|
|
392
|
+
startDate: "2026-10-05",
|
|
393
|
+
endDate: "2026-10-08",
|
|
394
|
+
});
|
|
395
|
+
expect(detail.target).to.deep.include({
|
|
396
|
+
startDate: "2026-10-06",
|
|
397
|
+
endDate: "2026-10-09",
|
|
398
|
+
});
|
|
399
|
+
expect(calendar.getOption("data.0.startDate")).to.equal("2026-10-06");
|
|
400
|
+
expect(calendar.getOption("data.0.endDate")).to.equal("2026-10-09");
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
it("keeps local data unchanged when a consumer cancels the move", async () => {
|
|
404
|
+
const calendar = await createAppointmentCalendar();
|
|
405
|
+
await renderAppointments(calendar);
|
|
406
|
+
const segment = calendar.shadowRoot.querySelector(
|
|
407
|
+
'[data-monster-appointment-index="1"]',
|
|
408
|
+
);
|
|
409
|
+
calendar.addEventListener("monster-appointment-move", (event) => {
|
|
410
|
+
event.preventDefault();
|
|
411
|
+
});
|
|
412
|
+
for (const key of [" ", "ArrowRight", "Enter"]) {
|
|
413
|
+
segment.dispatchEvent(
|
|
414
|
+
new window.KeyboardEvent("keydown", {
|
|
415
|
+
key,
|
|
416
|
+
bubbles: true,
|
|
417
|
+
cancelable: true,
|
|
418
|
+
composed: true,
|
|
419
|
+
}),
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
expect(calendar.getOption("data.1.startDate")).to.equal("2026-10-06");
|
|
424
|
+
expect(calendar.getOption("data.1.endDate")).to.equal("2026-10-07");
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
it("cancels a keyboard move without emitting an event", async () => {
|
|
428
|
+
const calendar = await createAppointmentCalendar();
|
|
429
|
+
await renderAppointments(calendar, [
|
|
430
|
+
{
|
|
431
|
+
id: "single-day",
|
|
432
|
+
label: "Single day",
|
|
433
|
+
startDate: "2026-10-06",
|
|
434
|
+
endDate: "2026-10-06",
|
|
435
|
+
color: "rgb(30, 90, 160)",
|
|
436
|
+
},
|
|
437
|
+
]);
|
|
438
|
+
const segment = calendar.shadowRoot.querySelector(
|
|
439
|
+
'[data-monster-appointment-index="0"]',
|
|
440
|
+
);
|
|
441
|
+
let moveEvents = 0;
|
|
442
|
+
calendar.addEventListener("monster-appointment-move", () => {
|
|
443
|
+
moveEvents++;
|
|
444
|
+
});
|
|
445
|
+
for (const key of [" ", "ArrowRight", "Escape"]) {
|
|
446
|
+
segment.dispatchEvent(
|
|
447
|
+
new window.KeyboardEvent("keydown", {
|
|
448
|
+
key,
|
|
449
|
+
bubbles: true,
|
|
450
|
+
cancelable: true,
|
|
451
|
+
composed: true,
|
|
452
|
+
}),
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
expect(moveEvents).to.equal(0);
|
|
457
|
+
expect(calendar.getOption("data.0.startDate")).to.equal("2026-10-06");
|
|
458
|
+
expect(segment.hasAttribute("data-monster-dragging")).to.equal(false);
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
it("does not expose move interactions while disabled", async () => {
|
|
462
|
+
const calendar = await createAppointmentCalendar();
|
|
463
|
+
await renderAppointments(calendar, [appointments[0]]);
|
|
464
|
+
calendar.setOption("disabled", true);
|
|
465
|
+
await updates();
|
|
466
|
+
await updates();
|
|
467
|
+
const segment = calendar.shadowRoot.querySelector(
|
|
468
|
+
'[data-monster-appointment-index="0"]',
|
|
469
|
+
);
|
|
470
|
+
|
|
471
|
+
expect(segment.draggable).to.equal(false);
|
|
472
|
+
expect(segment.tabIndex).to.equal(-1);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it("rejects moves that would push an appointment outside the calendar", async () => {
|
|
476
|
+
const calendar = await createAppointmentCalendar();
|
|
477
|
+
const calendarDays = calendar.getOption("calendarDays");
|
|
478
|
+
const startDate = calendarDays.at(-2).day;
|
|
479
|
+
const endDate = calendarDays.at(-1).day;
|
|
480
|
+
await renderAppointments(calendar, [
|
|
481
|
+
{
|
|
482
|
+
id: "range-end",
|
|
483
|
+
label: "Range end",
|
|
484
|
+
startDate,
|
|
485
|
+
endDate,
|
|
486
|
+
color: "rgb(30, 90, 160)",
|
|
487
|
+
},
|
|
488
|
+
]);
|
|
489
|
+
const segment = calendar.shadowRoot.querySelector(
|
|
490
|
+
'[data-monster-appointment-index="0"]',
|
|
491
|
+
);
|
|
492
|
+
let moveEvents = 0;
|
|
493
|
+
calendar.addEventListener("monster-appointment-move", () => {
|
|
494
|
+
moveEvents++;
|
|
495
|
+
});
|
|
496
|
+
for (const key of [" ", "ArrowRight", "Enter"]) {
|
|
497
|
+
segment.dispatchEvent(
|
|
498
|
+
new window.KeyboardEvent("keydown", {
|
|
499
|
+
key,
|
|
500
|
+
bubbles: true,
|
|
501
|
+
cancelable: true,
|
|
502
|
+
composed: true,
|
|
503
|
+
}),
|
|
504
|
+
);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
expect(moveEvents).to.equal(0);
|
|
508
|
+
expect(calendar.getOption("data.0.startDate")).to.equal(startDate);
|
|
509
|
+
expect(calendar.getOption("data.0.endDate")).to.equal(endDate);
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
it("uses visible weekdays as keyboard targets while preserving calendar duration", async () => {
|
|
513
|
+
const calendar = await createAppointmentCalendar({ showWeekend: false });
|
|
514
|
+
await renderAppointments(calendar, [
|
|
515
|
+
{
|
|
516
|
+
id: "weekend",
|
|
517
|
+
label: "Weekend deployment",
|
|
518
|
+
startDate: "2026-10-02",
|
|
519
|
+
endDate: "2026-10-05",
|
|
520
|
+
color: "rgb(30, 90, 160)",
|
|
521
|
+
},
|
|
522
|
+
]);
|
|
523
|
+
const segment = calendar.shadowRoot.querySelector(
|
|
524
|
+
'[data-monster-segment-start="2026-10-02"]',
|
|
525
|
+
);
|
|
526
|
+
let detail;
|
|
527
|
+
calendar.addEventListener("monster-appointment-move", (event) => {
|
|
528
|
+
detail = event.detail;
|
|
529
|
+
});
|
|
530
|
+
for (const key of [" ", "ArrowRight", "Enter"]) {
|
|
531
|
+
segment.dispatchEvent(
|
|
532
|
+
new window.KeyboardEvent("keydown", {
|
|
533
|
+
key,
|
|
534
|
+
bubbles: true,
|
|
535
|
+
cancelable: true,
|
|
536
|
+
composed: true,
|
|
537
|
+
}),
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
expect(detail.dayDelta).to.equal(3);
|
|
542
|
+
expect(calendar.getOption("data.0.startDate")).to.equal("2026-10-05");
|
|
543
|
+
expect(calendar.getOption("data.0.endDate")).to.equal("2026-10-08");
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
it("supports touch-style pointer movement between day cells", async () => {
|
|
547
|
+
const calendar = await createAppointmentCalendar();
|
|
548
|
+
await renderAppointments(calendar, [appointments[0]]);
|
|
549
|
+
const segment = calendar.shadowRoot.querySelector(
|
|
550
|
+
'[data-monster-appointment-index="0"]',
|
|
551
|
+
);
|
|
552
|
+
let detail;
|
|
553
|
+
calendar.addEventListener("monster-appointment-move", (event) => {
|
|
554
|
+
detail = event.detail;
|
|
555
|
+
});
|
|
556
|
+
segment.dispatchEvent(
|
|
557
|
+
createPointerEvent("pointerdown", { clientX: 50, clientY: 150 }),
|
|
558
|
+
);
|
|
559
|
+
segment.dispatchEvent(
|
|
560
|
+
createPointerEvent("pointermove", { clientX: 250, clientY: 150 }),
|
|
561
|
+
);
|
|
562
|
+
segment.dispatchEvent(
|
|
563
|
+
createPointerEvent("pointerup", { clientX: 250, clientY: 150 }),
|
|
564
|
+
);
|
|
565
|
+
|
|
566
|
+
expect(detail.inputType).to.equal("pointer");
|
|
567
|
+
expect(detail.dayDelta).to.equal(2);
|
|
568
|
+
expect(calendar.getOption("data.0.startDate")).to.equal("2026-10-07");
|
|
569
|
+
expect(calendar.getOption("data.0.endDate")).to.equal("2026-10-10");
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
it("supports native mouse drag and drop without exposing the shadow tree", async () => {
|
|
573
|
+
const calendar = await createAppointmentCalendar();
|
|
574
|
+
await renderAppointments(calendar, [appointments[0]]);
|
|
575
|
+
const segment = calendar.shadowRoot.querySelector(
|
|
576
|
+
'[data-monster-appointment-index="0"]',
|
|
577
|
+
);
|
|
578
|
+
const dataTransfer = {
|
|
579
|
+
effectAllowed: "none",
|
|
580
|
+
dropEffect: "none",
|
|
581
|
+
setData() {},
|
|
582
|
+
};
|
|
583
|
+
const dragStart = new window.MouseEvent("dragstart", {
|
|
584
|
+
bubbles: true,
|
|
585
|
+
cancelable: true,
|
|
586
|
+
composed: true,
|
|
587
|
+
clientX: 50,
|
|
588
|
+
clientY: 150,
|
|
589
|
+
});
|
|
590
|
+
Object.defineProperty(dragStart, "dataTransfer", { value: dataTransfer });
|
|
591
|
+
segment.dispatchEvent(dragStart);
|
|
592
|
+
|
|
593
|
+
for (const type of ["dragover", "drop"]) {
|
|
594
|
+
const event = new window.MouseEvent(type, {
|
|
595
|
+
bubbles: true,
|
|
596
|
+
cancelable: true,
|
|
597
|
+
composed: true,
|
|
598
|
+
clientX: 150,
|
|
599
|
+
clientY: 150,
|
|
600
|
+
});
|
|
601
|
+
Object.defineProperty(event, "dataTransfer", { value: dataTransfer });
|
|
602
|
+
calendar.shadowRoot
|
|
603
|
+
.querySelector('[data-monster-day="2026-10-06"]')
|
|
604
|
+
.dispatchEvent(event);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
expect(dataTransfer.effectAllowed).to.equal("move");
|
|
608
|
+
expect(dataTransfer.dropEffect).to.equal("move");
|
|
609
|
+
expect(calendar.getOption("data.0.startDate")).to.equal("2026-10-06");
|
|
610
|
+
expect(calendar.getOption("data.0.endDate")).to.equal("2026-10-09");
|
|
611
|
+
});
|
|
612
|
+
|
|
613
|
+
it("reflows overlapping segments into deterministic non-colliding rows", async () => {
|
|
614
|
+
const calendar = await createAppointmentCalendar();
|
|
615
|
+
await renderAppointments(calendar);
|
|
616
|
+
const startsOnMonday = [0, 2].map((index) =>
|
|
617
|
+
calendar.shadowRoot.querySelector(
|
|
618
|
+
`[data-monster-appointment-index="${index}"][data-monster-segment-start="2026-10-05"]`,
|
|
619
|
+
),
|
|
620
|
+
);
|
|
621
|
+
expect(startsOnMonday.every(Boolean)).to.equal(true);
|
|
622
|
+
expect(
|
|
623
|
+
new Set(startsOnMonday.map((segment) => segment.style.top)).size,
|
|
624
|
+
).to.equal(2);
|
|
625
|
+
|
|
626
|
+
const migrationSegments = calendar.shadowRoot.querySelectorAll(
|
|
627
|
+
'[data-monster-appointment-index="2"]',
|
|
628
|
+
);
|
|
629
|
+
expect(migrationSegments).to.have.length(2);
|
|
630
|
+
expect(migrationSegments[0].style.top).to.equal(
|
|
631
|
+
migrationSegments[1].style.top,
|
|
632
|
+
);
|
|
633
|
+
|
|
634
|
+
for (const key of [" ", "ArrowRight", "Enter"]) {
|
|
635
|
+
startsOnMonday[0].dispatchEvent(
|
|
636
|
+
new window.KeyboardEvent("keydown", {
|
|
637
|
+
key,
|
|
638
|
+
bubbles: true,
|
|
639
|
+
cancelable: true,
|
|
640
|
+
composed: true,
|
|
641
|
+
}),
|
|
642
|
+
);
|
|
643
|
+
}
|
|
644
|
+
await updates();
|
|
645
|
+
await updates();
|
|
646
|
+
const overlapping = [0, 1, 2].map((index) =>
|
|
647
|
+
calendar.shadowRoot.querySelector(
|
|
648
|
+
`[data-monster-appointment-index="${index}"]`,
|
|
649
|
+
),
|
|
650
|
+
);
|
|
651
|
+
expect(
|
|
652
|
+
new Set(overlapping.map((segment) => segment.style.top)).size,
|
|
653
|
+
).to.equal(3);
|
|
654
|
+
});
|
|
655
|
+
});
|
|
266
656
|
});
|
|
@@ -26,7 +26,8 @@ describe("Early options source contract (#596)", () => {
|
|
|
26
26
|
1,
|
|
27
27
|
);
|
|
28
28
|
});
|
|
29
|
-
it("has no statically resolved early options access in library getters", ()
|
|
29
|
+
it("has no statically resolved early options access in library getters", function () {
|
|
30
|
+
this.timeout(10_000);
|
|
30
31
|
const root = new URL("../../../", import.meta.url);
|
|
31
32
|
const files = globSync("source/**/*.mjs", { cwd: root }).sort();
|
|
32
33
|
assert.ok(files.length > 300);
|