@react-text-game/ui 0.3.10 → 0.3.12

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.
@@ -1 +1 @@
1
- {"version":3,"file":"GameProvider.d.ts","sourceRoot":"","sources":["../../../src/components/GameProvider/GameProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,UAAU,EAGb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAA+B,MAAM,OAAO,CAAC;AAKvE,OAAO,EAAE,UAAU,EAAsB,MAAM,4BAA4B,CAAC;AAS5E,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;IAC9C,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;CAC3B,CAAC,CAAC;AAOH,eAAO,MAAM,YAAY,GAAI,oCAI1B,iBAAiB,mDA4DnB,CAAC"}
1
+ {"version":3,"file":"GameProvider.d.ts","sourceRoot":"","sources":["../../../src/components/GameProvider/GameProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,UAAU,EAGb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAA+B,MAAM,OAAO,CAAC;AAKvE,OAAO,EAAE,UAAU,EAAsB,MAAM,4BAA4B,CAAC;AAS5E,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;IAC9C,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;CAC3B,CAAC,CAAC;AAOH,eAAO,MAAM,YAAY,GAAI,oCAI1B,iBAAiB,mDA2EnB,CAAC"}
@@ -26,8 +26,19 @@ export const GameProvider = ({ children, options, components = {}, }) => {
26
26
  Game.init(options)
27
27
  .then(() => {
28
28
  newWidget(SYSTEM_PASSAGE_NAMES.START_MENU, components?.MainMenu?.() || _jsx(MainMenu, {}));
29
- const initialPassage = options.startPassage || SYSTEM_PASSAGE_NAMES.START_MENU;
30
- Game.setCurrent(initialPassage);
29
+ // Only set if not already set by Game.init() or registerPassage
30
+ if (!Game.currentPassage) {
31
+ const initialPassage = options.startPassage || SYSTEM_PASSAGE_NAMES.START_MENU;
32
+ // Check if passage exists, warn if not
33
+ const passage = Game.getPassageById(initialPassage);
34
+ if (!passage && options.startPassage) {
35
+ console.warn(`[react-text-game] startPassage "${options.startPassage}" not found, falling back to START_MENU`);
36
+ Game.setCurrent(SYSTEM_PASSAGE_NAMES.START_MENU);
37
+ }
38
+ else {
39
+ Game.setCurrent(initialPassage);
40
+ }
41
+ }
31
42
  setIsInitialized(true);
32
43
  })
33
44
  .catch((error) => {
@@ -1 +1 @@
1
- {"version":3,"file":"GameProvider.js","sourceRoot":"","sources":["../../../src/components/GameProvider/GameProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GameProvider.js","sourceRoot":"","sources":["../../../src/components/GameProvider/GameProvider.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryComponent/components/Text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC;CAC5B,CAAC,CAAC;AAEH,eAAO,MAAM,IAAI,GAAI,mCAAmC,SAAS,4CAShE,CAAC"}
1
+ {"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryComponent/components/Text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC;CAC5B,CAAC,CAAC;AAEH,eAAO,MAAM,IAAI,GAAI,mCAAmC,SAAS,4CAkBhE,CAAC"}
@@ -1,4 +1,12 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { twMerge } from "tailwind-merge";
3
- export const Text = ({ component: { props, content } }) => (_jsx("div", { className: twMerge("text-base text-justify whitespace-pre-wrap", props?.className), children: content }));
3
+ export const Text = ({ component: { props, content } }) => {
4
+ const className = twMerge("text-base text-justify whitespace-pre-wrap", props?.className);
5
+ // HTML rendering path - browser handles parsing naturally
6
+ if (props?.isHTML && typeof content === "string") {
7
+ return (_jsx("div", { className: className, dangerouslySetInnerHTML: { __html: content } }));
8
+ }
9
+ // Default: render as ReactNode
10
+ return _jsx("div", { className: className, children: content });
11
+ };
4
12
  //# sourceMappingURL=Text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Text.js","sourceRoot":"","sources":["../../../../src/components/StoryComponent/components/Text.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAMzC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAa,EAAE,EAAE,CAAC,CAClE,cACI,SAAS,EAAE,OAAO,CACd,4CAA4C,EAC5C,KAAK,EAAE,SAAS,CACnB,YAEA,OAAO,GACN,CACT,CAAC"}
1
+ {"version":3,"file":"Text.js","sourceRoot":"","sources":["../../../../src/components/StoryComponent/components/Text.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAMzC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAa,EAAE,EAAE;IACjE,MAAM,SAAS,GAAG,OAAO,CACrB,4CAA4C,EAC5C,KAAK,EAAE,SAAS,CACnB,CAAC;IAEF,0DAA0D;IAC1D,IAAI,KAAK,EAAE,MAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,CACH,cACI,SAAS,EAAE,SAAS,EACpB,uBAAuB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAC9C,CACL,CAAC;IACN,CAAC;IAED,+BAA+B;IAC/B,OAAO,cAAK,SAAS,EAAE,SAAS,YAAG,OAAO,GAAO,CAAC;AACtD,CAAC,CAAC"}
@@ -434,6 +434,9 @@
434
434
  .hidden {
435
435
  display: none;
436
436
  }
437
+ .inline {
438
+ display: inline;
439
+ }
437
440
  .inline-block {
438
441
  display: inline-block;
439
442
  }
@@ -1104,6 +1107,9 @@
1104
1107
  .uppercase {
1105
1108
  text-transform: uppercase;
1106
1109
  }
1110
+ .italic {
1111
+ font-style: italic;
1112
+ }
1107
1113
  .accent-foreground {
1108
1114
  accent-color: var(--color-foreground);
1109
1115
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Text.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Text.test.d.ts","sourceRoot":"","sources":["../../../src/tests/StoryComponent/Text.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,174 @@
1
+ import { cleanup, render, screen } from "@testing-library/react";
2
+ import { afterEach, describe, expect, test } from "bun:test";
3
+ import { createElement } from "react";
4
+ import { Text } from "../../components/StoryComponent/components/Text";
5
+ describe("Text", () => {
6
+ afterEach(() => {
7
+ cleanup();
8
+ });
9
+ describe("Default rendering", () => {
10
+ test("renders plain text string", () => {
11
+ const component = {
12
+ type: "text",
13
+ content: "Hello, world!",
14
+ };
15
+ render(createElement(Text, { component }));
16
+ expect(screen.getByText("Hello, world!")).toBeTruthy();
17
+ });
18
+ test("renders multi-line text with whitespace preservation", () => {
19
+ const component = {
20
+ type: "text",
21
+ content: "Line 1\nLine 2\nLine 3",
22
+ };
23
+ const { container } = render(createElement(Text, { component }));
24
+ const textDiv = container.querySelector("div");
25
+ expect(textDiv?.textContent).toBe("Line 1\nLine 2\nLine 3");
26
+ expect(textDiv?.classList.contains("whitespace-pre-wrap")).toBe(true);
27
+ });
28
+ test("renders empty string without errors", () => {
29
+ const component = {
30
+ type: "text",
31
+ content: "",
32
+ };
33
+ const { container } = render(createElement(Text, { component }));
34
+ const textDiv = container.querySelector("div");
35
+ expect(textDiv).toBeTruthy();
36
+ expect(textDiv?.textContent).toBe("");
37
+ });
38
+ });
39
+ describe("HTML rendering with isHTML", () => {
40
+ test("renders simple HTML tags when isHTML is true", () => {
41
+ const component = {
42
+ type: "text",
43
+ content: "<strong>Bold</strong> and <em>italic</em>",
44
+ props: { isHTML: true },
45
+ };
46
+ const { container } = render(createElement(Text, { component }));
47
+ const strong = container.querySelector("strong");
48
+ const em = container.querySelector("em");
49
+ expect(strong).toBeTruthy();
50
+ expect(strong?.textContent).toBe("Bold");
51
+ expect(em).toBeTruthy();
52
+ expect(em?.textContent).toBe("italic");
53
+ });
54
+ test("renders nested HTML elements", () => {
55
+ const component = {
56
+ type: "text",
57
+ content: "<div><p>Paragraph with <a href='#'>link</a></p></div>",
58
+ props: { isHTML: true },
59
+ };
60
+ const { container } = render(createElement(Text, { component }));
61
+ const paragraph = container.querySelector("p");
62
+ const link = container.querySelector("a");
63
+ expect(paragraph).toBeTruthy();
64
+ expect(link).toBeTruthy();
65
+ expect(link?.getAttribute("href")).toBe("#");
66
+ });
67
+ test("renders HTML with inline styles", () => {
68
+ const component = {
69
+ type: "text",
70
+ content: '<span style="color: red;">Red text</span>',
71
+ props: { isHTML: true },
72
+ };
73
+ const { container } = render(createElement(Text, { component }));
74
+ const span = container.querySelector("span");
75
+ expect(span).toBeTruthy();
76
+ expect(span?.style.color).toBe("red");
77
+ });
78
+ test("renders HTML with class attributes", () => {
79
+ const component = {
80
+ type: "text",
81
+ content: '<span class="custom-class">Styled text</span>',
82
+ props: { isHTML: true },
83
+ };
84
+ const { container } = render(createElement(Text, { component }));
85
+ const span = container.querySelector("span.custom-class");
86
+ expect(span).toBeTruthy();
87
+ expect(span?.textContent).toBe("Styled text");
88
+ });
89
+ });
90
+ describe("Edge cases", () => {
91
+ test("ignores isHTML when content is not a string (number)", () => {
92
+ const component = {
93
+ type: "text",
94
+ content: 42,
95
+ props: { isHTML: true },
96
+ };
97
+ render(createElement(Text, { component }));
98
+ // Should render as text, not attempt HTML parsing
99
+ expect(screen.getByText("42")).toBeTruthy();
100
+ });
101
+ test("renders HTML as escaped text when isHTML is false", () => {
102
+ const component = {
103
+ type: "text",
104
+ content: "<strong>Not bold</strong>",
105
+ props: { isHTML: false },
106
+ };
107
+ const { container } = render(createElement(Text, { component }));
108
+ // Should not have a strong element - HTML should be escaped
109
+ const strong = container.querySelector("strong");
110
+ expect(strong).toBeNull();
111
+ // The raw HTML string should be visible as text
112
+ expect(screen.getByText("<strong>Not bold</strong>")).toBeTruthy();
113
+ });
114
+ test("renders HTML as escaped text when isHTML is not provided", () => {
115
+ const component = {
116
+ type: "text",
117
+ content: "<em>Not italic</em>",
118
+ };
119
+ const { container } = render(createElement(Text, { component }));
120
+ // Should not have an em element
121
+ const em = container.querySelector("em");
122
+ expect(em).toBeNull();
123
+ // The raw HTML string should be visible as text
124
+ expect(screen.getByText("<em>Not italic</em>")).toBeTruthy();
125
+ });
126
+ test("handles malformed HTML gracefully", () => {
127
+ const component = {
128
+ type: "text",
129
+ content: "<div><p>Unclosed tags",
130
+ props: { isHTML: true },
131
+ };
132
+ // Browser should handle malformed HTML without throwing
133
+ const { container } = render(createElement(Text, { component }));
134
+ // Browser auto-closes tags, content should still render
135
+ expect(container.textContent).toContain("Unclosed tags");
136
+ });
137
+ });
138
+ describe("Styling", () => {
139
+ test("applies default classes", () => {
140
+ const component = {
141
+ type: "text",
142
+ content: "Styled text",
143
+ };
144
+ const { container } = render(createElement(Text, { component }));
145
+ const textDiv = container.querySelector("div");
146
+ expect(textDiv?.classList.contains("text-base")).toBe(true);
147
+ expect(textDiv?.classList.contains("text-justify")).toBe(true);
148
+ expect(textDiv?.classList.contains("whitespace-pre-wrap")).toBe(true);
149
+ });
150
+ test("applies custom className in default mode", () => {
151
+ const component = {
152
+ type: "text",
153
+ content: "Custom styled",
154
+ props: { className: "custom-class text-lg" },
155
+ };
156
+ const { container } = render(createElement(Text, { component }));
157
+ const textDiv = container.querySelector("div");
158
+ expect(textDiv?.classList.contains("custom-class")).toBe(true);
159
+ expect(textDiv?.classList.contains("text-lg")).toBe(true);
160
+ });
161
+ test("applies custom className in HTML mode", () => {
162
+ const component = {
163
+ type: "text",
164
+ content: "<strong>HTML content</strong>",
165
+ props: { isHTML: true, className: "html-custom-class" },
166
+ };
167
+ const { container } = render(createElement(Text, { component }));
168
+ const textDiv = container.querySelector("div");
169
+ expect(textDiv?.classList.contains("html-custom-class")).toBe(true);
170
+ expect(textDiv?.classList.contains("text-base")).toBe(true);
171
+ });
172
+ });
173
+ });
174
+ //# sourceMappingURL=Text.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Text.test.js","sourceRoot":"","sources":["../../../src/tests/StoryComponent/Text.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-text-game/ui",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "description": "Themeable React UI component library for text-based games with Tailwind CSS v4, featuring story passages, interactive maps, and customizable game interfaces",
5
5
  "private": false,
6
6
  "type": "module",