@zaly/tui 0.0.12 → 0.1.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.
- package/assets/schemas/shiki-language.schema.json +352 -0
- package/assets/schemas/shiki-theme.schema.json +71 -0
- package/assets/schemas/theme.schema.json +226 -1046
- package/assets/themes/andromeeda.json +97 -0
- package/assets/themes/ayu-dark.json +31 -25
- package/assets/themes/ayu-light.json +106 -0
- package/assets/themes/ayu-mirage.json +106 -0
- package/assets/themes/catppuccin-frappe.json +43 -40
- package/assets/themes/catppuccin-latte.json +43 -40
- package/assets/themes/catppuccin-macchiato.json +43 -40
- package/assets/themes/catppuccin-mocha.json +43 -40
- package/assets/themes/dark-plus.json +99 -0
- package/assets/themes/dracula.json +47 -47
- package/assets/themes/everforest-dark.json +28 -26
- package/assets/themes/everforest-light.json +28 -26
- package/assets/themes/github-dark-default.json +107 -0
- package/assets/themes/github-dark-dimmed.json +107 -0
- package/assets/themes/github-light-default.json +107 -0
- package/assets/themes/gruvbox-dark-hard.json +98 -0
- package/assets/themes/gruvbox-dark-medium.json +34 -29
- package/assets/themes/gruvbox-light-medium.json +98 -0
- package/assets/themes/horizon-bright.json +101 -0
- package/assets/themes/horizon.json +101 -0
- package/assets/themes/iterm2/LICENSE +25 -0
- package/assets/themes/iterm2/README.md +28 -0
- package/assets/themes/iterm2/catppuccin-latte.json +140 -0
- package/assets/themes/iterm2/catppuccin-mocha.json +140 -0
- package/assets/themes/iterm2/github-dark.json +140 -0
- package/assets/themes/iterm2/github.json +140 -0
- package/assets/themes/iterm2/gruvbox-dark.json +140 -0
- package/assets/themes/iterm2/gruvbox-light.json +140 -0
- package/assets/themes/iterm2/nord.json +140 -0
- package/assets/themes/iterm2/tokyonight-day.json +140 -0
- package/assets/themes/iterm2/tokyonight-moon.json +140 -0
- package/assets/themes/kanagawa-dragon.json +55 -49
- package/assets/themes/kanagawa-lotus.json +105 -0
- package/assets/themes/kanagawa-wave.json +56 -50
- package/assets/themes/light-plus.json +99 -0
- package/assets/themes/material-theme-lighter.json +102 -0
- package/assets/themes/material-theme-palenight.json +52 -45
- package/assets/themes/material-theme.json +102 -0
- package/assets/themes/min-dark.json +69 -14
- package/assets/themes/min-light.json +68 -17
- package/assets/themes/monokai.json +54 -47
- package/assets/themes/night-owl-light.json +105 -0
- package/assets/themes/night-owl.json +57 -49
- package/assets/themes/nord.json +53 -39
- package/assets/themes/one-dark-pro.json +46 -38
- package/assets/themes/one-light.json +52 -41
- package/assets/themes/poimandres.json +51 -49
- package/assets/themes/rose-pine-dawn.json +99 -0
- package/assets/themes/rose-pine-moon.json +99 -0
- package/assets/themes/rose-pine.json +50 -33
- package/assets/themes/solarized-dark.json +38 -31
- package/assets/themes/solarized-light.json +40 -33
- package/assets/themes/synthwave-84.json +47 -30
- package/assets/themes/tokyonight-day.json +3 -3
- package/assets/themes/tokyonight-moon.json +3 -2
- package/assets/themes/tokyonight-night.json +3 -2
- package/assets/themes/tokyonight-storm.json +3 -2
- package/assets/themes/vesper.json +50 -42
- package/assets/themes/vitesse-black.json +103 -0
- package/assets/themes/vitesse-dark.json +26 -30
- package/assets/themes/vitesse-light.json +26 -30
- package/dist/{actions-Dc4D4uSf.d.mts → actions--ODlgCQ5.d.mts} +4 -4
- package/dist/{actions-Dc4D4uSf.d.mts.map → actions--ODlgCQ5.d.mts.map} +1 -1
- package/dist/{ansi-DZlXaItJ.mjs → ansi-CMv71xVr.mjs} +3 -31
- package/dist/ansi-CMv71xVr.mjs.map +1 -0
- package/dist/ansi.d.mts +1 -1
- package/dist/ansi.mjs +1 -1
- package/dist/{autocomplete-StW1QJZJ.d.mts → autocomplete-CD30kSe_.d.mts} +4 -4
- package/dist/{autocomplete-StW1QJZJ.d.mts.map → autocomplete-CD30kSe_.d.mts.map} +1 -1
- package/dist/{box-BkP4MF82.mjs → box-C_N_7ChP.mjs} +2 -2
- package/dist/{box-BkP4MF82.mjs.map → box-C_N_7ChP.mjs.map} +1 -1
- package/dist/builder-Chwtk0nQ.mjs +196 -0
- package/dist/builder-Chwtk0nQ.mjs.map +1 -0
- package/dist/{callbacks-BwWTCqPJ.mjs → callbacks-DLecWn7G.mjs} +4 -4
- package/dist/{callbacks-BwWTCqPJ.mjs.map → callbacks-DLecWn7G.mjs.map} +1 -1
- package/dist/client-CNGt-dOt.mjs +1 -0
- package/dist/{client-C2GXKfJ1.mjs → client-D7qz4TZt.mjs} +7 -3
- package/dist/client-D7qz4TZt.mjs.map +1 -0
- package/dist/color-DBMQLv4Y.mjs +37 -0
- package/dist/color-DBMQLv4Y.mjs.map +1 -0
- package/dist/{ctx-B7BmPUCD.mjs → ctx-BaQ2hP5u.mjs} +3 -3
- package/dist/{ctx-B7BmPUCD.mjs.map → ctx-BaQ2hP5u.mjs.map} +1 -1
- package/dist/ctx-CndlTp1T.mjs +1 -0
- package/dist/{divider-TSx9NhI_.mjs → divider-BlNNN2OS.mjs} +2 -2
- package/dist/{divider-TSx9NhI_.mjs.map → divider-BlNNN2OS.mjs.map} +1 -1
- package/dist/{files-7DUYSeNc.d.mts → files-B_5HDBPp.d.mts} +3 -3
- package/dist/{files-7DUYSeNc.d.mts.map → files-B_5HDBPp.d.mts.map} +1 -1
- package/dist/{github-C1KfXk98.d.mts → github-CyRwUQ3y.d.mts} +3 -3
- package/dist/{github-C1KfXk98.d.mts.map → github-CyRwUQ3y.d.mts.map} +1 -1
- package/dist/{image-VaT7AN-S.d.mts → image-BLls2F4t.d.mts} +2 -2
- package/dist/{image-VaT7AN-S.d.mts.map → image-BLls2F4t.d.mts.map} +1 -1
- package/dist/image-Cqtj3yRA.mjs +178 -0
- package/dist/image-Cqtj3yRA.mjs.map +1 -0
- package/dist/image.d.mts +1 -1
- package/dist/index.d.mts +13 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +8 -7
- package/dist/index.mjs.map +1 -1
- package/dist/{input-BGTTujDN.mjs → input-ET2YEMcl.mjs} +2 -2
- package/dist/{input-BGTTujDN.mjs.map → input-ET2YEMcl.mjs.map} +1 -1
- package/dist/{input-BAYux7qo.d.mts → input-NuD8TH8N.d.mts} +3 -3
- package/dist/{input-BAYux7qo.d.mts.map → input-NuD8TH8N.d.mts.map} +1 -1
- package/dist/{inspect-CfNydMgO.d.mts → inspect-B1uXxdKC.d.mts} +2 -2
- package/dist/{inspect-CfNydMgO.d.mts.map → inspect-B1uXxdKC.d.mts.map} +1 -1
- package/dist/{inspect-jG_W4njH.mjs → inspect-Cxzs-W0g.mjs} +2 -2
- package/dist/{inspect-jG_W4njH.mjs.map → inspect-Cxzs-W0g.mjs.map} +1 -1
- package/dist/kitty-DKQYsQfH.mjs +1 -0
- package/dist/{log-ByKlM4iI.mjs → log-B4djzy2m.mjs} +4 -4
- package/dist/{log-ByKlM4iI.mjs.map → log-B4djzy2m.mjs.map} +1 -1
- package/dist/{logger-DSQb0sLP.mjs → logger-CvJCITzP.mjs} +3 -3
- package/dist/{logger-DSQb0sLP.mjs.map → logger-CvJCITzP.mjs.map} +1 -1
- package/dist/{markdown-CwRmWuU6.mjs → markdown-D3ZtRn6C.mjs} +9 -8
- package/dist/markdown-D3ZtRn6C.mjs.map +1 -0
- package/dist/markdown.d.mts +1 -1
- package/dist/markdown.d.mts.map +1 -1
- package/dist/markdown.mjs +1 -1
- package/dist/math-CU0wmC9N.mjs +1 -0
- package/dist/math-Dd7a1irv.mjs +206 -0
- package/dist/math-Dd7a1irv.mjs.map +1 -0
- package/dist/oklch-Bsh5swbC.mjs +99 -0
- package/dist/oklch-Bsh5swbC.mjs.map +1 -0
- package/dist/{overlay-BnvOKtGT.mjs → overlay-LvOjG7kn.mjs} +2 -2
- package/dist/{overlay-BnvOKtGT.mjs.map → overlay-LvOjG7kn.mjs.map} +1 -1
- package/dist/{picker-DQs_IW77.d.mts → picker-B-OxKKnD.d.mts} +5 -5
- package/dist/{picker-DQs_IW77.d.mts.map → picker-B-OxKKnD.d.mts.map} +1 -1
- package/dist/{picker-Dh5IUrTk.mjs → picker-f6xjgACX.mjs} +2 -2
- package/dist/{picker-Dh5IUrTk.mjs.map → picker-f6xjgACX.mjs.map} +1 -1
- package/dist/{queries-B_lOwEiE.mjs → queries-BUkBxkuM.mjs} +66 -3
- package/dist/queries-BUkBxkuM.mjs.map +1 -0
- package/dist/{queries-BDX8mcl5.d.mts → queries-C75-wG1B.d.mts} +19 -4
- package/dist/{queries-BDX8mcl5.d.mts.map → queries-C75-wG1B.d.mts.map} +1 -1
- package/dist/{registry-D-suU3g0.mjs → registry-DUWpSPoo.mjs} +202 -57
- package/dist/registry-DUWpSPoo.mjs.map +1 -0
- package/dist/{render-DEIUNLkh.mjs → render-B7LfNM5K.mjs} +2 -2
- package/dist/{render-DEIUNLkh.mjs.map → render-B7LfNM5K.mjs.map} +1 -1
- package/dist/{renderer-zDNlAovy.mjs → renderer-BLsd-wrG.mjs} +110 -14
- package/dist/renderer-BLsd-wrG.mjs.map +1 -0
- package/dist/renderer-YHbR7JZ4.mjs +1 -0
- package/dist/{renderer-MQue4Da5.mjs → renderer-aAtkFgll.mjs} +8 -7
- package/dist/renderer-aAtkFgll.mjs.map +1 -0
- package/dist/{select-J2KtwxyK.d.mts → select-BKE5LzdN.d.mts} +3 -3
- package/dist/{select-J2KtwxyK.d.mts.map → select-BKE5LzdN.d.mts.map} +1 -1
- package/dist/services/logger.d.mts +1 -1
- package/dist/services/logger.mjs +1 -1
- package/dist/services/notifier.d.mts +1 -1
- package/dist/services/notifier.mjs +2 -2
- package/dist/services/picker.d.mts +5 -5
- package/dist/services/picker.mjs +6 -6
- package/dist/services/prompt.d.mts +4 -4
- package/dist/services/prompt.mjs +5 -5
- package/dist/shiki/server.mjs +37 -14
- package/dist/shiki/server.mjs.map +1 -1
- package/dist/shiki-B4U0s8jT.mjs +635 -0
- package/dist/shiki-B4U0s8jT.mjs.map +1 -0
- package/dist/shiki-CJauRusM.mjs +20 -0
- package/dist/shiki-CJauRusM.mjs.map +1 -0
- package/dist/style-DslRHzI4.mjs +109 -0
- package/dist/style-DslRHzI4.mjs.map +1 -0
- package/dist/style.d.mts +4 -3
- package/dist/style.d.mts.map +1 -1
- package/dist/style.mjs +4 -4
- package/dist/{text-CkQ7Irmt.mjs → text-BoJdKXLU.mjs} +2 -2
- package/dist/{text-CkQ7Irmt.mjs.map → text-BoJdKXLU.mjs.map} +1 -1
- package/dist/{text-CCYs9RB2.d.mts → text-CmxbA8lk.d.mts} +3 -3
- package/dist/{text-CCYs9RB2.d.mts.map → text-CmxbA8lk.d.mts.map} +1 -1
- package/dist/{text-XvPfweeg.mjs → text-DPrhma4x.mjs} +2 -2
- package/dist/{text-XvPfweeg.mjs.map → text-DPrhma4x.mjs.map} +1 -1
- package/dist/text.d.mts +1 -1
- package/dist/text.mjs +1 -1
- package/dist/theme-C8LkcoaK.mjs +61 -0
- package/dist/theme-C8LkcoaK.mjs.map +1 -0
- package/dist/theme-DVX8dvGG.mjs +1794 -0
- package/dist/theme-DVX8dvGG.mjs.map +1 -0
- package/dist/themes.d.mts +213 -73
- package/dist/themes.d.mts.map +1 -1
- package/dist/themes.mjs +1 -1
- package/dist/{tree-DJl5W_B7.d.mts → tree-CTvSpF9b.d.mts} +3 -3
- package/dist/{tree-DJl5W_B7.d.mts.map → tree-CTvSpF9b.d.mts.map} +1 -1
- package/dist/{types-D2EYlzmK.d.mts → types-C9ceMsbJ.d.mts} +136 -128
- package/dist/types-C9ceMsbJ.d.mts.map +1 -0
- package/dist/{widget-DPqBbB57.d.mts → widget-DlF32PRp.d.mts} +2 -2
- package/dist/{widget-DPqBbB57.d.mts.map → widget-DlF32PRp.d.mts.map} +1 -1
- package/dist/widgets/autocomplete.d.mts +1 -1
- package/dist/widgets/autocomplete.mjs +2 -2
- package/dist/widgets/box.d.mts +1 -1
- package/dist/widgets/box.mjs +1 -1
- package/dist/widgets/code.d.mts +4 -2
- package/dist/widgets/code.d.mts.map +1 -1
- package/dist/widgets/code.mjs +8 -7
- package/dist/widgets/code.mjs.map +1 -1
- package/dist/widgets/completions/actions.d.mts +1 -1
- package/dist/widgets/completions/files.d.mts +1 -1
- package/dist/widgets/completions/github.d.mts +1 -1
- package/dist/widgets/completions/index.d.mts +3 -3
- package/dist/widgets/diff.d.mts +2 -2
- package/dist/widgets/diff.d.mts.map +1 -1
- package/dist/widgets/diff.mjs +35 -12
- package/dist/widgets/diff.mjs.map +1 -1
- package/dist/widgets/divider.d.mts +2 -2
- package/dist/widgets/divider.mjs +1 -1
- package/dist/widgets/image.d.mts +1 -1
- package/dist/widgets/image.mjs +4 -4
- package/dist/widgets/image.mjs.map +1 -1
- package/dist/widgets/input.d.mts +1 -1
- package/dist/widgets/input.mjs +1 -1
- package/dist/widgets/log.d.mts +1 -1
- package/dist/widgets/log.mjs +1 -1
- package/dist/widgets/markdown.d.mts +4 -4
- package/dist/widgets/markdown.d.mts.map +1 -1
- package/dist/widgets/markdown.mjs +1 -1
- package/dist/widgets/overlay.d.mts +1 -1
- package/dist/widgets/overlay.mjs +1 -1
- package/dist/widgets/picker.d.mts +1 -1
- package/dist/widgets/picker.mjs +1 -1
- package/dist/widgets/progress.d.mts +2 -2
- package/dist/widgets/select.d.mts +1 -1
- package/dist/widgets/show.d.mts +1 -1
- package/dist/widgets/spinner.d.mts +2 -2
- package/dist/widgets/text.d.mts +1 -1
- package/dist/widgets/text.mjs +1 -1
- package/dist/widgets/tree.d.mts +1 -1
- package/dist/widgets/widget.d.mts +1 -1
- package/package.json +5 -7
- package/assets/themes/dracula-soft.json +0 -100
- package/assets/themes/github-dark.json +0 -104
- package/assets/themes/github-light.json +0 -104
- package/dist/ansi-DZlXaItJ.mjs.map +0 -1
- package/dist/builder-1z5ewEWK.mjs +0 -386
- package/dist/builder-1z5ewEWK.mjs.map +0 -1
- package/dist/client-C2GXKfJ1.mjs.map +0 -1
- package/dist/client-bzdHIDL2.mjs +0 -1
- package/dist/ctx-D_JgJ8Eo.mjs +0 -1
- package/dist/image-Cm5T-uw-.mjs +0 -108
- package/dist/image-Cm5T-uw-.mjs.map +0 -1
- package/dist/markdown-CwRmWuU6.mjs.map +0 -1
- package/dist/queries-B_lOwEiE.mjs.map +0 -1
- package/dist/registry-D-suU3g0.mjs.map +0 -1
- package/dist/renderer-DhqbEVVR.mjs +0 -1
- package/dist/renderer-MQue4Da5.mjs.map +0 -1
- package/dist/renderer-zDNlAovy.mjs.map +0 -1
- package/dist/shiki--ASSYv4_.mjs +0 -12
- package/dist/shiki--ASSYv4_.mjs.map +0 -1
- package/dist/shiki-D7l5--zz.mjs +0 -432
- package/dist/shiki-D7l5--zz.mjs.map +0 -1
- package/dist/theme.config-B3Yx--C2.mjs +0 -855
- package/dist/theme.config-B3Yx--C2.mjs.map +0 -1
- package/dist/types-D2EYlzmK.d.mts.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { t as isShikiLang } from "./shiki-B4U0s8jT.mjs";
|
|
2
|
+
import { hasColors } from "@zaly/shared/env";
|
|
3
|
+
//#region src/shiki/shiki.ts
|
|
4
|
+
/** List bundled highlighting themes without loading their color definitions. */
|
|
5
|
+
async function shikiThemes() {
|
|
6
|
+
const { bundledThemesInfo } = await import("shiki/themes");
|
|
7
|
+
return bundledThemesInfo.map(({ id, displayName }) => ({
|
|
8
|
+
id,
|
|
9
|
+
name: displayName
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
async function codeToAnsi(code, lang, opts) {
|
|
13
|
+
if (!hasColors || !lang || !isShikiLang(lang)) return code;
|
|
14
|
+
const { shikiWorker } = await import("./client-CNGt-dOt.mjs");
|
|
15
|
+
return (await shikiWorker.highlight(code, lang, opts)).value;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { shikiThemes as n, codeToAnsi as t };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=shiki-CJauRusM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shiki-CJauRusM.mjs","names":[],"sources":["../src/shiki/shiki.ts"],"sourcesContent":["import type { ShikiOpts, ShikiTheme } from \"./types.ts\"\n\nimport { hasColors } from \"@zaly/shared/env\"\nimport { isShikiLang } from \"../schemas/shiki.ts\"\n\n/** List bundled highlighting themes without loading their color definitions. */\nexport async function shikiThemes() {\n const { bundledThemesInfo } = await import(\"shiki/themes\")\n return bundledThemesInfo.map(({ id, displayName }) => ({\n id: id as ShikiTheme,\n name: displayName,\n }))\n}\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":";;;;AAMA,eAAsB,cAAc;CAClC,MAAM,EAAE,sBAAsB,MAAM,OAAO;CAC3C,OAAO,kBAAkB,KAAK,EAAE,IAAI,mBAAmB;EACjD;EACJ,MAAM;CACR,EAAE;AACJ;AAEA,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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { n as isHexColor } from "./color-DBMQLv4Y.mjs";
|
|
2
|
+
import { n as shiftLightness } from "./oklch-Bsh5swbC.mjs";
|
|
3
|
+
import { o as openAnsi } from "./ansi-CMv71xVr.mjs";
|
|
4
|
+
//#region src/style/style.ts
|
|
5
|
+
/**
|
|
6
|
+
* Build the opening SGR escape for a style descriptor. Returns '' if nothing
|
|
7
|
+
* would be emitted. Unresolvable colors (invalid or 'inherit') are dropped.
|
|
8
|
+
*
|
|
9
|
+
* When `theme` is provided, `fg`/`bg` values matching a theme color slot
|
|
10
|
+
* (e.g. `"primary"`, `"muted"`) are resolved against it first. The output
|
|
11
|
+
* ordering is attrs → fg → bg, combined into a single `\x1b[...m` run.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
function openStyle(style, theme) {
|
|
16
|
+
return openAnsi(resolveAnsiStyle(style, theme));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a style-slot reference into a `Style` object. A ref is either a
|
|
20
|
+
* theme slot name (string), an inline `Style`, or `undefined`:
|
|
21
|
+
*
|
|
22
|
+
* - Inline `Style` → returned as-is (no slot lookup).
|
|
23
|
+
* - String ref pointing at a **Color** slot → wrapped as `{ fg: <color> }`.
|
|
24
|
+
* - String ref pointing at a **Style** slot → returned directly.
|
|
25
|
+
* - String ref that doesn't match a slot → treated as a fg color
|
|
26
|
+
* (`{ fg: <ref> }`) and resolved downstream by `colorParams`.
|
|
27
|
+
* - `undefined` → `{}` (emits nothing).
|
|
28
|
+
*
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
function resolveStyle(ref, theme) {
|
|
32
|
+
return ThemeResolver.from(theme).getStyle(ref);
|
|
33
|
+
}
|
|
34
|
+
/** Resolve semantic style references and colors without emitting terminal escapes. */
|
|
35
|
+
function resolveAnsiStyle(ref, theme) {
|
|
36
|
+
const resolver = ThemeResolver.from(theme);
|
|
37
|
+
const { style: _, ...style } = resolver.getStyle(ref);
|
|
38
|
+
return {
|
|
39
|
+
...style,
|
|
40
|
+
bg: style.bg !== void 0 ? resolver.getColor(style.bg, "bg") : void 0,
|
|
41
|
+
fg: style.fg !== void 0 ? resolver.getColor(style.fg, "fg") : void 0
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function parseColor(c) {
|
|
45
|
+
const m = c.match(/^(.+?)([+-]\d{1,3})$/);
|
|
46
|
+
if (!m) return { base: c };
|
|
47
|
+
let lightness = Number(m[2]);
|
|
48
|
+
if (!Number.isFinite(lightness)) throw new TypeError(`Invalid color step in color "${c}": ${m[2]}`);
|
|
49
|
+
lightness = Math.abs(lightness) < 1 ? lightness : lightness / 100;
|
|
50
|
+
return {
|
|
51
|
+
base: m[1],
|
|
52
|
+
lightness
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
var ThemeResolver = class ThemeResolver {
|
|
56
|
+
static #cache = /* @__PURE__ */ new Map();
|
|
57
|
+
static #main = new ThemeResolver();
|
|
58
|
+
#theme;
|
|
59
|
+
#styleCache = /* @__PURE__ */ new Map();
|
|
60
|
+
#colorCache = /* @__PURE__ */ new Map();
|
|
61
|
+
constructor(theme = {}) {
|
|
62
|
+
this.#theme = theme;
|
|
63
|
+
}
|
|
64
|
+
static from(theme) {
|
|
65
|
+
if (theme === void 0) return this.#main;
|
|
66
|
+
let resolver = this.#cache.get(theme);
|
|
67
|
+
if (!resolver) {
|
|
68
|
+
resolver = new ThemeResolver(theme);
|
|
69
|
+
this.#cache.set(theme, resolver);
|
|
70
|
+
}
|
|
71
|
+
return resolver;
|
|
72
|
+
}
|
|
73
|
+
getStyle(ref, seen) {
|
|
74
|
+
if (ref === void 0) return {};
|
|
75
|
+
if (typeof ref === "object") return ref.style ? {
|
|
76
|
+
...this.getStyle(ref.style, seen),
|
|
77
|
+
...ref
|
|
78
|
+
} : ref;
|
|
79
|
+
let ret = this.#styleCache.get(ref);
|
|
80
|
+
if (ret) return ret;
|
|
81
|
+
seen ??= /* @__PURE__ */ new Set();
|
|
82
|
+
if (seen.has(ref)) throw new TypeError(`Circular dependency for theme slot "${ref}".`);
|
|
83
|
+
seen.add(ref);
|
|
84
|
+
const value = this.#theme[ref];
|
|
85
|
+
ret = value === void 0 ? { fg: ref } : this.getStyle(value, seen);
|
|
86
|
+
this.#styleCache.set(ref, ret);
|
|
87
|
+
return ret;
|
|
88
|
+
}
|
|
89
|
+
getColor(ref, kind = "fg", seen) {
|
|
90
|
+
if (ref === void 0) return "inherit";
|
|
91
|
+
const key = `${kind}:${ref}`;
|
|
92
|
+
let ret = this.#colorCache.get(key);
|
|
93
|
+
if (ret) return ret;
|
|
94
|
+
seen ??= /* @__PURE__ */ new Set();
|
|
95
|
+
if (seen.has(ref)) throw new TypeError(`Circular dependency for theme slot "${ref}".`);
|
|
96
|
+
seen.add(ref);
|
|
97
|
+
const { base, lightness } = parseColor(ref);
|
|
98
|
+
let value = this.#theme[base] ?? base;
|
|
99
|
+
if (typeof value === "object") value = this.getColor(value[kind], kind, seen);
|
|
100
|
+
else if (value !== base) value = this.getColor(value, kind, seen);
|
|
101
|
+
ret = lightness !== void 0 && isHexColor(value) ? shiftLightness(value, lightness) : value;
|
|
102
|
+
this.#colorCache.set(key, ret);
|
|
103
|
+
return ret;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
//#endregion
|
|
107
|
+
export { resolveAnsiStyle as n, resolveStyle as r, openStyle as t };
|
|
108
|
+
|
|
109
|
+
//# sourceMappingURL=style-DslRHzI4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-DslRHzI4.mjs","names":[],"sources":["../src/style/style.ts"],"sourcesContent":["import type { Theme } from \"../themes/types.ts\"\nimport type { AnsiColor, AnsiStyle, Color, Style } from \"./types.ts\"\n\nimport { openAnsi } from \"./ansi.ts\"\nimport { isHexColor } from \"./color.ts\"\nimport { shiftLightness } from \"./oklch.ts\"\n\n/**\n * Build the opening SGR escape for a style descriptor. Returns '' if nothing\n * would be emitted. Unresolvable colors (invalid or 'inherit') are dropped.\n *\n * When `theme` is provided, `fg`/`bg` values matching a theme color slot\n * (e.g. `\"primary\"`, `\"muted\"`) are resolved against it first. The output\n * ordering is attrs → fg → bg, combined into a single `\\x1b[...m` run.\n *\n * @internal\n */\nexport function openStyle(style: Style, theme?: Theme): string {\n return openAnsi(resolveAnsiStyle(style, theme))\n}\n\n/**\n * Resolve a style-slot reference into a `Style` object. A ref is either a\n * theme slot name (string), an inline `Style`, or `undefined`:\n *\n * - Inline `Style` → returned as-is (no slot lookup).\n * - String ref pointing at a **Color** slot → wrapped as `{ fg: <color> }`.\n * - String ref pointing at a **Style** slot → returned directly.\n * - String ref that doesn't match a slot → treated as a fg color\n * (`{ fg: <ref> }`) and resolved downstream by `colorParams`.\n * - `undefined` → `{}` (emits nothing).\n *\n * @internal\n */\nexport function resolveStyle(ref: string | Style | undefined, theme?: Theme): Style {\n return ThemeResolver.from(theme).getStyle(ref)\n}\n\n/** Resolve semantic style references and colors without emitting terminal escapes. */\nexport function resolveAnsiStyle(ref: string | Style | undefined, theme?: Theme): AnsiStyle {\n const resolver = ThemeResolver.from(theme)\n const { style: _, ...style } = resolver.getStyle(ref)\n return {\n ...style,\n bg: style.bg !== undefined ? resolver.getColor(style.bg, \"bg\") : undefined,\n fg: style.fg !== undefined ? resolver.getColor(style.fg, \"fg\") : undefined,\n }\n}\n\nfunction parseColor(c: string): { base: string; lightness?: number } {\n const m = c.match(/^(.+?)([+-]\\d{1,3})$/)\n if (!m) return { base: c }\n let lightness = Number(m[2])\n if (!Number.isFinite(lightness))\n throw new TypeError(`Invalid color step in color \"${c}\": ${m[2]}`)\n lightness = Math.abs(lightness) < 1 ? lightness : lightness / 100\n return { base: m[1], lightness }\n}\n\nclass ThemeResolver {\n static #cache = new Map<Partial<Theme>, ThemeResolver>()\n static #main = new ThemeResolver()\n #theme: Partial<Theme>\n #styleCache = new Map<string, Style>()\n #colorCache = new Map<string, string>()\n\n private constructor(theme: Partial<Theme> = {}) {\n this.#theme = theme\n }\n\n static from(theme?: Theme): ThemeResolver {\n if (theme === undefined) return this.#main\n let resolver = this.#cache.get(theme)\n if (!resolver) {\n resolver = new ThemeResolver(theme)\n this.#cache.set(theme, resolver)\n }\n return resolver\n }\n\n getStyle(ref?: string | Style, seen?: Set<string>): Style {\n if (ref === undefined) return {}\n if (typeof ref === \"object\")\n return ref.style ? { ...this.getStyle(ref.style, seen), ...ref } : ref\n\n let ret = this.#styleCache.get(ref)\n if (ret) return ret\n\n seen ??= new Set<string>()\n if (seen.has(ref)) throw new TypeError(`Circular dependency for theme slot \"${ref}\".`)\n seen.add(ref)\n\n const value = this.#theme[ref as keyof Theme]\n ret = value === undefined ? { fg: ref as Color } : this.getStyle(value, seen)\n this.#styleCache.set(ref, ret)\n return ret\n }\n\n getColor(ref?: string, kind: \"fg\" | \"bg\" = \"fg\", seen?: Set<string>): AnsiColor {\n if (ref === undefined) return \"inherit\"\n\n const key = `${kind}:${ref}`\n let ret = this.#colorCache.get(key)\n if (ret) return ret as AnsiColor\n\n seen ??= new Set<string>()\n if (seen.has(ref)) throw new TypeError(`Circular dependency for theme slot \"${ref}\".`)\n seen.add(ref)\n\n const { base, lightness } = parseColor(ref)\n\n let value = this.#theme[base as keyof Theme] ?? base\n if (typeof value === \"object\") value = this.getColor(value[kind], kind, seen)\n else if (value !== base) value = this.getColor(value, kind, seen)\n ret = lightness !== undefined && isHexColor(value) ? shiftLightness(value, lightness) : value\n this.#colorCache.set(key, ret)\n return ret as AnsiColor\n }\n}\n"],"mappings":"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"}
|
package/dist/style.d.mts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import { a as StyleBuilder, i as isMarkdown, n as inspect, o as styleBuilder, r as inspectFormat, t as InspectOpts } from "./inspect-
|
|
1
|
+
import { a as BrightAnsiColorName, c as HexColor, d as ThemeKey, i as AnyStyle, l as RGB, n as AnsiColorName, o as Color, r as AnsiStyle, s as ColorLightness, t as AnsiColor, u as Style } from "./types-C9ceMsbJ.mjs";
|
|
2
|
+
import { a as StyleBuilder, i as isMarkdown, n as inspect, o as styleBuilder, r as inspectFormat, t as InspectOpts } from "./inspect-B1uXxdKC.mjs";
|
|
3
3
|
//#region src/style/color.d.ts
|
|
4
4
|
export declare function toHex(c: RGB): HexColor;
|
|
5
5
|
export declare function toHex(r: number, g: number, b: number): HexColor;
|
|
6
|
-
export declare function parseHex(hex:
|
|
6
|
+
export declare function parseHex(hex: HexColor): RGB;
|
|
7
7
|
export declare function isHexColor(s: string): s is HexColor;
|
|
8
|
+
export declare function blend(c: HexColor, bg: HexColor, alpha: number): HexColor;
|
|
8
9
|
//#endregion
|
|
9
10
|
export { type AnsiColor, type AnsiColorName, type AnsiStyle, type AnyStyle, type BrightAnsiColorName, type Color, type ColorLightness, type HexColor, InspectOpts, type RGB, type Style, StyleBuilder, type ThemeKey, inspect, inspectFormat, isMarkdown, styleBuilder };
|
|
10
11
|
//# sourceMappingURL=style.d.mts.map
|
package/dist/style.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.d.mts","names":[],"sources":["../src/style/color.ts"],"mappings":";;;wBAMgB,MAAM,GAAG,MAAM;wBACf,MAAM,WAAW,WAAW,YAAY;wBAMxC,SAAS,
|
|
1
|
+
{"version":3,"file":"style.d.mts","names":[],"sources":["../src/style/color.ts"],"mappings":";;;wBAMgB,MAAM,GAAG,MAAM;wBACf,MAAM,WAAW,WAAW,YAAY;wBAMxC,SAAS,KAAK,WAAW;wBAczB,WAAW,YAAY,KAAK;wBAI5B,MAAM,GAAG,UAAU,IAAI,UAAU,gBAAgB"}
|
package/dist/style.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as styleBuilder } from "./builder-
|
|
3
|
-
import { n as inspectFormat, r as isMarkdown, t as inspect } from "./inspect-
|
|
4
|
-
export { inspect, inspectFormat, isHexColor, isMarkdown, parseHex, styleBuilder, toHex };
|
|
1
|
+
import { i as toHex, n as isHexColor, r as parseHex, t as blend } from "./color-DBMQLv4Y.mjs";
|
|
2
|
+
import { t as styleBuilder } from "./builder-Chwtk0nQ.mjs";
|
|
3
|
+
import { n as inspectFormat, r as isMarkdown, t as inspect } from "./inspect-Cxzs-W0g.mjs";
|
|
4
|
+
export { blend, inspect, inspectFormat, isHexColor, isMarkdown, parseHex, styleBuilder, toHex };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { l as styleAnsi, n as ansiBg } from "./ansi-
|
|
1
|
+
import { l as styleAnsi, n as ansiBg } from "./ansi-CMv71xVr.mjs";
|
|
2
2
|
import { clamp } from "@zaly/shared";
|
|
3
3
|
import { hasAnsi, sliceAnsi, splitAnsi, stringWidth, stripAnsi, truncateAnsi, wrapAnsi } from "@zaly/shared/ansi";
|
|
4
4
|
//#region src/layout/text.ts
|
|
@@ -109,4 +109,4 @@ function capitalize(s) {
|
|
|
109
109
|
//#endregion
|
|
110
110
|
export { formatLines as a, expandTabs as i, capitalize as n, formatText as o, countLines as r, calcLayout as t };
|
|
111
111
|
|
|
112
|
-
//# sourceMappingURL=text-
|
|
112
|
+
//# sourceMappingURL=text-BoJdKXLU.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-
|
|
1
|
+
{"version":3,"file":"text-BoJdKXLU.mjs","names":[],"sources":["../src/layout/text.ts"],"sourcesContent":["import type { Layout } from \"../core/state.ts\"\nimport type { StyleBuilder } from \"../style/builder.ts\"\n\nimport { clamp } from \"@zaly/shared\"\nimport {\n hasAnsi,\n sliceAnsi,\n splitAnsi,\n stringWidth,\n stripAnsi,\n truncateAnsi,\n wrapAnsi,\n} from \"@zaly/shared/ansi\"\nimport { ansiBg, styleAnsi } from \"../style/ansi.ts\"\n\nexport type WrapMode = \"word\" | \"char\" | \"none\"\n\nconst ELLIPSIS = \"…\"\nconst TAB_WIDTH = 4\n\nexport function formatText(\n text: string,\n opts: {\n wrap?: WrapMode\n width: number\n style?: StyleBuilder\n /** When wrapping, preserve the indentation of the original text. */\n indent?: boolean\n /** When wrapping ANSI-styled text, pad wrapped fragments to `width`\n * using the background color active at the fragment's last cell.\n * Natural lines that already fit are left unchanged. */\n wrapBg?: boolean\n }\n): string[] {\n const mode = opts.wrap ?? \"word\"\n const lines = splitAnsi(expandTabs(text))\n const ret: string[] = []\n if (mode === \"none\") ret.push(...lines)\n else {\n for (const line of lines) {\n const sw = stringWidth(line)\n\n // Fast path for short lines that don't need wrapping\n if (sw <= opts.width) {\n ret.push(line)\n continue\n }\n\n const stripped = stripAnsi(line)\n\n // Long line that ends in (ansi) whitespace, so just strip\n if (stripped.slice(opts.width).trim() === \"\") {\n ret.push(sliceAnsi(line, 0, opts.width))\n continue\n }\n\n const indentWidth = opts.indent ? stringWidth(stripped.match(/^\\s*/)?.[0] ?? \"\") : 0\n const indent = indentWidth > 0 ? sliceAnsi(line, 0, indentWidth) : \"\"\n const bare = indent ? sliceAnsi(line, indentWidth) : line\n const wrapped = splitAnsi(wrapAnsi(bare, opts.width - indentWidth, { mode }))\n\n // * strip single leading space from wrapped lines after the first\n // * preserve indentation when enabled\n // * pad wrapped lines with bg color if padding is enabled and the line is short\n for (let r = 0; r < wrapped.length; r++) {\n let row = r > 0 && wrapped[r].startsWith(\" \") ? wrapped[r].slice(1) : wrapped[r]\n if (row === \"\" && r > 0 && r < wrapped.length - 1) continue\n if (indent) row = `${indent}${row}`\n if (opts.wrapBg) {\n const rowWidth = stringWidth(row)\n const bg = rowWidth > 0 ? ansiBg(row, rowWidth - 1) : undefined\n if (bg && rowWidth < opts.width) {\n row = `${row}${styleAnsi(\" \".repeat(opts.width - rowWidth), { bg })}`\n }\n }\n ret.push(row)\n }\n }\n }\n return ret.map((line) => (opts.style ? opts.style(line) : line))\n}\n\nexport function expandTabs(s: string, tabSize = TAB_WIDTH): string {\n if (!s.includes(\"\\t\")) return s\n const plain = hasAnsi(s) ? stripAnsi(s) : s\n const spaces: string[] = []\n let col = 0\n\n for (const ch of plain) {\n if (ch === \"\\t\") {\n const n = tabSize - (col % tabSize)\n spaces.push(\" \".repeat(n))\n col += n\n } else if (ch === \"\\n\" || ch === \"\\r\") {\n col = 0\n } else {\n col += stringWidth(ch)\n }\n }\n\n let i = 0\n return s.replaceAll(\"\\t\", () => spaces[i++] ?? \" \".repeat(tabSize))\n}\n\nexport function formatLines(\n text: string | string[],\n opts: {\n numbered?: boolean\n numberOffset?: number\n maxLineLength?: number\n offset?: number\n limit?: number\n more?: false | ((more: number, msg: string) => string)\n style?: StyleBuilder\n } = {}\n): string[] {\n const lines = (typeof text === \"string\" ? splitAnsi(text) : text).map((line) => expandTabs(line))\n const offset = clamp(opts.offset ?? 0, 0, lines.length - 1)\n const limit = clamp(opts.limit ?? lines.length, 1, lines.length - offset)\n const ellipsis = opts.style?.(ELLIPSIS) ?? ELLIPSIS\n let slice = lines\n .slice(offset, offset + limit)\n .map((line) => (opts.maxLineLength ? truncateAnsi(line, opts.maxLineLength, ellipsis) : line))\n\n const numberOffset = opts.numberOffset ?? offset + 1\n const gutterWidth = String(numberOffset + slice.length - 1).length + 2\n\n if (opts.numbered) {\n slice = slice.map((line, i) => {\n const n = numberOffset + i\n const lineo = `${String(n).padStart(gutterWidth - 2)} │`\n return `${opts.style?.(lineo) ?? lineo} ${line}`\n })\n }\n\n if (slice.length < lines.length && opts.more !== false) {\n const moreN = lines.length - slice.length\n let more = `+${moreN} more line${moreN > 1 ? \"s\" : \"\"}`\n more = opts.more?.(moreN, more) ?? more\n if (opts.numbered) {\n const moreGutter = `${\"…\".padStart(gutterWidth - 2)} │`\n slice.push(`${opts.style?.(moreGutter) ?? moreGutter} ${opts.style?.(more) ?? more}`)\n } else slice.push(opts.style?.(more) ?? more)\n }\n\n return slice\n}\n\nfunction maxContent(text: string): number {\n return text.split(\"\\n\").reduce((m, line) => Math.max(m, stringWidth(line)), 0)\n}\n\nfunction minContent(text: string, mode: WrapMode): number | undefined {\n switch (mode) {\n case \"none\": {\n return\n } // can't break, same as max\n case \"char\": {\n return 1\n } // can break anywhere → 1cell floor\n case \"word\": {\n // longest unbreakable run\n return text.split(/\\s+/).reduce((m, word) => Math.max(m, stringWidth(word)), 0)\n }\n default: {\n mode satisfies never // future modes get caught at type-check time\n return undefined\n }\n }\n}\n\nexport function calcLayout(text: string, opts: { wrap?: WrapMode } = {}): Layout {\n text = expandTabs(text)\n const width = maxContent(text)\n return {\n minWidth: minContent(text, opts.wrap ?? \"word\") ?? width,\n width,\n }\n}\n\nexport function countLines(text: string): number {\n let count = 0\n let pos = text.indexOf(\"\\n\")\n while (pos !== -1) {\n count++\n pos = text.indexOf(\"\\n\", pos + 1)\n }\n return count\n}\n\nexport function capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n"],"mappings":";;;;AAiBA,MAAM,WAAW;AACjB,MAAM,YAAY;AAElB,SAAgB,WACd,MACA,MAWU;CACV,MAAM,OAAO,KAAK,QAAQ;CAC1B,MAAM,QAAQ,UAAU,WAAW,IAAI,CAAC;CACxC,MAAM,MAAgB,CAAC;CACvB,IAAI,SAAS,QAAQ,IAAI,KAAK,GAAG,KAAK;MAEpC,KAAK,MAAM,QAAQ,OAAO;EAIxB,IAHW,YAAY,IAGlB,KAAK,KAAK,OAAO;GACpB,IAAI,KAAK,IAAI;GACb;EACF;EAEA,MAAM,WAAW,UAAU,IAAI;EAG/B,IAAI,SAAS,MAAM,KAAK,KAAK,CAAC,CAAC,KAAK,MAAM,IAAI;GAC5C,IAAI,KAAK,UAAU,MAAM,GAAG,KAAK,KAAK,CAAC;GACvC;EACF;EAEA,MAAM,cAAc,KAAK,SAAS,YAAY,SAAS,MAAM,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI;EACnF,MAAM,SAAS,cAAc,IAAI,UAAU,MAAM,GAAG,WAAW,IAAI;EACnE,MAAM,OAAO,SAAS,UAAU,MAAM,WAAW,IAAI;EACrD,MAAM,UAAU,UAAU,SAAS,MAAM,KAAK,QAAQ,aAAa,EAAE,KAAK,CAAC,CAAC;EAK5E,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;GACvC,IAAI,MAAM,IAAI,KAAK,QAAQ,EAAE,CAAC,WAAW,GAAG,IAAI,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,QAAQ;GAC9E,IAAI,QAAQ,MAAM,IAAI,KAAK,IAAI,QAAQ,SAAS,GAAG;GACnD,IAAI,QAAQ,MAAM,GAAG,SAAS;GAC9B,IAAI,KAAK,QAAQ;IACf,MAAM,WAAW,YAAY,GAAG;IAChC,MAAM,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI,KAAA;IACtD,IAAI,MAAM,WAAW,KAAK,OACxB,MAAM,GAAG,MAAM,UAAU,IAAI,OAAO,KAAK,QAAQ,QAAQ,GAAG,EAAE,GAAG,CAAC;GAEtE;GACA,IAAI,KAAK,GAAG;EACd;CACF;CAEF,OAAO,IAAI,KAAK,SAAU,KAAK,QAAQ,KAAK,MAAM,IAAI,IAAI,IAAK;AACjE;AAEA,SAAgB,WAAW,GAAW,UAAU,WAAmB;CACjE,IAAI,CAAC,EAAE,SAAS,GAAI,GAAG,OAAO;CAC9B,MAAM,QAAQ,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI;CAC1C,MAAM,SAAmB,CAAC;CAC1B,IAAI,MAAM;CAEV,KAAK,MAAM,MAAM,OACf,IAAI,OAAO,KAAM;EACf,MAAM,IAAI,UAAW,MAAM;EAC3B,OAAO,KAAK,IAAI,OAAO,CAAC,CAAC;EACzB,OAAO;CACT,OAAO,IAAI,OAAO,QAAQ,OAAO,MAC/B,MAAM;MAEN,OAAO,YAAY,EAAE;CAIzB,IAAI,IAAI;CACR,OAAO,EAAE,WAAW,WAAY,OAAO,QAAQ,IAAI,OAAO,OAAO,CAAC;AACpE;AAEA,SAAgB,YACd,MACA,OAQI,CAAC,GACK;CACV,MAAM,SAAS,OAAO,SAAS,WAAW,UAAU,IAAI,IAAI,KAAA,CAAM,KAAK,SAAS,WAAW,IAAI,CAAC;CAChG,MAAM,SAAS,MAAM,KAAK,UAAU,GAAG,GAAG,MAAM,SAAS,CAAC;CAC1D,MAAM,QAAQ,MAAM,KAAK,SAAS,MAAM,QAAQ,GAAG,MAAM,SAAS,MAAM;CACxE,MAAM,WAAW,KAAK,QAAQ,QAAQ,KAAK;CAC3C,IAAI,QAAQ,MACT,MAAM,QAAQ,SAAS,KAAK,CAAC,CAC7B,KAAK,SAAU,KAAK,gBAAgB,aAAa,MAAM,KAAK,eAAe,QAAQ,IAAI,IAAK;CAE/F,MAAM,eAAe,KAAK,gBAAgB,SAAS;CACnD,MAAM,cAAc,OAAO,eAAe,MAAM,SAAS,CAAC,CAAC,CAAC,SAAS;CAErE,IAAI,KAAK,UACP,QAAQ,MAAM,KAAK,MAAM,MAAM;EAC7B,MAAM,IAAI,eAAe;EACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,cAAc,CAAC,EAAE;EACrD,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,MAAM,GAAG;CAC5C,CAAC;CAGH,IAAI,MAAM,SAAS,MAAM,UAAU,KAAK,SAAS,OAAO;EACtD,MAAM,QAAQ,MAAM,SAAS,MAAM;EACnC,IAAI,OAAO,IAAI,MAAM,YAAY,QAAQ,IAAI,MAAM;EACnD,OAAO,KAAK,OAAO,OAAO,IAAI,KAAK;EACnC,IAAI,KAAK,UAAU;GACjB,MAAM,aAAa,GAAG,IAAI,SAAS,cAAc,CAAC,EAAE;GACpD,MAAM,KAAK,GAAG,KAAK,QAAQ,UAAU,KAAK,WAAW,GAAG,KAAK,QAAQ,IAAI,KAAK,MAAM;EACtF,OAAO,MAAM,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI;CAC9C;CAEA,OAAO;AACT;AAEA,SAAS,WAAW,MAAsB;CACxC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,GAAG,SAAS,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,GAAG,CAAC;AAC/E;AAEA,SAAS,WAAW,MAAc,MAAoC;CACpE,QAAQ,MAAR;EACE,KAAK,QACH;EAEF,KAAK,QACH,OAAO;EAET,KAAK,QAEH,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC,QAAQ,GAAG,SAAS,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,GAAG,CAAC;EAEhF,SAEE;CAEJ;AACF;AAEA,SAAgB,WAAW,MAAc,OAA4B,CAAC,GAAW;CAC/E,OAAO,WAAW,IAAI;CACtB,MAAM,QAAQ,WAAW,IAAI;CAC7B,OAAO;EACL,UAAU,WAAW,MAAM,KAAK,QAAQ,MAAM,KAAK;EACnD;CACF;AACF;AAEA,SAAgB,WAAW,MAAsB;CAC/C,IAAI,QAAQ;CACZ,IAAI,MAAM,KAAK,QAAQ,IAAI;CAC3B,OAAO,QAAQ,IAAI;EACjB;EACA,MAAM,KAAK,QAAQ,MAAM,MAAM,CAAC;CAClC;CACA,OAAO;AACT;AAEA,SAAgB,WAAW,GAAmB;CAC5C,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,MAAM,CAAC;AAC9C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as StyleBuilder } from "./inspect-
|
|
1
|
+
import { X as Layout } from "./queries-C75-wG1B.mjs";
|
|
2
|
+
import { a as StyleBuilder } from "./inspect-B1uXxdKC.mjs";
|
|
3
3
|
//#region src/layout/text.d.ts
|
|
4
4
|
type WrapMode = "word" | "char" | "none";
|
|
5
5
|
declare function formatText(text: string, opts: {
|
|
@@ -30,4 +30,4 @@ declare function countLines(text: string): number;
|
|
|
30
30
|
declare function capitalize(s: string): string;
|
|
31
31
|
//#endregion
|
|
32
32
|
export { expandTabs as a, countLines as i, calcLayout as n, formatLines as o, capitalize as r, formatText as s, WrapMode as t };
|
|
33
|
-
//# sourceMappingURL=text-
|
|
33
|
+
//# sourceMappingURL=text-CmxbA8lk.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-
|
|
1
|
+
{"version":3,"file":"text-CmxbA8lk.d.mts","names":[],"sources":["../src/layout/text.ts"],"mappings":";;;KAeY;iBAKI,WACd,cACA;EACE,OAAO;EACP;EACA,QAAQ;;EAER;;;;EAIA;;iBAmDY,WAAW,WAAW;iBAsBtB,YACd,yBACA;EACE;EACA;EACA;EACA;EACA;EACA,iBAAiB,cAAc;EAC/B,QAAQ;;iBA0DI,WAAW,cAAc;EAAQ,OAAO;IAAkB;iBAS1D,WAAW;iBAUX,WAAW"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { S as unwrap } from "./reactive-f7NpAi69.mjs";
|
|
2
2
|
import { t as Node } from "./node-BZ7f6HzU.mjs";
|
|
3
|
-
import { o as formatText, t as calcLayout } from "./text-
|
|
3
|
+
import { o as formatText, t as calcLayout } from "./text-BoJdKXLU.mjs";
|
|
4
4
|
//#region src/widgets/text.ts
|
|
5
5
|
var Text = class extends Node {
|
|
6
6
|
async _render(ctx) {
|
|
@@ -30,4 +30,4 @@ function text(first, style) {
|
|
|
30
30
|
//#endregion
|
|
31
31
|
export { text as n, textContent as r, Text as t };
|
|
32
32
|
|
|
33
|
-
//# sourceMappingURL=text-
|
|
33
|
+
//# sourceMappingURL=text-DPrhma4x.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-
|
|
1
|
+
{"version":3,"file":"text-DPrhma4x.mjs","names":[],"sources":["../src/widgets/text.ts"],"sourcesContent":["import type { MaybePromise } from \"@zaly/shared\"\nimport type { RenderCtx } from \"../core/ctx.ts\"\nimport type { Reactive } from \"../core/reactive.ts\"\nimport type { State } from \"../core/state.ts\"\nimport type { Style } from \"../style/types.ts\"\n\nimport { Node } from \"../core/node.ts\"\nimport { unwrap } from \"../core/reactive.ts\"\nimport { calcLayout, formatText } from \"../layout/text.ts\"\n\n/**\n * Text content — three forms, resolved at render time:\n *\n * 1. Plain string — static content.\n * 2. Reactive accessor (`signal()` / `memo()`) — re-reads on each\n * render and subscribes the node so signal writes invalidate.\n * 3. `(ctx) => string` — computed from the render context. Use this\n * for inline-styled spans via `ctx.style`.\n *\n * Branded accessors are picked up via `isAccessor`; any other function\n * is treated as the ctx-aware form. Plain strings pass through.\n *\n * ```ts\n * text(\"hello\")\n * text(name) // signal accessor\n * text(({ style }) => style.ok(`✓ ${count}`)) // ctx-aware\n * ```\n */\nexport type TextContent = Reactive<string> | ((ctx: RenderCtx) => MaybePromise<Reactive<string>>)\n\nexport interface TextStyle extends Style<false> {\n content: TextContent\n wrap?: \"word\" | \"char\" | \"none\"\n}\n\nexport class Text extends Node<TextStyle> {\n protected async _render(ctx: RenderCtx): Promise<string[]> {\n const content = await textContent(this.state.content, ctx)\n return formatText(content, {\n style: ctx.style.add(this.state),\n width: ctx.width,\n wrap: this.state.wrap,\n })\n }\n\n override async layout(ctx: RenderCtx) {\n return calcLayout(await textContent(this.state.content, ctx), { wrap: this.state.wrap })\n }\n}\n\nexport function textContent(content: TextContent, ctx: RenderCtx): Promise<string>\nexport function textContent(content: TextContent | undefined, ctx: RenderCtx): Promise<undefined>\nexport async function textContent(\n content: TextContent | undefined,\n ctx: RenderCtx\n): Promise<string | undefined> {\n if (content === undefined) return\n const raw = unwrap(content)\n return unwrap(typeof raw === \"string\" ? raw : await raw(ctx))\n}\n\n/**\n * Factory for `Text`. Content can be a plain string or a `(ctx) => string`\n * function that's called at render time — use the function form when you\n * want inline-styled spans via `ctx.style`.\n *\n * ```ts\n * text(\"hello\")\n * text(\"hello\", { fg: \"primary\", bold: true })\n * text({ content: \"hello\", fg: \"primary\" })\n * text(({ style }) => `ok: ${style.ok(\"yes\")}`)\n * ```\n */\nexport function text(content: TextContent, style?: Omit<State<TextStyle>, \"content\">): Text\nexport function text(style: State<TextStyle>): Text\nexport function text(\n first: TextContent | State<TextStyle>,\n style?: Omit<State<TextStyle>, \"content\">\n): Text {\n // TextContent: string | function (incl. reactive accessor) | …\n // TextStyle: plain object with a `content` field.\n // The TextStyle branch is picked only when `first` is a non-function\n // object — accessors are functions, so they go through the content path.\n if (typeof first === \"string\" || typeof first === \"function\") {\n return new Text({ content: first, ...style })\n }\n return new Text(first)\n}\n"],"mappings":";;;;AAmCA,IAAa,OAAb,cAA0B,KAAgB;CACxC,MAAgB,QAAQ,KAAmC;EACzD,MAAM,UAAU,MAAM,YAAY,KAAK,MAAM,SAAS,GAAG;EACzD,OAAO,WAAW,SAAS;GACzB,OAAO,IAAI,MAAM,IAAI,KAAK,KAAK;GAC/B,OAAO,IAAI;GACX,MAAM,KAAK,MAAM;EACnB,CAAC;CACH;CAEA,MAAe,OAAO,KAAgB;EACpC,OAAO,WAAW,MAAM,YAAY,KAAK,MAAM,SAAS,GAAG,GAAG,EAAE,MAAM,KAAK,MAAM,KAAK,CAAC;CACzF;AACF;AAIA,eAAsB,YACpB,SACA,KAC6B;CAC7B,IAAI,YAAY,KAAA,GAAW;CAC3B,MAAM,MAAM,OAAO,OAAO;CAC1B,OAAO,OAAO,OAAO,QAAQ,WAAW,MAAM,MAAM,IAAI,GAAG,CAAC;AAC9D;AAgBA,SAAgB,KACd,OACA,OACM;CAKN,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAChD,OAAO,IAAI,KAAK;EAAE,SAAS;EAAO,GAAG;CAAM,CAAC;CAE9C,OAAO,IAAI,KAAK,KAAK;AACvB"}
|
package/dist/text.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as expandTabs, i as countLines, n as calcLayout, o as formatLines, r as capitalize, s as formatText, t as WrapMode } from "./text-
|
|
1
|
+
import { a as expandTabs, i as countLines, n as calcLayout, o as formatLines, r as capitalize, s as formatText, t as WrapMode } from "./text-CmxbA8lk.mjs";
|
|
2
2
|
export { WrapMode, calcLayout, capitalize, countLines, expandTabs, formatLines, formatText };
|
package/dist/text.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as calcLayout, n as capitalize, r as countLines, i as expandTabs, a as formatLines, o as formatText } from "./text-
|
|
1
|
+
export { t as calcLayout, n as capitalize, r as countLines, i as expandTabs, a as formatLines, o as formatText } from "./text-BoJdKXLU.mjs";
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { n as resolveAnsiStyle } from "./style-DslRHzI4.mjs";
|
|
2
|
+
import { hash } from "@zaly/shared";
|
|
3
|
+
//#region src/shiki/theme.ts
|
|
4
|
+
const syntaxScopes = [
|
|
5
|
+
["comment", ["comment"]],
|
|
6
|
+
["syntaxString", ["string"]],
|
|
7
|
+
["syntaxNumber", ["constant.numeric"]],
|
|
8
|
+
["syntaxBoolean", [
|
|
9
|
+
"constant.language.boolean",
|
|
10
|
+
"constant.language.true",
|
|
11
|
+
"constant.language.false"
|
|
12
|
+
]],
|
|
13
|
+
["syntaxFunction", [
|
|
14
|
+
"entity.name.function",
|
|
15
|
+
"support.function",
|
|
16
|
+
"variable.function"
|
|
17
|
+
]],
|
|
18
|
+
["syntaxField", [
|
|
19
|
+
"variable.other.property",
|
|
20
|
+
"variable.other.object.property",
|
|
21
|
+
"support.type.property-name",
|
|
22
|
+
"meta.object-literal.key",
|
|
23
|
+
"entity.other.attribute-name"
|
|
24
|
+
]],
|
|
25
|
+
["syntaxConstant", ["constant", "variable.other.constant"]],
|
|
26
|
+
["syntaxSpecial", [
|
|
27
|
+
"keyword",
|
|
28
|
+
"storage",
|
|
29
|
+
"entity.name.type",
|
|
30
|
+
"support.type",
|
|
31
|
+
"constant.language",
|
|
32
|
+
"entity.name.tag"
|
|
33
|
+
]],
|
|
34
|
+
["syntaxDelimiter", [
|
|
35
|
+
"punctuation.separator",
|
|
36
|
+
"punctuation.terminator",
|
|
37
|
+
"punctuation.accessor"
|
|
38
|
+
]],
|
|
39
|
+
["syntaxBracket", ["punctuation.section", "punctuation.definition"]]
|
|
40
|
+
];
|
|
41
|
+
const cache = /* @__PURE__ */ new WeakMap();
|
|
42
|
+
/** Resolve highlighting independently of a theme's display name or origin. */
|
|
43
|
+
function shikiTheme(theme, selection = "auto") {
|
|
44
|
+
const selected = selection === "auto" ? theme.shiki : selection;
|
|
45
|
+
if (selected && selected !== "auto") return selected;
|
|
46
|
+
let generated = cache.get(theme);
|
|
47
|
+
if (generated) return generated;
|
|
48
|
+
const styles = [resolveAnsiStyle({ fg: "fg" }, theme), ...syntaxScopes.map(([slot]) => resolveAnsiStyle(slot, theme))];
|
|
49
|
+
const appearance = theme.appearance;
|
|
50
|
+
generated = {
|
|
51
|
+
appearance,
|
|
52
|
+
name: `zaly-${hash(JSON.stringify([appearance, styles]))}`,
|
|
53
|
+
styles
|
|
54
|
+
};
|
|
55
|
+
cache.set(theme, generated);
|
|
56
|
+
return generated;
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { syntaxScopes as n, shikiTheme as t };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=theme-C8LkcoaK.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-C8LkcoaK.mjs","names":[],"sources":["../src/shiki/theme.ts"],"sourcesContent":["import type { AnsiStyle } from \"../style/types.ts\"\nimport type { Theme } from \"../themes/types.ts\"\nimport type { GeneratedShikiTheme, ShikiSelection, ShikiThemeInput } from \"./types.ts\"\n\nimport { hash } from \"@zaly/shared\"\nimport { resolveAnsiStyle } from \"../style/style.ts\"\n\nexport const syntaxScopes = [\n [\"comment\", [\"comment\"]],\n [\"syntaxString\", [\"string\"]],\n [\"syntaxNumber\", [\"constant.numeric\"]],\n [\n \"syntaxBoolean\",\n [\"constant.language.boolean\", \"constant.language.true\", \"constant.language.false\"],\n ],\n [\"syntaxFunction\", [\"entity.name.function\", \"support.function\", \"variable.function\"]],\n [\n \"syntaxField\",\n [\n \"variable.other.property\",\n \"variable.other.object.property\",\n \"support.type.property-name\",\n \"meta.object-literal.key\",\n \"entity.other.attribute-name\",\n ],\n ],\n [\"syntaxConstant\", [\"constant\", \"variable.other.constant\"]],\n [\n \"syntaxSpecial\",\n [\n \"keyword\",\n \"storage\",\n \"entity.name.type\",\n \"support.type\",\n \"constant.language\",\n \"entity.name.tag\",\n ],\n ],\n [\"syntaxDelimiter\", [\"punctuation.separator\", \"punctuation.terminator\", \"punctuation.accessor\"]],\n [\"syntaxBracket\", [\"punctuation.section\", \"punctuation.definition\"]],\n] as const\n\nconst cache = new WeakMap<Theme, GeneratedShikiTheme>()\n\n/** Resolve highlighting independently of a theme's display name or origin. */\nexport function shikiTheme(theme: Theme, selection: ShikiSelection = \"auto\"): ShikiThemeInput {\n const selected = selection === \"auto\" ? theme.shiki : selection\n if (selected && selected !== \"auto\") return selected\n let generated = cache.get(theme)\n if (generated) return generated\n const styles: AnsiStyle[] = [\n resolveAnsiStyle({ fg: \"fg\" }, theme),\n ...syntaxScopes.map(([slot]) => resolveAnsiStyle(slot, theme)),\n ]\n const appearance = theme.appearance\n generated = { appearance, name: `zaly-${hash(JSON.stringify([appearance, styles]))}`, styles }\n cache.set(theme, generated)\n return generated\n}\n"],"mappings":";;;AAOA,MAAa,eAAe;CAC1B,CAAC,WAAW,CAAC,SAAS,CAAC;CACvB,CAAC,gBAAgB,CAAC,QAAQ,CAAC;CAC3B,CAAC,gBAAgB,CAAC,kBAAkB,CAAC;CACrC,CACE,iBACA;EAAC;EAA6B;EAA0B;CAAyB,CACnF;CACA,CAAC,kBAAkB;EAAC;EAAwB;EAAoB;CAAmB,CAAC;CACpF,CACE,eACA;EACE;EACA;EACA;EACA;EACA;CACF,CACF;CACA,CAAC,kBAAkB,CAAC,YAAY,yBAAyB,CAAC;CAC1D,CACE,iBACA;EACE;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CACA,CAAC,mBAAmB;EAAC;EAAyB;EAA0B;CAAsB,CAAC;CAC/F,CAAC,iBAAiB,CAAC,uBAAuB,wBAAwB,CAAC;AACrE;AAEA,MAAM,wBAAQ,IAAI,QAAoC;;AAGtD,SAAgB,WAAW,OAAc,YAA4B,QAAyB;CAC5F,MAAM,WAAW,cAAc,SAAS,MAAM,QAAQ;CACtD,IAAI,YAAY,aAAa,QAAQ,OAAO;CAC5C,IAAI,YAAY,MAAM,IAAI,KAAK;CAC/B,IAAI,WAAW,OAAO;CACtB,MAAM,SAAsB,CAC1B,iBAAiB,EAAE,IAAI,KAAK,GAAG,KAAK,GACpC,GAAG,aAAa,KAAK,CAAC,UAAU,iBAAiB,MAAM,KAAK,CAAC,CAC/D;CACA,MAAM,aAAa,MAAM;CACzB,YAAY;EAAE;EAAY,MAAM,QAAQ,KAAK,KAAK,UAAU,CAAC,YAAY,MAAM,CAAC,CAAC;EAAK;CAAO;CAC7F,MAAM,IAAI,OAAO,SAAS;CAC1B,OAAO;AACT"}
|