@jalvin/ui 2.0.44 → 2.0.46

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jalvin/ui",
3
- "version": "2.0.44",
3
+ "version": "2.0.46",
4
4
  "description": "Jalvin UI — Compose-style component library (Column, Row, Box, Button, Text, …)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -21,7 +21,7 @@
21
21
  "@jalvin/runtime": ">=2.0.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@jalvin/runtime": "2.0.44",
24
+ "@jalvin/runtime": "2.0.43",
25
25
  "@testing-library/dom": "^10.4.1",
26
26
  "@testing-library/jest-dom": "^6.9.1",
27
27
  "@types/node": "^20.0.0",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=annotated-string.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"annotated-string.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/annotated-string.test.tsx"],"names":[],"mappings":""}
@@ -1,310 +0,0 @@
1
- import React from "react";
2
- import { describe, it, expect, vi } from "vitest";
3
- import { render, screen, fireEvent } from "@testing-library/react";
4
- import { buildAnnotatedString, LinkAnnotation, TextDecoration, renderAnnotatedString, } from "../annotated-string.js";
5
- import { Text } from "../text.js";
6
- // ---------------------------------------------------------------------------
7
- // TextDecoration
8
- // ---------------------------------------------------------------------------
9
- describe("TextDecoration", () => {
10
- it("None produces no CSS value", () => {
11
- expect(TextDecoration.None.toCSSValue()).toBeUndefined();
12
- });
13
- it("Underline produces 'underline'", () => {
14
- expect(TextDecoration.Underline.toCSSValue()).toBe("underline");
15
- });
16
- it("LineThrough produces 'line-through'", () => {
17
- expect(TextDecoration.LineThrough.toCSSValue()).toBe("line-through");
18
- });
19
- it("Underline + LineThrough produces 'underline line-through'", () => {
20
- const combined = TextDecoration.Underline.plus(TextDecoration.LineThrough);
21
- expect(combined.toCSSValue()).toBe("underline line-through");
22
- });
23
- it("combining with None is a no-op", () => {
24
- const combined = TextDecoration.Underline.plus(TextDecoration.None);
25
- expect(combined.toCSSValue()).toBe("underline");
26
- });
27
- });
28
- // ---------------------------------------------------------------------------
29
- // buildAnnotatedString — builder mechanics
30
- // ---------------------------------------------------------------------------
31
- describe("buildAnnotatedString — builder mechanics", () => {
32
- it("produces plain text with no spans", () => {
33
- const ann = buildAnnotatedString(b => b.append("hello"));
34
- expect(ann.text).toBe("hello");
35
- expect(ann.spanStyles).toHaveLength(0);
36
- expect(ann.linkAnnotations).toHaveLength(0);
37
- });
38
- it("records correct start/end for withStyle", () => {
39
- const ann = buildAnnotatedString(b => {
40
- b.append("ab");
41
- b.withStyle({ color: "red" }, () => b.append("cd"));
42
- b.append("ef");
43
- });
44
- expect(ann.text).toBe("abcdef");
45
- const span = ann.spanStyles[0];
46
- expect(span.start).toBe(2);
47
- expect(span.end).toBe(4);
48
- expect(span.item.color).toBe("red");
49
- });
50
- it("records correct start/end for withLink (Url)", () => {
51
- const ann = buildAnnotatedString(b => {
52
- b.append("go ");
53
- b.withLink(LinkAnnotation.Url("https://example.com"), () => b.append("here"));
54
- });
55
- expect(ann.text).toBe("go here");
56
- const link = ann.linkAnnotations[0];
57
- expect(link.start).toBe(3);
58
- expect(link.end).toBe(7);
59
- expect(link.item.type).toBe("url");
60
- });
61
- it("records correct start/end for withLink (Clickable)", () => {
62
- const onClick = vi.fn();
63
- const ann = buildAnnotatedString(b => {
64
- b.withLink(LinkAnnotation.Clickable("tag1", onClick), () => b.append("click me"));
65
- });
66
- const link = ann.linkAnnotations[0];
67
- expect(link.start).toBe(0);
68
- expect(link.end).toBe(8);
69
- expect(link.item.type).toBe("clickable");
70
- });
71
- it("addStyle applies span to an explicit range", () => {
72
- const ann = buildAnnotatedString(b => {
73
- b.append("hello world");
74
- b.addStyle({ fontWeight: "bold" }, 6, 11);
75
- });
76
- const span = ann.spanStyles[0];
77
- expect(span.start).toBe(6);
78
- expect(span.end).toBe(11);
79
- expect(span.item.fontWeight).toBe("bold");
80
- });
81
- it("addLink applies a link to an explicit range", () => {
82
- const ann = buildAnnotatedString(b => {
83
- b.append("visit docs now");
84
- b.addLink(LinkAnnotation.Url("https://docs.example.com"), 6, 10);
85
- });
86
- const link = ann.linkAnnotations[0];
87
- expect(link.start).toBe(6);
88
- expect(link.end).toBe(10);
89
- });
90
- it("appending another AnnotatedString shifts offsets correctly", () => {
91
- const inner = buildAnnotatedString(b => {
92
- b.withStyle({ color: "blue" }, () => b.append("blue"));
93
- });
94
- const outer = buildAnnotatedString(b => {
95
- b.append("abc ");
96
- b.append(inner);
97
- });
98
- expect(outer.text).toBe("abc blue");
99
- const span = outer.spanStyles[0];
100
- expect(span.start).toBe(4);
101
- expect(span.end).toBe(8);
102
- });
103
- it("nested withStyle pushes two spans", () => {
104
- const ann = buildAnnotatedString(b => {
105
- b.withStyle({ fontWeight: "bold" }, () => {
106
- b.withStyle({ color: "red" }, () => b.append("x"));
107
- });
108
- });
109
- expect(ann.spanStyles).toHaveLength(2);
110
- });
111
- it("unclosed pushStyle is flushed on build", () => {
112
- const ann = buildAnnotatedString(b => {
113
- b.pushStyle({ color: "green" });
114
- b.append("test");
115
- // no pop() — build() should flush it
116
- });
117
- expect(ann.spanStyles).toHaveLength(1);
118
- expect(ann.spanStyles[0].end).toBe(4);
119
- });
120
- it("multiple sequential appends produce correct full text", () => {
121
- const ann = buildAnnotatedString(b => {
122
- b.append("one");
123
- b.append(" ");
124
- b.append("two");
125
- });
126
- expect(ann.text).toBe("one two");
127
- });
128
- });
129
- // ---------------------------------------------------------------------------
130
- // LinkAnnotation factory
131
- // ---------------------------------------------------------------------------
132
- describe("LinkAnnotation", () => {
133
- it("Url stores url and type", () => {
134
- const link = LinkAnnotation.Url("https://example.com");
135
- expect(link.type).toBe("url");
136
- if (link.type === "url")
137
- expect(link.url).toBe("https://example.com");
138
- });
139
- it("Url accepts optional styles", () => {
140
- const styles = { style: { color: "#00f" } };
141
- const link = LinkAnnotation.Url("https://a.com", styles);
142
- expect(link.styles).toBe(styles);
143
- });
144
- it("Clickable stores tag, type, and callback", () => {
145
- const fn = vi.fn();
146
- const link = LinkAnnotation.Clickable("my-tag", fn);
147
- expect(link.type).toBe("clickable");
148
- if (link.type === "clickable") {
149
- expect(link.tag).toBe("my-tag");
150
- expect(link.onClick).toBe(fn);
151
- }
152
- });
153
- });
154
- // ---------------------------------------------------------------------------
155
- // renderAnnotatedString
156
- // ---------------------------------------------------------------------------
157
- describe("renderAnnotatedString", () => {
158
- it("returns a single string node for plain text with no spans", () => {
159
- const ann = buildAnnotatedString(b => b.append("plain"));
160
- const nodes = renderAnnotatedString(ann);
161
- // Filters out nulls; for unstyled plain text a bare string is returned
162
- const text = nodes.join("");
163
- expect(text).toBe("plain");
164
- });
165
- it("renders a Url link as an <a> tag", () => {
166
- const ann = buildAnnotatedString(b => {
167
- b.withLink(LinkAnnotation.Url("https://example.com"), () => b.append("click"));
168
- });
169
- const { container } = render(React.createElement("span", null, ...renderAnnotatedString(ann)));
170
- const a = container.querySelector("a");
171
- expect(a).not.toBeNull();
172
- expect(a.href).toBe("https://example.com/");
173
- expect(a.target).toBe("_blank");
174
- expect(a.rel).toContain("noopener");
175
- expect(a.textContent).toBe("click");
176
- });
177
- it("renders a Clickable link as a <span role=link>", () => {
178
- const onClick = vi.fn();
179
- const ann = buildAnnotatedString(b => {
180
- b.withLink(LinkAnnotation.Clickable("open", onClick), () => b.append("open dialog"));
181
- });
182
- const { container } = render(React.createElement("span", null, ...renderAnnotatedString(ann)));
183
- const el = container.querySelector('[role="link"]');
184
- expect(el).not.toBeNull();
185
- expect(el.textContent).toBe("open dialog");
186
- });
187
- it("fires the onClick callback when a Clickable link is clicked", () => {
188
- const onClick = vi.fn();
189
- const ann = buildAnnotatedString(b => {
190
- b.withLink(LinkAnnotation.Clickable("my-tag", onClick), () => b.append("press"));
191
- });
192
- const { container } = render(React.createElement("span", null, ...renderAnnotatedString(ann)));
193
- const el = container.querySelector('[role="link"]');
194
- fireEvent.click(el);
195
- expect(onClick).toHaveBeenCalledOnce();
196
- expect(onClick).toHaveBeenCalledWith("my-tag");
197
- });
198
- it("fires the onClick callback on Enter keydown", () => {
199
- const onClick = vi.fn();
200
- const ann = buildAnnotatedString(b => {
201
- b.withLink(LinkAnnotation.Clickable("tag", onClick), () => b.append("press"));
202
- });
203
- const { container } = render(React.createElement("span", null, ...renderAnnotatedString(ann)));
204
- const el = container.querySelector('[role="link"]');
205
- fireEvent.keyDown(el, { key: "Enter" });
206
- expect(onClick).toHaveBeenCalledOnce();
207
- });
208
- it("fires the onClick callback on Space keydown", () => {
209
- const onClick = vi.fn();
210
- const ann = buildAnnotatedString(b => {
211
- b.withLink(LinkAnnotation.Clickable("tag", onClick), () => b.append("press"));
212
- });
213
- const { container } = render(React.createElement("span", null, ...renderAnnotatedString(ann)));
214
- const el = container.querySelector('[role="link"]');
215
- fireEvent.keyDown(el, { key: " " });
216
- expect(onClick).toHaveBeenCalledOnce();
217
- });
218
- it("applies SpanStyle color to a styled segment", () => {
219
- const ann = buildAnnotatedString(b => {
220
- b.withStyle({ color: "purple" }, () => b.append("colored"));
221
- });
222
- const { container } = render(React.createElement("span", null, ...renderAnnotatedString(ann)));
223
- const el = container.querySelector("span > span");
224
- expect(el.style.color).toBe("purple");
225
- });
226
- it("applies SpanStyle fontWeight to a styled segment", () => {
227
- const ann = buildAnnotatedString(b => {
228
- b.withStyle({ fontWeight: "bold" }, () => b.append("bold text"));
229
- });
230
- const { container } = render(React.createElement("span", null, ...renderAnnotatedString(ann)));
231
- const el = container.querySelector("span > span");
232
- expect(el.style.fontWeight).toBe("bold");
233
- });
234
- it("applies textDecoration from SpanStyle to a link", () => {
235
- const ann = buildAnnotatedString(b => {
236
- b.withLink(LinkAnnotation.Url("https://a.com"), () => {
237
- b.withStyle({ textDecoration: TextDecoration.Underline }, () => b.append("underlined link"));
238
- });
239
- });
240
- const { container } = render(React.createElement("span", null, ...renderAnnotatedString(ann)));
241
- const a = container.querySelector("a");
242
- expect(a.style.textDecoration).toContain("underline");
243
- });
244
- it("renders unstyled text segments without wrapping spans", () => {
245
- const ann = buildAnnotatedString(b => {
246
- b.append("plain ");
247
- b.withStyle({ color: "red" }, () => b.append("red"));
248
- b.append(" plain");
249
- });
250
- const nodes = renderAnnotatedString(ann);
251
- // First and last nodes should be bare strings, middle a React element
252
- expect(typeof nodes[0]).toBe("string");
253
- expect(typeof nodes[2]).toBe("string");
254
- });
255
- it("handles an AnnotatedString with no spans as a single text node", () => {
256
- const ann = buildAnnotatedString(b => b.append("no spans here"));
257
- const nodes = renderAnnotatedString(ann).filter(Boolean);
258
- expect(nodes).toHaveLength(1);
259
- expect(nodes[0]).toBe("no spans here");
260
- });
261
- });
262
- // ---------------------------------------------------------------------------
263
- // Text component integration
264
- // ---------------------------------------------------------------------------
265
- describe("Text + AnnotatedString integration", () => {
266
- it("renders plain string text unchanged", () => {
267
- render(React.createElement(Text, { text: "plain" }));
268
- expect(screen.getByText("plain")).toBeTruthy();
269
- });
270
- it("renders an AnnotatedString passed via text prop", () => {
271
- const ann = buildAnnotatedString(b => {
272
- b.append("Visit ");
273
- b.withLink(LinkAnnotation.Url("https://jalvin.dev"), () => b.append("Jalvin"));
274
- });
275
- const { container } = render(React.createElement(Text, { text: ann }));
276
- expect(container.querySelector("a")).not.toBeNull();
277
- expect(container.querySelector("a").textContent).toBe("Jalvin");
278
- });
279
- it("renders mixed plain + styled text inside Text", () => {
280
- const ann = buildAnnotatedString(b => {
281
- b.append("Hello ");
282
- b.withStyle({ color: "blue" }, () => b.append("world"));
283
- });
284
- const { container } = render(React.createElement(Text, { text: ann }));
285
- const spans = container.querySelectorAll("span");
286
- // Outer wrapper span + inner styled span
287
- expect(spans.length).toBeGreaterThanOrEqual(2);
288
- });
289
- it("Clickable link inside Text fires callback on click", () => {
290
- const onClick = vi.fn();
291
- const ann = buildAnnotatedString(b => {
292
- b.withLink(LinkAnnotation.Clickable("action", onClick), () => b.append("do it"));
293
- });
294
- const { container } = render(React.createElement(Text, { text: ann }));
295
- const el = container.querySelector('[role="link"]');
296
- fireEvent.click(el);
297
- expect(onClick).toHaveBeenCalledWith("action");
298
- });
299
- it("still supports children when text prop is a plain string", () => {
300
- render(React.createElement(Text, null, "child text"));
301
- expect(screen.getByText("child text")).toBeTruthy();
302
- });
303
- it("Text color prop still applied when text is an AnnotatedString", () => {
304
- const ann = buildAnnotatedString(b => b.append("hello"));
305
- const { container } = render(React.createElement(Text, { text: ann, color: "hotpink" }));
306
- const outer = container.querySelector("span");
307
- expect(outer.style.color).toBe("hotpink");
308
- });
309
- });
310
- //# sourceMappingURL=annotated-string.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"annotated-string.test.js","sourceRoot":"","sources":["../../src/__tests__/annotated-string.test.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=interaction.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interaction.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/interaction.test.ts"],"names":[],"mappings":""}
@@ -1,292 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { renderHook, act } from "@testing-library/react";
3
- import { MutableInteractionSource, useMutableInteractionSource, useIsHovered, useIsPressed, useIsFocused, } from "../interaction.js";
4
- // ── MutableInteractionSource ──────────────────────────────────────────────────
5
- describe("MutableInteractionSource — hover", () => {
6
- it("starts with no active interactions", () => {
7
- const s = new MutableInteractionSource();
8
- expect(s.getInteractions()).toHaveLength(0);
9
- });
10
- it("adds hover.enter on _handleMouseEnter", () => {
11
- const s = new MutableInteractionSource();
12
- s._handleMouseEnter();
13
- expect(s.getInteractions()).toHaveLength(1);
14
- expect(s.getInteractions()[0].type).toBe("hover.enter");
15
- });
16
- it("removes hover.enter on _handleMouseLeave", () => {
17
- const s = new MutableInteractionSource();
18
- s._handleMouseEnter();
19
- s._handleMouseLeave();
20
- expect(s.getInteractions()).toHaveLength(0);
21
- });
22
- it("_handleMouseLeave is a no-op when not hovered", () => {
23
- const s = new MutableInteractionSource();
24
- s._handleMouseLeave();
25
- expect(s.getInteractions()).toHaveLength(0);
26
- });
27
- });
28
- describe("MutableInteractionSource — focus", () => {
29
- it("adds focus.focus on _handleFocus", () => {
30
- const s = new MutableInteractionSource();
31
- s._handleFocus();
32
- expect(s.getInteractions()).toHaveLength(1);
33
- expect(s.getInteractions()[0].type).toBe("focus.focus");
34
- });
35
- it("removes focus.focus on _handleBlur", () => {
36
- const s = new MutableInteractionSource();
37
- s._handleFocus();
38
- s._handleBlur();
39
- expect(s.getInteractions()).toHaveLength(0);
40
- });
41
- it("_handleBlur is a no-op when not focused", () => {
42
- const s = new MutableInteractionSource();
43
- s._handleBlur();
44
- expect(s.getInteractions()).toHaveLength(0);
45
- });
46
- });
47
- describe("MutableInteractionSource — press", () => {
48
- it("adds press.press on _handleMouseDown", () => {
49
- const s = new MutableInteractionSource();
50
- s._handleMouseDown(10, 20);
51
- expect(s.getInteractions()).toHaveLength(1);
52
- const i = s.getInteractions()[0];
53
- expect(i.type).toBe("press.press");
54
- if (i.type === "press.press") {
55
- expect(i.x).toBe(10);
56
- expect(i.y).toBe(20);
57
- }
58
- });
59
- it("removes press.press on _handleMouseUp", () => {
60
- const s = new MutableInteractionSource();
61
- s._handleMouseDown(0, 0);
62
- s._handleMouseUp();
63
- expect(s.getInteractions()).toHaveLength(0);
64
- });
65
- it("removes press.press on _handlePressCancel", () => {
66
- const s = new MutableInteractionSource();
67
- s._handleMouseDown(0, 0);
68
- s._handlePressCancel();
69
- expect(s.getInteractions()).toHaveLength(0);
70
- });
71
- it("_handleMouseUp is a no-op when not pressed", () => {
72
- const s = new MutableInteractionSource();
73
- s._handleMouseUp();
74
- expect(s.getInteractions()).toHaveLength(0);
75
- });
76
- });
77
- describe("MutableInteractionSource — multiple concurrent interactions", () => {
78
- it("tracks hover and press simultaneously", () => {
79
- const s = new MutableInteractionSource();
80
- s._handleMouseEnter();
81
- s._handleMouseDown(5, 5);
82
- expect(s.getInteractions()).toHaveLength(2);
83
- s._handleMouseUp();
84
- expect(s.getInteractions()).toHaveLength(1);
85
- expect(s.getInteractions()[0].type).toBe("hover.enter");
86
- });
87
- it("tracks hover, focus, and press simultaneously", () => {
88
- const s = new MutableInteractionSource();
89
- s._handleMouseEnter();
90
- s._handleFocus();
91
- s._handleMouseDown(0, 0);
92
- expect(s.getInteractions()).toHaveLength(3);
93
- });
94
- });
95
- describe("MutableInteractionSource — subscribe", () => {
96
- it("notifies listener on every state change", () => {
97
- const s = new MutableInteractionSource();
98
- const listener = vi.fn();
99
- s.subscribe(listener);
100
- s._handleMouseEnter();
101
- s._handleMouseLeave();
102
- expect(listener).toHaveBeenCalledTimes(2);
103
- });
104
- it("unsubscribe stops notifications", () => {
105
- const s = new MutableInteractionSource();
106
- const listener = vi.fn();
107
- const unsub = s.subscribe(listener);
108
- s._handleMouseEnter();
109
- unsub();
110
- s._handleMouseLeave();
111
- expect(listener).toHaveBeenCalledTimes(1);
112
- });
113
- it("multiple listeners are all notified", () => {
114
- const s = new MutableInteractionSource();
115
- const a = vi.fn();
116
- const b = vi.fn();
117
- s.subscribe(a);
118
- s.subscribe(b);
119
- s._handleMouseEnter();
120
- expect(a).toHaveBeenCalledTimes(1);
121
- expect(b).toHaveBeenCalledTimes(1);
122
- });
123
- });
124
- // ── useMutableInteractionSource ───────────────────────────────────────────────
125
- describe("useMutableInteractionSource", () => {
126
- it("returns a MutableInteractionSource", () => {
127
- const { result } = renderHook(() => useMutableInteractionSource());
128
- expect(result.current).toBeInstanceOf(MutableInteractionSource);
129
- });
130
- it("returns the same instance across re-renders", () => {
131
- const { result, rerender } = renderHook(() => useMutableInteractionSource());
132
- const first = result.current;
133
- rerender();
134
- expect(result.current).toBe(first);
135
- });
136
- });
137
- // ── useIsHovered ──────────────────────────────────────────────────────────────
138
- describe("useIsHovered", () => {
139
- it("starts as false", () => {
140
- const source = new MutableInteractionSource();
141
- const { result } = renderHook(() => useIsHovered(source));
142
- expect(result.current).toBe(false);
143
- });
144
- it("becomes true after _handleMouseEnter", () => {
145
- const source = new MutableInteractionSource();
146
- const { result } = renderHook(() => useIsHovered(source));
147
- act(() => { source._handleMouseEnter(); });
148
- expect(result.current).toBe(true);
149
- });
150
- it("returns to false after _handleMouseLeave", () => {
151
- const source = new MutableInteractionSource();
152
- const { result } = renderHook(() => useIsHovered(source));
153
- act(() => { source._handleMouseEnter(); });
154
- act(() => { source._handleMouseLeave(); });
155
- expect(result.current).toBe(false);
156
- });
157
- it("reflects pre-existing hover state on mount", () => {
158
- const source = new MutableInteractionSource();
159
- source._handleMouseEnter();
160
- const { result } = renderHook(() => useIsHovered(source));
161
- expect(result.current).toBe(true);
162
- });
163
- });
164
- // ── useIsFocused ──────────────────────────────────────────────────────────────
165
- describe("useIsFocused", () => {
166
- it("starts as false", () => {
167
- const source = new MutableInteractionSource();
168
- const { result } = renderHook(() => useIsFocused(source));
169
- expect(result.current).toBe(false);
170
- });
171
- it("becomes true after _handleFocus", () => {
172
- const source = new MutableInteractionSource();
173
- const { result } = renderHook(() => useIsFocused(source));
174
- act(() => { source._handleFocus(); });
175
- expect(result.current).toBe(true);
176
- });
177
- it("returns to false after _handleBlur", () => {
178
- const source = new MutableInteractionSource();
179
- const { result } = renderHook(() => useIsFocused(source));
180
- act(() => { source._handleFocus(); });
181
- act(() => { source._handleBlur(); });
182
- expect(result.current).toBe(false);
183
- });
184
- });
185
- // ── useIsPressed ──────────────────────────────────────────────────────────────
186
- describe("useIsPressed", () => {
187
- it("starts as false", () => {
188
- const source = new MutableInteractionSource();
189
- const { result } = renderHook(() => useIsPressed(source));
190
- expect(result.current).toBe(false);
191
- });
192
- it("becomes true after _handleMouseDown", () => {
193
- const source = new MutableInteractionSource();
194
- const { result } = renderHook(() => useIsPressed(source));
195
- act(() => { source._handleMouseDown(0, 0); });
196
- expect(result.current).toBe(true);
197
- });
198
- it("returns to false after _handleMouseUp", () => {
199
- const source = new MutableInteractionSource();
200
- const { result } = renderHook(() => useIsPressed(source));
201
- act(() => { source._handleMouseDown(0, 0); });
202
- act(() => { source._handleMouseUp(); });
203
- expect(result.current).toBe(false);
204
- });
205
- it("returns to false after _handlePressCancel", () => {
206
- const source = new MutableInteractionSource();
207
- const { result } = renderHook(() => useIsPressed(source));
208
- act(() => { source._handleMouseDown(0, 0); });
209
- act(() => { source._handlePressCancel(); });
210
- expect(result.current).toBe(false);
211
- });
212
- });
213
- // ── MutableInteractionSource — touch ─────────────────────────────────────────
214
- describe("MutableInteractionSource — touch (_handleTouchStart)", () => {
215
- it("adds hover.enter and press.press on touch start", () => {
216
- const s = new MutableInteractionSource();
217
- s._handleTouchStart(10, 20);
218
- const types = s.getInteractions().map(i => i.type);
219
- expect(types).toContain("hover.enter");
220
- expect(types).toContain("press.press");
221
- expect(s.getInteractions()).toHaveLength(2);
222
- });
223
- it("records the correct touch coordinates", () => {
224
- const s = new MutableInteractionSource();
225
- s._handleTouchStart(42, 84);
226
- const press = s.getInteractions().find(i => i.type === "press.press");
227
- expect(press).toBeDefined();
228
- if (press?.type === "press.press") {
229
- expect(press.x).toBe(42);
230
- expect(press.y).toBe(84);
231
- }
232
- });
233
- it("does not add a second hover.enter if already hovered", () => {
234
- const s = new MutableInteractionSource();
235
- s._handleMouseEnter(); // already hovered
236
- s._handleTouchStart(0, 0);
237
- const hoverEntries = s.getInteractions().filter(i => i.type === "hover.enter");
238
- expect(hoverEntries).toHaveLength(1);
239
- });
240
- });
241
- describe("MutableInteractionSource — touch (_handleTouchEnd)", () => {
242
- it("clears both press and hover on touch end", () => {
243
- const s = new MutableInteractionSource();
244
- s._handleTouchStart(0, 0);
245
- s._handleTouchEnd();
246
- expect(s.getInteractions()).toHaveLength(0);
247
- });
248
- it("is a no-op when called without a preceding touch start", () => {
249
- const s = new MutableInteractionSource();
250
- s._handleTouchEnd();
251
- expect(s.getInteractions()).toHaveLength(0);
252
- });
253
- });
254
- describe("MutableInteractionSource — touch (_handleTouchCancel)", () => {
255
- it("clears both press and hover on touch cancel", () => {
256
- const s = new MutableInteractionSource();
257
- s._handleTouchStart(0, 0);
258
- s._handleTouchCancel();
259
- expect(s.getInteractions()).toHaveLength(0);
260
- });
261
- it("is a no-op when called without a preceding touch start", () => {
262
- const s = new MutableInteractionSource();
263
- s._handleTouchCancel();
264
- expect(s.getInteractions()).toHaveLength(0);
265
- });
266
- });
267
- describe("MutableInteractionSource — touch (hooks)", () => {
268
- it("useIsPressed becomes true on touch start and false on touch end", () => {
269
- const source = new MutableInteractionSource();
270
- const { result } = renderHook(() => useIsPressed(source));
271
- act(() => { source._handleTouchStart(0, 0); });
272
- expect(result.current).toBe(true);
273
- act(() => { source._handleTouchEnd(); });
274
- expect(result.current).toBe(false);
275
- });
276
- it("useIsHovered becomes true on touch start and false on touch end", () => {
277
- const source = new MutableInteractionSource();
278
- const { result } = renderHook(() => useIsHovered(source));
279
- act(() => { source._handleTouchStart(0, 0); });
280
- expect(result.current).toBe(true);
281
- act(() => { source._handleTouchEnd(); });
282
- expect(result.current).toBe(false);
283
- });
284
- it("useIsPressed becomes false on touch cancel", () => {
285
- const source = new MutableInteractionSource();
286
- const { result } = renderHook(() => useIsPressed(source));
287
- act(() => { source._handleTouchStart(0, 0); });
288
- act(() => { source._handleTouchCancel(); });
289
- expect(result.current).toBe(false);
290
- });
291
- });
292
- //# sourceMappingURL=interaction.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interaction.test.js","sourceRoot":"","sources":["../../src/__tests__/interaction.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=modifier.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"modifier.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/modifier.test.ts"],"names":[],"mappings":""}
@@ -1,189 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { Modifier } from "../modifier.js";
3
- import { MutableInteractionSource } from "../interaction.js";
4
- // ── Basic styles (regression guard) ──────────────────────────────────────────
5
- describe("Modifier — basic styles", () => {
6
- it("Default produces empty props", () => {
7
- const props = Modifier.Default.toProps();
8
- expect(props.style).toBeUndefined();
9
- expect(props.className).toBeUndefined();
10
- });
11
- it("fillMaxWidth sets width 100%", () => {
12
- expect(Modifier.fillMaxWidth().toProps().style?.width).toBe("100%");
13
- });
14
- it("padding with number appends px", () => {
15
- expect(Modifier.padding(16).toProps().style?.padding).toBe("16px");
16
- });
17
- it("padding with string passes through", () => {
18
- expect(Modifier.padding("1rem").toProps().style?.padding).toBe("1rem");
19
- });
20
- it("background sets backgroundColor", () => {
21
- expect(Modifier.background("#fff").toProps().style?.backgroundColor).toBe("#fff");
22
- });
23
- it("className is recorded", () => {
24
- expect(Modifier.className("foo").toProps().className).toBe("foo");
25
- });
26
- it("then() merges styles, later wins", () => {
27
- const m = Modifier.background("#aaa").then(Modifier.background("#bbb"));
28
- expect(m.toProps().style?.backgroundColor).toBe("#bbb");
29
- });
30
- it("then() concatenates classNames", () => {
31
- const m = Modifier.className("a").then(Modifier.className("b"));
32
- expect(m.toProps().className).toBe("a b");
33
- });
34
- });
35
- // ── hoverable ─────────────────────────────────────────────────────────────────
36
- describe("Modifier.hoverable", () => {
37
- it("toProps exposes onMouseEnter and onMouseLeave", () => {
38
- const source = new MutableInteractionSource();
39
- const props = Modifier.hoverable(source).toProps();
40
- expect(typeof props.onMouseEnter).toBe("function");
41
- expect(typeof props.onMouseLeave).toBe("function");
42
- });
43
- it("onMouseEnter triggers _handleMouseEnter on the source", () => {
44
- const source = new MutableInteractionSource();
45
- const { onMouseEnter } = Modifier.hoverable(source).toProps();
46
- onMouseEnter();
47
- expect(source.getInteractions()[0]?.type).toBe("hover.enter");
48
- });
49
- it("onMouseLeave triggers _handleMouseLeave on the source", () => {
50
- const source = new MutableInteractionSource();
51
- const { onMouseEnter, onMouseLeave } = Modifier.hoverable(source).toProps();
52
- onMouseEnter();
53
- onMouseLeave();
54
- expect(source.getInteractions()).toHaveLength(0);
55
- });
56
- it("does not expose focus or press handlers", () => {
57
- const source = new MutableInteractionSource();
58
- const props = Modifier.hoverable(source).toProps();
59
- expect(props.onFocus).toBeUndefined();
60
- expect(props.onBlur).toBeUndefined();
61
- expect(props.onMouseDown).toBeUndefined();
62
- expect(props.onMouseUp).toBeUndefined();
63
- });
64
- it("static factory produces same result as instance method", () => {
65
- const source = new MutableInteractionSource();
66
- const a = Modifier.hoverable(source).toProps();
67
- const b = Modifier.Default.hoverable(source).toProps();
68
- expect(typeof a.onMouseEnter).toBe(typeof b.onMouseEnter);
69
- });
70
- });
71
- // ── focusable ─────────────────────────────────────────────────────────────────
72
- describe("Modifier.focusable", () => {
73
- it("toProps exposes onFocus and onBlur", () => {
74
- const source = new MutableInteractionSource();
75
- const props = Modifier.focusable(source).toProps();
76
- expect(typeof props.onFocus).toBe("function");
77
- expect(typeof props.onBlur).toBe("function");
78
- });
79
- it("onFocus triggers _handleFocus", () => {
80
- const source = new MutableInteractionSource();
81
- const { onFocus } = Modifier.focusable(source).toProps();
82
- onFocus();
83
- expect(source.getInteractions()[0]?.type).toBe("focus.focus");
84
- });
85
- it("onBlur triggers _handleBlur", () => {
86
- const source = new MutableInteractionSource();
87
- const { onFocus, onBlur } = Modifier.focusable(source).toProps();
88
- onFocus();
89
- onBlur();
90
- expect(source.getInteractions()).toHaveLength(0);
91
- });
92
- it("does not expose hover or press handlers", () => {
93
- const source = new MutableInteractionSource();
94
- const props = Modifier.focusable(source).toProps();
95
- expect(props.onMouseEnter).toBeUndefined();
96
- expect(props.onMouseLeave).toBeUndefined();
97
- expect(props.onMouseDown).toBeUndefined();
98
- expect(props.onMouseUp).toBeUndefined();
99
- });
100
- });
101
- // ── pressable ─────────────────────────────────────────────────────────────────
102
- describe("Modifier.pressable", () => {
103
- it("toProps exposes onMouseDown and onMouseUp", () => {
104
- const source = new MutableInteractionSource();
105
- const props = Modifier.pressable(source).toProps();
106
- expect(typeof props.onMouseDown).toBe("function");
107
- expect(typeof props.onMouseUp).toBe("function");
108
- });
109
- it("onMouseDown triggers _handleMouseDown with coordinates", () => {
110
- const source = new MutableInteractionSource();
111
- const { onMouseDown } = Modifier.pressable(source).toProps();
112
- onMouseDown({ clientX: 42, clientY: 7 });
113
- const i = source.getInteractions()[0];
114
- expect(i.type).toBe("press.press");
115
- if (i.type === "press.press") {
116
- expect(i.x).toBe(42);
117
- expect(i.y).toBe(7);
118
- }
119
- });
120
- it("onMouseUp triggers _handleMouseUp", () => {
121
- const source = new MutableInteractionSource();
122
- const { onMouseDown, onMouseUp } = Modifier.pressable(source).toProps();
123
- onMouseDown({ clientX: 0, clientY: 0 });
124
- onMouseUp();
125
- expect(source.getInteractions()).toHaveLength(0);
126
- });
127
- it("onMouseLeave also cancels the press", () => {
128
- const source = new MutableInteractionSource();
129
- const { onMouseDown, onMouseLeave } = Modifier.pressable(source).toProps();
130
- onMouseDown({ clientX: 0, clientY: 0 });
131
- onMouseLeave();
132
- expect(source.getInteractions()).toHaveLength(0);
133
- });
134
- });
135
- // ── combining modifiers on one source ─────────────────────────────────────────
136
- describe("Modifier — combining hoverable + focusable + pressable on one source", () => {
137
- it("all three handlers are present", () => {
138
- const source = new MutableInteractionSource();
139
- const props = Modifier.hoverable(source).focusable(source).pressable(source).toProps();
140
- expect(typeof props.onMouseEnter).toBe("function");
141
- expect(typeof props.onMouseLeave).toBe("function");
142
- expect(typeof props.onFocus).toBe("function");
143
- expect(typeof props.onBlur).toBe("function");
144
- expect(typeof props.onMouseDown).toBe("function");
145
- expect(typeof props.onMouseUp).toBe("function");
146
- });
147
- it("onMouseLeave cancels both hover and press when both are active", () => {
148
- const source = new MutableInteractionSource();
149
- const props = Modifier.hoverable(source).pressable(source).toProps();
150
- props.onMouseEnter();
151
- props.onMouseDown({ clientX: 0, clientY: 0 });
152
- expect(source.getInteractions()).toHaveLength(2);
153
- props.onMouseLeave();
154
- expect(source.getInteractions()).toHaveLength(0);
155
- });
156
- it("interaction source is preserved through style chain", () => {
157
- const source = new MutableInteractionSource();
158
- const props = Modifier.hoverable(source).background("#fff").padding(8).toProps();
159
- expect(typeof props.onMouseEnter).toBe("function");
160
- expect(props.style?.backgroundColor).toBe("#fff");
161
- expect(props.style?.padding).toBe("8px");
162
- });
163
- });
164
- // ── then() with interaction sources ──────────────────────────────────────────
165
- describe("Modifier.then — interaction source merging", () => {
166
- it("then() inherits interaction source from left when right has none", () => {
167
- const source = new MutableInteractionSource();
168
- const merged = Modifier.hoverable(source).then(Modifier.background("#fff"));
169
- const props = merged.toProps();
170
- expect(typeof props.onMouseEnter).toBe("function");
171
- });
172
- it("then() prefers right-hand interaction source", () => {
173
- const a = new MutableInteractionSource();
174
- const b = new MutableInteractionSource();
175
- const merged = Modifier.hoverable(a).then(Modifier.hoverable(b));
176
- const props = merged.toProps();
177
- props.onMouseEnter();
178
- expect(b.getInteractions()[0]?.type).toBe("hover.enter");
179
- expect(a.getInteractions()).toHaveLength(0);
180
- });
181
- it("then() merges flags from both sides", () => {
182
- const source = new MutableInteractionSource();
183
- const merged = Modifier.hoverable(source).then(Modifier.focusable(source));
184
- const props = merged.toProps();
185
- expect(typeof props.onMouseEnter).toBe("function");
186
- expect(typeof props.onFocus).toBe("function");
187
- });
188
- });
189
- //# sourceMappingURL=modifier.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"modifier.test.js","sourceRoot":"","sources":["../../src/__tests__/modifier.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import "@testing-library/jest-dom";
2
- //# sourceMappingURL=setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
@@ -1,2 +0,0 @@
1
- import "@testing-library/jest-dom";
2
- //# sourceMappingURL=setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=text.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/text.test.tsx"],"names":[],"mappings":""}
@@ -1,62 +0,0 @@
1
- import React from "react";
2
- import { describe, it, expect } from "vitest";
3
- import { render, screen } from "@testing-library/react";
4
- import { Text } from "../text.js";
5
- import { TextStyle } from "../typography.js";
6
- describe("Text", () => {
7
- it("renders a span by default", () => {
8
- const { container } = render(React.createElement(Text, { text: "hello" }));
9
- expect(container.querySelector("span")).not.toBeNull();
10
- });
11
- it("renders text from the text prop", () => {
12
- render(React.createElement(Text, { text: "hello world" }));
13
- expect(screen.getByText("hello world")).toBeTruthy();
14
- });
15
- it("renders text from children", () => {
16
- render(React.createElement(Text, null, "from children"));
17
- expect(screen.getByText("from children")).toBeTruthy();
18
- });
19
- it("text prop takes priority over children when both provided", () => {
20
- render(React.createElement(Text, { text: "explicit" }, "child"));
21
- expect(screen.getByText("explicit")).toBeTruthy();
22
- expect(screen.queryByText("child")).toBeNull();
23
- });
24
- it("applies color prop as inline style", () => {
25
- const { container } = render(React.createElement(Text, { text: "hi", color: "red" }));
26
- const el = container.querySelector("span");
27
- expect(el.style.color).toBe("red");
28
- });
29
- it("applies TextStyle.h1 typography via style prop", () => {
30
- const { container } = render(React.createElement(Text, { text: "headline", style: TextStyle.h1 }));
31
- const el = container.querySelector("span");
32
- expect(el.style.fontSize).toBe("2rem");
33
- expect(el.style.fontWeight).toBe("bold");
34
- });
35
- it("applies TextStyle.bodyLarge via style prop", () => {
36
- const { container } = render(React.createElement(Text, { text: "body", style: TextStyle.bodyLarge }));
37
- const el = container.querySelector("span");
38
- expect(el.style.fontSize).toBe("1rem");
39
- });
40
- it("applies maxLines clamp styles", () => {
41
- const { container } = render(React.createElement(Text, { text: "clamp me", maxLines: 2 }));
42
- const el = container.querySelector("span");
43
- expect(el.style.overflow).toBe("hidden");
44
- expect(el.style.webkitLineClamp).toBe("2");
45
- });
46
- it("color prop overrides style color", () => {
47
- const { container } = render(React.createElement(Text, {
48
- text: "hi",
49
- style: { fontSize: "1rem", fontWeight: 400, lineHeight: "1.5rem", color: "blue" },
50
- color: "green",
51
- }));
52
- const el = container.querySelector("span");
53
- expect(el.style.color).toBe("green");
54
- });
55
- it("does not render any tag other than span", () => {
56
- const { container } = render(React.createElement(Text, { text: "x" }));
57
- expect(container.querySelector("p")).toBeNull();
58
- expect(container.querySelector("h1")).toBeNull();
59
- expect(container.querySelector("pre")).toBeNull();
60
- });
61
- });
62
- //# sourceMappingURL=text.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text.test.js","sourceRoot":"","sources":["../../src/__tests__/text.test.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=windowsizeclass.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"windowsizeclass.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/windowsizeclass.test.ts"],"names":[],"mappings":""}
@@ -1,141 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- import { renderHook, act } from "@testing-library/react";
3
- import React from "react";
4
- import { calculateWindowSizeClass, WindowSizeClassProvider } from "@jalvin/runtime";
5
- function setWindowSize(width, height) {
6
- Object.defineProperty(window, "innerWidth", { writable: true, configurable: true, value: width });
7
- Object.defineProperty(window, "innerHeight", { writable: true, configurable: true, value: height });
8
- }
9
- function fireResize() {
10
- window.dispatchEvent(new Event("resize"));
11
- }
12
- /** Wraps the hook under test with WindowSizeClassProvider. */
13
- const wrapper = ({ children }) => React.createElement(WindowSizeClassProvider, null, children);
14
- describe("calculateWindowSizeClass", () => {
15
- beforeEach(() => {
16
- setWindowSize(1280, 800);
17
- });
18
- afterEach(() => {
19
- vi.restoreAllMocks();
20
- });
21
- // ── initial class from window size ─────────────────────────────────────────
22
- it("returns Compact/Medium for a phone-sized window (360×640)", () => {
23
- setWindowSize(360, 640);
24
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
25
- expect(result.current.widthSizeClass).toBe("Compact");
26
- expect(result.current.heightSizeClass).toBe("Medium");
27
- });
28
- it("returns Medium/Compact for a landscape phone (667×375)", () => {
29
- setWindowSize(667, 375);
30
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
31
- expect(result.current.widthSizeClass).toBe("Medium");
32
- expect(result.current.heightSizeClass).toBe("Compact");
33
- });
34
- it("returns Medium/Expanded for a tablet-sized window (768×1024)", () => {
35
- setWindowSize(768, 1024);
36
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
37
- expect(result.current.widthSizeClass).toBe("Medium");
38
- expect(result.current.heightSizeClass).toBe("Expanded");
39
- });
40
- it("returns Expanded/Medium for a desktop window (1280×800)", () => {
41
- setWindowSize(1280, 800);
42
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
43
- expect(result.current.widthSizeClass).toBe("Expanded");
44
- expect(result.current.heightSizeClass).toBe("Medium");
45
- });
46
- // ── class boundaries ───────────────────────────────────────────────────────
47
- it("width at exactly 600 is Medium", () => {
48
- setWindowSize(600, 800);
49
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
50
- expect(result.current.widthSizeClass).toBe("Medium");
51
- });
52
- it("width at exactly 840 is Expanded", () => {
53
- setWindowSize(840, 800);
54
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
55
- expect(result.current.widthSizeClass).toBe("Expanded");
56
- });
57
- it("height at exactly 480 is Medium", () => {
58
- setWindowSize(400, 480);
59
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
60
- expect(result.current.heightSizeClass).toBe("Medium");
61
- });
62
- it("height at exactly 900 is Expanded", () => {
63
- setWindowSize(400, 900);
64
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
65
- expect(result.current.heightSizeClass).toBe("Expanded");
66
- });
67
- // ── reactivity on resize ───────────────────────────────────────────────────
68
- it("updates widthSizeClass when window crosses a breakpoint", () => {
69
- setWindowSize(400, 800); // Compact
70
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
71
- expect(result.current.widthSizeClass).toBe("Compact");
72
- act(() => {
73
- setWindowSize(700, 800); // Medium
74
- fireResize();
75
- });
76
- expect(result.current.widthSizeClass).toBe("Medium");
77
- act(() => {
78
- setWindowSize(1280, 800); // Expanded
79
- fireResize();
80
- });
81
- expect(result.current.widthSizeClass).toBe("Expanded");
82
- });
83
- it("updates heightSizeClass when window crosses a breakpoint", () => {
84
- setWindowSize(800, 400); // Compact height
85
- const { result } = renderHook(() => calculateWindowSizeClass(), { wrapper });
86
- expect(result.current.heightSizeClass).toBe("Compact");
87
- act(() => {
88
- setWindowSize(800, 700); // Medium height
89
- fireResize();
90
- });
91
- expect(result.current.heightSizeClass).toBe("Medium");
92
- });
93
- it("does not re-render consumers when resize stays within the same class", () => {
94
- setWindowSize(400, 800);
95
- let renderCount = 0;
96
- const { result } = renderHook(() => {
97
- renderCount++;
98
- return calculateWindowSizeClass();
99
- }, { wrapper });
100
- const baseRenders = renderCount;
101
- act(() => {
102
- setWindowSize(450, 800); // still Compact — no class change
103
- fireResize();
104
- });
105
- expect(result.current.widthSizeClass).toBe("Compact");
106
- expect(renderCount).toBe(baseRenders);
107
- });
108
- // ── single listener (regression for multi-consumer crash) ─────────────────
109
- it("registers only ONE resize listener even when multiple consumers call the hook", () => {
110
- const addSpy = vi.spyOn(window, "addEventListener");
111
- setWindowSize(1280, 800);
112
- // Two independent hooks, both under the same provider.
113
- renderHook(() => {
114
- calculateWindowSizeClass(); // consumer 1
115
- calculateWindowSizeClass(); // consumer 2
116
- }, { wrapper });
117
- const resizeListenerCount = addSpy.mock.calls.filter(([event]) => event === "resize").length;
118
- expect(resizeListenerCount).toBe(1);
119
- });
120
- it("both consumers see the same updated class after a single resize event", () => {
121
- setWindowSize(400, 800); // Compact
122
- const { result } = renderHook(() => ({
123
- a: calculateWindowSizeClass(),
124
- b: calculateWindowSizeClass(),
125
- }), { wrapper });
126
- act(() => {
127
- setWindowSize(1280, 800); // Expanded
128
- fireResize();
129
- });
130
- expect(result.current.a.widthSizeClass).toBe("Expanded");
131
- expect(result.current.b.widthSizeClass).toBe("Expanded");
132
- });
133
- // ── cleanup ────────────────────────────────────────────────────────────────
134
- it("removes the resize listener when the provider unmounts", () => {
135
- const removeSpy = vi.spyOn(window, "removeEventListener");
136
- const { unmount } = renderHook(() => calculateWindowSizeClass(), { wrapper });
137
- unmount();
138
- expect(removeSpy).toHaveBeenCalledWith("resize", expect.any(Function));
139
- });
140
- });
141
- //# sourceMappingURL=windowsizeclass.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"windowsizeclass.test.js","sourceRoot":"","sources":["../../src/__tests__/windowsizeclass.test.ts"],"names":[],"mappings":"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"}