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 @@
1
+ {"version":3,"sources":["../../../src/prompts/miller.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { MillerOptions, TreeNode, MouseEvent } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { symbols } from '../symbols';\nimport { stringWidth, stripAnsi } from '../utils';\n\nexport class MillerPrompt<V> extends Prompt<V[], MillerOptions<V>> {\n private selections: number[] = [];\n private activeCol: number = 0;\n private scrollTops: number[] = []; // Scroll position for each column\n\n // Layout\n private colWidth: number = 0;\n private visibleCols: number = 3;\n\n constructor(options: MillerOptions<V>) {\n super(options);\n\n this.selections = [0];\n this.scrollTops = [0];\n\n // TODO: Map initial values to selections if provided\n\n this.calculateLayout();\n }\n\n private calculateLayout() {\n const termWidth = process.stdout.columns || 80;\n // We aim for 3 columns? Or based on width?\n // Minimum width per column ~ 20?\n this.visibleCols = Math.floor(termWidth / 20);\n if (this.visibleCols < 1) this.visibleCols = 1;\n if (this.visibleCols > 4) this.visibleCols = 4; // Cap at 4\n\n this.colWidth = Math.floor((termWidth - 4) / this.visibleCols); // -4 for margins\n }\n\n private getColumnData(depth: number): TreeNode<V>[] | undefined {\n let current = this.options.data;\n for (let i = 0; i < depth; i++) {\n const sel = this.selections[i];\n if (current[sel] && current[sel].children) {\n current = current[sel].children!;\n } else {\n return undefined;\n }\n }\n return current;\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n let startCol = 0;\n if (this.activeCol >= this.visibleCols) {\n startCol = this.activeCol - this.visibleCols + 1;\n }\n\n // Construct columns content\n const columnsToRender: string[][] = [];\n\n for (let c = startCol; c < startCol + this.visibleCols; c++) {\n const data = this.getColumnData(c);\n if (!data) break;\n\n const rows: string[] = [];\n const selectedIdx = this.selections[c] ?? -1;\n const isFocusedCol = c === this.activeCol;\n\n // Scroll handling\n const pageSize = 10; // Fixed height for now\n if (!this.scrollTops[c]) this.scrollTops[c] = 0;\n\n if (selectedIdx !== -1) {\n if (selectedIdx < this.scrollTops[c]) {\n this.scrollTops[c] = selectedIdx;\n } else if (selectedIdx >= this.scrollTops[c] + pageSize) {\n this.scrollTops[c] = selectedIdx - pageSize + 1;\n }\n }\n\n // Render rows\n const start = this.scrollTops[c];\n const end = Math.min(data.length, start + pageSize);\n\n for (let i = start; i < end; i++) {\n const item = data[i];\n const isSelected = i === selectedIdx;\n const isFocused = isSelected && isFocusedCol;\n\n let prefix = ' ';\n if (isSelected) {\n prefix = isFocused ? `${theme.main}${symbols.pointer}${ANSI.RESET}` : `${theme.muted}${symbols.pointer}${ANSI.RESET}`;\n }\n\n let title = item.title;\n // Truncate\n if (stringWidth(title) > this.colWidth - 4) {\n title = title.slice(0, this.colWidth - 5) + '…';\n }\n\n let line = `${prefix} ${isSelected && isFocused ? theme.main : ''}${title}${ANSI.RESET}`;\n\n // Add arrow if children exist\n if (item.children && item.children.length > 0) {\n const pad = this.colWidth - stringWidth(stripAnsi(line)) - 2;\n line += ' '.repeat(Math.max(0, pad)) + `${theme.muted}>${ANSI.RESET}`;\n }\n\n rows.push(line);\n }\n\n // Pad column to pageSize\n while (rows.length < pageSize) {\n rows.push('');\n }\n\n columnsToRender.push(rows);\n }\n\n // Combine columns side by side\n const rowCount = 10;\n for (let r = 0; r < rowCount; r++) {\n let line = '';\n for (let c = 0; c < columnsToRender.length; c++) {\n let cell = columnsToRender[c][r] || '';\n // Pad cell\n const len = stringWidth(stripAnsi(cell));\n const pad = this.colWidth - len;\n cell += ' '.repeat(Math.max(0, pad));\n\n line += cell;\n\n // Separator\n if (c < columnsToRender.length - 1) {\n line += `${theme.muted}│${ANSI.RESET} `;\n }\n }\n output += line + '\\n';\n }\n\n // Breadcrumbs / Status\n const pathTitles = [];\n for (let i = 0; i <= this.activeCol; i++) {\n const data = this.getColumnData(i);\n if (data && typeof this.selections[i] === 'number') {\n pathTitles.push(data[this.selections[i]].title);\n }\n }\n output += `${theme.muted}Path: ${pathTitles.join(' / ')}${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n const currentData = this.getColumnData(this.activeCol);\n if (!currentData) return; // Should not happen\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n // Collect values\n const values: V[] = [];\n for (let i = 0; i <= this.activeCol; i++) {\n const d = this.getColumnData(i);\n if (d) values.push(d[this.selections[i]].value);\n }\n this.submit(values);\n return;\n }\n\n if (this.isUp(char)) {\n if (this.selections[this.activeCol] > 0) {\n this.selections[this.activeCol]--;\n // Reset subsequent columns\n this.selections = this.selections.slice(0, this.activeCol + 1);\n } else {\n this.selections[this.activeCol] = currentData.length - 1;\n this.selections = this.selections.slice(0, this.activeCol + 1);\n }\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n if (this.selections[this.activeCol] < currentData.length - 1) {\n this.selections[this.activeCol]++;\n this.selections = this.selections.slice(0, this.activeCol + 1);\n } else {\n this.selections[this.activeCol] = 0;\n this.selections = this.selections.slice(0, this.activeCol + 1);\n }\n this.render(false);\n return;\n }\n\n if (this.isRight(char) || char === '\\t') {\n // Expand\n const idx = this.selections[this.activeCol];\n const item = currentData[idx];\n if (item.children && item.children.length > 0) {\n this.activeCol++;\n this.selections[this.activeCol] = 0;\n this.render(false);\n }\n return;\n }\n\n if (this.isLeft(char) || char === '\\x1b[Z') {\n if (this.activeCol > 0) {\n this.activeCol--;\n this.render(false);\n }\n return;\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n const currentData = this.getColumnData(this.activeCol);\n if (!currentData || currentData.length === 0) return;\n\n if (event.scroll === 'up') {\n if (this.selections[this.activeCol] > 0) {\n this.selections[this.activeCol]--;\n } else {\n this.selections[this.activeCol] = currentData.length - 1;\n }\n } else if (event.scroll === 'down') {\n if (this.selections[this.activeCol] < currentData.length - 1) {\n this.selections[this.activeCol]++;\n } else {\n this.selections[this.activeCol] = 0;\n }\n }\n\n // Reset subsequent columns\n this.selections = this.selections.slice(0, this.activeCol + 1);\n this.render(false);\n }\n }\n}\n"],"names":["MillerPrompt","Prompt","calculateLayout","termWidth","process","stdout","columns","visibleCols","Math","floor","colWidth","getColumnData","depth","current","options","data","i","sel","selections","children","undefined","render","_firstRender","output","theme","success","ANSI","RESET","BOLD","title","message","startCol","activeCol","columnsToRender","c","rows","selectedIdx","isFocusedCol","pageSize","scrollTops","start","end","min","length","item","isSelected","isFocused","prefix","main","symbols","pointer","muted","stringWidth","slice","line","pad","stripAnsi","repeat","max","push","rowCount","r","cell","len","pathTitles","join","renderFrame","handleInput","char","currentData","values","d","value","submit","isUp","isDown","isRight","idx","isLeft","handleMouse","event","action","scroll"],"mappings":"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"}
@@ -1,21 +1,35 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MultiColumnSelectPrompt = void 0;
4
- const select_1 = require("./select");
5
- const theme_1 = require("../theme");
6
- const ansi_1 = require("../ansi");
7
- const utils_1 = require("../utils");
8
- const symbols_1 = require("../symbols");
9
- class MultiColumnSelectPrompt extends select_1.SelectPrompt {
10
- constructor(options) {
11
- super(options);
12
- this.cols = 1;
13
- this.colWidth = 0;
14
- this.calculateLayout();
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "MultiColumnSelectPrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return MultiColumnSelectPrompt;
9
+ }
10
+ });
11
+ const _select = require("./select");
12
+ const _theme = require("../theme");
13
+ const _ansi = require("../ansi");
14
+ const _utils = require("../utils");
15
+ const _symbols = require("../symbols");
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;
15
26
  }
27
+ return obj;
28
+ }
29
+ let MultiColumnSelectPrompt = class MultiColumnSelectPrompt extends _select.SelectPrompt {
16
30
  calculateLayout() {
17
31
  const termWidth = process.stdout.columns || 80;
18
- const choices = this.options.choices.filter(c => !this.isSeparator(c));
32
+ const choices = this.options.choices.filter((c)=>!this.isSeparator(c));
19
33
  if (choices.length === 0) {
20
34
  this.cols = 1;
21
35
  this.colWidth = termWidth;
@@ -23,21 +37,18 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
23
37
  }
24
38
  // Calculate max item width
25
39
  let maxLen = 0;
26
- for (const c of choices) {
27
- const len = (0, utils_1.stringWidth)(c.title);
28
- if (len > maxLen)
29
- maxLen = len;
40
+ for (const c of choices){
41
+ const len = (0, _utils.stringWidth)(c.title);
42
+ if (len > maxLen) maxLen = len;
30
43
  }
31
44
  // Add padding (pointer + space + item + space)
32
45
  const itemWidth = maxLen + 4;
33
46
  if (typeof this.options.cols === 'number') {
34
47
  this.cols = this.options.cols;
35
- }
36
- else {
48
+ } else {
37
49
  // Auto
38
50
  this.cols = Math.floor(termWidth / itemWidth);
39
- if (this.cols < 1)
40
- this.cols = 1;
51
+ if (this.cols < 1) this.cols = 1;
41
52
  }
42
53
  // Final column width
43
54
  this.colWidth = Math.floor(termWidth / this.cols);
@@ -46,10 +57,10 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
46
57
  let output = '';
47
58
  const choices = this.getFilteredChoices();
48
59
  // Header
49
- const searchStr = this.searchBuffer ? ` ${theme_1.theme.muted}(Filter: ${this.searchBuffer})${ansi_1.ANSI.RESET}` : '';
50
- output += `${theme_1.theme.success}?${ansi_1.ANSI.RESET} ${ansi_1.ANSI.BOLD}${theme_1.theme.title}${this.options.message}${ansi_1.ANSI.RESET}${searchStr}\n`;
60
+ const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
61
+ output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
51
62
  if (choices.length === 0) {
52
- output += ` ${theme_1.theme.muted}No results found${ansi_1.ANSI.RESET}`;
63
+ output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
53
64
  this.renderFrame(output);
54
65
  return;
55
66
  }
@@ -59,8 +70,7 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
59
70
  const currentRow = Math.floor(this.selectedIndex / this.cols);
60
71
  if (currentRow < this.scrollTop) {
61
72
  this.scrollTop = currentRow;
62
- }
63
- else if (currentRow >= this.scrollTop + this.pageSize) {
73
+ } else if (currentRow >= this.scrollTop + this.pageSize) {
64
74
  this.scrollTop = currentRow - this.pageSize + 1;
65
75
  }
66
76
  // Edge case: if list shrinks
@@ -69,27 +79,25 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
69
79
  }
70
80
  const startRow = this.scrollTop;
71
81
  const endRow = Math.min(totalRows, startRow + this.pageSize);
72
- for (let r = startRow; r < endRow; r++) {
82
+ for(let r = startRow; r < endRow; r++){
73
83
  let rowStr = '';
74
- for (let c = 0; c < this.cols; c++) {
84
+ for(let c = 0; c < this.cols; c++){
75
85
  const idx = r * this.cols + c;
76
- if (idx >= choices.length)
77
- break;
86
+ if (idx >= choices.length) break;
78
87
  const choice = choices[idx];
79
88
  // Truncate if needed
80
89
  let title = choice.title || '';
81
- if ((0, utils_1.stringWidth)(title) > this.colWidth - 3) {
90
+ if ((0, _utils.stringWidth)(title) > this.colWidth - 3) {
82
91
  title = title.slice(0, this.colWidth - 4) + '…';
83
92
  }
84
93
  let cellContent = '';
85
94
  if (idx === this.selectedIndex) {
86
- cellContent = `${theme_1.theme.main}${symbols_1.symbols.pointer} ${title}${ansi_1.ANSI.RESET}`;
87
- }
88
- else {
95
+ cellContent = `${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`;
96
+ } else {
89
97
  cellContent = ` ${title}`;
90
98
  }
91
99
  // Pad cell to colWidth
92
- const currentWidth = (0, utils_1.stringWidth)(this.stripAnsi(cellContent));
100
+ const currentWidth = (0, _utils.stringWidth)(this.stripAnsi(cellContent));
93
101
  const padding = Math.max(0, this.colWidth - currentWidth);
94
102
  // Add cell to row
95
103
  rowStr += cellContent + ' '.repeat(padding);
@@ -97,8 +105,7 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
97
105
  output += rowStr + '\n';
98
106
  }
99
107
  // Remove trailing newline
100
- if (output.endsWith('\n'))
101
- output = output.slice(0, -1);
108
+ if (output.endsWith('\n')) output = output.slice(0, -1);
102
109
  this.renderFrame(output);
103
110
  }
104
111
  handleInput(char) {
@@ -128,8 +135,7 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
128
135
  if (this.isLeft(char)) {
129
136
  if (this.selectedIndex > 0) {
130
137
  this.selectedIndex--;
131
- }
132
- else {
138
+ } else {
133
139
  this.selectedIndex = choices.length - 1;
134
140
  }
135
141
  this.render(false);
@@ -138,8 +144,7 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
138
144
  if (this.isRight(char)) {
139
145
  if (this.selectedIndex < choices.length - 1) {
140
146
  this.selectedIndex++;
141
- }
142
- else {
147
+ } else {
143
148
  this.selectedIndex = 0;
144
149
  }
145
150
  this.render(false);
@@ -162,5 +167,10 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
162
167
  this.render(false);
163
168
  }
164
169
  }
165
- }
166
- exports.MultiColumnSelectPrompt = MultiColumnSelectPrompt;
170
+ constructor(options){
171
+ super(options), _define_property(this, "cols", 1), _define_property(this, "colWidth", 0);
172
+ this.calculateLayout();
173
+ }
174
+ };
175
+
176
+ //# sourceMappingURL=multi-column-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/multi-column-select.ts"],"sourcesContent":["import { SelectPrompt } from './select';\nimport { MultiColumnSelectOptions, SelectChoice } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { stringWidth } from '../utils';\nimport { symbols } from '../symbols';\n\nexport class MultiColumnSelectPrompt<V> extends SelectPrompt<V, MultiColumnSelectOptions<V>> {\n protected cols: number = 1;\n protected colWidth: number = 0;\n\n constructor(options: MultiColumnSelectOptions<V>) {\n super(options);\n this.calculateLayout();\n }\n\n private calculateLayout() {\n const termWidth = process.stdout.columns || 80;\n const choices = this.options.choices.filter(c => !this.isSeparator(c)) as SelectChoice<V>[];\n\n if (choices.length === 0) {\n this.cols = 1;\n this.colWidth = termWidth;\n return;\n }\n\n // Calculate max item width\n let maxLen = 0;\n for (const c of choices) {\n const len = stringWidth(c.title);\n if (len > maxLen) maxLen = len;\n }\n\n // Add padding (pointer + space + item + space)\n const itemWidth = maxLen + 4;\n\n if (typeof this.options.cols === 'number') {\n this.cols = this.options.cols;\n } else {\n // Auto\n this.cols = Math.floor(termWidth / itemWidth);\n if (this.cols < 1) this.cols = 1;\n }\n\n // Final column width\n this.colWidth = Math.floor(termWidth / this.cols);\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n this.renderFrame(output);\n return;\n }\n\n // Grid Render\n const totalRows = Math.ceil(choices.length / this.cols);\n\n // Adjust Scroll\n const currentRow = Math.floor(this.selectedIndex / this.cols);\n if (currentRow < this.scrollTop) {\n this.scrollTop = currentRow;\n } else if (currentRow >= this.scrollTop + this.pageSize) {\n this.scrollTop = currentRow - this.pageSize + 1;\n }\n\n // Edge case: if list shrinks\n if (this.scrollTop > totalRows - 1) {\n this.scrollTop = Math.max(0, totalRows - this.pageSize);\n }\n\n const startRow = this.scrollTop;\n const endRow = Math.min(totalRows, startRow + this.pageSize);\n\n for (let r = startRow; r < endRow; r++) {\n let rowStr = '';\n for (let c = 0; c < this.cols; c++) {\n const idx = r * this.cols + c;\n if (idx >= choices.length) break;\n\n const choice = choices[idx];\n\n // Truncate if needed\n let title = (choice as any).title || '';\n if (stringWidth(title) > this.colWidth - 3) {\n title = title.slice(0, this.colWidth - 4) + '…';\n }\n\n let cellContent = '';\n if (idx === this.selectedIndex) {\n cellContent = `${theme.main}${symbols.pointer} ${title}${ANSI.RESET}`;\n } else {\n cellContent = ` ${title}`;\n }\n\n // Pad cell to colWidth\n const currentWidth = stringWidth(this.stripAnsi(cellContent));\n const padding = Math.max(0, this.colWidth - currentWidth);\n\n // Add cell to row\n rowStr += cellContent + ' '.repeat(padding);\n }\n output += rowStr + '\\n';\n }\n\n // Remove trailing newline\n if (output.endsWith('\\n')) output = output.slice(0, -1);\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n const choices = this.getFilteredChoices();\n\n if (char === '\\r' || char === '\\n') {\n if (choices.length > 0) {\n this.submit((choices[this.selectedIndex] as any).value);\n }\n return;\n }\n\n if (this.isUp(char)) {\n const newIndex = this.selectedIndex - this.cols;\n if (newIndex >= 0) {\n this.selectedIndex = newIndex;\n }\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n const newIndex = this.selectedIndex + this.cols;\n if (newIndex < choices.length) {\n this.selectedIndex = newIndex;\n }\n this.render(false);\n return;\n }\n\n if (this.isLeft(char)) {\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = choices.length - 1;\n }\n this.render(false);\n return;\n }\n\n if (this.isRight(char)) {\n if (this.selectedIndex < choices.length - 1) {\n this.selectedIndex++;\n } else {\n this.selectedIndex = 0;\n }\n this.render(false);\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.searchBuffer.length > 0) {\n this.searchBuffer = this.searchBuffer.slice(0, -1);\n this.selectedIndex = 0;\n this.calculateLayout();\n this.render(false);\n }\n return;\n }\n\n // Typing\n if (char.length === 1 && !/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.searchBuffer += char;\n this.selectedIndex = 0;\n this.render(false);\n }\n }\n}\n\n"],"names":["MultiColumnSelectPrompt","SelectPrompt","calculateLayout","termWidth","process","stdout","columns","choices","options","filter","c","isSeparator","length","cols","colWidth","maxLen","len","stringWidth","title","itemWidth","Math","floor","render","_firstRender","output","getFilteredChoices","searchStr","searchBuffer","theme","muted","ANSI","RESET","success","BOLD","message","renderFrame","totalRows","ceil","currentRow","selectedIndex","scrollTop","pageSize","max","startRow","endRow","min","r","rowStr","idx","choice","slice","cellContent","main","symbols","pointer","currentWidth","stripAnsi","padding","repeat","endsWith","handleInput","char","submit","value","isUp","newIndex","isDown","isLeft","isRight","test","startsWith"],"mappings":"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"}
@@ -1,28 +1,42 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MultiRangePrompt = void 0;
4
- const select_range_1 = require("./select-range");
5
- const theme_1 = require("../theme");
6
- const ansi_1 = require("../ansi");
7
- const symbols_1 = require("../symbols");
8
- class MultiRangePrompt extends select_range_1.SelectRangePrompt {
9
- constructor(options) {
10
- super(options);
11
- this.committedRanges = [];
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "MultiRangePrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return MultiRangePrompt;
12
9
  }
10
+ });
11
+ const _selectrange = require("./select-range");
12
+ const _theme = require("../theme");
13
+ const _ansi = require("../ansi");
14
+ const _symbols = require("../symbols");
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;
25
+ }
26
+ return obj;
27
+ }
28
+ let MultiRangePrompt = class MultiRangePrompt extends _selectrange.SelectRangePrompt {
13
29
  mergeRanges() {
14
- if (this.committedRanges.length === 0)
15
- return;
30
+ if (this.committedRanges.length === 0) return;
16
31
  // Sort by start index
17
- this.committedRanges.sort((a, b) => a.start - b.start);
32
+ this.committedRanges.sort((a, b)=>a.start - b.start);
18
33
  const merged = [];
19
34
  let current = this.committedRanges[0];
20
- for (let i = 1; i < this.committedRanges.length; i++) {
35
+ for(let i = 1; i < this.committedRanges.length; i++){
21
36
  const next = this.committedRanges[i];
22
- if (current.end >= next.start - 1) { // Overlap or adjacent
37
+ if (current.end >= next.start - 1) {
23
38
  current.end = Math.max(current.end, next.end);
24
- }
25
- else {
39
+ } else {
26
40
  merged.push(current);
27
41
  current = next;
28
42
  }
@@ -34,20 +48,22 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
34
48
  // Handle Enter (Submit)
35
49
  if (char === '\r' || char === '\n') {
36
50
  const choices = this.getFilteredChoices();
37
- if (choices.length === 0)
38
- return;
51
+ if (choices.length === 0) return;
39
52
  // If user was dragging, commit that range first
40
53
  if (this.anchorIndex !== null) {
41
54
  const start = Math.min(this.anchorIndex, this.selectedIndex);
42
55
  const end = Math.max(this.anchorIndex, this.selectedIndex);
43
- this.committedRanges.push({ start, end });
56
+ this.committedRanges.push({
57
+ start,
58
+ end
59
+ });
44
60
  this.mergeRanges();
45
61
  this.anchorIndex = null;
46
62
  }
47
63
  // Collect all indices from committed ranges
48
64
  const allIndices = new Set();
49
- for (const range of this.committedRanges) {
50
- for (let i = range.start; i <= range.end; i++) {
65
+ for (const range of this.committedRanges){
66
+ for(let i = range.start; i <= range.end; i++){
51
67
  allIndices.add(i);
52
68
  }
53
69
  }
@@ -55,8 +71,8 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
55
71
  allIndices.add(this.selectedIndex);
56
72
  }
57
73
  const selectedItems = [];
58
- const sortedIndices = Array.from(allIndices).sort((a, b) => a - b);
59
- for (const idx of sortedIndices) {
74
+ const sortedIndices = Array.from(allIndices).sort((a, b)=>a - b);
75
+ for (const idx of sortedIndices){
60
76
  if (idx < choices.length) {
61
77
  const choice = choices[idx];
62
78
  if (!this.isSeparator(choice)) {
@@ -72,12 +88,14 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
72
88
  if (this.anchorIndex === null) {
73
89
  // Start dragging
74
90
  this.anchorIndex = this.selectedIndex;
75
- }
76
- else {
91
+ } else {
77
92
  // Commit range
78
93
  const start = Math.min(this.anchorIndex, this.selectedIndex);
79
94
  const end = Math.max(this.anchorIndex, this.selectedIndex);
80
- this.committedRanges.push({ start, end });
95
+ this.committedRanges.push({
96
+ start,
97
+ end
98
+ });
81
99
  this.mergeRanges();
82
100
  this.anchorIndex = null;
83
101
  }
@@ -92,27 +110,24 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
92
110
  // Scroll Logic (inherited from SelectPrompt basically, but good to ensure)
93
111
  if (this.selectedIndex < this.scrollTop) {
94
112
  this.scrollTop = this.selectedIndex;
95
- }
96
- else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
113
+ } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
97
114
  this.scrollTop = this.selectedIndex - this.pageSize + 1;
98
115
  }
99
116
  if (this.scrollTop > choices.length - 1) {
100
117
  this.scrollTop = Math.max(0, choices.length - this.pageSize);
101
118
  }
102
119
  // Header
103
- const searchStr = this.searchBuffer ? ` ${theme_1.theme.muted}(Filter: ${this.searchBuffer})${ansi_1.ANSI.RESET}` : '';
104
- output += `${theme_1.theme.success}?${ansi_1.ANSI.RESET} ${ansi_1.ANSI.BOLD}${theme_1.theme.title}${this.options.message}${ansi_1.ANSI.RESET}${searchStr}\n`;
120
+ const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
121
+ output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
105
122
  if (choices.length === 0) {
106
- output += ` ${theme_1.theme.muted}No results found${ansi_1.ANSI.RESET}`;
107
- }
108
- else {
123
+ output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
124
+ } else {
109
125
  const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
110
- visibleChoices.forEach((choice, index) => {
126
+ visibleChoices.forEach((choice, index)=>{
111
127
  const actualIndex = this.scrollTop + index;
112
- if (index > 0)
113
- output += '\n';
128
+ if (index > 0) output += '\n';
114
129
  let isCommitted = false;
115
- for (const range of this.committedRanges) {
130
+ for (const range of this.committedRanges){
116
131
  if (actualIndex >= range.start && actualIndex <= range.end) {
117
132
  isCommitted = true;
118
133
  break;
@@ -127,45 +142,48 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
127
142
  }
128
143
  }
129
144
  if (this.isSeparator(choice)) {
130
- output += ` ${ansi_1.ANSI.DIM}${choice.text || symbols_1.symbols.line.repeat(8)}${ansi_1.ANSI.RESET}`;
131
- }
132
- else {
145
+ output += ` ${_ansi.ANSI.DIM}${choice.text || _symbols.symbols.line.repeat(8)}${_ansi.ANSI.RESET}`;
146
+ } else {
133
147
  let prefix = ' ';
134
148
  const title = choice.title;
135
149
  let content = title;
136
150
  // Markers
137
151
  if (actualIndex === this.anchorIndex) {
138
- prefix = `${theme_1.theme.muted}> ${ansi_1.ANSI.RESET}`;
152
+ prefix = `${_theme.theme.muted}> ${_ansi.ANSI.RESET}`;
139
153
  }
140
154
  if (actualIndex === this.selectedIndex) {
141
- prefix = `${theme_1.theme.main}${symbols_1.symbols.pointer} `;
155
+ prefix = `${_theme.theme.main}${_symbols.symbols.pointer} `;
142
156
  }
143
157
  if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {
144
- prefix = `${theme_1.theme.main}${symbols_1.symbols.pointer}>`;
158
+ prefix = `${_theme.theme.main}${_symbols.symbols.pointer}>`;
145
159
  }
146
160
  // Highlighting
147
161
  if (isCommitted || isDragging) {
148
162
  // Apply highlighting style
149
163
  // If committed, maybe green? If dragging, maybe yellow or just highlighted?
150
164
  if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {
151
- prefix = `${theme_1.theme.success}* ${ansi_1.ANSI.RESET}`;
165
+ prefix = `${_theme.theme.success}* ${_ansi.ANSI.RESET}`;
152
166
  }
153
- content = `${theme_1.theme.success}${title}${ansi_1.ANSI.RESET}`;
167
+ content = `${_theme.theme.success}${title}${_ansi.ANSI.RESET}`;
154
168
  if (isDragging && !isCommitted) {
155
- // Distinguish dragging visual? Maybe dim?
156
- // Using same style as single range prompt for consistency
169
+ // Distinguish dragging visual? Maybe dim?
170
+ // Using same style as single range prompt for consistency
157
171
  }
158
172
  }
159
173
  // Cursor Underline
160
174
  if (actualIndex === this.selectedIndex) {
161
- content = `${ansi_1.ANSI.UNDERLINE}${content}${ansi_1.ANSI.RESET}`;
175
+ content = `${_ansi.ANSI.UNDERLINE}${content}${_ansi.ANSI.RESET}`;
162
176
  }
163
177
  output += `${prefix}${content}`;
164
178
  }
165
179
  });
166
180
  }
167
- output += `\n${theme_1.theme.muted}(Space to anchor/commit, Enter to submit)${ansi_1.ANSI.RESET}`;
181
+ output += `\n${_theme.theme.muted}(Space to anchor/commit, Enter to submit)${_ansi.ANSI.RESET}`;
168
182
  this.renderFrame(output);
169
183
  }
170
- }
171
- exports.MultiRangePrompt = MultiRangePrompt;
184
+ constructor(options){
185
+ super(options), _define_property(this, "committedRanges", []);
186
+ }
187
+ };
188
+
189
+ //# sourceMappingURL=multi-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/multi-range.ts"],"sourcesContent":["import { SelectRangePrompt } from './select-range';\nimport { SelectRangeOptions } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { symbols } from '../symbols';\n\nexport class MultiRangePrompt<V> extends SelectRangePrompt<V> {\n private committedRanges: { start: number; end: number }[] = [];\n\n constructor(options: SelectRangeOptions<V>) {\n super(options);\n }\n\n private mergeRanges() {\n if (this.committedRanges.length === 0) return;\n\n // Sort by start index\n this.committedRanges.sort((a, b) => a.start - b.start);\n\n const merged: { start: number; end: number }[] = [];\n let current = this.committedRanges[0];\n\n for (let i = 1; i < this.committedRanges.length; i++) {\n const next = this.committedRanges[i];\n\n if (current.end >= next.start - 1) { // Overlap or adjacent\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n merged.push(current);\n this.committedRanges = merged;\n }\n\n protected handleInput(char: string, key?: Buffer) {\n // Handle Enter (Submit)\n if (char === '\\r' || char === '\\n') {\n const choices = this.getFilteredChoices();\n if (choices.length === 0) return;\n\n // If user was dragging, commit that range first\n if (this.anchorIndex !== null) {\n const start = Math.min(this.anchorIndex, this.selectedIndex);\n const end = Math.max(this.anchorIndex, this.selectedIndex);\n this.committedRanges.push({ start, end });\n this.mergeRanges();\n this.anchorIndex = null;\n }\n\n // Collect all indices from committed ranges\n const allIndices = new Set<number>();\n for (const range of this.committedRanges) {\n for (let i = range.start; i <= range.end; i++) {\n allIndices.add(i);\n }\n }\n\n if (allIndices.size === 0) {\n allIndices.add(this.selectedIndex);\n }\n\n const selectedItems: V[] = [];\n const sortedIndices = Array.from(allIndices).sort((a, b) => a - b);\n\n for (const idx of sortedIndices) {\n if (idx < choices.length) {\n const choice = choices[idx];\n if (!this.isSeparator(choice)) {\n selectedItems.push((choice as any).value);\n }\n }\n }\n\n this.submit(selectedItems as any);\n return;\n }\n\n // Handle Space (Anchor/Commit)\n if (char === ' ') {\n if (this.anchorIndex === null) {\n // Start dragging\n this.anchorIndex = this.selectedIndex;\n } else {\n // Commit range\n const start = Math.min(this.anchorIndex, this.selectedIndex);\n const end = Math.max(this.anchorIndex, this.selectedIndex);\n\n this.committedRanges.push({ start, end });\n this.mergeRanges();\n\n this.anchorIndex = null;\n }\n this.render(false);\n return;\n }\n super.handleInput(char, key);\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Scroll Logic (inherited from SelectPrompt basically, but good to ensure)\n if (this.selectedIndex < this.scrollTop) {\n this.scrollTop = this.selectedIndex;\n } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.selectedIndex - this.pageSize + 1;\n }\n if (this.scrollTop > choices.length - 1) {\n this.scrollTop = Math.max(0, choices.length - this.pageSize);\n }\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n } else {\n const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleChoices.forEach((choice, index) => {\n const actualIndex = this.scrollTop + index;\n if (index > 0) output += '\\n';\n\n let isCommitted = false;\n for (const range of this.committedRanges) {\n if (actualIndex >= range.start && actualIndex <= range.end) {\n isCommitted = true;\n break;\n }\n }\n\n let isDragging = false;\n if (this.anchorIndex !== null) {\n const min = Math.min(this.anchorIndex, this.selectedIndex);\n const max = Math.max(this.anchorIndex, this.selectedIndex);\n if (actualIndex >= min && actualIndex <= max) {\n isDragging = true;\n }\n }\n\n if (this.isSeparator(choice)) {\n output += ` ${ANSI.DIM}${(choice as any).text || symbols.line.repeat(8)}${ANSI.RESET}`;\n } else {\n let prefix = ' ';\n const title = (choice as any).title;\n let content = title;\n\n // Markers\n if (actualIndex === this.anchorIndex) {\n prefix = `${theme.muted}> ${ANSI.RESET}`;\n }\n if (actualIndex === this.selectedIndex) {\n prefix = `${theme.main}${symbols.pointer} `;\n }\n if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {\n prefix = `${theme.main}${symbols.pointer}>`;\n }\n\n // Highlighting\n if (isCommitted || isDragging) {\n // Apply highlighting style\n // If committed, maybe green? If dragging, maybe yellow or just highlighted?\n\n if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {\n prefix = `${theme.success}* ${ANSI.RESET}`;\n }\n\n content = `${theme.success}${title}${ANSI.RESET}`;\n\n if (isDragging && !isCommitted) {\n // Distinguish dragging visual? Maybe dim? \n // Using same style as single range prompt for consistency\n }\n }\n\n // Cursor Underline\n if (actualIndex === this.selectedIndex) {\n content = `${ANSI.UNDERLINE}${content}${ANSI.RESET}`;\n }\n\n output += `${prefix}${content}`;\n }\n });\n }\n\n output += `\\n${theme.muted}(Space to anchor/commit, Enter to submit)${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n}\n"],"names":["MultiRangePrompt","SelectRangePrompt","mergeRanges","committedRanges","length","sort","a","b","start","merged","current","i","next","end","Math","max","push","handleInput","char","key","choices","getFilteredChoices","anchorIndex","min","selectedIndex","allIndices","Set","range","add","size","selectedItems","sortedIndices","Array","from","idx","choice","isSeparator","value","submit","render","_firstRender","output","scrollTop","pageSize","searchStr","searchBuffer","theme","muted","ANSI","RESET","success","BOLD","title","options","message","visibleChoices","slice","forEach","index","actualIndex","isCommitted","isDragging","DIM","text","symbols","line","repeat","prefix","content","main","pointer","UNDERLINE","renderFrame"],"mappings":"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"}