@jalvin/ui 2.0.46 → 2.0.47

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 (41) hide show
  1. package/dist/__tests__/annotated-string.test.d.ts +2 -0
  2. package/dist/__tests__/annotated-string.test.d.ts.map +1 -0
  3. package/dist/__tests__/annotated-string.test.js +297 -0
  4. package/dist/__tests__/annotated-string.test.js.map +1 -0
  5. package/dist/__tests__/children-signature.test.d.ts +2 -0
  6. package/dist/__tests__/children-signature.test.d.ts.map +1 -0
  7. package/dist/__tests__/children-signature.test.js +106 -0
  8. package/dist/__tests__/children-signature.test.js.map +1 -0
  9. package/dist/__tests__/interaction.test.d.ts +2 -0
  10. package/dist/__tests__/interaction.test.d.ts.map +1 -0
  11. package/dist/__tests__/interaction.test.js +309 -0
  12. package/dist/__tests__/interaction.test.js.map +1 -0
  13. package/dist/__tests__/modifier.test.d.ts +2 -0
  14. package/dist/__tests__/modifier.test.d.ts.map +1 -0
  15. package/dist/__tests__/modifier.test.js +189 -0
  16. package/dist/__tests__/modifier.test.js.map +1 -0
  17. package/dist/__tests__/setup.d.ts +2 -0
  18. package/dist/__tests__/setup.d.ts.map +1 -0
  19. package/dist/__tests__/setup.js +2 -0
  20. package/dist/__tests__/setup.js.map +1 -0
  21. package/dist/__tests__/text.test.d.ts +2 -0
  22. package/dist/__tests__/text.test.d.ts.map +1 -0
  23. package/dist/__tests__/text.test.js +68 -0
  24. package/dist/__tests__/text.test.js.map +1 -0
  25. package/dist/__tests__/windowsizeclass.test.d.ts +2 -0
  26. package/dist/__tests__/windowsizeclass.test.d.ts.map +1 -0
  27. package/dist/__tests__/windowsizeclass.test.js +132 -0
  28. package/dist/__tests__/windowsizeclass.test.js.map +1 -0
  29. package/dist/canvas.d.ts +2 -1
  30. package/dist/canvas.d.ts.map +1 -1
  31. package/dist/canvas.js +51 -28
  32. package/dist/canvas.js.map +1 -1
  33. package/dist/image.d.ts +6 -4
  34. package/dist/image.d.ts.map +1 -1
  35. package/dist/image.js +22 -29
  36. package/dist/image.js.map +1 -1
  37. package/dist/layout.d.ts +7 -5
  38. package/dist/layout.d.ts.map +1 -1
  39. package/dist/layout.js +9 -3
  40. package/dist/layout.js.map +1 -1
  41. package/package.json +2 -2
@@ -0,0 +1,2 @@
1
+ import "@testing-library/jest-dom";
2
+ //# sourceMappingURL=annotated-string.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotated-string.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/annotated-string.test.ts"],"names":[],"mappings":"AAEA,OAAO,2BAA2B,CAAC"}
@@ -0,0 +1,297 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { screen, fireEvent } from "@testing-library/dom";
3
+ import "@testing-library/jest-dom";
4
+ import { buildAnnotatedString, LinkAnnotation, TextDecoration, renderAnnotatedString, } from "../annotated-string.js";
5
+ import { Text } from "../text.js";
6
+ import { jalvinCreateElement } from "@jalvin/runtime";
7
+ /** Helper to render a node to the document body for testing. */
8
+ function render(node) {
9
+ document.body.innerHTML = "";
10
+ document.body.appendChild(node);
11
+ return { container: document.body };
12
+ }
13
+ // ---------------------------------------------------------------------------
14
+ // TextDecoration
15
+ // ---------------------------------------------------------------------------
16
+ describe("TextDecoration", () => {
17
+ it("None produces no CSS value", () => {
18
+ expect(TextDecoration.None.toCSSValue()).toBeUndefined();
19
+ });
20
+ it("Underline produces 'underline'", () => {
21
+ expect(TextDecoration.Underline.toCSSValue()).toBe("underline");
22
+ });
23
+ it("LineThrough produces 'line-through'", () => {
24
+ expect(TextDecoration.LineThrough.toCSSValue()).toBe("line-through");
25
+ });
26
+ it("Underline + LineThrough produces 'underline line-through'", () => {
27
+ const combined = TextDecoration.Underline.plus(TextDecoration.LineThrough);
28
+ expect(combined.toCSSValue()).toBe("underline line-through");
29
+ });
30
+ it("combining with None is a no-op", () => {
31
+ const combined = TextDecoration.Underline.plus(TextDecoration.None);
32
+ expect(combined.toCSSValue()).toBe("underline");
33
+ });
34
+ });
35
+ // ---------------------------------------------------------------------------
36
+ // buildAnnotatedString — builder mechanics
37
+ // ---------------------------------------------------------------------------
38
+ describe("buildAnnotatedString — builder mechanics", () => {
39
+ it("produces plain text with no spans", () => {
40
+ const ann = buildAnnotatedString(b => b.append("hello"));
41
+ expect(ann.text).toBe("hello");
42
+ expect(ann.spanStyles).toHaveLength(0);
43
+ expect(ann.linkAnnotations).toHaveLength(0);
44
+ });
45
+ it("records correct start/end for withStyle", () => {
46
+ const ann = buildAnnotatedString(b => {
47
+ b.append("ab");
48
+ b.withStyle({ color: "red" }, () => b.append("cd"));
49
+ b.append("ef");
50
+ });
51
+ expect(ann.text).toBe("abcdef");
52
+ const span = ann.spanStyles[0];
53
+ expect(span.start).toBe(2);
54
+ expect(span.end).toBe(4);
55
+ expect(span.item.color).toBe("red");
56
+ });
57
+ it("records correct start/end for withLink (Url)", () => {
58
+ const ann = buildAnnotatedString(b => {
59
+ b.append("go ");
60
+ b.withLink(LinkAnnotation.Url("https://example.com"), () => b.append("here"));
61
+ });
62
+ expect(ann.text).toBe("go here");
63
+ const link = ann.linkAnnotations[0];
64
+ expect(link.start).toBe(3);
65
+ expect(link.end).toBe(7);
66
+ expect(link.item.type).toBe("url");
67
+ });
68
+ it("records correct start/end for withLink (Clickable)", () => {
69
+ const onClick = vi.fn();
70
+ const ann = buildAnnotatedString(b => {
71
+ b.withLink(LinkAnnotation.Clickable("tag1", onClick), () => b.append("click me"));
72
+ });
73
+ const link = ann.linkAnnotations[0];
74
+ expect(link.start).toBe(0);
75
+ expect(link.end).toBe(8);
76
+ expect(link.item.type).toBe("clickable");
77
+ });
78
+ it("addStyle applies span to an explicit range", () => {
79
+ const ann = buildAnnotatedString(b => {
80
+ b.append("hello world");
81
+ b.addStyle({ fontWeight: "bold" }, 6, 11);
82
+ });
83
+ const span = ann.spanStyles[0];
84
+ expect(span.start).toBe(6);
85
+ expect(span.end).toBe(11);
86
+ expect(span.item.fontWeight).toBe("bold");
87
+ });
88
+ it("addLink applies a link to an explicit range", () => {
89
+ const ann = buildAnnotatedString(b => {
90
+ b.append("visit docs now");
91
+ b.addLink(LinkAnnotation.Url("https://docs.example.com"), 6, 10);
92
+ });
93
+ const link = ann.linkAnnotations[0];
94
+ expect(link.start).toBe(6);
95
+ expect(link.end).toBe(10);
96
+ });
97
+ it("appending another AnnotatedString shifts offsets correctly", () => {
98
+ const inner = buildAnnotatedString(b => {
99
+ b.withStyle({ color: "blue" }, () => b.append("blue"));
100
+ });
101
+ const outer = buildAnnotatedString(b => {
102
+ b.append("abc ");
103
+ b.append(inner);
104
+ });
105
+ expect(outer.text).toBe("abc blue");
106
+ const span = outer.spanStyles[0];
107
+ expect(span.start).toBe(4);
108
+ expect(span.end).toBe(8);
109
+ });
110
+ it("nested withStyle pushes two spans", () => {
111
+ const ann = buildAnnotatedString(b => {
112
+ b.withStyle({ fontWeight: "bold" }, () => {
113
+ b.withStyle({ color: "red" }, () => b.append("x"));
114
+ });
115
+ });
116
+ expect(ann.spanStyles).toHaveLength(2);
117
+ });
118
+ it("unclosed pushStyle is flushed on build", () => {
119
+ const ann = buildAnnotatedString(b => {
120
+ b.pushStyle({ color: "green" });
121
+ b.append("test");
122
+ // no pop() — build() should flush it
123
+ });
124
+ expect(ann.spanStyles).toHaveLength(1);
125
+ expect(ann.spanStyles[0].end).toBe(4);
126
+ });
127
+ it("multiple sequential appends produce correct full text", () => {
128
+ const ann = buildAnnotatedString(b => {
129
+ b.append("one");
130
+ b.append(" ");
131
+ b.append("two");
132
+ });
133
+ expect(ann.text).toBe("one two");
134
+ });
135
+ });
136
+ // ---------------------------------------------------------------------------
137
+ // LinkAnnotation factory
138
+ // ---------------------------------------------------------------------------
139
+ describe("LinkAnnotation", () => {
140
+ it("Url stores url and type", () => {
141
+ const link = LinkAnnotation.Url("https://example.com");
142
+ expect(link.type).toBe("url");
143
+ if (link.type === "url")
144
+ expect(link.url).toBe("https://example.com");
145
+ });
146
+ it("Url accepts optional styles", () => {
147
+ const styles = { style: { color: "#00f" } };
148
+ const link = LinkAnnotation.Url("https://a.com", styles);
149
+ expect(link.styles).toBe(styles);
150
+ });
151
+ it("Clickable stores tag, type, and callback", () => {
152
+ const fn = vi.fn();
153
+ const link = LinkAnnotation.Clickable("my-tag", fn);
154
+ expect(link.type).toBe("clickable");
155
+ if (link.type === "clickable") {
156
+ expect(link.tag).toBe("my-tag");
157
+ expect(link.onClick).toBe(fn);
158
+ }
159
+ });
160
+ });
161
+ // ---------------------------------------------------------------------------
162
+ // renderAnnotatedString
163
+ // ---------------------------------------------------------------------------
164
+ describe("renderAnnotatedString", () => {
165
+ it("returns a single string node for plain text with no spans", () => {
166
+ const ann = buildAnnotatedString(b => b.append("plain"));
167
+ const nodes = renderAnnotatedString(ann);
168
+ // Filters out nulls; for unstyled plain text a bare string is returned
169
+ const text = nodes.map(n => n.textContent).join("");
170
+ expect(text).toBe("plain");
171
+ });
172
+ it("renders a Url link as an <a> tag", () => {
173
+ const ann = buildAnnotatedString(b => {
174
+ b.withLink(LinkAnnotation.Url("https://example.com"), () => b.append("click"));
175
+ });
176
+ const { container } = render(jalvinCreateElement("span", {}, renderAnnotatedString(ann)));
177
+ const a = container.querySelector("a");
178
+ expect(a).not.toBeNull();
179
+ expect(a.href).toBe("https://example.com/");
180
+ expect(a.target).toBe("_blank");
181
+ expect(a.rel).toContain("noopener");
182
+ expect(a.textContent).toBe("click");
183
+ });
184
+ it("renders a Clickable link as a <span role=link>", () => {
185
+ const onClick = vi.fn();
186
+ const ann = buildAnnotatedString(b => {
187
+ b.withLink(LinkAnnotation.Clickable("open", onClick), () => b.append("open dialog"));
188
+ });
189
+ const { container } = render(jalvinCreateElement("span", {}, renderAnnotatedString(ann)));
190
+ const el = container.querySelector('[role="link"]');
191
+ expect(el).not.toBeNull();
192
+ expect(el.textContent).toBe("open dialog");
193
+ });
194
+ it("fires the onClick callback when a Clickable link is clicked", () => {
195
+ const onClick = vi.fn();
196
+ const ann = buildAnnotatedString(b => {
197
+ b.withLink(LinkAnnotation.Clickable("my-tag", onClick), () => b.append("press"));
198
+ });
199
+ const { container } = render(jalvinCreateElement("span", {}, renderAnnotatedString(ann)));
200
+ const el = container.querySelector('[role="link"]');
201
+ fireEvent.click(el);
202
+ expect(onClick).toHaveBeenCalledOnce();
203
+ expect(onClick).toHaveBeenCalledWith("my-tag");
204
+ });
205
+ it("applies SpanStyle color to a styled segment", () => {
206
+ const ann = buildAnnotatedString(b => {
207
+ b.withStyle({ color: "purple" }, () => b.append("colored"));
208
+ });
209
+ const { container } = render(jalvinCreateElement("span", {}, renderAnnotatedString(ann)));
210
+ const el = container.querySelector("span > span");
211
+ expect(el.style.color).toBe("purple");
212
+ });
213
+ it("applies SpanStyle fontWeight to a styled segment", () => {
214
+ const ann = buildAnnotatedString(b => {
215
+ b.withStyle({ fontWeight: "bold" }, () => b.append("bold text"));
216
+ });
217
+ const { container } = render(jalvinCreateElement("span", {}, renderAnnotatedString(ann)));
218
+ const el = container.querySelector("span > span");
219
+ expect(el.style.fontWeight).toBe("bold");
220
+ });
221
+ it("applies textDecoration from SpanStyle to a link", () => {
222
+ const ann = buildAnnotatedString(b => {
223
+ b.withLink(LinkAnnotation.Url("https://a.com"), () => {
224
+ b.withStyle({ textDecoration: TextDecoration.Underline }, () => b.append("underlined link"));
225
+ });
226
+ });
227
+ const { container } = render(jalvinCreateElement("span", {}, renderAnnotatedString(ann)));
228
+ const a = container.querySelector("a");
229
+ expect(a.style.textDecoration).toContain("underline");
230
+ });
231
+ it("renders unstyled text segments without wrapping spans", () => {
232
+ const ann = buildAnnotatedString(b => {
233
+ b.append("plain ");
234
+ b.withStyle({ color: "red" }, () => b.append("red"));
235
+ b.append(" plain");
236
+ });
237
+ const nodes = renderAnnotatedString(ann);
238
+ // First and last nodes should be bare Text nodes, middle a Span
239
+ expect(nodes[0].nodeType).toBe(Node.TEXT_NODE);
240
+ expect(nodes[2].nodeType).toBe(Node.TEXT_NODE);
241
+ });
242
+ it("handles an AnnotatedString with no spans as a single text node", () => {
243
+ const ann = buildAnnotatedString(b => b.append("no spans here"));
244
+ const nodes = renderAnnotatedString(ann).filter(Boolean);
245
+ expect(nodes).toHaveLength(1);
246
+ expect(nodes[0].textContent).toBe("no spans here");
247
+ });
248
+ });
249
+ // ---------------------------------------------------------------------------
250
+ // Text component integration
251
+ // ---------------------------------------------------------------------------
252
+ describe("Text + AnnotatedString integration", () => {
253
+ it("renders plain string text unchanged", () => {
254
+ render(Text({ text: "plain" }));
255
+ expect(screen.getByText("plain")).toBeTruthy();
256
+ });
257
+ it("renders an AnnotatedString passed via text prop", () => {
258
+ const ann = buildAnnotatedString(b => {
259
+ b.append("Visit ");
260
+ b.withLink(LinkAnnotation.Url("https://jalvin.dev"), () => b.append("Jalvin"));
261
+ });
262
+ const { container } = render(Text({ text: ann }));
263
+ expect(container.querySelector("a")).not.toBeNull();
264
+ expect(container.querySelector("a").textContent).toBe("Jalvin");
265
+ });
266
+ it("renders mixed plain + styled text inside Text", () => {
267
+ const ann = buildAnnotatedString(b => {
268
+ b.append("Hello ");
269
+ b.withStyle({ color: "blue" }, () => b.append("world"));
270
+ });
271
+ const { container } = render(Text({ text: ann }));
272
+ const spans = container.querySelectorAll("span");
273
+ // Outer wrapper span + inner styled span
274
+ expect(spans.length).toBeGreaterThanOrEqual(2);
275
+ });
276
+ it("Clickable link inside Text fires callback on click", () => {
277
+ const onClick = vi.fn();
278
+ const ann = buildAnnotatedString(b => {
279
+ b.withLink(LinkAnnotation.Clickable("action", onClick), () => b.append("do it"));
280
+ });
281
+ const { container } = render(Text({ text: ann }));
282
+ const el = container.querySelector('[role="link"]');
283
+ fireEvent.click(el);
284
+ expect(onClick).toHaveBeenCalledWith("action");
285
+ });
286
+ it("still supports children when text prop is a plain string", () => {
287
+ render(Text({ children: [document.createTextNode("child text")] }));
288
+ expect(screen.getByText("child text")).toBeTruthy();
289
+ });
290
+ it("Text color prop still applied when text is an AnnotatedString", () => {
291
+ const ann = buildAnnotatedString(b => b.append("hello"));
292
+ const { container } = render(Text({ text: ann, color: "hotpink" }));
293
+ const outer = container.querySelector("span");
294
+ expect(outer.style.color).toBe("hotpink");
295
+ });
296
+ });
297
+ //# sourceMappingURL=annotated-string.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotated-string.test.js","sourceRoot":"","sources":["../../src/__tests__/annotated-string.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=children-signature.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"children-signature.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/children-signature.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ /**
5
+ * Tests to ensure all child-accepting UI components use consistent
6
+ * second-argument children signature (not props-style).
7
+ *
8
+ * This prevents runtime mismatches like the 2.0.35 incident where
9
+ * Scaffold/Card took children as second arg, but Column/Row read from props.
10
+ */
11
+ describe("UI children signature consistency", () => {
12
+ // Components that accept children
13
+ const CHILD_COMPONENTS = [
14
+ "Scaffold",
15
+ "Card",
16
+ "Column",
17
+ "Row",
18
+ "Box",
19
+ "Button",
20
+ "IconButton",
21
+ ];
22
+ // Text is intentionally different (uses props.children and props.text)
23
+ const INTENTIONAL_EXCEPTIONS = ["Text"];
24
+ it("all child-accepting components use second-argument style in TypeScript", () => {
25
+ const srcDir = path.join(__dirname, "..");
26
+ const tsFiles = [
27
+ path.join(srcDir, "surface.ts"),
28
+ path.join(srcDir, "layout.ts"),
29
+ path.join(srcDir, "button.ts"),
30
+ ].filter(f => fs.existsSync(f));
31
+ const content = tsFiles
32
+ .map((f) => fs.readFileSync(f, "utf-8"))
33
+ .join("\n");
34
+ for (const component of CHILD_COMPONENTS) {
35
+ // Find the component function definition
36
+ const componentRegex = new RegExp(`export function ${component}\\([\\s\\S]*?\\):\\s*HTMLElement`, "");
37
+ const match = content.match(componentRegex);
38
+ if (!match)
39
+ continue; // Component might not be in the checked files
40
+ const functionSig = match[0];
41
+ // Check: should have children as second parameter (after Props)
42
+ // Pattern: }: PropType, children?: Node[]
43
+ // (handles multi-line with whitespace variations)
44
+ const hasSecondArgChildren = /:\s*\w+Props\s*,\s*children\?/s.test(functionSig);
45
+ expect(hasSecondArgChildren, `${component} should have children as second-argument, not in props`).toBe(true);
46
+ // Check: should NOT have children in props destructuring
47
+ // Pattern: { ..., children... }
48
+ const propsMatch = functionSig.match(/\{[\s\S]*?\}:\s*\w+Props/);
49
+ if (propsMatch) {
50
+ const propsBody = propsMatch[0];
51
+ expect(!propsBody.includes("children"), `${component} props should NOT include children field`).toBe(true);
52
+ }
53
+ }
54
+ });
55
+ it("interface props do not include children field", () => {
56
+ const srcDir = path.join(__dirname, "..");
57
+ const tsFiles = [
58
+ path.join(srcDir, "surface.ts"),
59
+ path.join(srcDir, "layout.ts"),
60
+ path.join(srcDir, "button.ts"),
61
+ ].filter(f => fs.existsSync(f));
62
+ const content = tsFiles
63
+ .map((f) => fs.readFileSync(f, "utf-8"))
64
+ .join("\n");
65
+ // Get interface definitions for components with children
66
+ for (const component of CHILD_COMPONENTS) {
67
+ // Look for interfaces like ScaffoldProps, CardProps, etc.
68
+ const interfaceName = `${component}Props`;
69
+ const interfacePattern = new RegExp(`export interface ${interfaceName}\\s*\\{[^}]*?\\}`, "s");
70
+ const match = content.match(interfacePattern);
71
+ if (match) {
72
+ const interfaceBody = match[0];
73
+ // For non-exception components, children should NOT be in the interface
74
+ if (!INTENTIONAL_EXCEPTIONS.includes(component)) {
75
+ expect(!interfaceBody.includes("children"), `${interfaceName} should NOT include children field (children are second-argument)`).toBe(true);
76
+ }
77
+ }
78
+ }
79
+ });
80
+ it("component implementations use children correctly as second arg", () => {
81
+ const srcDir = path.join(__dirname, "..");
82
+ const layoutContent = fs.readFileSync(path.join(srcDir, "layout.ts"), "utf-8");
83
+ // Check that Column/Row/Box all use children ?? [] pattern
84
+ for (const component of ["Column", "Row", "Box"]) {
85
+ expect(layoutContent.includes(`children ?? []`), `${component} should use children ?? [] pattern`).toBe(true);
86
+ }
87
+ });
88
+ it("compiled dist files maintain second-argument children signature", () => {
89
+ const distDir = path.join(__dirname, "../../dist");
90
+ // Check if dist exists (it will after build)
91
+ if (!fs.existsSync(distDir)) {
92
+ console.warn("dist/ not found; skipping compiled output check");
93
+ return;
94
+ }
95
+ const jsFiles = [
96
+ path.join(distDir, "surface.js"),
97
+ path.join(distDir, "layout.js"),
98
+ path.join(distDir, "button.js"),
99
+ ].filter((f) => fs.existsSync(f));
100
+ const content = jsFiles.map((f) => fs.readFileSync(f, "utf-8")).join("\n");
101
+ // Check that second-argument children patterns exist in compiled code
102
+ // Pattern: }, children) or }, children =
103
+ expect(/},\s*children\s*[),=]/m.test(content), "Compiled code should have children as second parameter").toBe(true);
104
+ });
105
+ });
106
+ //# sourceMappingURL=children-signature.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"children-signature.test.js","sourceRoot":"","sources":["../../src/__tests__/children-signature.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interaction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/interaction.test.ts"],"names":[],"mappings":""}