@nmakarov/cli-toolkit 0.67.0 → 0.69.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/dist/cli-runner.cjs +259 -45
- package/dist/cli-runner.cjs.map +1 -1
- package/dist/cli-runner.js +253 -39
- package/dist/cli-runner.js.map +1 -1
- package/dist/index.cjs +265 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +253 -39
- package/dist/index.js.map +1 -1
- package/dist/init.cjs +259 -45
- package/dist/init.cjs.map +1 -1
- package/dist/init.js +253 -39
- package/dist/init.js.map +1 -1
- package/dist/screen.cjs +255 -47
- package/dist/screen.cjs.map +1 -1
- package/dist/screen.js +239 -39
- package/dist/screen.js.map +1 -1
- package/package.json +1 -1
package/dist/cli-runner.cjs
CHANGED
|
@@ -493,6 +493,59 @@ var init_list_components = __esm({
|
|
|
493
493
|
}
|
|
494
494
|
});
|
|
495
495
|
|
|
496
|
+
// src/screen/key-bindings.js
|
|
497
|
+
function bindingIdentity(b) {
|
|
498
|
+
return [
|
|
499
|
+
String(b?.key ?? ""),
|
|
500
|
+
b?.meta ? "m" : "",
|
|
501
|
+
b?.ctrl ? "c" : "",
|
|
502
|
+
b?.shift ? "s" : ""
|
|
503
|
+
].join("|");
|
|
504
|
+
}
|
|
505
|
+
function bindingMatchesInput(binding, input, key) {
|
|
506
|
+
if (!binding?.key) return false;
|
|
507
|
+
let keyMatches = false;
|
|
508
|
+
if (key?.[binding.key]) {
|
|
509
|
+
keyMatches = true;
|
|
510
|
+
} else if (input === binding.key) {
|
|
511
|
+
keyMatches = true;
|
|
512
|
+
} else if (key?.name === binding.key) {
|
|
513
|
+
keyMatches = true;
|
|
514
|
+
}
|
|
515
|
+
if (!keyMatches) return false;
|
|
516
|
+
const modOk = (flag, pressed) => {
|
|
517
|
+
if (flag === true) return !!pressed;
|
|
518
|
+
if (flag === false) return !pressed;
|
|
519
|
+
return !pressed;
|
|
520
|
+
};
|
|
521
|
+
if (!modOk(binding.meta, key?.meta)) return false;
|
|
522
|
+
if (!modOk(binding.ctrl, key?.ctrl)) return false;
|
|
523
|
+
if (binding.shift !== void 0 && !!key?.shift !== !!binding.shift) return false;
|
|
524
|
+
return true;
|
|
525
|
+
}
|
|
526
|
+
function formatBindingKey(binding) {
|
|
527
|
+
let label = KEY_LABELS[binding.key] || binding.key;
|
|
528
|
+
if (binding.shift) label = `\u21E7${label}`;
|
|
529
|
+
if (binding.ctrl) label = `^${label}`;
|
|
530
|
+
if (binding.meta) label = `\u2325${label}`;
|
|
531
|
+
return label;
|
|
532
|
+
}
|
|
533
|
+
var KEY_LABELS;
|
|
534
|
+
var init_key_bindings = __esm({
|
|
535
|
+
"src/screen/key-bindings.js"() {
|
|
536
|
+
KEY_LABELS = {
|
|
537
|
+
escape: "esc",
|
|
538
|
+
leftArrow: "\u2190",
|
|
539
|
+
rightArrow: "\u2192",
|
|
540
|
+
upArrow: "\u2191",
|
|
541
|
+
downArrow: "\u2193",
|
|
542
|
+
return: "enter",
|
|
543
|
+
pageUp: "PgUp",
|
|
544
|
+
pageDown: "PgDn"
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
|
|
496
549
|
// src/screen/screens.js
|
|
497
550
|
function groupKeyBindings(bindings) {
|
|
498
551
|
const groups = {};
|
|
@@ -506,7 +559,7 @@ function groupKeyBindings(bindings) {
|
|
|
506
559
|
order: binding.order || 999
|
|
507
560
|
};
|
|
508
561
|
}
|
|
509
|
-
groups[caption].keys.push(binding
|
|
562
|
+
groups[caption].keys.push(formatBindingKey(binding));
|
|
510
563
|
});
|
|
511
564
|
return Object.values(groups);
|
|
512
565
|
}
|
|
@@ -546,12 +599,14 @@ function formatKeyBindings(bindings, mode = "long") {
|
|
|
546
599
|
}
|
|
547
600
|
function formatKeys(keys) {
|
|
548
601
|
const keyMap = {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
602
|
+
escape: "esc",
|
|
603
|
+
leftArrow: "\u2190",
|
|
604
|
+
rightArrow: "\u2192",
|
|
605
|
+
upArrow: "\u2191",
|
|
606
|
+
downArrow: "\u2193",
|
|
607
|
+
return: "enter",
|
|
608
|
+
pageUp: "PgUp",
|
|
609
|
+
pageDown: "PgDn"
|
|
555
610
|
};
|
|
556
611
|
return keys.map((k) => keyMap[k] || k).join("/");
|
|
557
612
|
}
|
|
@@ -591,7 +646,10 @@ async function showScreen(config2) {
|
|
|
591
646
|
setKeyBinding: (bindingOrBindings) => {
|
|
592
647
|
const bindingsToSet = Array.isArray(bindingOrBindings) ? bindingOrBindings : [bindingOrBindings];
|
|
593
648
|
bindingsToSet.forEach((binding) => {
|
|
594
|
-
const
|
|
649
|
+
const id = bindingIdentity(binding);
|
|
650
|
+
const existingIndex = keyBindings.findIndex(
|
|
651
|
+
(b) => bindingIdentity(b) === id
|
|
652
|
+
);
|
|
595
653
|
if (existingIndex >= 0) {
|
|
596
654
|
const existing = keyBindings[existingIndex];
|
|
597
655
|
if (existing.protected) {
|
|
@@ -615,7 +673,10 @@ async function showScreen(config2) {
|
|
|
615
673
|
});
|
|
616
674
|
},
|
|
617
675
|
updateKeyBinding: (keyName, updates) => {
|
|
618
|
-
const
|
|
676
|
+
const id = updates && (updates.meta != null || updates.ctrl != null || updates.shift != null) ? bindingIdentity({ key: keyName, ...updates }) : null;
|
|
677
|
+
const index = keyBindings.findIndex(
|
|
678
|
+
(b) => id ? bindingIdentity(b) === id : b.key === keyName
|
|
679
|
+
);
|
|
619
680
|
if (index >= 0) {
|
|
620
681
|
keyBindings[index] = {
|
|
621
682
|
...keyBindings[index],
|
|
@@ -623,11 +684,13 @@ async function showScreen(config2) {
|
|
|
623
684
|
};
|
|
624
685
|
}
|
|
625
686
|
},
|
|
626
|
-
removeKeyBinding: (
|
|
627
|
-
const index = keyBindings.findIndex(
|
|
687
|
+
removeKeyBinding: (keyNameOrBinding) => {
|
|
688
|
+
const index = typeof keyNameOrBinding === "object" && keyNameOrBinding ? keyBindings.findIndex(
|
|
689
|
+
(b) => bindingIdentity(b) === bindingIdentity(keyNameOrBinding)
|
|
690
|
+
) : keyBindings.findIndex((b) => b.key === keyNameOrBinding);
|
|
628
691
|
if (index >= 0) {
|
|
629
692
|
if (keyBindings[index].protected) {
|
|
630
|
-
console.warn(`Cannot remove protected key: ${
|
|
693
|
+
console.warn(`Cannot remove protected key: ${keyNameOrBinding}`);
|
|
631
694
|
return;
|
|
632
695
|
}
|
|
633
696
|
keyBindings.splice(index, 1);
|
|
@@ -668,24 +731,11 @@ async function showScreen(config2) {
|
|
|
668
731
|
}
|
|
669
732
|
let matchedBinding = null;
|
|
670
733
|
for (const binding of keyBindings) {
|
|
671
|
-
|
|
672
|
-
if (
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
} else if (key?.name === binding.key) {
|
|
677
|
-
keyMatches = true;
|
|
678
|
-
}
|
|
679
|
-
if (keyMatches) {
|
|
680
|
-
if (binding.enabled === false) {
|
|
681
|
-
continue;
|
|
682
|
-
}
|
|
683
|
-
if (binding.condition && !binding.condition(context)) {
|
|
684
|
-
continue;
|
|
685
|
-
}
|
|
686
|
-
matchedBinding = binding;
|
|
687
|
-
break;
|
|
688
|
-
}
|
|
734
|
+
if (binding.enabled === false) continue;
|
|
735
|
+
if (!bindingMatchesInput(binding, input, key)) continue;
|
|
736
|
+
if (binding.condition && !binding.condition(context)) continue;
|
|
737
|
+
matchedBinding = binding;
|
|
738
|
+
break;
|
|
689
739
|
}
|
|
690
740
|
if (matchedBinding && actions[matchedBinding.action]) {
|
|
691
741
|
actions[matchedBinding.action]({
|
|
@@ -823,6 +873,7 @@ var init_screens = __esm({
|
|
|
823
873
|
import_ink3 = require("ink");
|
|
824
874
|
init_components();
|
|
825
875
|
init_list_components();
|
|
876
|
+
init_key_bindings();
|
|
826
877
|
showMenuScreen = showListScreen;
|
|
827
878
|
showWordGridScreen = showMultiColumnListScreen;
|
|
828
879
|
}
|
|
@@ -913,6 +964,161 @@ var init_ui_elements = __esm({
|
|
|
913
964
|
}
|
|
914
965
|
});
|
|
915
966
|
|
|
967
|
+
// src/screen/scrollable-text.js
|
|
968
|
+
function wrapTextLines(text, cols) {
|
|
969
|
+
const w = Math.max(1, Math.floor(Number(cols) || 1));
|
|
970
|
+
const out = [];
|
|
971
|
+
for (const raw of String(text ?? "").split("\n")) {
|
|
972
|
+
if (raw.length === 0) {
|
|
973
|
+
out.push("");
|
|
974
|
+
continue;
|
|
975
|
+
}
|
|
976
|
+
let rest = raw;
|
|
977
|
+
while (rest.length > w) {
|
|
978
|
+
out.push(rest.slice(0, w));
|
|
979
|
+
rest = rest.slice(w);
|
|
980
|
+
}
|
|
981
|
+
if (rest.length > 0) out.push(rest);
|
|
982
|
+
}
|
|
983
|
+
return out;
|
|
984
|
+
}
|
|
985
|
+
function scrollbarGlyphs(viewportRows, totalLines, scrollTop) {
|
|
986
|
+
const view = Math.max(1, Math.floor(viewportRows));
|
|
987
|
+
const total = Math.max(0, Math.floor(totalLines));
|
|
988
|
+
if (total <= view) return null;
|
|
989
|
+
const maxScroll = total - view;
|
|
990
|
+
const thumbSize = Math.max(1, Math.round(view / total * view));
|
|
991
|
+
const travel = Math.max(0, view - thumbSize);
|
|
992
|
+
const s = Math.min(Math.max(0, Math.floor(scrollTop)), maxScroll);
|
|
993
|
+
const thumbStart = maxScroll === 0 ? 0 : Math.round(s / maxScroll * travel);
|
|
994
|
+
const glyphs = [];
|
|
995
|
+
for (let i = 0; i < view; i++) {
|
|
996
|
+
glyphs.push(i >= thumbStart && i < thumbStart + thumbSize ? BAR_THUMB : BAR_TRACK);
|
|
997
|
+
}
|
|
998
|
+
return glyphs;
|
|
999
|
+
}
|
|
1000
|
+
function padEndVisible(s, w) {
|
|
1001
|
+
const t = String(s ?? "");
|
|
1002
|
+
if (t.length >= w) return t.slice(0, w);
|
|
1003
|
+
return t + " ".repeat(w - t.length);
|
|
1004
|
+
}
|
|
1005
|
+
function ScrollableText({
|
|
1006
|
+
ctx,
|
|
1007
|
+
text = "",
|
|
1008
|
+
lines: linesProp,
|
|
1009
|
+
maxHeight,
|
|
1010
|
+
wrap = true,
|
|
1011
|
+
showScrollbar = true,
|
|
1012
|
+
showStatus = true,
|
|
1013
|
+
bindKeys = true,
|
|
1014
|
+
header = null
|
|
1015
|
+
}) {
|
|
1016
|
+
const [scrollTop, setScrollTop] = (0, import_react5.useState)(0);
|
|
1017
|
+
const [, bump] = (0, import_react5.useState)(0);
|
|
1018
|
+
const termRows = process.stdout.rows || 24;
|
|
1019
|
+
const viewportRows = Math.max(
|
|
1020
|
+
4,
|
|
1021
|
+
maxHeight != null ? Math.floor(maxHeight) : Math.max(8, termRows - 8)
|
|
1022
|
+
);
|
|
1023
|
+
const contentCols = Math.max(20, getScreenWidth() - 4);
|
|
1024
|
+
const barCols = showScrollbar ? 1 : 0;
|
|
1025
|
+
const textWidth = Math.max(8, contentCols - barCols);
|
|
1026
|
+
const allLines = (0, import_react5.useMemo)(() => {
|
|
1027
|
+
if (Array.isArray(linesProp)) return linesProp.map((l) => String(l ?? ""));
|
|
1028
|
+
return wrap ? wrapTextLines(text, textWidth) : String(text ?? "").split("\n");
|
|
1029
|
+
}, [linesProp, text, wrap, textWidth]);
|
|
1030
|
+
const needsBar = showScrollbar && allLines.length > viewportRows;
|
|
1031
|
+
const maxScroll = Math.max(0, allLines.length - viewportRows);
|
|
1032
|
+
const clamped = Math.min(Math.max(0, scrollTop), maxScroll);
|
|
1033
|
+
const visible = allLines.slice(clamped, clamped + viewportRows);
|
|
1034
|
+
const bar = needsBar ? scrollbarGlyphs(viewportRows, allLines.length, clamped) : null;
|
|
1035
|
+
(0, import_react5.useEffect)(() => {
|
|
1036
|
+
setScrollTop((s) => Math.min(s, maxScroll));
|
|
1037
|
+
}, [maxScroll]);
|
|
1038
|
+
const maxScrollRef = (0, import_react5.useRef)(maxScroll);
|
|
1039
|
+
const pageSizeRef = (0, import_react5.useRef)(viewportRows);
|
|
1040
|
+
maxScrollRef.current = maxScroll;
|
|
1041
|
+
pageSizeRef.current = viewportRows;
|
|
1042
|
+
(0, import_react5.useEffect)(() => {
|
|
1043
|
+
if (!ctx || !bindKeys) return void 0;
|
|
1044
|
+
ctx.setKeyBinding(SCROLL_KEYS);
|
|
1045
|
+
ctx.setAction("scrollUp", () => {
|
|
1046
|
+
setScrollTop((s) => Math.max(0, s - 1));
|
|
1047
|
+
bump((n) => n + 1);
|
|
1048
|
+
ctx.update?.();
|
|
1049
|
+
});
|
|
1050
|
+
ctx.setAction("scrollDown", () => {
|
|
1051
|
+
setScrollTop((s) => Math.min(maxScrollRef.current, s + 1));
|
|
1052
|
+
bump((n) => n + 1);
|
|
1053
|
+
ctx.update?.();
|
|
1054
|
+
});
|
|
1055
|
+
ctx.setAction("pageUp", () => {
|
|
1056
|
+
setScrollTop((s) => Math.max(0, s - pageSizeRef.current));
|
|
1057
|
+
bump((n) => n + 1);
|
|
1058
|
+
ctx.update?.();
|
|
1059
|
+
});
|
|
1060
|
+
ctx.setAction("pageDown", () => {
|
|
1061
|
+
setScrollTop((s) => Math.min(maxScrollRef.current, s + pageSizeRef.current));
|
|
1062
|
+
bump((n) => n + 1);
|
|
1063
|
+
ctx.update?.();
|
|
1064
|
+
});
|
|
1065
|
+
return void 0;
|
|
1066
|
+
}, [ctx, bindKeys]);
|
|
1067
|
+
const status = allLines.length === 0 ? "empty" : `lines ${clamped + 1}-${Math.min(clamped + visible.length, allLines.length)} of ${allLines.length}` + (needsBar ? " \xB7 \u2325\u2191/\u2193 or PgUp/Dn page" : "");
|
|
1068
|
+
const rowNodes = visible.map((line, i) => {
|
|
1069
|
+
const body = padEndVisible(line, textWidth);
|
|
1070
|
+
const glyph = bar ? bar[i] ?? BAR_TRACK : showScrollbar ? " " : "";
|
|
1071
|
+
const isThumb = glyph === BAR_THUMB;
|
|
1072
|
+
return h5(
|
|
1073
|
+
import_ink5.Text,
|
|
1074
|
+
{ key: `L${clamped + i}` },
|
|
1075
|
+
body,
|
|
1076
|
+
glyph ? h5(import_ink5.Text, { color: isThumb ? "cyan" : "gray" }, glyph) : null
|
|
1077
|
+
);
|
|
1078
|
+
});
|
|
1079
|
+
if (bar && visible.length < viewportRows) {
|
|
1080
|
+
for (let i = visible.length; i < viewportRows; i++) {
|
|
1081
|
+
const glyph = bar[i] ?? BAR_TRACK;
|
|
1082
|
+
rowNodes.push(
|
|
1083
|
+
h5(
|
|
1084
|
+
import_ink5.Text,
|
|
1085
|
+
{ key: `pad${i}` },
|
|
1086
|
+
padEndVisible("", textWidth),
|
|
1087
|
+
h5(import_ink5.Text, { color: glyph === BAR_THUMB ? "cyan" : "gray" }, glyph)
|
|
1088
|
+
)
|
|
1089
|
+
);
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
return h5(
|
|
1093
|
+
import_ink5.Box,
|
|
1094
|
+
{ flexDirection: "column" },
|
|
1095
|
+
header == null ? null : typeof header === "string" ? h5(import_ink5.Text, { color: "gray" }, header) : header,
|
|
1096
|
+
showStatus ? h5(import_ink5.Text, { color: "gray" }, status) : null,
|
|
1097
|
+
...rowNodes
|
|
1098
|
+
);
|
|
1099
|
+
}
|
|
1100
|
+
var import_react5, import_ink5, h5, BAR_THUMB, BAR_TRACK, SCROLL_KEYS;
|
|
1101
|
+
var init_scrollable_text = __esm({
|
|
1102
|
+
"src/screen/scrollable-text.js"() {
|
|
1103
|
+
import_react5 = require("react");
|
|
1104
|
+
import_ink5 = require("ink");
|
|
1105
|
+
init_components();
|
|
1106
|
+
h5 = import_react5.createElement;
|
|
1107
|
+
BAR_THUMB = "#";
|
|
1108
|
+
BAR_TRACK = "|";
|
|
1109
|
+
SCROLL_KEYS = [
|
|
1110
|
+
{ key: "upArrow", caption: "scroll", action: "scrollUp", order: 0 },
|
|
1111
|
+
{ key: "downArrow", caption: "scroll", action: "scrollDown", order: 0 },
|
|
1112
|
+
{ key: "upArrow", meta: true, caption: "page", action: "pageUp", order: 0 },
|
|
1113
|
+
{ key: "downArrow", meta: true, caption: "page", action: "pageDown", order: 0 },
|
|
1114
|
+
{ key: "upArrow", ctrl: true, caption: "page", action: "pageUp", order: 0 },
|
|
1115
|
+
{ key: "downArrow", ctrl: true, caption: "page", action: "pageDown", order: 0 },
|
|
1116
|
+
{ key: "pageUp", caption: "page", action: "pageUp", order: 0 },
|
|
1117
|
+
{ key: "pageDown", caption: "page", action: "pageDown", order: 0 }
|
|
1118
|
+
];
|
|
1119
|
+
}
|
|
1120
|
+
});
|
|
1121
|
+
|
|
916
1122
|
// src/screen/utils.js
|
|
917
1123
|
function buildBreadcrumb(parts) {
|
|
918
1124
|
if (parts.length === 0) return "";
|
|
@@ -1044,7 +1250,7 @@ var init_footer_builder = __esm({
|
|
|
1044
1250
|
// src/screen/index.js
|
|
1045
1251
|
var screen_exports = {};
|
|
1046
1252
|
__export(screen_exports, {
|
|
1047
|
-
Box: () =>
|
|
1253
|
+
Box: () => import_ink6.Box,
|
|
1048
1254
|
Divider: () => Divider,
|
|
1049
1255
|
FooterPresets: () => FooterPresets,
|
|
1050
1256
|
GridCell: () => GridCell,
|
|
@@ -1053,35 +1259,41 @@ __export(screen_exports, {
|
|
|
1053
1259
|
ListItem: () => ListItem,
|
|
1054
1260
|
MultiColumnListComponent: () => MultiColumnListComponent,
|
|
1055
1261
|
MultiColumnListWithPreviewComponent: () => MultiColumnListWithPreviewComponent,
|
|
1056
|
-
React: () =>
|
|
1262
|
+
React: () => import_react6.default,
|
|
1057
1263
|
ScreenBody: () => ScreenBody,
|
|
1058
1264
|
ScreenContainer: () => ScreenContainer,
|
|
1059
1265
|
ScreenDivider: () => ScreenDivider,
|
|
1060
1266
|
ScreenFooter: () => ScreenFooter,
|
|
1061
1267
|
ScreenRow: () => ScreenRow,
|
|
1062
1268
|
ScreenTitle: () => ScreenTitle,
|
|
1063
|
-
|
|
1269
|
+
ScrollableText: () => ScrollableText,
|
|
1270
|
+
Text: () => import_ink6.Text,
|
|
1064
1271
|
TextBlock: () => TextBlock,
|
|
1272
|
+
bindingIdentity: () => bindingIdentity,
|
|
1273
|
+
bindingMatchesInput: () => bindingMatchesInput,
|
|
1065
1274
|
buildBreadcrumb: () => buildBreadcrumb,
|
|
1066
1275
|
buildDetailBreadcrumb: () => buildDetailBreadcrumb,
|
|
1067
1276
|
buildFooter: () => buildFooter,
|
|
1068
|
-
|
|
1277
|
+
formatBindingKey: () => formatBindingKey,
|
|
1278
|
+
h: () => import_react6.createElement,
|
|
1069
1279
|
load: () => load,
|
|
1070
|
-
memo: () =>
|
|
1280
|
+
memo: () => import_react6.memo,
|
|
1071
1281
|
organizeFooterMessages: () => organizeFooterMessages,
|
|
1282
|
+
scrollbarGlyphs: () => scrollbarGlyphs,
|
|
1072
1283
|
showListScreen: () => showListScreen,
|
|
1073
1284
|
showMenuScreen: () => showMenuScreen,
|
|
1074
1285
|
showMultiColumnListScreen: () => showMultiColumnListScreen,
|
|
1075
1286
|
showMultiColumnListWithPreviewScreen: () => showMultiColumnListWithPreviewScreen,
|
|
1076
1287
|
showScreen: () => showScreen,
|
|
1077
1288
|
showWordGridScreen: () => showWordGridScreen,
|
|
1078
|
-
useCallback: () =>
|
|
1079
|
-
useEffect: () =>
|
|
1080
|
-
useInput: () =>
|
|
1081
|
-
useLayoutEffect: () =>
|
|
1082
|
-
useMemo: () =>
|
|
1083
|
-
useRef: () =>
|
|
1084
|
-
useState: () =>
|
|
1289
|
+
useCallback: () => import_react6.useCallback,
|
|
1290
|
+
useEffect: () => import_react6.useEffect,
|
|
1291
|
+
useInput: () => import_ink6.useInput,
|
|
1292
|
+
useLayoutEffect: () => import_react6.useLayoutEffect,
|
|
1293
|
+
useMemo: () => import_react6.useMemo,
|
|
1294
|
+
useRef: () => import_react6.useRef,
|
|
1295
|
+
useState: () => import_react6.useState,
|
|
1296
|
+
wrapTextLines: () => wrapTextLines
|
|
1085
1297
|
});
|
|
1086
1298
|
async function load() {
|
|
1087
1299
|
if (loadPromise) return loadPromise;
|
|
@@ -1092,15 +1304,17 @@ async function load() {
|
|
|
1092
1304
|
});
|
|
1093
1305
|
return loadPromise;
|
|
1094
1306
|
}
|
|
1095
|
-
var
|
|
1307
|
+
var import_react6, import_ink6, loadPromise;
|
|
1096
1308
|
var init_screen = __esm({
|
|
1097
1309
|
"src/screen/index.js"() {
|
|
1098
|
-
|
|
1099
|
-
|
|
1310
|
+
import_react6 = __toESM(require("react"), 1);
|
|
1311
|
+
import_ink6 = require("ink");
|
|
1100
1312
|
init_screens();
|
|
1101
1313
|
init_list_components();
|
|
1102
1314
|
init_components();
|
|
1103
1315
|
init_ui_elements();
|
|
1316
|
+
init_scrollable_text();
|
|
1317
|
+
init_key_bindings();
|
|
1104
1318
|
init_utils();
|
|
1105
1319
|
init_footer_builder();
|
|
1106
1320
|
loadPromise = null;
|