Skip to content

Commit 16642b4

Browse files
committed
refactor: alignment to use string literals instead of magic numbers
1 parent 0c13b1e commit 16642b4

4 files changed

Lines changed: 138 additions & 12 deletions

File tree

examples/inline-regions/index.ts

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,108 @@ const RAINBOW = [RED, ORANGE, YELLOW, NGREEN, BLUE, VIOLET];
4848

4949
const BRAILLE = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
5050

51+
function* queryCursor(): Operation<CursorEvent> {
52+
let parser = yield* until(createInput({ escLatency: 100 }));
53+
write(DSR());
54+
55+
let buf = new Uint8Array(32);
56+
while (true) {
57+
let n = Deno.stdin.readSync(buf);
58+
if (n === null) continue;
59+
let result = parser.scan(buf.subarray(0, n));
60+
for (let ev of result.events) {
61+
if (ev.type === "cursor") {
62+
return ev;
63+
}
64+
}
65+
}
66+
}
67+
68+
function waitKey() {
69+
let buf = new Uint8Array(32);
70+
while (true) {
71+
let n = Deno.stdin.readSync(buf);
72+
if (n === null) continue;
73+
for (let i = 0; i < n; i++) {
74+
if (buf[i] === 0x03) {
75+
Deno.stdin.setRaw(false);
76+
write(SHOWCURSOR());
77+
Deno.exit(0);
78+
}
79+
}
80+
return;
81+
}
82+
}
83+
84+
function box(msg: string, fg: number, border: number): Op[] {
85+
return [
86+
open("root", {
87+
layout: { width: grow(), height: grow(), direction: "ttb" },
88+
}),
89+
open("box", {
90+
layout: {
91+
width: grow(),
92+
height: grow(),
93+
direction: "ttb",
94+
padding: { left: 1 },
95+
alignY: "center",
96+
},
97+
border: {
98+
color: border,
99+
left: 1,
100+
right: 1,
101+
top: 1,
102+
bottom: 1,
103+
},
104+
cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 },
105+
}),
106+
text(msg, { color: fg }),
107+
close(),
108+
close(),
109+
];
110+
}
111+
112+
function* transaction(
113+
height: number,
114+
renderFrame: (frame: number) => Op[],
115+
frames: number,
116+
interval: number,
117+
): Operation<void> {
118+
let { columns } = Deno.consoleSize();
119+
120+
write(encode("\n".repeat(height)));
121+
122+
let pos = yield* queryCursor();
123+
/** 1-based terminal row where the region starts */
124+
let row = pos.row - height + 1;
125+
126+
write(ESC("7"));
127+
let tty = settings(cursor(false));
128+
write(tty.apply);
129+
130+
let term = validated(
131+
yield* until(createTerm({ width: columns, height })),
132+
);
133+
for (let i = 0; i < frames; i++) {
134+
let result = term.render(renderFrame(i), { row });
135+
write(new Uint8Array(result.output));
136+
yield* sleep(interval);
137+
}
138+
139+
write(tty.revert);
140+
write(ESC("8"));
141+
write(encode("\n"));
142+
}
143+
144+
function say(msg: string) {
145+
write(encode(msg + "\n"));
146+
}
147+
148+
function pause() {
149+
waitKey();
150+
write(encode("\n"));
151+
}
152+
51153
await main(function* () {
52154
let { columns } = terminalSize();
53155
setRawMode(true);

examples/keyboard/index.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,8 @@ function key(ops: Op[], k: KeyDef, ctx: AppContext): void {
225225
width: fixed(w),
226226
height: grow(),
227227
padding: { left: 1, right: 1 },
228-
alignX: 2,
229-
alignY: 2,
228+
alignX: "center",
229+
alignY: "center",
230230
},
231231
bg,
232232
border: hover
@@ -565,8 +565,8 @@ function keyboard(ctx: AppContext): Op[] {
565565
width: grow(),
566566
height: grow(),
567567
direction: "ttb",
568-
alignX: 2,
569-
alignY: 2,
568+
alignX: "center",
569+
alignY: "center",
570570
padding: { left: 2, top: 1 },
571571
},
572572
}),
@@ -583,7 +583,7 @@ function keyboard(ctx: AppContext): Op[] {
583583
layout: {
584584
width: grow(),
585585
direction: "ltr",
586-
alignY: 0,
586+
alignY: "top",
587587
padding: { bottom: 1 },
588588
},
589589
}),
@@ -634,7 +634,7 @@ function keyboard(ctx: AppContext): Op[] {
634634

635635
// config panel (right)
636636
ops.push(
637-
open("", { layout: { width: grow(), direction: "ltr", alignX: 1 } }),
637+
open("", { layout: { width: grow(), direction: "ltr", alignX: "right" } }),
638638
);
639639
configPanel(ops, ctx);
640640
ops.push(close());
@@ -648,7 +648,7 @@ function keyboard(ctx: AppContext): Op[] {
648648
layout: {
649649
direction: "ltr",
650650
gap: 3,
651-
alignY: 1,
651+
alignY: "bottom",
652652
padding: { left: 1, right: 1, top: 1, bottom: 1 },
653653
},
654654
border: { color: kbColor, left: 1, right: 1, top: 1, bottom: 1 },

ops.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,19 @@ export function pack(
132132
);
133133
o += 4;
134134

135-
view.setUint32(o, (l.alignX ?? 0) | ((l.alignY ?? 0) << 8), true);
135+
const alignX = l.alignX === "right"
136+
? 1
137+
: l.alignX === "center"
138+
? 2
139+
: 0;
140+
141+
const alignY = l.alignY === "bottom"
142+
? 1
143+
: l.alignY === "center"
144+
? 2
145+
: 0;
146+
147+
view.setUint32(o, alignX | (alignY << 8), true);
136148
o += 4;
137149
}
138150

@@ -275,8 +287,8 @@ export interface OpenElement {
275287
padding?: { left?: number; right?: number; top?: number; bottom?: number };
276288
gap?: number;
277289
direction?: "ltr" | "ttb";
278-
alignX?: number;
279-
alignY?: number;
290+
alignX?: "left" | "center" | "right";
291+
alignY?: "top" | "center" | "bottom";
280292
};
281293
bg?: number;
282294
cornerRadius?: { tl?: number; tr?: number; bl?: number; br?: number };

validate.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,20 @@ const Layout = Type.Object({
5656
direction: Type.Optional(
5757
Type.Union([Type.Literal("ltr"), Type.Literal("ttb")]),
5858
),
59-
alignX: Type.Optional(u8),
60-
alignY: Type.Optional(u8),
59+
alignX: Type.Optional(
60+
Type.Union([
61+
Type.Literal("left"),
62+
Type.Literal("center"),
63+
Type.Literal("right"),
64+
]),
65+
),
66+
alignY: Type.Optional(
67+
Type.Union([
68+
Type.Literal("top"),
69+
Type.Literal("center"),
70+
Type.Literal("bottom"),
71+
]),
72+
),
6173
});
6274

6375
const CornerRadius = Type.Object({

0 commit comments

Comments
 (0)