@bearmenu/ui 0.8.24 → 0.8.25

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.
Files changed (89) hide show
  1. package/dist/{chunk-5LTILG3L.js → chunk-5HHRVJOT.js} +14 -1
  2. package/dist/{chunk-SDWN6L4O.js → chunk-AHHDC7ML.js} +1 -1
  3. package/dist/{chunk-I4RUOAU7.js → chunk-AHL45DD2.js} +11 -38
  4. package/dist/{chunk-5XREWOBB.js → chunk-IEIJP73R.js} +14 -1
  5. package/dist/{chunk-BKKQ7GCZ.js → chunk-QG6I2ILT.js} +1 -1
  6. package/dist/{chunk-TIQNM4XD.js → chunk-VEGFQSZA.js} +17 -1
  7. package/dist/components/alert-dialog.js +1 -1
  8. package/dist/components/badge.d.ts +1 -1
  9. package/dist/components/badge.js +1 -1
  10. package/dist/components/booking-row.d.ts +60 -0
  11. package/dist/components/booking-row.js +103 -0
  12. package/dist/components/booking-summary-card.d.ts +38 -0
  13. package/dist/components/booking-summary-card.js +67 -0
  14. package/dist/components/button.d.ts +2 -2
  15. package/dist/components/button.js +1 -1
  16. package/dist/components/calendar.d.ts +17 -3
  17. package/dist/components/calendar.js +100 -12
  18. package/dist/components/carousel.js +1 -1
  19. package/dist/components/coach-marks.js +1 -1
  20. package/dist/components/combobox.js +1 -1
  21. package/dist/components/concept-convergence.js +2 -2
  22. package/dist/components/drift-rail.d.ts +2 -29
  23. package/dist/components/drift-rail.js +1 -3
  24. package/dist/components/empty-state.js +1 -1
  25. package/dist/components/event-card.js +1 -1
  26. package/dist/components/event-compact-row.js +1 -1
  27. package/dist/components/event-detail-panel.js +1 -1
  28. package/dist/components/event-list-row-wide.js +2 -2
  29. package/dist/components/event-list-row.js +1 -1
  30. package/dist/components/filter-category-row.js +1 -1
  31. package/dist/components/hold-countdown.d.ts +43 -0
  32. package/dist/components/hold-countdown.js +90 -0
  33. package/dist/components/kitchen-dossier.js +1 -1
  34. package/dist/components/link-button.js +1 -1
  35. package/dist/components/menu-family-block.js +1 -1
  36. package/dist/components/menu-index-list.js +1 -1
  37. package/dist/components/menu-item.js +3 -3
  38. package/dist/components/motion-icon-set.d.ts +2 -1
  39. package/dist/components/motion-icon-set.js +27 -1
  40. package/dist/components/multi-select-combobox.js +2 -2
  41. package/dist/components/pagination.js +1 -1
  42. package/dist/components/party-counter.d.ts +36 -0
  43. package/dist/components/party-counter.js +61 -0
  44. package/dist/components/place-card.js +2 -2
  45. package/dist/components/place-details-mobile.js +1 -1
  46. package/dist/components/poster-tape.d.ts +2 -15
  47. package/dist/components/poster-tape.js +3 -12
  48. package/dist/components/searchable-select.js +1 -1
  49. package/dist/components/signature-chip.js +2 -2
  50. package/dist/components/sliding-panels.js +1 -1
  51. package/dist/components/time-slot.d.ts +73 -0
  52. package/dist/components/time-slot.js +106 -0
  53. package/dist/components/toggle-group.js +15 -2
  54. package/dist/components/toggle.d.ts +1 -1
  55. package/dist/components/toggle.js +1 -1
  56. package/dist/components/top-ranking-entry.js +3 -3
  57. package/dist/components/weekday-chip.d.ts +33 -0
  58. package/dist/components/weekday-chip.js +48 -0
  59. package/package.json +1 -1
  60. package/src/components/badge.stories.tsx +17 -0
  61. package/src/components/badge.tsx +15 -0
  62. package/src/components/booking-primitives.test.tsx +180 -0
  63. package/src/components/booking-row.stories.tsx +66 -0
  64. package/src/components/booking-row.tsx +168 -0
  65. package/src/components/booking-summary-card.stories.tsx +41 -0
  66. package/src/components/booking-summary-card.tsx +109 -0
  67. package/src/components/button.stories.tsx +23 -0
  68. package/src/components/button.tsx +13 -0
  69. package/src/components/calendar.stories.tsx +27 -0
  70. package/src/components/calendar.tsx +110 -3
  71. package/src/components/drift-rail.stories.tsx +1 -29
  72. package/src/components/drift-rail.tsx +4 -71
  73. package/src/components/hold-countdown.stories.tsx +68 -0
  74. package/src/components/hold-countdown.tsx +140 -0
  75. package/src/components/motion-icon-set.stories.tsx +2 -0
  76. package/src/components/motion-icon-set.tsx +42 -0
  77. package/src/components/party-counter.stories.tsx +57 -0
  78. package/src/components/party-counter.tsx +93 -0
  79. package/src/components/poster-tape.stories.tsx +0 -29
  80. package/src/components/poster-tape.tsx +5 -21
  81. package/src/components/time-slot.stories.tsx +85 -0
  82. package/src/components/time-slot.tsx +186 -0
  83. package/src/components/toggle-group.stories.tsx +27 -0
  84. package/src/components/toggle-group.tsx +14 -1
  85. package/src/components/toggle.tsx +16 -0
  86. package/src/components/weekday-chip.stories.tsx +54 -0
  87. package/src/components/weekday-chip.tsx +75 -0
  88. package/src/components/drift-rail.test.tsx +0 -125
  89. package/src/components/poster-tape.test.tsx +0 -42
@@ -1,125 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- import { act, fireEvent, render, screen } from "@testing-library/react";
3
- import { DriftRail } from "./drift-rail";
4
-
5
- const labels = { pause: "Pause the rail", play: "Play the rail" };
6
-
7
- /**
8
- * jsdom lays nothing out, so the track's `scrollWidth` is 0 and the loop's
9
- * `half > 0` guard skips every frame. The tests give the track a width and
10
- * the scroller a writable `scrollLeft`, capture the rAF callbacks, and drive
11
- * the frames by hand with a clock that moves in whole seconds.
12
- */
13
- const TRACK_WIDTH = 2000;
14
-
15
- let frames = new Map<number, FrameRequestCallback>();
16
- let nextFrameId = 1;
17
- let now = 0;
18
-
19
- function runFrame(elapsedMs: number) {
20
- now += elapsedMs;
21
- const pending = [...frames.values()];
22
- frames = new Map();
23
- act(() => {
24
- for (const frame of pending) frame(now);
25
- });
26
- }
27
-
28
- function renderRail(props: Partial<React.ComponentProps<typeof DriftRail>> = {}) {
29
- const view = render(
30
- <DriftRail durationSeconds={10} {...props}>
31
- <a href="/a">A</a>
32
- <a href="/b">B</a>
33
- </DriftRail>
34
- );
35
- const track = screen.getAllByText("A")[0].parentElement as HTMLElement;
36
- const scroller = track.parentElement as HTMLElement;
37
- Object.defineProperty(track, "scrollWidth", { value: TRACK_WIDTH, configurable: true });
38
- let scrollLeft = 0;
39
- Object.defineProperty(scroller, "scrollLeft", {
40
- get: () => scrollLeft,
41
- set: (value: number) => {
42
- scrollLeft = value;
43
- },
44
- configurable: true,
45
- });
46
- return { ...view, scroller, track };
47
- }
48
-
49
- beforeEach(() => {
50
- frames = new Map();
51
- nextFrameId = 1;
52
- now = 0;
53
- vi.spyOn(window, "requestAnimationFrame").mockImplementation((callback) => {
54
- const id = nextFrameId++;
55
- frames.set(id, callback);
56
- return id;
57
- });
58
- vi.spyOn(window, "cancelAnimationFrame").mockImplementation((id) => {
59
- frames.delete(id);
60
- });
61
- vi.spyOn(performance, "now").mockImplementation(() => now);
62
- });
63
-
64
- afterEach(() => {
65
- vi.restoreAllMocks();
66
- });
67
-
68
- describe("DriftRail", () => {
69
- it("advances the scroller by width / duration per second", () => {
70
- const { scroller } = renderRail();
71
- runFrame(0);
72
- runFrame(1000);
73
- // One copy is half the track; 1000px over 10s is 100px per second.
74
- expect(scroller.scrollLeft).toBeCloseTo(100, 5);
75
- });
76
-
77
- it("renders no control without labels", () => {
78
- renderRail();
79
- expect(screen.queryByRole("button")).not.toBeInTheDocument();
80
- });
81
-
82
- it("stops advancing when the reader presses pause, and stays stopped until play", () => {
83
- const { scroller } = renderRail({ labels });
84
- runFrame(0);
85
- runFrame(1000);
86
- const advanced = scroller.scrollLeft;
87
- expect(advanced).toBeGreaterThan(0);
88
-
89
- const toggle = screen.getByRole("button", { name: labels.pause });
90
- expect(toggle).toHaveAttribute("aria-pressed", "false");
91
- fireEvent.click(toggle);
92
-
93
- expect(toggle).toHaveAttribute("aria-pressed", "true");
94
- expect(toggle).toHaveAccessibleName(labels.play);
95
-
96
- runFrame(0);
97
- runFrame(1000);
98
- runFrame(1000);
99
- expect(scroller.scrollLeft).toBe(advanced);
100
-
101
- // The latch survives the hover hold lifting: nothing but play resumes it.
102
- fireEvent.mouseEnter(scroller);
103
- fireEvent.mouseLeave(scroller);
104
- runFrame(0);
105
- runFrame(1000);
106
- expect(scroller.scrollLeft).toBe(advanced);
107
-
108
- fireEvent.click(toggle);
109
- expect(toggle).toHaveAttribute("aria-pressed", "false");
110
- runFrame(0);
111
- runFrame(1000);
112
- expect(scroller.scrollLeft).toBeGreaterThan(advanced);
113
- });
114
-
115
- it("makes the duplicate pass inert as well as aria-hidden", () => {
116
- const { track } = renderRail();
117
- const copies = screen.getAllByText("A");
118
- expect(copies).toHaveLength(2);
119
- const clone = copies[1].parentElement as HTMLElement;
120
- expect(clone.parentElement).toBe(track);
121
- expect(clone).toHaveAttribute("aria-hidden", "true");
122
- expect(clone).toHaveAttribute("inert");
123
- expect(copies[0].parentElement).toBe(track);
124
- });
125
- });
@@ -1,42 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { render, screen } from "@testing-library/react";
3
- import { PosterTape } from "./poster-tape";
4
-
5
- describe("PosterTape", () => {
6
- it("renders meta alone when no time is given", () => {
7
- render(<PosterTape items={[{ id: "1", title: "Warehouse Rave", meta: "SAT 20:00" }]} />);
8
- const [meta] = screen.getAllByText("SAT 20:00");
9
- expect(meta).toHaveClass("truncate");
10
- expect(meta.parentElement?.childElementCount).toBe(1);
11
- });
12
-
13
- it("renders the time outside the truncating span so it never clips", () => {
14
- render(
15
- <PosterTape
16
- items={[{ id: "1", title: "Warehouse Rave", meta: "sâm., 5 sept.", time: "17:00" }]}
17
- />
18
- );
19
- const [meta] = screen.getAllByText("sâm., 5 sept.");
20
- const [time] = screen.getAllByText("· 17:00");
21
-
22
- expect(meta).toHaveClass("truncate");
23
- expect(meta.contains(time)).toBe(false);
24
- expect(time).toHaveClass("shrink-0");
25
- expect(time).not.toHaveClass("truncate");
26
- expect(time.parentElement).toBe(meta.parentElement);
27
- expect(meta.parentElement).not.toHaveClass("truncate");
28
- });
29
-
30
- it("forwards labels to the rail's pause control", () => {
31
- render(
32
- <PosterTape
33
- items={[{ id: "1", title: "Warehouse Rave", meta: "SAT 20:00" }]}
34
- labels={{ pause: "Pause the tape", play: "Play the tape" }}
35
- />
36
- );
37
- expect(screen.getByRole("button", { name: "Pause the tape" })).toHaveAttribute(
38
- "aria-pressed",
39
- "false"
40
- );
41
- });
42
- });