@zaly/tui 0.0.4 → 0.0.6

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 (156) hide show
  1. package/dist/actions-CnVzKVID.d.mts +41 -0
  2. package/dist/actions-CnVzKVID.d.mts.map +1 -0
  3. package/dist/actions-DEIKF2ts.mjs +48 -0
  4. package/dist/actions-DEIKF2ts.mjs.map +1 -0
  5. package/dist/{box-DyaByEiG.mjs → box-DepqUtuo.mjs} +2 -2
  6. package/dist/{box-DyaByEiG.mjs.map → box-DepqUtuo.mjs.map} +1 -1
  7. package/dist/{builder-D49ECBEf.mjs → builder-DTz5mppV.mjs} +2 -2
  8. package/dist/{builder-D49ECBEf.mjs.map → builder-DTz5mppV.mjs.map} +1 -1
  9. package/dist/{callbacks-CNjGNxVw.mjs → callbacks-DcMBGQEO.mjs} +2 -2
  10. package/dist/{callbacks-CNjGNxVw.mjs.map → callbacks-DcMBGQEO.mjs.map} +1 -1
  11. package/dist/{client-D6C_uczF.mjs → client-BBdtbLp4.mjs} +5 -10
  12. package/dist/client-BBdtbLp4.mjs.map +1 -0
  13. package/dist/client-cIckDgAj.mjs +2 -0
  14. package/dist/clipboard-l_TWxxTf.mjs +404 -0
  15. package/dist/clipboard-l_TWxxTf.mjs.map +1 -0
  16. package/dist/clipboard.mjs +1 -403
  17. package/dist/ctx-Bt4VlRPg.mjs +2 -0
  18. package/dist/ctx-DjJ1zSbs.mjs +43 -0
  19. package/dist/ctx-DjJ1zSbs.mjs.map +1 -0
  20. package/dist/divider-cclEAdPx.mjs +9 -0
  21. package/dist/divider-cclEAdPx.mjs.map +1 -0
  22. package/dist/files-Aw3iWpXD.d.mts +29 -0
  23. package/dist/files-Aw3iWpXD.d.mts.map +1 -0
  24. package/dist/files-BvThQpOf.mjs +42 -0
  25. package/dist/files-BvThQpOf.mjs.map +1 -0
  26. package/dist/github-Cy2hfWJ7.mjs +137 -0
  27. package/dist/github-Cy2hfWJ7.mjs.map +1 -0
  28. package/dist/github-DS00VoOj.d.mts +64 -0
  29. package/dist/github-DS00VoOj.d.mts.map +1 -0
  30. package/dist/image-BTxDPPiT.d.mts +37 -0
  31. package/dist/image-BTxDPPiT.d.mts.map +1 -0
  32. package/dist/index.mjs +6 -202
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/input-CRBuTrsL.mjs +497 -0
  35. package/dist/input-CRBuTrsL.mjs.map +1 -0
  36. package/dist/{inspect-D1d9t-ni.mjs → inspect-DE5goDzB.mjs} +2 -2
  37. package/dist/{inspect-D1d9t-ni.mjs.map → inspect-DE5goDzB.mjs.map} +1 -1
  38. package/dist/log-Djvrxqk0.mjs +130 -0
  39. package/dist/log-Djvrxqk0.mjs.map +1 -0
  40. package/dist/logger-DDrt03So.mjs +71 -0
  41. package/dist/logger-DDrt03So.mjs.map +1 -0
  42. package/dist/markdown-CTlPe5ks.mjs +124 -0
  43. package/dist/markdown-CTlPe5ks.mjs.map +1 -0
  44. package/dist/markdown.mjs +1 -1
  45. package/dist/overlay-9xNgsuuy.mjs +18 -0
  46. package/dist/overlay-9xNgsuuy.mjs.map +1 -0
  47. package/dist/{picker-ndVVt6qF.mjs → picker-cH-rc7-X.mjs} +5 -5
  48. package/dist/{picker-ndVVt6qF.mjs.map → picker-cH-rc7-X.mjs.map} +1 -1
  49. package/dist/queries-B_lOwEiE.mjs +200 -0
  50. package/dist/queries-B_lOwEiE.mjs.map +1 -0
  51. package/dist/{registry-U654j61Y.mjs → registry-w_w7gZr_.mjs} +3 -5
  52. package/dist/registry-w_w7gZr_.mjs.map +1 -0
  53. package/dist/render-F8pVXN7h.mjs +33 -0
  54. package/dist/render-F8pVXN7h.mjs.map +1 -0
  55. package/dist/renderer-Dgj_qEOA.mjs +2 -0
  56. package/dist/{renderer-CdLCkJB-.mjs → renderer-qSMVeNSV.mjs} +3 -5
  57. package/dist/{renderer-CdLCkJB-.mjs.map → renderer-qSMVeNSV.mjs.map} +1 -1
  58. package/dist/{renderer-CxL4xbkl.mjs → renderer-uMeDzF9B.mjs} +8 -7
  59. package/dist/{renderer-CxL4xbkl.mjs.map → renderer-uMeDzF9B.mjs.map} +1 -1
  60. package/dist/select-m7NE6Rwa.mjs +195 -0
  61. package/dist/select-m7NE6Rwa.mjs.map +1 -0
  62. package/dist/services/logger.mjs +1 -70
  63. package/dist/services/notifier.mjs +2 -2
  64. package/dist/services/picker.d.mts +1 -1
  65. package/dist/services/picker.mjs +6 -6
  66. package/dist/services/prompt.d.mts +1 -1
  67. package/dist/services/prompt.mjs +5 -5
  68. package/dist/shiki/server.d.mts +1 -0
  69. package/dist/shiki/server.mjs +129 -0
  70. package/dist/shiki/server.mjs.map +1 -0
  71. package/dist/{shiki-BrjVUkeh.mjs → shiki-B5NwIiot.mjs} +5 -10
  72. package/dist/shiki-B5NwIiot.mjs.map +1 -0
  73. package/dist/shiki-BK-v9CtF.mjs +12 -0
  74. package/dist/shiki-BK-v9CtF.mjs.map +1 -0
  75. package/dist/show-DR2x1YFc.mjs +85 -0
  76. package/dist/show-DR2x1YFc.mjs.map +1 -0
  77. package/dist/style.mjs +2 -2
  78. package/dist/text-9lwQeqYr.d.mts +33 -0
  79. package/dist/text-9lwQeqYr.d.mts.map +1 -0
  80. package/dist/text-DILrol9j.mjs +32 -0
  81. package/dist/text-DILrol9j.mjs.map +1 -0
  82. package/dist/text-q26V6_Sc.mjs +111 -0
  83. package/dist/text-q26V6_Sc.mjs.map +1 -0
  84. package/dist/text.d.mts +2 -33
  85. package/dist/text.mjs +1 -110
  86. package/dist/{theme.config-CU3B50HN.mjs → theme.config-BptYUq4K.mjs} +4 -4
  87. package/dist/{theme.config-CU3B50HN.mjs.map → theme.config-BptYUq4K.mjs.map} +1 -1
  88. package/dist/themes.mjs +1 -1
  89. package/dist/tree-Bo1afYhe.mjs +73 -0
  90. package/dist/tree-Bo1afYhe.mjs.map +1 -0
  91. package/dist/widget-BkMwhY2p.mjs +40 -0
  92. package/dist/widget-BkMwhY2p.mjs.map +1 -0
  93. package/dist/widget-M7jD8Rgg.d.mts +49 -0
  94. package/dist/widget-M7jD8Rgg.d.mts.map +1 -0
  95. package/dist/widgets/autocomplete.mjs +2 -2
  96. package/dist/widgets/box.mjs +1 -1
  97. package/dist/widgets/code.mjs +7 -7
  98. package/dist/widgets/completions/actions.d.mts +2 -41
  99. package/dist/widgets/completions/actions.mjs +1 -47
  100. package/dist/widgets/completions/files.d.mts +2 -29
  101. package/dist/widgets/completions/files.mjs +1 -41
  102. package/dist/widgets/completions/github.d.mts +2 -64
  103. package/dist/widgets/completions/github.mjs +1 -136
  104. package/dist/widgets/completions/index.d.mts +3 -3
  105. package/dist/widgets/completions/index.mjs +3 -3
  106. package/dist/widgets/diff.d.mts +1 -1
  107. package/dist/widgets/diff.mjs +3 -3
  108. package/dist/widgets/divider.mjs +1 -8
  109. package/dist/widgets/image.d.mts +2 -37
  110. package/dist/widgets/image.mjs +1 -1
  111. package/dist/widgets/input.mjs +1 -496
  112. package/dist/widgets/log.mjs +1 -129
  113. package/dist/widgets/markdown.d.mts +2 -2
  114. package/dist/widgets/markdown.mjs +1 -123
  115. package/dist/widgets/overlay.mjs +1 -17
  116. package/dist/widgets/picker.mjs +1 -1
  117. package/dist/widgets/select.mjs +1 -194
  118. package/dist/widgets/show.mjs +1 -84
  119. package/dist/widgets/text.mjs +1 -31
  120. package/dist/widgets/tree.mjs +1 -72
  121. package/dist/widgets/widget.d.mts +2 -49
  122. package/dist/widgets/widget.mjs +1 -39
  123. package/dist/worker-BvRm4OsW.mjs +2 -0
  124. package/dist/worker-T6SdPzUH.mjs +52 -0
  125. package/dist/worker-T6SdPzUH.mjs.map +1 -0
  126. package/package.json +7 -3
  127. package/dist/client-D6C_uczF.mjs.map +0 -1
  128. package/dist/clipboard.mjs.map +0 -1
  129. package/dist/registry-U654j61Y.mjs.map +0 -1
  130. package/dist/render-DxVLqqB9.mjs +0 -74
  131. package/dist/render-DxVLqqB9.mjs.map +0 -1
  132. package/dist/rolldown-runtime-D7D4PA-g.mjs +0 -13
  133. package/dist/services/logger.mjs.map +0 -1
  134. package/dist/shiki-BrjVUkeh.mjs.map +0 -1
  135. package/dist/text.d.mts.map +0 -1
  136. package/dist/text.mjs.map +0 -1
  137. package/dist/widgets/completions/actions.d.mts.map +0 -1
  138. package/dist/widgets/completions/actions.mjs.map +0 -1
  139. package/dist/widgets/completions/files.d.mts.map +0 -1
  140. package/dist/widgets/completions/files.mjs.map +0 -1
  141. package/dist/widgets/completions/github.d.mts.map +0 -1
  142. package/dist/widgets/completions/github.mjs.map +0 -1
  143. package/dist/widgets/divider.mjs.map +0 -1
  144. package/dist/widgets/image.d.mts.map +0 -1
  145. package/dist/widgets/input.mjs.map +0 -1
  146. package/dist/widgets/log.mjs.map +0 -1
  147. package/dist/widgets/markdown.mjs.map +0 -1
  148. package/dist/widgets/overlay.mjs.map +0 -1
  149. package/dist/widgets/select.mjs.map +0 -1
  150. package/dist/widgets/show.mjs.map +0 -1
  151. package/dist/widgets/text.mjs.map +0 -1
  152. package/dist/widgets/tree.mjs.map +0 -1
  153. package/dist/widgets/widget.d.mts.map +0 -1
  154. package/dist/widgets/widget.mjs.map +0 -1
  155. package/dist/worker-DjHuQSbY.mjs +0 -27
  156. package/dist/worker-DjHuQSbY.mjs.map +0 -1
@@ -0,0 +1,195 @@
1
+ import { S as unwrap, f as effect } from "./reactive-f7NpAi69.mjs";
2
+ import { t as Node } from "./node-BZ7f6HzU.mjs";
3
+ import { n as resolveSize } from "./size-D8JogYLy.mjs";
4
+ import { fitAnsi, stringWidth } from "@zaly/shared/ansi";
5
+ //#region src/widgets/select.ts
6
+ /**
7
+ * Selectable list. Items are rendered one per row with an active-row
8
+ * highlight; navigation actions (`next`, `prev`, `first`, `last`,
9
+ * `accept`, `complete`, `cancel`) live on `this.actions`, same pattern as
10
+ * `Input`.
11
+ *
12
+ * Used standalone for simple lists and as the underlying list primitive for
13
+ * `picker`, `tree`, and `autocomplete`. Doesn't open/close itself — callers
14
+ * control visibility via `state.visible`.
15
+ */
16
+ var Select = class Select extends Node {
17
+ static type = "select";
18
+ type = Select.type;
19
+ actions = {
20
+ "select.accept": () => {
21
+ const items = this.#items;
22
+ if (items.length === 0) return;
23
+ this.emit("accept", { item: items[this.active] });
24
+ },
25
+ "select.close": () => {
26
+ this.emit("close");
27
+ },
28
+ "select.complete": () => {
29
+ const items = this.#items;
30
+ if (items.length === 0) return;
31
+ this.emit("complete", { item: items[this.active] });
32
+ },
33
+ "select.first": () => {
34
+ if (this.#items.length === 0) return;
35
+ this.active = 0;
36
+ },
37
+ "select.last": () => {
38
+ const n = this.#items.length;
39
+ if (n === 0) return;
40
+ this.active = n - 1;
41
+ },
42
+ "select.next": () => {
43
+ if (this.#items.length === 0) return;
44
+ this.active += this.#direction;
45
+ },
46
+ "select.page-down": () => {
47
+ if (this.#items.length === 0) return;
48
+ const page = Math.max(this.pageSize - 1, 1);
49
+ this.state.active = this.#clamp(this.active + this.#direction * page);
50
+ },
51
+ "select.page-up": () => {
52
+ if (this.#items.length === 0) return;
53
+ const page = Math.max(this.pageSize - 1, 1);
54
+ this.state.active = this.#clamp(this.active - this.#direction * page);
55
+ },
56
+ "select.prev": () => {
57
+ if (this.#items.length === 0) return;
58
+ this.active -= this.#direction;
59
+ }
60
+ };
61
+ /** Top of the currently-rendered window, in absolute item indices.
62
+ * Updated per render using the pin-until-leave rule: stays put
63
+ * while `active` remains in `[start, start + visible)`, slides just
64
+ * enough to re-admit it otherwise. */
65
+ #windowStart = 0;
66
+ constructor(initial) {
67
+ super({
68
+ active: 0,
69
+ ...initial
70
+ });
71
+ let active = this.item;
72
+ effect(() => {
73
+ const next = this.item;
74
+ if (next === active) return;
75
+ active = next;
76
+ this.emit("changed", {
77
+ active: this.active,
78
+ item: next
79
+ });
80
+ });
81
+ }
82
+ get #direction() {
83
+ return this.state.reverse ? -1 : 1;
84
+ }
85
+ get #items() {
86
+ return unwrap(this.state.items);
87
+ }
88
+ #clamp(i) {
89
+ const n = this.#items.length;
90
+ return n === 0 ? 0 : Math.max(0, Math.min(n - 1, i));
91
+ }
92
+ set active(i) {
93
+ const n = this.#items.length;
94
+ this.state.active = n === 0 ? 0 : (i % n + n) % n;
95
+ }
96
+ get active() {
97
+ const a = this.state.active ?? 0;
98
+ const n = this.#items.length;
99
+ if (n === 0) return 0;
100
+ return Math.max(0, Math.min(n - 1, a));
101
+ }
102
+ bind(node) {
103
+ let n;
104
+ const getn = () => n = node instanceof Node ? node : node();
105
+ this.on("mount", () => getn().addActionTarget(this));
106
+ this.on("unmount", () => n?.removeActionTarget(this));
107
+ if (this.mounted) getn().addActionTarget(this);
108
+ return this;
109
+ }
110
+ get count() {
111
+ return this.#items.length;
112
+ }
113
+ get pageSize() {
114
+ return unwrap(this.state.maxHeight) ?? Math.max(this.#items.length, 1);
115
+ }
116
+ get item() {
117
+ return this.#items[this.active];
118
+ }
119
+ _render(ctx) {
120
+ const items = this.#items;
121
+ if (items.length === 0) return [];
122
+ const width = resolveSize(this.state.width ?? "fill", ctx.width) ?? ctx.width;
123
+ const active = this.active;
124
+ const height = Math.min(this.pageSize, items.length);
125
+ if (height === 0) return [];
126
+ let start = this.#windowStart;
127
+ if (active < start) start = active;
128
+ else if (active >= start + height) start = active - height + 1;
129
+ start = Math.max(0, Math.min(Math.max(0, items.length - height), start));
130
+ this.#windowStart = start;
131
+ const visible = items.slice(start, start + height);
132
+ const renderer = this.renderer;
133
+ const rows = [];
134
+ for (let i = start; i < start + height; i++) {
135
+ const item = items[i];
136
+ let row = renderer(item, {
137
+ ...ctx,
138
+ active: i === active,
139
+ items,
140
+ visible
141
+ }).replace(/\n/g, " ");
142
+ row = fitAnsi(row, width);
143
+ rows.push(i === active ? ctx.style.optionActive(row) : row);
144
+ }
145
+ if (this.state.reverse) rows.reverse();
146
+ if (this.state.counter ?? items.length > height) {
147
+ const label = `(${items.length === 0 ? 0 : active + 1}/${items.length}${this.state.more ? "+" : ""})`;
148
+ rows.push(ctx.style.gutter(fitAnsi(label, width)));
149
+ }
150
+ return rows;
151
+ }
152
+ get renderer() {
153
+ return unwrap(this.state.render) ?? this.defaultRenderer();
154
+ }
155
+ extendRenderer(fn) {
156
+ const prev = this.renderer;
157
+ this.state.render = fn(prev);
158
+ return this;
159
+ }
160
+ defaultRenderer() {
161
+ let visible = [];
162
+ let labelWidth = 0;
163
+ const update = (ctx) => {
164
+ if (ctx.visible === visible) return;
165
+ visible = ctx.visible;
166
+ if (!visible.some((i) => i.desc)) return labelWidth = ctx.width;
167
+ labelWidth = this.state.labelWidth ?? 0;
168
+ labelWidth ||= visible.map(itemLabel).reduce((max, label) => Math.max(max, stringWidth(label)), 0);
169
+ labelWidth = Math.min(labelWidth, Math.floor(ctx.width / 2));
170
+ };
171
+ return (item, ctx) => {
172
+ update(ctx);
173
+ const label = fitAnsi(itemLabel(item), labelWidth);
174
+ if (!item.desc) return ctx.style.optionName(label);
175
+ const desc = fitAnsi(item.desc ?? "", Math.max(0, ctx.width - labelWidth - 2));
176
+ return `${ctx.style.optionName(label)} ${ctx.style.optionDesc(desc)}`;
177
+ };
178
+ }
179
+ };
180
+ const itemLabel = (item) => (item.name ?? item.text).replace(/\s+/g, " ").trim();
181
+ /**
182
+ * Factory for a selectable list.
183
+ *
184
+ * ```ts
185
+ * const s = select({ items: [{ text: "/help" }, { text: "/quit" }] })
186
+ * s.on("accept", ({ item }) => console.log("picked", item.text))
187
+ * ```
188
+ */
189
+ function select(state) {
190
+ return new Select(state);
191
+ }
192
+ //#endregion
193
+ export { select as n, Select as t };
194
+
195
+ //# sourceMappingURL=select-m7NE6Rwa.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-m7NE6Rwa.mjs","names":["#items","#direction","#clamp","#windowStart"],"sources":["../src/widgets/select.ts"],"sourcesContent":["import type { RenderCtx } from \"../core/ctx.ts\"\nimport type { BaseEvents } from \"../core/node.ts\"\nimport type { Reactive, Ref } from \"../core/reactive.ts\"\nimport type { State } from \"../core/state.ts\"\nimport type { NodeActionMap } from \"../input/actions.ts\"\nimport type { Size } from \"../layout/size.ts\"\nimport type { Style } from \"../style/types.ts\"\n\nimport { fitAnsi, stringWidth } from \"@zaly/shared/ansi\"\nimport { Node } from \"../core/node.ts\"\nimport { effect, unwrap } from \"../core/reactive.ts\"\nimport { resolveSize } from \"../layout/size.ts\"\n\n/** Default shape for selectable options. `text` is the canonical\n * searchable/fallback label. `name` overrides the displayed label in the\n * default renderer, and `desc` is shown as a dim right-column description. */\nexport type Option = {\n name?: string\n desc?: string\n text: string\n}\n\nexport type OptionRenderCtx<T> = RenderCtx & {\n visible: readonly T[]\n items: readonly T[]\n active?: boolean\n prefixWidth?: number\n}\n\n/** Per-row rendering hook. `ctx.active` lets callers branch on selection\n * state (e.g. swap an icon or pick a different fg) — but Select still\n * applies the `optionActive` theme slot uniformly so the highlight stays\n * visually consistent. The returned string is clipped/padded to the row\n * width by Select. */\nexport type OptionRender<T> = (item: T, ctx: OptionRenderCtx<T>) => string\n\nexport interface SelectState<T extends Option = Option> extends Style {\n /** Items to show. Accepts a signal accessor so the list can be\n * driven from reactive state (filtered results, search, etc.). */\n items: Reactive<readonly T[]>\n /** Index of the highlighted row. Defaults to 0; clamped on render. */\n active?: number\n /** Max item rows visible at once. The counter (when shown) is an\n * extra row on top of this, not counted against the cap. Window\n * slides to keep `active` in view (pin-until-leave). */\n maxHeight?: Reactive<number>\n /** Show a `(active+1 / total)` footer as an extra row when items\n * don't fit. `undefined` (default) auto-shows when needed;\n * `false` disables, `true` forces on. */\n counter?: boolean\n /** Render width. Defaults to `fill`. */\n width?: Size\n /** Width of the label column for the default renderer. Defaults to the\n * widest visible label, capped to half the row width. Ignored when\n * `render` is set. */\n labelWidth?: number\n /** Per-item renderer. When omitted, the default two-column layout uses\n * `name ?? text` as the label and `desc` as the right-column hint. */\n render?: Reactive<OptionRender<T> | undefined>\n reverse?: boolean\n /** Whether there are more items available than are currently shown. This is a hint for the\n * default renderer to show a \"more\" indicator in the counter. */\n more?: boolean\n}\n\nexport interface SelectEvents<T extends Option = Option> extends BaseEvents {\n /** Fired when the user completes the active item. Payload is the item. */\n complete: { item: T }\n /** Fired when the user picks the active item. Payload is the item. */\n accept: { item: T }\n /** Fired when the user closes the select (esc). */\n close: {}\n changed: { active: number; item?: T }\n}\n\n/**\n * Selectable list. Items are rendered one per row with an active-row\n * highlight; navigation actions (`next`, `prev`, `first`, `last`,\n * `accept`, `complete`, `cancel`) live on `this.actions`, same pattern as\n * `Input`.\n *\n * Used standalone for simple lists and as the underlying list primitive for\n * `picker`, `tree`, and `autocomplete`. Doesn't open/close itself — callers\n * control visibility via `state.visible`.\n */\nexport class Select<T extends Option = Option> extends Node<SelectState<T>, SelectEvents<T>> {\n static readonly type = \"select\"\n override readonly type = Select.type\n\n override actions = {\n \"select.accept\": (): void => {\n const items = this.#items\n if (items.length === 0) return\n void this.emit(\"accept\", { item: items[this.active] })\n },\n \"select.close\": (): void => {\n void this.emit(\"close\")\n },\n \"select.complete\": (): void => {\n const items = this.#items\n if (items.length === 0) return\n void this.emit(\"complete\", { item: items[this.active] })\n },\n \"select.first\": (): void => {\n if (this.#items.length === 0) return\n this.active = 0\n },\n \"select.last\": (): void => {\n const n = this.#items.length\n if (n === 0) return\n this.active = n - 1\n },\n \"select.next\": (): void => {\n const n = this.#items.length\n if (n === 0) return\n this.active += this.#direction\n },\n \"select.page-down\": (): void => {\n const n = this.#items.length\n if (n === 0) return\n const page = Math.max(this.pageSize - 1, 1)\n this.state.active = this.#clamp(this.active + this.#direction * page)\n },\n \"select.page-up\": (): void => {\n const n = this.#items.length\n if (n === 0) return\n const page = Math.max(this.pageSize - 1, 1)\n this.state.active = this.#clamp(this.active - this.#direction * page)\n },\n \"select.prev\": (): void => {\n const n = this.#items.length\n if (n === 0) return\n this.active -= this.#direction\n },\n } satisfies NodeActionMap\n\n /** Top of the currently-rendered window, in absolute item indices.\n * Updated per render using the pin-until-leave rule: stays put\n * while `active` remains in `[start, start + visible)`, slides just\n * enough to re-admit it otherwise. */\n #windowStart = 0\n\n constructor(initial: SelectState<T>) {\n super({ active: 0, ...initial } as SelectState<T>)\n\n let active = this.item\n effect(() => {\n const next = this.item\n if (next === active) return\n active = next\n void this.emit(\"changed\", { active: this.active, item: next })\n })\n }\n\n get #direction(): 1 | -1 {\n return this.state.reverse ? -1 : 1\n }\n\n get #items() {\n return unwrap(this.state.items)\n }\n\n #clamp(i: number): number {\n const n = this.#items.length\n return n === 0 ? 0 : Math.max(0, Math.min(n - 1, i))\n }\n\n set active(i: number) {\n const n = this.#items.length\n this.state.active = n === 0 ? 0 : ((i % n) + n) % n\n }\n\n get active(): number {\n const a = this.state.active ?? 0\n const n = this.#items.length\n if (n === 0) return 0\n return Math.max(0, Math.min(n - 1, a))\n }\n\n bind(node: Node | Ref<Node>): this {\n let n: Node | undefined\n const getn = () => (n = node instanceof Node ? node : node())\n this.on(\"mount\", () => getn().addActionTarget(this))\n this.on(\"unmount\", () => n?.removeActionTarget(this))\n if (this.mounted) getn().addActionTarget(this)\n return this\n }\n\n get count(): number {\n return this.#items.length\n }\n\n get pageSize(): number {\n return unwrap(this.state.maxHeight) ?? Math.max(this.#items.length, 1)\n }\n\n get item(): T | undefined {\n return this.#items[this.active]\n }\n\n protected _render(ctx: RenderCtx): string[] {\n const items = this.#items\n if (items.length === 0) return []\n\n const width = resolveSize(this.state.width ?? \"fill\", ctx.width) ?? ctx.width\n const active = this.active\n const height = Math.min(this.pageSize, items.length)\n if (height === 0) return []\n\n // Pin-until-leave window. `#windowStart` is kept across renders so\n // the list doesn't recenter while the user nudges up/down inside\n let start = this.#windowStart\n if (active < start) start = active\n else if (active >= start + height) start = active - height + 1\n start = Math.max(0, Math.min(Math.max(0, items.length - height), start))\n this.#windowStart = start\n\n const visible = items.slice(start, start + height)\n const renderer = this.renderer\n\n const rows: string[] = []\n for (let i = start; i < start + height; i++) {\n const item = items[i]\n let row = renderer(item, {\n ...ctx,\n active: i === active,\n items,\n visible,\n }).replace(/\\n/g, \" \")\n row = fitAnsi(row, width)\n rows.push(i === active ? ctx.style.optionActive(row) : row)\n }\n if (this.state.reverse) rows.reverse()\n\n if (this.state.counter ?? items.length > height) {\n const shown = items.length === 0 ? 0 : active + 1\n const label = `(${shown}/${items.length}${this.state.more ? \"+\" : \"\"})`\n rows.push(ctx.style.gutter(fitAnsi(label, width)))\n }\n\n return rows\n }\n\n get renderer(): OptionRender<T> {\n return unwrap(this.state.render) ?? this.defaultRenderer()\n }\n\n extendRenderer(fn: (prev: OptionRender<T>) => OptionRender<T>): this {\n const prev = this.renderer\n this.state.render = fn(prev)\n return this\n }\n\n defaultRenderer(): OptionRender<Option> {\n let visible: readonly Option[] = []\n let labelWidth = 0\n\n const update = (ctx: OptionRenderCtx<Option>) => {\n if (ctx.visible === visible) return\n visible = ctx.visible\n if (!visible.some((i) => i.desc)) return (labelWidth = ctx.width) // No desc, so full width\n labelWidth = this.state.labelWidth ?? 0\n labelWidth ||= visible\n .map(itemLabel)\n .reduce((max, label) => Math.max(max, stringWidth(label)), 0)\n labelWidth = Math.min(labelWidth, Math.floor(ctx.width / 2))\n }\n\n return (item: Option, ctx): string => {\n update(ctx)\n const label = fitAnsi(itemLabel(item), labelWidth)\n if (!item.desc) return ctx.style.optionName(label)\n const desc = fitAnsi(item.desc ?? \"\", Math.max(0, ctx.width - labelWidth - 2))\n return `${ctx.style.optionName(label)} ${ctx.style.optionDesc(desc)}`\n }\n }\n}\n\nconst itemLabel = (item: Option): string => (item.name ?? item.text).replace(/\\s+/g, \" \").trim()\n\n/**\n * Factory for a selectable list.\n *\n * ```ts\n * const s = select({ items: [{ text: \"/help\" }, { text: \"/quit\" }] })\n * s.on(\"accept\", ({ item }) => console.log(\"picked\", item.text))\n * ```\n */\nexport function select<T extends Option = Option>(state: State<SelectState<T>>): Select<T> {\n return new Select<T>(state)\n}\n"],"mappings":"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"}
@@ -1,71 +1,2 @@
1
- import { t as Node } from "../node-BZ7f6HzU.mjs";
2
- import { n as inspectFormat, r as isMarkdown } from "../inspect-D1d9t-ni.mjs";
3
- import { log } from "../widgets/log.mjs";
4
- //#region src/services/logger.ts
5
- const ERR_LEVELS = /* @__PURE__ */ new Set([
6
- "error",
7
- "fatal",
8
- "warn"
9
- ]);
10
- function defaultWrite(text, kind) {
11
- if (typeof process === "undefined") return;
12
- (kind === "stderr" ? process.stderr : process.stdout).write(text);
13
- }
14
- var TuiReporter = class {
15
- #stream;
16
- #opts;
17
- #factory;
18
- constructor(opts = {}) {
19
- this.#opts = opts;
20
- this.#factory = opts.factory ?? ((level, msg) => this.#defaultFactory(level, msg));
21
- }
22
- attach(stream) {
23
- this.#stream = stream;
24
- return this;
25
- }
26
- detach() {
27
- this.#stream = void 0;
28
- return this;
29
- }
30
- $log({ level, msg }) {
31
- if (this.#stream) {
32
- this.#stream.append(() => {
33
- const node = this.#factory(level, msg);
34
- return this.#opts.wrap?.(node) ?? node;
35
- });
36
- return;
37
- }
38
- this.#writeFallback(level, msg);
39
- }
40
- #defaultFactory(level, msg) {
41
- const nodes = msg.filter((m) => m instanceof Node);
42
- msg = msg.filter((m) => !(m instanceof Node));
43
- msg = this.#opts.stacktrace ? msg : msg.map((v) => v instanceof Error ? v.message : v);
44
- if (msg.length && msg.every((m) => typeof m === "string")) msg = [msg.join(" ")];
45
- let text = msg.length === 1 && typeof msg[0] === "string" ? msg[0] : void 0;
46
- if (msg.length === 0) text = "";
47
- const markdown = (this.#opts.markdown ?? true) && text !== void 0 && isMarkdown(text);
48
- const overrides = this.#opts.styles?.[level] ?? {};
49
- return log({
50
- content: text ?? ((ctx) => inspectFormat(msg, {
51
- ...this.#opts,
52
- style: ctx.style
53
- })),
54
- level,
55
- markdown,
56
- ...overrides
57
- }, ...nodes);
58
- }
59
- /** String path for the no-stream fallback — builds a plain inspected
60
- * line (no prefix chrome) and writes it to stdout/stderr. Keeps the
61
- * fallback synchronous and ordered. */
62
- #writeFallback(level, msg) {
63
- const str = inspectFormat(msg, this.#opts);
64
- const kind = ERR_LEVELS.has(level) ? "stderr" : "stdout";
65
- (this.#opts.write ?? defaultWrite)(`${str}\n`, kind);
66
- }
67
- };
68
- //#endregion
1
+ import { t as TuiReporter } from "../logger-DDrt03So.mjs";
69
2
  export { TuiReporter };
70
-
71
- //# sourceMappingURL=logger.mjs.map
@@ -1,5 +1,5 @@
1
- import { log } from "../widgets/log.mjs";
2
- import { overlay } from "../widgets/overlay.mjs";
1
+ import { t as log } from "../log-Djvrxqk0.mjs";
2
+ import { t as overlay } from "../overlay-9xNgsuuy.mjs";
3
3
  //#region src/services/notifier.ts
4
4
  var Notifier = class {
5
5
  #ui;
@@ -2,7 +2,7 @@ import { C as OverlaySurface, F as Overlay, Lt as ActionFilter, Q as Accessor, n
2
2
  import { t as Input } from "../input-B5Vy-iaa.mjs";
3
3
  import { i as Select, t as Option } from "../select-CbmAZdpt.mjs";
4
4
  import { i as PickerTreeProps, n as PickerItem, r as PickerSelectProps } from "../picker-D8OLb6kZ.mjs";
5
- import { Widget } from "../widgets/widget.mjs";
5
+ import { n as Widget } from "../widget-M7jD8Rgg.mjs";
6
6
  //#region src/services/picker.d.ts
7
7
  type ToggleItem = PickerItem & {
8
8
  enabled?: boolean;
@@ -1,10 +1,10 @@
1
1
  import { c as createRef, y as signal } from "../reactive-f7NpAi69.mjs";
2
- import { r as isMarkdown } from "../inspect-D1d9t-ni.mjs";
3
- import { text } from "../widgets/text.mjs";
4
- import { markdown } from "../widgets/markdown.mjs";
5
- import { overlay } from "../widgets/overlay.mjs";
6
- import { divider } from "../widgets/divider.mjs";
7
- import { t as picker } from "../picker-ndVVt6qF.mjs";
2
+ import { r as isMarkdown } from "../inspect-DE5goDzB.mjs";
3
+ import { n as text } from "../text-DILrol9j.mjs";
4
+ import { n as markdown } from "../markdown-CTlPe5ks.mjs";
5
+ import { t as overlay } from "../overlay-9xNgsuuy.mjs";
6
+ import { t as divider } from "../divider-cclEAdPx.mjs";
7
+ import { t as picker } from "../picker-cH-rc7-X.mjs";
8
8
  //#region src/services/picker.ts
9
9
  var Picker = class {
10
10
  #ui;
@@ -1,7 +1,7 @@
1
1
  import { C as OverlaySurface, Q as Accessor } from "../queries-DH3bj74K.mjs";
2
2
  import { t as Input } from "../input-B5Vy-iaa.mjs";
3
3
  import { n as PickerItem } from "../picker-D8OLb6kZ.mjs";
4
- import { Widget } from "../widgets/widget.mjs";
4
+ import { n as Widget } from "../widget-M7jD8Rgg.mjs";
5
5
  //#region src/services/prompt.d.ts
6
6
  type ToggleItem = PickerItem & {
7
7
  enabled?: boolean;
@@ -1,9 +1,9 @@
1
1
  import { y as signal } from "../reactive-f7NpAi69.mjs";
2
- import { r as isMarkdown } from "../inspect-D1d9t-ni.mjs";
3
- import { text } from "../widgets/text.mjs";
4
- import { markdown } from "../widgets/markdown.mjs";
5
- import { overlay } from "../widgets/overlay.mjs";
6
- import { divider } from "../widgets/divider.mjs";
2
+ import { r as isMarkdown } from "../inspect-DE5goDzB.mjs";
3
+ import { n as text } from "../text-DILrol9j.mjs";
4
+ import { n as markdown } from "../markdown-CTlPe5ks.mjs";
5
+ import { t as overlay } from "../overlay-9xNgsuuy.mjs";
6
+ import { t as divider } from "../divider-cclEAdPx.mjs";
7
7
  //#region src/services/prompt.ts
8
8
  var Prompt = class {
9
9
  #ui;
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,129 @@
1
+ import { a as openAnsi, t as RESET } from "../ansi-Clq0ozyA.mjs";
2
+ import { n as isShikiTheme, t as isShikiLang } from "../shiki-B5NwIiot.mjs";
3
+ import { n as workerHost } from "../worker-T6SdPzUH.mjs";
4
+ import { createHighlighterCore } from "shiki/core";
5
+ import { createOnigurumaEngine } from "shiki/engine/oniguruma";
6
+ import { bundledLanguages } from "shiki/langs";
7
+ //#region src/shiki/api.ts
8
+ const THEME = "tokyo-night";
9
+ const highlighter = await createHighlighterCore({
10
+ engine: await createOnigurumaEngine(import("shiki/wasm")),
11
+ langs: [],
12
+ themes: [],
13
+ warnings: false
14
+ });
15
+ var Shiki = class {
16
+ #loading;
17
+ #langs = {
18
+ loaded: /* @__PURE__ */ new Set(),
19
+ wanted: /* @__PURE__ */ new Set()
20
+ };
21
+ #themes = {
22
+ loaded: /* @__PURE__ */ new Set(),
23
+ wanted: /* @__PURE__ */ new Set()
24
+ };
25
+ status(langs, themes) {
26
+ themes ??= [];
27
+ themes = Array.isArray(themes) ? themes : [themes];
28
+ themes = themes.length > 0 ? themes : [THEME];
29
+ langs = Array.isArray(langs) ? langs : [langs];
30
+ langs = langs.filter(isShikiLang).filter((l) => !this.#langs.loaded.has(l));
31
+ themes = themes.filter(isShikiTheme).filter((t) => !this.#themes.loaded.has(t));
32
+ return {
33
+ loaded: langs.length === 0 && themes.length === 0,
34
+ missing: {
35
+ langs,
36
+ themes
37
+ }
38
+ };
39
+ }
40
+ async load(langs, themes) {
41
+ const status = this.status(langs, themes);
42
+ if (status.loaded) return;
43
+ for (const l of status.missing.langs) this.#langs.wanted.add(l);
44
+ for (const t of status.missing.themes) this.#themes.wanted.add(t);
45
+ if (this.status(langs, themes).loaded) return;
46
+ const load = async () => {
47
+ const loadLangs = [...this.#langs.wanted].filter((l) => !this.#langs.loaded.has(l)).map((l) => bundledLanguages[l]());
48
+ const loadThemes = [...this.#themes.wanted].filter((t) => !this.#themes.loaded.has(t)).map((t) => import(`shiki/themes/${t}.mjs`));
49
+ if (loadLangs.length === 0 && loadThemes.length === 0) return;
50
+ await Promise.all([...loadLangs, ...loadThemes]);
51
+ if (loadLangs.length > 0) await highlighter.loadLanguage(...loadLangs);
52
+ if (loadThemes.length > 0) await highlighter.loadTheme(...loadThemes);
53
+ for (const l of highlighter.getLoadedLanguages()) this.#langs.loaded.add(l);
54
+ for (const t of highlighter.getLoadedThemes()) this.#themes.loaded.add(t);
55
+ };
56
+ this.#loading = (this.#loading ?? Promise.resolve()).then(load, load);
57
+ await this.#loading;
58
+ }
59
+ async highlight(code, lang, theme = THEME) {
60
+ await this.load(lang, theme);
61
+ if (!this.#themes.loaded.has(theme)) throw new Error(`Theme ${theme} not loaded`);
62
+ if (!this.#langs.loaded.has(lang)) return code;
63
+ const t = highlighter.getTheme(theme);
64
+ let output = "";
65
+ const lines = highlighter.codeToTokensBase(code, { lang });
66
+ for (const line of lines) {
67
+ for (const token of line) {
68
+ const text = token.content;
69
+ const style = {
70
+ bg: token.bgColor,
71
+ fg: token.color ?? t.fg
72
+ };
73
+ if (token.fontStyle) {
74
+ if (token.fontStyle & 2) style.bold = true;
75
+ if (token.fontStyle & 1) style.italic = true;
76
+ if (token.fontStyle & 4) style.underline = true;
77
+ if (token.fontStyle & 8) style.strikethrough = true;
78
+ }
79
+ output += openAnsi(style) + text + RESET;
80
+ }
81
+ output += "\n";
82
+ }
83
+ return output.replace(/\n+$/, "");
84
+ }
85
+ isLang(lang) {
86
+ return isShikiLang(lang);
87
+ }
88
+ isTheme(theme) {
89
+ return isShikiTheme(theme);
90
+ }
91
+ };
92
+ const shiki = new Shiki();
93
+ //#endregion
94
+ //#region src/shiki/server.ts
95
+ async function highlight(job) {
96
+ try {
97
+ const value = await shiki.highlight(job.code, job.lang, job.theme);
98
+ return {
99
+ id: job.id,
100
+ value
101
+ };
102
+ } catch (error) {
103
+ return {
104
+ error: error instanceof Error ? error.message : String(error),
105
+ id: job.id,
106
+ value: job.code
107
+ };
108
+ }
109
+ }
110
+ const queue = [];
111
+ let running = void 0;
112
+ async function run() {
113
+ while (queue.length) {
114
+ const req = queue.pop();
115
+ workerHost.postMessage(await highlight(req));
116
+ await Promise.resolve();
117
+ }
118
+ }
119
+ async function handle(job) {
120
+ queue.push(job);
121
+ running ??= run().finally(() => {
122
+ running = void 0;
123
+ });
124
+ }
125
+ workerHost.onMessage((message) => handle(message));
126
+ //#endregion
127
+ export {};
128
+
129
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","names":["#langs","#themes","bundled","#loading"],"sources":["../../src/shiki/api.ts","../../src/shiki/server.ts"],"sourcesContent":["import type { AnsiStyle, HexColor } from \"../style/types.ts\"\nimport type { ShikiLanguage, ShikiTheme } from \"./types.ts\"\n\nimport { createHighlighterCore } from \"shiki/core\"\nimport { createOnigurumaEngine } from \"shiki/engine/oniguruma\"\nimport { bundledLanguages as bundled } from \"shiki/langs\"\nimport { isShikiLang, isShikiTheme } from \"../schemas/gen/shiki.ts\"\nimport { openAnsi, RESET } from \"../style/ansi.ts\"\n\nexport type AnsiHighlighter = (code: string, lang?: string) => string\n\nexport type ShikiStatus =\n | { loaded: true }\n | { loaded: false; missing: { langs: string[]; themes: string[] } }\n\ntype L = ShikiLanguage\ntype T = ShikiTheme\n\nconst THEME: ShikiTheme = \"tokyo-night\"\n\n// See: https://github.com/shikijs/vscode-textmate/blob/19dc9b889aa47df91027e857cdad518760b5a026/src/theme.ts#L326\nconst enum FontStyle {\n NotSet = -1,\n None = 0,\n Italic = 1,\n Bold = 2,\n Underline = 4,\n Strikethrough = 8,\n}\n\nconst highlighter = await createHighlighterCore({\n engine: await createOnigurumaEngine(import(\"shiki/wasm\")),\n langs: [],\n themes: [],\n warnings: false,\n})\n\nclass Shiki {\n #loading?: Promise<void>\n #langs = { loaded: new Set<L>(), wanted: new Set<L>() }\n #themes = { loaded: new Set<T>(), wanted: new Set<T>() }\n\n status(langs: string | string[], themes?: string | string[]): ShikiStatus {\n themes ??= []\n themes = Array.isArray(themes) ? themes : [themes]\n themes = themes.length > 0 ? themes : [THEME]\n langs = Array.isArray(langs) ? langs : [langs]\n langs = langs.filter(isShikiLang).filter((l) => !this.#langs.loaded.has(l))\n themes = themes.filter(isShikiTheme).filter((t) => !this.#themes.loaded.has(t))\n return { loaded: langs.length === 0 && themes.length === 0, missing: { langs, themes } }\n }\n\n async load(langs: string | string[], themes?: string | string[]) {\n const status = this.status(langs, themes)\n if (status.loaded) return\n\n for (const l of status.missing.langs) this.#langs.wanted.add(l as L)\n for (const t of status.missing.themes) this.#themes.wanted.add(t as T)\n\n if (this.status(langs, themes).loaded) return\n\n const load = async () => {\n const loadLangs = [...this.#langs.wanted]\n .filter((l) => !this.#langs.loaded.has(l))\n .map((l) => bundled[l]())\n\n const loadThemes = [...this.#themes.wanted]\n .filter((t) => !this.#themes.loaded.has(t))\n .map((t) => import(`shiki/themes/${t}.mjs`))\n\n if (loadLangs.length === 0 && loadThemes.length === 0) return\n\n await Promise.all([...loadLangs, ...loadThemes])\n\n if (loadLangs.length > 0) await highlighter.loadLanguage(...loadLangs)\n if (loadThemes.length > 0) await highlighter.loadTheme(...loadThemes)\n\n for (const l of highlighter.getLoadedLanguages()) this.#langs.loaded.add(l as L)\n for (const t of highlighter.getLoadedThemes()) this.#themes.loaded.add(t as T)\n }\n\n this.#loading = (this.#loading ?? Promise.resolve()).then(load, load)\n await this.#loading\n }\n\n async highlight(code: string, lang: string, theme = THEME) {\n await this.load(lang, theme)\n\n if (!this.#themes.loaded.has(theme)) throw new Error(`Theme ${theme} not loaded`)\n if (!this.#langs.loaded.has(lang as L)) return code\n\n const t = highlighter.getTheme(theme)\n let output = \"\"\n const lines = highlighter.codeToTokensBase(code, { lang: lang as L })\n\n for (const line of lines) {\n for (const token of line) {\n const text = token.content\n const style: AnsiStyle = {\n bg: token.bgColor as HexColor | undefined,\n fg: (token.color ?? t.fg) as HexColor | undefined,\n }\n if (token.fontStyle) {\n if (token.fontStyle & FontStyle.Bold) style.bold = true\n if (token.fontStyle & FontStyle.Italic) style.italic = true\n if (token.fontStyle & FontStyle.Underline) style.underline = true\n if (token.fontStyle & FontStyle.Strikethrough) style.strikethrough = true\n }\n output += openAnsi(style) + text + RESET\n }\n output += \"\\n\"\n }\n return output.replace(/\\n+$/, \"\")\n }\n\n isLang(lang: string): lang is ShikiLanguage {\n return isShikiLang(lang)\n }\n\n isTheme(theme: string): theme is ShikiTheme {\n return isShikiTheme(theme)\n }\n}\n\nexport const shiki = new Shiki()\n","// oxlint-disable no-await-in-loop\nimport type { ShikiResult, ShikiWorkerRequest } from \"./types.ts\"\n\nimport { shiki } from \"./api.ts\"\nimport { workerHost } from \"./worker.ts\"\n\nasync function highlight(job: ShikiWorkerRequest): Promise<ShikiResult> {\n try {\n const value = await shiki.highlight(job.code, job.lang, job.theme)\n return { id: job.id, value }\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : String(error),\n id: job.id,\n value: job.code,\n }\n }\n}\n\nconst queue: ShikiWorkerRequest[] = []\n\nlet running: Promise<void> | undefined = undefined\n\nasync function run(): Promise<void> {\n // Serialize processing to not block the event loop with multiple concurrent highlights.\n while (queue.length) {\n // We do LIFO on purpose so that the visible code blocks are rendered first (last stream nodes)\n const req = queue.pop()!\n // oxlint-disable-next-line unicorn/require-post-message-target-origin\n workerHost.postMessage(await highlight(req))\n await Promise.resolve() // yield to event loop between requests\n }\n}\n\nasync function handle(job: ShikiWorkerRequest): Promise<void> {\n queue.push(job)\n running ??= run().finally(() => {\n running = undefined\n })\n}\n\nworkerHost.onMessage((message: ShikiWorkerRequest) => handle(message))\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { hasColors } from "@zaly/shared/env";
2
1
  //#region src/schemas/gen/shiki.ts
3
2
  const lang = (() => {
4
3
  const _iv1 = /* @__PURE__ */ new Set([
@@ -337,7 +336,7 @@ const lang = (() => {
337
336
  ]);
338
337
  return (input) => true === _iv1.has(input);
339
338
  })();
340
- (() => {
339
+ const theme = (() => {
341
340
  const _iv1 = /* @__PURE__ */ new Set([
342
341
  "andromeeda",
343
342
  "aurora-x",
@@ -410,14 +409,10 @@ const lang = (() => {
410
409
  function isShikiLang(input) {
411
410
  return lang(input);
412
411
  }
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;
412
+ function isShikiTheme(input) {
413
+ return theme(input);
419
414
  }
420
415
  //#endregion
421
- export { isShikiLang as n, codeToAnsi as t };
416
+ export { isShikiTheme as n, isShikiLang as t };
422
417
 
423
- //# sourceMappingURL=shiki-BrjVUkeh.mjs.map
418
+ //# sourceMappingURL=shiki-B5NwIiot.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shiki-B5NwIiot.mjs","names":[],"sources":["../src/schemas/gen/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"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { t as isShikiLang } from "./shiki-B5NwIiot.mjs";
2
+ import { hasColors } from "@zaly/shared/env";
3
+ //#region src/shiki/shiki.ts
4
+ async function codeToAnsi(code, lang, opts) {
5
+ if (!hasColors || !lang || !isShikiLang(lang)) return code;
6
+ const { shikiWorker } = await import("./client-cIckDgAj.mjs");
7
+ return (await shikiWorker.highlight(code, lang, opts)).value;
8
+ }
9
+ //#endregion
10
+ export { codeToAnsi as t };
11
+
12
+ //# sourceMappingURL=shiki-BK-v9CtF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shiki-BK-v9CtF.mjs","names":[],"sources":["../src/shiki/shiki.ts"],"sourcesContent":["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":";;;AAKA,eAAsB,WAAW,MAAc,MAAc,MAAmC;CAC9F,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,IAAI,GAAG,OAAO;CACtD,MAAM,EAAE,gBAAgB,MAAM,OAAO;CAErC,QAAO,MADW,YAAY,UAAU,MAAM,MAAM,IAAI,EAAA,CAC7C;AACb"}