@zakmandhro/bunti 0.1.4 → 0.2.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 (203) hide show
  1. package/AGENTS.md +65 -0
  2. package/README.md +145 -34
  3. package/dist/cli.d.ts +44 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +147 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/colors.d.ts +144 -0
  8. package/dist/colors.d.ts.map +1 -0
  9. package/dist/colors.js +426 -0
  10. package/dist/colors.js.map +1 -0
  11. package/dist/components/Box.d.ts +11 -0
  12. package/dist/components/Box.d.ts.map +1 -0
  13. package/dist/components/Box.js +9 -0
  14. package/dist/components/Box.js.map +1 -0
  15. package/dist/components/Button.d.ts +24 -0
  16. package/dist/components/Button.d.ts.map +1 -0
  17. package/dist/components/Button.js +102 -0
  18. package/dist/components/Button.js.map +1 -0
  19. package/dist/components/Card.d.ts +33 -0
  20. package/dist/components/Card.d.ts.map +1 -0
  21. package/dist/components/Card.js +79 -0
  22. package/dist/components/Card.js.map +1 -0
  23. package/dist/components/Header.d.ts +23 -0
  24. package/dist/components/Header.d.ts.map +1 -0
  25. package/dist/components/Header.js +58 -0
  26. package/dist/components/Header.js.map +1 -0
  27. package/dist/components/Input.d.ts +25 -0
  28. package/dist/components/Input.d.ts.map +1 -0
  29. package/dist/components/Input.js +232 -0
  30. package/dist/components/Input.js.map +1 -0
  31. package/dist/components/Link.d.ts +21 -0
  32. package/dist/components/Link.d.ts.map +1 -0
  33. package/dist/components/Link.js +29 -0
  34. package/dist/components/Link.js.map +1 -0
  35. package/dist/components/Modal.d.ts +38 -0
  36. package/dist/components/Modal.d.ts.map +1 -0
  37. package/dist/components/Modal.js +87 -0
  38. package/dist/components/Modal.js.map +1 -0
  39. package/dist/components/Progress.d.ts +27 -0
  40. package/dist/components/Progress.d.ts.map +1 -0
  41. package/dist/components/Progress.js +39 -0
  42. package/dist/components/Progress.js.map +1 -0
  43. package/dist/components/Spinner.d.ts +19 -0
  44. package/dist/components/Spinner.d.ts.map +1 -0
  45. package/dist/components/Spinner.js +27 -0
  46. package/dist/components/Spinner.js.map +1 -0
  47. package/dist/components/index.d.ts +10 -0
  48. package/dist/components/index.d.ts.map +1 -0
  49. package/dist/components/index.js +10 -0
  50. package/dist/components/index.js.map +1 -0
  51. package/dist/data/nf-glyphs.d.ts +11 -0
  52. package/dist/data/nf-glyphs.d.ts.map +1 -0
  53. package/dist/data/nf-glyphs.js +535 -0
  54. package/dist/data/nf-glyphs.js.map +1 -0
  55. package/dist/data/nf-names.d.ts +8 -0
  56. package/dist/data/nf-names.d.ts.map +1 -0
  57. package/dist/data/nf-names.js +2 -0
  58. package/dist/data/nf-names.js.map +1 -0
  59. package/dist/demo-registry.d.ts +27 -0
  60. package/dist/demo-registry.d.ts.map +1 -0
  61. package/dist/demo-registry.js +57 -0
  62. package/dist/demo-registry.js.map +1 -0
  63. package/dist/demos/2048.ts +743 -0
  64. package/dist/demos/animation.ts +246 -0
  65. package/dist/demos/demo-layout.ts +124 -0
  66. package/dist/demos/engine.ts +374 -0
  67. package/dist/demos/interaction.ts +91 -0
  68. package/dist/demos/login.ts +203 -0
  69. package/dist/demos/mission-control.ts +558 -0
  70. package/dist/demos/showcase.ts +224 -0
  71. package/dist/detect.d.ts +104 -0
  72. package/dist/detect.d.ts.map +1 -0
  73. package/dist/detect.js +227 -0
  74. package/dist/detect.js.map +1 -0
  75. package/dist/diagnostics.d.ts +73 -0
  76. package/dist/diagnostics.d.ts.map +1 -0
  77. package/dist/diagnostics.js +225 -0
  78. package/dist/diagnostics.js.map +1 -0
  79. package/dist/dsl/context.d.ts +11 -0
  80. package/dist/dsl/context.d.ts.map +1 -0
  81. package/dist/dsl/context.js +563 -0
  82. package/dist/dsl/context.js.map +1 -0
  83. package/dist/dsl/hooks.d.ts +12 -0
  84. package/dist/dsl/hooks.d.ts.map +1 -0
  85. package/dist/dsl/hooks.js +148 -0
  86. package/dist/dsl/hooks.js.map +1 -0
  87. package/dist/dsl/interaction.d.ts +16 -0
  88. package/dist/dsl/interaction.d.ts.map +1 -0
  89. package/dist/dsl/interaction.js +101 -0
  90. package/dist/dsl/interaction.js.map +1 -0
  91. package/dist/dsl/layers.d.ts +14 -0
  92. package/dist/dsl/layers.d.ts.map +1 -0
  93. package/dist/dsl/layers.js +87 -0
  94. package/dist/dsl/layers.js.map +1 -0
  95. package/dist/dsl/motion.d.ts +10 -0
  96. package/dist/dsl/motion.d.ts.map +1 -0
  97. package/dist/dsl/motion.js +150 -0
  98. package/dist/dsl/motion.js.map +1 -0
  99. package/dist/dsl/render.d.ts +22 -0
  100. package/dist/dsl/render.d.ts.map +1 -0
  101. package/dist/dsl/render.js +69 -0
  102. package/dist/dsl/render.js.map +1 -0
  103. package/dist/dsl/types.d.ts +510 -0
  104. package/dist/dsl/types.d.ts.map +1 -0
  105. package/dist/dsl/types.js +33 -0
  106. package/dist/dsl/types.js.map +1 -0
  107. package/dist/dsl.d.ts +18 -0
  108. package/dist/dsl.d.ts.map +1 -0
  109. package/dist/dsl.js +17 -0
  110. package/dist/dsl.js.map +1 -0
  111. package/dist/easing.d.ts +45 -0
  112. package/dist/easing.d.ts.map +1 -0
  113. package/dist/easing.js +121 -0
  114. package/dist/easing.js.map +1 -0
  115. package/dist/geometry.d.ts +77 -0
  116. package/dist/geometry.d.ts.map +1 -0
  117. package/dist/geometry.js +130 -0
  118. package/dist/geometry.js.map +1 -0
  119. package/dist/icons-full.d.ts +5 -0
  120. package/dist/icons-full.d.ts.map +1 -0
  121. package/dist/icons-full.js +31 -0
  122. package/dist/icons-full.js.map +1 -0
  123. package/dist/icons.d.ts +442 -0
  124. package/dist/icons.d.ts.map +1 -0
  125. package/dist/icons.js +314 -0
  126. package/dist/icons.js.map +1 -0
  127. package/dist/index.d.ts +228 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +46 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/input.d.ts +177 -0
  132. package/dist/input.d.ts.map +1 -0
  133. package/dist/input.js +533 -0
  134. package/dist/input.js.map +1 -0
  135. package/dist/layout.d.ts +194 -0
  136. package/dist/layout.d.ts.map +1 -0
  137. package/dist/layout.js +673 -0
  138. package/dist/layout.js.map +1 -0
  139. package/dist/render.d.ts +49 -0
  140. package/dist/render.d.ts.map +1 -0
  141. package/dist/render.js +650 -0
  142. package/dist/render.js.map +1 -0
  143. package/dist/state.d.ts +226 -0
  144. package/dist/state.d.ts.map +1 -0
  145. package/dist/state.js +130 -0
  146. package/dist/state.js.map +1 -0
  147. package/dist/theme.d.ts +129 -0
  148. package/dist/theme.d.ts.map +1 -0
  149. package/dist/theme.js +167 -0
  150. package/dist/theme.js.map +1 -0
  151. package/dist/themes/catppuccin-mocha.d.ts +19 -0
  152. package/dist/themes/catppuccin-mocha.d.ts.map +1 -0
  153. package/dist/themes/catppuccin-mocha.js +36 -0
  154. package/dist/themes/catppuccin-mocha.js.map +1 -0
  155. package/dist/themes/dracula.d.ts +21 -0
  156. package/dist/themes/dracula.d.ts.map +1 -0
  157. package/dist/themes/dracula.js +37 -0
  158. package/dist/themes/dracula.js.map +1 -0
  159. package/dist/themes/github-light.d.ts +21 -0
  160. package/dist/themes/github-light.d.ts.map +1 -0
  161. package/dist/themes/github-light.js +36 -0
  162. package/dist/themes/github-light.js.map +1 -0
  163. package/dist/themes/index.d.ts +19 -0
  164. package/dist/themes/index.d.ts.map +1 -0
  165. package/dist/themes/index.js +17 -0
  166. package/dist/themes/index.js.map +1 -0
  167. package/dist/themes/nord.d.ts +23 -0
  168. package/dist/themes/nord.d.ts.map +1 -0
  169. package/dist/themes/nord.js +38 -0
  170. package/dist/themes/nord.js.map +1 -0
  171. package/dist/themes/one-dark-pro.d.ts +21 -0
  172. package/dist/themes/one-dark-pro.d.ts.map +1 -0
  173. package/dist/themes/one-dark-pro.js +36 -0
  174. package/dist/themes/one-dark-pro.js.map +1 -0
  175. package/dist/themes/tokyo-night.d.ts +20 -0
  176. package/dist/themes/tokyo-night.d.ts.map +1 -0
  177. package/dist/themes/tokyo-night.js +37 -0
  178. package/dist/themes/tokyo-night.js.map +1 -0
  179. package/dist/utils.d.ts +28 -0
  180. package/dist/utils.d.ts.map +1 -0
  181. package/dist/utils.js +158 -0
  182. package/dist/utils.js.map +1 -0
  183. package/dist/vendor/colors.d.ts +45 -0
  184. package/dist/vendor/colors.d.ts.map +1 -0
  185. package/dist/vendor/colors.js +72 -0
  186. package/dist/vendor/colors.js.map +1 -0
  187. package/llms.txt +79 -0
  188. package/package.json +52 -11
  189. package/src/colors.ts +0 -255
  190. package/src/components/Button.ts +0 -104
  191. package/src/components/Card.ts +0 -53
  192. package/src/components/Header.ts +0 -65
  193. package/src/components/Input.ts +0 -124
  194. package/src/components/index.ts +0 -4
  195. package/src/data/glyphs.ts +0 -30
  196. package/src/detect.ts +0 -60
  197. package/src/dsl.ts +0 -661
  198. package/src/icons.ts +0 -186
  199. package/src/index.ts +0 -72
  200. package/src/layout.ts +0 -640
  201. package/src/render.ts +0 -302
  202. package/src/state.ts +0 -148
  203. package/src/utils.ts +0 -165
package/dist/colors.js ADDED
@@ -0,0 +1,426 @@
1
+ /**
2
+ * Bunti Semantic & Palette Color System
3
+ */
4
+ import { colorTier } from './detect';
5
+ import { hintsSuppressed, nearestMatch, recordHint } from './diagnostics';
6
+ /**
7
+ * Internal brand carried by ThemeColor instances so callable theme tokens can
8
+ * be distinguished from plain function-style border wrappers.
9
+ */
10
+ export const THEME_COLOR = Symbol.for('bunti.theme-color');
11
+ /**
12
+ * Returns true when the value is a ThemeColor (callable fg-styler carrying
13
+ * `.rgb` and `.hex`), detected via the internal brand symbol.
14
+ */
15
+ export function isThemeColor(value) {
16
+ return (typeof value === 'function' &&
17
+ value[THEME_COLOR] === true);
18
+ }
19
+ /**
20
+ * Bunti's named color palette (ANSI-256 codes). Any name here works as a
21
+ * color value: `fg('bunti-blue', text)`, `{ bgColor: 'midnight' }`.
22
+ */
23
+ export const PALETTE = {
24
+ // Greyscale
25
+ slate: '235',
26
+ ash: '240',
27
+ gray: '244',
28
+ silver: '247',
29
+ white: '255',
30
+ black: '0',
31
+ // Deep Blues & Space
32
+ midnight: '17',
33
+ ocean: '24',
34
+ sky: '33',
35
+ 'bunti-blue': '38',
36
+ 'deep-navy': '17',
37
+ nebula: '61',
38
+ plasma: '165',
39
+ // Semantic
40
+ success: '40',
41
+ warning: '214',
42
+ error: '196',
43
+ info: '39',
44
+ // Accents
45
+ gold: '220',
46
+ rose: '211',
47
+ mint: '121',
48
+ };
49
+ const RGB_REGISTRY = {
50
+ black: { r: 0, g: 0, b: 0 },
51
+ red: { r: 200, g: 50, b: 50 },
52
+ green: { r: 50, g: 200, b: 50 },
53
+ yellow: { r: 200, g: 200, b: 50 },
54
+ blue: { r: 50, g: 50, b: 200 },
55
+ magenta: { r: 200, g: 50, b: 200 },
56
+ cyan: { r: 50, g: 200, b: 200 },
57
+ white: { r: 255, g: 255, b: 255 },
58
+ gray: { r: 128, g: 128, b: 128 },
59
+ // Greyscale
60
+ slate: { r: 40, g: 44, b: 52 },
61
+ ash: { r: 75, g: 82, b: 99 },
62
+ silver: { r: 188, g: 192, b: 204 },
63
+ // Deep Blues & Space
64
+ midnight: { r: 15, g: 15, b: 35 },
65
+ ocean: { r: 20, g: 40, b: 80 },
66
+ sky: { r: 0, g: 135, b: 255 },
67
+ 'bunti-blue': { r: 59, g: 188, b: 225 },
68
+ 'deep-navy': { r: 0, g: 51, b: 102 },
69
+ nebula: { r: 95, g: 95, b: 175 },
70
+ plasma: { r: 201, g: 0, b: 255 },
71
+ // Semantic
72
+ success: { r: 0, g: 215, b: 0 },
73
+ warning: { r: 255, g: 175, b: 0 },
74
+ error: { r: 215, g: 0, b: 0 },
75
+ info: { r: 0, g: 175, b: 255 },
76
+ // Accents
77
+ gold: { r: 255, g: 215, b: 0 },
78
+ rose: { r: 255, g: 175, b: 175 },
79
+ mint: { r: 175, g: 255, b: 175 },
80
+ };
81
+ // Map standard names to ANSI-256 for basic compat
82
+ const NAME_TO_ANSI = {
83
+ red: '160',
84
+ green: '40',
85
+ yellow: '220',
86
+ blue: '33',
87
+ magenta: '165',
88
+ cyan: '39',
89
+ white: '255',
90
+ black: '0',
91
+ gray: '244',
92
+ };
93
+ /**
94
+ * Parses a hex color string (#RGB, #RGBA, #RRGGBB, or #RRGGBBAA) to an RGB
95
+ * object. Alpha channels are composited over `base` (defaults to black), so
96
+ * `#ffffff80` over black resolves to mid-gray.
97
+ */
98
+ export function hexToRGB(hex, base = { r: 0, g: 0, b: 0 }) {
99
+ let h = hex.replace('#', '');
100
+ if (h.length === 3 || h.length === 4) {
101
+ let expanded = '';
102
+ for (const c of h)
103
+ expanded += c + c;
104
+ h = expanded;
105
+ }
106
+ const r = parseInt(h.substring(0, 2), 16);
107
+ const g = parseInt(h.substring(2, 4), 16);
108
+ const b = parseInt(h.substring(4, 6), 16);
109
+ if (h.length === 8) {
110
+ const a = parseInt(h.substring(6, 8), 16) / 255;
111
+ return {
112
+ r: Math.round(r * a + base.r * (1 - a)),
113
+ g: Math.round(g * a + base.g * (1 - a)),
114
+ b: Math.round(b * a + base.b * (1 - a)),
115
+ };
116
+ }
117
+ return { r, g, b };
118
+ }
119
+ /**
120
+ * Formats an RGB object as a #rrggbb hex string.
121
+ */
122
+ export function rgbToHex(rgb) {
123
+ const h = (v) => Math.max(0, Math.min(255, Math.round(v)))
124
+ .toString(16)
125
+ .padStart(2, '0');
126
+ return `#${h(rgb.r)}${h(rgb.g)}${h(rgb.b)}`;
127
+ }
128
+ // Exact xterm 256-color model: 16 base colors + 6x6x6 cube + 24-step gray ramp.
129
+ const CUBE_LEVELS = [0, 95, 135, 175, 215, 255];
130
+ const BASE16 = [
131
+ { r: 0, g: 0, b: 0 },
132
+ { r: 128, g: 0, b: 0 },
133
+ { r: 0, g: 128, b: 0 },
134
+ { r: 128, g: 128, b: 0 },
135
+ { r: 0, g: 0, b: 128 },
136
+ { r: 128, g: 0, b: 128 },
137
+ { r: 0, g: 128, b: 128 },
138
+ { r: 192, g: 192, b: 192 },
139
+ { r: 128, g: 128, b: 128 },
140
+ { r: 255, g: 0, b: 0 },
141
+ { r: 0, g: 255, b: 0 },
142
+ { r: 255, g: 255, b: 0 },
143
+ { r: 0, g: 0, b: 255 },
144
+ { r: 255, g: 0, b: 255 },
145
+ { r: 0, g: 255, b: 255 },
146
+ { r: 255, g: 255, b: 255 },
147
+ ];
148
+ /**
149
+ * Converts an ANSI-256 code to its exact xterm RGB value
150
+ * (16 base + 6x6x6 color cube + 24-step gray ramp).
151
+ */
152
+ export function ansi256ToRGB(code) {
153
+ const c = Math.max(0, Math.min(255, Math.trunc(code)));
154
+ if (c < 16)
155
+ return { ...BASE16[c] };
156
+ if (c < 232) {
157
+ const n = c - 16;
158
+ return {
159
+ r: CUBE_LEVELS[Math.floor(n / 36)],
160
+ g: CUBE_LEVELS[Math.floor(n / 6) % 6],
161
+ b: CUBE_LEVELS[n % 6],
162
+ };
163
+ }
164
+ const v = 8 + (c - 232) * 10;
165
+ return { r: v, g: v, b: v };
166
+ }
167
+ function nearestCubeIndex(v) {
168
+ return v < 48 ? 0 : v < 115 ? 1 : Math.min(5, Math.floor((v - 35) / 40));
169
+ }
170
+ /**
171
+ * Quantizes an RGB value to the nearest ANSI-256 code
172
+ * (best of the 6x6x6 cube vs the gray ramp).
173
+ */
174
+ export function rgbTo256(rgb) {
175
+ const ri = nearestCubeIndex(rgb.r);
176
+ const gi = nearestCubeIndex(rgb.g);
177
+ const bi = nearestCubeIndex(rgb.b);
178
+ const cr = CUBE_LEVELS[ri];
179
+ const cg = CUBE_LEVELS[gi];
180
+ const cb = CUBE_LEVELS[bi];
181
+ const cubeDist = (cr - rgb.r) ** 2 + (cg - rgb.g) ** 2 + (cb - rgb.b) ** 2;
182
+ const avg = (rgb.r + rgb.g + rgb.b) / 3;
183
+ const grayIdx = Math.max(0, Math.min(23, Math.round((avg - 8) / 10)));
184
+ const gv = 8 + grayIdx * 10;
185
+ const grayDist = (gv - rgb.r) ** 2 + (gv - rgb.g) ** 2 + (gv - rgb.b) ** 2;
186
+ return grayDist < cubeDist ? 232 + grayIdx : 16 + 36 * ri + 6 * gi + bi;
187
+ }
188
+ /**
189
+ * Quantizes an RGB value to the nearest of the 16 base ANSI colors.
190
+ */
191
+ export function rgbTo16(rgb) {
192
+ let best = 0;
193
+ let bestDist = Infinity;
194
+ for (let i = 0; i < 16; i++) {
195
+ const c = BASE16[i];
196
+ const dist = (c.r - rgb.r) ** 2 + (c.g - rgb.g) ** 2 + (c.b - rgb.b) ** 2;
197
+ if (dist < bestDist) {
198
+ bestDist = dist;
199
+ best = i;
200
+ }
201
+ }
202
+ return best;
203
+ }
204
+ function quantizeRGB(rgb, tier) {
205
+ if (tier === 'truecolor')
206
+ return `2;${rgb.r};${rgb.g};${rgb.b}`;
207
+ return tier === '256' ? rgbTo256(rgb) : rgbTo16(rgb);
208
+ }
209
+ // Dev diagnostics: unknown color names hint once each (buffered to exit).
210
+ // The Set keeps the per-cell hot path O(1) after the first sighting.
211
+ const reportedUnknownColors = new Set();
212
+ function reportUnknownColorName(name) {
213
+ if (reportedUnknownColors.has(name))
214
+ return;
215
+ reportedUnknownColors.add(name);
216
+ if (hintsSuppressed())
217
+ return;
218
+ const suggestion = nearestMatch(name, [
219
+ ...Object.keys(PALETTE),
220
+ ...Object.keys(NAME_TO_ANSI),
221
+ ]);
222
+ recordHint(`unknown color name '${name}' passed through as a raw ANSI code` +
223
+ `${suggestion ? ` (did you mean '${suggestion}'?)` : ''}`);
224
+ }
225
+ /**
226
+ * Resolves a palette name, color code, RGB object, or ThemeColor to an ANSI
227
+ * color code, quantized to the active color tier. Returns undefined on the
228
+ * 'mono' tier (NO_COLOR), which suppresses color output entirely.
229
+ */
230
+ export function resolveColor(color) {
231
+ const tier = colorTier();
232
+ if (tier === 'mono')
233
+ return undefined;
234
+ const value = isThemeColor(color)
235
+ ? color.rgb
236
+ : color;
237
+ if (typeof value === 'object' && 'r' in value) {
238
+ return quantizeRGB(value, tier);
239
+ }
240
+ if (typeof value === 'string') {
241
+ if (value.startsWith('#')) {
242
+ return quantizeRGB(hexToRGB(value), tier);
243
+ }
244
+ const resolved = PALETTE[value] || NAME_TO_ANSI[value] || value;
245
+ // Unrecognized non-numeric names fall through as raw ANSI codes and
246
+ // render garbage — hint once with a nearest-name suggestion.
247
+ if (resolved === value && !/^\d+$/.test(value) && !value.startsWith('2;')) {
248
+ reportUnknownColorName(value);
249
+ }
250
+ if (tier === '16') {
251
+ const code = Number.parseInt(String(resolved), 10);
252
+ if (Number.isFinite(code) && code > 15) {
253
+ return rgbTo16(ansi256ToRGB(code));
254
+ }
255
+ }
256
+ return resolved;
257
+ }
258
+ if (tier === '16' && value > 15)
259
+ return rgbTo16(ansi256ToRGB(value));
260
+ return value;
261
+ }
262
+ /**
263
+ * Creates a multi-stop gradient (array of RGB objects) between multiple colors.
264
+ */
265
+ export function createGradient(arg1, arg2, arg3) {
266
+ let colors = [];
267
+ let steps = 5;
268
+ if (Array.isArray(arg1)) {
269
+ colors = arg1;
270
+ steps = typeof arg2 === 'number' ? arg2 : 5;
271
+ }
272
+ else if (arg1 && arg2) {
273
+ colors = [arg1, arg2];
274
+ steps = typeof arg3 === 'number' ? arg3 : 5;
275
+ }
276
+ if (colors.length === 0)
277
+ return [];
278
+ if (colors.length === 1)
279
+ return Array(steps).fill(resolveColorToRGB(colors[0]));
280
+ if (steps <= 1)
281
+ return [resolveColorToRGB(colors[0])];
282
+ const result = [];
283
+ const rgbColors = colors.map(resolveColorToRGB);
284
+ for (let i = 0; i < steps; i++) {
285
+ const globalT = i / (steps - 1);
286
+ const segmentCount = rgbColors.length - 1;
287
+ const segmentIdx = Math.min(Math.floor(globalT * segmentCount), segmentCount - 1);
288
+ const start = rgbColors[segmentIdx];
289
+ const end = rgbColors[segmentIdx + 1];
290
+ const t = globalT * segmentCount - segmentIdx;
291
+ result.push({
292
+ r: Math.round(start.r + (end.r - start.r) * t),
293
+ g: Math.round(start.g + (end.g - start.g) * t),
294
+ b: Math.round(start.b + (end.b - start.b) * t),
295
+ });
296
+ }
297
+ return result;
298
+ }
299
+ /**
300
+ * Resolves any color value (name, hex, ANSI-256 code, RGB, ThemeColor) to an
301
+ * exact RGB object. Numeric codes use the exact xterm 256-color table.
302
+ */
303
+ export function resolveColorToRGB(color) {
304
+ if (isThemeColor(color))
305
+ return color.rgb;
306
+ if (typeof color === 'object' && color !== null && 'r' in color) {
307
+ return color;
308
+ }
309
+ if (typeof color === 'number')
310
+ return ansi256ToRGB(color);
311
+ if (typeof color === 'string') {
312
+ if (color.startsWith('#'))
313
+ return hexToRGB(color);
314
+ // Resolved truecolor code ('2;r;g;b') — cells store these after
315
+ // resolveColor(); dimRect and friends must round-trip them.
316
+ if (color.startsWith('2;')) {
317
+ const parts = color.split(';');
318
+ return {
319
+ r: Number(parts[1]) || 0,
320
+ g: Number(parts[2]) || 0,
321
+ b: Number(parts[3]) || 0,
322
+ };
323
+ }
324
+ if (RGB_REGISTRY[color])
325
+ return RGB_REGISTRY[color];
326
+ const paletteValue = PALETTE[color] ?? NAME_TO_ANSI[color];
327
+ const code = Number.parseInt(paletteValue ?? color, 10);
328
+ if (Number.isFinite(code))
329
+ return ansi256ToRGB(code);
330
+ }
331
+ // Fallback
332
+ return { r: 128, g: 128, b: 128 };
333
+ }
334
+ /**
335
+ * WCAG 2.x relative luminance (0 = black, 1 = white) of any color value.
336
+ */
337
+ export function relativeLuminance(color) {
338
+ const { r, g, b } = resolveColorToRGB(color);
339
+ const lin = (v) => {
340
+ const s = v / 255;
341
+ return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
342
+ };
343
+ return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);
344
+ }
345
+ /**
346
+ * Picks pure black or pure white text for maximum WCAG contrast against the
347
+ * given background color. (White wins below luminance ~0.179, the point where
348
+ * both contrast ratios are equal.)
349
+ */
350
+ export function contrastText(bgColor) {
351
+ return relativeLuminance(bgColor) < 0.1791
352
+ ? { r: 255, g: 255, b: 255 }
353
+ : { r: 0, g: 0, b: 0 };
354
+ }
355
+ /**
356
+ * Adjusts the brightness of a color.
357
+ */
358
+ export function adjustBrightness(color, amount) {
359
+ const rgb = resolveColorToRGB(color);
360
+ const factor = 1 + amount / 100;
361
+ return {
362
+ r: Math.max(0, Math.min(255, Math.round(rgb.r * factor))),
363
+ g: Math.max(0, Math.min(255, Math.round(rgb.g * factor))),
364
+ b: Math.max(0, Math.min(255, Math.round(rgb.b * factor))),
365
+ };
366
+ }
367
+ /**
368
+ * Interpolates between two colors and returns an RGB value.
369
+ */
370
+ export function fade(from, to, progress) {
371
+ const start = resolveColorToRGB(from);
372
+ const end = resolveColorToRGB(to);
373
+ const t = Math.max(0, Math.min(1, progress));
374
+ return {
375
+ r: Math.round(start.r + (end.r - start.r) * t),
376
+ g: Math.round(start.g + (end.g - start.g) * t),
377
+ b: Math.round(start.b + (end.b - start.b) * t),
378
+ };
379
+ }
380
+ /**
381
+ * Returns a function that darkens a color and can be used as a style wrapper.
382
+ */
383
+ export function darken(color, amount = 20) {
384
+ const adjusted = adjustBrightness(color, -amount);
385
+ return (text) => fg(adjusted, text);
386
+ }
387
+ /**
388
+ * Returns a function that lightens a color and can be used as a style wrapper.
389
+ */
390
+ export function lighten(color, amount = 20) {
391
+ const adjusted = adjustBrightness(color, amount);
392
+ return (text) => fg(adjusted, text);
393
+ }
394
+ /**
395
+ * Returns an RGB object for TrueColor rendering.
396
+ */
397
+ export function rgb(r, g, b) {
398
+ return { r, g, b };
399
+ }
400
+ /**
401
+ * Wraps text in a foreground-color ANSI sequence (any color value:
402
+ * palette name, hex, ANSI-256 code, RGB, ThemeColor). On the 'mono' tier
403
+ * the text is returned unstyled.
404
+ * @example fg('#3bbce1', 'hello') // truecolor cyan text
405
+ */
406
+ export function fg(color, text) {
407
+ const code = resolveColor(color);
408
+ if (code === undefined)
409
+ return text;
410
+ const codeStr = String(code);
411
+ const prefix = codeStr.startsWith('2;') ? '38' : '38;5';
412
+ return `\x1b[${prefix};${codeStr}m${text}\x1b[0m`;
413
+ }
414
+ /**
415
+ * Wraps text in a background-color ANSI sequence (any color value). On the
416
+ * 'mono' tier the text is returned unstyled.
417
+ */
418
+ export function bg(color, text) {
419
+ const code = resolveColor(color);
420
+ if (code === undefined)
421
+ return text;
422
+ const codeStr = String(code);
423
+ const prefix = codeStr.startsWith('2;') ? '48' : '48;5';
424
+ return `\x1b[${prefix};${codeStr}m${text}\x1b[0m`;
425
+ }
426
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { BuntiContext, DSLBoxOptions } from '../dsl';
2
+ /** Props for Box — identical to ctx.box() options. */
3
+ export interface BoxProps extends DSLBoxOptions {
4
+ }
5
+ /**
6
+ * Component-style alias for ctx.box(): draws a styled box and renders the
7
+ * callback inside its padded interior. Returns the rendered string.
8
+ * @example Box(ctx, { width: 40, border: 'rounded' }, (s) => s.text('hi'));
9
+ */
10
+ export declare function Box(ctx: BuntiContext, props: BoxProps, callback: (sub: BuntiContext) => void): string;
11
+ //# sourceMappingURL=Box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Box.d.ts","sourceRoot":"","sources":["../../src/components/Box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE1D,sDAAsD;AACtD,MAAM,WAAW,QAAS,SAAQ,aAAa;CAAG;AAElD;;;;GAIG;AACH,wBAAgB,GAAG,CACjB,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,UAGtC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Component-style alias for ctx.box(): draws a styled box and renders the
3
+ * callback inside its padded interior. Returns the rendered string.
4
+ * @example Box(ctx, { width: 40, border: 'rounded' }, (s) => s.text('hi'));
5
+ */
6
+ export function Box(ctx, props, callback) {
7
+ return ctx.box(props, callback);
8
+ }
9
+ //# sourceMappingURL=Box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Box.js","sourceRoot":"","sources":["../../src/components/Box.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,UAAU,GAAG,CACjB,GAAiB,EACjB,KAAe,EACf,QAAqC;IAErC,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { BuntiContext, DSLBoxOptions } from '../dsl';
2
+ /** Props for Button. */
3
+ export interface ButtonProps extends DSLBoxOptions {
4
+ /** Stable id: keys the hitbox, Tab-focus slot, and hover state. */
5
+ id: string;
6
+ /** Button text. */
7
+ label: string;
8
+ /** Glyph rendered before the label (use ctx.icon(name)). */
9
+ icon?: string;
10
+ /**
11
+ * Visual style, mapped to theme tokens: 'primary' = filled pill,
12
+ * 'danger' = filled red, 'ghost' = borderless text, default = outlined.
13
+ */
14
+ variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
15
+ /** Fires once per activation (mouse click release, Enter, or Space). */
16
+ onClick?: () => void;
17
+ }
18
+ /**
19
+ * Themed push button: Tab-focusable, hover/press styled from ctx.theme
20
+ * tokens, activated by click, Enter, or Space (onClick fires once).
21
+ * @example Button(ctx, { id: 'go', label: 'Deploy', variant: 'primary', onClick: deploy });
22
+ */
23
+ export declare function Button(ctx: BuntiContext, props: ButtonProps): string;
24
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/components/Button.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAO1D,wBAAwB;AACxB,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvD,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,UAoG3D"}
@@ -0,0 +1,102 @@
1
+ import { adjustBrightness, contrastText } from '../colors';
2
+ import { indentBlock } from '../utils';
3
+ /**
4
+ * Themed push button: Tab-focusable, hover/press styled from ctx.theme
5
+ * tokens, activated by click, Enter, or Space (onClick fires once).
6
+ * @example Button(ctx, { id: 'go', label: 'Deploy', variant: 'primary', onClick: deploy });
7
+ */
8
+ export function Button(ctx, props) {
9
+ const { box, color, focusable, state, hitbox, resolveLocalRect } = ctx;
10
+ // 1. Register in the global focus loop (for TAB navigation)
11
+ const isSelected = focusable(props.id);
12
+ // 2. Resolve final dimensions to perform Mouse Hit-Testing
13
+ const finalLabel = props.icon ? `${props.icon} ${props.label}` : props.label;
14
+ const isGhost = props.variant === 'ghost';
15
+ const isPill = props.variant === 'primary';
16
+ const filled = isPill || props.variant === 'danger';
17
+ const contentWidth = Math.max(12, finalLabel.length + (isPill ? 6 : 4));
18
+ const contentHeight = filled || isGhost ? 1 : 3;
19
+ const area = resolveLocalRect({
20
+ x: props.x,
21
+ y: props.y ?? ctx.cursorY,
22
+ width: props.width ?? contentWidth,
23
+ height: props.height ?? contentHeight,
24
+ contentWidth,
25
+ contentHeight,
26
+ });
27
+ const interaction = hitbox(props.id, {
28
+ x: area.x,
29
+ y: area.y,
30
+ width: area.width,
31
+ height: area.height,
32
+ });
33
+ const isHovered = interaction.hovered;
34
+ const isActive = isSelected || isHovered;
35
+ // 3. Resolve Theme & State — every color derives from ctx.theme tokens so
36
+ // a live theme swap restyles the button. Hover/pressed shifts are
37
+ // mode-aware: brighten on dark themes, darken on light themes.
38
+ const theme = ctx.theme;
39
+ const shiftDir = theme.mode === 'dark' ? 1 : -1;
40
+ const hover = (base) => adjustBrightness(base, 15 * shiftDir);
41
+ const press = (base) => adjustBrightness(base, 30 * shiftDir);
42
+ let bg = theme.surface;
43
+ let fg = theme.foreground;
44
+ let borderCol = theme.border;
45
+ if (props.variant === 'primary') {
46
+ bg = isActive ? hover(theme.primary) : theme.primary;
47
+ if (interaction.pressed)
48
+ bg = press(theme.primary);
49
+ fg = theme.onPrimary;
50
+ borderCol = bg;
51
+ }
52
+ else if (props.variant === 'danger') {
53
+ bg = isActive ? hover(theme.danger) : theme.danger;
54
+ if (interaction.pressed)
55
+ bg = press(theme.danger);
56
+ fg = contrastText(bg);
57
+ borderCol = bg;
58
+ }
59
+ else if (isGhost) {
60
+ bg = undefined;
61
+ fg = isActive ? hover(theme.foreground) : theme.foreground;
62
+ }
63
+ else if (isActive) {
64
+ // Default variant: focus ring + mode-aware surface shift.
65
+ borderCol = theme.focus;
66
+ bg = interaction.pressed ? press(theme.surface) : hover(theme.surface);
67
+ }
68
+ if (isSelected && props.variant !== 'primary' && !isGhost) {
69
+ borderCol = theme.focus; // Keyboard focus ring
70
+ }
71
+ // 4. Handle Interaction — clicks fire once, on mouse release at the
72
+ // press origin (interaction.pressed would repeat every held frame).
73
+ const wasClicked = interaction.clicked;
74
+ const wasActivated = isSelected && (state.lastKey === 'enter' || state.lastKey === ' ');
75
+ if (wasClicked || wasActivated) {
76
+ if (props.onClick)
77
+ props.onClick();
78
+ }
79
+ // 5. Render the Primitive
80
+ const renderLabel = isPill
81
+ ? `${color.fg(bg, '')}${color.bg(bg, color.fg(fg, ` ${isActive ? color.bold(finalLabel) : finalLabel} `))}${color.fg(bg, '')}`
82
+ : color.fg(fg, isActive ? color.bold(finalLabel) : finalLabel);
83
+ const rendered = box({
84
+ x: area.x,
85
+ y: area.y,
86
+ width: area.width,
87
+ height: area.height,
88
+ border: filled || isGhost ? 'none' : props.border || 'rounded',
89
+ borderColor: borderCol,
90
+ bgColor: isPill || isGhost ? undefined : bg,
91
+ align: props.align || 'center',
92
+ valign: props.valign || 'middle',
93
+ padding: props.padding || [0, isGhost ? 0 : 1],
94
+ detach: props.detach,
95
+ }, ({ text }) => {
96
+ text(renderLabel);
97
+ });
98
+ return !ctx.isRoot && props.detach && props.x === undefined
99
+ ? indentBlock(rendered, area.x)
100
+ : rendered;
101
+ }
102
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../src/components/Button.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { BuntiContext, DSLBoxOptions } from '../dsl';
2
+ /** Card visual variants, mapped to theme tokens. */
3
+ export type CardVariant = 'default' | 'accent' | 'danger';
4
+ /** Props for Card. */
5
+ export interface CardProps extends DSLBoxOptions {
6
+ /** Uppercased header line rendered above the content. */
7
+ title?: string;
8
+ /** Visual variant, mapped to theme tokens (border + title color). */
9
+ variant?: CardVariant;
10
+ /** @deprecated Use `variant` — kept as an alias to avoid breaking callers. */
11
+ theme?: CardVariant;
12
+ /**
13
+ * Registers a hitbox and enables the hover affordance: border lifts to
14
+ * theme.focus and the background shifts one step (mode-aware). Without an
15
+ * id the card has no hitbox and behaves exactly as before.
16
+ */
17
+ id?: string;
18
+ }
19
+ /**
20
+ * Tactical Card Component
21
+ * A structural container with an integrated header. Colors derive from
22
+ * ctx.theme tokens:
23
+ * - default: border `theme.border`, title `theme.muted`
24
+ * - accent: border `theme.border`, title `theme.accent`
25
+ * - danger: border `theme.danger`, title `theme.danger`
26
+ *
27
+ * With an `id`, hovering lifts the border to `theme.focus` and shifts the
28
+ * background one step. Hover styling reads the hitbox registered on the
29
+ * previous frame (immediate-mode: geometry is only exact after a render),
30
+ * which is invisible at interactive frame rates.
31
+ */
32
+ export declare function Card(ctx: BuntiContext, props: CardProps, callback: (sub: BuntiContext) => void): string;
33
+ //# sourceMappingURL=Card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAI1D,oDAAoD;AACpD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1D,sBAAsB;AACtB,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,IAAI,CAClB,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,UAyEtC"}