@zakmandhro/bunti 0.2.1 → 0.3.0

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 (114) hide show
  1. package/README.md +6 -5
  2. package/dist/cli.d.ts +2 -2
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +33 -9
  5. package/dist/cli.js.map +1 -1
  6. package/dist/colors.d.ts +2 -2
  7. package/dist/colors.js +2 -2
  8. package/dist/components/Box.d.ts +1 -1
  9. package/dist/components/Button.d.ts +1 -1
  10. package/dist/components/Button.js +2 -2
  11. package/dist/components/Card.d.ts +1 -1
  12. package/dist/components/Card.js +3 -3
  13. package/dist/components/Header.d.ts +1 -1
  14. package/dist/components/Header.js +2 -2
  15. package/dist/components/Input.d.ts +2 -2
  16. package/dist/components/Input.js +1 -1
  17. package/dist/components/Link.d.ts +2 -2
  18. package/dist/components/Link.js +2 -2
  19. package/dist/components/Modal.d.ts +1 -1
  20. package/dist/components/Modal.js +2 -2
  21. package/dist/components/Progress.d.ts +2 -2
  22. package/dist/components/Progress.js +2 -2
  23. package/dist/components/Spinner.d.ts +2 -2
  24. package/dist/components/index.d.ts +9 -9
  25. package/dist/components/index.js +9 -9
  26. package/dist/data/nf-glyphs.d.ts +2 -2
  27. package/dist/demo-registry.d.ts.map +1 -1
  28. package/dist/demo-registry.js +6 -1
  29. package/dist/demo-registry.js.map +1 -1
  30. package/dist/demos/2048.js +559 -0
  31. package/dist/demos/2048.ts +1 -1
  32. package/dist/demos/animation.js +177 -0
  33. package/dist/demos/animation.ts +1 -1
  34. package/dist/demos/demo-layout.js +85 -0
  35. package/dist/demos/demo-layout.ts +6 -1
  36. package/dist/demos/engine.js +244 -0
  37. package/dist/demos/interaction.js +74 -0
  38. package/dist/demos/interaction.ts +1 -1
  39. package/dist/demos/login.js +175 -0
  40. package/dist/demos/login.ts +1 -1
  41. package/dist/demos/mission-control.js +427 -0
  42. package/dist/demos/platformer-physics.js +122 -0
  43. package/dist/demos/platformer-physics.ts +284 -0
  44. package/dist/demos/platformer.js +519 -0
  45. package/dist/demos/platformer.ts +761 -0
  46. package/dist/demos/showcase.js +181 -0
  47. package/dist/demos/showcase.ts +1 -1
  48. package/dist/diagnostics.d.ts +2 -2
  49. package/dist/dsl/context.d.ts +2 -2
  50. package/dist/dsl/context.d.ts.map +1 -1
  51. package/dist/dsl/context.js +14 -14
  52. package/dist/dsl/context.js.map +1 -1
  53. package/dist/dsl/hooks.d.ts +2 -2
  54. package/dist/dsl/hooks.js +1 -1
  55. package/dist/dsl/interaction.d.ts +3 -3
  56. package/dist/dsl/layers.d.ts +2 -2
  57. package/dist/dsl/motion.d.ts +2 -2
  58. package/dist/dsl/motion.js +2 -2
  59. package/dist/dsl/render.d.ts +2 -2
  60. package/dist/dsl/render.d.ts.map +1 -1
  61. package/dist/dsl/render.js +4 -8
  62. package/dist/dsl/render.js.map +1 -1
  63. package/dist/dsl/types.d.ts +11 -10
  64. package/dist/dsl/types.d.ts.map +1 -1
  65. package/dist/dsl/types.js.map +1 -1
  66. package/dist/dsl.d.ts +4 -4
  67. package/dist/dsl.js +3 -3
  68. package/dist/easing.d.ts +1 -1
  69. package/dist/geometry.d.ts +1 -1
  70. package/dist/geometry.js +1 -1
  71. package/dist/icons-full.d.ts +2 -2
  72. package/dist/icons-full.js +3 -3
  73. package/dist/icons.d.ts +4 -4
  74. package/dist/icons.js +3 -3
  75. package/dist/index.d.ts +42 -33
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +29 -24
  78. package/dist/index.js.map +1 -1
  79. package/dist/layout.d.ts +18 -6
  80. package/dist/layout.d.ts.map +1 -1
  81. package/dist/layout.js +15 -6
  82. package/dist/layout.js.map +1 -1
  83. package/dist/pixels.d.ts +51 -0
  84. package/dist/pixels.d.ts.map +1 -0
  85. package/dist/pixels.js +82 -0
  86. package/dist/pixels.js.map +1 -0
  87. package/dist/render.d.ts +1 -1
  88. package/dist/render.d.ts.map +1 -1
  89. package/dist/render.js +44 -10
  90. package/dist/render.js.map +1 -1
  91. package/dist/state.d.ts +4 -4
  92. package/dist/state.js +1 -1
  93. package/dist/theme.d.ts +2 -2
  94. package/dist/theme.js +1 -1
  95. package/dist/themes/catppuccin-mocha.d.ts +1 -1
  96. package/dist/themes/catppuccin-mocha.js +1 -1
  97. package/dist/themes/dracula.d.ts +1 -1
  98. package/dist/themes/dracula.js +1 -1
  99. package/dist/themes/github-light.d.ts +1 -1
  100. package/dist/themes/github-light.js +1 -1
  101. package/dist/themes/index.d.ts +7 -7
  102. package/dist/themes/index.js +6 -6
  103. package/dist/themes/nord.d.ts +1 -1
  104. package/dist/themes/nord.js +1 -1
  105. package/dist/themes/one-dark-pro.d.ts +1 -1
  106. package/dist/themes/one-dark-pro.js +1 -1
  107. package/dist/themes/tokyo-night.d.ts +1 -1
  108. package/dist/themes/tokyo-night.js +1 -1
  109. package/dist/utils.d.ts +6 -1
  110. package/dist/utils.d.ts.map +1 -1
  111. package/dist/utils.js +68 -3
  112. package/dist/utils.js.map +1 -1
  113. package/llms.txt +4 -2
  114. package/package.json +8 -4
package/dist/utils.js CHANGED
@@ -9,8 +9,66 @@ export function stripAnsi(str) {
9
9
  return '';
10
10
  return str.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
11
11
  }
12
+ let segmenter = null;
13
+ function getSegmenter() {
14
+ if (!segmenter) {
15
+ segmenter = new Intl.Segmenter();
16
+ }
17
+ return segmenter;
18
+ }
19
+ function graphemeWidth(segment) {
20
+ const cp = segment.codePointAt(0);
21
+ if (cp === undefined)
22
+ return 0;
23
+ // Zero-width control codes and format characters
24
+ if (cp <= 0x1f || (cp >= 0x7f && cp <= 0x9f))
25
+ return 0;
26
+ if (cp === 0x200b || cp === 0xfeff || cp === 0xad)
27
+ return 0; // zero-width space, BOM, soft hyphen
28
+ // Emoji / Extended Pictographic (Intl.Segmenter groups whole emoji grapheme clusters)
29
+ if (/\p{Extended_Pictographic}/u.test(segment)) {
30
+ return 2;
31
+ }
32
+ // East Asian Wide / Fullwidth characters
33
+ if ((cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo
34
+ (cp >= 0x2e80 && cp <= 0xa4cf && cp !== 0x303f) || // CJK Radicals, Kangxi, Ideographic, Hiragana, Katakana, Bopomofo, Hangul, CJK Unified
35
+ (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables
36
+ (cp >= 0xf900 && cp <= 0xfaff) || // CJK Compatibility Ideographs
37
+ (cp >= 0xfe10 && cp <= 0xfe19) || // Vertical forms
38
+ (cp >= 0xfe30 && cp <= 0xfe6f) || // CJK Compatibility Forms
39
+ (cp >= 0xff01 && cp <= 0xff60) || // Fullwidth Forms
40
+ (cp >= 0xffe0 && cp <= 0xffe6) || // Fullwidth signs
41
+ (cp >= 0x20000 && cp <= 0x3fffd) // CJK Unified Ideographs Extension
42
+ ) {
43
+ return 2;
44
+ }
45
+ // Combining characters
46
+ if ((cp >= 0x0300 && cp <= 0x036f) ||
47
+ (cp >= 0x1ab0 && cp <= 0x1aff) ||
48
+ (cp >= 0x1dc0 && cp <= 0x1dff) ||
49
+ (cp >= 0x20d0 && cp <= 0x20ff) ||
50
+ (cp >= 0xfe20 && cp <= 0xfe2f)) {
51
+ return 0;
52
+ }
53
+ return 1;
54
+ }
12
55
  /**
13
- * Calculates the visible width of a string using Bun's SIMD-optimized API.
56
+ * Calculates string width using Intl.Segmenter and Unicode tables when Bun.stringWidth is unavailable.
57
+ */
58
+ export function stringWidthFallback(str) {
59
+ if (!str)
60
+ return 0;
61
+ const clean = stripAnsi(str);
62
+ const seg = getSegmenter();
63
+ let width = 0;
64
+ for (const { segment } of seg.segment(clean)) {
65
+ width += graphemeWidth(segment);
66
+ }
67
+ return width;
68
+ }
69
+ /**
70
+ * Calculates the visible width of a string (using Bun's SIMD API when on Bun,
71
+ * falling back to Intl.Segmenter unicode width on Node).
14
72
  */
15
73
  export function visibleWidth(str) {
16
74
  if (!str)
@@ -19,7 +77,11 @@ export function visibleWidth(str) {
19
77
  if (lines.length > 1) {
20
78
  return Math.max(...lines.map(visibleWidth));
21
79
  }
22
- return Bun.stringWidth(stripAnsi(str));
80
+ const clean = stripAnsi(str);
81
+ if (typeof Bun !== 'undefined' && typeof Bun.stringWidth === 'function') {
82
+ return Bun.stringWidth(clean);
83
+ }
84
+ return stringWidthFallback(clean);
23
85
  }
24
86
  /**
25
87
  * Returns the width of a single character or grapheme.
@@ -28,7 +90,10 @@ export function charWidth(char) {
28
90
  const clean = stripAnsi(char);
29
91
  if (clean.length === 0)
30
92
  return 0;
31
- return Bun.stringWidth(clean);
93
+ if (typeof Bun !== 'undefined' && typeof Bun.stringWidth === 'function') {
94
+ return Bun.stringWidth(clean);
95
+ }
96
+ return stringWidthFallback(clean);
32
97
  }
33
98
  /**
34
99
  * Truncates a string to a visible width while preserving ANSI codes.
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/llms.txt CHANGED
@@ -1,17 +1,19 @@
1
1
  # Bunti
2
2
 
3
- > A Bun-native terminal UI engine with zero dependencies: 60fps
3
+ > A terminal UI engine optimized for Bun and Node.js with zero dependencies: 60fps
4
4
  > double-buffered diff rendering, an immediate-mode contextual DSL,
5
5
  > semantic themes (6 VS Code presets), mouse + keyboard input, motion
6
6
  > helpers, and a 10.7k-name Nerd Font icon registry. Built to be the
7
7
  > easiest TUI library for coding agents.
8
8
 
9
- Requires the Bun runtime (>= 1.0); Node.js is not supported.
9
+ Requires Bun (>= 1.0, with native SIMD vectorization for speed) or Node.js (>= 22.0.0 LTS); zero runtime dependencies.
10
10
 
11
11
  ## Install
12
12
 
13
13
  ```bash
14
14
  bun add @zakmandhro/bunti
15
+ # or
16
+ npm install @zakmandhro/bunti
15
17
  ```
16
18
 
17
19
  ## Mental model
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zakmandhro/bunti",
3
- "version": "0.2.1",
4
- "description": "A Bun-native terminal layout engine with zero dependencies, 60fps rendering, and an agent-optimized functional API.",
3
+ "version": "0.3.0",
4
+ "description": "A zero-dependency terminal layout engine for Bun and Node.js with 60fps diff rendering and an agent-optimized functional API.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -44,14 +44,16 @@
44
44
  "bunti": "dist/cli.js"
45
45
  },
46
46
  "engines": {
47
+ "node": ">=22.0.0",
47
48
  "bun": ">=1.0.0"
48
49
  },
49
50
  "scripts": {
50
- "build": "rm -rf dist && tsc -p tsconfig.build.json && bun scripts/build-demos.ts",
51
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && bun scripts/fix-esm-imports.ts && bun scripts/build-demos.ts",
51
52
  "gen:llms": "bun scripts/gen-llms.ts",
52
53
  "prepublishOnly": "bun run typecheck && bun run lint && bun run test && bun run gen:llms && bun run build",
53
54
  "test": "bun test",
54
55
  "smoke": "bun scripts/smoke-demos.ts",
56
+ "smoke:node": "node scripts/smoke-node.mjs",
55
57
  "bench": "bun scripts/bench.ts",
56
58
  "typecheck": "tsc --noEmit",
57
59
  "type-check": "tsc --noEmit",
@@ -63,7 +65,8 @@
63
65
  "record": "vhs tapes/2048.tape",
64
66
  "record:animation": "vhs tapes/animation.tape",
65
67
  "record:mission-control": "vhs tapes/mission-control.tape",
66
- "record:all": "vhs tapes/2048.tape && vhs tapes/animation.tape && vhs tapes/mission-control.tape",
68
+ "record:platformer": "vhs tapes/platformer.tape",
69
+ "record:all": "vhs tapes/2048.tape && vhs tapes/animation.tape && vhs tapes/mission-control.tape && vhs tapes/platformer.tape",
67
70
  "docs:dev": "vitepress dev docs",
68
71
  "docs:build": "vitepress build docs",
69
72
  "docs:preview": "vitepress preview docs"
@@ -74,6 +77,7 @@
74
77
  "terminal",
75
78
  "layout",
76
79
  "bun",
80
+ "node",
77
81
  "bunti"
78
82
  ],
79
83
  "author": "Zak Mandhro <zakmandhro@gmail.com>",