@zakmandhro/bunti 0.1.4 → 0.1.5

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 (92) hide show
  1. package/README.md +66 -25
  2. package/dist/colors.d.ts +74 -0
  3. package/dist/colors.d.ts.map +1 -0
  4. package/dist/colors.js +227 -0
  5. package/dist/colors.js.map +1 -0
  6. package/dist/components/Box.d.ts +5 -0
  7. package/dist/components/Box.d.ts.map +1 -0
  8. package/dist/components/Box.js +4 -0
  9. package/dist/components/Box.js.map +1 -0
  10. package/dist/components/Button.d.ts +14 -0
  11. package/dist/components/Button.d.ts.map +1 -0
  12. package/dist/components/Button.js +91 -0
  13. package/dist/components/Button.js.map +1 -0
  14. package/dist/components/Card.d.ts +11 -0
  15. package/dist/components/Card.d.ts.map +1 -0
  16. package/dist/components/Card.js +37 -0
  17. package/dist/components/Card.js.map +1 -0
  18. package/dist/components/Header.d.ts +13 -0
  19. package/dist/components/Header.d.ts.map +1 -0
  20. package/dist/components/Header.js +54 -0
  21. package/dist/components/Header.js.map +1 -0
  22. package/dist/components/Input.d.ts +16 -0
  23. package/dist/components/Input.d.ts.map +1 -0
  24. package/dist/components/Input.js +101 -0
  25. package/dist/components/Input.js.map +1 -0
  26. package/dist/components/Modal.d.ts +13 -0
  27. package/dist/components/Modal.d.ts.map +1 -0
  28. package/dist/components/Modal.js +28 -0
  29. package/dist/components/Modal.js.map +1 -0
  30. package/dist/components/index.d.ts +7 -0
  31. package/dist/components/index.d.ts.map +1 -0
  32. package/{src/components/index.ts → dist/components/index.js} +3 -0
  33. package/dist/components/index.js.map +1 -0
  34. package/dist/data/glyphs.d.ts +5 -0
  35. package/dist/data/glyphs.d.ts.map +1 -0
  36. package/dist/data/glyphs.js +29 -0
  37. package/dist/data/glyphs.js.map +1 -0
  38. package/dist/detect.d.ts +15 -0
  39. package/dist/detect.d.ts.map +1 -0
  40. package/dist/detect.js +49 -0
  41. package/dist/detect.js.map +1 -0
  42. package/dist/dsl.d.ts +159 -0
  43. package/dist/dsl.d.ts.map +1 -0
  44. package/dist/dsl.js +663 -0
  45. package/dist/dsl.js.map +1 -0
  46. package/dist/easing.d.ts +5 -0
  47. package/dist/easing.d.ts.map +1 -0
  48. package/dist/easing.js +18 -0
  49. package/dist/easing.js.map +1 -0
  50. package/dist/geometry.d.ts +38 -0
  51. package/dist/geometry.d.ts.map +1 -0
  52. package/dist/geometry.js +110 -0
  53. package/dist/geometry.js.map +1 -0
  54. package/dist/icons.d.ts +21 -0
  55. package/dist/icons.d.ts.map +1 -0
  56. package/dist/icons.js +185 -0
  57. package/dist/icons.js.map +1 -0
  58. package/dist/index.d.ts +157 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +36 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/layout.d.ts +89 -0
  63. package/dist/layout.d.ts.map +1 -0
  64. package/dist/layout.js +533 -0
  65. package/dist/layout.js.map +1 -0
  66. package/dist/render.d.ts +17 -0
  67. package/dist/render.d.ts.map +1 -0
  68. package/dist/render.js +335 -0
  69. package/dist/render.js.map +1 -0
  70. package/dist/state.d.ts +92 -0
  71. package/dist/state.d.ts.map +1 -0
  72. package/dist/state.js +105 -0
  73. package/dist/state.js.map +1 -0
  74. package/dist/utils.d.ts +27 -0
  75. package/dist/utils.d.ts.map +1 -0
  76. package/dist/utils.js +157 -0
  77. package/dist/utils.js.map +1 -0
  78. package/package.json +33 -8
  79. package/src/colors.ts +0 -255
  80. package/src/components/Button.ts +0 -104
  81. package/src/components/Card.ts +0 -53
  82. package/src/components/Header.ts +0 -65
  83. package/src/components/Input.ts +0 -124
  84. package/src/data/glyphs.ts +0 -30
  85. package/src/detect.ts +0 -60
  86. package/src/dsl.ts +0 -661
  87. package/src/icons.ts +0 -186
  88. package/src/index.ts +0 -72
  89. package/src/layout.ts +0 -640
  90. package/src/render.ts +0 -302
  91. package/src/state.ts +0 -148
  92. package/src/utils.ts +0 -165
@@ -0,0 +1,13 @@
1
+ import type { BuntiContext } from '../dsl';
2
+ export interface HeaderProps {
3
+ title: string;
4
+ leftIcon?: string;
5
+ rightLabel?: string;
6
+ theme?: 'light' | 'dark';
7
+ }
8
+ /**
9
+ * Enterprise Tactical Header
10
+ * A full-width, high-signal branding bar.
11
+ */
12
+ export declare function Header(ctx: BuntiContext, props: HeaderProps): void;
13
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/components/Header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAI3C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,QAwD3D"}
@@ -0,0 +1,54 @@
1
+ import { box as engineBox } from '../layout';
2
+ import { Box } from './Box';
3
+ /**
4
+ * Enterprise Tactical Header
5
+ * A full-width, high-signal branding bar.
6
+ */
7
+ export function Header(ctx, props) {
8
+ const { color, joinHorizontal } = ctx;
9
+ // Resolve Theme Colors
10
+ const isLight = props.theme !== 'dark';
11
+ const bg = isLight ? 'white' : 'midnight';
12
+ const fg = isLight ? 236 : 'silver';
13
+ // Master Background Box
14
+ Box(ctx, {
15
+ anchor: 'top',
16
+ width: '100%',
17
+ height: 1,
18
+ bgColor: bg,
19
+ border: 'none',
20
+ padding: [0, 2],
21
+ }, ({ text, split }) => {
22
+ const [leftArea, midArea, rightArea] = split({
23
+ direction: 'horizontal',
24
+ constraints: [12, '1fr', 12],
25
+ });
26
+ // 1. Left: Branding
27
+ const leftStr = props.leftIcon ? color.fg('plasma', props.leftIcon) : '';
28
+ const leftNode = engineBox(leftStr, {
29
+ width: leftArea?.width ?? 0,
30
+ align: 'left',
31
+ border: 'none',
32
+ padding: [0, 0],
33
+ });
34
+ // 2. Center: Title
35
+ const midStr = color.fg(fg, color.bold(props.title));
36
+ const midNode = engineBox(midStr, {
37
+ width: midArea?.width ?? 0,
38
+ align: 'center',
39
+ border: 'none',
40
+ padding: [0, 0],
41
+ });
42
+ // 3. Right: Telemetry / Exit
43
+ const rightStr = props.rightLabel ? color.dim(props.rightLabel) : '';
44
+ const rightNode = engineBox(rightStr, {
45
+ width: rightArea?.width ?? 0,
46
+ align: 'right',
47
+ border: 'none',
48
+ padding: [0, 0],
49
+ });
50
+ // Join and push to render pipeline
51
+ text(joinHorizontal(leftNode, midNode, rightNode));
52
+ });
53
+ }
54
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAS5B;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,GAAiB,EAAE,KAAkB;IAC1D,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;IAEtC,uBAAuB;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;IACvC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IAC1C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEpC,wBAAwB;IACxB,GAAG,CACD,GAAG,EACH;QACE,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;KAChB,EACD,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;YAC3C,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;SAC7B,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE;YAClC,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;YAC3B,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;SAChB,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE;YAChC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;YAC1B,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;SAChB,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,EAAE;YACpC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;YAC5B,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;SAChB,CAAC,CAAC;QAEH,mCAAmC;QACnC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IACrD,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { BuntiContext } from '../dsl';
2
+ import type { StyleOptions } from '../layout';
3
+ export interface InputProps extends StyleOptions {
4
+ id: string;
5
+ label?: string;
6
+ placeholder?: string;
7
+ value?: string;
8
+ type?: 'text' | 'password';
9
+ onChange?: (value: string) => void;
10
+ }
11
+ /**
12
+ * Tactical Input Component
13
+ * Managed state HOC with cursor simulation, keyboard interception, and mouse focus.
14
+ */
15
+ export declare function Input(ctx: BuntiContext, props: InputProps): string;
16
+ //# sourceMappingURL=Input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../src/components/Input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG9C,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,UA2GzD"}
@@ -0,0 +1,101 @@
1
+ import { indentBlock } from '../utils';
2
+ /**
3
+ * Tactical Input Component
4
+ * Managed state HOC with cursor simulation, keyboard interception, and mouse focus.
5
+ */
6
+ export function Input(ctx, props) {
7
+ const { box, color, focusable, state, useState, hitbox, resolveLocalRect } = ctx;
8
+ // 1. Mouse Hit-Testing
9
+ const contentWidth = 40;
10
+ const contentHeight = 3;
11
+ const labelOffset = props.label ? 1 : 0;
12
+ const area = resolveLocalRect({
13
+ y: ctx.cursorY + labelOffset,
14
+ width: props.width ?? contentWidth,
15
+ height: props.height ?? contentHeight,
16
+ contentWidth,
17
+ contentHeight,
18
+ });
19
+ const interaction = hitbox(props.id, {
20
+ x: area.x,
21
+ y: area.y,
22
+ width: area.width,
23
+ height: area.height,
24
+ });
25
+ const isHovered = interaction.hovered;
26
+ // If clicked, force focus state
27
+ if (interaction.pressed) {
28
+ state.focusedId = props.id;
29
+ }
30
+ // 2. Register in the global focus loop
31
+ const isSelected = focusable(props.id);
32
+ // 3. Manage internal state
33
+ const [value, setValue] = useState(props.id, props.value || '');
34
+ // 4. Handle Keyboard Interaction (only when focused)
35
+ if (isSelected && state.lastKey) {
36
+ const key = state.lastKey;
37
+ if (key === 'backspace') {
38
+ if (value.length > 0) {
39
+ const newValue = value.slice(0, -1);
40
+ setValue(newValue);
41
+ if (props.onChange)
42
+ props.onChange(newValue);
43
+ }
44
+ }
45
+ else if (key === 'enter' ||
46
+ key === 'tab' ||
47
+ key === 'escape' ||
48
+ key === 'up' ||
49
+ key === 'down' ||
50
+ key === 'left' ||
51
+ key === 'right') {
52
+ // System keys: ignore
53
+ }
54
+ else if (key.length === 1) {
55
+ // Standard character input
56
+ const newValue = value + key;
57
+ setValue(newValue);
58
+ if (props.onChange)
59
+ props.onChange(newValue);
60
+ }
61
+ }
62
+ // 5. Resolve Theme
63
+ const neutralGray = { r: 217, g: 216, b: 213 };
64
+ const borderCol = isSelected ? 'bunti-blue' : isHovered ? 'ash' : neutralGray;
65
+ const labelColor = 'silver';
66
+ const placeholderColor = 'ash';
67
+ const textColor = 'white';
68
+ let fieldValue = '';
69
+ if (value.length === 0 && props.placeholder) {
70
+ fieldValue = color.fg(placeholderColor, props.placeholder);
71
+ }
72
+ else {
73
+ const displayValue = props.type === 'password' ? '*'.repeat(value.length) : value;
74
+ fieldValue = color.fg(textColor, displayValue);
75
+ }
76
+ if (isSelected) {
77
+ fieldValue += color.fg('silver', '█');
78
+ }
79
+ const field = box({
80
+ x: area.x,
81
+ y: area.y,
82
+ width: area.width,
83
+ height: area.height,
84
+ border: 'rounded',
85
+ borderColor: borderCol,
86
+ padding: [0, 1],
87
+ align: 'left',
88
+ valign: 'middle',
89
+ detach: true,
90
+ }, ({ text }) => text(fieldValue));
91
+ if (props.label) {
92
+ ctx.text(color.fg(labelColor, props.label));
93
+ ctx.text('\n');
94
+ }
95
+ const renderedField = ctx.isRoot ? field : indentBlock(field, area.x);
96
+ if (!ctx.isRoot) {
97
+ ctx.text(renderedField);
98
+ }
99
+ return renderedField;
100
+ }
101
+ //# sourceMappingURL=Input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.js","sourceRoot":"","sources":["../../src/components/Input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { BuntiContext } from '../dsl';
2
+ export interface ModalProps {
3
+ width: number;
4
+ height: number;
5
+ border?: 'default' | 'rounded' | 'double' | 'dashed' | 'dotted' | 'frame' | 'thick-frame' | 'classic' | 'none';
6
+ borderColor?: any;
7
+ bgColor?: any;
8
+ align?: 'left' | 'center' | 'right';
9
+ valign?: 'top' | 'middle' | 'bottom';
10
+ padding?: [number, number];
11
+ }
12
+ export declare function Modal(ctx: BuntiContext, props: ModalProps, callback: (sub: BuntiContext) => void): string;
13
+ //# sourceMappingURL=Modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/components/Modal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EACH,SAAS,GACT,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,aAAa,GACb,SAAS,GACT,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED,wBAAgB,KAAK,CACnB,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,UAiCtC"}
@@ -0,0 +1,28 @@
1
+ export function Modal(ctx, props, callback) {
2
+ const parentW = ctx.width;
3
+ const parentH = ctx.height;
4
+ const modalW = props.width;
5
+ const modalH = props.height;
6
+ const localX = Math.max(0, Math.floor((parentW - modalW) / 2));
7
+ const localY = Math.max(0, Math.floor((parentH - modalH) / 2));
8
+ const x = ctx.offsetX + localX;
9
+ const y = ctx.offsetY + localY;
10
+ // 1. Draw solid background rect for the modal
11
+ ctx.rect(x, y, modalW, modalH, {
12
+ char: ' ',
13
+ bg: props.bgColor || { r: 0, g: 0, b: 0 },
14
+ });
15
+ // 2. Draw the Box enclosing the modal content
16
+ return ctx.box({
17
+ x: localX,
18
+ y: localY,
19
+ width: modalW,
20
+ height: modalH,
21
+ border: props.border ?? 'double',
22
+ borderColor: props.borderColor,
23
+ align: props.align ?? 'center',
24
+ valign: props.valign,
25
+ padding: props.padding,
26
+ }, callback);
27
+ }
28
+ //# sourceMappingURL=Modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/components/Modal.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,KAAK,CACnB,GAAiB,EACjB,KAAiB,EACjB,QAAqC;IAErC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;IAE/B,8CAA8C;IAC9C,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;QAC7B,IAAI,EAAE,GAAG;QACT,EAAE,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;KAC1C,CAAC,CAAC;IAEH,8CAA8C;IAC9C,OAAO,GAAG,CAAC,GAAG,CACZ;QACE,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,MAAM;QACT,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,QAAQ;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,EACD,QAAQ,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './Box';
2
+ export * from './Button';
3
+ export * from './Card';
4
+ export * from './Header';
5
+ export * from './Input';
6
+ export * from './Modal';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -1,4 +1,7 @@
1
+ export * from './Box';
1
2
  export * from './Button';
2
3
  export * from './Card';
3
4
  export * from './Header';
4
5
  export * from './Input';
6
+ export * from './Modal';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Bunti Curated Glyph Registry (Nerd Font v3)
3
+ */
4
+ export declare const GLYPHS: Record<string, string>;
5
+ //# sourceMappingURL=glyphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glyphs.d.ts","sourceRoot":"","sources":["../../src/data/glyphs.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0BzC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Bunti Curated Glyph Registry (Nerd Font v3)
3
+ */
4
+ export const GLYPHS = {
5
+ // Languages & Tech
6
+ js: '\u{E781}', // nf-dev-javascript
7
+ ts: '\u{E628}', // nf-dev-typescript
8
+ python: '\u{E73C}', // nf-dev-python
9
+ rust: '\u{E7A8}', // nf-dev-rust
10
+ go: '\u{E627}', // nf-dev-go
11
+ node: '\u{E718}', // nf-dev-nodejs
12
+ bun: '\u{E22F}', // nf-seti-terminal (best proxy)
13
+ // Git & Source
14
+ git: '\u{F02A2}', // nf-md-git
15
+ branch: '\u{E725}', // nf-oct-git_branch
16
+ commit: '\u{E729}', // nf-oct-git_commit
17
+ pull: '\u{E728}', // nf-oct-git_pull_request
18
+ merge: '\u{E727}', // nf-oct-git_merge
19
+ // System & UI
20
+ folder: '\u{F07B}', // nf-fa-folder
21
+ file: '\u{F15B}', // nf-fa-file
22
+ lock: '\u{F023}', // nf-fa-lock
23
+ search: '\u{F002}', // nf-fa-search
24
+ settings: '\u{F013}', // nf-fa-cog
25
+ terminal: '\u{F489}', // nf-oct-terminal
26
+ heart: '\u{F004}', // nf-fa-heart
27
+ star: '\u{F005}', // nf-fa-star
28
+ };
29
+ //# sourceMappingURL=glyphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glyphs.js","sourceRoot":"","sources":["../../src/data/glyphs.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAA2B;IAC5C,mBAAmB;IACnB,EAAE,EAAE,UAAU,EAAE,oBAAoB;IACpC,EAAE,EAAE,UAAU,EAAE,oBAAoB;IACpC,MAAM,EAAE,UAAU,EAAE,gBAAgB;IACpC,IAAI,EAAE,UAAU,EAAE,cAAc;IAChC,EAAE,EAAE,UAAU,EAAE,YAAY;IAC5B,IAAI,EAAE,UAAU,EAAE,gBAAgB;IAClC,GAAG,EAAE,UAAU,EAAE,gCAAgC;IAEjD,eAAe;IACf,GAAG,EAAE,WAAW,EAAE,YAAY;IAC9B,MAAM,EAAE,UAAU,EAAE,oBAAoB;IACxC,MAAM,EAAE,UAAU,EAAE,oBAAoB;IACxC,IAAI,EAAE,UAAU,EAAE,0BAA0B;IAC5C,KAAK,EAAE,UAAU,EAAE,mBAAmB;IAEtC,cAAc;IACd,MAAM,EAAE,UAAU,EAAE,eAAe;IACnC,IAAI,EAAE,UAAU,EAAE,aAAa;IAC/B,IAAI,EAAE,UAAU,EAAE,aAAa;IAC/B,MAAM,EAAE,UAAU,EAAE,eAAe;IACnC,QAAQ,EAAE,UAAU,EAAE,YAAY;IAClC,QAAQ,EAAE,UAAU,EAAE,kBAAkB;IACxC,KAAK,EAAE,UAAU,EAAE,cAAc;IACjC,IAAI,EAAE,UAAU,EAAE,aAAa;CAChC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Bunti Terminal Capability Detection
3
+ */
4
+ export interface TerminalCapabilities {
5
+ nerdFont: boolean;
6
+ glyphProtocol: boolean;
7
+ unicode: boolean;
8
+ color: boolean;
9
+ }
10
+ /**
11
+ * Detects terminal capabilities using environment variables and
12
+ * modern protocol handshakes.
13
+ */
14
+ export declare function detectCapabilities(): Promise<TerminalCapabilities>;
15
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CA4CxE"}
package/dist/detect.js ADDED
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Bunti Terminal Capability Detection
3
+ */
4
+ /**
5
+ * Detects terminal capabilities using environment variables and
6
+ * modern protocol handshakes.
7
+ */
8
+ export async function detectCapabilities() {
9
+ const caps = {
10
+ nerdFont: false,
11
+ glyphProtocol: false,
12
+ unicode: true,
13
+ color: true,
14
+ };
15
+ // 1. Environment Variable Heuristics
16
+ const term = process.env.TERM_PROGRAM || '';
17
+ const termEmulator = process.env.TERMINAL_EMULATOR || '';
18
+ const nerdEnv = process.env.NERD_FONTS || process.env.NERD_FONT || process.env.BUNTI_NF;
19
+ // Optimistic list of terminals known to support modern fonts
20
+ const modernTerms = [
21
+ 'Ghostty',
22
+ 'WezTerm',
23
+ 'iTerm.app',
24
+ 'WarpTerminal',
25
+ 'Apple_Terminal',
26
+ 'vscode',
27
+ 'Hyper',
28
+ 'Rio',
29
+ 'Term7',
30
+ ];
31
+ if (nerdEnv === '1' || nerdEnv === 'true' || nerdEnv === 'yes') {
32
+ caps.nerdFont = true;
33
+ }
34
+ else if (modernTerms.includes(term) || modernTerms.includes(termEmulator)) {
35
+ caps.nerdFont = true;
36
+ }
37
+ else if (process.env.LC_TERMINAL === 'iTerm2') {
38
+ caps.nerdFont = true;
39
+ }
40
+ // 2. Glyph Protocol Handshake (Ghostty 1.3+, Rio, WezTerm)
41
+ // We send the Support Query and wait briefly for a response.
42
+ // Note: This is an optimistic check for now, can be expanded to
43
+ // a full async TTY listener if needed.
44
+ if (term === 'Ghostty') {
45
+ caps.glyphProtocol = true;
46
+ }
47
+ return caps;
48
+ }
49
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,IAAI,GAAyB;QACjC,QAAQ,EAAE,KAAK;QACf,aAAa,EAAE,KAAK;QACpB,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;KACZ,CAAC;IAEF,qCAAqC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACzD,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAE1E,6DAA6D;IAC7D,MAAM,WAAW,GAAG;QAClB,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,gBAAgB;QAChB,QAAQ;QACR,OAAO;QACP,KAAK;QACL,OAAO;KACR,CAAC;IAEF,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC/D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,2DAA2D;IAC3D,6DAA6D;IAC7D,gEAAgE;IAChE,uCAAuC;IACvC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/dsl.d.ts ADDED
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Bunti High-Level Contextual DSL
3
+ * Scoped closure API with contextual capabilities via trait-based composition.
4
+ */
5
+ import pc from 'picocolors';
6
+ import { bg, darken, fg, type Gradient, lighten, rgb } from './colors';
7
+ import { type PlacedRectInput, type PlacedRectOptions, type Rect, type RectInput, type SplitOptions } from './geometry';
8
+ import { type ListOptions, type SideColors, type StyleOptions, type TableOptions } from './layout';
9
+ import { type Cell, type Hitbox, type RGB, type ScreenOptions, type ScreenState } from './state';
10
+ export declare const KEYS: {
11
+ UP: string;
12
+ DOWN: string;
13
+ RIGHT: string;
14
+ LEFT: string;
15
+ ENTER: string;
16
+ ESCAPE: string;
17
+ TAB: string;
18
+ BACKSPACE: string;
19
+ SPACE: string;
20
+ };
21
+ export interface DSLBoxOptions extends StyleOptions {
22
+ bgColor?: string | number | RGB | Gradient;
23
+ color?: string | number | RGB | 'blank';
24
+ x?: number;
25
+ y?: number;
26
+ zIndex?: number;
27
+ anchor?: 'top' | 'bottom';
28
+ size?: 'auto' | number;
29
+ title?: string;
30
+ titleStyle?: (s: string) => string;
31
+ id?: string;
32
+ borderColor?: string | number | RGB | ((s: string) => string) | SideColors;
33
+ detach?: boolean;
34
+ }
35
+ export interface TypewriterOptions {
36
+ id?: string;
37
+ cps?: number;
38
+ delay?: number;
39
+ loop?: boolean;
40
+ cursor?: string;
41
+ blink?: boolean;
42
+ blinkRate?: number;
43
+ }
44
+ export interface TypewriterState {
45
+ text: string;
46
+ cursor: string;
47
+ done: boolean;
48
+ index: number;
49
+ progress: number;
50
+ }
51
+ export interface LayerOptions {
52
+ zIndex?: number;
53
+ }
54
+ /**
55
+ * The interface for the contextual builder provided to closures.
56
+ */
57
+ export interface BuntiContext {
58
+ color: typeof pc & {
59
+ darken: typeof darken;
60
+ lighten: typeof lighten;
61
+ rgb: typeof rgb;
62
+ fg: typeof fg;
63
+ bg: typeof bg;
64
+ };
65
+ state: ScreenState;
66
+ width: number;
67
+ height: number;
68
+ area: Rect;
69
+ isRoot: boolean;
70
+ offsetX: number;
71
+ offsetY: number;
72
+ readonly cursorX: number;
73
+ readonly cursorY: number;
74
+ mouseX: number;
75
+ mouseY: number;
76
+ mouseButton: number;
77
+ isMouseDown: boolean;
78
+ lastKey?: string;
79
+ focusedId?: string;
80
+ elapsedTime: number;
81
+ text(str: string | number): BuntiContext;
82
+ icon(name: string): string;
83
+ blit(x: number, y: number, content: string, style?: Partial<Cell>): BuntiContext;
84
+ rect(x: number, y: number, w: number, h: number, style: Partial<Cell>): BuntiContext;
85
+ viewport(content: string, width: number, height: number, scrollY?: number): string;
86
+ span(options: {
87
+ color?: string | number | RGB | ((s: string) => string);
88
+ }, callback: (sub: BuntiContext) => void): string;
89
+ box(options: DSLBoxOptions, callback: (sub: BuntiContext) => void): string;
90
+ layer(zIndexOrOptions: number | LayerOptions, callback: (sub: BuntiContext) => void): BuntiContext;
91
+ layer(callback: (sub: BuntiContext) => void): BuntiContext;
92
+ joinHorizontal(...blocks: string[]): string;
93
+ joinVertical(...blocks: string[]): string;
94
+ wallpaper(input: string | number | RGB | RGB[] | Gradient | {
95
+ color: any;
96
+ }): void;
97
+ gradient(options: {
98
+ colors: (string | number | RGB)[];
99
+ direction?: 'vertical' | 'horizontal';
100
+ steps?: number;
101
+ }): Gradient;
102
+ rgb(r: number, g: number, b: number): RGB;
103
+ useState<T>(initial: T): [T, (val: T) => void];
104
+ useState<T>(key: string, initial: T): [T, (val: T) => void];
105
+ usePersistentState<T>(key: string, initial: T): [T, (val: T) => void];
106
+ focusable(id: string): boolean;
107
+ isFocused(id: string): boolean;
108
+ focus(id: string): void;
109
+ focusNext(): void;
110
+ hitbox(id: string, bounds: RectInput): {
111
+ box: Hitbox;
112
+ hovered: boolean;
113
+ pressed: boolean;
114
+ clicked: boolean;
115
+ };
116
+ resolveRect(bounds: RectInput): Rect;
117
+ resolveLocalRect(bounds: PlacedRectInput, options?: PlacedRectOptions): Rect;
118
+ split(options: SplitOptions): Rect[];
119
+ isHovered(id: string): boolean;
120
+ isPressed(id: string): boolean;
121
+ isClicked(id: string): boolean;
122
+ list(id: string, items: string[], options?: ListOptions): BuntiContext;
123
+ table(rows: string[][], options?: TableOptions): BuntiContext;
124
+ animate(duration: number, options?: {
125
+ loop?: boolean;
126
+ delay?: number;
127
+ id?: string;
128
+ }): number;
129
+ fade(from: string | number | RGB, to: string | number | RGB, progress: number): RGB;
130
+ typewriter(text: string, options?: TypewriterOptions): TypewriterState;
131
+ flicker(intensity?: number): boolean;
132
+ useAsync<T>(fetcher: () => Promise<T>, options?: {
133
+ interval?: number;
134
+ }): {
135
+ data: T | undefined;
136
+ loading: boolean;
137
+ error: Error | undefined;
138
+ };
139
+ useAsync<T>(key: string, fetcher: () => Promise<T>, options?: {
140
+ interval?: number;
141
+ }): {
142
+ data: T | undefined;
143
+ loading: boolean;
144
+ error: Error | undefined;
145
+ };
146
+ requestStop(): void;
147
+ flushFlow(): void;
148
+ }
149
+ /**
150
+ * Top-level Screen Context
151
+ */
152
+ export declare function createScreenContext(state: ScreenState): BuntiContext;
153
+ /**
154
+ * Primary Entry Point
155
+ */
156
+ export declare function render(callback: ((b: BuntiContext) => void) | string, options?: ScreenOptions & {
157
+ once?: boolean;
158
+ }): Promise<void>;
159
+ //# sourceMappingURL=dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../src/dsl.ts"],"names":[],"mappings":"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"}