@tui-sandbox/library 12.5.0 → 12.5.2

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,16 +1,17 @@
1
+ import { visualWidth } from "./visualWidth.js";
1
2
  /** Draw a Unicode box around text content with a title in the top border. */
2
3
  export const drawTextBox = (title, content, minWidth = 88) => {
3
4
  const header = ` ${title} `;
5
+ const headerWidth = visualWidth(header);
4
6
  const contentLines = content.split("\n");
5
- // The box must be wide enough for the header and all content lines
6
- const maxContentWidth = Math.max(...contentLines.map(line => line.length));
7
- const width = Math.max(minWidth, maxContentWidth + 4, header.length + 2);
7
+ const maxContentWidth = Math.max(...contentLines.map(line => visualWidth(line)));
8
+ const width = Math.max(minWidth, maxContentWidth + 4, headerWidth + 2);
8
9
  const innerWidth = width - 2;
9
- const topBorder = `┌${header}${"─".repeat(innerWidth - header.length)}┐`;
10
+ const topBorder = `┌${header}${"─".repeat(innerWidth - headerWidth)}┐`;
10
11
  const bottomBorder = `└${"─".repeat(innerWidth)}┘`;
11
12
  const lines = contentLines.map(line => {
12
- const padded = line.padEnd(innerWidth - 2);
13
- return `│ ${padded} │`;
13
+ const padding = " ".repeat(innerWidth - 2 - visualWidth(line));
14
+ return `│ ${line}${padding} │`;
14
15
  });
15
16
  return `${topBorder}\n${lines.join("\n")}\n${bottomBorder}`;
16
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"drawTextBox.js","sourceRoot":"","sources":["../../../src/client/drawTextBox.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,QAAQ,GAAG,EAAE,EAAU,EAAE;IACnF,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,CAAA;IAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAExC,mEAAmE;IACnE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAExE,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAA;IAC5B,MAAM,SAAS,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA;IACxE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAA;IAClD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;QAC1C,OAAO,KAAK,MAAM,IAAI,CAAA;IACxB,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,EAAE,CAAA;AAC7D,CAAC,CAAA"}
1
+ {"version":3,"file":"drawTextBox.js","sourceRoot":"","sources":["../../../src/client/drawTextBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,QAAQ,GAAG,EAAE,EAAU,EAAE;IACnF,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,CAAA;IAC3B,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAExC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;IAEtE,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAA;IAC5B,MAAM,SAAS,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,CAAA;IACtE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAA;IAClD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACpC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9D,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAA;IAChC,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,EAAE,CAAA;AAC7D,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { drawTextBox } from "./drawTextBox.js";
3
+ import { visualWidth } from "./visualWidth.js";
3
4
  describe("drawTextBox", () => {
4
5
  it("draws a box around terminal content", () => {
5
6
  const content = [
@@ -28,5 +29,45 @@ describe("drawTextBox", () => {
28
29
  const lengths = lines.map(line => line.length);
29
30
  expect(new Set(lengths).size).toBe(1);
30
31
  });
32
+ it("right-aligns the border when content contains wide CJK characters", () => {
33
+ // "日本" is 4 cells (2 wide chars at 2 cells each); "abcd" is also 4
34
+ // cells. JS .length differs (2 vs 4) but visual width must match across
35
+ // all box lines so the right border lines up.
36
+ const content = ["日本", "abcd"].join("\n");
37
+ const lines = drawTextBox("Title", content).split("\n");
38
+ const widths = lines.map(visualWidth);
39
+ expect(new Set(widths).size).toBe(1);
40
+ });
41
+ it("right-aligns the border when the title contains wide characters", () => {
42
+ const lines = drawTextBox("日本語タイトル", "content").split("\n");
43
+ const widths = lines.map(visualWidth);
44
+ expect(new Set(widths).size).toBe(1);
45
+ });
46
+ it("right-aligns the border for emoji content", () => {
47
+ const content = ["🎉🎉", "ab"].join("\n");
48
+ const lines = drawTextBox("Title", content).split("\n");
49
+ const widths = lines.map(visualWidth);
50
+ expect(new Set(widths).size).toBe(1);
51
+ });
52
+ it("right-aligns the border for ZWJ-joined emoji clusters", () => {
53
+ // 👨‍👩‍👧‍👦 is one grapheme (2 cells) built from 4 code points + ZWJs
54
+ // (11 JS chars total). Naive .length math would over-pad by 9.
55
+ const content = ["👨‍👩‍👧‍👦", "ab"].join("\n");
56
+ const lines = drawTextBox("Title", content).split("\n");
57
+ const widths = lines.map(visualWidth);
58
+ expect(new Set(widths).size).toBe(1);
59
+ });
60
+ it("renders a tight box around CJK content", () => {
61
+ // Snapshot — verifies the right border `│` actually lines up visually
62
+ // when the file is viewed in a monospace context. minWidth=20 forces
63
+ // the box to be sized by content rather than the default minimum.
64
+ const content = ["日本", "abcd"].join("\n");
65
+ expect(drawTextBox("T", content, 20)).toMatchInlineSnapshot(`
66
+ "┌ T ───────────────┐
67
+ │ 日本 │
68
+ │ abcd │
69
+ └──────────────────┘"
70
+ `);
71
+ });
31
72
  }); // describe
32
73
  //# sourceMappingURL=drawTextBox.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"drawTextBox.test.js","sourceRoot":"","sources":["../../../src/client/drawTextBox.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,OAAO,GAAG;YACd,EAAE;YACF,2CAA2C;YAC3C,mEAAmE;YACnE,uEAAuE;YACvE,cAAc;SACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEZ,MAAM,CAAC,WAAW,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;GAQnF,CAAC,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,QAAQ,GACZ,gIAAgI,CAAA;QAClI,MAAM,OAAO,GAAG,CAAC,wCAAwC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAA;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEhC,4CAA4C;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9C,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA,CAAC,WAAW"}
1
+ {"version":3,"file":"drawTextBox.test.js","sourceRoot":"","sources":["../../../src/client/drawTextBox.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Join row text into a snapshot, dropping trailing blank rows. */
2
+ export declare const extractTerminalContent: (rowTexts: ReadonlyArray<string>) => string | undefined;
@@ -0,0 +1,11 @@
1
+ /** Join row text into a snapshot, dropping trailing blank rows. */
2
+ export const extractTerminalContent = (rowTexts) => {
3
+ if (rowTexts.length === 0)
4
+ return undefined;
5
+ const lines = [...rowTexts];
6
+ while (lines.length > 0 && lines[lines.length - 1]?.trim() === "") {
7
+ lines.pop();
8
+ }
9
+ return lines.length > 0 ? lines.join("\n") : undefined;
10
+ };
11
+ //# sourceMappingURL=extractTerminalContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractTerminalContent.js","sourceRoot":"","sources":["../../../src/client/extractTerminalContent.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAA+B,EAAsB,EAAE;IAC5F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAE3C,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAA;IAC3B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClE,KAAK,CAAC,GAAG,EAAE,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACxD,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { extractTerminalContent } from "./extractTerminalContent.js";
3
+ describe("extractTerminalContent", () => {
4
+ it("works with basic cases", () => {
5
+ expect(extractTerminalContent([]), "returns undefined for an empty rows array").toBeUndefined();
6
+ expect(extractTerminalContent(["", " ", "\t"]), "returns undefined when every row is blank").toBeUndefined();
7
+ expect(extractTerminalContent(["a", "b", "c"]), "returns undefined when every row is blank").toBe("a\nb\nc");
8
+ expect(extractTerminalContent(["hello", "world", "", " "]), "returns undefined when every row is blank").toBe("hello\nworld");
9
+ expect(extractTerminalContent(["", "hello"]), "returns undefined when every row is blank").toBe("\nhello");
10
+ });
11
+ describe("multi-byte / Unicode", () => {
12
+ it("preserves CJK wide characters", () => {
13
+ expect(extractTerminalContent(["你好世界"])).toBe("你好世界");
14
+ });
15
+ it("preserves emoji surrogate pairs", () => {
16
+ expect(extractTerminalContent(["🎉 Done!"])).toBe("🎉 Done!");
17
+ });
18
+ it("preserves precomposed and decomposed diacritics", () => {
19
+ expect(extractTerminalContent(["café"])).toBe("café");
20
+ expect(extractTerminalContent(["café"])).toBe("café");
21
+ });
22
+ it("treats ideographic space as blank when trimming trailing rows", () => {
23
+ // String.prototype.trim() removes U+3000 per spec, so a row containing
24
+ // only ideographic spaces is dropped from the trailing tail.
25
+ expect(extractTerminalContent(["text", " "])).toBe("text");
26
+ });
27
+ });
28
+ });
29
+ //# sourceMappingURL=extractTerminalContent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractTerminalContent.test.js","sourceRoot":"","sources":["../../../src/client/extractTerminalContent.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC,aAAa,EAAE,CAAA;QAC/F,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,2CAA2C,CAAC,CAAC,aAAa,EAAE,CAAA;QAC7G,MAAM,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,2CAA2C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5G,MAAM,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,2CAA2C,CAAC,CAAC,IAAI,CAC5G,cAAc,CACf,CAAA;QACD,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,2CAA2C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5G,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,sBAAsB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACrD,MAAM,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,uEAAuE;YACvE,6DAA6D;YAC7D,MAAM,CAAC,sBAAsB,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -2,4 +2,6 @@ export type { InMemoryClipboard } from "./clipboard.js";
2
2
  export { rgbify } from "./color-utilities.js";
3
3
  export { textIsVisibleWithBackgroundColor, textIsVisibleWithColor } from "./cypress-assertions.js";
4
4
  export { drawTextBox } from "./drawTextBox.js";
5
+ export { extractTerminalContent } from "./extractTerminalContent.js";
5
6
  export type { MyNeovimConfigModification } from "./neovim/MyNeovimConfigModification.ts";
7
+ export { visualWidth } from "./visualWidth.js";
@@ -2,4 +2,6 @@
2
2
  export { rgbify } from "./color-utilities.js";
3
3
  export { textIsVisibleWithBackgroundColor, textIsVisibleWithColor } from "./cypress-assertions.js";
4
4
  export { drawTextBox } from "./drawTextBox.js";
5
+ export { extractTerminalContent } from "./extractTerminalContent.js";
6
+ export { visualWidth } from "./visualWidth.js";
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAG9E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAG9E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const visualWidth: (s: string) => number;
@@ -0,0 +1,3 @@
1
+ import stringWidth from "string-width";
2
+ export const visualWidth = (s) => stringWidth(s);
3
+ //# sourceMappingURL=visualWidth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualWidth.js","sourceRoot":"","sources":["../../../src/client/visualWidth.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA"}