@zakmandhro/bunti 0.2.0 → 0.2.1
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/README.md +10 -5
- package/dist/components/Button.d.ts +5 -2
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Button.js +10 -1
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Input.js +4 -0
- package/dist/components/Input.js.map +1 -1
- package/dist/components/Link.d.ts.map +1 -1
- package/dist/components/Link.js +10 -1
- package/dist/components/Link.js.map +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Modal.js +9 -4
- package/dist/components/Modal.js.map +1 -1
- package/dist/dsl/context.d.ts.map +1 -1
- package/dist/dsl/context.js +109 -14
- package/dist/dsl/context.js.map +1 -1
- package/dist/dsl/interaction.d.ts +17 -2
- package/dist/dsl/interaction.d.ts.map +1 -1
- package/dist/dsl/interaction.js +54 -5
- package/dist/dsl/interaction.js.map +1 -1
- package/dist/dsl/types.d.ts +47 -2
- package/dist/dsl/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/layout.d.ts +43 -2
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +62 -15
- package/dist/layout.js.map +1 -1
- package/dist/state.d.ts +19 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,11 +6,26 @@
|
|
|
6
6
|
* carrying the press-origin coordinates (state.clickX/clickY). isClicked is
|
|
7
7
|
* therefore true exactly one frame per click — components fire actions once
|
|
8
8
|
* per click instead of every frame the button is held.
|
|
9
|
+
*
|
|
10
|
+
* Hit-testing semantics:
|
|
11
|
+
* - Topmost wins: when several hitboxes contain the point, only the
|
|
12
|
+
* last-registered one (declaration order; layers render later, so later
|
|
13
|
+
* registration = visually on top) reports hovered/pressed/clicked.
|
|
14
|
+
* - hitbox() evaluates against the PREVIOUS frame's settled rect for its id
|
|
15
|
+
* when one exists: registration rects can still be re-placed by the direct
|
|
16
|
+
* box renderer at paint time (auto-height measure, content alignment), and
|
|
17
|
+
* a click physically happened on the frame the user was looking at. New
|
|
18
|
+
* ids fall back to their freshly resolved rect.
|
|
19
|
+
* - The isHovered/isPressed/isClicked query forms evaluate against the
|
|
20
|
+
* current frame's registrations (they are called after registration).
|
|
9
21
|
*/
|
|
10
22
|
import type { Rect, RectInput } from '../geometry';
|
|
11
|
-
import type { ScreenState } from '../state';
|
|
23
|
+
import type { Hitbox, ScreenState } from '../state';
|
|
12
24
|
import type { BuntiContext } from './types';
|
|
13
25
|
type Interaction = Pick<BuntiContext, 'focusable' | 'isFocused' | 'focus' | 'focusNext' | 'hitbox' | 'isHovered' | 'isPressed' | 'isClicked' | 'isHoverEnter' | 'isHoverLeave'>;
|
|
14
|
-
export declare function createInteraction(state: ScreenState, resolveRect: (bounds: RectInput) => Rect
|
|
26
|
+
export declare function createInteraction(state: ScreenState, resolveRect: (bounds: RectInput) => Rect, capture?: (box: Hitbox, flow?: {
|
|
27
|
+
line: number;
|
|
28
|
+
col: number;
|
|
29
|
+
}) => void): Interaction;
|
|
15
30
|
export {};
|
|
16
31
|
//# sourceMappingURL=interaction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../../src/dsl/interaction.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../../src/dsl/interaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAC;AAE1D,KAAK,WAAW,GAAG,IAAI,CACrB,YAAY,EACV,WAAW,GACX,WAAW,GACX,OAAO,GACP,WAAW,GACX,QAAQ,GACR,WAAW,GACX,WAAW,GACX,WAAW,GACX,cAAc,GACd,cAAc,CACjB,CAAC;AA8DF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,EACxC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,GACpE,WAAW,CAsGb"}
|
package/dist/dsl/interaction.js
CHANGED
|
@@ -6,10 +6,46 @@
|
|
|
6
6
|
* carrying the press-origin coordinates (state.clickX/clickY). isClicked is
|
|
7
7
|
* therefore true exactly one frame per click — components fire actions once
|
|
8
8
|
* per click instead of every frame the button is held.
|
|
9
|
+
*
|
|
10
|
+
* Hit-testing semantics:
|
|
11
|
+
* - Topmost wins: when several hitboxes contain the point, only the
|
|
12
|
+
* last-registered one (declaration order; layers render later, so later
|
|
13
|
+
* registration = visually on top) reports hovered/pressed/clicked.
|
|
14
|
+
* - hitbox() evaluates against the PREVIOUS frame's settled rect for its id
|
|
15
|
+
* when one exists: registration rects can still be re-placed by the direct
|
|
16
|
+
* box renderer at paint time (auto-height measure, content alignment), and
|
|
17
|
+
* a click physically happened on the frame the user was looking at. New
|
|
18
|
+
* ids fall back to their freshly resolved rect.
|
|
19
|
+
* - The isHovered/isPressed/isClicked query forms evaluate against the
|
|
20
|
+
* current frame's registrations (they are called after registration).
|
|
9
21
|
*/
|
|
10
22
|
function contains(box, x, y) {
|
|
11
23
|
return (x >= box.x && x < box.x + box.width && y >= box.y && y < box.y + box.height);
|
|
12
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Last-registered (= topmost) hitbox id containing the point, if any.
|
|
27
|
+
* Map iteration follows insertion order, so the last containing entry is
|
|
28
|
+
* the one declared latest — layers render later, hence visually on top.
|
|
29
|
+
*/
|
|
30
|
+
function topmostAt(map, x, y) {
|
|
31
|
+
if (!map)
|
|
32
|
+
return undefined;
|
|
33
|
+
let top;
|
|
34
|
+
for (const box of map.values()) {
|
|
35
|
+
if (contains(box, x, y))
|
|
36
|
+
top = box.id;
|
|
37
|
+
}
|
|
38
|
+
return top;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* True when `id` is the topmost hitbox at the point, or when the map has
|
|
42
|
+
* no containing entry at all (first-frame fallback: nothing is known to
|
|
43
|
+
* cover the point, so the caller's own containment test decides).
|
|
44
|
+
*/
|
|
45
|
+
function isTopmost(map, id, x, y) {
|
|
46
|
+
const top = topmostAt(map, x, y);
|
|
47
|
+
return top === undefined || top === id;
|
|
48
|
+
}
|
|
13
49
|
/**
|
|
14
50
|
* True when this frame carries a click. `state.keys` covers events drained
|
|
15
51
|
* by the render loop; the `state.lastKey === 'click'` check keeps manually
|
|
@@ -27,7 +63,7 @@ function clickX(state) {
|
|
|
27
63
|
function clickY(state) {
|
|
28
64
|
return state.clickY ?? state.mouseY;
|
|
29
65
|
}
|
|
30
|
-
export function createInteraction(state, resolveRect) {
|
|
66
|
+
export function createInteraction(state, resolveRect, capture) {
|
|
31
67
|
const interaction = {
|
|
32
68
|
focusable(id) {
|
|
33
69
|
if (!state.focusableIds.includes(id)) {
|
|
@@ -54,7 +90,15 @@ export function createInteraction(state, resolveRect) {
|
|
|
54
90
|
const rect = resolveRect(bounds);
|
|
55
91
|
const box = { id, ...rect };
|
|
56
92
|
state.hitboxes.set(id, box);
|
|
57
|
-
|
|
93
|
+
// Direct boxes re-place captured hitboxes once their painted rect is
|
|
94
|
+
// known; flow-anchored entries carry their content-local (line, col).
|
|
95
|
+
capture?.(box, bounds.flow ? { line: bounds.y ?? 0, col: bounds.x ?? 0 } : undefined);
|
|
96
|
+
// Evaluate against last frame's settled rect when this id existed
|
|
97
|
+
// (the rect the user actually saw); fall back to the fresh rect.
|
|
98
|
+
const prev = state.prevHitboxes;
|
|
99
|
+
const eff = prev?.get(id) ?? box;
|
|
100
|
+
const hovered = contains(eff, state.mouseX, state.mouseY) &&
|
|
101
|
+
isTopmost(prev, id, state.mouseX, state.mouseY);
|
|
58
102
|
// Hover-change tracking against the last evaluation of this id.
|
|
59
103
|
const prevHovered = state.hoverStates.get(id) ?? false;
|
|
60
104
|
if (hovered !== prevHovered) {
|
|
@@ -69,14 +113,17 @@ export function createInteraction(state, resolveRect) {
|
|
|
69
113
|
state.hoverStates.set(id, hovered);
|
|
70
114
|
}
|
|
71
115
|
const pressed = hovered && state.isMouseDown && state.mouseButton === 0;
|
|
72
|
-
const clicked = frameHasClick(state) &&
|
|
116
|
+
const clicked = frameHasClick(state) &&
|
|
117
|
+
contains(eff, clickX(state), clickY(state)) &&
|
|
118
|
+
isTopmost(prev, id, clickX(state), clickY(state));
|
|
73
119
|
return { box, hovered, pressed, clicked };
|
|
74
120
|
},
|
|
75
121
|
isHovered(id) {
|
|
76
122
|
const box = state.hitboxes.get(id);
|
|
77
123
|
if (!box)
|
|
78
124
|
return false;
|
|
79
|
-
return contains(box, state.mouseX, state.mouseY)
|
|
125
|
+
return (contains(box, state.mouseX, state.mouseY) &&
|
|
126
|
+
isTopmost(state.hitboxes, id, state.mouseX, state.mouseY));
|
|
80
127
|
},
|
|
81
128
|
isPressed(id) {
|
|
82
129
|
return (interaction.isHovered(id) &&
|
|
@@ -87,7 +134,9 @@ export function createInteraction(state, resolveRect) {
|
|
|
87
134
|
const box = state.hitboxes.get(id);
|
|
88
135
|
if (!box)
|
|
89
136
|
return false;
|
|
90
|
-
return (frameHasClick(state) &&
|
|
137
|
+
return (frameHasClick(state) &&
|
|
138
|
+
contains(box, clickX(state), clickY(state)) &&
|
|
139
|
+
isTopmost(state.hitboxes, id, clickX(state), clickY(state)));
|
|
91
140
|
},
|
|
92
141
|
isHoverEnter(id) {
|
|
93
142
|
return state.hoverEntered.has(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../../src/dsl/interaction.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../../src/dsl/interaction.ts"],"names":[],"mappings":"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"}
|
package/dist/dsl/types.d.ts
CHANGED
|
@@ -76,6 +76,14 @@ export interface DSLBoxOptions extends StyleOptions {
|
|
|
76
76
|
borderColor?: string | number | RGB | ThemeColor | ((s: string) => string) | SideColors;
|
|
77
77
|
/** If true, the string is returned but NOT appended to the flow. */
|
|
78
78
|
detach?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Visual-only vertical paint offset in rows (direct-rendered boxes).
|
|
81
|
+
* The box PAINTS shifted by this amount while its resolved rect —
|
|
82
|
+
* sub-context offsets, hitboxes, focus geometry — stays at the settled
|
|
83
|
+
* position. Entrance animations (Modal's slide-in) use this so hitboxes
|
|
84
|
+
* sit at their final coordinates from the first frame.
|
|
85
|
+
*/
|
|
86
|
+
paintOffsetY?: number;
|
|
79
87
|
}
|
|
80
88
|
/** Options for `ctx.typewriter()`. */
|
|
81
89
|
export interface TypewriterOptions {
|
|
@@ -338,10 +346,12 @@ export interface BuntiContext {
|
|
|
338
346
|
focusNext(): void;
|
|
339
347
|
/**
|
|
340
348
|
* Registers a clickable region and returns its interaction snapshot for
|
|
341
|
-
* this frame. Requires `mouse: true`.
|
|
349
|
+
* this frame. Requires `mouse: true`. When several hitboxes contain the
|
|
350
|
+
* pointer, only the topmost (last-registered — layers render later, so
|
|
351
|
+
* later registration is visually on top) reports hovered/pressed/clicked.
|
|
342
352
|
* @example const { hovered, clicked } = ctx.hitbox('save', { x: 2, y: 5, width: 10, height: 1 });
|
|
343
353
|
*/
|
|
344
|
-
hitbox(id: string, bounds:
|
|
354
|
+
hitbox(id: string, bounds: HitboxBounds): {
|
|
345
355
|
box: Hitbox;
|
|
346
356
|
hovered: boolean;
|
|
347
357
|
pressed: boolean;
|
|
@@ -475,6 +485,39 @@ export interface BuntiContext {
|
|
|
475
485
|
/** Resets an animate()/typewriter()/stagger() id clock to "now". */
|
|
476
486
|
restartAnimation(id: string): void;
|
|
477
487
|
}
|
|
488
|
+
/**
|
|
489
|
+
* Bounds for ctx.hitbox(): a RectInput plus flow anchoring.
|
|
490
|
+
*/
|
|
491
|
+
export interface HitboxBounds extends RectInput {
|
|
492
|
+
/**
|
|
493
|
+
* Anchors the hitbox to the text flow: x/y are the flow (column, line)
|
|
494
|
+
* where the owning content begins, and the enclosing direct-rendered box
|
|
495
|
+
* re-places the rect at paint time so content alignment (align/valign,
|
|
496
|
+
* auto-height centering) can never separate the hitbox from the painted
|
|
497
|
+
* cells. Components (Button/Input/Link) pass this for their flow
|
|
498
|
+
* placement; app code with explicit coordinates rarely needs it.
|
|
499
|
+
*/
|
|
500
|
+
flow?: boolean;
|
|
501
|
+
}
|
|
502
|
+
/** One hitbox registered inside a pending direct-box paint (see HitboxFrame). */
|
|
503
|
+
export interface HitboxEntry {
|
|
504
|
+
/** The live Hitbox object in state.hitboxes (mutated by the fixup). */
|
|
505
|
+
box: Hitbox;
|
|
506
|
+
/** Flow anchor (content-local line/column) for flow-placed hitboxes. */
|
|
507
|
+
flow?: {
|
|
508
|
+
line: number;
|
|
509
|
+
col: number;
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Hitboxes registered while a direct box renders its callback. Once the
|
|
514
|
+
* box's painted rect is known (content measured, alignment applied), the
|
|
515
|
+
* renderer re-places every captured entry so registered hitboxes exactly
|
|
516
|
+
* match the painted cells.
|
|
517
|
+
*/
|
|
518
|
+
export interface HitboxFrame {
|
|
519
|
+
entries: HitboxEntry[];
|
|
520
|
+
}
|
|
478
521
|
/**
|
|
479
522
|
* The DSL state container allowing stable references with dynamic capture targets.
|
|
480
523
|
*/
|
|
@@ -491,6 +534,8 @@ export interface DSLState {
|
|
|
491
534
|
themeStack: Theme[];
|
|
492
535
|
/** Direct-rendered box areas this frame (root only; dev diagnostics). */
|
|
493
536
|
boxRects?: Rect[];
|
|
537
|
+
/** Pending direct-box hitbox fixups (innermost frame last). */
|
|
538
|
+
hitboxFrames?: HitboxFrame[];
|
|
494
539
|
}
|
|
495
540
|
/** One queued overlay buffer awaiting composite (see ctx.layer()). */
|
|
496
541
|
export interface RenderLayer {
|
package/dist/dsl/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dsl/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACb,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;IAgBf,4EAA4E;;IAE5E,wDAAwD;;IAExD,0DAA0D;;CAE3D,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,UAAU,CAAC;IACxD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG,UAAU,GAAG,OAAO,CAAC;IACrD,2EAA2E;IAC3E,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,CAAC,CAAC,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC1B,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,sDAAsD;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,WAAW,CAAC,EACR,MAAM,GACN,MAAM,GACN,GAAG,GACH,UAAU,GACV,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GACvB,UAAU,CAAC;IACf,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dsl/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -175,7 +175,8 @@ export declare const bunti: {
|
|
|
175
175
|
rect(state: state.ScreenState, x: number, y: number, w: number, h: number, style: layout.RectOptions): void;
|
|
176
176
|
blit(state: state.ScreenState, startX: number, startY: number, content: string, style?: Partial<state.Cell>): void;
|
|
177
177
|
resolveSize(unit: layout.SizeUnit | undefined, parentDim: number, contentDim: number): number;
|
|
178
|
-
|
|
178
|
+
measureBox(content: string, options?: layout.StyleOptions, parentW?: number, parentH?: number): layout.BoxMeasure;
|
|
179
|
+
box(content: string, options?: layout.StyleOptions, parentW?: number, parentH?: number, measure?: layout.BoxMeasure): string;
|
|
179
180
|
joinHorizontal(...blocks: string[]): string;
|
|
180
181
|
joinVertical(...blocks: string[]): string;
|
|
181
182
|
createStyle(defaults: layout.StyleOptions): (content: string, overrides?: layout.StyleOptions) => string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/layout.d.ts
CHANGED
|
@@ -106,13 +106,54 @@ export interface StyleOptions {
|
|
|
106
106
|
* Resolves a SizeUnit to an absolute integer based on parent dimensions.
|
|
107
107
|
*/
|
|
108
108
|
export declare function resolveSize(unit: SizeUnit | undefined, parentDim: number, contentDim: number): number;
|
|
109
|
+
/**
|
|
110
|
+
* The measurement half of box(): everything about a box's geometry that is
|
|
111
|
+
* knowable before painting. box() renders from one of these, and the direct
|
|
112
|
+
* box renderer uses the SAME measure to place hitboxes — this shared pass is
|
|
113
|
+
* what guarantees "hitboxes and rendered output share the same resolved
|
|
114
|
+
* rect" for content-sized and aligned boxes.
|
|
115
|
+
*/
|
|
116
|
+
export interface BoxMeasure {
|
|
117
|
+
/** Post-wrap/truncate content lines (ANSI intact, emojis swapped). */
|
|
118
|
+
lines: string[];
|
|
119
|
+
/** Border thickness per side (0 or 1). */
|
|
120
|
+
borderInset: number;
|
|
121
|
+
/** Horizontal padding inside the border. */
|
|
122
|
+
px: number;
|
|
123
|
+
/** Vertical padding inside the border. */
|
|
124
|
+
py: number;
|
|
125
|
+
/** Inner columns between the borders (padding included). */
|
|
126
|
+
innerW: number;
|
|
127
|
+
/** Inner rows between the borders (padding included). */
|
|
128
|
+
innerH: number;
|
|
129
|
+
/** Blank rows above the content from valign. */
|
|
130
|
+
topSpace: number;
|
|
131
|
+
/** Blank rows below the content from valign. */
|
|
132
|
+
bottomSpace: number;
|
|
133
|
+
/** Outer width of the rendered box string. */
|
|
134
|
+
width: number;
|
|
135
|
+
/** Outer height of the rendered box string. */
|
|
136
|
+
height: number;
|
|
137
|
+
/** Column offset (from the box's left edge) where content line k starts. */
|
|
138
|
+
contentLeft(k: number): number;
|
|
139
|
+
/** Row offset (from the box's top edge) of content line k. */
|
|
140
|
+
contentTop(k: number): number;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Measures a box without rendering it: resolves outer/inner dimensions,
|
|
144
|
+
* wraps/truncates the content lines, and exposes the per-line placement
|
|
145
|
+
* (alignment + valign) the renderer will use. Pass the result back to
|
|
146
|
+
* box() to render without re-measuring.
|
|
147
|
+
*/
|
|
148
|
+
export declare function measureBox(content: string, options?: StyleOptions, parentW?: number, parentH?: number): BoxMeasure;
|
|
109
149
|
/**
|
|
110
150
|
* Generates a styled box string with perfect alignment and optional
|
|
111
151
|
* wrapping. This is the pure string-building form; ctx.box() adds
|
|
112
|
-
* placement and painting on top of it.
|
|
152
|
+
* placement and painting on top of it. Pass a precomputed `measure`
|
|
153
|
+
* (from measureBox with the SAME content/options) to skip re-measuring.
|
|
113
154
|
* @example box('hello', { width: 20, border: 'rounded', padding: [0, 1] });
|
|
114
155
|
*/
|
|
115
|
-
export declare function box(content: string, options?: StyleOptions, parentW?: number, parentH?: number): string;
|
|
156
|
+
export declare function box(content: string, options?: StyleOptions, parentW?: number, parentH?: number, measure?: BoxMeasure): string;
|
|
116
157
|
/** Joins rendered blocks side-by-side, padding each to its own width. */
|
|
117
158
|
export declare function joinHorizontal(...blocks: string[]): string;
|
|
118
159
|
/** Stacks rendered blocks vertically (skips empty strings). */
|
package/dist/layout.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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"}
|
package/dist/layout.js
CHANGED
|
@@ -331,18 +331,19 @@ export function resolveSize(unit, parentDim, contentDim) {
|
|
|
331
331
|
return contentDim;
|
|
332
332
|
}
|
|
333
333
|
/**
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
334
|
+
* Measures a box without rendering it: resolves outer/inner dimensions,
|
|
335
|
+
* wraps/truncates the content lines, and exposes the per-line placement
|
|
336
|
+
* (alignment + valign) the renderer will use. Pass the result back to
|
|
337
|
+
* box() to render without re-measuring.
|
|
338
338
|
*/
|
|
339
|
-
export function
|
|
339
|
+
export function measureBox(content, options = {}, parentW, parentH) {
|
|
340
340
|
// Ensure we operate on the swapped glyphs for all layout math
|
|
341
341
|
content = replaceEmojis(content);
|
|
342
342
|
const px = options.padding?.[1] ?? 0;
|
|
343
343
|
const py = options.padding?.[0] ?? 0;
|
|
344
344
|
const borderStyle = options.border || 'none';
|
|
345
345
|
const borderOffset = borderStyle === 'none' ? 0 : 2;
|
|
346
|
+
const borderInset = borderOffset / 2;
|
|
346
347
|
const rawLines = content.split('\n');
|
|
347
348
|
const maxRawW = Math.max(...rawLines.map((l) => visibleWidth(l)), 0);
|
|
348
349
|
const intrinsicW = maxRawW + px * 2 + borderOffset;
|
|
@@ -369,6 +370,62 @@ export function box(content, options = {}, parentW, parentH) {
|
|
|
369
370
|
finalInnerH = Math.max(finalInnerH, options.minHeight - borderOffset);
|
|
370
371
|
if (options.maxHeight)
|
|
371
372
|
finalInnerH = Math.min(finalInnerH, options.maxHeight - borderOffset);
|
|
373
|
+
const vSpace = Math.max(0, finalInnerH - lines.length - py * 2);
|
|
374
|
+
let topSpace = 0;
|
|
375
|
+
let bottomSpace = vSpace;
|
|
376
|
+
if (options.valign === 'middle') {
|
|
377
|
+
topSpace = Math.floor(vSpace / 2);
|
|
378
|
+
bottomSpace = Math.ceil(vSpace / 2);
|
|
379
|
+
}
|
|
380
|
+
else if (options.valign === 'bottom') {
|
|
381
|
+
topSpace = vSpace;
|
|
382
|
+
bottomSpace = 0;
|
|
383
|
+
}
|
|
384
|
+
const align = options.align || 'left';
|
|
385
|
+
return {
|
|
386
|
+
lines,
|
|
387
|
+
borderInset,
|
|
388
|
+
px,
|
|
389
|
+
py,
|
|
390
|
+
innerW: targetInnerW,
|
|
391
|
+
innerH: finalInnerH,
|
|
392
|
+
topSpace,
|
|
393
|
+
bottomSpace,
|
|
394
|
+
width: targetInnerW + borderOffset,
|
|
395
|
+
// Content lines are never clipped to a too-small fixed height, so the
|
|
396
|
+
// rendered string can exceed finalInnerH — mirror that here.
|
|
397
|
+
height: borderOffset + py * 2 + topSpace + bottomSpace + lines.length,
|
|
398
|
+
contentLeft(k) {
|
|
399
|
+
const line = (lines[k] ?? '').trimEnd();
|
|
400
|
+
const extra = Math.max(0, targetInnerW - visibleWidth(line) - px * 2);
|
|
401
|
+
const left = align === 'center'
|
|
402
|
+
? px + Math.floor(extra / 2)
|
|
403
|
+
: align === 'right'
|
|
404
|
+
? px + extra
|
|
405
|
+
: px;
|
|
406
|
+
return borderInset + left;
|
|
407
|
+
},
|
|
408
|
+
contentTop(k) {
|
|
409
|
+
return borderInset + py + topSpace + k;
|
|
410
|
+
},
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Generates a styled box string with perfect alignment and optional
|
|
415
|
+
* wrapping. This is the pure string-building form; ctx.box() adds
|
|
416
|
+
* placement and painting on top of it. Pass a precomputed `measure`
|
|
417
|
+
* (from measureBox with the SAME content/options) to skip re-measuring.
|
|
418
|
+
* @example box('hello', { width: 20, border: 'rounded', padding: [0, 1] });
|
|
419
|
+
*/
|
|
420
|
+
export function box(content, options = {}, parentW, parentH, measure) {
|
|
421
|
+
const m = measure ?? measureBox(content, options, parentW, parentH);
|
|
422
|
+
const px = m.px;
|
|
423
|
+
const py = m.py;
|
|
424
|
+
const borderStyle = options.border || 'none';
|
|
425
|
+
const lines = m.lines;
|
|
426
|
+
const targetInnerW = m.innerW;
|
|
427
|
+
const topS = m.topSpace;
|
|
428
|
+
const bottomS = m.bottomSpace;
|
|
372
429
|
const b = borderStyle === 'none'
|
|
373
430
|
? null
|
|
374
431
|
: BORDERS[borderStyle] || BORDERS.default;
|
|
@@ -420,16 +477,6 @@ export function box(content, options = {}, parentW, parentH) {
|
|
|
420
477
|
const hBottom = b?.bottom || b?.h || ' ';
|
|
421
478
|
const vLeft = b?.left || b?.v || ' ';
|
|
422
479
|
const vRight = b?.right || b?.v || ' ';
|
|
423
|
-
const vSpace = Math.max(0, finalInnerH - lines.length - py * 2);
|
|
424
|
-
let topS = 0, bottomS = vSpace;
|
|
425
|
-
if (options.valign === 'middle') {
|
|
426
|
-
topS = Math.floor(vSpace / 2);
|
|
427
|
-
bottomS = Math.ceil(vSpace / 2);
|
|
428
|
-
}
|
|
429
|
-
else if (options.valign === 'bottom') {
|
|
430
|
-
topS = vSpace;
|
|
431
|
-
bottomS = 0;
|
|
432
|
-
}
|
|
433
480
|
const out = [];
|
|
434
481
|
// Top Border
|
|
435
482
|
if (b) {
|