@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.
- package/AGENTS.md +65 -0
- package/README.md +145 -34
- package/dist/cli.d.ts +44 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +147 -0
- package/dist/cli.js.map +1 -0
- package/dist/colors.d.ts +144 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +426 -0
- package/dist/colors.js.map +1 -0
- package/dist/components/Box.d.ts +11 -0
- package/dist/components/Box.d.ts.map +1 -0
- package/dist/components/Box.js +9 -0
- package/dist/components/Box.js.map +1 -0
- package/dist/components/Button.d.ts +24 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +102 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Card.d.ts +33 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +79 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/Header.d.ts +23 -0
- package/dist/components/Header.d.ts.map +1 -0
- package/dist/components/Header.js +58 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/Input.d.ts +25 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +232 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/Link.d.ts +21 -0
- package/dist/components/Link.d.ts.map +1 -0
- package/dist/components/Link.js +29 -0
- package/dist/components/Link.js.map +1 -0
- package/dist/components/Modal.d.ts +38 -0
- package/dist/components/Modal.d.ts.map +1 -0
- package/dist/components/Modal.js +87 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/Progress.d.ts +27 -0
- package/dist/components/Progress.d.ts.map +1 -0
- package/dist/components/Progress.js +39 -0
- package/dist/components/Progress.js.map +1 -0
- package/dist/components/Spinner.d.ts +19 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +27 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/index.d.ts +10 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +10 -0
- package/dist/components/index.js.map +1 -0
- package/dist/data/nf-glyphs.d.ts +11 -0
- package/dist/data/nf-glyphs.d.ts.map +1 -0
- package/dist/data/nf-glyphs.js +535 -0
- package/dist/data/nf-glyphs.js.map +1 -0
- package/dist/data/nf-names.d.ts +8 -0
- package/dist/data/nf-names.d.ts.map +1 -0
- package/dist/data/nf-names.js +2 -0
- package/dist/data/nf-names.js.map +1 -0
- package/dist/demo-registry.d.ts +27 -0
- package/dist/demo-registry.d.ts.map +1 -0
- package/dist/demo-registry.js +57 -0
- package/dist/demo-registry.js.map +1 -0
- package/dist/demos/2048.ts +743 -0
- package/dist/demos/animation.ts +246 -0
- package/dist/demos/demo-layout.ts +124 -0
- package/dist/demos/engine.ts +374 -0
- package/dist/demos/interaction.ts +91 -0
- package/dist/demos/login.ts +203 -0
- package/dist/demos/mission-control.ts +558 -0
- package/dist/demos/showcase.ts +224 -0
- package/dist/detect.d.ts +104 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +227 -0
- package/dist/detect.js.map +1 -0
- package/dist/diagnostics.d.ts +73 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +225 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/dsl/context.d.ts +11 -0
- package/dist/dsl/context.d.ts.map +1 -0
- package/dist/dsl/context.js +563 -0
- package/dist/dsl/context.js.map +1 -0
- package/dist/dsl/hooks.d.ts +12 -0
- package/dist/dsl/hooks.d.ts.map +1 -0
- package/dist/dsl/hooks.js +148 -0
- package/dist/dsl/hooks.js.map +1 -0
- package/dist/dsl/interaction.d.ts +16 -0
- package/dist/dsl/interaction.d.ts.map +1 -0
- package/dist/dsl/interaction.js +101 -0
- package/dist/dsl/interaction.js.map +1 -0
- package/dist/dsl/layers.d.ts +14 -0
- package/dist/dsl/layers.d.ts.map +1 -0
- package/dist/dsl/layers.js +87 -0
- package/dist/dsl/layers.js.map +1 -0
- package/dist/dsl/motion.d.ts +10 -0
- package/dist/dsl/motion.d.ts.map +1 -0
- package/dist/dsl/motion.js +150 -0
- package/dist/dsl/motion.js.map +1 -0
- package/dist/dsl/render.d.ts +22 -0
- package/dist/dsl/render.d.ts.map +1 -0
- package/dist/dsl/render.js +69 -0
- package/dist/dsl/render.js.map +1 -0
- package/dist/dsl/types.d.ts +510 -0
- package/dist/dsl/types.d.ts.map +1 -0
- package/dist/dsl/types.js +33 -0
- package/dist/dsl/types.js.map +1 -0
- package/dist/dsl.d.ts +18 -0
- package/dist/dsl.d.ts.map +1 -0
- package/dist/dsl.js +17 -0
- package/dist/dsl.js.map +1 -0
- package/dist/easing.d.ts +45 -0
- package/dist/easing.d.ts.map +1 -0
- package/dist/easing.js +121 -0
- package/dist/easing.js.map +1 -0
- package/dist/geometry.d.ts +77 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +130 -0
- package/dist/geometry.js.map +1 -0
- package/dist/icons-full.d.ts +5 -0
- package/dist/icons-full.d.ts.map +1 -0
- package/dist/icons-full.js +31 -0
- package/dist/icons-full.js.map +1 -0
- package/dist/icons.d.ts +442 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +314 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +228 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +177 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +533 -0
- package/dist/input.js.map +1 -0
- package/dist/layout.d.ts +194 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +673 -0
- package/dist/layout.js.map +1 -0
- package/dist/render.d.ts +49 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +650 -0
- package/dist/render.js.map +1 -0
- package/dist/state.d.ts +226 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +130 -0
- package/dist/state.js.map +1 -0
- package/dist/theme.d.ts +129 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +167 -0
- package/dist/theme.js.map +1 -0
- package/dist/themes/catppuccin-mocha.d.ts +19 -0
- package/dist/themes/catppuccin-mocha.d.ts.map +1 -0
- package/dist/themes/catppuccin-mocha.js +36 -0
- package/dist/themes/catppuccin-mocha.js.map +1 -0
- package/dist/themes/dracula.d.ts +21 -0
- package/dist/themes/dracula.d.ts.map +1 -0
- package/dist/themes/dracula.js +37 -0
- package/dist/themes/dracula.js.map +1 -0
- package/dist/themes/github-light.d.ts +21 -0
- package/dist/themes/github-light.d.ts.map +1 -0
- package/dist/themes/github-light.js +36 -0
- package/dist/themes/github-light.js.map +1 -0
- package/dist/themes/index.d.ts +19 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +17 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/nord.d.ts +23 -0
- package/dist/themes/nord.d.ts.map +1 -0
- package/dist/themes/nord.js +38 -0
- package/dist/themes/nord.js.map +1 -0
- package/dist/themes/one-dark-pro.d.ts +21 -0
- package/dist/themes/one-dark-pro.d.ts.map +1 -0
- package/dist/themes/one-dark-pro.js +36 -0
- package/dist/themes/one-dark-pro.js.map +1 -0
- package/dist/themes/tokyo-night.d.ts +20 -0
- package/dist/themes/tokyo-night.d.ts.map +1 -0
- package/dist/themes/tokyo-night.js +37 -0
- package/dist/themes/tokyo-night.js.map +1 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +158 -0
- package/dist/utils.js.map +1 -0
- package/dist/vendor/colors.d.ts +45 -0
- package/dist/vendor/colors.d.ts.map +1 -0
- package/dist/vendor/colors.js +72 -0
- package/dist/vendor/colors.js.map +1 -0
- package/llms.txt +79 -0
- package/package.json +52 -11
- package/src/colors.ts +0 -255
- package/src/components/Button.ts +0 -104
- package/src/components/Card.ts +0 -53
- package/src/components/Header.ts +0 -65
- package/src/components/Input.ts +0 -124
- package/src/components/index.ts +0 -4
- package/src/data/glyphs.ts +0 -30
- package/src/detect.ts +0 -60
- package/src/dsl.ts +0 -661
- package/src/icons.ts +0 -186
- package/src/index.ts +0 -72
- package/src/layout.ts +0 -640
- package/src/render.ts +0 -302
- package/src/state.ts +0 -148
- package/src/utils.ts +0 -165
package/dist/dsl.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunti High-Level Contextual DSL
|
|
3
|
+
* Scoped closure API with contextual capabilities via trait-based composition.
|
|
4
|
+
*
|
|
5
|
+
* Implementation lives in src/dsl/ — this barrel preserves the public surface:
|
|
6
|
+
* - context: createDSLContext + box rendering + createScreenContext
|
|
7
|
+
* - render: the render() entry point
|
|
8
|
+
* - hooks: useState / useAsync / usePersistentState
|
|
9
|
+
* - interaction: hitbox / hover / press / click + focus management
|
|
10
|
+
* - layers: transparent buffers + compositing
|
|
11
|
+
* - motion: animate / typewriter / flicker / fade
|
|
12
|
+
* - types: shared interfaces + KEYS
|
|
13
|
+
*/
|
|
14
|
+
export { createScreenContext } from './dsl/context';
|
|
15
|
+
export { render } from './dsl/render';
|
|
16
|
+
export { KEYS } from './dsl/types';
|
|
17
|
+
//# sourceMappingURL=dsl.js.map
|
package/dist/dsl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsl.js","sourceRoot":"","sources":["../src/dsl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/easing.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunti Easing Curves & Interpolation
|
|
3
|
+
*
|
|
4
|
+
* The standard easing set, every curve clamps its input to [0, 1] so raw
|
|
5
|
+
* animation progress can be fed in directly. Pure functions only.
|
|
6
|
+
*/
|
|
7
|
+
import type { Rect } from './geometry';
|
|
8
|
+
/** Clamps a number to the [0, 1] range. */
|
|
9
|
+
export declare function clamp01(value: number): number;
|
|
10
|
+
/** Identity easing (clamped to [0, 1]). */
|
|
11
|
+
export declare function linear(value: number): number;
|
|
12
|
+
/** Quadratic ease-in: slow start. */
|
|
13
|
+
export declare function easeInQuad(value: number): number;
|
|
14
|
+
/** Quadratic ease-out: slow stop. */
|
|
15
|
+
export declare function easeOutQuad(value: number): number;
|
|
16
|
+
/** Quadratic ease-in-out: slow start and stop. */
|
|
17
|
+
export declare function easeInOutQuad(value: number): number;
|
|
18
|
+
/** Cubic ease-in: slower start. */
|
|
19
|
+
export declare function easeInCubic(value: number): number;
|
|
20
|
+
/** Cubic ease-out: the default-feeling UI deceleration. */
|
|
21
|
+
export declare function easeOutCubic(value: number): number;
|
|
22
|
+
/** Cubic ease-in-out: smooth start and stop. */
|
|
23
|
+
export declare function easeInOutCubic(value: number): number;
|
|
24
|
+
/** Quartic ease-in: very slow start. */
|
|
25
|
+
export declare function easeInQuart(value: number): number;
|
|
26
|
+
/** Quartic ease-out: very soft landing. */
|
|
27
|
+
export declare function easeOutQuart(value: number): number;
|
|
28
|
+
/** Quartic ease-in-out: pronounced start/stop smoothing. */
|
|
29
|
+
export declare function easeInOutQuart(value: number): number;
|
|
30
|
+
/** Exponential ease-out: fast launch, long tail. */
|
|
31
|
+
export declare function easeOutExpo(value: number): number;
|
|
32
|
+
/** Elastic ease-out: overshoots and springs back. */
|
|
33
|
+
export declare function easeOutElastic(value: number): number;
|
|
34
|
+
/** Bounce ease-out: settles like a dropped ball. */
|
|
35
|
+
export declare function easeOutBounce(value: number): number;
|
|
36
|
+
/** Back ease-out: slight overshoot past 1, then return. */
|
|
37
|
+
export declare function easeOutBack(value: number): number;
|
|
38
|
+
/** Linear interpolation between a and b. t is clamped to [0, 1]. */
|
|
39
|
+
export declare function lerp(a: number, b: number, t: number): number;
|
|
40
|
+
/**
|
|
41
|
+
* Interpolates between two rects, rounding every field to whole cells so
|
|
42
|
+
* results can be drawn directly to the terminal grid.
|
|
43
|
+
*/
|
|
44
|
+
export declare function lerpRect(a: Rect, b: Rect, t: number): Rect;
|
|
45
|
+
//# sourceMappingURL=easing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing.d.ts","sourceRoot":"","sources":["../src/easing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,2CAA2C;AAC3C,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,2CAA2C;AAC3C,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAID,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,qCAAqC;AACrC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD;AAID,mCAAmC;AACnC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;AAID,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;AAID,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAenD;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAID,oEAAoE;AACpE,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAO1D"}
|
package/dist/easing.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunti Easing Curves & Interpolation
|
|
3
|
+
*
|
|
4
|
+
* The standard easing set, every curve clamps its input to [0, 1] so raw
|
|
5
|
+
* animation progress can be fed in directly. Pure functions only.
|
|
6
|
+
*/
|
|
7
|
+
/** Clamps a number to the [0, 1] range. */
|
|
8
|
+
export function clamp01(value) {
|
|
9
|
+
return Math.min(1, Math.max(0, value));
|
|
10
|
+
}
|
|
11
|
+
/** Identity easing (clamped to [0, 1]). */
|
|
12
|
+
export function linear(value) {
|
|
13
|
+
return clamp01(value);
|
|
14
|
+
}
|
|
15
|
+
// --- Quad ---
|
|
16
|
+
/** Quadratic ease-in: slow start. */
|
|
17
|
+
export function easeInQuad(value) {
|
|
18
|
+
const t = clamp01(value);
|
|
19
|
+
return t * t;
|
|
20
|
+
}
|
|
21
|
+
/** Quadratic ease-out: slow stop. */
|
|
22
|
+
export function easeOutQuad(value) {
|
|
23
|
+
const t = clamp01(value);
|
|
24
|
+
return 1 - (1 - t) * (1 - t);
|
|
25
|
+
}
|
|
26
|
+
/** Quadratic ease-in-out: slow start and stop. */
|
|
27
|
+
export function easeInOutQuad(value) {
|
|
28
|
+
const t = clamp01(value);
|
|
29
|
+
return t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2;
|
|
30
|
+
}
|
|
31
|
+
// --- Cubic ---
|
|
32
|
+
/** Cubic ease-in: slower start. */
|
|
33
|
+
export function easeInCubic(value) {
|
|
34
|
+
const t = clamp01(value);
|
|
35
|
+
return t * t * t;
|
|
36
|
+
}
|
|
37
|
+
/** Cubic ease-out: the default-feeling UI deceleration. */
|
|
38
|
+
export function easeOutCubic(value) {
|
|
39
|
+
const t = clamp01(value);
|
|
40
|
+
return 1 - (1 - t) ** 3;
|
|
41
|
+
}
|
|
42
|
+
/** Cubic ease-in-out: smooth start and stop. */
|
|
43
|
+
export function easeInOutCubic(value) {
|
|
44
|
+
const t = clamp01(value);
|
|
45
|
+
return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;
|
|
46
|
+
}
|
|
47
|
+
// --- Quart ---
|
|
48
|
+
/** Quartic ease-in: very slow start. */
|
|
49
|
+
export function easeInQuart(value) {
|
|
50
|
+
const t = clamp01(value);
|
|
51
|
+
return t * t * t * t;
|
|
52
|
+
}
|
|
53
|
+
/** Quartic ease-out: very soft landing. */
|
|
54
|
+
export function easeOutQuart(value) {
|
|
55
|
+
const t = clamp01(value);
|
|
56
|
+
return 1 - (1 - t) ** 4;
|
|
57
|
+
}
|
|
58
|
+
/** Quartic ease-in-out: pronounced start/stop smoothing. */
|
|
59
|
+
export function easeInOutQuart(value) {
|
|
60
|
+
const t = clamp01(value);
|
|
61
|
+
return t < 0.5 ? 8 * t * t * t * t : 1 - (-2 * t + 2) ** 4 / 2;
|
|
62
|
+
}
|
|
63
|
+
// --- Expressive ---
|
|
64
|
+
/** Exponential ease-out: fast launch, long tail. */
|
|
65
|
+
export function easeOutExpo(value) {
|
|
66
|
+
const t = clamp01(value);
|
|
67
|
+
return t === 1 ? 1 : 1 - 2 ** (-10 * t);
|
|
68
|
+
}
|
|
69
|
+
/** Elastic ease-out: overshoots and springs back. */
|
|
70
|
+
export function easeOutElastic(value) {
|
|
71
|
+
const t = clamp01(value);
|
|
72
|
+
if (t === 0)
|
|
73
|
+
return 0;
|
|
74
|
+
if (t === 1)
|
|
75
|
+
return 1;
|
|
76
|
+
const c4 = (2 * Math.PI) / 3;
|
|
77
|
+
return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1;
|
|
78
|
+
}
|
|
79
|
+
/** Bounce ease-out: settles like a dropped ball. */
|
|
80
|
+
export function easeOutBounce(value) {
|
|
81
|
+
const t = clamp01(value);
|
|
82
|
+
const n1 = 7.5625;
|
|
83
|
+
const d1 = 2.75;
|
|
84
|
+
if (t < 1 / d1)
|
|
85
|
+
return n1 * t * t;
|
|
86
|
+
if (t < 2 / d1) {
|
|
87
|
+
const u = t - 1.5 / d1;
|
|
88
|
+
return n1 * u * u + 0.75;
|
|
89
|
+
}
|
|
90
|
+
if (t < 2.5 / d1) {
|
|
91
|
+
const u = t - 2.25 / d1;
|
|
92
|
+
return n1 * u * u + 0.9375;
|
|
93
|
+
}
|
|
94
|
+
const u = t - 2.625 / d1;
|
|
95
|
+
return n1 * u * u + 0.984375;
|
|
96
|
+
}
|
|
97
|
+
/** Back ease-out: slight overshoot past 1, then return. */
|
|
98
|
+
export function easeOutBack(value) {
|
|
99
|
+
const t = clamp01(value);
|
|
100
|
+
const c1 = 1.70158;
|
|
101
|
+
const c3 = c1 + 1;
|
|
102
|
+
return 1 + c3 * (t - 1) ** 3 + c1 * (t - 1) ** 2;
|
|
103
|
+
}
|
|
104
|
+
// --- Interpolation ---
|
|
105
|
+
/** Linear interpolation between a and b. t is clamped to [0, 1]. */
|
|
106
|
+
export function lerp(a, b, t) {
|
|
107
|
+
return a + (b - a) * clamp01(t);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Interpolates between two rects, rounding every field to whole cells so
|
|
111
|
+
* results can be drawn directly to the terminal grid.
|
|
112
|
+
*/
|
|
113
|
+
export function lerpRect(a, b, t) {
|
|
114
|
+
return {
|
|
115
|
+
x: Math.round(lerp(a.x, b.x, t)),
|
|
116
|
+
y: Math.round(lerp(a.y, b.y, t)),
|
|
117
|
+
width: Math.round(lerp(a.width, b.width, t)),
|
|
118
|
+
height: Math.round(lerp(a.height, b.height, t)),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=easing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing.js","sourceRoot":"","sources":["../src/easing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunti Rect Geometry
|
|
3
|
+
*
|
|
4
|
+
* Rect is the layout primitive: components resolve a rect first, then
|
|
5
|
+
* render and hit-test against the same resolved cells.
|
|
6
|
+
*/
|
|
7
|
+
import { type SizeUnit } from './layout';
|
|
8
|
+
/** An absolute cell rectangle: x/y origin plus width/height in cells. */
|
|
9
|
+
export interface Rect {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
}
|
|
15
|
+
/** A partial rect resolved against a parent area. */
|
|
16
|
+
export interface RectInput {
|
|
17
|
+
/** Column offset within the parent (default 0). */
|
|
18
|
+
x?: number;
|
|
19
|
+
/** Row offset within the parent (default 0). */
|
|
20
|
+
y?: number;
|
|
21
|
+
/** Width: cells, '50%', '1fr', or 'auto' (falls back to contentWidth). */
|
|
22
|
+
width?: SizeUnit;
|
|
23
|
+
/** Height: rows, '50%', '1fr', or 'auto' (falls back to contentHeight). */
|
|
24
|
+
height?: SizeUnit;
|
|
25
|
+
/** Intrinsic content width used when width is 'auto'/undefined. */
|
|
26
|
+
contentWidth?: number;
|
|
27
|
+
/** Intrinsic content height used when height is 'auto'/undefined. */
|
|
28
|
+
contentHeight?: number;
|
|
29
|
+
}
|
|
30
|
+
/** RectInput plus edge anchoring for resolvePlacedRect(). */
|
|
31
|
+
export interface PlacedRectInput extends RectInput {
|
|
32
|
+
/** Pins the rect to the top or bottom edge at x = 0. */
|
|
33
|
+
anchor?: 'top' | 'bottom';
|
|
34
|
+
}
|
|
35
|
+
/** Placement defaults applied when x/y are omitted (default centered). */
|
|
36
|
+
export interface PlacedRectOptions {
|
|
37
|
+
defaultX?: 'left' | 'center' | 'right';
|
|
38
|
+
defaultY?: 'top' | 'center' | 'bottom';
|
|
39
|
+
}
|
|
40
|
+
/** Axis for splitRect(). */
|
|
41
|
+
export type Direction = 'horizontal' | 'vertical';
|
|
42
|
+
/** Options for splitRect() / ctx.split(). */
|
|
43
|
+
export interface SplitOptions {
|
|
44
|
+
/** Axis the tracks are laid along. */
|
|
45
|
+
direction: Direction;
|
|
46
|
+
/**
|
|
47
|
+
* One entry per track: absolute cells (24), percent ('30%'), or fill
|
|
48
|
+
* fractions ('1fr', '2fr') sharing the remaining space.
|
|
49
|
+
*/
|
|
50
|
+
constraints: SizeUnit[];
|
|
51
|
+
/** Blank cells between adjacent tracks (default 0). */
|
|
52
|
+
gap?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolves a RectInput against a parent rect into absolute cells
|
|
56
|
+
* (top-left placement; use resolvePlacedRect for alignment defaults).
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveRect(parent: Rect, input: RectInput): Rect;
|
|
59
|
+
/**
|
|
60
|
+
* Places a rect within a parent with alignment defaults (centered unless
|
|
61
|
+
* overridden) and optional top/bottom anchoring — the placement box() uses.
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolvePlacedRect(parent: Rect, input: PlacedRectInput, options?: PlacedRectOptions): Rect;
|
|
64
|
+
/** Shrinks a rect by a uniform or per-side inset (clamped at zero size). */
|
|
65
|
+
export declare function innerRect(rect: Rect, inset: number | {
|
|
66
|
+
top?: number;
|
|
67
|
+
right?: number;
|
|
68
|
+
bottom?: number;
|
|
69
|
+
left?: number;
|
|
70
|
+
}): Rect;
|
|
71
|
+
/**
|
|
72
|
+
* Splits a rect into adjacent tracks from fixed sizes, percentages, and
|
|
73
|
+
* 'fr' fill units (the last fluid track absorbs rounding leftovers).
|
|
74
|
+
* @example const [side, main] = splitRect(area, { direction: 'horizontal', constraints: [24, '1fr'] });
|
|
75
|
+
*/
|
|
76
|
+
export declare function splitRect(rect: Rect, options: SplitOptions): Rect[];
|
|
77
|
+
//# sourceMappingURL=geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEtD,yEAAyE;AACzE,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,mDAAmD;IACnD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,6DAA6D;AAC7D,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,wDAAwD;IACxD,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;CACxC;AAED,4BAA4B;AAC5B,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAElD,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,SAAS,EAAE,SAAS,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAgBhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,iBAAsB,GAC9B,IAAI,CAqCN;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CACvB,IAAI,EAAE,IAAI,EACV,KAAK,EACD,MAAM,GACN;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE,IAAI,CAiBN;AAgBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,EAAE,CA4CnE"}
|
package/dist/geometry.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunti Rect Geometry
|
|
3
|
+
*
|
|
4
|
+
* Rect is the layout primitive: components resolve a rect first, then
|
|
5
|
+
* render and hit-test against the same resolved cells.
|
|
6
|
+
*/
|
|
7
|
+
import { resolveSize } from './layout';
|
|
8
|
+
/**
|
|
9
|
+
* Resolves a RectInput against a parent rect into absolute cells
|
|
10
|
+
* (top-left placement; use resolvePlacedRect for alignment defaults).
|
|
11
|
+
*/
|
|
12
|
+
export function resolveRect(parent, input) {
|
|
13
|
+
const width = Math.max(0, resolveSize(input.width, parent.width, input.contentWidth ?? 0));
|
|
14
|
+
const height = Math.max(0, resolveSize(input.height, parent.height, input.contentHeight ?? 0));
|
|
15
|
+
return {
|
|
16
|
+
x: parent.x + (input.x ?? 0),
|
|
17
|
+
y: parent.y + (input.y ?? 0),
|
|
18
|
+
width,
|
|
19
|
+
height,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Places a rect within a parent with alignment defaults (centered unless
|
|
24
|
+
* overridden) and optional top/bottom anchoring — the placement box() uses.
|
|
25
|
+
*/
|
|
26
|
+
export function resolvePlacedRect(parent, input, options = {}) {
|
|
27
|
+
const width = Math.max(0, resolveSize(input.width, parent.width, input.contentWidth ?? 0));
|
|
28
|
+
const height = Math.max(0, resolveSize(input.height, parent.height, input.contentHeight ?? 0));
|
|
29
|
+
const defaultX = options.defaultX ?? 'center';
|
|
30
|
+
const defaultY = options.defaultY ?? 'center';
|
|
31
|
+
let x = input.x;
|
|
32
|
+
if (input.anchor === 'top' || input.anchor === 'bottom')
|
|
33
|
+
x = 0;
|
|
34
|
+
if (x === undefined) {
|
|
35
|
+
if (defaultX === 'right')
|
|
36
|
+
x = Math.max(0, parent.width - width);
|
|
37
|
+
else if (defaultX === 'center')
|
|
38
|
+
x = Math.max(0, Math.floor((parent.width - width) / 2));
|
|
39
|
+
else
|
|
40
|
+
x = 0;
|
|
41
|
+
}
|
|
42
|
+
let y = input.y;
|
|
43
|
+
if (input.anchor === 'top')
|
|
44
|
+
y = 0;
|
|
45
|
+
else if (input.anchor === 'bottom')
|
|
46
|
+
y = parent.height - height;
|
|
47
|
+
if (y === undefined) {
|
|
48
|
+
if (defaultY === 'bottom')
|
|
49
|
+
y = Math.max(0, parent.height - height);
|
|
50
|
+
else if (defaultY === 'center')
|
|
51
|
+
y = Math.max(0, Math.floor((parent.height - height) / 2));
|
|
52
|
+
else
|
|
53
|
+
y = 0;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
x: parent.x + x,
|
|
57
|
+
y: parent.y + y,
|
|
58
|
+
width,
|
|
59
|
+
height,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Shrinks a rect by a uniform or per-side inset (clamped at zero size). */
|
|
63
|
+
export function innerRect(rect, inset) {
|
|
64
|
+
const sides = typeof inset === 'number'
|
|
65
|
+
? { top: inset, right: inset, bottom: inset, left: inset }
|
|
66
|
+
: {
|
|
67
|
+
top: inset.top ?? 0,
|
|
68
|
+
right: inset.right ?? 0,
|
|
69
|
+
bottom: inset.bottom ?? 0,
|
|
70
|
+
left: inset.left ?? 0,
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
x: rect.x + sides.left,
|
|
74
|
+
y: rect.y + sides.top,
|
|
75
|
+
width: Math.max(0, rect.width - sides.left - sides.right),
|
|
76
|
+
height: Math.max(0, rect.height - sides.top - sides.bottom),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function frWeight(unit) {
|
|
80
|
+
if (typeof unit !== 'string' || !unit.endsWith('fr'))
|
|
81
|
+
return 0;
|
|
82
|
+
const parsed = Number.parseFloat(unit.slice(0, -2));
|
|
83
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 1;
|
|
84
|
+
}
|
|
85
|
+
function fixedTrackSize(unit, available) {
|
|
86
|
+
if (typeof unit === 'number')
|
|
87
|
+
return Math.max(0, unit);
|
|
88
|
+
if (typeof unit === 'string' && unit.endsWith('%')) {
|
|
89
|
+
return Math.max(0, Math.floor((available * Number.parseFloat(unit)) / 100));
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Splits a rect into adjacent tracks from fixed sizes, percentages, and
|
|
95
|
+
* 'fr' fill units (the last fluid track absorbs rounding leftovers).
|
|
96
|
+
* @example const [side, main] = splitRect(area, { direction: 'horizontal', constraints: [24, '1fr'] });
|
|
97
|
+
*/
|
|
98
|
+
export function splitRect(rect, options) {
|
|
99
|
+
const gap = Math.max(0, options.gap ?? 0);
|
|
100
|
+
const mainSize = options.direction === 'horizontal' ? rect.width : rect.height;
|
|
101
|
+
const crossSize = options.direction === 'horizontal' ? rect.height : rect.width;
|
|
102
|
+
const available = Math.max(0, mainSize - gap * Math.max(0, options.constraints.length - 1));
|
|
103
|
+
const sizes = options.constraints.map((constraint) => fixedTrackSize(constraint, available));
|
|
104
|
+
const fixedTotal = sizes.reduce((sum, size) => sum + (size ?? 0), 0);
|
|
105
|
+
const remaining = Math.max(0, available - fixedTotal);
|
|
106
|
+
const totalFr = options.constraints.reduce((sum, constraint) => sum + frWeight(constraint), 0);
|
|
107
|
+
let assigned = fixedTotal;
|
|
108
|
+
for (let index = 0; index < sizes.length; index++) {
|
|
109
|
+
if (sizes[index] !== undefined)
|
|
110
|
+
continue;
|
|
111
|
+
const weight = frWeight(options.constraints[index]);
|
|
112
|
+
const isLastFluid = options.constraints
|
|
113
|
+
.slice(index + 1)
|
|
114
|
+
.every((constraint) => frWeight(constraint) === 0);
|
|
115
|
+
const size = isLastFluid
|
|
116
|
+
? Math.max(0, available - assigned)
|
|
117
|
+
: Math.floor((remaining * weight) / Math.max(1, totalFr));
|
|
118
|
+
sizes[index] = size;
|
|
119
|
+
assigned += size;
|
|
120
|
+
}
|
|
121
|
+
let cursor = options.direction === 'horizontal' ? rect.x : rect.y;
|
|
122
|
+
return sizes.map((size = 0) => {
|
|
123
|
+
const area = options.direction === 'horizontal'
|
|
124
|
+
? { x: cursor, y: rect.y, width: size, height: crossSize }
|
|
125
|
+
: { x: rect.x, y: cursor, width: crossSize, height: size };
|
|
126
|
+
cursor += size + gap;
|
|
127
|
+
return area;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { NF_GLYPHS, NF_VERSION } from './data/nf-glyphs';
|
|
2
|
+
export type { IconName } from './data/nf-names';
|
|
3
|
+
/** Installs the full Nerd Fonts map into the runtime registry (idempotent). */
|
|
4
|
+
export declare function installFullIcons(): void;
|
|
5
|
+
//# sourceMappingURL=icons-full.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons-full.d.ts","sourceRoot":"","sources":["../src/icons-full.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,+EAA+E;AAC/E,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunti Full Nerd Fonts Icon Pack (~10.7k glyphs, NF v3.4.0)
|
|
3
|
+
*
|
|
4
|
+
* Agent-obvious usage — one side-effect import anywhere in your app:
|
|
5
|
+
*
|
|
6
|
+
* import '@zakmandhro/bunti/icons-full';
|
|
7
|
+
*
|
|
8
|
+
* That single line installs every Nerd Fonts glyph into Bunti's runtime
|
|
9
|
+
* icon registry, so `icon('fa-rocket')`, `icon('md-robot')`, or the
|
|
10
|
+
* prefixed form `icon('nf-fa-rocket')` all resolve by name. The curated
|
|
11
|
+
* short names ('rocket', 'branch', ...) keep working and keep priority.
|
|
12
|
+
*
|
|
13
|
+
* Prefer an explicit call site? `installFullIcons()` is exported too and
|
|
14
|
+
* is idempotent — importing this module already invokes it once.
|
|
15
|
+
*
|
|
16
|
+
* This is a separate subpath export on purpose: the core
|
|
17
|
+
* '@zakmandhro/bunti' entry never loads the ~280KB glyph map.
|
|
18
|
+
*/
|
|
19
|
+
import { NF_GLYPHS } from './data/nf-glyphs';
|
|
20
|
+
import { registerAll } from './icons';
|
|
21
|
+
export { NF_GLYPHS, NF_VERSION } from './data/nf-glyphs';
|
|
22
|
+
let installed = false;
|
|
23
|
+
/** Installs the full Nerd Fonts map into the runtime registry (idempotent). */
|
|
24
|
+
export function installFullIcons() {
|
|
25
|
+
if (installed)
|
|
26
|
+
return;
|
|
27
|
+
installed = true;
|
|
28
|
+
registerAll(NF_GLYPHS);
|
|
29
|
+
}
|
|
30
|
+
installFullIcons();
|
|
31
|
+
//# sourceMappingURL=icons-full.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons-full.js","sourceRoot":"","sources":["../src/icons-full.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGzD,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB;IAC9B,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,WAAW,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC;AAED,gBAAgB,EAAE,CAAC"}
|