@jalvin/ui 2.0.25 → 2.0.27

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 (69) 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/__tests__/interaction.test.d.ts +2 -0
  6. package/dist/__tests__/interaction.test.d.ts.map +1 -0
  7. package/dist/__tests__/interaction.test.js +213 -0
  8. package/dist/__tests__/interaction.test.js.map +1 -0
  9. package/dist/__tests__/modifier.test.d.ts +2 -0
  10. package/dist/__tests__/modifier.test.d.ts.map +1 -0
  11. package/dist/__tests__/modifier.test.js +189 -0
  12. package/dist/__tests__/modifier.test.js.map +1 -0
  13. package/dist/annotated-string.d.ts +77 -0
  14. package/dist/annotated-string.d.ts.map +1 -0
  15. package/dist/annotated-string.js +224 -0
  16. package/dist/annotated-string.js.map +1 -0
  17. package/dist/button.d.ts +1 -1
  18. package/dist/button.d.ts.map +1 -1
  19. package/dist/button.js +13 -1
  20. package/dist/button.js.map +1 -1
  21. package/dist/canvas.d.ts +1 -1
  22. package/dist/canvas.d.ts.map +1 -1
  23. package/dist/canvas.js +7 -1
  24. package/dist/canvas.js.map +1 -1
  25. package/dist/checkbox.d.ts +1 -1
  26. package/dist/checkbox.d.ts.map +1 -1
  27. package/dist/checkbox.js +1 -1
  28. package/dist/checkbox.js.map +1 -1
  29. package/dist/image.d.ts +1 -1
  30. package/dist/image.d.ts.map +1 -1
  31. package/dist/image.js +1 -1
  32. package/dist/image.js.map +1 -1
  33. package/dist/index.d.ts +4 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +3 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/input.d.ts +1 -1
  38. package/dist/input.d.ts.map +1 -1
  39. package/dist/input.js +1 -1
  40. package/dist/input.js.map +1 -1
  41. package/dist/interaction.d.ts +103 -0
  42. package/dist/interaction.d.ts.map +1 -0
  43. package/dist/interaction.js +150 -0
  44. package/dist/interaction.js.map +1 -0
  45. package/dist/layout.d.ts +3 -3
  46. package/dist/layout.d.ts.map +1 -1
  47. package/dist/layout.js +3 -3
  48. package/dist/layout.js.map +1 -1
  49. package/dist/modifier.d.ts +49 -2
  50. package/dist/modifier.d.ts.map +1 -1
  51. package/dist/modifier.js +80 -8
  52. package/dist/modifier.js.map +1 -1
  53. package/dist/spacer.d.ts +2 -2
  54. package/dist/spacer.d.ts.map +1 -1
  55. package/dist/spacer.js +2 -2
  56. package/dist/spacer.js.map +1 -1
  57. package/dist/surface.d.ts +3 -4
  58. package/dist/surface.d.ts.map +1 -1
  59. package/dist/surface.js +3 -4
  60. package/dist/surface.js.map +1 -1
  61. package/dist/text.d.ts +4 -3
  62. package/dist/text.d.ts.map +1 -1
  63. package/dist/text.js +6 -2
  64. package/dist/text.js.map +1 -1
  65. package/dist/textarea.d.ts +1 -1
  66. package/dist/textarea.d.ts.map +1 -1
  67. package/dist/textarea.js +1 -1
  68. package/dist/textarea.js.map +1 -1
  69. package/package.json +1 -1
@@ -0,0 +1,189 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifier.test.js","sourceRoot":"","sources":["../../src/__tests__/modifier.test.ts"],"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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotated-string.js","sourceRoot":"","sources":["../src/annotated-string.ts"],"names":[],"mappings":"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"}
package/dist/button.d.ts CHANGED
@@ -10,7 +10,7 @@ export interface ButtonProps {
10
10
  enabled?: boolean;
11
11
  type?: "button" | "submit" | "reset";
12
12
  }
13
- /** Button — analogous to Compose's Button / OutlinedButton / TextButton. */
13
+ /** Button element. */
14
14
  export declare function Button({ text, innerHTML: html, onClick, modifier, enabled, type }: ButtonProps, children?: React.ReactNode[]): React.ReactElement;
15
15
  export interface IconButtonProps {
16
16
  innerHTML?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../src/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;CACtC;AAED,4EAA4E;AAC5E,wBAAgB,MAAM,CACpB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAc,EAAE,IAAe,EAAE,EAAE,WAAW,EAC1F,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,GAC3B,KAAK,CAAC,YAAY,CAiBpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,iCAAiC;AACjC,wBAAgB,UAAU,CACxB,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAc,EAAE,IAAe,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,eAAe,EAC3G,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,GAC3B,KAAK,CAAC,YAAY,CAiBpB"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../src/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;CACtC;AAED,sBAAsB;AACtB,wBAAgB,MAAM,CACpB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAc,EAAE,IAAe,EAAE,EAAE,WAAW,EAC1F,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,GAC3B,KAAK,CAAC,YAAY,CAuBpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,iCAAiC;AACjC,wBAAgB,UAAU,CACxB,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAc,EAAE,IAAe,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,eAAe,EAC3G,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,GAC3B,KAAK,CAAC,YAAY,CAuBpB"}
package/dist/button.js CHANGED
@@ -1,11 +1,17 @@
1
1
  import React from "react";
2
- /** Button — analogous to Compose's Button / OutlinedButton / TextButton. */
2
+ /** Button element. */
3
3
  export function Button({ text, innerHTML: html, onClick, modifier, enabled = true, type = "button" }, children) {
4
4
  const modProps = modifier?.toProps() ?? {};
5
5
  const baseProps = {
6
6
  type,
7
7
  disabled: !enabled,
8
8
  onClick: enabled ? onClick : undefined,
9
+ onMouseEnter: modProps.onMouseEnter,
10
+ onMouseLeave: modProps.onMouseLeave,
11
+ onFocus: modProps.onFocus,
12
+ onBlur: modProps.onBlur,
13
+ onMouseDown: modProps.onMouseDown,
14
+ onMouseUp: modProps.onMouseUp,
9
15
  className: modProps.className,
10
16
  style: modProps.style,
11
17
  };
@@ -25,6 +31,12 @@ export function IconButton({ innerHTML, onClick, modifier, enabled = true, type
25
31
  type,
26
32
  disabled: !enabled,
27
33
  onClick: enabled ? onClick : undefined,
34
+ onMouseEnter: modProps.onMouseEnter,
35
+ onMouseLeave: modProps.onMouseLeave,
36
+ onFocus: modProps.onFocus,
37
+ onBlur: modProps.onBlur,
38
+ onMouseDown: modProps.onMouseDown,
39
+ onMouseUp: modProps.onMouseUp,
28
40
  className: modProps.className,
29
41
  style: modProps.style,
30
42
  "aria-label": ariaLabel,
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sourceRoot":"","sources":["../src/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,4EAA4E;AAC5E,MAAM,UAAU,MAAM,CACpB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAe,EAC1F,QAA4B;IAE5B,MAAM,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG;QAChB,IAAI;QACJ,QAAQ,EAAE,CAAC,OAAO;QAClB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACtC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAA4B;KAC7C,CAAC;IACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YACnC,GAAG,SAAS;YACZ,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAsB,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC;AACjE,CAAC;AAWD,iCAAiC;AACjC,MAAM,UAAU,UAAU,CACxB,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAmB,EAC3G,QAA4B;IAE5B,MAAM,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG;QAChB,IAAI;QACJ,QAAQ,EAAE,CAAC,OAAO;QAClB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACtC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAA4B;QAC5C,YAAY,EAAE,SAAS;KACxB,CAAC;IACF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YACnC,GAAG,SAAS;YACZ,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;SAC/C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../src/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,sBAAsB;AACtB,MAAM,UAAU,MAAM,CACpB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAe,EAC1F,QAA4B;IAE5B,MAAM,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG;QAChB,IAAI;QACJ,QAAQ,EAAE,CAAC,OAAO;QAClB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACtC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAA4B;KAC7C,CAAC;IACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YACnC,GAAG,SAAS;YACZ,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAsB,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC;AACjE,CAAC;AAWD,iCAAiC;AACjC,MAAM,UAAU,UAAU,CACxB,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAmB,EAC3G,QAA4B;IAE5B,MAAM,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG;QAChB,IAAI;QACJ,QAAQ,EAAE,CAAC,OAAO;QAClB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACtC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAA4B;QAC5C,YAAY,EAAE,SAAS;KACxB,CAAC;IACF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YACnC,GAAG,SAAS;YACZ,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;SAC/C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC"}
package/dist/canvas.d.ts CHANGED
@@ -13,6 +13,6 @@ export interface CanvasProps extends Omit<React.CanvasHTMLAttributes<HTMLCanvasE
13
13
  /** Override devicePixelRatio used for backing-store scaling. */
14
14
  pixelRatio?: number;
15
15
  }
16
- /** Canvas drawing surface — analogous to Compose's Canvas. */
16
+ /** Canvas drawing surface. */
17
17
  export declare function Canvas({ modifier, width, height, draw, clearBeforeDraw, pixelRatio, className, ...domProps }: CanvasProps): React.ReactElement;
18
18
  //# sourceMappingURL=canvas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../src/canvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACjI,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1E,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,8DAA8D;AAC9D,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,KAAK,EACL,MAAM,EACN,IAAI,EACJ,eAAsB,EACtB,UAAU,EACV,SAAS,EACT,GAAG,QAAQ,EACZ,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAoDlC"}
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../src/canvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACjI,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1E,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,8BAA8B;AAC9B,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,KAAK,EACL,MAAM,EACN,IAAI,EACJ,eAAsB,EACtB,UAAU,EACV,SAAS,EACT,GAAG,QAAQ,EACZ,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CA0DlC"}
package/dist/canvas.js CHANGED
@@ -3,7 +3,7 @@ function joinClassNames(...classNames) {
3
3
  const value = classNames.filter(Boolean).join(" ").trim();
4
4
  return value.length > 0 ? value : undefined;
5
5
  }
6
- /** Canvas drawing surface — analogous to Compose's Canvas. */
6
+ /** Canvas drawing surface. */
7
7
  export function Canvas({ modifier, width, height, draw, clearBeforeDraw = true, pixelRatio, className, ...domProps }) {
8
8
  const ref = React.useRef(null);
9
9
  const modProps = modifier?.toProps() ?? {};
@@ -46,6 +46,12 @@ export function Canvas({ modifier, width, height, draw, clearBeforeDraw = true,
46
46
  ref,
47
47
  ...domProps,
48
48
  className: joinClassNames(modProps.className, className),
49
+ onMouseEnter: modProps.onMouseEnter,
50
+ onMouseLeave: modProps.onMouseLeave,
51
+ onFocus: modProps.onFocus,
52
+ onBlur: modProps.onBlur,
53
+ onMouseDown: modProps.onMouseDown,
54
+ onMouseUp: modProps.onMouseUp,
49
55
  style: {
50
56
  width: width !== undefined ? `${width}px` : undefined,
51
57
  height: height !== undefined ? `${height}px` : undefined,