diff --git a/packages/runtime-tests/integration/layout/text-wrap-width.test.tsx b/packages/runtime-tests/integration/layout/text-wrap-width.test.tsx
new file mode 100644
index 0000000..f085dd7
--- /dev/null
+++ b/packages/runtime-tests/integration/layout/text-wrap-width.test.tsx
@@ -0,0 +1,66 @@
+import { defineComponent } from "vue";
+import { expect, test } from "vite-plus/test";
+import { render } from "@vue-tui/testing";
+import { Box, Text } from "@vue-tui/runtime";
+
+test("text wraps within border content area, not outer width", async () => {
+ // Box is 12 wide with single border (1 char each side).
+ // Content area is 12 - 2 = 10 chars.
+ // "Hello World!" is 12 chars, should wrap at 10.
+ const { lastFrame } = await render(
+ defineComponent(() => () => (
+
+ Hello World!
+
+ )),
+ { columns: 100 },
+ );
+ const frame = lastFrame()!;
+ // Text should wrap to fit the 10-char content area
+ expect(frame).toContain("Hello");
+ expect(frame).toContain("World!");
+ // The text "Hello World!" wraps: "Hello " on line 1, "World!" on line 2
+ const lines = frame.split("\n");
+ // Should have 4 lines: top border, text line 1, text line 2, bottom border
+ expect(lines).toHaveLength(4);
+ // Verify text doesn't overflow outside the border
+ for (const line of lines) {
+ expect(line.length).toBeLessThanOrEqual(12);
+ }
+});
+
+test("text wraps within padding content area", async () => {
+ // Box is 12 wide with padding 1 each side.
+ // Content area is 12 - 2 = 10 chars.
+ const { lastFrame } = await render(
+ defineComponent(() => () => (
+
+ Hello World!
+
+ )),
+ { columns: 100 },
+ );
+ const frame = lastFrame()!;
+ // Text wraps to 10-char content area
+ expect(frame).toContain("Hello");
+ expect(frame).toContain("World!");
+ // Two lines of text
+ const lines = frame.split("\n");
+ expect(lines).toHaveLength(2);
+});
+
+test("text wraps within border+padding content area", async () => {
+ // Box is 14 wide with single border (1 each side) + padding 1 each side.
+ // Content area is 14 - 2 (border) - 2 (padding) = 10 chars.
+ const { lastFrame } = await render(
+ defineComponent(() => () => (
+
+ Hello World!
+
+ )),
+ { columns: 100 },
+ );
+ const frame = lastFrame()!;
+ expect(frame).toContain("Hello");
+ expect(frame).toContain("World!");
+});