@outfitter/cli 0.1.0-rc.2 → 0.1.0-rc.3

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 (250) hide show
  1. package/README.md +21 -32
  2. package/dist/actions.d.ts +12 -1
  3. package/dist/actions.js +170 -3
  4. package/dist/borders/index.d.ts +3 -0
  5. package/dist/borders/index.js +13 -0
  6. package/dist/box/index.d.ts +4 -0
  7. package/dist/box/index.js +13 -0
  8. package/dist/cli.js +1 -1
  9. package/dist/colors/index.d.ts +3 -0
  10. package/dist/colors/index.js +18 -0
  11. package/dist/command.d.ts +40 -3
  12. package/dist/command.js +45 -3
  13. package/dist/demo/index.d.ts +78 -0
  14. package/dist/demo/index.js +148 -0
  15. package/dist/demo/registry.d.ts +7 -0
  16. package/dist/demo/registry.js +28 -0
  17. package/dist/demo/renderers/borders.d.ts +7 -0
  18. package/dist/demo/renderers/borders.js +17 -0
  19. package/dist/demo/renderers/box.d.ts +7 -0
  20. package/dist/demo/renderers/box.js +18 -0
  21. package/dist/demo/renderers/colors.d.ts +7 -0
  22. package/dist/demo/renderers/colors.js +18 -0
  23. package/dist/demo/renderers/indicators.d.ts +7 -0
  24. package/dist/demo/renderers/indicators.js +17 -0
  25. package/dist/demo/renderers/list.d.ts +7 -0
  26. package/dist/demo/renderers/list.js +19 -0
  27. package/dist/demo/renderers/markdown.d.ts +7 -0
  28. package/dist/demo/renderers/markdown.js +18 -0
  29. package/dist/demo/renderers/progress.d.ts +7 -0
  30. package/dist/demo/renderers/progress.js +17 -0
  31. package/dist/demo/renderers/spinner.d.ts +7 -0
  32. package/dist/demo/renderers/spinner.js +19 -0
  33. package/dist/demo/renderers/table.d.ts +7 -0
  34. package/dist/demo/renderers/table.js +19 -0
  35. package/dist/demo/renderers/text.d.ts +7 -0
  36. package/dist/demo/renderers/text.js +16 -0
  37. package/dist/demo/renderers/tree.d.ts +7 -0
  38. package/dist/demo/renderers/tree.js +18 -0
  39. package/dist/demo/section.d.ts +5 -0
  40. package/dist/demo/section.js +23 -0
  41. package/dist/demo/templates.d.ts +4 -0
  42. package/dist/demo/templates.js +10 -0
  43. package/dist/demo/types.d.ts +3 -0
  44. package/dist/demo/types.js +8 -0
  45. package/dist/index.d.ts +5 -8
  46. package/dist/index.js +9 -43
  47. package/dist/input.d.ts +163 -2
  48. package/dist/input.js +425 -11
  49. package/dist/list/index.d.ts +3 -0
  50. package/dist/list/index.js +9 -0
  51. package/dist/output.js +1 -1
  52. package/dist/pagination.d.ts +62 -2
  53. package/dist/pagination.js +84 -6
  54. package/dist/preset/full.d.ts +14 -0
  55. package/dist/preset/full.js +41 -0
  56. package/dist/preset/standard.d.ts +11 -0
  57. package/dist/preset/standard.js +30 -0
  58. package/dist/prompt/confirm.d.ts +4 -0
  59. package/dist/prompt/confirm.js +9 -0
  60. package/dist/prompt/group.d.ts +4 -0
  61. package/dist/prompt/group.js +9 -0
  62. package/dist/prompt/index.d.ts +7 -0
  63. package/dist/prompt/index.js +32 -0
  64. package/dist/prompt/select.d.ts +4 -0
  65. package/dist/prompt/select.js +11 -0
  66. package/dist/prompt/text.d.ts +4 -0
  67. package/dist/prompt/text.js +11 -0
  68. package/dist/prompt/types.d.ts +3 -0
  69. package/dist/prompt/types.js +8 -0
  70. package/dist/prompt/validators.d.ts +2 -0
  71. package/dist/prompt/validators.js +8 -0
  72. package/dist/render/borders.d.ts +2 -0
  73. package/dist/render/borders.js +15 -0
  74. package/dist/render/box.d.ts +3 -0
  75. package/dist/render/box.js +23 -0
  76. package/dist/render/colors.d.ts +1 -1
  77. package/dist/render/colors.js +6 -3
  78. package/dist/render/date.js +1 -1
  79. package/dist/render/format-relative.js +1 -1
  80. package/dist/render/format.js +1 -1
  81. package/dist/render/heading.d.ts +3 -0
  82. package/dist/render/heading.js +14 -0
  83. package/dist/render/index.d.ts +26 -7
  84. package/dist/render/index.js +160 -26
  85. package/dist/render/indicators.d.ts +2 -0
  86. package/dist/render/indicators.js +14 -0
  87. package/dist/render/json.js +1 -1
  88. package/dist/render/layout.d.ts +5 -0
  89. package/dist/render/layout.js +25 -0
  90. package/dist/render/list.d.ts +2 -2
  91. package/dist/render/list.js +2 -2
  92. package/dist/render/markdown.js +4 -4
  93. package/dist/render/progress.js +1 -1
  94. package/dist/render/separator.d.ts +3 -0
  95. package/dist/render/separator.js +14 -0
  96. package/dist/render/shapes.js +10 -9
  97. package/dist/render/spinner.d.ts +2 -0
  98. package/dist/render/spinner.js +12 -0
  99. package/dist/render/stack.d.ts +3 -0
  100. package/dist/render/stack.js +38 -0
  101. package/dist/render/table.d.ts +2 -1
  102. package/dist/render/table.js +6 -5
  103. package/dist/render/text.d.ts +1 -1
  104. package/dist/render/text.js +7 -4
  105. package/dist/render/tree.d.ts +2 -2
  106. package/dist/render/tree.js +5 -3
  107. package/dist/render/types.d.ts +2 -0
  108. package/dist/render/types.js +1 -0
  109. package/dist/shared/@outfitter/cli-0ggcy7fa.js +20 -0
  110. package/dist/shared/@outfitter/cli-0psys2vm.js +7 -0
  111. package/dist/shared/@outfitter/cli-1bghjef6.js +352 -0
  112. package/dist/shared/@outfitter/cli-1kwbnt86.d.ts +45 -0
  113. package/dist/shared/@outfitter/cli-2g8bx1aq.d.ts +50 -0
  114. package/dist/shared/@outfitter/cli-34fqr7bp.js +37 -0
  115. package/dist/shared/@outfitter/cli-3b7ed3rm.d.ts +97 -0
  116. package/dist/shared/@outfitter/cli-3dxmmy4c.d.ts +20 -0
  117. package/dist/shared/@outfitter/cli-3f12z5kf.d.ts +83 -0
  118. package/dist/shared/@outfitter/cli-3t2zaenc.d.ts +59 -0
  119. package/dist/shared/@outfitter/{cli-dds0qqvm.d.ts → cli-4cb5g831.d.ts} +2 -0
  120. package/dist/shared/@outfitter/cli-4w2a1rfy.d.ts +23 -0
  121. package/dist/shared/@outfitter/cli-4x6pqnez.js +20 -0
  122. package/dist/shared/@outfitter/cli-671sxkhj.js +146 -0
  123. package/dist/shared/@outfitter/cli-6bztk73z.d.ts +51 -0
  124. package/dist/shared/@outfitter/cli-6fxffp8k.js +1 -0
  125. package/dist/shared/@outfitter/cli-6j9qynm8.js +118 -0
  126. package/dist/shared/@outfitter/cli-6m988kh0.d.ts +61 -0
  127. package/dist/shared/@outfitter/cli-74ba31gz.js +134 -0
  128. package/dist/shared/@outfitter/cli-7gnrb8cr.js +214 -0
  129. package/dist/shared/@outfitter/cli-7nm6edvh.d.ts +17 -0
  130. package/dist/shared/@outfitter/cli-85fg2vr5.js +123 -0
  131. package/dist/shared/@outfitter/cli-8a8xrzhy.js +20 -0
  132. package/dist/shared/@outfitter/cli-8bwaw3pz.js +7 -0
  133. package/dist/shared/@outfitter/cli-8rx4g3s5.d.ts +41 -0
  134. package/dist/shared/@outfitter/cli-8xsmsbbd.d.ts +223 -0
  135. package/dist/shared/@outfitter/cli-96b2p4td.d.ts +56 -0
  136. package/dist/shared/@outfitter/cli-9khk3cbq.d.ts +190 -0
  137. package/dist/shared/@outfitter/cli-9mtjjykw.js +67 -0
  138. package/dist/shared/@outfitter/{cli-ag0w4pk0.js → cli-9nbyj2bt.js} +60 -21
  139. package/dist/shared/@outfitter/{cli-azzk8a1d.js → cli-afhjqmg3.js} +7 -3
  140. package/dist/shared/@outfitter/cli-an9j0h80.js +117 -0
  141. package/dist/shared/@outfitter/cli-ay411nbr.js +122 -0
  142. package/dist/shared/@outfitter/cli-b0tzqgnf.d.ts +132 -0
  143. package/dist/shared/@outfitter/cli-b5c2k0d7.js +39 -0
  144. package/dist/shared/@outfitter/cli-b5epywry.js +1 -0
  145. package/dist/shared/@outfitter/cli-bcmcaz1b.js +23 -0
  146. package/dist/shared/@outfitter/cli-bf3vma4q.js +61 -0
  147. package/dist/shared/@outfitter/cli-cf1xexgn.d.ts +53 -0
  148. package/dist/shared/@outfitter/cli-cs45xd6q.js +59 -0
  149. package/dist/shared/@outfitter/cli-d7jpshq5.d.ts +128 -0
  150. package/dist/shared/@outfitter/{cli-jbj78ac5.js → cli-d9ad0rqj.js} +6 -1
  151. package/dist/shared/@outfitter/cli-daw296mv.js +61 -0
  152. package/dist/shared/@outfitter/cli-e5ms1y0x.d.ts +91 -0
  153. package/dist/shared/@outfitter/cli-e73v3qqy.d.ts +93 -0
  154. package/dist/shared/@outfitter/cli-en6zn6sj.js +1 -0
  155. package/dist/shared/@outfitter/cli-ep2cvtk8.js +48 -0
  156. package/dist/shared/@outfitter/cli-f75h8e94.js +7 -0
  157. package/dist/shared/@outfitter/cli-fakncnjp.d.ts +106 -0
  158. package/dist/shared/@outfitter/cli-feb5j90n.js +94 -0
  159. package/dist/shared/@outfitter/cli-h20jc0bs.d.ts +66 -0
  160. package/dist/shared/@outfitter/cli-hnpbqmc8.d.ts +328 -0
  161. package/dist/shared/@outfitter/cli-j4n8gaf3.js +95 -0
  162. package/dist/shared/@outfitter/cli-jejfypgf.js +85 -0
  163. package/dist/shared/@outfitter/{cli-wqc652mx.js → cli-jhcdwvpn.js} +8 -8
  164. package/dist/shared/@outfitter/{cli-v9mjsvjh.js → cli-jjemfdta.js} +13 -46
  165. package/dist/shared/@outfitter/cli-kc84wmch.js +267 -0
  166. package/dist/shared/@outfitter/cli-ktqme80d.js +7 -0
  167. package/dist/shared/@outfitter/cli-mq0jp15z.js +1 -0
  168. package/dist/shared/@outfitter/cli-mymyavvj.d.ts +26 -0
  169. package/dist/shared/@outfitter/cli-n17gt1dz.js +19 -0
  170. package/dist/shared/@outfitter/cli-n9dbh0hp.js +51 -0
  171. package/dist/shared/@outfitter/cli-nvvc92c8.js +128 -0
  172. package/dist/shared/@outfitter/cli-p1m5dhrs.js +169 -0
  173. package/dist/shared/@outfitter/cli-p38sfxyk.js +25 -0
  174. package/dist/shared/@outfitter/cli-p3dqm1vd.js +22 -0
  175. package/dist/shared/@outfitter/cli-p9j1phge.js +20 -0
  176. package/dist/shared/@outfitter/cli-pkxmzavm.js +62 -0
  177. package/dist/shared/@outfitter/cli-q8r6jarq.d.ts +24 -0
  178. package/dist/shared/@outfitter/{cli-2y3kxew8.d.ts → cli-qj83y5wj.d.ts} +22 -9
  179. package/dist/shared/@outfitter/cli-qjfc3j11.d.ts +112 -0
  180. package/dist/shared/@outfitter/cli-qp4cbhqr.js +70 -0
  181. package/dist/shared/@outfitter/cli-s0kkx9m1.d.ts +164 -0
  182. package/dist/shared/@outfitter/cli-snxj55n6.js +43 -0
  183. package/dist/shared/@outfitter/cli-swwxvjvm.d.ts +24 -0
  184. package/dist/shared/@outfitter/cli-sx67mmfx.d.ts +98 -0
  185. package/dist/shared/@outfitter/cli-tarpsa8a.js +30 -0
  186. package/dist/shared/@outfitter/cli-thvzhjd1.js +126 -0
  187. package/dist/shared/@outfitter/cli-tqewy503.d.ts +36 -0
  188. package/dist/shared/@outfitter/cli-tvw1xrdj.js +20 -0
  189. package/dist/shared/@outfitter/cli-v1tzwxkt.js +32 -0
  190. package/dist/shared/@outfitter/cli-vd60dj65.js +1 -0
  191. package/dist/shared/@outfitter/cli-vp88gxev.js +279 -0
  192. package/dist/shared/@outfitter/cli-vstbkzky.d.ts +74 -0
  193. package/dist/shared/@outfitter/cli-vtg0sqk2.d.ts +54 -0
  194. package/dist/shared/@outfitter/cli-w5y3xepp.js +20 -0
  195. package/dist/shared/@outfitter/cli-x4cavvc0.js +1 -0
  196. package/dist/shared/@outfitter/cli-xep6v2c0.js +52 -0
  197. package/dist/shared/@outfitter/cli-xg5y5fhk.js +86 -0
  198. package/dist/shared/@outfitter/{cli-n51t773m.d.ts → cli-xsaheemc.d.ts} +44 -4
  199. package/dist/shared/@outfitter/cli-xvqtqjxk.js +82 -0
  200. package/dist/shared/@outfitter/cli-y25tt8nc.d.ts +48 -0
  201. package/dist/streaming/ansi.d.ts +2 -0
  202. package/dist/streaming/ansi.js +8 -0
  203. package/dist/streaming/index.d.ts +4 -0
  204. package/dist/streaming/index.js +17 -0
  205. package/dist/streaming/spinner.d.ts +3 -0
  206. package/dist/streaming/spinner.js +10 -0
  207. package/dist/streaming/writer.d.ts +2 -0
  208. package/dist/streaming/writer.js +9 -0
  209. package/dist/table/index.d.ts +4 -0
  210. package/dist/table/index.js +13 -0
  211. package/dist/terminal/detection.js +5 -2
  212. package/dist/terminal/index.js +6 -2
  213. package/dist/theme/context.d.ts +9 -0
  214. package/dist/theme/context.js +14 -0
  215. package/dist/theme/create.d.ts +8 -0
  216. package/dist/theme/create.js +12 -0
  217. package/dist/theme/index.d.ts +17 -0
  218. package/dist/theme/index.js +42 -0
  219. package/dist/theme/presets/bold.d.ts +8 -0
  220. package/dist/theme/presets/bold.js +12 -0
  221. package/dist/theme/presets/default.d.ts +8 -0
  222. package/dist/theme/presets/default.js +11 -0
  223. package/dist/theme/presets/index.d.ts +12 -0
  224. package/dist/theme/presets/index.js +24 -0
  225. package/dist/theme/presets/minimal.d.ts +8 -0
  226. package/dist/theme/presets/minimal.js +12 -0
  227. package/dist/theme/presets/rounded.d.ts +8 -0
  228. package/dist/theme/presets/rounded.js +12 -0
  229. package/dist/theme/resolve.d.ts +8 -0
  230. package/dist/theme/resolve.js +11 -0
  231. package/dist/theme/types.d.ts +7 -0
  232. package/dist/theme/types.js +1 -0
  233. package/dist/tree/index.d.ts +3 -0
  234. package/dist/tree/index.js +11 -0
  235. package/dist/types.js +1 -1
  236. package/package.json +171 -57
  237. package/dist/shared/@outfitter/cli-2vs2gxa8.js +0 -429
  238. package/dist/shared/@outfitter/cli-2yq94zst.d.ts +0 -39
  239. package/dist/shared/@outfitter/cli-6xc869x1.js +0 -26
  240. package/dist/shared/@outfitter/cli-7km1e58p.js +0 -85
  241. package/dist/shared/@outfitter/cli-8r0bnyyx.js +0 -43
  242. package/dist/shared/@outfitter/cli-afecwfrn.d.ts +0 -13
  243. package/dist/shared/@outfitter/cli-bt423m6y.js +0 -4
  244. package/dist/shared/@outfitter/cli-d4fegbad.d.ts +0 -66
  245. package/dist/shared/@outfitter/cli-e0ecw3x1.js +0 -64
  246. package/dist/shared/@outfitter/cli-fheaaa6b.js +0 -25
  247. package/dist/shared/@outfitter/cli-j361wp3g.d.ts +0 -41
  248. package/dist/shared/@outfitter/cli-p0m2fc51.js +0 -172
  249. package/dist/shared/@outfitter/cli-tyajr8qa.d.ts +0 -63
  250. package/dist/shared/@outfitter/cli-zs6jy1am.d.ts +0 -164
@@ -0,0 +1,267 @@
1
+ // @bun
2
+ // packages/cli/src/demo/registry.ts
3
+ var THEME_METHOD_META = {
4
+ success: {
5
+ category: "semantic",
6
+ description: "Green for success messages",
7
+ defaultExample: "Operation completed"
8
+ },
9
+ warning: {
10
+ category: "semantic",
11
+ description: "Yellow for warnings",
12
+ defaultExample: "Proceed with caution"
13
+ },
14
+ error: {
15
+ category: "semantic",
16
+ description: "Red for errors",
17
+ defaultExample: "Something went wrong"
18
+ },
19
+ info: {
20
+ category: "semantic",
21
+ description: "Blue for information",
22
+ defaultExample: "For your information"
23
+ },
24
+ primary: {
25
+ category: "semantic",
26
+ description: "Default text (no color)",
27
+ defaultExample: "Main content"
28
+ },
29
+ secondary: {
30
+ category: "semantic",
31
+ description: "Gray for secondary text",
32
+ defaultExample: "Supporting text"
33
+ },
34
+ muted: {
35
+ category: "semantic",
36
+ description: "Dim for de-emphasized text",
37
+ defaultExample: "(optional)"
38
+ },
39
+ accent: {
40
+ category: "semantic",
41
+ description: "Cyan for highlights",
42
+ defaultExample: "Highlighted item"
43
+ },
44
+ highlight: {
45
+ category: "semantic",
46
+ description: "Bold for emphasis",
47
+ defaultExample: "Important"
48
+ },
49
+ link: {
50
+ category: "semantic",
51
+ description: "Cyan + underline for URLs",
52
+ defaultExample: "https://example.com"
53
+ },
54
+ destructive: {
55
+ category: "semantic",
56
+ description: "Bright red for dangerous actions",
57
+ defaultExample: "Delete forever"
58
+ },
59
+ subtle: {
60
+ category: "semantic",
61
+ description: "Dim gray for fine print",
62
+ defaultExample: "Fine print"
63
+ },
64
+ bold: {
65
+ category: "utility",
66
+ description: "Bold styling",
67
+ defaultExample: "Strong emphasis"
68
+ },
69
+ italic: {
70
+ category: "utility",
71
+ description: "Italic styling",
72
+ defaultExample: "Subtle emphasis"
73
+ },
74
+ underline: {
75
+ category: "utility",
76
+ description: "Underline styling",
77
+ defaultExample: "Underlined text"
78
+ },
79
+ dim: {
80
+ category: "utility",
81
+ description: "Dim styling",
82
+ defaultExample: "De-emphasized"
83
+ }
84
+ };
85
+ function getThemeMethodsByCategory() {
86
+ const semantic = [];
87
+ const utility = [];
88
+ for (const [key, meta] of Object.entries(THEME_METHOD_META)) {
89
+ if (meta.category === "semantic") {
90
+ semantic.push(key);
91
+ } else {
92
+ utility.push(key);
93
+ }
94
+ }
95
+ return { semantic, utility };
96
+ }
97
+ var BORDER_STYLE_META = {
98
+ single: {
99
+ value: "single",
100
+ label: "Single",
101
+ description: "Standard Unicode single-line borders (\u250C\u2500\u2510)"
102
+ },
103
+ double: {
104
+ value: "double",
105
+ label: "Double",
106
+ description: "Double-line borders (\u2554\u2550\u2557)"
107
+ },
108
+ rounded: {
109
+ value: "rounded",
110
+ label: "Rounded",
111
+ description: "Rounded corners with single lines (\u256D\u2500\u256E)"
112
+ },
113
+ heavy: {
114
+ value: "heavy",
115
+ label: "Heavy",
116
+ description: "Thick/heavy borders (\u250F\u2501\u2513)"
117
+ },
118
+ ascii: {
119
+ value: "ascii",
120
+ label: "ASCII",
121
+ description: "ASCII-only fallback (+, -, |)"
122
+ },
123
+ none: {
124
+ value: "none",
125
+ label: "None",
126
+ description: "No borders (empty strings)"
127
+ }
128
+ };
129
+ function getBorderStyles() {
130
+ return Object.keys(BORDER_STYLE_META);
131
+ }
132
+ var SPINNER_STYLE_META = {
133
+ dots: {
134
+ value: "dots",
135
+ label: "Dots",
136
+ description: "Braille dots animation (default, smooth)"
137
+ },
138
+ line: {
139
+ value: "line",
140
+ label: "Line",
141
+ description: "Classic ASCII spinner (-\\|/)"
142
+ },
143
+ arc: {
144
+ value: "arc",
145
+ label: "Arc",
146
+ description: "Corner arc rotation"
147
+ },
148
+ circle: {
149
+ value: "circle",
150
+ label: "Circle",
151
+ description: "Half-filled circle rotation"
152
+ },
153
+ bounce: {
154
+ value: "bounce",
155
+ label: "Bounce",
156
+ description: "Bouncing dot (vertical)"
157
+ },
158
+ ping: {
159
+ value: "ping",
160
+ label: "Ping",
161
+ description: "Bouncing dot in brackets (horizontal)"
162
+ }
163
+ };
164
+ function getSpinnerStyles() {
165
+ return Object.keys(SPINNER_STYLE_META);
166
+ }
167
+ var LIST_STYLE_META = {
168
+ dash: {
169
+ value: "dash",
170
+ label: "Dash",
171
+ description: "Uses - character (default)"
172
+ },
173
+ bullet: {
174
+ value: "bullet",
175
+ label: "Bullet",
176
+ description: "Uses \u2022 character"
177
+ },
178
+ number: {
179
+ value: "number",
180
+ label: "Number",
181
+ description: "Uses 1. for top-level, a. for nested, i. for deeply nested"
182
+ },
183
+ checkbox: {
184
+ value: "checkbox",
185
+ label: "Checkbox",
186
+ description: "Uses \u2610 for unchecked, \u2611 for checked"
187
+ }
188
+ };
189
+ function getListStyles() {
190
+ return Object.keys(LIST_STYLE_META);
191
+ }
192
+ var PRIMITIVE_META = {
193
+ colors: {
194
+ id: "colors",
195
+ name: "Colors",
196
+ description: "Semantic color theme with ANSI support",
197
+ importExample: 'import { createTheme } from "@outfitter/cli/render";'
198
+ },
199
+ borders: {
200
+ id: "borders",
201
+ name: "Borders",
202
+ description: "Box-drawing character sets",
203
+ importExample: 'import { BORDERS, getBorderCharacters } from "@outfitter/cli/render";'
204
+ },
205
+ spinner: {
206
+ id: "spinner",
207
+ name: "Spinner",
208
+ description: "Animated spinners for async operations",
209
+ importExample: 'import { renderSpinner, SPINNERS } from "@outfitter/cli/render";'
210
+ },
211
+ list: {
212
+ id: "list",
213
+ name: "List",
214
+ description: "Bullet, numbered, and checkbox lists",
215
+ importExample: 'import { renderList } from "@outfitter/cli/render";'
216
+ },
217
+ box: {
218
+ id: "box",
219
+ name: "Box",
220
+ description: "Bordered panels with optional titles",
221
+ importExample: 'import { renderBox } from "@outfitter/cli/render";'
222
+ },
223
+ table: {
224
+ id: "table",
225
+ name: "Table",
226
+ description: "Unicode tables with multiple border styles",
227
+ importExample: 'import { renderTable } from "@outfitter/cli/render";'
228
+ },
229
+ progress: {
230
+ id: "progress",
231
+ name: "Progress",
232
+ description: "Progress bars with filled/empty segments",
233
+ importExample: 'import { renderProgress } from "@outfitter/cli/render";'
234
+ },
235
+ tree: {
236
+ id: "tree",
237
+ name: "Tree",
238
+ description: "Hierarchical tree rendering",
239
+ importExample: 'import { renderTree } from "@outfitter/cli/render";'
240
+ },
241
+ text: {
242
+ id: "text",
243
+ name: "Text",
244
+ description: "Text utilities (width, wrap, truncate, pad)",
245
+ importExample: 'import { getStringWidth, wrapText, truncateText, padText } from "@outfitter/cli/render";'
246
+ },
247
+ markdown: {
248
+ id: "markdown",
249
+ name: "Markdown",
250
+ description: "Markdown to terminal ANSI rendering",
251
+ importExample: 'import { renderMarkdown } from "@outfitter/cli/render";'
252
+ },
253
+ indicators: {
254
+ id: "indicators",
255
+ name: "Indicators",
256
+ description: "Status symbols, selection markers, and progress indicators",
257
+ importExample: 'import { getIndicator, INDICATORS } from "@outfitter/cli/render";'
258
+ }
259
+ };
260
+ function getPrimitiveIds() {
261
+ return Object.keys(PRIMITIVE_META);
262
+ }
263
+ function getPrimitiveMeta(id) {
264
+ return PRIMITIVE_META[id];
265
+ }
266
+
267
+ export { THEME_METHOD_META, getThemeMethodsByCategory, BORDER_STYLE_META, getBorderStyles, SPINNER_STYLE_META, getSpinnerStyles, LIST_STYLE_META, getListStyles, PRIMITIVE_META, getPrimitiveIds, getPrimitiveMeta };
@@ -0,0 +1,7 @@
1
+ // @bun
2
+ import {
3
+ init_borders
4
+ } from "./cli-85fg2vr5.js";
5
+
6
+ // packages/cli/src/borders/index.ts
7
+ init_borders();
@@ -0,0 +1 @@
1
+ // @bun
@@ -0,0 +1,26 @@
1
+ import { VisualTheme } from "./cli-s0kkx9m1";
2
+ /**
3
+ * Minimal visual theme.
4
+ *
5
+ * Features:
6
+ * - ASCII-only borders (+, -, |)
7
+ * - ASCII-safe list bullets and checkboxes
8
+ * - Line spinner (ASCII-compatible)
9
+ * - No unicode characters anywhere
10
+ *
11
+ * Use this theme when targeting terminals without unicode support
12
+ * or when running in CI/log environments.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { minimalTheme } from "@outfitter/cli/theme/presets";
17
+ *
18
+ * // Use ASCII-safe styling
19
+ * const box = renderBox("Hello", { border: minimalTheme.border });
20
+ * // +-------+
21
+ * // | Hello |
22
+ * // +-------+
23
+ * ```
24
+ */
25
+ declare const minimalTheme: VisualTheme;
26
+ export { minimalTheme };
@@ -0,0 +1,19 @@
1
+ // @bun
2
+ // packages/cli/src/prompt/validators.ts
3
+ var validators = {
4
+ required: (message = "Required") => (value) => value.length > 0 ? undefined : message,
5
+ minLength: (length, message) => (value) => value.length >= length ? undefined : message ?? `Minimum ${length} characters`,
6
+ maxLength: (length, message) => (value) => value.length <= length ? undefined : message ?? `Maximum ${length} characters`,
7
+ pattern: (regex, message) => (value) => regex.test(value) ? undefined : message,
8
+ email: (message = "Invalid email") => validators.pattern(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, message),
9
+ compose: (...fns) => (value) => {
10
+ for (const fn of fns) {
11
+ const error = fn(value);
12
+ if (error)
13
+ return error;
14
+ }
15
+ return;
16
+ }
17
+ };
18
+
19
+ export { validators };
@@ -0,0 +1,51 @@
1
+ // @bun
2
+ // packages/cli/src/render/spinner.ts
3
+ var SPINNERS = {
4
+ dots: {
5
+ frames: ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"],
6
+ interval: 80
7
+ },
8
+ line: {
9
+ frames: ["-", "\\", "|", "/"],
10
+ interval: 100
11
+ },
12
+ arc: {
13
+ frames: ["\u25DC", "\u25DD", "\u25DE", "\u25DF"],
14
+ interval: 100
15
+ },
16
+ circle: {
17
+ frames: ["\u25D0", "\u25D3", "\u25D1", "\u25D2"],
18
+ interval: 100
19
+ },
20
+ bounce: {
21
+ frames: ["\u2801", "\u2802", "\u2804", "\u2802"],
22
+ interval: 120
23
+ },
24
+ ping: {
25
+ frames: [
26
+ "(\u25CF )",
27
+ "( \u25CF )",
28
+ "( \u25CF )",
29
+ "( \u25CF )",
30
+ "( \u25CF)",
31
+ "( \u25CF )",
32
+ "( \u25CF )",
33
+ "( \u25CF )"
34
+ ],
35
+ interval: 80
36
+ }
37
+ };
38
+ function getSpinnerFrame(style, elapsed) {
39
+ const spinner = SPINNERS[style];
40
+ const frameIndex = Math.floor(elapsed / spinner.interval) % spinner.frames.length;
41
+ return spinner.frames[frameIndex] ?? spinner.frames[0] ?? "...";
42
+ }
43
+ function renderSpinner(style, message) {
44
+ const frame = getSpinnerFrame(style, 0);
45
+ if (message && message.length > 0) {
46
+ return `${frame} ${message}`;
47
+ }
48
+ return frame;
49
+ }
50
+
51
+ export { SPINNERS, getSpinnerFrame, renderSpinner };
@@ -0,0 +1,128 @@
1
+ // @bun
2
+ import {
3
+ demoSection
4
+ } from "./cli-34fqr7bp.js";
5
+ import {
6
+ getStringWidth,
7
+ init_text,
8
+ padText,
9
+ pluralize,
10
+ slugify,
11
+ truncateText,
12
+ wrapText
13
+ } from "./cli-jjemfdta.js";
14
+
15
+ // packages/cli/src/demo/renderers/text.ts
16
+ init_text();
17
+ function renderTextDemo(config, theme) {
18
+ const showCode = config.showCode ?? true;
19
+ const lines = [];
20
+ lines.push(demoSection("String Width"));
21
+ lines.push("");
22
+ if (showCode) {
23
+ lines.push('import { getStringWidth } from "@outfitter/cli/render";');
24
+ lines.push("");
25
+ }
26
+ const widthExamples = [
27
+ { text: "Hello", expected: 5 },
28
+ { text: "\u4F60\u597D", expected: 4 },
29
+ { text: "\uD83C\uDF89", expected: 2 },
30
+ { text: "\x1B[32mGreen\x1B[0m", expected: 5 }
31
+ ];
32
+ for (const ex of widthExamples) {
33
+ const width = getStringWidth(ex.text);
34
+ const display = ex.text.includes("\x1B") ? '"\\x1b[32mGreen\\x1b[0m"' : `"${ex.text}"`;
35
+ lines.push(`getStringWidth(${display.padEnd(24)}) \u2192 ${width}`);
36
+ }
37
+ lines.push("");
38
+ lines.push(theme.muted("Correctly handles CJK, emoji, and ANSI codes."));
39
+ lines.push("");
40
+ lines.push(demoSection("Text Wrapping"));
41
+ lines.push("");
42
+ if (showCode) {
43
+ lines.push('import { wrapText } from "@outfitter/cli/render";');
44
+ lines.push("");
45
+ }
46
+ const longText = "This is a long sentence that should be wrapped at the specified width.";
47
+ if (showCode) {
48
+ lines.push(`wrapText("${longText}", 30)`);
49
+ lines.push("");
50
+ }
51
+ lines.push("Result:");
52
+ const wrapped = wrapText(longText, 30);
53
+ for (const line of wrapped.split(`
54
+ `)) {
55
+ lines.push(` \u2502${line}\u2502`);
56
+ }
57
+ lines.push("");
58
+ lines.push(demoSection("Truncation"));
59
+ lines.push("");
60
+ if (showCode) {
61
+ lines.push('import { truncateText } from "@outfitter/cli/render";');
62
+ lines.push("");
63
+ }
64
+ const truncExamples = [
65
+ { text: "Hello World", width: 8 },
66
+ { text: "Short", width: 10 },
67
+ { text: "Very long text that will be truncated", width: 15 }
68
+ ];
69
+ for (const ex of truncExamples) {
70
+ const result = truncateText(ex.text, ex.width);
71
+ lines.push(`truncateText("${ex.text}", ${ex.width})`);
72
+ lines.push(` \u2192 "${result}"`);
73
+ lines.push("");
74
+ }
75
+ lines.push(demoSection("Padding"));
76
+ lines.push("");
77
+ if (showCode) {
78
+ lines.push('import { padText } from "@outfitter/cli/render";');
79
+ lines.push("");
80
+ }
81
+ const padExamples = ["Hi", "Hello", "Greetings"];
82
+ for (const text of padExamples) {
83
+ const padded = padText(text, 15);
84
+ lines.push(`padText("${text}", 15) \u2192 "${padded}"`);
85
+ }
86
+ lines.push("");
87
+ lines.push(demoSection("Pluralize"));
88
+ lines.push("");
89
+ if (showCode) {
90
+ lines.push('import { pluralize } from "@outfitter/cli/render";');
91
+ lines.push("");
92
+ }
93
+ const pluralExamples = [
94
+ { count: 0, word: "item" },
95
+ { count: 1, word: "item" },
96
+ { count: 5, word: "item" },
97
+ { count: 1, word: "child", plural: "children" },
98
+ { count: 3, word: "child", plural: "children" }
99
+ ];
100
+ for (const ex of pluralExamples) {
101
+ const result = pluralize(ex.count, ex.word, ex.plural);
102
+ const code = ex.plural ? `pluralize(${ex.count}, "${ex.word}", "${ex.plural}")` : `pluralize(${ex.count}, "${ex.word}")`;
103
+ lines.push(`${code.padEnd(40)} \u2192 "${result}"`);
104
+ }
105
+ lines.push("");
106
+ lines.push(demoSection("Slugify"));
107
+ lines.push("");
108
+ if (showCode) {
109
+ lines.push('import { slugify } from "@outfitter/cli/render";');
110
+ lines.push("");
111
+ }
112
+ const slugExamples = [
113
+ "Hello World!",
114
+ "This & That",
115
+ " Multiple Spaces ",
116
+ "CamelCase"
117
+ ];
118
+ for (const text of slugExamples) {
119
+ const result = slugify(text);
120
+ lines.push(`slugify("${text}")`);
121
+ lines.push(` \u2192 "${result}"`);
122
+ lines.push("");
123
+ }
124
+ return lines.join(`
125
+ `);
126
+ }
127
+
128
+ export { renderTextDemo };
@@ -0,0 +1,169 @@
1
+ // @bun
2
+ // packages/cli/src/render/indicators.ts
3
+ var INDICATORS = {
4
+ status: {
5
+ success: { unicode: "\u2714", fallback: "[ok]", color: "green" },
6
+ error: { unicode: "\u2716", fallback: "[x]", color: "red" },
7
+ warning: { unicode: "\u26A0", fallback: "[!]", color: "yellow" },
8
+ info: { unicode: "\u2139", fallback: "[i]", color: "blue" }
9
+ },
10
+ marker: {
11
+ circle: { unicode: "\u25CF", fallback: "*" },
12
+ circleOutline: { unicode: "\u25CB", fallback: "o" },
13
+ circleDotted: { unicode: "\u25CC", fallback: "o" },
14
+ circleSmall: { unicode: "\u2022", fallback: "\xB7" },
15
+ circleDot: { unicode: "\u25C9", fallback: "(*)" },
16
+ circleDotOutline: { unicode: "\u25EF", fallback: "( )" },
17
+ square: { unicode: "\u25A0", fallback: "[#]" },
18
+ squareOutline: { unicode: "\u25A1", fallback: "[ ]" },
19
+ squareSmall: { unicode: "\u25FC", fallback: "[#]" },
20
+ squareSmallOutline: { unicode: "\u25FB", fallback: "[ ]" },
21
+ lozenge: { unicode: "\u25C6", fallback: "\u2666" },
22
+ lozengeOutline: { unicode: "\u25C7", fallback: "\u25CA" },
23
+ dash: { unicode: "\u2013", fallback: "-" },
24
+ pointer: { unicode: "\u276F", fallback: ">" },
25
+ pointerSmall: { unicode: "\u203A", fallback: ">" },
26
+ checkbox: { unicode: "\u2610", fallback: "[ ]" },
27
+ checkboxChecked: { unicode: "\u2611", fallback: "[x]" },
28
+ checkboxCross: { unicode: "\u2612", fallback: "[X]" }
29
+ },
30
+ progress: {
31
+ circleEmpty: { unicode: "\u25CB", fallback: "." },
32
+ circleQuarter: { unicode: "\u25D4", fallback: "o" },
33
+ circleHalf: { unicode: "\u25D1", fallback: "O" },
34
+ circleThree: { unicode: "\u25D5", fallback: "0" },
35
+ circleFull: { unicode: "\u25CF", fallback: "@" },
36
+ vertical1: { unicode: "\u2581", fallback: "_" },
37
+ vertical2: { unicode: "\u2582", fallback: "_" },
38
+ vertical3: { unicode: "\u2583", fallback: "=" },
39
+ vertical4: { unicode: "\u2584", fallback: "=" },
40
+ vertical5: { unicode: "\u2585", fallback: "#" },
41
+ vertical6: { unicode: "\u2586", fallback: "#" },
42
+ vertical7: { unicode: "\u2587", fallback: "#" },
43
+ verticalFull: { unicode: "\u2588", fallback: "#" },
44
+ horizontal1: { unicode: "\u258F", fallback: "|" },
45
+ horizontal2: { unicode: "\u258E", fallback: "|" },
46
+ horizontal3: { unicode: "\u258D", fallback: "|" },
47
+ horizontal4: { unicode: "\u258C", fallback: "|" },
48
+ horizontal5: { unicode: "\u258B", fallback: "|" },
49
+ horizontal6: { unicode: "\u258A", fallback: "|" },
50
+ horizontal7: { unicode: "\u2589", fallback: "|" },
51
+ horizontalFull: { unicode: "\u2588", fallback: "#" },
52
+ shadeLight: { unicode: "\u2591", fallback: "." },
53
+ shadeMedium: { unicode: "\u2592", fallback: ":" },
54
+ shadeDark: { unicode: "\u2593", fallback: "#" }
55
+ },
56
+ triangle: {
57
+ up: { unicode: "\u25B2", fallback: "^" },
58
+ upSmall: { unicode: "\u25B4", fallback: "^" },
59
+ upOutline: { unicode: "\u25B3", fallback: "^" },
60
+ down: { unicode: "\u25BC", fallback: "v" },
61
+ downSmall: { unicode: "\u25BE", fallback: "v" },
62
+ downOutline: { unicode: "\u25BD", fallback: "v" },
63
+ left: { unicode: "\u25C0", fallback: "<" },
64
+ leftSmall: { unicode: "\u25C2", fallback: "<" },
65
+ leftOutline: { unicode: "\u25C1", fallback: "<" },
66
+ right: { unicode: "\u25B6", fallback: ">" },
67
+ rightSmall: { unicode: "\u25B8", fallback: ">" },
68
+ rightOutline: { unicode: "\u25B7", fallback: ">" }
69
+ },
70
+ special: {
71
+ star: { unicode: "\u2605", fallback: "*" },
72
+ starOutline: { unicode: "\u2606", fallback: "*" },
73
+ heart: { unicode: "\u2665", fallback: "<3" },
74
+ heartOutline: { unicode: "\u2661", fallback: "<3" },
75
+ flag: { unicode: "\u2691", fallback: "[F]" },
76
+ flagOutline: { unicode: "\u2690", fallback: "[f]" },
77
+ gear: { unicode: "\u2699", fallback: "[*]" }
78
+ },
79
+ directional: {
80
+ arrowUp: { unicode: "\u2191", fallback: "^" },
81
+ arrowDown: { unicode: "\u2193", fallback: "v" },
82
+ arrowLeft: { unicode: "\u2190", fallback: "<-" },
83
+ arrowRight: { unicode: "\u2192", fallback: "->" },
84
+ arrowLeftRight: { unicode: "\u2194", fallback: "<->" },
85
+ arrowUpDown: { unicode: "\u2195", fallback: "^v" }
86
+ },
87
+ math: {
88
+ almostEqual: { unicode: "\u2248", fallback: "~=" },
89
+ notEqual: { unicode: "\u2260", fallback: "!=" },
90
+ lessOrEqual: { unicode: "\u2264", fallback: "<=" },
91
+ greaterOrEqual: { unicode: "\u2265", fallback: ">=" },
92
+ identical: { unicode: "\u2261", fallback: "===" },
93
+ infinity: { unicode: "\u221E", fallback: "inf" }
94
+ }
95
+ };
96
+ function isUnicodeSupported() {
97
+ if (process.env["CI"]) {
98
+ return true;
99
+ }
100
+ if (process.env["WT_SESSION"]) {
101
+ return true;
102
+ }
103
+ if (process.env["ConEmuTask"]) {
104
+ return true;
105
+ }
106
+ const term = process.env["TERM"] ?? "";
107
+ if (term === "xterm-256color" || term === "xterm" || term.includes("256color") || term.includes("truecolor")) {
108
+ return true;
109
+ }
110
+ const lang = process.env["LANG"] ?? process.env["LC_ALL"] ?? "";
111
+ if (lang.toLowerCase().includes("utf-8") || lang.toLowerCase().includes("utf8")) {
112
+ return true;
113
+ }
114
+ if (process.platform !== "win32") {
115
+ return true;
116
+ }
117
+ return false;
118
+ }
119
+ function getIndicator(category, name, forceUnicode) {
120
+ const indicator = INDICATORS[category][name];
121
+ if (!indicator) {
122
+ return "";
123
+ }
124
+ const useUnicode = forceUnicode ?? isUnicodeSupported();
125
+ return useUnicode ? indicator.unicode : indicator.fallback;
126
+ }
127
+ var PROGRESS_SEQUENCES = {
128
+ circle: [
129
+ "circleEmpty",
130
+ "circleQuarter",
131
+ "circleHalf",
132
+ "circleThree",
133
+ "circleFull"
134
+ ],
135
+ vertical: [
136
+ "vertical1",
137
+ "vertical2",
138
+ "vertical3",
139
+ "vertical4",
140
+ "vertical5",
141
+ "vertical6",
142
+ "vertical7",
143
+ "verticalFull"
144
+ ],
145
+ horizontal: [
146
+ "horizontal1",
147
+ "horizontal2",
148
+ "horizontal3",
149
+ "horizontal4",
150
+ "horizontal5",
151
+ "horizontal6",
152
+ "horizontal7",
153
+ "horizontalFull"
154
+ ],
155
+ shade: ["shadeLight", "shadeMedium", "shadeDark"]
156
+ };
157
+ function getProgressIndicator(style, current, max, forceUnicode) {
158
+ const sequence = PROGRESS_SEQUENCES[style];
159
+ const steps = sequence.length;
160
+ const ratio = max <= 0 ? 0 : Math.max(0, Math.min(1, current / max));
161
+ const index = Math.round(ratio * (steps - 1));
162
+ const name = sequence[index];
163
+ if (name === undefined) {
164
+ return "";
165
+ }
166
+ return getIndicator("progress", name, forceUnicode);
167
+ }
168
+
169
+ export { INDICATORS, isUnicodeSupported, getIndicator, getProgressIndicator };