@jalvin/ui 2.0.25 → 2.0.26

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 (55) 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 +310 -0
  4. package/dist/__tests__/annotated-string.test.js.map +1 -0
  5. package/dist/annotated-string.d.ts +77 -0
  6. package/dist/annotated-string.d.ts.map +1 -0
  7. package/dist/annotated-string.js +224 -0
  8. package/dist/annotated-string.js.map +1 -0
  9. package/dist/button.d.ts +1 -1
  10. package/dist/button.d.ts.map +1 -1
  11. package/dist/button.js +1 -1
  12. package/dist/button.js.map +1 -1
  13. package/dist/canvas.d.ts +1 -1
  14. package/dist/canvas.d.ts.map +1 -1
  15. package/dist/canvas.js +1 -1
  16. package/dist/canvas.js.map +1 -1
  17. package/dist/checkbox.d.ts +1 -1
  18. package/dist/checkbox.d.ts.map +1 -1
  19. package/dist/checkbox.js +1 -1
  20. package/dist/checkbox.js.map +1 -1
  21. package/dist/image.d.ts +1 -1
  22. package/dist/image.d.ts.map +1 -1
  23. package/dist/image.js +1 -1
  24. package/dist/image.js.map +1 -1
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/input.d.ts +1 -1
  30. package/dist/input.d.ts.map +1 -1
  31. package/dist/input.js +1 -1
  32. package/dist/input.js.map +1 -1
  33. package/dist/layout.d.ts +3 -3
  34. package/dist/layout.d.ts.map +1 -1
  35. package/dist/layout.js +3 -3
  36. package/dist/layout.js.map +1 -1
  37. package/dist/modifier.js +1 -1
  38. package/dist/modifier.js.map +1 -1
  39. package/dist/spacer.d.ts +2 -2
  40. package/dist/spacer.d.ts.map +1 -1
  41. package/dist/spacer.js +2 -2
  42. package/dist/spacer.js.map +1 -1
  43. package/dist/surface.d.ts +3 -4
  44. package/dist/surface.d.ts.map +1 -1
  45. package/dist/surface.js +3 -4
  46. package/dist/surface.js.map +1 -1
  47. package/dist/text.d.ts +4 -3
  48. package/dist/text.d.ts.map +1 -1
  49. package/dist/text.js +6 -2
  50. package/dist/text.js.map +1 -1
  51. package/dist/textarea.d.ts +1 -1
  52. package/dist/textarea.d.ts.map +1 -1
  53. package/dist/textarea.js +1 -1
  54. package/dist/textarea.js.map +1 -1
  55. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
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.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,310 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotated-string.test.js","sourceRoot":"","sources":["../../src/__tests__/annotated-string.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import React from "react";
2
+ import type { CSSProperties } from "react";
3
+ export declare class TextDecoration {
4
+ readonly mask: number;
5
+ static readonly None: TextDecoration;
6
+ static readonly Underline: TextDecoration;
7
+ static readonly LineThrough: TextDecoration;
8
+ private constructor();
9
+ /** Combine two decorations (e.g. Underline + LineThrough). */
10
+ plus(other: TextDecoration): TextDecoration;
11
+ toCSSValue(): string | undefined;
12
+ }
13
+ export interface SpanStyle {
14
+ color?: string;
15
+ fontSize?: string;
16
+ fontWeight?: number | "bold" | "normal";
17
+ fontStyle?: "italic" | "normal";
18
+ fontFamily?: string;
19
+ letterSpacing?: string;
20
+ background?: string;
21
+ textDecoration?: TextDecoration;
22
+ }
23
+ export declare function spanStyleToCSS(styles: SpanStyle[]): CSSProperties;
24
+ export interface TextLinkStyles {
25
+ style?: SpanStyle;
26
+ focusedStyle?: SpanStyle;
27
+ hoveredStyle?: SpanStyle;
28
+ pressedStyle?: SpanStyle;
29
+ }
30
+ export type LinkAnnotation = {
31
+ readonly type: "url";
32
+ readonly url: string;
33
+ readonly styles?: TextLinkStyles;
34
+ } | {
35
+ readonly type: "clickable";
36
+ readonly tag: string;
37
+ readonly styles?: TextLinkStyles;
38
+ readonly onClick: (tag: string) => void;
39
+ };
40
+ export declare const LinkAnnotation: {
41
+ readonly Url: (url: string, styles?: TextLinkStyles) => LinkAnnotation;
42
+ readonly Clickable: (tag: string, onClick: (tag: string) => void, styles?: TextLinkStyles) => LinkAnnotation;
43
+ };
44
+ export interface StringRange<T> {
45
+ item: T;
46
+ start: number;
47
+ end: number;
48
+ }
49
+ export interface AnnotatedString {
50
+ readonly text: string;
51
+ readonly spanStyles: ReadonlyArray<StringRange<SpanStyle>>;
52
+ readonly linkAnnotations: ReadonlyArray<StringRange<LinkAnnotation>>;
53
+ }
54
+ declare class AnnotatedStringBuilder {
55
+ private _text;
56
+ private readonly _spanStyles;
57
+ private readonly _linkAnnotations;
58
+ private readonly _styleStack;
59
+ private readonly _linkStack;
60
+ append(text: string): this;
61
+ append(annotated: AnnotatedString): this;
62
+ withStyle(style: SpanStyle, block: () => void): this;
63
+ pushStyle(style: SpanStyle): this;
64
+ withLink(link: LinkAnnotation, block: () => void): this;
65
+ private pushLink;
66
+ private popLink;
67
+ pushStringAnnotation(tag: string, annotation: string): this;
68
+ addStyle(style: SpanStyle, start: number, end: number): this;
69
+ addLink(link: LinkAnnotation, start: number, end: number): this;
70
+ pop(): this;
71
+ build(): AnnotatedString;
72
+ }
73
+ /** Build an AnnotatedString using a fluent builder block. */
74
+ export declare function buildAnnotatedString(block: (builder: AnnotatedStringBuilder) => void): AnnotatedString;
75
+ export declare function renderAnnotatedString(ann: AnnotatedString): React.ReactNode[];
76
+ export {};
77
+ //# sourceMappingURL=annotated-string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotated-string.d.ts","sourceRoot":"","sources":["../src/annotated-string.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ import React from "react";
2
+ // ---------------------------------------------------------------------------
3
+ // TextDecoration
4
+ // ---------------------------------------------------------------------------
5
+ export class TextDecoration {
6
+ mask;
7
+ static None = new TextDecoration(0);
8
+ static Underline = new TextDecoration(1);
9
+ static LineThrough = new TextDecoration(2);
10
+ constructor(mask) {
11
+ this.mask = mask;
12
+ }
13
+ /** Combine two decorations (e.g. Underline + LineThrough). */
14
+ plus(other) {
15
+ return new TextDecoration(this.mask | other.mask);
16
+ }
17
+ toCSSValue() {
18
+ const parts = [];
19
+ if (this.mask & 1)
20
+ parts.push("underline");
21
+ if (this.mask & 2)
22
+ parts.push("line-through");
23
+ return parts.length ? parts.join(" ") : undefined;
24
+ }
25
+ }
26
+ export function spanStyleToCSS(styles) {
27
+ const css = {};
28
+ for (const s of styles) {
29
+ if (s.color !== undefined)
30
+ css.color = s.color;
31
+ if (s.fontSize !== undefined)
32
+ css.fontSize = s.fontSize;
33
+ if (s.fontWeight !== undefined)
34
+ css.fontWeight = s.fontWeight;
35
+ if (s.fontStyle !== undefined)
36
+ css.fontStyle = s.fontStyle;
37
+ if (s.fontFamily !== undefined)
38
+ css.fontFamily = s.fontFamily;
39
+ if (s.letterSpacing !== undefined)
40
+ css.letterSpacing = s.letterSpacing;
41
+ if (s.background !== undefined)
42
+ css.backgroundColor = s.background;
43
+ if (s.textDecoration !== undefined) {
44
+ const v = s.textDecoration.toCSSValue();
45
+ if (v)
46
+ css.textDecoration = v;
47
+ }
48
+ }
49
+ return css;
50
+ }
51
+ export const LinkAnnotation = {
52
+ Url(url, styles) {
53
+ return { type: "url", url, styles };
54
+ },
55
+ Clickable(tag, onClick, styles) {
56
+ return { type: "clickable", tag, styles, onClick };
57
+ },
58
+ };
59
+ // ---------------------------------------------------------------------------
60
+ // AnnotatedString builder
61
+ // ---------------------------------------------------------------------------
62
+ class AnnotatedStringBuilder {
63
+ _text = "";
64
+ _spanStyles = [];
65
+ _linkAnnotations = [];
66
+ _styleStack = [];
67
+ _linkStack = [];
68
+ append(value) {
69
+ if (typeof value === "string") {
70
+ this._text += value;
71
+ }
72
+ else {
73
+ const offset = this._text.length;
74
+ this._text += value.text;
75
+ for (const s of value.spanStyles) {
76
+ this._spanStyles.push({ item: s.item, start: s.start + offset, end: s.end + offset });
77
+ }
78
+ for (const l of value.linkAnnotations) {
79
+ this._linkAnnotations.push({ item: l.item, start: l.start + offset, end: l.end + offset });
80
+ }
81
+ }
82
+ return this;
83
+ }
84
+ // -- withStyle ------------------------------------------------------------
85
+ withStyle(style, block) {
86
+ this.pushStyle(style);
87
+ block();
88
+ this.pop();
89
+ return this;
90
+ }
91
+ pushStyle(style) {
92
+ this._styleStack.push({ style, start: this._text.length });
93
+ return this;
94
+ }
95
+ // -- withLink -------------------------------------------------------------
96
+ withLink(link, block) {
97
+ this.pushLink(link);
98
+ block();
99
+ this.popLink();
100
+ return this;
101
+ }
102
+ pushLink(link) {
103
+ this._linkStack.push({ link, start: this._text.length });
104
+ }
105
+ popLink() {
106
+ const entry = this._linkStack.pop();
107
+ if (entry) {
108
+ this._linkAnnotations.push({ item: entry.link, start: entry.start, end: this._text.length });
109
+ }
110
+ }
111
+ // -- pushStringAnnotation / addStyle / addLink ---------------------------
112
+ pushStringAnnotation(tag, annotation) {
113
+ // Stored as a clickable with no-op handler so it can be queried later;
114
+ // consumers who need click handling should use withLink / addLink instead.
115
+ this.pushLink(LinkAnnotation.Clickable(tag, () => { }));
116
+ return this;
117
+ }
118
+ addStyle(style, start, end) {
119
+ this._spanStyles.push({ item: style, start, end });
120
+ return this;
121
+ }
122
+ addLink(link, start, end) {
123
+ this._linkAnnotations.push({ item: link, start, end });
124
+ return this;
125
+ }
126
+ // -- pop ------------------------------------------------------------------
127
+ pop() {
128
+ const styleEntry = this._styleStack.pop();
129
+ if (styleEntry) {
130
+ this._spanStyles.push({ item: styleEntry.style, start: styleEntry.start, end: this._text.length });
131
+ }
132
+ return this;
133
+ }
134
+ // -- build ----------------------------------------------------------------
135
+ build() {
136
+ // Flush any unclosed spans/links
137
+ while (this._styleStack.length)
138
+ this.pop();
139
+ while (this._linkStack.length)
140
+ this.popLink();
141
+ return {
142
+ text: this._text,
143
+ spanStyles: this._spanStyles.slice(),
144
+ linkAnnotations: this._linkAnnotations.slice(),
145
+ };
146
+ }
147
+ }
148
+ /** Build an AnnotatedString using a fluent builder block. */
149
+ export function buildAnnotatedString(block) {
150
+ const builder = new AnnotatedStringBuilder();
151
+ block(builder);
152
+ return builder.build();
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Rendering helper — converts AnnotatedString to React nodes
156
+ // ---------------------------------------------------------------------------
157
+ /** Default link style applied when the link has no explicit SpanStyle. */
158
+ const defaultLinkStyle = {
159
+ color: "inherit",
160
+ textDecoration: "underline",
161
+ cursor: "pointer",
162
+ };
163
+ export function renderAnnotatedString(ann) {
164
+ const { text, spanStyles, linkAnnotations } = ann;
165
+ // Collect all segment boundaries
166
+ const positions = new Set([0, text.length]);
167
+ for (const s of spanStyles) {
168
+ positions.add(s.start);
169
+ positions.add(s.end);
170
+ }
171
+ for (const l of linkAnnotations) {
172
+ positions.add(l.start);
173
+ positions.add(l.end);
174
+ }
175
+ const sorted = Array.from(positions).sort((a, b) => a - b);
176
+ return sorted.slice(0, -1).map((start, i) => {
177
+ const end = sorted[i + 1];
178
+ const segment = text.slice(start, end);
179
+ if (!segment)
180
+ return null;
181
+ // All spans whose range fully covers this segment
182
+ const activeSpans = spanStyles.filter(s => s.start <= start && s.end >= end).map(s => s.item);
183
+ const activeLinks = linkAnnotations.filter(l => l.start <= start && l.end >= end);
184
+ const css = spanStyleToCSS(activeSpans);
185
+ if (activeLinks.length > 0) {
186
+ const link = activeLinks[0].item;
187
+ if (link.type === "url") {
188
+ const linkStyle = link.styles?.style;
189
+ const appliedStyle = linkStyle
190
+ ? { ...defaultLinkStyle, ...spanStyleToCSS([linkStyle]), ...css }
191
+ : { ...defaultLinkStyle, ...css };
192
+ return React.createElement("a", {
193
+ key: start,
194
+ href: link.url,
195
+ target: "_blank",
196
+ rel: "noopener noreferrer",
197
+ style: appliedStyle,
198
+ }, segment);
199
+ }
200
+ if (link.type === "clickable") {
201
+ const linkStyle = link.styles?.style;
202
+ const appliedStyle = linkStyle
203
+ ? { ...defaultLinkStyle, ...spanStyleToCSS([linkStyle]), ...css }
204
+ : { ...defaultLinkStyle, ...css };
205
+ return React.createElement("span", {
206
+ key: start,
207
+ role: "link",
208
+ tabIndex: 0,
209
+ style: appliedStyle,
210
+ onClick: () => link.onClick(link.tag),
211
+ onKeyDown: (e) => {
212
+ if (e.key === "Enter" || e.key === " ")
213
+ link.onClick(link.tag);
214
+ },
215
+ }, segment);
216
+ }
217
+ }
218
+ if (Object.keys(css).length > 0) {
219
+ return React.createElement("span", { key: start, style: css }, segment);
220
+ }
221
+ return segment;
222
+ }).filter(Boolean);
223
+ }
224
+ //# sourceMappingURL=annotated-string.js.map