@zaly/tui 0.0.4

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 (228) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/assets/schemas/theme.schema.json +899 -0
  4. package/assets/themes/LICENSE-tokyonight.txt +201 -0
  5. package/assets/themes/NOTICES.md +69 -0
  6. package/assets/themes/ayu-dark.json +119 -0
  7. package/assets/themes/catppuccin-frappe.json +124 -0
  8. package/assets/themes/catppuccin-latte.json +124 -0
  9. package/assets/themes/catppuccin-macchiato.json +124 -0
  10. package/assets/themes/catppuccin-mocha.json +124 -0
  11. package/assets/themes/dracula-soft.json +119 -0
  12. package/assets/themes/dracula.json +119 -0
  13. package/assets/themes/everforest-dark.json +118 -0
  14. package/assets/themes/everforest-light.json +118 -0
  15. package/assets/themes/github-dark.json +123 -0
  16. package/assets/themes/github-light.json +123 -0
  17. package/assets/themes/gruvbox-dark-medium.json +112 -0
  18. package/assets/themes/kanagawa-dragon.json +115 -0
  19. package/assets/themes/kanagawa-wave.json +115 -0
  20. package/assets/themes/material-theme-palenight.json +114 -0
  21. package/assets/themes/min-dark.json +55 -0
  22. package/assets/themes/min-light.json +59 -0
  23. package/assets/themes/monokai.json +116 -0
  24. package/assets/themes/night-owl.json +116 -0
  25. package/assets/themes/nord.json +101 -0
  26. package/assets/themes/one-dark-pro.json +110 -0
  27. package/assets/themes/one-light.json +108 -0
  28. package/assets/themes/poimandres.json +123 -0
  29. package/assets/themes/rose-pine.json +98 -0
  30. package/assets/themes/solarized-dark.json +116 -0
  31. package/assets/themes/solarized-light.json +116 -0
  32. package/assets/themes/synthwave-84.json +100 -0
  33. package/assets/themes/tokyonight-day.json +157 -0
  34. package/assets/themes/tokyonight-moon.json +157 -0
  35. package/assets/themes/tokyonight-night.json +157 -0
  36. package/assets/themes/tokyonight-storm.json +157 -0
  37. package/assets/themes/vesper.json +103 -0
  38. package/assets/themes/vitesse-dark.json +126 -0
  39. package/assets/themes/vitesse-light.json +126 -0
  40. package/dist/ansi-Clq0ozyA.mjs +206 -0
  41. package/dist/ansi-Clq0ozyA.mjs.map +1 -0
  42. package/dist/ansi.d.mts +48 -0
  43. package/dist/ansi.d.mts.map +1 -0
  44. package/dist/ansi.mjs +2 -0
  45. package/dist/autocomplete-Dfw-yQDa.d.mts +100 -0
  46. package/dist/autocomplete-Dfw-yQDa.d.mts.map +1 -0
  47. package/dist/box-DyaByEiG.mjs +386 -0
  48. package/dist/box-DyaByEiG.mjs.map +1 -0
  49. package/dist/builder-D49ECBEf.mjs +385 -0
  50. package/dist/builder-D49ECBEf.mjs.map +1 -0
  51. package/dist/callbacks-CNjGNxVw.mjs +279 -0
  52. package/dist/callbacks-CNjGNxVw.mjs.map +1 -0
  53. package/dist/client-D6C_uczF.mjs +142 -0
  54. package/dist/client-D6C_uczF.mjs.map +1 -0
  55. package/dist/clipboard.d.mts +104 -0
  56. package/dist/clipboard.d.mts.map +1 -0
  57. package/dist/clipboard.mjs +404 -0
  58. package/dist/clipboard.mjs.map +1 -0
  59. package/dist/flex-Bguo-fUe.mjs +202 -0
  60. package/dist/flex-Bguo-fUe.mjs.map +1 -0
  61. package/dist/image-Cm5T-uw-.mjs +108 -0
  62. package/dist/image-Cm5T-uw-.mjs.map +1 -0
  63. package/dist/image.d.mts +123 -0
  64. package/dist/image.d.mts.map +1 -0
  65. package/dist/image.mjs +2 -0
  66. package/dist/index.d.mts +64 -0
  67. package/dist/index.d.mts.map +1 -0
  68. package/dist/index.mjs +222 -0
  69. package/dist/index.mjs.map +1 -0
  70. package/dist/input-B5Vy-iaa.d.mts +141 -0
  71. package/dist/input-B5Vy-iaa.d.mts.map +1 -0
  72. package/dist/inspect-D1d9t-ni.mjs +101 -0
  73. package/dist/inspect-D1d9t-ni.mjs.map +1 -0
  74. package/dist/inspect-D6FW_QUo.d.mts +67 -0
  75. package/dist/inspect-D6FW_QUo.d.mts.map +1 -0
  76. package/dist/kitty-JbCJC0iQ.mjs +673 -0
  77. package/dist/kitty-JbCJC0iQ.mjs.map +1 -0
  78. package/dist/markdown.d.mts +24 -0
  79. package/dist/markdown.d.mts.map +1 -0
  80. package/dist/markdown.mjs +2 -0
  81. package/dist/md.bun.d.mts +14 -0
  82. package/dist/md.bun.d.mts.map +1 -0
  83. package/dist/md.bun.mjs +28 -0
  84. package/dist/md.bun.mjs.map +1 -0
  85. package/dist/md.node.d.mts +14 -0
  86. package/dist/md.node.d.mts.map +1 -0
  87. package/dist/md.node.mjs +126 -0
  88. package/dist/md.node.mjs.map +1 -0
  89. package/dist/node-BZ7f6HzU.mjs +316 -0
  90. package/dist/node-BZ7f6HzU.mjs.map +1 -0
  91. package/dist/picker-D8OLb6kZ.d.mts +36 -0
  92. package/dist/picker-D8OLb6kZ.d.mts.map +1 -0
  93. package/dist/picker-ndVVt6qF.mjs +621 -0
  94. package/dist/picker-ndVVt6qF.mjs.map +1 -0
  95. package/dist/queries-DH3bj74K.d.mts +1963 -0
  96. package/dist/queries-DH3bj74K.d.mts.map +1 -0
  97. package/dist/reactive-f7NpAi69.mjs +623 -0
  98. package/dist/reactive-f7NpAi69.mjs.map +1 -0
  99. package/dist/registry-U654j61Y.mjs +356 -0
  100. package/dist/registry-U654j61Y.mjs.map +1 -0
  101. package/dist/render-DxVLqqB9.mjs +74 -0
  102. package/dist/render-DxVLqqB9.mjs.map +1 -0
  103. package/dist/renderer-CdLCkJB-.mjs +42 -0
  104. package/dist/renderer-CdLCkJB-.mjs.map +1 -0
  105. package/dist/renderer-CxL4xbkl.mjs +2644 -0
  106. package/dist/renderer-CxL4xbkl.mjs.map +1 -0
  107. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  108. package/dist/search-FvGnswRl.d.mts +49 -0
  109. package/dist/search-FvGnswRl.d.mts.map +1 -0
  110. package/dist/select-CbmAZdpt.d.mts +116 -0
  111. package/dist/select-CbmAZdpt.d.mts.map +1 -0
  112. package/dist/services/logger.d.mts +2 -0
  113. package/dist/services/logger.mjs +71 -0
  114. package/dist/services/logger.mjs.map +1 -0
  115. package/dist/services/notifier.d.mts +17 -0
  116. package/dist/services/notifier.d.mts.map +1 -0
  117. package/dist/services/notifier.mjs +71 -0
  118. package/dist/services/notifier.mjs.map +1 -0
  119. package/dist/services/picker.d.mts +36 -0
  120. package/dist/services/picker.d.mts.map +1 -0
  121. package/dist/services/picker.mjs +137 -0
  122. package/dist/services/picker.mjs.map +1 -0
  123. package/dist/services/prompt.d.mts +30 -0
  124. package/dist/services/prompt.d.mts.map +1 -0
  125. package/dist/services/prompt.mjs +83 -0
  126. package/dist/services/prompt.mjs.map +1 -0
  127. package/dist/shiki-BrjVUkeh.mjs +423 -0
  128. package/dist/shiki-BrjVUkeh.mjs.map +1 -0
  129. package/dist/size-D8JogYLy.mjs +34 -0
  130. package/dist/size-D8JogYLy.mjs.map +1 -0
  131. package/dist/style.d.mts +10 -0
  132. package/dist/style.d.mts.map +1 -0
  133. package/dist/style.mjs +4 -0
  134. package/dist/text.d.mts +33 -0
  135. package/dist/text.d.mts.map +1 -0
  136. package/dist/text.mjs +111 -0
  137. package/dist/text.mjs.map +1 -0
  138. package/dist/theme.config-CU3B50HN.mjs +832 -0
  139. package/dist/theme.config-CU3B50HN.mjs.map +1 -0
  140. package/dist/themes.d.mts +113 -0
  141. package/dist/themes.d.mts.map +1 -0
  142. package/dist/themes.mjs +2 -0
  143. package/dist/tree-C28QOVIK.d.mts +23 -0
  144. package/dist/tree-C28QOVIK.d.mts.map +1 -0
  145. package/dist/types-B9Eh7k2v.d.mts +212 -0
  146. package/dist/types-B9Eh7k2v.d.mts.map +1 -0
  147. package/dist/types-D3jk1rtk.d.mts +140 -0
  148. package/dist/types-D3jk1rtk.d.mts.map +1 -0
  149. package/dist/utils-3M4D_AXZ.mjs +40 -0
  150. package/dist/utils-3M4D_AXZ.mjs.map +1 -0
  151. package/dist/widgets/autocomplete.d.mts +2 -0
  152. package/dist/widgets/autocomplete.mjs +165 -0
  153. package/dist/widgets/autocomplete.mjs.map +1 -0
  154. package/dist/widgets/box.d.mts +2 -0
  155. package/dist/widgets/box.mjs +2 -0
  156. package/dist/widgets/code.d.mts +48 -0
  157. package/dist/widgets/code.d.mts.map +1 -0
  158. package/dist/widgets/code.mjs +59 -0
  159. package/dist/widgets/code.mjs.map +1 -0
  160. package/dist/widgets/completions/actions.d.mts +41 -0
  161. package/dist/widgets/completions/actions.d.mts.map +1 -0
  162. package/dist/widgets/completions/actions.mjs +48 -0
  163. package/dist/widgets/completions/actions.mjs.map +1 -0
  164. package/dist/widgets/completions/files.d.mts +29 -0
  165. package/dist/widgets/completions/files.d.mts.map +1 -0
  166. package/dist/widgets/completions/files.mjs +42 -0
  167. package/dist/widgets/completions/files.mjs.map +1 -0
  168. package/dist/widgets/completions/github.d.mts +64 -0
  169. package/dist/widgets/completions/github.d.mts.map +1 -0
  170. package/dist/widgets/completions/github.mjs +137 -0
  171. package/dist/widgets/completions/github.mjs.map +1 -0
  172. package/dist/widgets/completions/index.d.mts +4 -0
  173. package/dist/widgets/completions/index.mjs +4 -0
  174. package/dist/widgets/diff.d.mts +57 -0
  175. package/dist/widgets/diff.d.mts.map +1 -0
  176. package/dist/widgets/diff.mjs +199 -0
  177. package/dist/widgets/diff.mjs.map +1 -0
  178. package/dist/widgets/divider.d.mts +11 -0
  179. package/dist/widgets/divider.d.mts.map +1 -0
  180. package/dist/widgets/divider.mjs +9 -0
  181. package/dist/widgets/divider.mjs.map +1 -0
  182. package/dist/widgets/image.d.mts +37 -0
  183. package/dist/widgets/image.d.mts.map +1 -0
  184. package/dist/widgets/image.mjs +77 -0
  185. package/dist/widgets/image.mjs.map +1 -0
  186. package/dist/widgets/input.d.mts +2 -0
  187. package/dist/widgets/input.mjs +497 -0
  188. package/dist/widgets/input.mjs.map +1 -0
  189. package/dist/widgets/log.d.mts +2 -0
  190. package/dist/widgets/log.mjs +130 -0
  191. package/dist/widgets/log.mjs.map +1 -0
  192. package/dist/widgets/markdown.d.mts +45 -0
  193. package/dist/widgets/markdown.d.mts.map +1 -0
  194. package/dist/widgets/markdown.mjs +124 -0
  195. package/dist/widgets/markdown.mjs.map +1 -0
  196. package/dist/widgets/overlay.d.mts +2 -0
  197. package/dist/widgets/overlay.mjs +18 -0
  198. package/dist/widgets/overlay.mjs.map +1 -0
  199. package/dist/widgets/picker.d.mts +2 -0
  200. package/dist/widgets/picker.mjs +2 -0
  201. package/dist/widgets/progress.d.mts +48 -0
  202. package/dist/widgets/progress.d.mts.map +1 -0
  203. package/dist/widgets/progress.mjs +48 -0
  204. package/dist/widgets/progress.mjs.map +1 -0
  205. package/dist/widgets/select.d.mts +2 -0
  206. package/dist/widgets/select.mjs +195 -0
  207. package/dist/widgets/select.mjs.map +1 -0
  208. package/dist/widgets/show.d.mts +55 -0
  209. package/dist/widgets/show.d.mts.map +1 -0
  210. package/dist/widgets/show.mjs +85 -0
  211. package/dist/widgets/show.mjs.map +1 -0
  212. package/dist/widgets/spinner.d.mts +65 -0
  213. package/dist/widgets/spinner.d.mts.map +1 -0
  214. package/dist/widgets/spinner.mjs +147 -0
  215. package/dist/widgets/spinner.mjs.map +1 -0
  216. package/dist/widgets/text.d.mts +2 -0
  217. package/dist/widgets/text.mjs +32 -0
  218. package/dist/widgets/text.mjs.map +1 -0
  219. package/dist/widgets/tree.d.mts +2 -0
  220. package/dist/widgets/tree.mjs +73 -0
  221. package/dist/widgets/tree.mjs.map +1 -0
  222. package/dist/widgets/widget.d.mts +49 -0
  223. package/dist/widgets/widget.d.mts.map +1 -0
  224. package/dist/widgets/widget.mjs +40 -0
  225. package/dist/widgets/widget.mjs.map +1 -0
  226. package/dist/worker-DjHuQSbY.mjs +27 -0
  227. package/dist/worker-DjHuQSbY.mjs.map +1 -0
  228. package/package.json +117 -0
@@ -0,0 +1,423 @@
1
+ import { hasColors } from "@zaly/shared/env";
2
+ //#region src/schemas/gen/shiki.ts
3
+ const lang = (() => {
4
+ const _iv1 = /* @__PURE__ */ new Set([
5
+ "1c",
6
+ "1c-query",
7
+ "abap",
8
+ "actionscript-3",
9
+ "ada",
10
+ "adoc",
11
+ "angular-html",
12
+ "angular-ts",
13
+ "apache",
14
+ "apex",
15
+ "apl",
16
+ "applescript",
17
+ "ara",
18
+ "asciidoc",
19
+ "asm",
20
+ "astro",
21
+ "awk",
22
+ "ballerina",
23
+ "bash",
24
+ "bat",
25
+ "batch",
26
+ "be",
27
+ "beancount",
28
+ "berry",
29
+ "bibtex",
30
+ "bicep",
31
+ "bird",
32
+ "bird2",
33
+ "blade",
34
+ "bsl",
35
+ "c",
36
+ "c#",
37
+ "c++",
38
+ "c3",
39
+ "cadence",
40
+ "cairo",
41
+ "cdc",
42
+ "cjs",
43
+ "clarity",
44
+ "clj",
45
+ "clojure",
46
+ "closure-templates",
47
+ "cmake",
48
+ "cmd",
49
+ "cobol",
50
+ "codeowners",
51
+ "codeql",
52
+ "coffee",
53
+ "coffeescript",
54
+ "common-lisp",
55
+ "console",
56
+ "coq",
57
+ "cpp",
58
+ "cql",
59
+ "crystal",
60
+ "cs",
61
+ "csharp",
62
+ "css",
63
+ "csv",
64
+ "cts",
65
+ "cue",
66
+ "cypher",
67
+ "d",
68
+ "dart",
69
+ "dax",
70
+ "desktop",
71
+ "diff",
72
+ "docker",
73
+ "dockerfile",
74
+ "dotenv",
75
+ "dream-maker",
76
+ "edge",
77
+ "elisp",
78
+ "elixir",
79
+ "elm",
80
+ "emacs-lisp",
81
+ "erb",
82
+ "erl",
83
+ "erlang",
84
+ "f",
85
+ "f#",
86
+ "f03",
87
+ "f08",
88
+ "f18",
89
+ "f77",
90
+ "f90",
91
+ "f95",
92
+ "fennel",
93
+ "fish",
94
+ "fluent",
95
+ "for",
96
+ "fortran-fixed-form",
97
+ "fortran-free-form",
98
+ "fs",
99
+ "fsharp",
100
+ "fsl",
101
+ "ftl",
102
+ "gd",
103
+ "gdresource",
104
+ "gdscript",
105
+ "gdshader",
106
+ "genie",
107
+ "gherkin",
108
+ "git-commit",
109
+ "git-rebase",
110
+ "gjs",
111
+ "gleam",
112
+ "glimmer-js",
113
+ "glimmer-ts",
114
+ "glsl",
115
+ "gn",
116
+ "gnuplot",
117
+ "go",
118
+ "gql",
119
+ "graphql",
120
+ "groovy",
121
+ "gts",
122
+ "hack",
123
+ "haml",
124
+ "handlebars",
125
+ "haskell",
126
+ "haxe",
127
+ "hbs",
128
+ "hcl",
129
+ "hjson",
130
+ "hlsl",
131
+ "hs",
132
+ "html",
133
+ "html-derivative",
134
+ "http",
135
+ "hurl",
136
+ "hxml",
137
+ "hy",
138
+ "imba",
139
+ "ini",
140
+ "jade",
141
+ "java",
142
+ "javascript",
143
+ "jinja",
144
+ "jison",
145
+ "jl",
146
+ "js",
147
+ "json",
148
+ "json5",
149
+ "jsonc",
150
+ "jsonl",
151
+ "jsonnet",
152
+ "jssm",
153
+ "jsx",
154
+ "julia",
155
+ "just",
156
+ "kdl",
157
+ "kotlin",
158
+ "kql",
159
+ "kt",
160
+ "kts",
161
+ "kusto",
162
+ "latex",
163
+ "lean",
164
+ "lean4",
165
+ "less",
166
+ "liquid",
167
+ "lisp",
168
+ "lit",
169
+ "llvm",
170
+ "log",
171
+ "logo",
172
+ "lua",
173
+ "luau",
174
+ "make",
175
+ "makefile",
176
+ "markdown",
177
+ "marko",
178
+ "matlab",
179
+ "mbt",
180
+ "mbti",
181
+ "md",
182
+ "mdc",
183
+ "mdx",
184
+ "mediawiki",
185
+ "mermaid",
186
+ "mips",
187
+ "mipsasm",
188
+ "mjs",
189
+ "mmd",
190
+ "mojo",
191
+ "moonbit",
192
+ "move",
193
+ "mts",
194
+ "nar",
195
+ "narrat",
196
+ "nextflow",
197
+ "nextflow-groovy",
198
+ "nf",
199
+ "nginx",
200
+ "nim",
201
+ "nix",
202
+ "nu",
203
+ "nushell",
204
+ "objc",
205
+ "objective-c",
206
+ "objective-cpp",
207
+ "ocaml",
208
+ "odin",
209
+ "openscad",
210
+ "pascal",
211
+ "perl",
212
+ "perl6",
213
+ "php",
214
+ "pkl",
215
+ "plsql",
216
+ "po",
217
+ "polar",
218
+ "postcss",
219
+ "pot",
220
+ "potx",
221
+ "powerquery",
222
+ "powershell",
223
+ "prisma",
224
+ "prolog",
225
+ "properties",
226
+ "proto",
227
+ "protobuf",
228
+ "ps",
229
+ "ps1",
230
+ "pug",
231
+ "puppet",
232
+ "purescript",
233
+ "py",
234
+ "python",
235
+ "ql",
236
+ "qml",
237
+ "qmldir",
238
+ "qss",
239
+ "r",
240
+ "racket",
241
+ "raku",
242
+ "razor",
243
+ "rb",
244
+ "reg",
245
+ "regex",
246
+ "regexp",
247
+ "rel",
248
+ "riscv",
249
+ "ron",
250
+ "rosmsg",
251
+ "rs",
252
+ "rst",
253
+ "ruby",
254
+ "rust",
255
+ "sas",
256
+ "sass",
257
+ "scad",
258
+ "scala",
259
+ "scheme",
260
+ "scss",
261
+ "sdbl",
262
+ "sh",
263
+ "shader",
264
+ "shaderlab",
265
+ "shell",
266
+ "shellscript",
267
+ "shellsession",
268
+ "smalltalk",
269
+ "solidity",
270
+ "soy",
271
+ "sparql",
272
+ "spl",
273
+ "splunk",
274
+ "sql",
275
+ "ssh-config",
276
+ "stata",
277
+ "styl",
278
+ "stylus",
279
+ "surql",
280
+ "surrealql",
281
+ "svelte",
282
+ "swift",
283
+ "system-verilog",
284
+ "systemd",
285
+ "talon",
286
+ "talonscript",
287
+ "tasl",
288
+ "tcl",
289
+ "templ",
290
+ "terraform",
291
+ "tex",
292
+ "tf",
293
+ "tfvars",
294
+ "toml",
295
+ "tres",
296
+ "ts",
297
+ "ts-tags",
298
+ "tscn",
299
+ "tsp",
300
+ "tsv",
301
+ "tsx",
302
+ "turtle",
303
+ "twig",
304
+ "typ",
305
+ "typescript",
306
+ "typespec",
307
+ "typst",
308
+ "v",
309
+ "vala",
310
+ "vb",
311
+ "verilog",
312
+ "vhdl",
313
+ "vim",
314
+ "viml",
315
+ "vimscript",
316
+ "vue",
317
+ "vue-html",
318
+ "vue-vine",
319
+ "vy",
320
+ "vyper",
321
+ "wasm",
322
+ "wenyan",
323
+ "wgsl",
324
+ "wiki",
325
+ "wikitext",
326
+ "wit",
327
+ "wl",
328
+ "wolfram",
329
+ "xml",
330
+ "xsl",
331
+ "yaml",
332
+ "yml",
333
+ "zenscript",
334
+ "zig",
335
+ "zsh",
336
+ "文言"
337
+ ]);
338
+ return (input) => true === _iv1.has(input);
339
+ })();
340
+ (() => {
341
+ const _iv1 = /* @__PURE__ */ new Set([
342
+ "andromeeda",
343
+ "aurora-x",
344
+ "ayu-dark",
345
+ "ayu-light",
346
+ "ayu-mirage",
347
+ "catppuccin-frappe",
348
+ "catppuccin-latte",
349
+ "catppuccin-macchiato",
350
+ "catppuccin-mocha",
351
+ "dark-plus",
352
+ "dracula",
353
+ "dracula-soft",
354
+ "everforest-dark",
355
+ "everforest-light",
356
+ "github-dark",
357
+ "github-dark-default",
358
+ "github-dark-dimmed",
359
+ "github-dark-high-contrast",
360
+ "github-light",
361
+ "github-light-default",
362
+ "github-light-high-contrast",
363
+ "gruvbox-dark-hard",
364
+ "gruvbox-dark-medium",
365
+ "gruvbox-dark-soft",
366
+ "gruvbox-light-hard",
367
+ "gruvbox-light-medium",
368
+ "gruvbox-light-soft",
369
+ "horizon",
370
+ "horizon-bright",
371
+ "houston",
372
+ "kanagawa-dragon",
373
+ "kanagawa-lotus",
374
+ "kanagawa-wave",
375
+ "laserwave",
376
+ "light-plus",
377
+ "material-theme",
378
+ "material-theme-darker",
379
+ "material-theme-lighter",
380
+ "material-theme-ocean",
381
+ "material-theme-palenight",
382
+ "min-dark",
383
+ "min-light",
384
+ "monokai",
385
+ "night-owl",
386
+ "night-owl-light",
387
+ "nord",
388
+ "one-dark-pro",
389
+ "one-light",
390
+ "plastic",
391
+ "poimandres",
392
+ "red",
393
+ "rose-pine",
394
+ "rose-pine-dawn",
395
+ "rose-pine-moon",
396
+ "slack-dark",
397
+ "slack-ochin",
398
+ "snazzy-light",
399
+ "solarized-dark",
400
+ "solarized-light",
401
+ "synthwave-84",
402
+ "tokyo-night",
403
+ "vesper",
404
+ "vitesse-black",
405
+ "vitesse-dark",
406
+ "vitesse-light"
407
+ ]);
408
+ return (input) => true === _iv1.has(input);
409
+ })();
410
+ function isShikiLang(input) {
411
+ return lang(input);
412
+ }
413
+ //#endregion
414
+ //#region src/shiki/shiki.ts
415
+ async function codeToAnsi(code, lang, opts) {
416
+ if (!hasColors || !lang || !isShikiLang(lang)) return code;
417
+ const { shikiWorker } = await import("./client-D6C_uczF.mjs").then((n) => n.t);
418
+ return (await shikiWorker.highlight(code, lang, opts)).value;
419
+ }
420
+ //#endregion
421
+ export { isShikiLang as n, codeToAnsi as t };
422
+
423
+ //# sourceMappingURL=shiki-BrjVUkeh.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shiki-BrjVUkeh.mjs","names":[],"sources":["../src/schemas/gen/shiki.ts","../src/shiki/shiki.ts"],"sourcesContent":["import type { ShikiLanguage, ShikiTheme } from \"../../shiki/types.ts\";\nconst lang = (() => { const _iv1 = new Set([\"1c\", \"1c-query\", \"abap\", \"actionscript-3\", \"ada\", \"adoc\", \"angular-html\", \"angular-ts\", \"apache\", \"apex\", \"apl\", \"applescript\", \"ara\", \"asciidoc\", \"asm\", \"astro\", \"awk\", \"ballerina\", \"bash\", \"bat\", \"batch\", \"be\", \"beancount\", \"berry\", \"bibtex\", \"bicep\", \"bird\", \"bird2\", \"blade\", \"bsl\", \"c\", \"c#\", \"c++\", \"c3\", \"cadence\", \"cairo\", \"cdc\", \"cjs\", \"clarity\", \"clj\", \"clojure\", \"closure-templates\", \"cmake\", \"cmd\", \"cobol\", \"codeowners\", \"codeql\", \"coffee\", \"coffeescript\", \"common-lisp\", \"console\", \"coq\", \"cpp\", \"cql\", \"crystal\", \"cs\", \"csharp\", \"css\", \"csv\", \"cts\", \"cue\", \"cypher\", \"d\", \"dart\", \"dax\", \"desktop\", \"diff\", \"docker\", \"dockerfile\", \"dotenv\", \"dream-maker\", \"edge\", \"elisp\", \"elixir\", \"elm\", \"emacs-lisp\", \"erb\", \"erl\", \"erlang\", \"f\", \"f#\", \"f03\", \"f08\", \"f18\", \"f77\", \"f90\", \"f95\", \"fennel\", \"fish\", \"fluent\", \"for\", \"fortran-fixed-form\", \"fortran-free-form\", \"fs\", \"fsharp\", \"fsl\", \"ftl\", \"gd\", \"gdresource\", \"gdscript\", \"gdshader\", \"genie\", \"gherkin\", \"git-commit\", \"git-rebase\", \"gjs\", \"gleam\", \"glimmer-js\", \"glimmer-ts\", \"glsl\", \"gn\", \"gnuplot\", \"go\", \"gql\", \"graphql\", \"groovy\", \"gts\", \"hack\", \"haml\", \"handlebars\", \"haskell\", \"haxe\", \"hbs\", \"hcl\", \"hjson\", \"hlsl\", \"hs\", \"html\", \"html-derivative\", \"http\", \"hurl\", \"hxml\", \"hy\", \"imba\", \"ini\", \"jade\", \"java\", \"javascript\", \"jinja\", \"jison\", \"jl\", \"js\", \"json\", \"json5\", \"jsonc\", \"jsonl\", \"jsonnet\", \"jssm\", \"jsx\", \"julia\", \"just\", \"kdl\", \"kotlin\", \"kql\", \"kt\", \"kts\", \"kusto\", \"latex\", \"lean\", \"lean4\", \"less\", \"liquid\", \"lisp\", \"lit\", \"llvm\", \"log\", \"logo\", \"lua\", \"luau\", \"make\", \"makefile\", \"markdown\", \"marko\", \"matlab\", \"mbt\", \"mbti\", \"md\", \"mdc\", \"mdx\", \"mediawiki\", \"mermaid\", \"mips\", \"mipsasm\", \"mjs\", \"mmd\", \"mojo\", \"moonbit\", \"move\", \"mts\", \"nar\", \"narrat\", \"nextflow\", \"nextflow-groovy\", \"nf\", \"nginx\", \"nim\", \"nix\", \"nu\", \"nushell\", \"objc\", \"objective-c\", \"objective-cpp\", \"ocaml\", \"odin\", \"openscad\", \"pascal\", \"perl\", \"perl6\", \"php\", \"pkl\", \"plsql\", \"po\", \"polar\", \"postcss\", \"pot\", \"potx\", \"powerquery\", \"powershell\", \"prisma\", \"prolog\", \"properties\", \"proto\", \"protobuf\", \"ps\", \"ps1\", \"pug\", \"puppet\", \"purescript\", \"py\", \"python\", \"ql\", \"qml\", \"qmldir\", \"qss\", \"r\", \"racket\", \"raku\", \"razor\", \"rb\", \"reg\", \"regex\", \"regexp\", \"rel\", \"riscv\", \"ron\", \"rosmsg\", \"rs\", \"rst\", \"ruby\", \"rust\", \"sas\", \"sass\", \"scad\", \"scala\", \"scheme\", \"scss\", \"sdbl\", \"sh\", \"shader\", \"shaderlab\", \"shell\", \"shellscript\", \"shellsession\", \"smalltalk\", \"solidity\", \"soy\", \"sparql\", \"spl\", \"splunk\", \"sql\", \"ssh-config\", \"stata\", \"styl\", \"stylus\", \"surql\", \"surrealql\", \"svelte\", \"swift\", \"system-verilog\", \"systemd\", \"talon\", \"talonscript\", \"tasl\", \"tcl\", \"templ\", \"terraform\", \"tex\", \"tf\", \"tfvars\", \"toml\", \"tres\", \"ts\", \"ts-tags\", \"tscn\", \"tsp\", \"tsv\", \"tsx\", \"turtle\", \"twig\", \"typ\", \"typescript\", \"typespec\", \"typst\", \"v\", \"vala\", \"vb\", \"verilog\", \"vhdl\", \"vim\", \"viml\", \"vimscript\", \"vue\", \"vue-html\", \"vue-vine\", \"vy\", \"vyper\", \"wasm\", \"wenyan\", \"wgsl\", \"wiki\", \"wikitext\", \"wit\", \"wl\", \"wolfram\", \"xml\", \"xsl\", \"yaml\", \"yml\", \"zenscript\", \"zig\", \"zsh\", \"\\u6587\\u8A00\"]); return (input: any): input is ShikiLanguage => true === _iv1.has(input); })();\nconst theme = (() => { const _iv1 = new Set([\"andromeeda\", \"aurora-x\", \"ayu-dark\", \"ayu-light\", \"ayu-mirage\", \"catppuccin-frappe\", \"catppuccin-latte\", \"catppuccin-macchiato\", \"catppuccin-mocha\", \"dark-plus\", \"dracula\", \"dracula-soft\", \"everforest-dark\", \"everforest-light\", \"github-dark\", \"github-dark-default\", \"github-dark-dimmed\", \"github-dark-high-contrast\", \"github-light\", \"github-light-default\", \"github-light-high-contrast\", \"gruvbox-dark-hard\", \"gruvbox-dark-medium\", \"gruvbox-dark-soft\", \"gruvbox-light-hard\", \"gruvbox-light-medium\", \"gruvbox-light-soft\", \"horizon\", \"horizon-bright\", \"houston\", \"kanagawa-dragon\", \"kanagawa-lotus\", \"kanagawa-wave\", \"laserwave\", \"light-plus\", \"material-theme\", \"material-theme-darker\", \"material-theme-lighter\", \"material-theme-ocean\", \"material-theme-palenight\", \"min-dark\", \"min-light\", \"monokai\", \"night-owl\", \"night-owl-light\", \"nord\", \"one-dark-pro\", \"one-light\", \"plastic\", \"poimandres\", \"red\", \"rose-pine\", \"rose-pine-dawn\", \"rose-pine-moon\", \"slack-dark\", \"slack-ochin\", \"snazzy-light\", \"solarized-dark\", \"solarized-light\", \"synthwave-84\", \"tokyo-night\", \"vesper\", \"vitesse-black\", \"vitesse-dark\", \"vitesse-light\"]); return (input: any): input is ShikiTheme => true === _iv1.has(input); })();\nexport function isShikiLang(input: unknown): input is ShikiLanguage {\n return lang(input);\n}\nexport function isShikiTheme(input: unknown): input is ShikiTheme {\n return theme(input);\n}\n","import type { ShikiOpts } from \"./types.ts\"\n\nimport { hasColors } from \"@zaly/shared/env\"\nimport { isShikiLang } from \"../schemas/gen/shiki.ts\"\n\nexport async function codeToAnsi(code: string, lang: string, opts?: ShikiOpts): Promise<string> {\n if (!hasColors || !lang || !isShikiLang(lang)) return code\n const { shikiWorker } = await import(\"../shiki/client.ts\")\n const ret = await shikiWorker.highlight(code, lang, opts)\n return ret.value\n}\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ //#region src/layout/size.ts
2
+ /**
3
+ * Resolve a Size to cells, given the axis size available from the parent.
4
+ *
5
+ * - `number` — passes through
6
+ * - `Pct` — percentage of `available`, rounded down
7
+ * - `'fill'` — full `available`
8
+ * - `'fit'` / `undefined` — returns undefined; caller measures content
9
+ *
10
+ * @internal
11
+ */
12
+ function resolveSize(size, available) {
13
+ if (size === void 0 || size === "fit") return void 0;
14
+ if (size === "fill") return available;
15
+ if (typeof size === "number") return size;
16
+ return Math.floor(Number.parseFloat(size) / 100 * available);
17
+ }
18
+ /**
19
+ * Clamp a value to [min, max]. Each bound may be a `Size` (number or `Pct`) or
20
+ * undefined. When both bounds conflict, `min` wins — matches CSS/flex.
21
+ *
22
+ * @internal
23
+ */
24
+ function clamp(value, opts) {
25
+ const maxN = resolveSize(opts.max, opts.available);
26
+ if (maxN !== void 0 && value > maxN) value = maxN;
27
+ const minN = resolveSize(opts.min, opts.available);
28
+ if (minN !== void 0 && value < minN) value = minN;
29
+ return value;
30
+ }
31
+ //#endregion
32
+ export { resolveSize as n, clamp as t };
33
+
34
+ //# sourceMappingURL=size-D8JogYLy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"size-D8JogYLy.mjs","names":[],"sources":["../src/layout/size.ts"],"sourcesContent":["/** Percentage string like `'50%'`, resolved against the parent's content axis. */\nexport type Pct = `${number}%`\n\n/**\n * Size along one axis.\n * - `number` — absolute cells\n * - `Pct` — percentage of the parent's content axis\n * - `'fill'` — take all of the remaining space in the flex allocation\n * - `'fit'` — shrink to the content's natural size, capped at the\n * available axis. Mirrors CSS `fit-content`. Pairs nicely\n * with `'fill'` — `fill` grows, `fit` shrinks.\n */\nexport type Size = number | Pct | \"fill\" | \"fit\"\n\n/**\n * Resolve a Size to cells, given the axis size available from the parent.\n *\n * - `number` — passes through\n * - `Pct` — percentage of `available`, rounded down\n * - `'fill'` — full `available`\n * - `'fit'` / `undefined` — returns undefined; caller measures content\n *\n * @internal\n */\nexport function resolveSize(size: Size | undefined, available: number): number | undefined {\n if (size === undefined || size === \"fit\") return undefined\n if (size === \"fill\") return available\n if (typeof size === \"number\") return size\n return Math.floor((Number.parseFloat(size) / 100) * available)\n}\n\nexport interface ClampOpts {\n min?: Size\n max?: Size\n available: number\n}\n\n/**\n * Clamp a value to [min, max]. Each bound may be a `Size` (number or `Pct`) or\n * undefined. When both bounds conflict, `min` wins — matches CSS/flex.\n *\n * @internal\n */\nexport function clamp(value: number, opts: ClampOpts): number {\n const maxN = resolveSize(opts.max, opts.available)\n if (maxN !== undefined && value > maxN) value = maxN\n const minN = resolveSize(opts.min, opts.available)\n if (minN !== undefined && value < minN) value = minN\n return value\n}\n"],"mappings":";;;;;;;;;;;AAwBA,SAAgB,YAAY,MAAwB,WAAuC;CACzF,IAAI,SAAS,KAAA,KAAa,SAAS,OAAO,OAAO,KAAA;CACjD,IAAI,SAAS,QAAQ,OAAO;CAC5B,IAAI,OAAO,SAAS,UAAU,OAAO;CACrC,OAAO,KAAK,MAAO,OAAO,WAAW,IAAI,IAAI,MAAO,SAAS;AAC/D;;;;;;;AAcA,SAAgB,MAAM,OAAe,MAAyB;CAC5D,MAAM,OAAO,YAAY,KAAK,KAAK,KAAK,SAAS;CACjD,IAAI,SAAS,KAAA,KAAa,QAAQ,MAAM,QAAQ;CAChD,MAAM,OAAO,YAAY,KAAK,KAAK,KAAK,SAAS;CACjD,IAAI,SAAS,KAAA,KAAa,QAAQ,MAAM,QAAQ;CAChD,OAAO;AACT"}
@@ -0,0 +1,10 @@
1
+ import { a as AnsiStyle, c as Color, d as RGB, f as Style, i as AnsiColorName, l as ColorLightness, o as AnyStyle, p as ThemeKey, r as AnsiColor, s as BrightAnsiColorName, u as HexColor } from "./types-B9Eh7k2v.mjs";
2
+ import { a as StyleBuilder, i as isMarkdown, n as inspect, o as styleBuilder, r as inspectFormat, t as InspectOpts } from "./inspect-D6FW_QUo.mjs";
3
+ //#region src/style/color.d.ts
4
+ declare function toHex(c: RGB): HexColor;
5
+ declare function toHex(r: number, g: number, b: number): HexColor;
6
+ declare function parseHex(hex: string): RGB;
7
+ declare function isHexColor(s: string): s is HexColor;
8
+ //#endregion
9
+ export { type AnsiColor, type AnsiColorName, type AnsiStyle, type AnyStyle, type BrightAnsiColorName, type Color, type ColorLightness, type HexColor, InspectOpts, type RGB, type Style, StyleBuilder, type ThemeKey, inspect, inspectFormat, isHexColor, isMarkdown, parseHex, styleBuilder, toHex };
10
+ //# sourceMappingURL=style.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.mts","names":[],"sources":["../src/style/color.ts"],"mappings":";;;iBAMgB,MAAM,GAAG,MAAM;iBACf,MAAM,WAAW,WAAW,YAAY;iBAMxC,SAAS,cAAc;iBAcvB,WAAW,YAAY,KAAK"}
package/dist/style.mjs ADDED
@@ -0,0 +1,4 @@
1
+ import { d as toHex, l as isHexColor, u as parseHex } from "./ansi-Clq0ozyA.mjs";
2
+ import { t as styleBuilder } from "./builder-D49ECBEf.mjs";
3
+ import { n as inspectFormat, r as isMarkdown, t as inspect } from "./inspect-D1d9t-ni.mjs";
4
+ export { inspect, inspectFormat, isHexColor, isMarkdown, parseHex, styleBuilder, toHex };
@@ -0,0 +1,33 @@
1
+ import { J as Layout } from "./queries-DH3bj74K.mjs";
2
+ import { a as StyleBuilder } from "./inspect-D6FW_QUo.mjs";
3
+ //#region src/layout/text.d.ts
4
+ type WrapMode = "word" | "char" | "none";
5
+ declare function formatText(text: string, opts: {
6
+ wrap?: WrapMode;
7
+ width: number;
8
+ style?: StyleBuilder;
9
+ /** When wrapping, preserve the indentation of the original text. */
10
+ indent?: boolean;
11
+ /** When wrapping ANSI-styled text, pad wrapped fragments to `width`
12
+ * using the background color active at the fragment's last cell.
13
+ * Natural lines that already fit are left unchanged. */
14
+ wrapBg?: boolean;
15
+ }): string[];
16
+ declare function expandTabs(s: string, tabSize?: number): string;
17
+ declare function formatLines(text: string | string[], opts?: {
18
+ numbered?: boolean;
19
+ numberOffset?: number;
20
+ maxLineLength?: number;
21
+ offset?: number;
22
+ limit?: number;
23
+ more?: false | ((more: number, msg: string) => string);
24
+ style?: StyleBuilder;
25
+ }): string[];
26
+ declare function calcLayout(text: string, opts?: {
27
+ wrap?: WrapMode;
28
+ }): Layout;
29
+ declare function countLines(text: string): number;
30
+ declare function capitalize(s: string): string;
31
+ //#endregion
32
+ export { WrapMode, calcLayout, capitalize, countLines, expandTabs, formatLines, formatText };
33
+ //# sourceMappingURL=text.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.mts","names":[],"sources":["../src/layout/text.ts"],"mappings":";;;KAeY;iBAKI,WACd,cACA;EACE,OAAO;EACP;EACA,QAAQ;;EAER;;;;EAIA;;iBAmDY,WAAW,WAAW;iBAsBtB,YACd,yBACA;EACE;EACA;EACA;EACA;EACA;EACA,iBAAiB,cAAc;EAC/B,QAAQ;;iBA0DI,WAAW,cAAc;EAAQ,OAAO;IAAkB;iBAS1D,WAAW;iBAUX,WAAW"}
package/dist/text.mjs ADDED
@@ -0,0 +1,111 @@
1
+ import { c as styleAnsi, n as ansiBg } from "./ansi-Clq0ozyA.mjs";
2
+ import { clamp } from "@zaly/shared";
3
+ import { hasAnsi, sliceAnsi, splitAnsi, stringWidth, stripAnsi, truncateAnsi, wrapAnsi } from "@zaly/shared/ansi";
4
+ //#region src/layout/text.ts
5
+ const ELLIPSIS = "…";
6
+ const TAB_WIDTH = 4;
7
+ function formatText(text, opts) {
8
+ const mode = opts.wrap ?? "word";
9
+ const lines = splitAnsi(expandTabs(text));
10
+ const ret = [];
11
+ if (mode === "none") ret.push(...lines);
12
+ else for (const line of lines) {
13
+ if (stringWidth(line) <= opts.width) {
14
+ ret.push(line);
15
+ continue;
16
+ }
17
+ const stripped = stripAnsi(line);
18
+ if (stripped.slice(opts.width).trim() === "") {
19
+ ret.push(sliceAnsi(line, 0, opts.width));
20
+ continue;
21
+ }
22
+ const indentWidth = opts.indent ? stringWidth(stripped.match(/^\s*/)?.[0] ?? "") : 0;
23
+ const indent = indentWidth > 0 ? sliceAnsi(line, 0, indentWidth) : "";
24
+ const wrapped = splitAnsi(wrapAnsi(indent ? sliceAnsi(line, indentWidth) : line, opts.width - indentWidth, { mode }));
25
+ for (let r = 0; r < wrapped.length; r++) {
26
+ let row = r > 0 && wrapped[r].startsWith(" ") ? wrapped[r].slice(1) : wrapped[r];
27
+ if (row === "" && r > 0 && r < wrapped.length - 1) continue;
28
+ if (indent) row = `${indent}${row}`;
29
+ if (opts.wrapBg) {
30
+ const rowWidth = stringWidth(row);
31
+ const bg = rowWidth > 0 ? ansiBg(row, rowWidth - 1) : void 0;
32
+ if (bg && rowWidth < opts.width) row = `${row}${styleAnsi(" ".repeat(opts.width - rowWidth), { bg })}`;
33
+ }
34
+ ret.push(row);
35
+ }
36
+ }
37
+ return ret.map((line) => opts.style ? opts.style(line) : line);
38
+ }
39
+ function expandTabs(s, tabSize = TAB_WIDTH) {
40
+ if (!s.includes(" ")) return s;
41
+ const plain = hasAnsi(s) ? stripAnsi(s) : s;
42
+ const spaces = [];
43
+ let col = 0;
44
+ for (const ch of plain) if (ch === " ") {
45
+ const n = tabSize - col % tabSize;
46
+ spaces.push(" ".repeat(n));
47
+ col += n;
48
+ } else if (ch === "\n" || ch === "\r") col = 0;
49
+ else col += stringWidth(ch);
50
+ let i = 0;
51
+ return s.replaceAll(" ", () => spaces[i++] ?? " ".repeat(tabSize));
52
+ }
53
+ function formatLines(text, opts = {}) {
54
+ const lines = (typeof text === "string" ? splitAnsi(text) : text).map((line) => expandTabs(line));
55
+ const offset = clamp(opts.offset ?? 0, 0, lines.length - 1);
56
+ const limit = clamp(opts.limit ?? lines.length, 1, lines.length - offset);
57
+ const ellipsis = opts.style?.(ELLIPSIS) ?? ELLIPSIS;
58
+ let slice = lines.slice(offset, offset + limit).map((line) => opts.maxLineLength ? truncateAnsi(line, opts.maxLineLength, ellipsis) : line);
59
+ const numberOffset = opts.numberOffset ?? offset + 1;
60
+ const gutterWidth = String(numberOffset + slice.length - 1).length + 2;
61
+ if (opts.numbered) slice = slice.map((line, i) => {
62
+ const n = numberOffset + i;
63
+ const lineo = `${String(n).padStart(gutterWidth - 2)} │`;
64
+ return `${opts.style?.(lineo) ?? lineo} ${line}`;
65
+ });
66
+ if (slice.length < lines.length && opts.more !== false) {
67
+ const moreN = lines.length - slice.length;
68
+ let more = `+${moreN} more line${moreN > 1 ? "s" : ""}`;
69
+ more = opts.more?.(moreN, more) ?? more;
70
+ if (opts.numbered) {
71
+ const moreGutter = `${"…".padStart(gutterWidth - 2)} │`;
72
+ slice.push(`${opts.style?.(moreGutter) ?? moreGutter} ${opts.style?.(more) ?? more}`);
73
+ } else slice.push(opts.style?.(more) ?? more);
74
+ }
75
+ return slice;
76
+ }
77
+ function maxContent(text) {
78
+ return text.split("\n").reduce((m, line) => Math.max(m, stringWidth(line)), 0);
79
+ }
80
+ function minContent(text, mode) {
81
+ switch (mode) {
82
+ case "none": return;
83
+ case "char": return 1;
84
+ case "word": return text.split(/\s+/).reduce((m, word) => Math.max(m, stringWidth(word)), 0);
85
+ default: return;
86
+ }
87
+ }
88
+ function calcLayout(text, opts = {}) {
89
+ text = expandTabs(text);
90
+ const width = maxContent(text);
91
+ return {
92
+ minWidth: minContent(text, opts.wrap ?? "word") ?? width,
93
+ width
94
+ };
95
+ }
96
+ function countLines(text) {
97
+ let count = 0;
98
+ let pos = text.indexOf("\n");
99
+ while (pos !== -1) {
100
+ count++;
101
+ pos = text.indexOf("\n", pos + 1);
102
+ }
103
+ return count;
104
+ }
105
+ function capitalize(s) {
106
+ return s.charAt(0).toUpperCase() + s.slice(1);
107
+ }
108
+ //#endregion
109
+ export { calcLayout, capitalize, countLines, expandTabs, formatLines, formatText };
110
+
111
+ //# sourceMappingURL=text.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.mjs","names":[],"sources":["../src/layout/text.ts"],"sourcesContent":["import type { Layout } from \"../core/state.ts\"\nimport type { StyleBuilder } from \"../style/builder.ts\"\n\nimport { clamp } from \"@zaly/shared\"\nimport {\n hasAnsi,\n sliceAnsi,\n splitAnsi,\n stringWidth,\n stripAnsi,\n truncateAnsi,\n wrapAnsi,\n} from \"@zaly/shared/ansi\"\nimport { ansiBg, styleAnsi } from \"../style/ansi.ts\"\n\nexport type WrapMode = \"word\" | \"char\" | \"none\"\n\nconst ELLIPSIS = \"…\"\nconst TAB_WIDTH = 4\n\nexport function formatText(\n text: string,\n opts: {\n wrap?: WrapMode\n width: number\n style?: StyleBuilder\n /** When wrapping, preserve the indentation of the original text. */\n indent?: boolean\n /** When wrapping ANSI-styled text, pad wrapped fragments to `width`\n * using the background color active at the fragment's last cell.\n * Natural lines that already fit are left unchanged. */\n wrapBg?: boolean\n }\n): string[] {\n const mode = opts.wrap ?? \"word\"\n const lines = splitAnsi(expandTabs(text))\n const ret: string[] = []\n if (mode === \"none\") ret.push(...lines)\n else {\n for (const line of lines) {\n const sw = stringWidth(line)\n\n // Fast path for short lines that don't need wrapping\n if (sw <= opts.width) {\n ret.push(line)\n continue\n }\n\n const stripped = stripAnsi(line)\n\n // Long line that ends in (ansi) whitespace, so just strip\n if (stripped.slice(opts.width).trim() === \"\") {\n ret.push(sliceAnsi(line, 0, opts.width))\n continue\n }\n\n const indentWidth = opts.indent ? stringWidth(stripped.match(/^\\s*/)?.[0] ?? \"\") : 0\n const indent = indentWidth > 0 ? sliceAnsi(line, 0, indentWidth) : \"\"\n const bare = indent ? sliceAnsi(line, indentWidth) : line\n const wrapped = splitAnsi(wrapAnsi(bare, opts.width - indentWidth, { mode }))\n\n // * strip single leading space from wrapped lines after the first\n // * preserve indentation when enabled\n // * pad wrapped lines with bg color if padding is enabled and the line is short\n for (let r = 0; r < wrapped.length; r++) {\n let row = r > 0 && wrapped[r].startsWith(\" \") ? wrapped[r].slice(1) : wrapped[r]\n if (row === \"\" && r > 0 && r < wrapped.length - 1) continue\n if (indent) row = `${indent}${row}`\n if (opts.wrapBg) {\n const rowWidth = stringWidth(row)\n const bg = rowWidth > 0 ? ansiBg(row, rowWidth - 1) : undefined\n if (bg && rowWidth < opts.width) {\n row = `${row}${styleAnsi(\" \".repeat(opts.width - rowWidth), { bg })}`\n }\n }\n ret.push(row)\n }\n }\n }\n return ret.map((line) => (opts.style ? opts.style(line) : line))\n}\n\nexport function expandTabs(s: string, tabSize = TAB_WIDTH): string {\n if (!s.includes(\"\\t\")) return s\n const plain = hasAnsi(s) ? stripAnsi(s) : s\n const spaces: string[] = []\n let col = 0\n\n for (const ch of plain) {\n if (ch === \"\\t\") {\n const n = tabSize - (col % tabSize)\n spaces.push(\" \".repeat(n))\n col += n\n } else if (ch === \"\\n\" || ch === \"\\r\") {\n col = 0\n } else {\n col += stringWidth(ch)\n }\n }\n\n let i = 0\n return s.replaceAll(\"\\t\", () => spaces[i++] ?? \" \".repeat(tabSize))\n}\n\nexport function formatLines(\n text: string | string[],\n opts: {\n numbered?: boolean\n numberOffset?: number\n maxLineLength?: number\n offset?: number\n limit?: number\n more?: false | ((more: number, msg: string) => string)\n style?: StyleBuilder\n } = {}\n): string[] {\n const lines = (typeof text === \"string\" ? splitAnsi(text) : text).map((line) => expandTabs(line))\n const offset = clamp(opts.offset ?? 0, 0, lines.length - 1)\n const limit = clamp(opts.limit ?? lines.length, 1, lines.length - offset)\n const ellipsis = opts.style?.(ELLIPSIS) ?? ELLIPSIS\n let slice = lines\n .slice(offset, offset + limit)\n .map((line) => (opts.maxLineLength ? truncateAnsi(line, opts.maxLineLength, ellipsis) : line))\n\n const numberOffset = opts.numberOffset ?? offset + 1\n const gutterWidth = String(numberOffset + slice.length - 1).length + 2\n\n if (opts.numbered) {\n slice = slice.map((line, i) => {\n const n = numberOffset + i\n const lineo = `${String(n).padStart(gutterWidth - 2)} │`\n return `${opts.style?.(lineo) ?? lineo} ${line}`\n })\n }\n\n if (slice.length < lines.length && opts.more !== false) {\n const moreN = lines.length - slice.length\n let more = `+${moreN} more line${moreN > 1 ? \"s\" : \"\"}`\n more = opts.more?.(moreN, more) ?? more\n if (opts.numbered) {\n const moreGutter = `${\"…\".padStart(gutterWidth - 2)} │`\n slice.push(`${opts.style?.(moreGutter) ?? moreGutter} ${opts.style?.(more) ?? more}`)\n } else slice.push(opts.style?.(more) ?? more)\n }\n\n return slice\n}\n\nfunction maxContent(text: string): number {\n return text.split(\"\\n\").reduce((m, line) => Math.max(m, stringWidth(line)), 0)\n}\n\nfunction minContent(text: string, mode: WrapMode): number | undefined {\n switch (mode) {\n case \"none\": {\n return\n } // can't break, same as max\n case \"char\": {\n return 1\n } // can break anywhere → 1cell floor\n case \"word\": {\n // longest unbreakable run\n return text.split(/\\s+/).reduce((m, word) => Math.max(m, stringWidth(word)), 0)\n }\n default: {\n mode satisfies never // future modes get caught at type-check time\n return undefined\n }\n }\n}\n\nexport function calcLayout(text: string, opts: { wrap?: WrapMode } = {}): Layout {\n text = expandTabs(text)\n const width = maxContent(text)\n return {\n minWidth: minContent(text, opts.wrap ?? \"word\") ?? width,\n width,\n }\n}\n\nexport function countLines(text: string): number {\n let count = 0\n let pos = text.indexOf(\"\\n\")\n while (pos !== -1) {\n count++\n pos = text.indexOf(\"\\n\", pos + 1)\n }\n return count\n}\n\nexport function capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n"],"mappings":"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"}