@outfitter/tui 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/README.md +250 -0
  2. package/dist/borders/index.d.ts +3 -0
  3. package/dist/borders/index.js +13 -0
  4. package/dist/box/index.d.ts +4 -0
  5. package/dist/box/index.js +10 -0
  6. package/dist/confirm.d.ts +37 -0
  7. package/dist/confirm.js +36 -0
  8. package/dist/demo/index.d.ts +77 -0
  9. package/dist/demo/index.js +142 -0
  10. package/dist/demo/registry.d.ts +6 -0
  11. package/dist/demo/registry.js +28 -0
  12. package/dist/demo/renderers/borders.d.ts +7 -0
  13. package/dist/demo/renderers/borders.js +14 -0
  14. package/dist/demo/renderers/box.d.ts +7 -0
  15. package/dist/demo/renderers/box.js +15 -0
  16. package/dist/demo/renderers/colors.d.ts +7 -0
  17. package/dist/demo/renderers/colors.js +15 -0
  18. package/dist/demo/renderers/indicators.d.ts +7 -0
  19. package/dist/demo/renderers/indicators.js +14 -0
  20. package/dist/demo/renderers/list.d.ts +7 -0
  21. package/dist/demo/renderers/list.js +16 -0
  22. package/dist/demo/renderers/markdown.d.ts +7 -0
  23. package/dist/demo/renderers/markdown.js +15 -0
  24. package/dist/demo/renderers/progress.d.ts +7 -0
  25. package/dist/demo/renderers/progress.js +14 -0
  26. package/dist/demo/renderers/spinner.d.ts +7 -0
  27. package/dist/demo/renderers/spinner.js +16 -0
  28. package/dist/demo/renderers/table.d.ts +7 -0
  29. package/dist/demo/renderers/table.js +16 -0
  30. package/dist/demo/renderers/text.d.ts +7 -0
  31. package/dist/demo/renderers/text.js +13 -0
  32. package/dist/demo/renderers/tree.d.ts +7 -0
  33. package/dist/demo/renderers/tree.js +15 -0
  34. package/dist/demo/section.d.ts +4 -0
  35. package/dist/demo/section.js +20 -0
  36. package/dist/demo/templates.d.ts +3 -0
  37. package/dist/demo/templates.js +10 -0
  38. package/dist/demo/types.d.ts +2 -0
  39. package/dist/demo/types.js +8 -0
  40. package/dist/index.d.ts +31 -0
  41. package/dist/index.js +77 -0
  42. package/dist/list/index.d.ts +3 -0
  43. package/dist/list/index.js +9 -0
  44. package/dist/preset/full.d.ts +12 -0
  45. package/dist/preset/full.js +37 -0
  46. package/dist/preset/standard.d.ts +9 -0
  47. package/dist/preset/standard.js +26 -0
  48. package/dist/prompt/confirm.d.ts +4 -0
  49. package/dist/prompt/confirm.js +9 -0
  50. package/dist/prompt/group.d.ts +4 -0
  51. package/dist/prompt/group.js +9 -0
  52. package/dist/prompt/index.d.ts +7 -0
  53. package/dist/prompt/index.js +32 -0
  54. package/dist/prompt/select.d.ts +4 -0
  55. package/dist/prompt/select.js +11 -0
  56. package/dist/prompt/text.d.ts +4 -0
  57. package/dist/prompt/text.js +11 -0
  58. package/dist/prompt/types.d.ts +3 -0
  59. package/dist/prompt/types.js +8 -0
  60. package/dist/prompt/validators.d.ts +2 -0
  61. package/dist/prompt/validators.js +8 -0
  62. package/dist/render/borders.d.ts +2 -0
  63. package/dist/render/borders.js +15 -0
  64. package/dist/render/box.d.ts +3 -0
  65. package/dist/render/box.js +20 -0
  66. package/dist/render/date.d.ts +2 -0
  67. package/dist/render/date.js +12 -0
  68. package/dist/render/format-relative.d.ts +2 -0
  69. package/dist/render/format-relative.js +8 -0
  70. package/dist/render/format.d.ts +2 -0
  71. package/dist/render/format.js +10 -0
  72. package/dist/render/heading.d.ts +3 -0
  73. package/dist/render/heading.js +11 -0
  74. package/dist/render/index.d.ts +31 -0
  75. package/dist/render/index.js +222 -0
  76. package/dist/render/indicators.d.ts +2 -0
  77. package/dist/render/indicators.js +16 -0
  78. package/dist/render/json.d.ts +2 -0
  79. package/dist/render/json.js +10 -0
  80. package/dist/render/layout.d.ts +5 -0
  81. package/dist/render/layout.js +22 -0
  82. package/dist/render/list.d.ts +2 -0
  83. package/dist/render/list.js +8 -0
  84. package/dist/render/markdown.d.ts +2 -0
  85. package/dist/render/markdown.js +8 -0
  86. package/dist/render/progress.d.ts +2 -0
  87. package/dist/render/progress.js +8 -0
  88. package/dist/render/separator.d.ts +3 -0
  89. package/dist/render/separator.js +11 -0
  90. package/dist/render/shapes.d.ts +2 -0
  91. package/dist/render/shapes.js +32 -0
  92. package/dist/render/spinner.d.ts +2 -0
  93. package/dist/render/spinner.js +12 -0
  94. package/dist/render/stack.d.ts +3 -0
  95. package/dist/render/stack.js +35 -0
  96. package/dist/render/table.d.ts +3 -0
  97. package/dist/render/table.js +9 -0
  98. package/dist/render/tree.d.ts +2 -0
  99. package/dist/render/tree.js +10 -0
  100. package/dist/render/types.d.ts +2 -0
  101. package/dist/render/types.js +1 -0
  102. package/dist/shared/@outfitter/tui-011579t8.d.ts +24 -0
  103. package/dist/shared/@outfitter/tui-06dntkse.js +146 -0
  104. package/dist/shared/@outfitter/tui-0awf316b.js +71 -0
  105. package/dist/shared/@outfitter/tui-0b85rht7.js +1 -0
  106. package/dist/shared/@outfitter/tui-0mpqnyc1.js +55 -0
  107. package/dist/shared/@outfitter/tui-1qh888th.d.ts +106 -0
  108. package/dist/shared/@outfitter/tui-1tk0kxa6.js +94 -0
  109. package/dist/shared/@outfitter/tui-1wggw2zj.d.ts +56 -0
  110. package/dist/shared/@outfitter/tui-2pwhzg55.js +123 -0
  111. package/dist/shared/@outfitter/tui-2tkva96b.d.ts +20 -0
  112. package/dist/shared/@outfitter/tui-2wfat6jb.js +22 -0
  113. package/dist/shared/@outfitter/tui-34q2aenf.d.ts +24 -0
  114. package/dist/shared/@outfitter/tui-37hjcqhb.d.ts +3 -0
  115. package/dist/shared/@outfitter/tui-3dyxg62j.d.ts +97 -0
  116. package/dist/shared/@outfitter/tui-3kza6p9k.d.ts +132 -0
  117. package/dist/shared/@outfitter/tui-43bnfxv9.js +30 -0
  118. package/dist/shared/@outfitter/tui-4yz7jcyq.js +214 -0
  119. package/dist/shared/@outfitter/tui-52ndmswq.js +23 -0
  120. package/dist/shared/@outfitter/tui-53ms1ba4.d.ts +41 -0
  121. package/dist/shared/@outfitter/tui-5dsn6d6d.js +86 -0
  122. package/dist/shared/@outfitter/tui-5pb72vf9.js +51 -0
  123. package/dist/shared/@outfitter/tui-6605wa2j.js +127 -0
  124. package/dist/shared/@outfitter/tui-6ptks7jj.js +19 -0
  125. package/dist/shared/@outfitter/tui-6svngg69.js +126 -0
  126. package/dist/shared/@outfitter/tui-733asbd8.js +37 -0
  127. package/dist/shared/@outfitter/tui-75bztyfp.d.ts +50 -0
  128. package/dist/shared/@outfitter/tui-83zaah9b.d.ts +17 -0
  129. package/dist/shared/@outfitter/tui-8ejx8gq5.d.ts +71 -0
  130. package/dist/shared/@outfitter/tui-8j1gbehy.d.ts +164 -0
  131. package/dist/shared/@outfitter/tui-8mypsnva.d.ts +74 -0
  132. package/dist/shared/@outfitter/tui-997aapz0.js +61 -0
  133. package/dist/shared/@outfitter/tui-9dbykt4g.d.ts +42 -0
  134. package/dist/shared/@outfitter/tui-9h1kdd98.d.ts +119 -0
  135. package/dist/shared/@outfitter/tui-9rj9yesd.js +118 -0
  136. package/dist/shared/@outfitter/tui-a65efhsk.d.ts +23 -0
  137. package/dist/shared/@outfitter/tui-a8nkrbds.js +1 -0
  138. package/dist/shared/@outfitter/tui-ajp1153q.d.ts +59 -0
  139. package/dist/shared/@outfitter/tui-ay1fv41j.d.ts +30 -0
  140. package/dist/shared/@outfitter/tui-azh1w4ak.js +67 -0
  141. package/dist/shared/@outfitter/tui-b14ry1j1.d.ts +53 -0
  142. package/dist/shared/@outfitter/tui-c56sxcm8.d.ts +87 -0
  143. package/dist/shared/@outfitter/tui-c6ft5w6q.d.ts +91 -0
  144. package/dist/shared/@outfitter/tui-cq7za0cz.js +62 -0
  145. package/dist/shared/@outfitter/tui-dh15zwg0.js +95 -0
  146. package/dist/shared/@outfitter/tui-esc46z2v.js +20 -0
  147. package/dist/shared/@outfitter/tui-f1mj6h6p.d.ts +2 -0
  148. package/dist/shared/@outfitter/tui-gcpz529w.js +122 -0
  149. package/dist/shared/@outfitter/tui-gqsdhmk9.d.ts +42 -0
  150. package/dist/shared/@outfitter/tui-hescagw2.js +32 -0
  151. package/dist/shared/@outfitter/tui-j2kd7eej.js +126 -0
  152. package/dist/shared/@outfitter/tui-j3bkjt2g.js +7 -0
  153. package/dist/shared/@outfitter/tui-jnn9d8cd.js +8 -0
  154. package/dist/shared/@outfitter/tui-jz5nws55.d.ts +51 -0
  155. package/dist/shared/@outfitter/tui-k3mby2kk.js +70 -0
  156. package/dist/shared/@outfitter/tui-kc4nxak0.js +20 -0
  157. package/dist/shared/@outfitter/tui-kcxv8txp.js +7 -0
  158. package/dist/shared/@outfitter/tui-kydbggmj.js +39 -0
  159. package/dist/shared/@outfitter/tui-mch672g9.js +30 -0
  160. package/dist/shared/@outfitter/tui-n9kxkdrh.js +82 -0
  161. package/dist/shared/@outfitter/tui-na4dnjpw.js +348 -0
  162. package/dist/shared/@outfitter/tui-ncaatp4j.js +25 -0
  163. package/dist/shared/@outfitter/tui-nce7fgtf.js +48 -0
  164. package/dist/shared/@outfitter/tui-ngz2fbdw.js +144 -0
  165. package/dist/shared/@outfitter/tui-nprd7g0d.js +52 -0
  166. package/dist/shared/@outfitter/tui-nr580mbv.js +272 -0
  167. package/dist/shared/@outfitter/tui-nr93tf31.d.ts +64 -0
  168. package/dist/shared/@outfitter/tui-pdwbbzwr.js +179 -0
  169. package/dist/shared/@outfitter/tui-qb07rtct.js +19 -0
  170. package/dist/shared/@outfitter/tui-qkyazctw.d.ts +36 -0
  171. package/dist/shared/@outfitter/tui-qn1rgz9v.d.ts +93 -0
  172. package/dist/shared/@outfitter/tui-qs3fhwp8.js +43 -0
  173. package/dist/shared/@outfitter/tui-r8hywf9m.d.ts +48 -0
  174. package/dist/shared/@outfitter/tui-rbbcc034.js +20 -0
  175. package/dist/shared/@outfitter/tui-rgkerz72.js +85 -0
  176. package/dist/shared/@outfitter/tui-rh52sycm.d.ts +45 -0
  177. package/dist/shared/@outfitter/tui-rr924x4z.d.ts +59 -0
  178. package/dist/shared/@outfitter/tui-rwpdjrt3.js +20 -0
  179. package/dist/shared/@outfitter/tui-rx9xq9s7.d.ts +26 -0
  180. package/dist/shared/@outfitter/tui-sk05ye6g.js +1 -0
  181. package/dist/shared/@outfitter/tui-sv2xmh3w.d.ts +26 -0
  182. package/dist/shared/@outfitter/tui-t1a9xgbd.js +111 -0
  183. package/dist/shared/@outfitter/tui-t9vd88jr.js +273 -0
  184. package/dist/shared/@outfitter/tui-tq1z78x0.js +11 -0
  185. package/dist/shared/@outfitter/tui-ts1f957s.d.ts +128 -0
  186. package/dist/shared/@outfitter/tui-ve0083wa.d.ts +61 -0
  187. package/dist/shared/@outfitter/tui-vt0wg6c4.js +54 -0
  188. package/dist/shared/@outfitter/tui-wfnnq0zq.d.ts +328 -0
  189. package/dist/shared/@outfitter/tui-x3yg0887.d.ts +223 -0
  190. package/dist/shared/@outfitter/tui-x9vvtfkk.js +20 -0
  191. package/dist/shared/@outfitter/tui-xbvz707j.js +20 -0
  192. package/dist/shared/@outfitter/tui-xbx6d4t7.js +1 -0
  193. package/dist/shared/@outfitter/tui-xph95b7h.js +67 -0
  194. package/dist/shared/@outfitter/tui-xqjx7d1f.js +135 -0
  195. package/dist/shared/@outfitter/tui-xrgrp99k.d.ts +112 -0
  196. package/dist/shared/@outfitter/tui-xzjv96ps.d.ts +300 -0
  197. package/dist/shared/@outfitter/tui-ykzs6v4v.d.ts +66 -0
  198. package/dist/shared/@outfitter/tui-yw9n5h6q.d.ts +54 -0
  199. package/dist/shared/@outfitter/tui-ywmakc6b.js +30 -0
  200. package/dist/shared/@outfitter/tui-z6nf9b9h.js +7 -0
  201. package/dist/shared/@outfitter/tui-zcspg6z6.d.ts +190 -0
  202. package/dist/shared/@outfitter/tui-zhbsnj7w.js +1 -0
  203. package/dist/streaming/ansi.d.ts +2 -0
  204. package/dist/streaming/ansi.js +8 -0
  205. package/dist/streaming/index.d.ts +4 -0
  206. package/dist/streaming/index.js +17 -0
  207. package/dist/streaming/spinner.d.ts +3 -0
  208. package/dist/streaming/spinner.js +10 -0
  209. package/dist/streaming/writer.d.ts +2 -0
  210. package/dist/streaming/writer.js +9 -0
  211. package/dist/table/index.d.ts +4 -0
  212. package/dist/table/index.js +10 -0
  213. package/dist/theme/context.d.ts +9 -0
  214. package/dist/theme/context.js +12 -0
  215. package/dist/theme/create.d.ts +8 -0
  216. package/dist/theme/create.js +10 -0
  217. package/dist/theme/index.d.ts +17 -0
  218. package/dist/theme/index.js +40 -0
  219. package/dist/theme/presets/bold.d.ts +8 -0
  220. package/dist/theme/presets/bold.js +10 -0
  221. package/dist/theme/presets/default.d.ts +8 -0
  222. package/dist/theme/presets/default.js +9 -0
  223. package/dist/theme/presets/index.d.ts +12 -0
  224. package/dist/theme/presets/index.js +22 -0
  225. package/dist/theme/presets/minimal.d.ts +8 -0
  226. package/dist/theme/presets/minimal.js +10 -0
  227. package/dist/theme/presets/rounded.d.ts +8 -0
  228. package/dist/theme/presets/rounded.js +10 -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/package.json +263 -0
@@ -0,0 +1,48 @@
1
+ // @bun
2
+ import {
3
+ defaultTheme
4
+ } from "./tui-0mpqnyc1.js";
5
+ import {
6
+ BORDERS,
7
+ init_borders
8
+ } from "./tui-2pwhzg55.js";
9
+
10
+ // packages/tui/src/theme/create.ts
11
+ init_borders();
12
+ function createVisualTheme(options) {
13
+ const base = options?.extends ?? defaultTheme;
14
+ const overrides = options?.overrides ?? {};
15
+ const border = overrides.border ?? base.border;
16
+ const borderChars = overrides.borderChars ?? (overrides.border ? BORDERS[overrides.border] : base.borderChars);
17
+ const colors = {
18
+ ...base.colors,
19
+ ...overrides.colors
20
+ };
21
+ const spacing = {
22
+ ...base.spacing,
23
+ ...overrides.spacing
24
+ };
25
+ const markers = {
26
+ ...base.markers,
27
+ ...overrides.markers
28
+ };
29
+ const checkbox = {
30
+ checked: overrides.checkbox?.checked ?? base.checkbox.checked,
31
+ unchecked: overrides.checkbox?.unchecked ?? base.checkbox.unchecked
32
+ };
33
+ return {
34
+ name: overrides.name ?? base.name,
35
+ border,
36
+ borderChars,
37
+ treeGuide: overrides.treeGuide ?? base.treeGuide,
38
+ delimiter: overrides.delimiter ?? base.delimiter,
39
+ markers,
40
+ listBullet: overrides.listBullet ?? base.listBullet,
41
+ checkbox,
42
+ colors,
43
+ spacing,
44
+ spinner: overrides.spinner ?? base.spinner
45
+ };
46
+ }
47
+
48
+ export { createVisualTheme };
@@ -0,0 +1,144 @@
1
+ // @bun
2
+ // packages/tui/src/render/date.ts
3
+ import { Result, ValidationError } from "@outfitter/contracts";
4
+ var ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
5
+ var NAMED_RANGES = ["today", "yesterday", "last week", "last month"];
6
+ function startOfDay(date) {
7
+ const result = new Date(date);
8
+ result.setHours(0, 0, 0, 0);
9
+ return result;
10
+ }
11
+ function endOfDay(date) {
12
+ const result = new Date(date);
13
+ result.setHours(23, 59, 59, 999);
14
+ return result;
15
+ }
16
+ function isNamedRange(input) {
17
+ return NAMED_RANGES.includes(input);
18
+ }
19
+ function parseNamedRange(name) {
20
+ const now = new Date(Date.now());
21
+ switch (name) {
22
+ case "today": {
23
+ return {
24
+ start: startOfDay(now),
25
+ end: endOfDay(now)
26
+ };
27
+ }
28
+ case "yesterday": {
29
+ const yesterday = new Date(now);
30
+ yesterday.setDate(yesterday.getDate() - 1);
31
+ return {
32
+ start: startOfDay(yesterday),
33
+ end: endOfDay(yesterday)
34
+ };
35
+ }
36
+ case "last week": {
37
+ const weekAgo = new Date(now);
38
+ weekAgo.setDate(weekAgo.getDate() - 7);
39
+ return {
40
+ start: startOfDay(weekAgo),
41
+ end: endOfDay(now)
42
+ };
43
+ }
44
+ case "last month": {
45
+ const monthAgo = new Date(now);
46
+ monthAgo.setDate(monthAgo.getDate() - 30);
47
+ return {
48
+ start: startOfDay(monthAgo),
49
+ end: endOfDay(now)
50
+ };
51
+ }
52
+ default: {
53
+ const _exhaustive = name;
54
+ throw new Error(`Unhandled named range: ${_exhaustive}`);
55
+ }
56
+ }
57
+ }
58
+ function parseIsoDate(dateStr) {
59
+ if (!ISO_DATE_REGEX.test(dateStr)) {
60
+ return null;
61
+ }
62
+ const parts = dateStr.split("-");
63
+ const yearStr = parts[0];
64
+ const monthStr = parts[1];
65
+ const dayStr = parts[2];
66
+ if (yearStr === undefined || monthStr === undefined || dayStr === undefined) {
67
+ return null;
68
+ }
69
+ const year = Number.parseInt(yearStr, 10);
70
+ const month = Number.parseInt(monthStr, 10) - 1;
71
+ const day = Number.parseInt(dayStr, 10);
72
+ const date = new Date(year, month, day);
73
+ if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {
74
+ return null;
75
+ }
76
+ return date;
77
+ }
78
+ function parseDateRange(input) {
79
+ const trimmed = input.trim();
80
+ if (trimmed === "") {
81
+ return Result.err(new ValidationError({
82
+ message: "Date range input cannot be empty",
83
+ field: "dateRange"
84
+ }));
85
+ }
86
+ const normalized = trimmed.toLowerCase();
87
+ if (isNamedRange(normalized)) {
88
+ return Result.ok(parseNamedRange(normalized));
89
+ }
90
+ if (trimmed.includes("..")) {
91
+ const parts = trimmed.split("..");
92
+ if (parts.length !== 2 || parts[0] === "" || parts[1] === "") {
93
+ return Result.err(new ValidationError({
94
+ message: 'Invalid date range format. Expected "YYYY-MM-DD..YYYY-MM-DD"',
95
+ field: "dateRange"
96
+ }));
97
+ }
98
+ const startStr = parts[0];
99
+ const endStr = parts[1];
100
+ if (startStr === undefined || endStr === undefined) {
101
+ return Result.err(new ValidationError({
102
+ message: 'Invalid date range format. Expected "YYYY-MM-DD..YYYY-MM-DD"',
103
+ field: "dateRange"
104
+ }));
105
+ }
106
+ const startDate = parseIsoDate(startStr);
107
+ const endDate = parseIsoDate(endStr);
108
+ if (startDate === null) {
109
+ return Result.err(new ValidationError({
110
+ message: `Invalid start date: "${startStr}". Expected format: YYYY-MM-DD`,
111
+ field: "dateRange"
112
+ }));
113
+ }
114
+ if (endDate === null) {
115
+ return Result.err(new ValidationError({
116
+ message: `Invalid end date: "${endStr}". Expected format: YYYY-MM-DD`,
117
+ field: "dateRange"
118
+ }));
119
+ }
120
+ if (startDate.getTime() > endDate.getTime()) {
121
+ return Result.err(new ValidationError({
122
+ message: "Invalid date range: start date must be before or equal to end date",
123
+ field: "dateRange"
124
+ }));
125
+ }
126
+ return Result.ok({
127
+ start: startOfDay(startDate),
128
+ end: endOfDay(endDate)
129
+ });
130
+ }
131
+ const singleDate = parseIsoDate(trimmed);
132
+ if (singleDate !== null) {
133
+ return Result.ok({
134
+ start: startOfDay(singleDate),
135
+ end: endOfDay(singleDate)
136
+ });
137
+ }
138
+ return Result.err(new ValidationError({
139
+ message: `Unrecognized date range: "${trimmed}". Expected "today", "yesterday", "last week", "last month", "YYYY-MM-DD", or "YYYY-MM-DD..YYYY-MM-DD"`,
140
+ field: "dateRange"
141
+ }));
142
+ }
143
+
144
+ export { startOfDay, endOfDay, parseDateRange };
@@ -0,0 +1,52 @@
1
+ // @bun
2
+ // packages/tui/src/demo/templates.ts
3
+ var DEFAULT_EXAMPLES = {
4
+ success: "Operation completed",
5
+ warning: "Proceed with caution",
6
+ error: "Something went wrong",
7
+ info: "For your information",
8
+ primary: "Main content",
9
+ secondary: "Supporting text",
10
+ muted: "(optional)",
11
+ accent: "Highlighted item",
12
+ highlight: "Important",
13
+ link: "https://example.com",
14
+ destructive: "Delete forever",
15
+ subtle: "Fine print",
16
+ bold: "Strong emphasis",
17
+ italic: "Subtle emphasis",
18
+ underline: "Underlined text",
19
+ dim: "De-emphasized",
20
+ boxContent: "Hello, world!",
21
+ boxTitle: "Status",
22
+ spinnerMessage: "Loading...",
23
+ progressLabel: "Progress",
24
+ listItems: ["First item", "Second item", "Third item"],
25
+ tableData: [
26
+ { id: 1, name: "Alice", status: "Active" },
27
+ { id: 2, name: "Bob", status: "Pending" }
28
+ ],
29
+ treeData: {
30
+ src: {
31
+ components: {
32
+ Button: null,
33
+ Input: null
34
+ },
35
+ utils: null
36
+ },
37
+ tests: null
38
+ },
39
+ markdownSample: `# Heading
40
+
41
+ Some **bold** and *italic* text.
42
+
43
+ Use \`npm install\` to install.`
44
+ };
45
+ function getExample(key, custom) {
46
+ if (custom?.[key] !== undefined) {
47
+ return custom[key];
48
+ }
49
+ return DEFAULT_EXAMPLES[key];
50
+ }
51
+
52
+ export { DEFAULT_EXAMPLES, getExample };
@@ -0,0 +1,272 @@
1
+ // @bun
2
+ // packages/tui/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
+ inverse: {
85
+ category: "utility",
86
+ description: "Inverse styling (swap fg/bg)",
87
+ defaultExample: "Inverted text"
88
+ }
89
+ };
90
+ function getThemeMethodsByCategory() {
91
+ const semantic = [];
92
+ const utility = [];
93
+ for (const [key, meta] of Object.entries(THEME_METHOD_META)) {
94
+ if (meta.category === "semantic") {
95
+ semantic.push(key);
96
+ } else {
97
+ utility.push(key);
98
+ }
99
+ }
100
+ return { semantic, utility };
101
+ }
102
+ var BORDER_STYLE_META = {
103
+ single: {
104
+ value: "single",
105
+ label: "Single",
106
+ description: "Standard Unicode single-line borders (\u250C\u2500\u2510)"
107
+ },
108
+ double: {
109
+ value: "double",
110
+ label: "Double",
111
+ description: "Double-line borders (\u2554\u2550\u2557)"
112
+ },
113
+ rounded: {
114
+ value: "rounded",
115
+ label: "Rounded",
116
+ description: "Rounded corners with single lines (\u256D\u2500\u256E)"
117
+ },
118
+ heavy: {
119
+ value: "heavy",
120
+ label: "Heavy",
121
+ description: "Thick/heavy borders (\u250F\u2501\u2513)"
122
+ },
123
+ ascii: {
124
+ value: "ascii",
125
+ label: "ASCII",
126
+ description: "ASCII-only fallback (+, -, |)"
127
+ },
128
+ none: {
129
+ value: "none",
130
+ label: "None",
131
+ description: "No borders (empty strings)"
132
+ }
133
+ };
134
+ function getBorderStyles() {
135
+ return Object.keys(BORDER_STYLE_META);
136
+ }
137
+ var SPINNER_STYLE_META = {
138
+ dots: {
139
+ value: "dots",
140
+ label: "Dots",
141
+ description: "Braille dots animation (default, smooth)"
142
+ },
143
+ line: {
144
+ value: "line",
145
+ label: "Line",
146
+ description: "Classic ASCII spinner (-\\|/)"
147
+ },
148
+ arc: {
149
+ value: "arc",
150
+ label: "Arc",
151
+ description: "Corner arc rotation"
152
+ },
153
+ circle: {
154
+ value: "circle",
155
+ label: "Circle",
156
+ description: "Half-filled circle rotation"
157
+ },
158
+ bounce: {
159
+ value: "bounce",
160
+ label: "Bounce",
161
+ description: "Bouncing dot (vertical)"
162
+ },
163
+ ping: {
164
+ value: "ping",
165
+ label: "Ping",
166
+ description: "Bouncing dot in brackets (horizontal)"
167
+ }
168
+ };
169
+ function getSpinnerStyles() {
170
+ return Object.keys(SPINNER_STYLE_META);
171
+ }
172
+ var LIST_STYLE_META = {
173
+ dash: {
174
+ value: "dash",
175
+ label: "Dash",
176
+ description: "Uses - character (default)"
177
+ },
178
+ bullet: {
179
+ value: "bullet",
180
+ label: "Bullet",
181
+ description: "Uses \u2022 character"
182
+ },
183
+ number: {
184
+ value: "number",
185
+ label: "Number",
186
+ description: "Uses 1. for top-level, a. for nested, i. for deeply nested"
187
+ },
188
+ checkbox: {
189
+ value: "checkbox",
190
+ label: "Checkbox",
191
+ description: "Uses \u2610 for unchecked, \u2611 for checked"
192
+ }
193
+ };
194
+ function getListStyles() {
195
+ return Object.keys(LIST_STYLE_META);
196
+ }
197
+ var PRIMITIVE_META = {
198
+ colors: {
199
+ id: "colors",
200
+ name: "Colors",
201
+ description: "Semantic color theme with ANSI support",
202
+ importExample: 'import { createTheme } from "@outfitter/tui/render";'
203
+ },
204
+ borders: {
205
+ id: "borders",
206
+ name: "Borders",
207
+ description: "Box-drawing character sets",
208
+ importExample: 'import { BORDERS, getBorderCharacters } from "@outfitter/tui/render";'
209
+ },
210
+ spinner: {
211
+ id: "spinner",
212
+ name: "Spinner",
213
+ description: "Animated spinners for async operations",
214
+ importExample: 'import { renderSpinner, SPINNERS } from "@outfitter/tui/render";'
215
+ },
216
+ list: {
217
+ id: "list",
218
+ name: "List",
219
+ description: "Bullet, numbered, and checkbox lists",
220
+ importExample: 'import { renderList } from "@outfitter/tui/render";'
221
+ },
222
+ box: {
223
+ id: "box",
224
+ name: "Box",
225
+ description: "Bordered panels with optional titles",
226
+ importExample: 'import { renderBox } from "@outfitter/tui/render";'
227
+ },
228
+ table: {
229
+ id: "table",
230
+ name: "Table",
231
+ description: "Unicode tables with multiple border styles",
232
+ importExample: 'import { renderTable } from "@outfitter/tui/render";'
233
+ },
234
+ progress: {
235
+ id: "progress",
236
+ name: "Progress",
237
+ description: "Progress bars with filled/empty segments",
238
+ importExample: 'import { renderProgress } from "@outfitter/tui/render";'
239
+ },
240
+ tree: {
241
+ id: "tree",
242
+ name: "Tree",
243
+ description: "Hierarchical tree rendering",
244
+ importExample: 'import { renderTree } from "@outfitter/tui/render";'
245
+ },
246
+ text: {
247
+ id: "text",
248
+ name: "Text",
249
+ description: "Text utilities (width, wrap, truncate, pad)",
250
+ importExample: 'import { getStringWidth, wrapText, truncateText, padText } from "@outfitter/tui/render";'
251
+ },
252
+ markdown: {
253
+ id: "markdown",
254
+ name: "Markdown",
255
+ description: "Markdown to terminal ANSI rendering",
256
+ importExample: 'import { renderMarkdown } from "@outfitter/tui/render";'
257
+ },
258
+ indicators: {
259
+ id: "indicators",
260
+ name: "Indicators",
261
+ description: "Status symbols, selection markers, and progress indicators",
262
+ importExample: 'import { getIndicator, INDICATORS } from "@outfitter/tui/render";'
263
+ }
264
+ };
265
+ function getPrimitiveIds() {
266
+ return Object.keys(PRIMITIVE_META);
267
+ }
268
+ function getPrimitiveMeta(id) {
269
+ return PRIMITIVE_META[id];
270
+ }
271
+
272
+ export { THEME_METHOD_META, getThemeMethodsByCategory, BORDER_STYLE_META, getBorderStyles, SPINNER_STYLE_META, getSpinnerStyles, LIST_STYLE_META, getListStyles, PRIMITIVE_META, getPrimitiveIds, getPrimitiveMeta };
@@ -0,0 +1,64 @@
1
+ import { Result, ValidationError } from "@outfitter/contracts";
2
+ /**
3
+ * Represents a date range with start and end dates.
4
+ */
5
+ interface DateRange {
6
+ /** Start of the range (inclusive, at 00:00:00.000) */
7
+ start: Date;
8
+ /** End of the range (inclusive, at 23:59:59.999) */
9
+ end: Date;
10
+ }
11
+ /**
12
+ * Returns a new Date set to the start of the day (00:00:00.000).
13
+ *
14
+ * @param date - The date to adjust
15
+ * @returns A new Date object at 00:00:00.000 on the same day
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * startOfDay(new Date("2024-06-15T14:30:00Z"))
20
+ * // Returns 2024-06-15T00:00:00.000 (local time)
21
+ * ```
22
+ */
23
+ declare function startOfDay(date: Date): Date;
24
+ /**
25
+ * Returns a new Date set to the end of the day (23:59:59.999).
26
+ *
27
+ * @param date - The date to adjust
28
+ * @returns A new Date object at 23:59:59.999 on the same day
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * endOfDay(new Date("2024-06-15T14:30:00Z"))
33
+ * // Returns 2024-06-15T23:59:59.999 (local time)
34
+ * ```
35
+ */
36
+ declare function endOfDay(date: Date): Date;
37
+ /**
38
+ * Parses date range strings into structured DateRange.
39
+ *
40
+ * Supported formats:
41
+ * - `"today"` - Current day (00:00:00 to 23:59:59)
42
+ * - `"yesterday"` - Previous day
43
+ * - `"last week"` - Last 7 days
44
+ * - `"last month"` - Last 30 days
45
+ * - `"2024-01-01..2024-12-31"` - Explicit range
46
+ * - `"2024-01-01"` - Single day
47
+ *
48
+ * @param input - The date range string to parse
49
+ * @returns Result containing DateRange on success, or ValidationError on failure
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * parseDateRange("today")
54
+ * // Ok({ start: today 00:00, end: today 23:59:59 })
55
+ *
56
+ * parseDateRange("2024-01-01..2024-12-31")
57
+ * // Ok({ start: 2024-01-01 00:00, end: 2024-12-31 23:59:59 })
58
+ *
59
+ * parseDateRange("invalid")
60
+ * // Err(ValidationError)
61
+ * ```
62
+ */
63
+ declare function parseDateRange(input: string): Result<DateRange, InstanceType<typeof ValidationError>>;
64
+ export { DateRange, startOfDay, endOfDay, parseDateRange };