mepcli 1.3.2 → 2.0.0-beta.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.
Files changed (291) hide show
  1. package/README.md +11 -2
  2. package/dist/{ansi.js → src/ansi.js} +17 -9
  3. package/dist/src/ansi.js.map +1 -0
  4. package/dist/{base.js → src/base.js} +82 -70
  5. package/dist/src/base.js.map +1 -0
  6. package/dist/{core.js → src/core.js} +266 -320
  7. package/dist/src/core.js.map +1 -0
  8. package/dist/src/data/countries.js +569 -0
  9. package/dist/src/data/countries.js.map +1 -0
  10. package/dist/src/data/licenses.js +480 -0
  11. package/dist/src/data/licenses.js.map +1 -0
  12. package/dist/{highlight.js → src/highlight.js} +77 -69
  13. package/dist/src/highlight.js.map +1 -0
  14. package/dist/src/index.js +66 -0
  15. package/dist/src/index.js.map +1 -0
  16. package/dist/{input.js → src/input.js} +47 -41
  17. package/dist/src/input.js.map +1 -0
  18. package/dist/src/pipeline.js +273 -0
  19. package/dist/src/pipeline.js.map +1 -0
  20. package/dist/{prompts → src/prompts}/autocomplete.js +58 -57
  21. package/dist/src/prompts/autocomplete.js.map +1 -0
  22. package/dist/{prompts → src/prompts}/box.js +86 -53
  23. package/dist/src/prompts/box.js.map +1 -0
  24. package/dist/{prompts → src/prompts}/breadcrumb-search.js +110 -98
  25. package/dist/src/prompts/breadcrumb-search.js.map +1 -0
  26. package/dist/{prompts → src/prompts}/breadcrumb.js +126 -121
  27. package/dist/src/prompts/breadcrumb.js.map +1 -0
  28. package/dist/{prompts → src/prompts}/byte.js +69 -52
  29. package/dist/src/prompts/byte.js.map +1 -0
  30. package/dist/{prompts → src/prompts}/calculator.js +79 -56
  31. package/dist/src/prompts/calculator.js.map +1 -0
  32. package/dist/{prompts → src/prompts}/calendar.js +167 -127
  33. package/dist/src/prompts/calendar.js.map +1 -0
  34. package/dist/{prompts → src/prompts}/checkbox.js +53 -49
  35. package/dist/src/prompts/checkbox.js.map +1 -0
  36. package/dist/{prompts → src/prompts}/code.js +88 -76
  37. package/dist/src/prompts/code.js.map +1 -0
  38. package/dist/{prompts → src/prompts}/color.js +68 -50
  39. package/dist/src/prompts/color.js.map +1 -0
  40. package/dist/{prompts → src/prompts}/confirm.js +22 -15
  41. package/dist/src/prompts/confirm.js.map +1 -0
  42. package/dist/{prompts → src/prompts}/connection-string.js +59 -36
  43. package/dist/src/prompts/connection-string.js.map +1 -0
  44. package/dist/{prompts → src/prompts}/cron.js +90 -59
  45. package/dist/src/prompts/cron.js.map +1 -0
  46. package/dist/src/prompts/curl-utils.js +71 -0
  47. package/dist/src/prompts/curl-utils.js.map +1 -0
  48. package/dist/{prompts → src/prompts}/curl.js +153 -132
  49. package/dist/src/prompts/curl.js.map +1 -0
  50. package/dist/{prompts → src/prompts}/data-inspector.js +96 -91
  51. package/dist/src/prompts/data-inspector.js.map +1 -0
  52. package/dist/{prompts → src/prompts}/date.js +64 -57
  53. package/dist/src/prompts/date.js.map +1 -0
  54. package/dist/{prompts → src/prompts}/dependency.js +84 -80
  55. package/dist/src/prompts/dependency.js.map +1 -0
  56. package/dist/{prompts → src/prompts}/dial.js +49 -35
  57. package/dist/src/prompts/dial.js.map +1 -0
  58. package/dist/src/prompts/diff.js +118 -0
  59. package/dist/src/prompts/diff.js.map +1 -0
  60. package/dist/{prompts → src/prompts}/draw.js +83 -80
  61. package/dist/src/prompts/draw.js.map +1 -0
  62. package/dist/src/prompts/editor.js +234 -0
  63. package/dist/src/prompts/editor.js.map +1 -0
  64. package/dist/{prompts → src/prompts}/emoji.js +80 -82
  65. package/dist/src/prompts/emoji.js.map +1 -0
  66. package/dist/{prompts → src/prompts}/exec.js +60 -46
  67. package/dist/src/prompts/exec.js.map +1 -0
  68. package/dist/src/prompts/file.js +217 -0
  69. package/dist/src/prompts/file.js.map +1 -0
  70. package/dist/{prompts → src/prompts}/form.js +63 -54
  71. package/dist/src/prompts/form.js.map +1 -0
  72. package/dist/{prompts → src/prompts}/fuzzy-multi-column.js +65 -53
  73. package/dist/src/prompts/fuzzy-multi-column.js.map +1 -0
  74. package/dist/{prompts → src/prompts}/fuzzy.js +66 -55
  75. package/dist/src/prompts/fuzzy.js.map +1 -0
  76. package/dist/src/prompts/gauge.js +137 -0
  77. package/dist/src/prompts/gauge.js.map +1 -0
  78. package/dist/{prompts → src/prompts}/grid.js +70 -57
  79. package/dist/src/prompts/grid.js.map +1 -0
  80. package/dist/{prompts → src/prompts}/heatmap.js +70 -64
  81. package/dist/src/prompts/heatmap.js.map +1 -0
  82. package/dist/{prompts → src/prompts}/ip.js +56 -36
  83. package/dist/src/prompts/ip.js.map +1 -0
  84. package/dist/{prompts → src/prompts}/kanban.js +63 -58
  85. package/dist/src/prompts/kanban.js.map +1 -0
  86. package/dist/src/prompts/keypress.js +54 -0
  87. package/dist/src/prompts/keypress.js.map +1 -0
  88. package/dist/src/prompts/license.js +144 -0
  89. package/dist/src/prompts/license.js.map +1 -0
  90. package/dist/{prompts → src/prompts}/list.js +46 -31
  91. package/dist/src/prompts/list.js.map +1 -0
  92. package/dist/{prompts → src/prompts}/map.js +93 -77
  93. package/dist/src/prompts/map.js.map +1 -0
  94. package/dist/{prompts → src/prompts}/match.js +91 -95
  95. package/dist/src/prompts/match.js.map +1 -0
  96. package/dist/{prompts → src/prompts}/miller.js +74 -67
  97. package/dist/src/prompts/miller.js.map +1 -0
  98. package/dist/{prompts → src/prompts}/multi-column-select.js +54 -44
  99. package/dist/src/prompts/multi-column-select.js.map +1 -0
  100. package/dist/{prompts → src/prompts}/multi-range.js +70 -52
  101. package/dist/src/prompts/multi-range.js.map +1 -0
  102. package/dist/{prompts → src/prompts}/multi-select.js +67 -58
  103. package/dist/src/prompts/multi-select.js.map +1 -0
  104. package/dist/{prompts → src/prompts}/number.js +51 -39
  105. package/dist/src/prompts/number.js.map +1 -0
  106. package/dist/{prompts → src/prompts}/otp.js +43 -27
  107. package/dist/src/prompts/otp.js.map +1 -0
  108. package/dist/{prompts → src/prompts}/pattern.js +74 -71
  109. package/dist/src/prompts/pattern.js.map +1 -0
  110. package/dist/{prompts → src/prompts}/phone.js +107 -118
  111. package/dist/src/prompts/phone.js.map +1 -0
  112. package/dist/src/prompts/quiz-select.js +114 -0
  113. package/dist/src/prompts/quiz-select.js.map +1 -0
  114. package/dist/src/prompts/quiz-text.js +98 -0
  115. package/dist/src/prompts/quiz-text.js.map +1 -0
  116. package/dist/{prompts → src/prompts}/range.js +85 -61
  117. package/dist/src/prompts/range.js.map +1 -0
  118. package/dist/{prompts → src/prompts}/rating.js +29 -24
  119. package/dist/src/prompts/rating.js.map +1 -0
  120. package/dist/{prompts → src/prompts}/regex.js +50 -36
  121. package/dist/src/prompts/regex.js.map +1 -0
  122. package/dist/{prompts → src/prompts}/region.js +62 -56
  123. package/dist/src/prompts/region.js.map +1 -0
  124. package/dist/{prompts → src/prompts}/schedule.js +82 -75
  125. package/dist/src/prompts/schedule.js.map +1 -0
  126. package/dist/{prompts → src/prompts}/scroll.js +61 -58
  127. package/dist/src/prompts/scroll.js.map +1 -0
  128. package/dist/src/prompts/seat.js +164 -0
  129. package/dist/src/prompts/seat.js.map +1 -0
  130. package/dist/{prompts → src/prompts}/select-range.js +58 -46
  131. package/dist/src/prompts/select-range.js.map +1 -0
  132. package/dist/{prompts → src/prompts}/select.js +65 -66
  133. package/dist/src/prompts/select.js.map +1 -0
  134. package/dist/{prompts → src/prompts}/semver.js +24 -13
  135. package/dist/src/prompts/semver.js.map +1 -0
  136. package/dist/src/prompts/shortcut.js +133 -0
  137. package/dist/src/prompts/shortcut.js.map +1 -0
  138. package/dist/{prompts → src/prompts}/slider.js +28 -23
  139. package/dist/src/prompts/slider.js.map +1 -0
  140. package/dist/src/prompts/slot.js +117 -0
  141. package/dist/src/prompts/slot.js.map +1 -0
  142. package/dist/{prompts → src/prompts}/snippet.js +82 -61
  143. package/dist/src/prompts/snippet.js.map +1 -0
  144. package/dist/{prompts → src/prompts}/sort-grid.js +64 -59
  145. package/dist/src/prompts/sort-grid.js.map +1 -0
  146. package/dist/{prompts → src/prompts}/sort.js +59 -49
  147. package/dist/src/prompts/sort.js.map +1 -0
  148. package/dist/src/prompts/spam.js +80 -0
  149. package/dist/src/prompts/spam.js.map +1 -0
  150. package/dist/{prompts → src/prompts}/spreadsheet.js +71 -70
  151. package/dist/src/prompts/spreadsheet.js.map +1 -0
  152. package/dist/{prompts → src/prompts}/table.js +52 -38
  153. package/dist/src/prompts/table.js.map +1 -0
  154. package/dist/{prompts → src/prompts}/text.js +74 -70
  155. package/dist/src/prompts/text.js.map +1 -0
  156. package/dist/{prompts → src/prompts}/time.js +105 -96
  157. package/dist/src/prompts/time.js.map +1 -0
  158. package/dist/src/prompts/toggle.js +53 -0
  159. package/dist/src/prompts/toggle.js.map +1 -0
  160. package/dist/{prompts → src/prompts}/transfer.js +71 -67
  161. package/dist/src/prompts/transfer.js.map +1 -0
  162. package/dist/{prompts → src/prompts}/tree-select.js +83 -86
  163. package/dist/src/prompts/tree-select.js.map +1 -0
  164. package/dist/{prompts → src/prompts}/tree.js +69 -67
  165. package/dist/src/prompts/tree.js.map +1 -0
  166. package/dist/src/prompts/wait.js +79 -0
  167. package/dist/src/prompts/wait.js.map +1 -0
  168. package/dist/src/spinner.js +105 -0
  169. package/dist/src/spinner.js.map +1 -0
  170. package/dist/{symbols.js → src/symbols.js} +32 -7
  171. package/dist/src/symbols.js.map +1 -0
  172. package/dist/{tasks.js → src/tasks.js} +104 -79
  173. package/dist/src/tasks.js.map +1 -0
  174. package/dist/src/theme.js +29 -0
  175. package/dist/src/theme.js.map +1 -0
  176. package/dist/src/types.js +8 -0
  177. package/dist/src/types.js.map +1 -0
  178. package/dist/{utils.js → src/utils.js} +196 -152
  179. package/dist/src/utils.js.map +1 -0
  180. package/package.json +16 -13
  181. package/dist/ansi.d.ts +0 -36
  182. package/dist/base.d.ts +0 -60
  183. package/dist/core.d.ts +0 -1072
  184. package/dist/data/countries.d.ts +0 -2
  185. package/dist/data/countries.js +0 -105
  186. package/dist/data/licenses.d.ts +0 -2
  187. package/dist/data/licenses.js +0 -109
  188. package/dist/highlight.d.ts +0 -7
  189. package/dist/index.d.ts +0 -48
  190. package/dist/index.js +0 -64
  191. package/dist/input.d.ts +0 -14
  192. package/dist/pipeline.d.ts +0 -39
  193. package/dist/pipeline.js +0 -54
  194. package/dist/prompts/autocomplete.d.ts +0 -22
  195. package/dist/prompts/box.d.ts +0 -21
  196. package/dist/prompts/breadcrumb-search.d.ts +0 -14
  197. package/dist/prompts/breadcrumb.d.ts +0 -32
  198. package/dist/prompts/byte.d.ts +0 -13
  199. package/dist/prompts/calculator.d.ts +0 -17
  200. package/dist/prompts/calendar.d.ts +0 -33
  201. package/dist/prompts/checkbox.d.ts +0 -13
  202. package/dist/prompts/code.d.ts +0 -19
  203. package/dist/prompts/color.d.ts +0 -14
  204. package/dist/prompts/confirm.d.ts +0 -8
  205. package/dist/prompts/connection-string.d.ts +0 -18
  206. package/dist/prompts/cron.d.ts +0 -13
  207. package/dist/prompts/curl-utils.d.ts +0 -25
  208. package/dist/prompts/curl-utils.js +0 -41
  209. package/dist/prompts/curl.d.ts +0 -41
  210. package/dist/prompts/data-inspector.d.ts +0 -22
  211. package/dist/prompts/date.d.ts +0 -12
  212. package/dist/prompts/dependency.d.ts +0 -16
  213. package/dist/prompts/dial.d.ts +0 -10
  214. package/dist/prompts/diff.d.ts +0 -10
  215. package/dist/prompts/diff.js +0 -101
  216. package/dist/prompts/draw.d.ts +0 -20
  217. package/dist/prompts/editor.d.ts +0 -14
  218. package/dist/prompts/editor.js +0 -203
  219. package/dist/prompts/emoji.d.ts +0 -18
  220. package/dist/prompts/exec.d.ts +0 -17
  221. package/dist/prompts/file.d.ts +0 -21
  222. package/dist/prompts/file.js +0 -210
  223. package/dist/prompts/form.d.ts +0 -18
  224. package/dist/prompts/fuzzy-multi-column.d.ts +0 -12
  225. package/dist/prompts/fuzzy.d.ts +0 -12
  226. package/dist/prompts/gauge.d.ts +0 -21
  227. package/dist/prompts/gauge.js +0 -130
  228. package/dist/prompts/grid.d.ts +0 -14
  229. package/dist/prompts/heatmap.d.ts +0 -13
  230. package/dist/prompts/ip.d.ts +0 -11
  231. package/dist/prompts/kanban.d.ts +0 -17
  232. package/dist/prompts/keypress.d.ts +0 -7
  233. package/dist/prompts/keypress.js +0 -55
  234. package/dist/prompts/license.d.ts +0 -9
  235. package/dist/prompts/license.js +0 -105
  236. package/dist/prompts/list.d.ts +0 -9
  237. package/dist/prompts/map.d.ts +0 -17
  238. package/dist/prompts/match.d.ts +0 -19
  239. package/dist/prompts/miller.d.ts +0 -15
  240. package/dist/prompts/multi-column-select.d.ts +0 -10
  241. package/dist/prompts/multi-range.d.ts +0 -9
  242. package/dist/prompts/multi-select.d.ts +0 -15
  243. package/dist/prompts/number.d.ts +0 -11
  244. package/dist/prompts/otp.d.ts +0 -10
  245. package/dist/prompts/pattern.d.ts +0 -22
  246. package/dist/prompts/phone.d.ts +0 -41
  247. package/dist/prompts/quiz-select.d.ts +0 -10
  248. package/dist/prompts/quiz-select.js +0 -104
  249. package/dist/prompts/quiz-text.d.ts +0 -11
  250. package/dist/prompts/quiz-text.js +0 -82
  251. package/dist/prompts/range.d.ts +0 -9
  252. package/dist/prompts/rating.d.ts +0 -8
  253. package/dist/prompts/regex.d.ts +0 -13
  254. package/dist/prompts/region.d.ts +0 -11
  255. package/dist/prompts/schedule.d.ts +0 -20
  256. package/dist/prompts/scroll.d.ts +0 -13
  257. package/dist/prompts/seat.d.ts +0 -17
  258. package/dist/prompts/seat.js +0 -165
  259. package/dist/prompts/select-range.d.ts +0 -8
  260. package/dist/prompts/select.d.ts +0 -15
  261. package/dist/prompts/semver.d.ts +0 -6
  262. package/dist/prompts/shortcut.d.ts +0 -9
  263. package/dist/prompts/shortcut.js +0 -135
  264. package/dist/prompts/slider.d.ts +0 -8
  265. package/dist/prompts/slot.d.ts +0 -16
  266. package/dist/prompts/slot.js +0 -107
  267. package/dist/prompts/snippet.d.ts +0 -19
  268. package/dist/prompts/sort-grid.d.ts +0 -16
  269. package/dist/prompts/sort.d.ts +0 -14
  270. package/dist/prompts/spam.d.ts +0 -17
  271. package/dist/prompts/spam.js +0 -62
  272. package/dist/prompts/spreadsheet.d.ts +0 -21
  273. package/dist/prompts/table.d.ts +0 -14
  274. package/dist/prompts/text.d.ts +0 -17
  275. package/dist/prompts/time.d.ts +0 -12
  276. package/dist/prompts/toggle.d.ts +0 -8
  277. package/dist/prompts/toggle.js +0 -47
  278. package/dist/prompts/transfer.d.ts +0 -18
  279. package/dist/prompts/tree-select.d.ts +0 -31
  280. package/dist/prompts/tree.d.ts +0 -20
  281. package/dist/prompts/wait.d.ts +0 -18
  282. package/dist/prompts/wait.js +0 -62
  283. package/dist/spinner.d.ts +0 -33
  284. package/dist/spinner.js +0 -89
  285. package/dist/symbols.d.ts +0 -33
  286. package/dist/tasks.d.ts +0 -57
  287. package/dist/theme.d.ts +0 -2
  288. package/dist/theme.js +0 -20
  289. package/dist/types.d.ts +0 -503
  290. package/dist/types.js +0 -5
  291. package/dist/utils.d.ts +0 -81
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "SlotPrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return SlotPrompt;
9
+ }
10
+ });
11
+ const _ansi = require("../ansi");
12
+ const _base = require("../base");
13
+ const _theme = require("../theme");
14
+ const _symbols = require("../symbols");
15
+ const _utils = require("../utils");
16
+ function _define_property(obj, key, value) {
17
+ if (key in obj) {
18
+ Object.defineProperty(obj, key, {
19
+ value: value,
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true
23
+ });
24
+ } else {
25
+ obj[key] = value;
26
+ }
27
+ return obj;
28
+ }
29
+ let SlotPrompt = class SlotPrompt extends _base.Prompt {
30
+ spin() {
31
+ if (!this.isSpinning) return;
32
+ this.selectedIndex = (this.selectedIndex + 1) % this.options.choices.length;
33
+ this.render(false);
34
+ if (this.isStopping) {
35
+ // Deceleration physics
36
+ this.spinSpeed = Math.floor(this.spinSpeed * 1.1);
37
+ if (this.spinSpeed > 400) {
38
+ this.isSpinning = false;
39
+ this.finish();
40
+ return;
41
+ }
42
+ }
43
+ this.spinTimer = setTimeout(()=>this.spin(), this.spinSpeed);
44
+ }
45
+ finish() {
46
+ if (this.spinTimer) clearTimeout(this.spinTimer);
47
+ this.submit(this.options.choices[this.selectedIndex]);
48
+ }
49
+ handleInput(char, _key) {
50
+ if (char === ' ' || char === '\r' || char === '\n') {
51
+ if (!this.isSpinning) {
52
+ // Start spinning
53
+ this.isSpinning = true;
54
+ this.isStopping = false;
55
+ this.spinSpeed = 50; // Reset speed
56
+ this.spin();
57
+ } else if (!this.isStopping) {
58
+ // Initiate stop sequence
59
+ this.isStopping = true;
60
+ }
61
+ }
62
+ }
63
+ render(_firstRender) {
64
+ let output = '';
65
+ // Header
66
+ output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
67
+ // Calculate dynamic width
68
+ const maxLen = Math.max(...this.options.choices.map((c)=>(0, _utils.stringWidth)(c)));
69
+ const boxWidth = Math.max(20, maxLen + 6);
70
+ const border = _symbols.symbols.line.repeat(boxWidth - 2);
71
+ output += `┌${border}┐\n`;
72
+ const centerRow = Math.floor(this.rows / 2);
73
+ for(let i = 0; i < this.rows; i++){
74
+ const offset = i - centerRow;
75
+ let index = (this.selectedIndex + offset) % this.options.choices.length;
76
+ if (index < 0) index += this.options.choices.length;
77
+ const item = this.options.choices[index];
78
+ const content = this.truncate(item, boxWidth - 4);
79
+ const contentWidth = (0, _utils.stringWidth)(content);
80
+ const padding = boxWidth - 4 - contentWidth;
81
+ const leftPad = ' '.repeat(Math.floor(padding / 2));
82
+ const rightPad = ' '.repeat(Math.ceil(padding / 2));
83
+ const lineContent = `${leftPad}${content}${rightPad}`;
84
+ if (i === centerRow) {
85
+ // Highlight
86
+ output += `│ ${_theme.theme.main}${_ansi.ANSI.REVERSE} ${lineContent} ${_ansi.ANSI.RESET} │ ${_theme.theme.main}◄${_ansi.ANSI.RESET}\n`;
87
+ } else {
88
+ output += `│ ${lineContent} │\n`;
89
+ }
90
+ }
91
+ output += `└${border}┘`;
92
+ // Instructions
93
+ if (!this.isSpinning) {
94
+ output += `\n${_theme.theme.muted}(Press Space/Enter to Spin)${_ansi.ANSI.RESET}`;
95
+ } else if (this.isStopping) {
96
+ output += `\n${_theme.theme.muted}(Stopping...)${_ansi.ANSI.RESET}`;
97
+ } else {
98
+ output += `\n${_theme.theme.muted}(Press Space/Enter to Stop)${_ansi.ANSI.RESET}`;
99
+ }
100
+ this.renderFrame(output);
101
+ }
102
+ // Override cleanup to ensure timer is cleared if user Ctrl+C
103
+ cleanup() {
104
+ if (this.spinTimer) clearTimeout(this.spinTimer);
105
+ super.cleanup();
106
+ }
107
+ constructor(options){
108
+ super(options), _define_property(this, "selectedIndex", void 0), _define_property(this, "isSpinning", false), _define_property(this, "isStopping", false), _define_property(this, "spinSpeed", 50) // Initial speed (ms)
109
+ , _define_property(this, "spinTimer", void 0), _define_property(this, "rows", void 0);
110
+ this.rows = options.rows || 3;
111
+ // Ensure rows is odd to have a center
112
+ if (this.rows % 2 === 0) this.rows++;
113
+ this.selectedIndex = options.initial || 0;
114
+ }
115
+ };
116
+
117
+ //# sourceMappingURL=slot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/slot.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { SlotOptions } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class SlotPrompt extends Prompt<string, SlotOptions> {\n private selectedIndex: number;\n private isSpinning: boolean = false;\n private isStopping: boolean = false;\n private spinSpeed: number = 50; // Initial speed (ms)\n private spinTimer?: NodeJS.Timeout;\n private rows: number;\n\n constructor(options: SlotOptions) {\n super(options);\n this.rows = options.rows || 3;\n // Ensure rows is odd to have a center\n if (this.rows % 2 === 0) this.rows++;\n this.selectedIndex = options.initial || 0;\n }\n\n private spin() {\n if (!this.isSpinning) return;\n\n this.selectedIndex = (this.selectedIndex + 1) % this.options.choices.length;\n this.render(false);\n\n if (this.isStopping) {\n // Deceleration physics\n this.spinSpeed = Math.floor(this.spinSpeed * 1.1);\n if (this.spinSpeed > 400) {\n this.isSpinning = false;\n this.finish();\n return;\n }\n }\n\n this.spinTimer = setTimeout(() => this.spin(), this.spinSpeed);\n }\n\n private finish() {\n if (this.spinTimer) clearTimeout(this.spinTimer);\n this.submit(this.options.choices[this.selectedIndex]);\n }\n\n protected handleInput(char: string, _key: Buffer) {\n if (char === ' ' || char === '\\r' || char === '\\n') {\n if (!this.isSpinning) {\n // Start spinning\n this.isSpinning = true;\n this.isStopping = false;\n this.spinSpeed = 50; // Reset speed\n this.spin();\n } else if (!this.isStopping) {\n // Initiate stop sequence\n this.isStopping = true;\n }\n }\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n\n // Header\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n // Calculate dynamic width\n const maxLen = Math.max(...this.options.choices.map(c => stringWidth(c)));\n const boxWidth = Math.max(20, maxLen + 6);\n\n const border = symbols.line.repeat(boxWidth - 2);\n output += `┌${border}┐\\n`;\n\n const centerRow = Math.floor(this.rows / 2);\n\n for (let i = 0; i < this.rows; i++) {\n const offset = i - centerRow;\n let index = (this.selectedIndex + offset) % this.options.choices.length;\n if (index < 0) index += this.options.choices.length;\n\n const item = this.options.choices[index];\n const content = this.truncate(item, boxWidth - 4);\n const contentWidth = stringWidth(content);\n const padding = boxWidth - 4 - contentWidth;\n const leftPad = ' '.repeat(Math.floor(padding / 2));\n const rightPad = ' '.repeat(Math.ceil(padding / 2));\n\n const lineContent = `${leftPad}${content}${rightPad}`;\n\n if (i === centerRow) {\n // Highlight\n output += `│ ${theme.main}${ANSI.REVERSE} ${lineContent} ${ANSI.RESET} │ ${theme.main}◄${ANSI.RESET}\\n`;\n } else {\n output += `│ ${lineContent} │\\n`;\n }\n }\n\n output += `└${border}┘`;\n\n // Instructions\n if (!this.isSpinning) {\n output += `\\n${theme.muted}(Press Space/Enter to Spin)${ANSI.RESET}`;\n } else if (this.isStopping) {\n output += `\\n${theme.muted}(Stopping...)${ANSI.RESET}`;\n } else {\n output += `\\n${theme.muted}(Press Space/Enter to Stop)${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n // Override cleanup to ensure timer is cleared if user Ctrl+C\n protected cleanup() {\n if (this.spinTimer) clearTimeout(this.spinTimer);\n super.cleanup();\n }\n}\n"],"names":["SlotPrompt","Prompt","spin","isSpinning","selectedIndex","options","choices","length","render","isStopping","spinSpeed","Math","floor","finish","spinTimer","setTimeout","clearTimeout","submit","handleInput","char","_key","_firstRender","output","theme","success","ANSI","RESET","BOLD","title","message","maxLen","max","map","c","stringWidth","boxWidth","border","symbols","line","repeat","centerRow","rows","i","offset","index","item","content","truncate","contentWidth","padding","leftPad","rightPad","ceil","lineContent","main","REVERSE","muted","renderFrame","cleanup","initial"],"mappings":"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"}
@@ -1,50 +1,53 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SnippetPrompt = void 0;
4
- const ansi_1 = require("../ansi");
5
- const base_1 = require("../base");
6
- const theme_1 = require("../theme");
7
- class SnippetPrompt extends base_1.Prompt {
8
- constructor(options) {
9
- super(options);
10
- this.tokens = [];
11
- this.variableTokens = []; // Indices in this.tokens
12
- this.values = {};
13
- this.activeVarIndex = 0; // Index in variableTokens
14
- this.cursor = 0; // Cursor in active variable value
15
- this.errorMsg = '';
16
- this.lastLinesUp = 0;
17
- this.parseTemplate();
18
- // Initialize values
19
- if (options.values) {
20
- this.values = { ...options.values };
21
- }
22
- // Ensure all vars have entries
23
- this.variableTokens.forEach(idx => {
24
- const varName = this.tokens[idx].value;
25
- if (this.values[varName] === undefined) {
26
- this.values[varName] = '';
27
- }
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "SnippetPrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return SnippetPrompt;
9
+ }
10
+ });
11
+ const _ansi = require("../ansi");
12
+ const _base = require("../base");
13
+ const _theme = require("../theme");
14
+ function _define_property(obj, key, value) {
15
+ if (key in obj) {
16
+ Object.defineProperty(obj, key, {
17
+ value: value,
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true
28
21
  });
29
- if (this.variableTokens.length > 0) {
30
- const firstVar = this.tokens[this.variableTokens[0]].value;
31
- this.cursor = this.values[firstVar].length;
32
- }
22
+ } else {
23
+ obj[key] = value;
33
24
  }
25
+ return obj;
26
+ }
27
+ let SnippetPrompt = class SnippetPrompt extends _base.Prompt {
34
28
  parseTemplate() {
35
29
  const regex = /\$\{([a-zA-Z0-9_]+)\}/g;
36
30
  let lastIndex = 0;
37
31
  let match;
38
- while ((match = regex.exec(this.options.template)) !== null) {
32
+ while((match = regex.exec(this.options.template)) !== null){
39
33
  if (match.index > lastIndex) {
40
- this.tokens.push({ type: 'static', value: this.options.template.substring(lastIndex, match.index) });
34
+ this.tokens.push({
35
+ type: 'static',
36
+ value: this.options.template.substring(lastIndex, match.index)
37
+ });
41
38
  }
42
- this.tokens.push({ type: 'variable', value: match[1] });
39
+ this.tokens.push({
40
+ type: 'variable',
41
+ value: match[1]
42
+ });
43
43
  this.variableTokens.push(this.tokens.length - 1);
44
44
  lastIndex = regex.lastIndex;
45
45
  }
46
46
  if (lastIndex < this.options.template.length) {
47
- this.tokens.push({ type: 'static', value: this.options.template.substring(lastIndex) });
47
+ this.tokens.push({
48
+ type: 'static',
49
+ value: this.options.template.substring(lastIndex)
50
+ });
48
51
  }
49
52
  }
50
53
  render(firstRender) {
@@ -57,27 +60,25 @@ class SnippetPrompt extends base_1.Prompt {
57
60
  let cursorVisualIndex = 0;
58
61
  let currentVisualIndex = 0;
59
62
  // Prefix/Message
60
- const prefix = `${theme_1.theme.success}? ${ansi_1.ANSI.BOLD}${theme_1.theme.title}${this.options.message || 'Fill snippet'}${ansi_1.ANSI.RESET}\n`;
63
+ const prefix = `${_theme.theme.success}? ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message || 'Fill snippet'}${_ansi.ANSI.RESET}\n`;
61
64
  output += prefix;
62
65
  let snippetLine = '';
63
- this.tokens.forEach((token, index) => {
66
+ this.tokens.forEach((token, index)=>{
64
67
  if (token.type === 'static') {
65
- snippetLine += `${theme_1.theme.muted}${token.value}${ansi_1.ANSI.RESET}`;
68
+ snippetLine += `${_theme.theme.muted}${token.value}${_ansi.ANSI.RESET}`;
66
69
  currentVisualIndex += token.value.length; // assuming simple ascii/static length
67
- }
68
- else {
70
+ } else {
69
71
  const isFocused = this.variableTokens[this.activeVarIndex] === index;
70
72
  const val = this.values[token.value] || '';
71
73
  // Placeholder if empty?
72
74
  const displayVal = val.length === 0 && isFocused ? '' : val; // maybe show placeholder?
73
75
  let styledVal = displayVal;
74
76
  if (isFocused) {
75
- styledVal = `${ansi_1.ANSI.UNDERLINE}${theme_1.theme.main}${displayVal}${ansi_1.ANSI.RESET}`;
77
+ styledVal = `${_ansi.ANSI.UNDERLINE}${_theme.theme.main}${displayVal}${_ansi.ANSI.RESET}`;
76
78
  // Calculate cursor position
77
79
  cursorVisualIndex = currentVisualIndex + this.cursor;
78
- }
79
- else {
80
- styledVal = `${theme_1.theme.main}${displayVal}${ansi_1.ANSI.RESET}`;
80
+ } else {
81
+ styledVal = `${_theme.theme.main}${displayVal}${_ansi.ANSI.RESET}`;
81
82
  }
82
83
  snippetLine += styledVal;
83
84
  currentVisualIndex += displayVal.length;
@@ -85,12 +86,12 @@ class SnippetPrompt extends base_1.Prompt {
85
86
  });
86
87
  output += snippetLine;
87
88
  if (this.errorMsg) {
88
- output += `\n${theme_1.theme.error}>> ${this.errorMsg}${ansi_1.ANSI.RESET}`;
89
+ output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
89
90
  }
90
- output += `\n${theme_1.theme.muted}(Tab to next variable, Enter to submit)${ansi_1.ANSI.RESET}`;
91
+ output += `\n${_theme.theme.muted}(Tab to next variable, Enter to submit)${_ansi.ANSI.RESET}`;
91
92
  this.renderFrame(output);
92
93
  // Position Cursor
93
- this.print(ansi_1.ANSI.SHOW_CURSOR);
94
+ this.print(_ansi.ANSI.SHOW_CURSOR);
94
95
  // We need to move to correct line and column
95
96
  // Lines:
96
97
  // 1. Message
@@ -103,13 +104,12 @@ class SnippetPrompt extends base_1.Prompt {
103
104
  // If error: 4 lines total. Snippet is line 1 (2nd). Lines up = 2.
104
105
  // If no error: 3 lines total. Snippet is line 1. Lines up = 1.
105
106
  let linesUp = 1;
106
- if (this.errorMsg)
107
- linesUp++;
107
+ if (this.errorMsg) linesUp++;
108
108
  if (linesUp > 0) {
109
109
  this.print(`\x1b[${linesUp}A`);
110
110
  this.lastLinesUp = linesUp;
111
111
  }
112
- this.print(ansi_1.ANSI.CURSOR_LEFT);
112
+ this.print(_ansi.ANSI.CURSOR_LEFT);
113
113
  if (cursorVisualIndex > 0) {
114
114
  this.print(`\x1b[${cursorVisualIndex}C`);
115
115
  }
@@ -141,7 +141,7 @@ class SnippetPrompt extends base_1.Prompt {
141
141
  const activeTokenIdx = this.variableTokens[this.activeVarIndex];
142
142
  const varName = this.tokens[activeTokenIdx].value;
143
143
  const val = this.values[varName];
144
- if (char === '\u0008' || char === '\x7f') { // Backspace
144
+ if (char === '\u0008' || char === '\x7f') {
145
145
  if (this.cursor > 0) {
146
146
  const pre = val.slice(0, this.cursor - 1);
147
147
  const post = val.slice(this.cursor);
@@ -152,14 +152,12 @@ class SnippetPrompt extends base_1.Prompt {
152
152
  return;
153
153
  }
154
154
  if (this.isLeft(char)) {
155
- if (this.cursor > 0)
156
- this.cursor--;
155
+ if (this.cursor > 0) this.cursor--;
157
156
  this.render(false);
158
157
  return;
159
158
  }
160
159
  if (this.isRight(char)) {
161
- if (this.cursor < val.length)
162
- this.cursor++;
160
+ if (this.cursor < val.length) this.cursor++;
163
161
  this.render(false);
164
162
  return;
165
163
  }
@@ -175,8 +173,7 @@ class SnippetPrompt extends base_1.Prompt {
175
173
  if (event.action === 'scroll') {
176
174
  if (event.scroll === 'up') {
177
175
  this.moveFocus(-1);
178
- }
179
- else if (event.scroll === 'down') {
176
+ } else if (event.scroll === 'down') {
180
177
  this.moveFocus(1);
181
178
  }
182
179
  }
@@ -193,15 +190,39 @@ class SnippetPrompt extends base_1.Prompt {
193
190
  submitSnippet() {
194
191
  // Construct final string
195
192
  let result = '';
196
- this.tokens.forEach(token => {
193
+ this.tokens.forEach((token)=>{
197
194
  if (token.type === 'static') {
198
195
  result += token.value;
199
- }
200
- else {
196
+ } else {
201
197
  result += this.values[token.value] || '';
202
198
  }
203
199
  });
204
200
  this.submit(result);
205
201
  }
206
- }
207
- exports.SnippetPrompt = SnippetPrompt;
202
+ constructor(options){
203
+ super(options), _define_property(this, "tokens", []), _define_property(this, "variableTokens", []) // Indices in this.tokens
204
+ , _define_property(this, "values", {}), _define_property(this, "activeVarIndex", 0) // Index in variableTokens
205
+ , _define_property(this, "cursor", 0) // Cursor in active variable value
206
+ , _define_property(this, "errorMsg", ''), _define_property(this, "lastLinesUp", 0);
207
+ this.parseTemplate();
208
+ // Initialize values
209
+ if (options.values) {
210
+ this.values = {
211
+ ...options.values
212
+ };
213
+ }
214
+ // Ensure all vars have entries
215
+ this.variableTokens.forEach((idx)=>{
216
+ const varName = this.tokens[idx].value;
217
+ if (this.values[varName] === undefined) {
218
+ this.values[varName] = '';
219
+ }
220
+ });
221
+ if (this.variableTokens.length > 0) {
222
+ const firstVar = this.tokens[this.variableTokens[0]].value;
223
+ this.cursor = this.values[firstVar].length;
224
+ }
225
+ }
226
+ };
227
+
228
+ //# sourceMappingURL=snippet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/snippet.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { SnippetOptions, MouseEvent } from '../types';\n\ninterface Token {\n type: 'static' | 'variable';\n value: string; // For static: text. For variable: name.\n}\n\nexport class SnippetPrompt extends Prompt<string, SnippetOptions> {\n private tokens: Token[] = [];\n private variableTokens: number[] = []; // Indices in this.tokens\n private values: Record<string, string> = {};\n private activeVarIndex: number = 0; // Index in variableTokens\n private cursor: number = 0; // Cursor in active variable value\n private errorMsg: string = '';\n private lastLinesUp: number = 0;\n\n constructor(options: SnippetOptions) {\n super(options);\n this.parseTemplate();\n\n // Initialize values\n if (options.values) {\n this.values = { ...options.values };\n }\n // Ensure all vars have entries\n this.variableTokens.forEach(idx => {\n const varName = this.tokens[idx].value;\n if (this.values[varName] === undefined) {\n this.values[varName] = '';\n }\n });\n\n if (this.variableTokens.length > 0) {\n const firstVar = this.tokens[this.variableTokens[0]].value;\n this.cursor = this.values[firstVar].length;\n }\n }\n\n private parseTemplate() {\n const regex = /\\$\\{([a-zA-Z0-9_]+)\\}/g;\n let lastIndex = 0;\n let match;\n\n while ((match = regex.exec(this.options.template)) !== null) {\n if (match.index > lastIndex) {\n this.tokens.push({ type: 'static', value: this.options.template.substring(lastIndex, match.index) });\n }\n this.tokens.push({ type: 'variable', value: match[1] });\n this.variableTokens.push(this.tokens.length - 1);\n lastIndex = regex.lastIndex;\n }\n\n if (lastIndex < this.options.template.length) {\n this.tokens.push({ type: 'static', value: this.options.template.substring(lastIndex) });\n }\n }\n\n protected render(firstRender: boolean) {\n if (!firstRender && this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n }\n this.lastLinesUp = 0;\n\n // Build the string\n let output = '';\n let cursorVisualIndex = 0;\n let currentVisualIndex = 0;\n\n // Prefix/Message\n const prefix = `${theme.success}? ${ANSI.BOLD}${theme.title}${this.options.message || 'Fill snippet'}${ANSI.RESET}\\n`;\n output += prefix;\n\n let snippetLine = '';\n\n this.tokens.forEach((token, index) => {\n if (token.type === 'static') {\n snippetLine += `${theme.muted}${token.value}${ANSI.RESET}`;\n currentVisualIndex += token.value.length; // assuming simple ascii/static length\n } else {\n const isFocused = this.variableTokens[this.activeVarIndex] === index;\n const val = this.values[token.value] || '';\n // Placeholder if empty?\n const displayVal = val.length === 0 && isFocused ? '' : val; // maybe show placeholder?\n\n let styledVal = displayVal;\n if (isFocused) {\n styledVal = `${ANSI.UNDERLINE}${theme.main}${displayVal}${ANSI.RESET}`;\n // Calculate cursor position\n cursorVisualIndex = currentVisualIndex + this.cursor;\n } else {\n styledVal = `${theme.main}${displayVal}${ANSI.RESET}`;\n }\n\n snippetLine += styledVal;\n currentVisualIndex += displayVal.length;\n }\n });\n\n output += snippetLine;\n\n if (this.errorMsg) {\n output += `\\n${theme.error}>> ${this.errorMsg}${ANSI.RESET}`;\n }\n\n output += `\\n${theme.muted}(Tab to next variable, Enter to submit)${ANSI.RESET}`;\n\n this.renderFrame(output);\n\n // Position Cursor\n this.print(ANSI.SHOW_CURSOR);\n\n // We need to move to correct line and column\n // Lines:\n // 1. Message\n // 2. Snippet (cursor here)\n // 3. Error (optional)\n // 4. Hint\n\n // snippetLine is at index 1 (0-based) if Message has no newlines.\n // Prefix ends with \\n. So snippetLine is on 2nd line.\n\n // Calculate which row relative to bottom the snippet line is.\n // If error: 4 lines total. Snippet is line 1 (2nd). Lines up = 2.\n // If no error: 3 lines total. Snippet is line 1. Lines up = 1.\n\n let linesUp = 1;\n if (this.errorMsg) linesUp++;\n\n if (linesUp > 0) {\n this.print(`\\x1b[${linesUp}A`);\n this.lastLinesUp = linesUp;\n }\n\n this.print(ANSI.CURSOR_LEFT);\n if (cursorVisualIndex > 0) {\n this.print(`\\x1b[${cursorVisualIndex}C`);\n }\n }\n\n protected cleanup() {\n if (this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n this.lastLinesUp = 0;\n }\n super.cleanup();\n }\n\n protected handleInput(char: string, _key: Buffer) {\n // Navigation: Tab / Shift+Tab\n if (char === '\\u001b[Z') {\n // Shift Tab -> Prev\n this.moveFocus(-1);\n return;\n }\n\n if (char === '\\t') {\n this.moveFocus(1);\n return;\n }\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n this.submitSnippet();\n return;\n }\n\n // Editing\n const activeTokenIdx = this.variableTokens[this.activeVarIndex];\n const varName = this.tokens[activeTokenIdx].value;\n const val = this.values[varName];\n\n if (char === '\\u0008' || char === '\\x7f') { // Backspace\n if (this.cursor > 0) {\n const pre = val.slice(0, this.cursor - 1);\n const post = val.slice(this.cursor);\n this.values[varName] = pre + post;\n this.cursor--;\n this.render(false);\n }\n return;\n }\n\n if (this.isLeft(char)) {\n if (this.cursor > 0) this.cursor--;\n this.render(false);\n return;\n }\n if (this.isRight(char)) {\n if (this.cursor < val.length) this.cursor++;\n this.render(false);\n return;\n }\n\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n const pre = val.slice(0, this.cursor);\n const post = val.slice(this.cursor);\n this.values[varName] = pre + char + post;\n this.cursor += char.length;\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.moveFocus(-1);\n } else if (event.scroll === 'down') {\n this.moveFocus(1);\n }\n }\n }\n\n private moveFocus(direction: number) {\n const nextIndex = this.activeVarIndex + direction;\n if (nextIndex >= 0 && nextIndex < this.variableTokens.length) {\n this.activeVarIndex = nextIndex;\n const varName = this.tokens[this.variableTokens[this.activeVarIndex]].value;\n this.cursor = this.values[varName].length;\n this.render(false);\n }\n }\n\n private submitSnippet() {\n // Construct final string\n let result = '';\n this.tokens.forEach(token => {\n if (token.type === 'static') {\n result += token.value;\n } else {\n result += this.values[token.value] || '';\n }\n });\n this.submit(result);\n }\n}\n"],"names":["SnippetPrompt","Prompt","parseTemplate","regex","lastIndex","match","exec","options","template","index","tokens","push","type","value","substring","variableTokens","length","render","firstRender","lastLinesUp","print","output","cursorVisualIndex","currentVisualIndex","prefix","theme","success","ANSI","BOLD","title","message","RESET","snippetLine","forEach","token","muted","isFocused","activeVarIndex","val","values","displayVal","styledVal","UNDERLINE","main","cursor","errorMsg","error","renderFrame","SHOW_CURSOR","linesUp","CURSOR_LEFT","cleanup","handleInput","char","_key","moveFocus","submitSnippet","activeTokenIdx","varName","pre","slice","post","isLeft","isRight","test","startsWith","handleMouse","event","action","scroll","direction","nextIndex","result","submit","idx","undefined","firstVar"],"mappings":"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"}
@@ -1,64 +1,71 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SortGridPrompt = void 0;
4
- const ansi_1 = require("../ansi");
5
- const base_1 = require("../base");
6
- const theme_1 = require("../theme");
7
- const utils_1 = require("../utils");
8
- class SortGridPrompt extends base_1.Prompt {
9
- constructor(options) {
10
- super(options);
11
- this.cursorX = 0;
12
- this.cursorY = 0;
13
- this.grabbedX = null;
14
- this.grabbedY = null;
15
- this.columnWidths = [];
16
- // Deep copy grid data
17
- this.gridData = options.data.map(row => [...row]);
18
- this.calculateLayout();
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "SortGridPrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return SortGridPrompt;
9
+ }
10
+ });
11
+ const _ansi = require("../ansi");
12
+ const _base = require("../base");
13
+ const _theme = require("../theme");
14
+ const _utils = require("../utils");
15
+ function _define_property(obj, key, value) {
16
+ if (key in obj) {
17
+ Object.defineProperty(obj, key, {
18
+ value: value,
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true
22
+ });
23
+ } else {
24
+ obj[key] = value;
19
25
  }
26
+ return obj;
27
+ }
28
+ let SortGridPrompt = class SortGridPrompt extends _base.Prompt {
20
29
  calculateLayout() {
21
30
  const rows = this.gridData.length;
22
- if (rows === 0)
23
- return;
31
+ if (rows === 0) return;
24
32
  // Assume consistent column count, use max found if ragged
25
- const cols = this.gridData.reduce((max, row) => Math.max(max, row.length), 0);
33
+ const cols = this.gridData.reduce((max, row)=>Math.max(max, row.length), 0);
26
34
  this.columnWidths = new Array(cols).fill(0);
27
- for (let r = 0; r < rows; r++) {
28
- for (let c = 0; c < this.gridData[r].length; c++) {
35
+ for(let r = 0; r < rows; r++){
36
+ for(let c = 0; c < this.gridData[r].length; c++){
29
37
  const cell = this.gridData[r][c] || '';
30
- this.columnWidths[c] = Math.max(this.columnWidths[c], (0, utils_1.stringWidth)(cell) + 2); // +2 padding
38
+ this.columnWidths[c] = Math.max(this.columnWidths[c], (0, _utils.stringWidth)(cell) + 2); // +2 padding
31
39
  }
32
40
  }
33
41
  }
34
42
  render(_firstRender) {
35
43
  this.calculateLayout();
36
- let output = `${theme_1.theme.title}${this.options.message}${ansi_1.ANSI.RESET}\n`;
37
- this.gridData.forEach((row, r) => {
38
- const rowStr = row.map((cell, c) => {
39
- const width = this.columnWidths[c] || (0, utils_1.stringWidth)(cell) + 2;
44
+ let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
45
+ this.gridData.forEach((row, r)=>{
46
+ const rowStr = row.map((cell, c)=>{
47
+ const width = this.columnWidths[c] || (0, _utils.stringWidth)(cell) + 2;
40
48
  const content = cell || '';
41
49
  // Padding
42
- const padding = Math.max(0, width - (0, utils_1.stringWidth)(content));
50
+ const padding = Math.max(0, width - (0, _utils.stringWidth)(content));
43
51
  const leftPad = Math.floor(padding / 2);
44
52
  const rightPad = padding - leftPad;
45
53
  let cellStr = ' '.repeat(leftPad) + content + ' '.repeat(rightPad);
46
54
  // Styling
47
- const isFocused = (r === this.cursorY && c === this.cursorX);
48
- const isGrabbed = (r === this.grabbedY && c === this.grabbedX);
55
+ const isFocused = r === this.cursorY && c === this.cursorX;
56
+ const isGrabbed = r === this.grabbedY && c === this.grabbedX;
49
57
  if (isGrabbed) {
50
58
  // Grabbed item style
51
- cellStr = `${ansi_1.ANSI.BG_RED}${ansi_1.ANSI.FG_WHITE}${cellStr}${ansi_1.ANSI.RESET}`;
52
- }
53
- else if (isFocused) {
59
+ cellStr = `${_ansi.ANSI.BG_RED}${_ansi.ANSI.FG_WHITE}${cellStr}${_ansi.ANSI.RESET}`;
60
+ } else if (isFocused) {
54
61
  // Focused item style
55
- cellStr = `${ansi_1.ANSI.REVERSE}${cellStr}${ansi_1.ANSI.RESET}`;
62
+ cellStr = `${_ansi.ANSI.REVERSE}${cellStr}${_ansi.ANSI.RESET}`;
56
63
  }
57
64
  return cellStr;
58
65
  }).join(' '); // Space between columns
59
66
  output += rowStr + '\n';
60
67
  });
61
- output += `${theme_1.theme.muted}Arrows to move, Space to grab/drop, Enter to submit${ansi_1.ANSI.RESET}`;
68
+ output += `${_theme.theme.muted}Arrows to move, Space to grab/drop, Enter to submit${_ansi.ANSI.RESET}`;
62
69
  this.renderFrame(output);
63
70
  }
64
71
  handleInput(char, _key) {
@@ -75,8 +82,7 @@ class SortGridPrompt extends base_1.Prompt {
75
82
  // Grab
76
83
  this.grabbedX = this.cursorX;
77
84
  this.grabbedY = this.cursorY;
78
- }
79
- else {
85
+ } else {
80
86
  // Drop
81
87
  this.grabbedX = null;
82
88
  this.grabbedY = null;
@@ -90,40 +96,30 @@ class SortGridPrompt extends base_1.Prompt {
90
96
  const isRight = this.isRight(char);
91
97
  const isTab = char === '\t';
92
98
  const isShiftTab = char === '\u001b[Z';
93
- if (isUp)
94
- this.move('up');
95
- if (isDown)
96
- this.move('down');
97
- if (isLeft || isShiftTab)
98
- this.move('left');
99
- if (isRight || isTab)
100
- this.move('right');
99
+ if (isUp) this.move('up');
100
+ if (isDown) this.move('down');
101
+ if (isLeft || isShiftTab) this.move('left');
102
+ if (isRight || isTab) this.move('right');
101
103
  }
102
104
  handleMouse(event) {
103
105
  if (event.scroll === 'up') {
104
106
  this.move('up');
105
- }
106
- else if (event.scroll === 'down') {
107
+ } else if (event.scroll === 'down') {
107
108
  this.move('down');
108
109
  }
109
110
  }
110
111
  move(direction) {
111
- if (this.gridData.length === 0)
112
- return;
112
+ if (this.gridData.length === 0) return;
113
113
  const oldX = this.cursorX;
114
114
  const oldY = this.cursorY;
115
- if (direction === 'up')
116
- this.cursorY = Math.max(0, this.cursorY - 1);
117
- if (direction === 'down')
118
- this.cursorY = Math.min(this.gridData.length - 1, this.cursorY + 1);
115
+ if (direction === 'up') this.cursorY = Math.max(0, this.cursorY - 1);
116
+ if (direction === 'down') this.cursorY = Math.min(this.gridData.length - 1, this.cursorY + 1);
119
117
  // Clamp cursorX if we moved to a shorter row
120
118
  if (this.gridData.length > 0) {
121
119
  const rowLen = this.gridData[this.cursorY] ? this.gridData[this.cursorY].length : 0;
122
- if (this.cursorX >= rowLen)
123
- this.cursorX = Math.max(0, rowLen - 1);
120
+ if (this.cursorX >= rowLen) this.cursorX = Math.max(0, rowLen - 1);
124
121
  }
125
- if (direction === 'left')
126
- this.cursorX = Math.max(0, this.cursorX - 1);
122
+ if (direction === 'left') this.cursorX = Math.max(0, this.cursorX - 1);
127
123
  if (direction === 'right') {
128
124
  const rowLen = this.gridData.length > 0 && this.gridData[this.cursorY] ? this.gridData[this.cursorY].length : 0;
129
125
  this.cursorX = Math.min(rowLen - 1, this.cursorX + 1);
@@ -142,5 +138,14 @@ class SortGridPrompt extends base_1.Prompt {
142
138
  }
143
139
  this.render(false);
144
140
  }
145
- }
146
- exports.SortGridPrompt = SortGridPrompt;
141
+ constructor(options){
142
+ super(options), _define_property(this, "cursorX", 0), _define_property(this, "cursorY", 0), _define_property(this, "grabbedX", null), _define_property(this, "grabbedY", null), _define_property(this, "gridData", void 0), _define_property(this, "columnWidths", []);
143
+ // Deep copy grid data
144
+ this.gridData = options.data.map((row)=>[
145
+ ...row
146
+ ]);
147
+ this.calculateLayout();
148
+ }
149
+ };
150
+
151
+ //# sourceMappingURL=sort-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/sort-grid.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { SortGridOptions, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class SortGridPrompt extends Prompt<string[][], SortGridOptions> {\n protected cursorX: number = 0;\n protected cursorY: number = 0;\n protected grabbedX: number | null = null;\n protected grabbedY: number | null = null;\n private gridData: string[][];\n private columnWidths: number[] = [];\n\n constructor(options: SortGridOptions) {\n super(options);\n // Deep copy grid data\n this.gridData = options.data.map(row => [...row]);\n this.calculateLayout();\n }\n\n private calculateLayout() {\n const rows = this.gridData.length;\n if (rows === 0) return;\n // Assume consistent column count, use max found if ragged\n const cols = this.gridData.reduce((max, row) => Math.max(max, row.length), 0);\n\n this.columnWidths = new Array(cols).fill(0);\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < this.gridData[r].length; c++) {\n const cell = this.gridData[r][c] || '';\n this.columnWidths[c] = Math.max(this.columnWidths[c], stringWidth(cell) + 2); // +2 padding\n }\n }\n }\n\n protected render(_firstRender: boolean): void {\n this.calculateLayout();\n let output = `${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n this.gridData.forEach((row, r) => {\n const rowStr = row.map((cell, c) => {\n const width = this.columnWidths[c] || stringWidth(cell) + 2;\n const content = cell || '';\n\n // Padding\n const padding = Math.max(0, width - stringWidth(content));\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n\n let cellStr = ' '.repeat(leftPad) + content + ' '.repeat(rightPad);\n\n // Styling\n const isFocused = (r === this.cursorY && c === this.cursorX);\n const isGrabbed = (r === this.grabbedY && c === this.grabbedX);\n\n if (isGrabbed) {\n // Grabbed item style\n cellStr = `${ANSI.BG_RED}${ANSI.FG_WHITE}${cellStr}${ANSI.RESET}`;\n } else if (isFocused) {\n // Focused item style\n cellStr = `${ANSI.REVERSE}${cellStr}${ANSI.RESET}`;\n }\n\n return cellStr;\n }).join(' '); // Space between columns\n\n output += rowStr + '\\n';\n });\n\n output += `${theme.muted}Arrows to move, Space to grab/drop, Enter to submit${ANSI.RESET}`;\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, _key: Buffer): void {\n if (char === '\\r' || char === '\\n') {\n if (this.grabbedX !== null) {\n this.grabbedX = null;\n this.grabbedY = null;\n }\n this.submit(this.gridData);\n return;\n }\n\n if (char === ' ') {\n if (this.grabbedX === null) {\n // Grab\n this.grabbedX = this.cursorX;\n this.grabbedY = this.cursorY;\n } else {\n // Drop\n this.grabbedX = null;\n this.grabbedY = null;\n }\n this.render(false);\n return;\n }\n\n const isUp = this.isUp(char);\n const isDown = this.isDown(char);\n const isLeft = this.isLeft(char);\n const isRight = this.isRight(char);\n const isTab = char === '\\t';\n const isShiftTab = char === '\\u001b[Z';\n\n if (isUp) this.move('up');\n if (isDown) this.move('down');\n if (isLeft || isShiftTab) this.move('left');\n if (isRight || isTab) this.move('right');\n }\n\n protected handleMouse(event: MouseEvent): void {\n if (event.scroll === 'up') {\n this.move('up');\n } else if (event.scroll === 'down') {\n this.move('down');\n }\n }\n\n protected move(direction: 'up' | 'down' | 'left' | 'right'): void {\n if (this.gridData.length === 0) return;\n\n const oldX = this.cursorX;\n const oldY = this.cursorY;\n\n if (direction === 'up') this.cursorY = Math.max(0, this.cursorY - 1);\n if (direction === 'down') this.cursorY = Math.min(this.gridData.length - 1, this.cursorY + 1);\n\n // Clamp cursorX if we moved to a shorter row\n if (this.gridData.length > 0) {\n const rowLen = this.gridData[this.cursorY] ? this.gridData[this.cursorY].length : 0;\n if (this.cursorX >= rowLen) this.cursorX = Math.max(0, rowLen - 1);\n }\n\n if (direction === 'left') this.cursorX = Math.max(0, this.cursorX - 1);\n if (direction === 'right') {\n const rowLen = this.gridData.length > 0 && this.gridData[this.cursorY] ? this.gridData[this.cursorY].length : 0;\n this.cursorX = Math.min(rowLen - 1, this.cursorX + 1);\n }\n\n // If Grabbed, swap content\n if (this.grabbedX !== null) {\n // If we moved\n if (oldX !== this.cursorX || oldY !== this.cursorY) {\n const valA = this.gridData[oldY][oldX];\n const valB = this.gridData[this.cursorY][this.cursorX];\n\n this.gridData[oldY][oldX] = valB;\n this.gridData[this.cursorY][this.cursorX] = valA;\n\n this.grabbedX = this.cursorX;\n this.grabbedY = this.cursorY;\n }\n }\n\n this.render(false);\n }\n}\n"],"names":["SortGridPrompt","Prompt","calculateLayout","rows","gridData","length","cols","reduce","max","row","Math","columnWidths","Array","fill","r","c","cell","stringWidth","render","_firstRender","output","theme","title","options","message","ANSI","RESET","forEach","rowStr","map","width","content","padding","leftPad","floor","rightPad","cellStr","repeat","isFocused","cursorY","cursorX","isGrabbed","grabbedY","grabbedX","BG_RED","FG_WHITE","REVERSE","join","muted","renderFrame","handleInput","char","_key","submit","isUp","isDown","isLeft","isRight","isTab","isShiftTab","move","handleMouse","event","scroll","direction","oldX","oldY","min","rowLen","valA","valB","data"],"mappings":"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"}