@zaly/tui 0.0.11 → 0.0.12
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/theme.schema.json +351 -36
- package/assets/themes/ayu-dark.json +2 -21
- package/assets/themes/catppuccin-frappe.json +2 -21
- package/assets/themes/catppuccin-latte.json +2 -21
- package/assets/themes/catppuccin-macchiato.json +2 -21
- package/assets/themes/catppuccin-mocha.json +2 -21
- package/assets/themes/dracula-soft.json +2 -21
- package/assets/themes/dracula.json +2 -21
- package/assets/themes/everforest-dark.json +2 -21
- package/assets/themes/everforest-light.json +2 -21
- package/assets/themes/github-dark.json +2 -21
- package/assets/themes/github-light.json +2 -21
- package/assets/themes/gruvbox-dark-medium.json +2 -21
- package/assets/themes/kanagawa-dragon.json +2 -21
- package/assets/themes/kanagawa-wave.json +2 -21
- package/assets/themes/material-theme-palenight.json +2 -21
- package/assets/themes/min-dark.json +2 -18
- package/assets/themes/min-light.json +2 -18
- package/assets/themes/monokai.json +2 -21
- package/assets/themes/night-owl.json +2 -21
- package/assets/themes/nord.json +2 -18
- package/assets/themes/one-dark-pro.json +2 -21
- package/assets/themes/one-light.json +2 -20
- package/assets/themes/poimandres.json +2 -21
- package/assets/themes/rose-pine.json +2 -18
- package/assets/themes/solarized-dark.json +2 -21
- package/assets/themes/solarized-light.json +2 -21
- package/assets/themes/synthwave-84.json +2 -21
- package/assets/themes/tokyonight-day.json +4 -5
- package/assets/themes/tokyonight-moon.json +3 -4
- package/assets/themes/tokyonight-night.json +3 -4
- package/assets/themes/tokyonight-storm.json +3 -4
- package/assets/themes/vesper.json +2 -17
- package/assets/themes/vitesse-dark.json +2 -21
- package/assets/themes/vitesse-light.json +2 -21
- package/dist/{actions-DFboj3g5.d.mts → actions-Dc4D4uSf.d.mts} +4 -4
- package/dist/{actions-DFboj3g5.d.mts.map → actions-Dc4D4uSf.d.mts.map} +1 -1
- package/dist/{ansi-Clq0ozyA.mjs → ansi-DZlXaItJ.mjs} +37 -2
- package/dist/ansi-DZlXaItJ.mjs.map +1 -0
- package/dist/ansi.d.mts +3 -1
- package/dist/ansi.d.mts.map +1 -1
- package/dist/ansi.mjs +1 -1
- package/dist/{autocomplete-CxzetPOo.d.mts → autocomplete-StW1QJZJ.d.mts} +4 -4
- package/dist/{autocomplete-CxzetPOo.d.mts.map → autocomplete-StW1QJZJ.d.mts.map} +1 -1
- package/dist/{box-DLEcEvDH.mjs → box-BkP4MF82.mjs} +2 -2
- package/dist/box-BkP4MF82.mjs.map +1 -0
- package/dist/{builder-DC9byAmK.mjs → builder-1z5ewEWK.mjs} +4 -4
- package/dist/builder-1z5ewEWK.mjs.map +1 -0
- package/dist/{callbacks-D132G8dy.mjs → callbacks-BwWTCqPJ.mjs} +3 -3
- package/dist/{callbacks-D132G8dy.mjs.map → callbacks-BwWTCqPJ.mjs.map} +1 -1
- package/dist/{ctx-8Nuf5BrN.mjs → ctx-B7BmPUCD.mjs} +3 -3
- package/dist/{ctx-8Nuf5BrN.mjs.map → ctx-B7BmPUCD.mjs.map} +1 -1
- package/dist/ctx-D_JgJ8Eo.mjs +1 -0
- package/dist/{divider-l0-JPEIm.mjs → divider-TSx9NhI_.mjs} +2 -2
- package/dist/divider-TSx9NhI_.mjs.map +1 -0
- package/dist/{files-BUsa-RVl.d.mts → files-7DUYSeNc.d.mts} +3 -3
- package/dist/{files-BUsa-RVl.d.mts.map → files-7DUYSeNc.d.mts.map} +1 -1
- package/dist/{github-D89A3F9U.d.mts → github-C1KfXk98.d.mts} +3 -3
- package/dist/{github-D89A3F9U.d.mts.map → github-C1KfXk98.d.mts.map} +1 -1
- package/dist/github-Cy2hfWJ7.mjs.map +1 -1
- package/dist/{image-34bU73bW.d.mts → image-VaT7AN-S.d.mts} +2 -2
- package/dist/{image-34bU73bW.d.mts.map → image-VaT7AN-S.d.mts.map} +1 -1
- package/dist/image.d.mts +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +4 -4
- package/dist/{input-Dylds_sI.d.mts → input-BAYux7qo.d.mts} +3 -3
- package/dist/{input-Dylds_sI.d.mts.map → input-BAYux7qo.d.mts.map} +1 -1
- package/dist/{input-D7fQEUdt.mjs → input-BGTTujDN.mjs} +16 -11
- package/dist/input-BGTTujDN.mjs.map +1 -0
- package/dist/{inspect-DPLRum7L.d.mts → inspect-CfNydMgO.d.mts} +11 -15
- package/dist/inspect-CfNydMgO.d.mts.map +1 -0
- package/dist/{inspect-CcgiZ_F9.mjs → inspect-jG_W4njH.mjs} +2 -2
- package/dist/{inspect-CcgiZ_F9.mjs.map → inspect-jG_W4njH.mjs.map} +1 -1
- package/dist/{log-Dy_QnPZF.mjs → log-ByKlM4iI.mjs} +5 -5
- package/dist/log-ByKlM4iI.mjs.map +1 -0
- package/dist/{logger-DvuX9DPS.mjs → logger-DSQb0sLP.mjs} +3 -3
- package/dist/{logger-DvuX9DPS.mjs.map → logger-DSQb0sLP.mjs.map} +1 -1
- package/dist/{markdown-BGPa7UzD.mjs → markdown-CwRmWuU6.mjs} +5 -5
- package/dist/{markdown-BGPa7UzD.mjs.map → markdown-CwRmWuU6.mjs.map} +1 -1
- package/dist/markdown.d.mts +1 -1
- package/dist/markdown.mjs +1 -1
- package/dist/{overlay-9WXYiGgW.mjs → overlay-BnvOKtGT.mjs} +2 -2
- package/dist/{overlay-9WXYiGgW.mjs.map → overlay-BnvOKtGT.mjs.map} +1 -1
- package/dist/{picker-JL8lZfRH.d.mts → picker-DQs_IW77.d.mts} +5 -5
- package/dist/{picker-JL8lZfRH.d.mts.map → picker-DQs_IW77.d.mts.map} +1 -1
- package/dist/{picker-BqHINl_a.mjs → picker-Dh5IUrTk.mjs} +2 -2
- package/dist/{picker-BqHINl_a.mjs.map → picker-Dh5IUrTk.mjs.map} +1 -1
- package/dist/{queries-Cvalgu6P.d.mts → queries-BDX8mcl5.d.mts} +26 -10
- package/dist/queries-BDX8mcl5.d.mts.map +1 -0
- package/dist/{registry-3hLzS4ks.mjs → registry-D-suU3g0.mjs} +15 -20
- package/dist/registry-D-suU3g0.mjs.map +1 -0
- package/dist/{render-f7M2856V.mjs → render-DEIUNLkh.mjs} +2 -2
- package/dist/{render-f7M2856V.mjs.map → render-DEIUNLkh.mjs.map} +1 -1
- package/dist/renderer-DhqbEVVR.mjs +1 -0
- package/dist/{renderer-DesbRwjQ.mjs → renderer-MQue4Da5.mjs} +2 -2
- package/dist/{renderer-DesbRwjQ.mjs.map → renderer-MQue4Da5.mjs.map} +1 -1
- package/dist/{renderer-V6AGjbyf.mjs → renderer-zDNlAovy.mjs} +66 -15
- package/dist/renderer-zDNlAovy.mjs.map +1 -0
- package/dist/{select-zGd5pbiB.d.mts → select-J2KtwxyK.d.mts} +3 -3
- package/dist/{select-zGd5pbiB.d.mts.map → select-J2KtwxyK.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 +1 -1
- package/dist/style.d.mts +2 -2
- package/dist/style.mjs +3 -3
- package/dist/{text-BefiXAFW.d.mts → text-CCYs9RB2.d.mts} +3 -3
- package/dist/{text-BefiXAFW.d.mts.map → text-CCYs9RB2.d.mts.map} +1 -1
- package/dist/{text-CRZD9KTN.mjs → text-CkQ7Irmt.mjs} +2 -2
- package/dist/{text-CRZD9KTN.mjs.map → text-CkQ7Irmt.mjs.map} +1 -1
- package/dist/{text-BLz1tRoC.mjs → text-XvPfweeg.mjs} +2 -2
- package/dist/text-XvPfweeg.mjs.map +1 -0
- package/dist/text.d.mts +1 -1
- package/dist/text.mjs +1 -1
- package/dist/{theme.config-BKXX_noZ.mjs → theme.config-B3Yx--C2.mjs} +12 -20
- package/dist/theme.config-B3Yx--C2.mjs.map +1 -0
- package/dist/themes.d.mts +1 -1
- package/dist/themes.mjs +1 -1
- package/dist/{tree-CArtDRec.d.mts → tree-DJl5W_B7.d.mts} +3 -3
- package/dist/{tree-CArtDRec.d.mts.map → tree-DJl5W_B7.d.mts.map} +1 -1
- package/dist/{types-C0EOLZDc.d.mts → types-D2EYlzmK.d.mts} +10 -18
- package/dist/types-D2EYlzmK.d.mts.map +1 -0
- package/dist/{widget-DtJU2-BJ.d.mts → widget-DPqBbB57.d.mts} +2 -2
- package/dist/{widget-DtJU2-BJ.d.mts.map → widget-DPqBbB57.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 +2 -2
- package/dist/widgets/code.mjs +4 -4
- 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.mjs +2 -2
- package/dist/widgets/divider.d.mts +3 -3
- package/dist/widgets/divider.mjs +1 -1
- package/dist/widgets/image.d.mts +1 -1
- package/dist/widgets/image.mjs +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.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 +4 -4
- package/dist/widgets/progress.mjs.map +1 -1
- 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 +2 -2
- package/dist/ansi-Clq0ozyA.mjs.map +0 -1
- package/dist/box-DLEcEvDH.mjs.map +0 -1
- package/dist/builder-DC9byAmK.mjs.map +0 -1
- package/dist/ctx-k0wTqeql.mjs +0 -1
- package/dist/divider-l0-JPEIm.mjs.map +0 -1
- package/dist/input-D7fQEUdt.mjs.map +0 -1
- package/dist/inspect-DPLRum7L.d.mts.map +0 -1
- package/dist/log-Dy_QnPZF.mjs.map +0 -1
- package/dist/queries-Cvalgu6P.d.mts.map +0 -1
- package/dist/registry-3hLzS4ks.mjs.map +0 -1
- package/dist/renderer-BSMOuiLM.mjs +0 -1
- package/dist/renderer-V6AGjbyf.mjs.map +0 -1
- package/dist/text-BLz1tRoC.mjs.map +0 -1
- package/dist/theme.config-BKXX_noZ.mjs.map +0 -1
- package/dist/types-C0EOLZDc.d.mts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay-
|
|
1
|
+
{"version":3,"file":"overlay-BnvOKtGT.mjs","names":[],"sources":["../src/widgets/overlay.ts"],"sourcesContent":["import type { Emitter } from \"@zaly/shared\"\nimport type { Node } from \"../core/node.ts\"\nimport type { State } from \"../core/state.ts\"\nimport type { Box, BoxStyle } from \"./box.ts\"\n\nimport { box } from \"./box.ts\"\n\nexport interface OverlayState {\n /** Absolute column (1-based) of the overlay's left edge. */\n x: number\n /** Absolute row (1-based) of the overlay's top edge. */\n y: number\n /** Higher zIndex paints on top. Default: 0. */\n zIndex?: number\n verticalAnchor?: \"top\" | \"center\" | \"bottom\"\n horizontalAnchor?: \"left\" | \"center\" | \"right\"\n relative?: \"screen\" | \"ui\" | \"stream\"\n /** If true, the overlay will be automatically removed from the renderer when closed.\n * When false, the overlay will remain in the renderer but will be hidden.\n * Default: true. */\n removeOnClose?: boolean\n}\n\ntype OverlayEvents = {\n close: {}\n}\n\nexport type Overlay<T extends Node[] = Node[]> = Box<OverlayState> & {\n children: T\n} & Emitter<OverlayEvents>\n\nexport function overlay<T extends Node[] = Node[]>(\n state: State<OverlayState & BoxStyle>,\n ...children: T\n): Overlay<T> {\n const node = box({ visible: false, ...state }, ...children) as Overlay<T>\n node.withActions({\n \"overlay.close\": {\n desc: \"Close overlay\",\n fn: () => ((node.state.removeOnClose ?? true) ? node.ctx?.overlay.remove(node) : node.hide()),\n keys: [\"esc\", \"ctrl-c\"],\n },\n })\n return node\n}\n"],"mappings":";;AA+BA,SAAgB,QACd,OACA,GAAG,UACS;CACZ,MAAM,OAAO,IAAI;EAAE,SAAS;EAAO,GAAG;CAAM,GAAG,GAAG,QAAQ;CAC1D,KAAK,YAAY,EACf,iBAAiB;EACf,MAAM;EACN,UAAY,KAAK,MAAM,iBAAiB,OAAQ,KAAK,KAAK,QAAQ,OAAO,IAAI,IAAI,KAAK,KAAK;EAC3F,MAAM,CAAC,OAAO,QAAQ;CACxB,EACF,CAAC;CACD,OAAO;AACT"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Ut as NodeActionMap, X as State, nt as Reactive, rt as Ref } from "./queries-
|
|
2
|
-
import { t as Input } from "./input-
|
|
1
|
+
import { Ut as NodeActionMap, X as State, nt as Reactive, rt as Ref } from "./queries-BDX8mcl5.mjs";
|
|
2
|
+
import { t as Input } from "./input-BAYux7qo.mjs";
|
|
3
3
|
import { n as SearchOptions, r as SearchItem, t as SearchItems } from "./search-FvGnswRl.mjs";
|
|
4
|
-
import { i as Select, o as SelectState, t as Option } from "./select-
|
|
5
|
-
import { r as TreeProps, t as TreeItem } from "./tree-
|
|
4
|
+
import { i as Select, o as SelectState, t as Option } from "./select-J2KtwxyK.mjs";
|
|
5
|
+
import { r as TreeProps, t as TreeItem } from "./tree-DJl5W_B7.mjs";
|
|
6
6
|
//#region src/widgets/picker.d.ts
|
|
7
7
|
type PickerItem = Option & SearchItem;
|
|
8
8
|
type PickerActions = keyof ReturnType<typeof picker>["actions"];
|
|
@@ -33,4 +33,4 @@ declare const picker: <T extends PickerItem = PickerItem>(props: State<PickerSel
|
|
|
33
33
|
};
|
|
34
34
|
//#endregion
|
|
35
35
|
export { picker as a, PickerTreeProps as i, PickerItem as n, PickerSelectProps as r, PickerActions as t };
|
|
36
|
-
//# sourceMappingURL=picker-
|
|
36
|
+
//# sourceMappingURL=picker-DQs_IW77.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker-
|
|
1
|
+
{"version":3,"file":"picker-DQs_IW77.d.mts","names":[],"sources":["../src/widgets/picker.ts"],"mappings":";;;;;;KAgBY,aAAa,SAAS;KACtB,sBAAsB,kBAAkB;KAE/C,gBAAgB,UAAU,aAAa,cAAc,cAAc;;;;;;;EAOtE,QAAQ,QAAQ,IAAI;EACpB,UAAU;EACV;EACA,UAAU,cAAc,OAAO;;KAGrB,kBAAkB,UAAU,aAAa,cAAc,gBAAgB,KACjF,KAAK,YAAY;EACf,OAAO,SAAS,YAAY;EAC5B;;KAGQ,gBAAgB,UAAU,WAAW,YAAY,gBAAgB,KAC3E,UAAU;EACR;;cASS,SACV,UAAU,aAAU,YAAA,OAAsB,MAAM,kBAAkB,KAAK,gBAAgB,QAAG,OAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { S as unwrap, f as effect, h as memo, s as createProgressive, x as untrack } from "./reactive-f7NpAi69.mjs";
|
|
2
2
|
import { t as widget } from "./widget-BkMwhY2p.mjs";
|
|
3
|
-
import { t as Input } from "./input-
|
|
3
|
+
import { t as Input } from "./input-BGTTujDN.mjs";
|
|
4
4
|
import { n as select } from "./select-m7NE6Rwa.mjs";
|
|
5
5
|
import { t as tree } from "./tree-Bo1afYhe.mjs";
|
|
6
6
|
import { sliceAnsi, stripAnsi } from "@zaly/shared/ansi";
|
|
@@ -618,4 +618,4 @@ const picker = widget((props) => {
|
|
|
618
618
|
//#endregion
|
|
619
619
|
export { picker as t };
|
|
620
620
|
|
|
621
|
-
//# sourceMappingURL=picker-
|
|
621
|
+
//# sourceMappingURL=picker-Dh5IUrTk.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker-BqHINl_a.mjs","names":[],"sources":["../src/search/score.ts","../src/search/matcher.ts","../src/search/sort.ts","../src/search/search.ts","../src/widgets/picker.ts"],"sourcesContent":["export type ScoreOptions = {\n filenameBonus?: boolean\n historyBonus?: boolean\n}\n\nconst SCORE_MATCH = 16\nconst SCORE_GAP_START = -3\nconst SCORE_GAP_EXTENSION = -1\n\nconst BONUS_BOUNDARY = SCORE_MATCH / 2\nconst BONUS_NONWORD = SCORE_MATCH / 2\nconst BONUS_CAMEL_123 = BONUS_BOUNDARY - 1\nconst BONUS_CONSECUTIVE = -(SCORE_GAP_START + SCORE_GAP_EXTENSION)\nconst BONUS_FIRST_CHAR_MULTIPLIER = 2\nconst BONUS_NO_PATH_SEP = BONUS_BOUNDARY - 2\n\nconst CHAR_WHITE = 0\nconst CHAR_NONWORD = 1\nconst CHAR_DELIMITER = 2\nconst CHAR_LOWER = 3\nconst CHAR_UPPER = 4\nconst CHAR_LETTER = 5\nconst CHAR_NUMBER = 6\n\nconst PATH_SEPS = new Set([\"/\", \"\\\\\"])\n\nconst CHAR_CLASS = Array.from({ length: 256 }, (_, b) => {\n const ch = String.fromCharCode(b)\n if (/\\s/.test(ch)) return CHAR_WHITE\n if (String.raw`/\\,:;|`.includes(ch)) return CHAR_DELIMITER\n if (b >= 48 && b <= 57) return CHAR_NUMBER\n if (b >= 65 && b <= 90) return CHAR_UPPER\n if (b >= 97 && b <= 122) return CHAR_LOWER\n return CHAR_NONWORD\n})\n\nfunction charClass(str: string, pos: number): number {\n const code = str.charCodeAt(pos)\n return code <= 255 ? (CHAR_CLASS[code] ?? CHAR_NONWORD) : CHAR_LETTER\n}\n\nexport class Score {\n readonly #opts: ScoreOptions\n readonly #bonusMatrix: number[][] = []\n readonly #bonusBoundaryWhite: number\n readonly #bonusBoundaryDelimiter: number\n\n #consecutive = 0\n #firstBonus = 0\n #prev: number | undefined\n #prevClass = CHAR_WHITE\n #score = 0\n #str = \"\"\n\n isFile = false\n\n constructor(opts: ScoreOptions = {}) {\n this.#opts = opts\n this.#bonusBoundaryWhite = opts.historyBonus ? BONUS_BOUNDARY : BONUS_BOUNDARY + 2\n this.#bonusBoundaryDelimiter = opts.historyBonus ? BONUS_BOUNDARY : BONUS_BOUNDARY + 1\n for (let prev = 0; prev <= 6; prev++) {\n this.#bonusMatrix[prev] = []\n for (let curr = 0; curr <= 6; curr++) {\n this.#bonusMatrix[prev][curr] = this.#computeBonus(prev, curr)\n }\n }\n }\n\n get score(): number {\n return this.#score\n }\n\n isLeftBoundary(str: string, pos: number): boolean {\n return pos === 0 || charClass(str, pos - 1) < CHAR_LOWER\n }\n\n isRightBoundary(str: string, pos: number): boolean {\n return pos === str.length - 1 || charClass(str, pos + 1) < CHAR_LOWER\n }\n\n init(str: string, first: number): void {\n this.#str = str\n this.#score = 0\n this.#consecutive = 0\n this.#prevClass = first > 0 ? charClass(str, first - 1) : CHAR_WHITE\n this.#prev = undefined\n this.#firstBonus = 0\n\n if (this.isFile && this.#opts.filenameBonus && !hasPathSepAfter(str, first)) {\n this.#score += BONUS_NO_PATH_SEP\n }\n this.update(first)\n }\n\n update(pos: number): void {\n const cls = charClass(this.#str, pos)\n const gap = this.#prev === undefined ? 0 : pos - this.#prev - 1\n let bonus = 0\n\n if (gap > 0) {\n this.#prevClass = charClass(this.#str, pos - 1)\n bonus = this.#bonusMatrix[this.#prevClass]?.[cls] ?? 0\n this.#score += SCORE_GAP_START + (gap - 1) * SCORE_GAP_EXTENSION\n this.#consecutive = 0\n this.#firstBonus = 0\n } else {\n bonus = this.#bonusMatrix[this.#prevClass]?.[cls] ?? 0\n if (this.#consecutive === 0) {\n this.#firstBonus = bonus\n } else {\n if (bonus >= BONUS_BOUNDARY && bonus > this.#firstBonus) this.#firstBonus = bonus\n bonus = Math.max(bonus, this.#firstBonus, BONUS_CONSECUTIVE)\n }\n this.#consecutive++\n }\n\n if (this.#prev === undefined) bonus *= BONUS_FIRST_CHAR_MULTIPLIER\n this.#score += SCORE_MATCH + bonus\n this.#prevClass = cls\n this.#prev = pos\n }\n\n get(str: string, from: number, to: number): number {\n this.init(str, from)\n for (let i = from + 1; i <= to; i++) this.update(i)\n return this.#score\n }\n\n #computeBonus(prev: number, curr: number): number {\n if (curr > CHAR_NONWORD) {\n if (prev === CHAR_WHITE) return this.#bonusBoundaryWhite\n if (prev === CHAR_DELIMITER) return this.#bonusBoundaryDelimiter\n if (prev === CHAR_NONWORD) return BONUS_BOUNDARY\n }\n if (\n (prev === CHAR_LOWER && curr === CHAR_UPPER) ||\n (prev !== CHAR_NUMBER && curr === CHAR_NUMBER)\n ) {\n return BONUS_CAMEL_123\n }\n if (curr === CHAR_NONWORD || curr === CHAR_DELIMITER) return BONUS_NONWORD\n if (curr === CHAR_WHITE) return BONUS_BOUNDARY + 2\n return 0\n }\n}\n\nfunction hasPathSepAfter(str: string, first: number): boolean {\n for (let i = first + 1; i < str.length; i++) if (PATH_SEPS.has(str[i])) return true\n return false\n}\n","import type { ScoreOptions } from \"./score.ts\"\n\nimport { Score } from \"./score.ts\"\n\nexport type SearchItem = {\n idx?: number\n score?: number\n file?: string\n text: string\n}\n\nexport type ScoredItem<T extends SearchItem = SearchItem> = T & {\n score: number\n topk?: boolean\n}\n\nexport type MatcherOptions = ScoreOptions & {\n fuzzy?: boolean\n ignorecase?: boolean\n regex?: boolean\n smartcase?: boolean\n}\n\ntype Mod = {\n chars: string[]\n entropy: number\n exactPrefix?: boolean\n exactSuffix?: boolean\n field?: string\n fuzzy?: boolean\n ignorecase?: boolean\n inverse?: boolean\n pattern: string\n re?: RegExp\n regex?: boolean\n word?: boolean\n}\n\ntype Match = {\n from: number\n score: number\n search: string\n str: string\n to: number\n}\n\nexport class Matcher<T extends SearchItem = SearchItem> {\n readonly opts: Required<Pick<MatcherOptions, \"fuzzy\" | \"ignorecase\" | \"smartcase\">> &\n MatcherOptions\n readonly score: Score\n mods: Mod[][] = []\n one: Mod | undefined\n pattern = \"\"\n tick = 0\n\n constructor(opts: MatcherOptions = {}) {\n this.opts = {\n fuzzy: true,\n ignorecase: true,\n smartcase: true,\n ...opts,\n }\n this.score = new Score(opts)\n }\n\n empty(): boolean {\n return this.mods.length === 0\n }\n\n init(pattern: string): boolean {\n pattern = pattern.trim()\n if (pattern === this.pattern) return false\n\n this.pattern = pattern\n this.tick++\n this.mods = []\n this.one = undefined\n if (pattern === \"\") return true\n\n if (this.opts.regex) {\n this.mods = [[this.#prepare(pattern)]]\n } else {\n let isOr = false\n for (const part of pattern.split(/ +/)) {\n if (part === \"|\") {\n isOr = true\n continue\n }\n const mod = this.#prepare(part)\n if (mod.pattern === \"\") continue\n if (isOr && this.mods.length > 0) this.mods.at(-1)?.push(mod)\n else this.mods.push([mod])\n isOr = false\n }\n }\n\n this.mods = this.mods.map((ors) => ors.toSorted((a, b) => a.entropy - b.entropy))\n this.mods = this.mods.toSorted((a, b) => (b[0]?.entropy ?? 0) - (a[0]?.entropy ?? 0))\n if (this.mods.length === 1 && this.mods[0]?.length === 1) this.one = this.mods[0][0]\n return true\n }\n\n match(input: T | string): number {\n if (this.empty()) return 1000\n const item = typeof input === \"string\" ? { text: input } : input\n if (this.one) return this.#match(item, this.one)?.score ?? 0\n\n let score = 0\n for (const any of this.mods) {\n let match: Match | undefined\n for (const mod of any) {\n match = this.#match(item, mod)\n if (match) break\n }\n if (!match) return 0\n score += match.score\n }\n return score\n }\n\n update(item: T): ScoredItem<T> {\n const score = this.match(item)\n const it = item as ScoredItem<T>\n it.score = score\n return it\n }\n\n positions(input: T | string): number[] {\n if (this.empty()) return []\n const item = typeof input === \"string\" ? { text: input } : input\n const ret: number[] = []\n const all = this.mods.flat()\n for (const mod of all) {\n const match = this.#match(item, mod)\n if (!match) continue\n if (mod.fuzzy) ret.push(...this.#fuzzyPositions(match.search, mod.chars, match.from))\n else for (let i = match.from; i <= match.to; i++) ret.push(i)\n }\n return [...new Set(ret)].toSorted((a, b) => a - b)\n }\n\n fields(): string[] {\n const ret = new Set<string>()\n for (const mod of this.mods.flat()) ret.add(mod.field ?? \"text\")\n return [...ret]\n }\n\n #prepare(pattern: string): Mod {\n const mod: Mod = { chars: [], entropy: 0, pattern }\n\n if (this.opts.regex) {\n mod.regex = true\n const isLower = mod.pattern.toLowerCase() === mod.pattern\n mod.ignorecase = this.opts.smartcase ? isLower : this.opts.ignorecase\n try {\n mod.re = new RegExp(mod.pattern, mod.ignorecase ? \"i\" : undefined)\n } catch {\n mod.re = undefined\n }\n } else {\n const file = parseFilePattern(pattern)\n if (file) {\n mod.field = \"file\"\n mod.pattern = `${file}$`\n }\n\n const field = mod.pattern.match(/^([\\w_][\\w_]+):(.*)$/)\n if (field) {\n mod.field = field[1]\n mod.pattern = field[2]\n }\n\n mod.ignorecase = this.opts.ignorecase\n const isLower = mod.pattern.toLowerCase() === mod.pattern\n if (this.opts.smartcase) mod.ignorecase = isLower\n mod.fuzzy = this.opts.fuzzy\n if (!mod.fuzzy) mod.entropy += 10\n\n if (mod.pattern.startsWith(\"!\")) {\n mod.fuzzy = false\n mod.inverse = true\n mod.pattern = mod.pattern.slice(1)\n mod.entropy -= 1\n }\n if (mod.pattern.startsWith(\"'\")) {\n mod.fuzzy = false\n mod.pattern = mod.pattern.slice(1)\n mod.entropy += 10\n if (mod.pattern.endsWith(\"'\")) {\n mod.word = true\n mod.pattern = mod.pattern.slice(0, -1)\n mod.entropy += 10\n }\n } else if (mod.pattern.startsWith(\"^\")) {\n mod.fuzzy = false\n mod.exactPrefix = true\n mod.pattern = mod.pattern.slice(1)\n mod.entropy += 20\n }\n if (mod.pattern.endsWith(\"$\")) {\n mod.fuzzy = false\n mod.exactSuffix = true\n mod.pattern = mod.pattern.slice(0, -1)\n mod.entropy += 20\n }\n\n const rareChars = (mod.pattern.match(/[^\\w\\s]/g) ?? []).length\n mod.entropy += Math.min(mod.pattern.length, 20) + rareChars * 2\n if (!mod.ignorecase && !isLower) mod.entropy *= 2\n if (mod.ignorecase) mod.pattern = mod.pattern.toLowerCase()\n }\n\n // oxlint-disable-next-line typescript/no-misused-spread\n mod.chars = [...mod.pattern]\n return mod\n }\n\n #match(item: SearchItem, mod: Mod): Match | undefined {\n this.score.isFile = itemField(item, \"file\") !== undefined\n let str = item.text\n\n if (mod.field) {\n const value = itemField(item, mod.field)\n if (value === undefined)\n return mod.inverse ? { from: 0, score: 1000, search: str, str, to: 0 } : undefined\n str = value\n }\n\n const original = str\n if (mod.ignorecase) str = str.toLowerCase()\n\n if (mod.regex) return this.#regex(original, mod)\n if (mod.fuzzy) return this.#fuzzy(str, original, mod.chars)\n\n let from = -1\n let to = -1\n if (mod.exactPrefix) {\n if (str.startsWith(mod.pattern)) {\n from = 0\n to = mod.pattern.length - 1\n }\n } else if (mod.exactSuffix) {\n if (str.endsWith(mod.pattern)) {\n from = str.length - mod.pattern.length\n to = str.length - 1\n }\n } else {\n from = str.indexOf(mod.pattern)\n to = from + mod.pattern.length - 1\n while (mod.word && from >= 0) {\n if (this.score.isLeftBoundary(str, from) && this.score.isRightBoundary(str, to)) break\n from = str.indexOf(mod.pattern, to + 1)\n to = from + mod.pattern.length - 1\n }\n }\n\n if (mod.inverse)\n return from === -1 ? { from: 0, score: 1000, search: str, str: original, to: 0 } : undefined\n if (from >= 0)\n return { from, score: this.score.get(original, from, to), search: str, str: original, to }\n return undefined\n }\n\n #regex(str: string, mod: Mod): Match | undefined {\n const match = mod.re?.exec(str)\n if (!match?.[0]) return undefined\n const from = match.index\n const to = from + match[0].length - 1\n return { from, score: this.score.get(str, from, to), search: str, str, to }\n }\n\n #fuzzyFind(\n str: string,\n original: string,\n pattern: string[],\n init = 0\n ): Pick<Match, \"from\" | \"to\" | \"score\"> | undefined {\n const from = str.indexOf(pattern[0] ?? \"\", init)\n if (from === -1) return undefined\n this.score.init(original, from)\n let last = from\n for (let i = 1; i < pattern.length; i++) {\n last = str.indexOf(pattern[i], last + 1)\n // Bail before reading the score: a partial accumulation never\n // escapes this method, so `#fuzzy` only ever sees a score that\n // corresponds to a fully-matched window.\n if (last === -1) return undefined\n this.score.update(last)\n }\n return { from, score: this.score.score, to: last }\n }\n\n #fuzzy(str: string, original: string, pattern: string[]): Match | undefined {\n // Anchor on every occurrence of the first char and keep the\n // highest-scoring window. The score rides in the return value rather\n // than being read off the shared `this.score`, so there's no\n // \"is the accumulator aligned with `best` right now?\" invariant.\n let best = this.#fuzzyFind(str, original, pattern)\n if (!best) return undefined\n for (\n let next = this.#fuzzyFind(str, original, pattern, best.from + 1);\n next;\n next = this.#fuzzyFind(str, original, pattern, next.from + 1)\n ) {\n if (next.score > best.score) best = next\n }\n return { from: best.from, score: best.score, search: str, str: original, to: best.to }\n }\n\n #fuzzyPositions(str: string, pattern: string[], from: number): number[] {\n const ret = [from]\n let last = from\n for (let i = 1; i < pattern.length; i++) {\n last = str.indexOf(pattern[i], last + 1)\n if (last === -1) break\n ret.push(last)\n }\n return ret\n }\n}\n\nfunction itemField(item: SearchItem, field: string): string | undefined {\n const value = item[field as keyof SearchItem] as unknown\n if (value === undefined || value === null) return undefined\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\")\n return String(value)\n if (Array.isArray(value)) return value.join(\" \")\n return\n}\n\nfunction parseFilePattern(pattern: string): string | undefined {\n return (\n pattern.match(/^(.*[/\\\\].*):\\d*:?:?\\d*$/)?.[1] ??\n pattern.match(/^(.+\\.[a-z_]+):\\d*:?:?\\d*$/)?.[1]\n )\n}\n","import type { ScoredItem, SearchItem } from \"./matcher.ts\"\n\ntype SortKey<T extends SearchItem> = Extract<keyof (ScoredItem<T> & SearchItem), string>\n\nexport type SortField<T extends SearchItem = SearchItem> =\n | SortKey<T>\n | `#${SortKey<T>}`\n | `${SortKey<T>}:desc`\n\nexport type ParsedField<T extends SearchItem = SearchItem> = {\n desc?: boolean\n len?: boolean\n name: SortKey<T>\n}\n\nexport type Sorter<T extends SearchItem = SearchItem> = (\n a: ScoredItem<T>,\n b: ScoredItem<T>\n) => number\n\nfunction parse<T extends SearchItem>(field: SortField<T>): ParsedField<T> {\n const len = field.startsWith(\"#\")\n const desc = field.endsWith(\":desc\")\n const name = field.replace(/^#/, \"\").replace(/:desc$/, \"\") as SortKey<T>\n return { desc, len, name }\n}\n\nexport function sorter<T extends SearchItem>(\n fields: readonly SortField<T>[] = [\"score:desc\", \"#text\", \"idx\"]\n): Sorter<T> {\n const parsed: ParsedField<T>[] = fields.map(parse)\n return (a, b) => {\n for (const field of parsed) {\n let av: unknown = a[field.name]\n let bv: unknown = b[field.name]\n if (av === undefined || bv === undefined) continue\n if (field.len) {\n av = typeof av === \"string\" || Array.isArray(av) ? av.length : 0\n bv = typeof bv === \"string\" || Array.isArray(bv) ? bv.length : 0\n }\n if (av === bv) continue\n if (typeof av === \"boolean\" && typeof bv === \"boolean\") {\n av = av ? 0 : 1\n bv = bv ? 0 : 1\n }\n return compare(av, bv) * (field.desc ? -1 : 1)\n }\n return 0\n }\n}\n\nfunction compare(a: unknown, b: unknown): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b\n if (typeof a === \"string\" && typeof b === \"string\") return a.localeCompare(b)\n return String(a).localeCompare(String(b))\n}\n","// oxlint-disable no-await-in-loop\nimport type { MaybePromise } from \"@zaly/shared\"\nimport type { MatcherOptions, ScoredItem, SearchItem } from \"./matcher.ts\"\nimport type { Sorter, SortField } from \"./sort.ts\"\n\nimport { TopK } from \"@zaly/shared/minheap\"\nimport { Matcher } from \"./matcher.ts\"\nimport { sorter } from \"./sort.ts\"\n\nexport type SearchOptions<T extends SearchItem = SearchItem> = MatcherOptions & {\n sort?: boolean | readonly SortField<T>[]\n filter?: boolean\n sortEmpty?: boolean\n frecency?: () => (file: string) => number\n limit?: number\n throttle?: number\n}\n\nexport type SearchFn<T extends SearchItem = SearchItem> = (\n query: string,\n match: Match<T>\n) => MaybePromise<ScoredItem<T>[]>\n\nexport type SearchItems<T extends SearchItem = SearchItem> = readonly T[] | SearchFn<T>\n\n/** Match function handed to `complete`. Returns `0` for no match,\n * positive integer otherwise — so both `match(s) > 0` and the\n * idiomatic `.filter(match(s))` work (0 is falsy). The magnitude is a\n * score the source can use to rank its own candidates when it cares\n * about order. */\nexport type Match<T extends SearchItem = SearchItem> = (s: string | T) => number\n\nconst BONUS_FRECENCY = 8\nconst SEARCH_LIMIT = 1000\nconst aborted = Symbol(\"search.aborted\")\n\nexport class Searcher<T extends SearchItem = SearchItem> {\n #opts: SearchOptions<T>\n #sorter?: Sorter<T>\n #matcher: Matcher<T>\n #ac?: AbortController\n\n constructor(opts: SearchOptions<T>) {\n this.#opts = opts\n const sortOpts = opts.sort === true ? undefined : opts.sort\n this.#sorter = sortOpts === false ? undefined : sorter(sortOpts)\n this.#matcher = new Matcher(opts)\n }\n\n /** Create a match function bound to the current pattern. If the\n * matcher has been updated since the search started, match will\n * return `0` to indicate no match, to prevent stale results */\n createMatch(opts: { signal: AbortSignal }): Match<T> {\n const m = this.#matcher\n return (s: string | T) => (opts.signal.aborted ? 0 : m.match(s))\n }\n\n async search(\n items: SearchItems<T>,\n query = \"\",\n opts: { progress?: (results: ScoredItem<T>[]) => MaybePromise } = {}\n ): Promise<ScoredItem<T>[]> {\n try {\n return await this.#search(items, query, opts)\n } catch (error) {\n if (error === aborted) return []\n throw error\n }\n }\n\n get limit(): number {\n return this.#opts.limit ?? (this.#sorter ? SEARCH_LIMIT : Infinity)\n }\n\n async #search(\n items: SearchItems<T>,\n query = \"\",\n opts: { progress?: (results: ScoredItem<T>[]) => MaybePromise } = {}\n ): Promise<ScoredItem<T>[]> {\n this.#ac?.abort(aborted)\n // oxlint-disable-next-line no-multi-assign\n const ac = (this.#ac = new AbortController())\n\n const m = this.#matcher\n m.init(query)\n const f = this.#opts.frecency?.()\n const s = this.#sorter\n const limit = this.limit\n const ret: ScoredItem<T>[] = []\n let match = (item: T) => this.#matcher.update(item)\n const topk =\n s && (this.#opts.sortEmpty || !m.empty())\n ? new TopK<ScoredItem<T>>(limit, (a, b) => -s(a, b))\n : undefined\n\n if (typeof items === \"function\") {\n match = (item: T) => item as ScoredItem<T>\n items = await items(query, this.createMatch({ signal: ac.signal }))\n ac.signal.throwIfAborted()\n }\n\n if (items.length === 0) return []\n\n const results = () => topk?.sorted() ?? ret\n\n // Process items in three phases, so that the results in the UI stabilize faster:\n // - previous topk results (topk)\n // - scored items (score)\n // - unscored items (rest)\n const todo: [T[], T[], T[]] = [[], [], []]\n let idx = 0\n if (!topk) todo[0] = items as T[]\n else {\n for (const item of items) {\n item.idx = idx++\n const it = item as ScoredItem<T>\n if (it.topk) todo[0].push(item)\n else if (it.score) todo[1].push(item)\n else todo[2].push(item)\n }\n }\n\n const doFilter = !m.empty() && (this.#opts.filter ?? true)\n\n let lastYield = performance.now()\n let dirty = false\n let count = 0\n\n loop: for (const todos of todo) {\n for (const item of todos) {\n ac.signal.throwIfAborted()\n if (count++ % 256 === 0) {\n const now = performance.now()\n if (now - lastYield >= (this.#opts.throttle ?? 16)) {\n lastYield = now\n await new Promise((r) => setImmediate(r))\n if (opts.progress && dirty) {\n dirty = false\n await opts.progress(results())\n }\n }\n }\n const si = match(item)\n if (si.file && si.score && f) {\n const frecency = f(si.file)\n si.score += (1 - 1 / (1 + frecency)) * BONUS_FRECENCY\n }\n if (doFilter && si.score === 0) continue\n if (topk) {\n si.topk = false\n const ta = topk.add(si)\n if (ta.added) {\n si.topk = true\n dirty = true\n if (ta.evicted) ta.evicted.topk = false\n }\n } else {\n ret.push(si)\n dirty = true\n if (ret.length >= limit) break loop\n }\n }\n }\n\n return results()\n }\n\n positions(s: string | T): number[] {\n return this.#matcher.positions(s)\n }\n}\n","import type { Reactive, Ref } from \"../core/reactive.ts\"\nimport type { State } from \"../core/state.ts\"\nimport type { NodeActionMap } from \"../input/actions.ts\"\nimport type { ScoredItem, SearchItem } from \"../search/matcher.ts\"\nimport type { SearchItems, SearchOptions } from \"../search/search.ts\"\nimport type { Option, Select, SelectState } from \"./select.ts\"\nimport type { TreeItem, TreeProps } from \"./tree.ts\"\n\nimport { sliceAnsi, stripAnsi } from \"@zaly/shared/ansi\"\nimport { createProgressive, effect, memo, untrack, unwrap } from \"../core/reactive.ts\"\nimport { Searcher } from \"../search/search.ts\"\nimport { Input } from \"./input.ts\"\nimport { select } from \"./select.ts\"\nimport { tree } from \"./tree.ts\"\nimport { widget } from \"./widget.ts\"\n\nexport type PickerItem = Option & SearchItem\nexport type PickerActions = keyof ReturnType<typeof picker>[\"actions\"]\n\ntype PickerBaseProps<T extends PickerItem = PickerItem> = SearchOptions<T> & {\n /** The `Input` to watch. Pass the node directly, or a `Ref<Input>`\n * populated by `node.ref(ref)` elsewhere in the tree — the latter\n * enables fully inline composition where the input doesn't need a\n * local binding. The ref is dereferenced on mount, so wiring is\n * type-safe and ordering-flexible (autocomplete can be constructed\n * before the Input is). */\n input?: Input | Ref<Input>\n pattern?: Reactive<string>\n reverse?: boolean\n actions?: NodeActionMap<Select<T>>\n}\n\nexport type PickerSelectProps<T extends PickerItem = PickerItem> = PickerBaseProps<T> &\n Omit<SelectState<T>, \"items\"> & {\n items: Reactive<SearchItems<T>>\n tree?: never\n }\n\nexport type PickerTreeProps<T extends TreeItem = TreeItem> = PickerBaseProps<T> &\n TreeProps<T> & {\n items?: never\n }\n\nfunction isTree<T extends Option = Option>(\n props: PickerTreeProps<T> | PickerSelectProps<T>\n): props is PickerTreeProps<T> {\n return \"tree\" in props\n}\n\nexport const picker = widget(\n <T extends PickerItem = PickerItem>(props: State<PickerSelectProps<T> | PickerTreeProps<T>>) => {\n const pattern = memo(() => {\n if (props.pattern !== undefined) return unwrap(props.pattern)\n const inp = props.input instanceof Input ? props.input : props.input?.()\n return inp?.state.value ?? \"\"\n })\n\n let node: Select<T>\n let items: Reactive<SearchItems<T>>\n if (isTree(props)) {\n props = { filter: false, fuzzy: false, sort: false, ...props }\n const t = tree(props)\n node = t\n items = t.items\n } else {\n node = select({ ...props, items: [] })\n items = props.items\n }\n const searcher = new Searcher<T>(props)\n\n node.extendRenderer((prev) => (item, ctx) => {\n let row = prev(item, ctx)\n if (!item.score) return row\n const stripped = stripAnsi(row)\n const positions = searcher.positions(stripped).toSorted((a, b) => b - a)\n while (positions.length > 0) {\n const from = positions.pop()!\n let to = from\n while (positions.length && positions.at(-1) === to + 1) to = positions.pop()!\n row =\n sliceAnsi(row, 0, from) +\n ctx.style.accent(stripped.slice(from, to + 1)) +\n sliceAnsi(row, to + 1)\n }\n return row\n })\n\n const results = createProgressive<ScoredItem<T>[]>(\n async ({ set }) =>\n await searcher.search(unwrap(items), pattern(), { progress: (r) => set(r) }),\n {\n initialValue: [],\n }\n )\n node.state.items = results\n if (props.input) node.bind(props.input)\n\n const matches = () =>\n unwrap(node.state.items)\n .map((item, i) => [item, i] as const)\n .filter(([item]) => item.score)\n .map(([, i]) => i)\n\n effect(() => {\n const m = matches()\n node.state.more = m.length >= searcher.limit\n if (m.length === 0 || pattern() === \"\") return\n untrack(() => {\n // When filtering, go to the first (best) match.\n // When not filtering, go to the first match that is at or after the current active index, or the first match if none are after.\n if (props.filter === false) {\n const active = node.active\n node.active = m.find((i) => i >= active) ?? m[0]\n } else node.active = 0\n })\n })\n\n return node.withActions({\n ...props.actions,\n \"picker.next\": () => {\n const active = node.active\n const m = matches()\n if (m.length === 0) return node.action(\"select.next\")\n node.active = node.state.reverse\n ? (m.toReversed().find((i) => i < active) ?? m.at(-1)!)\n : (m.find((i) => i > active) ?? m[0])\n },\n \"picker.prev\": () => {\n const active = node.active\n const m = matches()\n if (m.length === 0) return node.action(\"select.prev\")\n node.active = node.state.reverse\n ? (m.find((i) => i > active) ?? m[0])\n : (m.toReversed().find((i) => i < active) ?? m.at(-1)!)\n },\n })\n }\n)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"picker-Dh5IUrTk.mjs","names":[],"sources":["../src/search/score.ts","../src/search/matcher.ts","../src/search/sort.ts","../src/search/search.ts","../src/widgets/picker.ts"],"sourcesContent":["export type ScoreOptions = {\n filenameBonus?: boolean\n historyBonus?: boolean\n}\n\nconst SCORE_MATCH = 16\nconst SCORE_GAP_START = -3\nconst SCORE_GAP_EXTENSION = -1\n\nconst BONUS_BOUNDARY = SCORE_MATCH / 2\nconst BONUS_NONWORD = SCORE_MATCH / 2\nconst BONUS_CAMEL_123 = BONUS_BOUNDARY - 1\nconst BONUS_CONSECUTIVE = -(SCORE_GAP_START + SCORE_GAP_EXTENSION)\nconst BONUS_FIRST_CHAR_MULTIPLIER = 2\nconst BONUS_NO_PATH_SEP = BONUS_BOUNDARY - 2\n\nconst CHAR_WHITE = 0\nconst CHAR_NONWORD = 1\nconst CHAR_DELIMITER = 2\nconst CHAR_LOWER = 3\nconst CHAR_UPPER = 4\nconst CHAR_LETTER = 5\nconst CHAR_NUMBER = 6\n\nconst PATH_SEPS = new Set([\"/\", \"\\\\\"])\n\nconst CHAR_CLASS = Array.from({ length: 256 }, (_, b) => {\n const ch = String.fromCharCode(b)\n if (/\\s/.test(ch)) return CHAR_WHITE\n if (String.raw`/\\,:;|`.includes(ch)) return CHAR_DELIMITER\n if (b >= 48 && b <= 57) return CHAR_NUMBER\n if (b >= 65 && b <= 90) return CHAR_UPPER\n if (b >= 97 && b <= 122) return CHAR_LOWER\n return CHAR_NONWORD\n})\n\nfunction charClass(str: string, pos: number): number {\n const code = str.charCodeAt(pos)\n return code <= 255 ? (CHAR_CLASS[code] ?? CHAR_NONWORD) : CHAR_LETTER\n}\n\nexport class Score {\n readonly #opts: ScoreOptions\n readonly #bonusMatrix: number[][] = []\n readonly #bonusBoundaryWhite: number\n readonly #bonusBoundaryDelimiter: number\n\n #consecutive = 0\n #firstBonus = 0\n #prev: number | undefined\n #prevClass = CHAR_WHITE\n #score = 0\n #str = \"\"\n\n isFile = false\n\n constructor(opts: ScoreOptions = {}) {\n this.#opts = opts\n this.#bonusBoundaryWhite = opts.historyBonus ? BONUS_BOUNDARY : BONUS_BOUNDARY + 2\n this.#bonusBoundaryDelimiter = opts.historyBonus ? BONUS_BOUNDARY : BONUS_BOUNDARY + 1\n for (let prev = 0; prev <= 6; prev++) {\n this.#bonusMatrix[prev] = []\n for (let curr = 0; curr <= 6; curr++) {\n this.#bonusMatrix[prev][curr] = this.#computeBonus(prev, curr)\n }\n }\n }\n\n get score(): number {\n return this.#score\n }\n\n isLeftBoundary(str: string, pos: number): boolean {\n return pos === 0 || charClass(str, pos - 1) < CHAR_LOWER\n }\n\n isRightBoundary(str: string, pos: number): boolean {\n return pos === str.length - 1 || charClass(str, pos + 1) < CHAR_LOWER\n }\n\n init(str: string, first: number): void {\n this.#str = str\n this.#score = 0\n this.#consecutive = 0\n this.#prevClass = first > 0 ? charClass(str, first - 1) : CHAR_WHITE\n this.#prev = undefined\n this.#firstBonus = 0\n\n if (this.isFile && this.#opts.filenameBonus && !hasPathSepAfter(str, first)) {\n this.#score += BONUS_NO_PATH_SEP\n }\n this.update(first)\n }\n\n update(pos: number): void {\n const cls = charClass(this.#str, pos)\n const gap = this.#prev === undefined ? 0 : pos - this.#prev - 1\n let bonus = 0\n\n if (gap > 0) {\n this.#prevClass = charClass(this.#str, pos - 1)\n bonus = this.#bonusMatrix[this.#prevClass]?.[cls] ?? 0\n this.#score += SCORE_GAP_START + (gap - 1) * SCORE_GAP_EXTENSION\n this.#consecutive = 0\n this.#firstBonus = 0\n } else {\n bonus = this.#bonusMatrix[this.#prevClass]?.[cls] ?? 0\n if (this.#consecutive === 0) {\n this.#firstBonus = bonus\n } else {\n if (bonus >= BONUS_BOUNDARY && bonus > this.#firstBonus) this.#firstBonus = bonus\n bonus = Math.max(bonus, this.#firstBonus, BONUS_CONSECUTIVE)\n }\n this.#consecutive++\n }\n\n if (this.#prev === undefined) bonus *= BONUS_FIRST_CHAR_MULTIPLIER\n this.#score += SCORE_MATCH + bonus\n this.#prevClass = cls\n this.#prev = pos\n }\n\n get(str: string, from: number, to: number): number {\n this.init(str, from)\n for (let i = from + 1; i <= to; i++) this.update(i)\n return this.#score\n }\n\n #computeBonus(prev: number, curr: number): number {\n if (curr > CHAR_NONWORD) {\n if (prev === CHAR_WHITE) return this.#bonusBoundaryWhite\n if (prev === CHAR_DELIMITER) return this.#bonusBoundaryDelimiter\n if (prev === CHAR_NONWORD) return BONUS_BOUNDARY\n }\n if (\n (prev === CHAR_LOWER && curr === CHAR_UPPER) ||\n (prev !== CHAR_NUMBER && curr === CHAR_NUMBER)\n ) {\n return BONUS_CAMEL_123\n }\n if (curr === CHAR_NONWORD || curr === CHAR_DELIMITER) return BONUS_NONWORD\n if (curr === CHAR_WHITE) return BONUS_BOUNDARY + 2\n return 0\n }\n}\n\nfunction hasPathSepAfter(str: string, first: number): boolean {\n for (let i = first + 1; i < str.length; i++) if (PATH_SEPS.has(str[i])) return true\n return false\n}\n","import type { ScoreOptions } from \"./score.ts\"\n\nimport { Score } from \"./score.ts\"\n\nexport type SearchItem = {\n idx?: number\n score?: number\n file?: string\n text: string\n}\n\nexport type ScoredItem<T extends SearchItem = SearchItem> = T & {\n score: number\n topk?: boolean\n}\n\nexport type MatcherOptions = ScoreOptions & {\n fuzzy?: boolean\n ignorecase?: boolean\n regex?: boolean\n smartcase?: boolean\n}\n\ntype Mod = {\n chars: string[]\n entropy: number\n exactPrefix?: boolean\n exactSuffix?: boolean\n field?: string\n fuzzy?: boolean\n ignorecase?: boolean\n inverse?: boolean\n pattern: string\n re?: RegExp\n regex?: boolean\n word?: boolean\n}\n\ntype Match = {\n from: number\n score: number\n search: string\n str: string\n to: number\n}\n\nexport class Matcher<T extends SearchItem = SearchItem> {\n readonly opts: Required<Pick<MatcherOptions, \"fuzzy\" | \"ignorecase\" | \"smartcase\">> &\n MatcherOptions\n readonly score: Score\n mods: Mod[][] = []\n one: Mod | undefined\n pattern = \"\"\n tick = 0\n\n constructor(opts: MatcherOptions = {}) {\n this.opts = {\n fuzzy: true,\n ignorecase: true,\n smartcase: true,\n ...opts,\n }\n this.score = new Score(opts)\n }\n\n empty(): boolean {\n return this.mods.length === 0\n }\n\n init(pattern: string): boolean {\n pattern = pattern.trim()\n if (pattern === this.pattern) return false\n\n this.pattern = pattern\n this.tick++\n this.mods = []\n this.one = undefined\n if (pattern === \"\") return true\n\n if (this.opts.regex) {\n this.mods = [[this.#prepare(pattern)]]\n } else {\n let isOr = false\n for (const part of pattern.split(/ +/)) {\n if (part === \"|\") {\n isOr = true\n continue\n }\n const mod = this.#prepare(part)\n if (mod.pattern === \"\") continue\n if (isOr && this.mods.length > 0) this.mods.at(-1)?.push(mod)\n else this.mods.push([mod])\n isOr = false\n }\n }\n\n this.mods = this.mods.map((ors) => ors.toSorted((a, b) => a.entropy - b.entropy))\n this.mods = this.mods.toSorted((a, b) => (b[0]?.entropy ?? 0) - (a[0]?.entropy ?? 0))\n if (this.mods.length === 1 && this.mods[0]?.length === 1) this.one = this.mods[0][0]\n return true\n }\n\n match(input: T | string): number {\n if (this.empty()) return 1000\n const item = typeof input === \"string\" ? { text: input } : input\n if (this.one) return this.#match(item, this.one)?.score ?? 0\n\n let score = 0\n for (const any of this.mods) {\n let match: Match | undefined\n for (const mod of any) {\n match = this.#match(item, mod)\n if (match) break\n }\n if (!match) return 0\n score += match.score\n }\n return score\n }\n\n update(item: T): ScoredItem<T> {\n const score = this.match(item)\n const it = item as ScoredItem<T>\n it.score = score\n return it\n }\n\n positions(input: T | string): number[] {\n if (this.empty()) return []\n const item = typeof input === \"string\" ? { text: input } : input\n const ret: number[] = []\n const all = this.mods.flat()\n for (const mod of all) {\n const match = this.#match(item, mod)\n if (!match) continue\n if (mod.fuzzy) ret.push(...this.#fuzzyPositions(match.search, mod.chars, match.from))\n else for (let i = match.from; i <= match.to; i++) ret.push(i)\n }\n return [...new Set(ret)].toSorted((a, b) => a - b)\n }\n\n fields(): string[] {\n const ret = new Set<string>()\n for (const mod of this.mods.flat()) ret.add(mod.field ?? \"text\")\n return [...ret]\n }\n\n #prepare(pattern: string): Mod {\n const mod: Mod = { chars: [], entropy: 0, pattern }\n\n if (this.opts.regex) {\n mod.regex = true\n const isLower = mod.pattern.toLowerCase() === mod.pattern\n mod.ignorecase = this.opts.smartcase ? isLower : this.opts.ignorecase\n try {\n mod.re = new RegExp(mod.pattern, mod.ignorecase ? \"i\" : undefined)\n } catch {\n mod.re = undefined\n }\n } else {\n const file = parseFilePattern(pattern)\n if (file) {\n mod.field = \"file\"\n mod.pattern = `${file}$`\n }\n\n const field = mod.pattern.match(/^([\\w_][\\w_]+):(.*)$/)\n if (field) {\n mod.field = field[1]\n mod.pattern = field[2]\n }\n\n mod.ignorecase = this.opts.ignorecase\n const isLower = mod.pattern.toLowerCase() === mod.pattern\n if (this.opts.smartcase) mod.ignorecase = isLower\n mod.fuzzy = this.opts.fuzzy\n if (!mod.fuzzy) mod.entropy += 10\n\n if (mod.pattern.startsWith(\"!\")) {\n mod.fuzzy = false\n mod.inverse = true\n mod.pattern = mod.pattern.slice(1)\n mod.entropy -= 1\n }\n if (mod.pattern.startsWith(\"'\")) {\n mod.fuzzy = false\n mod.pattern = mod.pattern.slice(1)\n mod.entropy += 10\n if (mod.pattern.endsWith(\"'\")) {\n mod.word = true\n mod.pattern = mod.pattern.slice(0, -1)\n mod.entropy += 10\n }\n } else if (mod.pattern.startsWith(\"^\")) {\n mod.fuzzy = false\n mod.exactPrefix = true\n mod.pattern = mod.pattern.slice(1)\n mod.entropy += 20\n }\n if (mod.pattern.endsWith(\"$\")) {\n mod.fuzzy = false\n mod.exactSuffix = true\n mod.pattern = mod.pattern.slice(0, -1)\n mod.entropy += 20\n }\n\n const rareChars = (mod.pattern.match(/[^\\w\\s]/g) ?? []).length\n mod.entropy += Math.min(mod.pattern.length, 20) + rareChars * 2\n if (!mod.ignorecase && !isLower) mod.entropy *= 2\n if (mod.ignorecase) mod.pattern = mod.pattern.toLowerCase()\n }\n\n // oxlint-disable-next-line typescript/no-misused-spread\n mod.chars = [...mod.pattern]\n return mod\n }\n\n #match(item: SearchItem, mod: Mod): Match | undefined {\n this.score.isFile = itemField(item, \"file\") !== undefined\n let str = item.text\n\n if (mod.field) {\n const value = itemField(item, mod.field)\n if (value === undefined)\n return mod.inverse ? { from: 0, score: 1000, search: str, str, to: 0 } : undefined\n str = value\n }\n\n const original = str\n if (mod.ignorecase) str = str.toLowerCase()\n\n if (mod.regex) return this.#regex(original, mod)\n if (mod.fuzzy) return this.#fuzzy(str, original, mod.chars)\n\n let from = -1\n let to = -1\n if (mod.exactPrefix) {\n if (str.startsWith(mod.pattern)) {\n from = 0\n to = mod.pattern.length - 1\n }\n } else if (mod.exactSuffix) {\n if (str.endsWith(mod.pattern)) {\n from = str.length - mod.pattern.length\n to = str.length - 1\n }\n } else {\n from = str.indexOf(mod.pattern)\n to = from + mod.pattern.length - 1\n while (mod.word && from >= 0) {\n if (this.score.isLeftBoundary(str, from) && this.score.isRightBoundary(str, to)) break\n from = str.indexOf(mod.pattern, to + 1)\n to = from + mod.pattern.length - 1\n }\n }\n\n if (mod.inverse)\n return from === -1 ? { from: 0, score: 1000, search: str, str: original, to: 0 } : undefined\n if (from >= 0)\n return { from, score: this.score.get(original, from, to), search: str, str: original, to }\n return undefined\n }\n\n #regex(str: string, mod: Mod): Match | undefined {\n const match = mod.re?.exec(str)\n if (!match?.[0]) return undefined\n const from = match.index\n const to = from + match[0].length - 1\n return { from, score: this.score.get(str, from, to), search: str, str, to }\n }\n\n #fuzzyFind(\n str: string,\n original: string,\n pattern: string[],\n init = 0\n ): Pick<Match, \"from\" | \"to\" | \"score\"> | undefined {\n const from = str.indexOf(pattern[0] ?? \"\", init)\n if (from === -1) return undefined\n this.score.init(original, from)\n let last = from\n for (let i = 1; i < pattern.length; i++) {\n last = str.indexOf(pattern[i], last + 1)\n // Bail before reading the score: a partial accumulation never\n // escapes this method, so `#fuzzy` only ever sees a score that\n // corresponds to a fully-matched window.\n if (last === -1) return undefined\n this.score.update(last)\n }\n return { from, score: this.score.score, to: last }\n }\n\n #fuzzy(str: string, original: string, pattern: string[]): Match | undefined {\n // Anchor on every occurrence of the first char and keep the\n // highest-scoring window. The score rides in the return value rather\n // than being read off the shared `this.score`, so there's no\n // \"is the accumulator aligned with `best` right now?\" invariant.\n let best = this.#fuzzyFind(str, original, pattern)\n if (!best) return undefined\n for (\n let next = this.#fuzzyFind(str, original, pattern, best.from + 1);\n next;\n next = this.#fuzzyFind(str, original, pattern, next.from + 1)\n ) {\n if (next.score > best.score) best = next\n }\n return { from: best.from, score: best.score, search: str, str: original, to: best.to }\n }\n\n #fuzzyPositions(str: string, pattern: string[], from: number): number[] {\n const ret = [from]\n let last = from\n for (let i = 1; i < pattern.length; i++) {\n last = str.indexOf(pattern[i], last + 1)\n if (last === -1) break\n ret.push(last)\n }\n return ret\n }\n}\n\nfunction itemField(item: SearchItem, field: string): string | undefined {\n const value = item[field as keyof SearchItem] as unknown\n if (value === undefined || value === null) return undefined\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\")\n return String(value)\n if (Array.isArray(value)) return value.join(\" \")\n return\n}\n\nfunction parseFilePattern(pattern: string): string | undefined {\n return (\n pattern.match(/^(.*[/\\\\].*):\\d*:?:?\\d*$/)?.[1] ??\n pattern.match(/^(.+\\.[a-z_]+):\\d*:?:?\\d*$/)?.[1]\n )\n}\n","import type { ScoredItem, SearchItem } from \"./matcher.ts\"\n\ntype SortKey<T extends SearchItem> = Extract<keyof (ScoredItem<T> & SearchItem), string>\n\nexport type SortField<T extends SearchItem = SearchItem> =\n | SortKey<T>\n | `#${SortKey<T>}`\n | `${SortKey<T>}:desc`\n\nexport type ParsedField<T extends SearchItem = SearchItem> = {\n desc?: boolean\n len?: boolean\n name: SortKey<T>\n}\n\nexport type Sorter<T extends SearchItem = SearchItem> = (\n a: ScoredItem<T>,\n b: ScoredItem<T>\n) => number\n\nfunction parse<T extends SearchItem>(field: SortField<T>): ParsedField<T> {\n const len = field.startsWith(\"#\")\n const desc = field.endsWith(\":desc\")\n const name = field.replace(/^#/, \"\").replace(/:desc$/, \"\") as SortKey<T>\n return { desc, len, name }\n}\n\nexport function sorter<T extends SearchItem>(\n fields: readonly SortField<T>[] = [\"score:desc\", \"#text\", \"idx\"]\n): Sorter<T> {\n const parsed: ParsedField<T>[] = fields.map(parse)\n return (a, b) => {\n for (const field of parsed) {\n let av: unknown = a[field.name]\n let bv: unknown = b[field.name]\n if (av === undefined || bv === undefined) continue\n if (field.len) {\n av = typeof av === \"string\" || Array.isArray(av) ? av.length : 0\n bv = typeof bv === \"string\" || Array.isArray(bv) ? bv.length : 0\n }\n if (av === bv) continue\n if (typeof av === \"boolean\" && typeof bv === \"boolean\") {\n av = av ? 0 : 1\n bv = bv ? 0 : 1\n }\n return compare(av, bv) * (field.desc ? -1 : 1)\n }\n return 0\n }\n}\n\nfunction compare(a: unknown, b: unknown): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b\n if (typeof a === \"string\" && typeof b === \"string\") return a.localeCompare(b)\n return String(a).localeCompare(String(b))\n}\n","// oxlint-disable no-await-in-loop\nimport type { MaybePromise } from \"@zaly/shared\"\nimport type { MatcherOptions, ScoredItem, SearchItem } from \"./matcher.ts\"\nimport type { Sorter, SortField } from \"./sort.ts\"\n\nimport { TopK } from \"@zaly/shared/minheap\"\nimport { Matcher } from \"./matcher.ts\"\nimport { sorter } from \"./sort.ts\"\n\nexport type SearchOptions<T extends SearchItem = SearchItem> = MatcherOptions & {\n sort?: boolean | readonly SortField<T>[]\n filter?: boolean\n sortEmpty?: boolean\n frecency?: () => (file: string) => number\n limit?: number\n throttle?: number\n}\n\nexport type SearchFn<T extends SearchItem = SearchItem> = (\n query: string,\n match: Match<T>\n) => MaybePromise<ScoredItem<T>[]>\n\nexport type SearchItems<T extends SearchItem = SearchItem> = readonly T[] | SearchFn<T>\n\n/** Match function handed to `complete`. Returns `0` for no match,\n * positive integer otherwise — so both `match(s) > 0` and the\n * idiomatic `.filter(match(s))` work (0 is falsy). The magnitude is a\n * score the source can use to rank its own candidates when it cares\n * about order. */\nexport type Match<T extends SearchItem = SearchItem> = (s: string | T) => number\n\nconst BONUS_FRECENCY = 8\nconst SEARCH_LIMIT = 1000\nconst aborted = Symbol(\"search.aborted\")\n\nexport class Searcher<T extends SearchItem = SearchItem> {\n #opts: SearchOptions<T>\n #sorter?: Sorter<T>\n #matcher: Matcher<T>\n #ac?: AbortController\n\n constructor(opts: SearchOptions<T>) {\n this.#opts = opts\n const sortOpts = opts.sort === true ? undefined : opts.sort\n this.#sorter = sortOpts === false ? undefined : sorter(sortOpts)\n this.#matcher = new Matcher(opts)\n }\n\n /** Create a match function bound to the current pattern. If the\n * matcher has been updated since the search started, match will\n * return `0` to indicate no match, to prevent stale results */\n createMatch(opts: { signal: AbortSignal }): Match<T> {\n const m = this.#matcher\n return (s: string | T) => (opts.signal.aborted ? 0 : m.match(s))\n }\n\n async search(\n items: SearchItems<T>,\n query = \"\",\n opts: { progress?: (results: ScoredItem<T>[]) => MaybePromise } = {}\n ): Promise<ScoredItem<T>[]> {\n try {\n return await this.#search(items, query, opts)\n } catch (error) {\n if (error === aborted) return []\n throw error\n }\n }\n\n get limit(): number {\n return this.#opts.limit ?? (this.#sorter ? SEARCH_LIMIT : Infinity)\n }\n\n async #search(\n items: SearchItems<T>,\n query = \"\",\n opts: { progress?: (results: ScoredItem<T>[]) => MaybePromise } = {}\n ): Promise<ScoredItem<T>[]> {\n this.#ac?.abort(aborted)\n // oxlint-disable-next-line no-multi-assign\n const ac = (this.#ac = new AbortController())\n\n const m = this.#matcher\n m.init(query)\n const f = this.#opts.frecency?.()\n const s = this.#sorter\n const limit = this.limit\n const ret: ScoredItem<T>[] = []\n let match = (item: T) => this.#matcher.update(item)\n const topk =\n s && (this.#opts.sortEmpty || !m.empty())\n ? new TopK<ScoredItem<T>>(limit, (a, b) => -s(a, b))\n : undefined\n\n if (typeof items === \"function\") {\n match = (item: T) => item as ScoredItem<T>\n items = await items(query, this.createMatch({ signal: ac.signal }))\n ac.signal.throwIfAborted()\n }\n\n if (items.length === 0) return []\n\n const results = () => topk?.sorted() ?? ret\n\n // Process items in three phases, so that the results in the UI stabilize faster:\n // - previous topk results (topk)\n // - scored items (score)\n // - unscored items (rest)\n const todo: [T[], T[], T[]] = [[], [], []]\n let idx = 0\n if (!topk) todo[0] = items as T[]\n else {\n for (const item of items) {\n item.idx = idx++\n const it = item as ScoredItem<T>\n if (it.topk) todo[0].push(item)\n else if (it.score) todo[1].push(item)\n else todo[2].push(item)\n }\n }\n\n const doFilter = !m.empty() && (this.#opts.filter ?? true)\n\n let lastYield = performance.now()\n let dirty = false\n let count = 0\n\n loop: for (const todos of todo) {\n for (const item of todos) {\n ac.signal.throwIfAborted()\n if (count++ % 256 === 0) {\n const now = performance.now()\n if (now - lastYield >= (this.#opts.throttle ?? 16)) {\n lastYield = now\n await new Promise((r) => setImmediate(r))\n if (opts.progress && dirty) {\n dirty = false\n await opts.progress(results())\n }\n }\n }\n const si = match(item)\n if (si.file && si.score && f) {\n const frecency = f(si.file)\n si.score += (1 - 1 / (1 + frecency)) * BONUS_FRECENCY\n }\n if (doFilter && si.score === 0) continue\n if (topk) {\n si.topk = false\n const ta = topk.add(si)\n if (ta.added) {\n si.topk = true\n dirty = true\n if (ta.evicted) ta.evicted.topk = false\n }\n } else {\n ret.push(si)\n dirty = true\n if (ret.length >= limit) break loop\n }\n }\n }\n\n return results()\n }\n\n positions(s: string | T): number[] {\n return this.#matcher.positions(s)\n }\n}\n","import type { Reactive, Ref } from \"../core/reactive.ts\"\nimport type { State } from \"../core/state.ts\"\nimport type { NodeActionMap } from \"../input/actions.ts\"\nimport type { ScoredItem, SearchItem } from \"../search/matcher.ts\"\nimport type { SearchItems, SearchOptions } from \"../search/search.ts\"\nimport type { Option, Select, SelectState } from \"./select.ts\"\nimport type { TreeItem, TreeProps } from \"./tree.ts\"\n\nimport { sliceAnsi, stripAnsi } from \"@zaly/shared/ansi\"\nimport { createProgressive, effect, memo, untrack, unwrap } from \"../core/reactive.ts\"\nimport { Searcher } from \"../search/search.ts\"\nimport { Input } from \"./input.ts\"\nimport { select } from \"./select.ts\"\nimport { tree } from \"./tree.ts\"\nimport { widget } from \"./widget.ts\"\n\nexport type PickerItem = Option & SearchItem\nexport type PickerActions = keyof ReturnType<typeof picker>[\"actions\"]\n\ntype PickerBaseProps<T extends PickerItem = PickerItem> = SearchOptions<T> & {\n /** The `Input` to watch. Pass the node directly, or a `Ref<Input>`\n * populated by `node.ref(ref)` elsewhere in the tree — the latter\n * enables fully inline composition where the input doesn't need a\n * local binding. The ref is dereferenced on mount, so wiring is\n * type-safe and ordering-flexible (autocomplete can be constructed\n * before the Input is). */\n input?: Input | Ref<Input>\n pattern?: Reactive<string>\n reverse?: boolean\n actions?: NodeActionMap<Select<T>>\n}\n\nexport type PickerSelectProps<T extends PickerItem = PickerItem> = PickerBaseProps<T> &\n Omit<SelectState<T>, \"items\"> & {\n items: Reactive<SearchItems<T>>\n tree?: never\n }\n\nexport type PickerTreeProps<T extends TreeItem = TreeItem> = PickerBaseProps<T> &\n TreeProps<T> & {\n items?: never\n }\n\nfunction isTree<T extends Option = Option>(\n props: PickerTreeProps<T> | PickerSelectProps<T>\n): props is PickerTreeProps<T> {\n return \"tree\" in props\n}\n\nexport const picker = widget(\n <T extends PickerItem = PickerItem>(props: State<PickerSelectProps<T> | PickerTreeProps<T>>) => {\n const pattern = memo(() => {\n if (props.pattern !== undefined) return unwrap(props.pattern)\n const inp = props.input instanceof Input ? props.input : props.input?.()\n return inp?.state.value ?? \"\"\n })\n\n let node: Select<T>\n let items: Reactive<SearchItems<T>>\n if (isTree(props)) {\n props = { filter: false, fuzzy: false, sort: false, ...props }\n const t = tree(props)\n node = t\n items = t.items\n } else {\n node = select({ ...props, items: [] })\n items = props.items\n }\n const searcher = new Searcher<T>(props)\n\n node.extendRenderer((prev) => (item, ctx) => {\n let row = prev(item, ctx)\n if (!item.score) return row\n const stripped = stripAnsi(row)\n const positions = searcher.positions(stripped).toSorted((a, b) => b - a)\n while (positions.length > 0) {\n const from = positions.pop()!\n let to = from\n while (positions.length && positions.at(-1) === to + 1) to = positions.pop()!\n row =\n sliceAnsi(row, 0, from) +\n ctx.style.accent(stripped.slice(from, to + 1)) +\n sliceAnsi(row, to + 1)\n }\n return row\n })\n\n const results = createProgressive<ScoredItem<T>[]>(\n async ({ set }) =>\n await searcher.search(unwrap(items), pattern(), { progress: (r) => set(r) }),\n {\n initialValue: [],\n }\n )\n node.state.items = results\n if (props.input) node.bind(props.input)\n\n const matches = () =>\n unwrap(node.state.items)\n .map((item, i) => [item, i] as const)\n .filter(([item]) => item.score)\n .map(([, i]) => i)\n\n effect(() => {\n const m = matches()\n node.state.more = m.length >= searcher.limit\n if (m.length === 0 || pattern() === \"\") return\n untrack(() => {\n // When filtering, go to the first (best) match.\n // When not filtering, go to the first match that is at or after the current active index, or the first match if none are after.\n if (props.filter === false) {\n const active = node.active\n node.active = m.find((i) => i >= active) ?? m[0]\n } else node.active = 0\n })\n })\n\n return node.withActions({\n ...props.actions,\n \"picker.next\": () => {\n const active = node.active\n const m = matches()\n if (m.length === 0) return node.action(\"select.next\")\n node.active = node.state.reverse\n ? (m.toReversed().find((i) => i < active) ?? m.at(-1)!)\n : (m.find((i) => i > active) ?? m[0])\n },\n \"picker.prev\": () => {\n const active = node.active\n const m = matches()\n if (m.length === 0) return node.action(\"select.prev\")\n node.active = node.state.reverse\n ? (m.find((i) => i > active) ?? m[0])\n : (m.toReversed().find((i) => i < active) ?? m.at(-1)!)\n },\n })\n }\n)\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as Color, f as Style, t as Theme } from "./types-
|
|
2
|
-
import { a as StyleBuilder, t as InspectOpts } from "./inspect-
|
|
1
|
+
import { c as Color, f as Style, o as AnyStyle, t as Theme } from "./types-D2EYlzmK.mjs";
|
|
2
|
+
import { a as StyleBuilder, t as InspectOpts } from "./inspect-CfNydMgO.mjs";
|
|
3
3
|
import { Emitter, MaybePromise } from "@zaly/shared";
|
|
4
4
|
import { LogEntry, LogLevel, LogReporter, Logger, TryResult } from "@zaly/shared/logger";
|
|
5
5
|
import { ArgsOpts, ArgsResult } from "@zaly/shared/args";
|
|
@@ -771,7 +771,7 @@ type State<T extends object = object> = T & BaseState;
|
|
|
771
771
|
* interfaces extend this so base-state concerns and pure styling stay
|
|
772
772
|
* cleanly separated at the type level without each widget having to
|
|
773
773
|
* compose the two manually. */
|
|
774
|
-
type StyleState = Style
|
|
774
|
+
type StyleState = Style<false>;
|
|
775
775
|
interface LayoutState {
|
|
776
776
|
visible?: Reactive<boolean>;
|
|
777
777
|
}
|
|
@@ -843,7 +843,7 @@ type TitleAlign = "left" | "center" | "right";
|
|
|
843
843
|
* ```
|
|
844
844
|
*/
|
|
845
845
|
type TextContent = Reactive<string> | ((ctx: RenderCtx) => MaybePromise<Reactive<string>>);
|
|
846
|
-
interface TextStyle extends Style {
|
|
846
|
+
interface TextStyle extends Style<false> {
|
|
847
847
|
content: TextContent;
|
|
848
848
|
wrap?: "word" | "char" | "none";
|
|
849
849
|
}
|
|
@@ -895,12 +895,12 @@ interface BoxStyle extends Style {
|
|
|
895
895
|
* via the active theme) or an inline `Style`. Defaults to the `"border"`
|
|
896
896
|
* theme slot when a border is drawn.
|
|
897
897
|
*/
|
|
898
|
-
borderStyle?:
|
|
898
|
+
borderStyle?: AnyStyle;
|
|
899
899
|
/**
|
|
900
900
|
* Style applied to the border title. Defaults to the `"borderTitle"` theme
|
|
901
901
|
* slot when a title is set.
|
|
902
902
|
*/
|
|
903
|
-
borderTitleStyle?:
|
|
903
|
+
borderTitleStyle?: AnyStyle;
|
|
904
904
|
}
|
|
905
905
|
declare class Box<T extends object = {}> extends Node<BoxStyle & T> {
|
|
906
906
|
#private;
|
|
@@ -1048,11 +1048,11 @@ interface LogState {
|
|
|
1048
1048
|
/** Single-glyph icon for `icon` / `prompt` styles. */
|
|
1049
1049
|
icon?: string;
|
|
1050
1050
|
/** Theme slot or color name used to tint the prefix. */
|
|
1051
|
-
color?: Color
|
|
1051
|
+
color?: Color<false>;
|
|
1052
1052
|
/** Extra plain text prepended to the auto prefix (unstyled). */
|
|
1053
1053
|
prefix?: string;
|
|
1054
1054
|
/** Theme slot or color name for the body text. Defaults by level, except */
|
|
1055
|
-
textColor?: Color
|
|
1055
|
+
textColor?: Color<false>;
|
|
1056
1056
|
markdown?: boolean;
|
|
1057
1057
|
}
|
|
1058
1058
|
/**
|
|
@@ -1221,6 +1221,8 @@ type LineSlice = {
|
|
|
1221
1221
|
declare class Frame {
|
|
1222
1222
|
#private;
|
|
1223
1223
|
readonly terminal: Terminal;
|
|
1224
|
+
get defaultStyle(): string;
|
|
1225
|
+
setDefaultStyle(fg: string, bg: string): void;
|
|
1224
1226
|
constructor(terminal: Terminal);
|
|
1225
1227
|
reset(rows?: number): void;
|
|
1226
1228
|
begin(): RenderFrame;
|
|
@@ -1231,7 +1233,14 @@ declare class RenderFrame {
|
|
|
1231
1233
|
readonly terminal: Terminal;
|
|
1232
1234
|
readonly current: (string | undefined)[];
|
|
1233
1235
|
readonly base: (string | undefined)[];
|
|
1234
|
-
|
|
1236
|
+
readonly defaults: {
|
|
1237
|
+
bg: string;
|
|
1238
|
+
fg: string;
|
|
1239
|
+
};
|
|
1240
|
+
constructor(terminal: Terminal, current: (string | undefined)[], base: (string | undefined)[], defaults?: {
|
|
1241
|
+
bg: string;
|
|
1242
|
+
fg: string;
|
|
1243
|
+
});
|
|
1235
1244
|
get(row: number): string;
|
|
1236
1245
|
set(row: number, content: string): void;
|
|
1237
1246
|
clear(row: number): void;
|
|
@@ -1568,6 +1577,9 @@ interface RendererOptions {
|
|
|
1568
1577
|
stdout?: TerminalWriter;
|
|
1569
1578
|
images?: Reactive<boolean>;
|
|
1570
1579
|
theme?: Theme;
|
|
1580
|
+
transparent?: Reactive<boolean>;
|
|
1581
|
+
/** Base colors for painted rows and cleared cells, resolved against the theme. */
|
|
1582
|
+
defaultStyle?: Pick<Style, "fg" | "bg">;
|
|
1571
1583
|
/** Baseline footer height in rows — the size the footer occupies in
|
|
1572
1584
|
* "steady state" (no autocomplete, no transient widget growth).
|
|
1573
1585
|
* Stream uses `terminal.rows - fixedFooterHeight` as its commit
|
|
@@ -1673,6 +1685,10 @@ declare class Renderer extends Emitter<RenderEvents> {
|
|
|
1673
1685
|
set theme(theme: Theme);
|
|
1674
1686
|
/** Get the current theme. (tracked) */
|
|
1675
1687
|
get theme(): Theme;
|
|
1688
|
+
/** Inherit the terminal background instead of painting the base background. */
|
|
1689
|
+
set transparent(transparent: boolean);
|
|
1690
|
+
/** Current transparency setting. (tracked) */
|
|
1691
|
+
get transparent(): boolean;
|
|
1676
1692
|
start(): void;
|
|
1677
1693
|
stop(): void;
|
|
1678
1694
|
/** Look up a node by its `id`. Returns `undefined` if nothing matches. */
|
|
@@ -1960,4 +1976,4 @@ declare class TerminalQueries {
|
|
|
1960
1976
|
declare function parseAttrs(params: string): number[];
|
|
1961
1977
|
//#endregion
|
|
1962
1978
|
export { Context as $, LogState as A, useContext as At, Padding as B, Actions as Bt, OverlaySurface as C, peek as Ct, LoggerStream as D, untrack as Dt, LogStyleOverride as E, toAccessor as Et, Overlay as F, ActionCtx as Ft, text as G, KeyModifier as Gt, Text as H, NodeAction as Ht, OverlayState as I, ActionDef as It, Layout as J, SpecialKeyName as Jt, textContent as K, KeyPattern as Kt, overlay as L, ActionFilter as Lt, log as M, withOwner as Mt, MountCtx as N, Size as Nt, TuiReporter as O, unwrap as Ot, RenderCtx as P, Action as Pt, Accessor as Q, Box as R, ActionFn as Rt, Stream as S, onCleanup as St, LogEntryFactory as T, signal as Tt, TextContent as U, NodeActionMap as Ut, box as V, KeyBinding as Vt, TextStyle as W, KeyEvent as Wt, State as X, isKeyPattern as Xt, LayoutState as Y, canonical as Yt, StyleState as Z, keyMatches as Zt, RenderStats as _, createSuspenseBoundary as _t, InputRouter as a, Signal as at, SurfaceType as b, isAccessor as bt, KeyPatterns as c, SuspenseContext as ct, RoutedPaste as d, createIterable as dt, Owner as et, BaseEvents as f, createNode as ft, RenderEvents as g, createStore as gt, NodeVisitor as h, createRoot as ht, parseAttrs as i, Setter as it, LogStyle as j, withActiveNode as jt, TuiReporterOpts as k, useActiveOwner as kt, KeymapEntry as l, createAsync as lt, isNode as m, createRef as mt, TerminalQuery as n, Reactive as nt, InputRouterEvents as o, SignalStore as ot, Node as p, createProgressive as pt, FlexState as q, KeyPatternError as qt, TerminalQueryOpts as r, Ref as rt, KeyHandler as s, SuspenseBoundary as st, TerminalQueries as t, Progressive as tt, RoutedKey as u, createContext as ut, Renderer as v, effect as vt, Terminal as w, provideContext as wt, UI as x, memo as xt, RendererOptions as y, inRenderContextOf as yt, BoxStyle as z, ActionMap as zt };
|
|
1963
|
-
//# sourceMappingURL=queries-
|
|
1979
|
+
//# sourceMappingURL=queries-BDX8mcl5.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries-BDX8mcl5.d.mts","names":["_$___core_state_ts0.Layout","_$__box_ts0.Box","_$__terminal_ts0.Terminal"],"sources":["../src/input/keys.ts","../src/input/decoder.ts","../src/input/actions.ts","../src/layout/size.ts","../src/core/reactive.ts","../src/core/state.ts","../src/layout/border.ts","../src/widgets/text.ts","../src/widgets/box.ts","../src/widgets/overlay.ts","../src/core/ctx.ts","../src/widgets/log.ts","../src/services/logger.ts","../src/renderer/terminal.ts","../src/renderer/frame.ts","../src/renderer/surface.ts","../src/renderer/overlay.ts","../src/renderer/selection.ts","../src/renderer/stream.ts","../src/renderer/ui.ts","../src/renderer/renderer.ts","../src/core/node.ts","../src/input/router.ts","../src/input/queries.ts"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { basename } from "pathe";
|
|
|
5
5
|
//#region assets/themes/tokyonight-moon.json
|
|
6
6
|
var tokyonight_moon_default = {
|
|
7
7
|
accent: "#ff966c",
|
|
8
|
-
|
|
8
|
+
bg: "#222436",
|
|
9
9
|
border: "#589ed7",
|
|
10
10
|
borderTitle: {
|
|
11
11
|
"bold": true,
|
|
@@ -22,6 +22,7 @@ var tokyonight_moon_default = {
|
|
|
22
22
|
diffDel: { "bg": "#4b2a3d" },
|
|
23
23
|
divider: "#589ed7",
|
|
24
24
|
error: "#c53b53",
|
|
25
|
+
fg: "#c8d3f5",
|
|
25
26
|
gutter: "#3b4261",
|
|
26
27
|
highlight: {
|
|
27
28
|
"bg": "#2f334d",
|
|
@@ -102,7 +103,6 @@ var tokyonight_moon_default = {
|
|
|
102
103
|
},
|
|
103
104
|
selection: { "bg": "#2d3f76" },
|
|
104
105
|
shiki: "tokyo-night",
|
|
105
|
-
subtle: "#1e2030",
|
|
106
106
|
success: "#4fd6be",
|
|
107
107
|
syntaxBoolean: { "fg": "#65bcff" },
|
|
108
108
|
syntaxBracket: { "fg": "#828bb8" },
|
|
@@ -113,13 +113,12 @@ var tokyonight_moon_default = {
|
|
|
113
113
|
syntaxNumber: { "fg": "#ff966c" },
|
|
114
114
|
syntaxSpecial: { "fg": "#65bcff" },
|
|
115
115
|
syntaxString: { "fg": "#c3e88d" },
|
|
116
|
-
text: "#c8d3f5",
|
|
117
116
|
title: {
|
|
118
117
|
"bold": true,
|
|
119
118
|
"fg": "#82aaff"
|
|
120
119
|
},
|
|
121
120
|
ui: {
|
|
122
|
-
"bg": "#
|
|
121
|
+
"bg": "#1e2030",
|
|
123
122
|
"fg": "#c8d3f5"
|
|
124
123
|
},
|
|
125
124
|
warn: "#ffc777"
|
|
@@ -190,7 +189,8 @@ const builtin = {
|
|
|
190
189
|
const defaults = {
|
|
191
190
|
primary: "blue",
|
|
192
191
|
accent: "brightMagenta",
|
|
193
|
-
|
|
192
|
+
bg: "inherit",
|
|
193
|
+
fg: "inherit",
|
|
194
194
|
muted: { dim: true },
|
|
195
195
|
quiet: {
|
|
196
196
|
dim: true,
|
|
@@ -206,20 +206,19 @@ const defaults = {
|
|
|
206
206
|
fg: "primary"
|
|
207
207
|
},
|
|
208
208
|
delim: "muted",
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
divider: "subtle",
|
|
209
|
+
ui: { bg: "bg+5" },
|
|
210
|
+
overlay: { bg: "ui" },
|
|
211
|
+
highlight: { bg: "bg+5" },
|
|
212
|
+
divider: "bg-5",
|
|
214
213
|
selection: {
|
|
215
214
|
bg: "brightBlue",
|
|
216
215
|
fg: "black"
|
|
217
216
|
},
|
|
218
|
-
gutter: "
|
|
217
|
+
gutter: "bg-5",
|
|
219
218
|
prompt: "inherit",
|
|
220
219
|
border: "black",
|
|
221
220
|
borderTitle: "title",
|
|
222
|
-
code: { bg: "
|
|
221
|
+
code: { bg: "bg+5" },
|
|
223
222
|
codeTitle: "title",
|
|
224
223
|
success: "green",
|
|
225
224
|
info: "cyan",
|
|
@@ -236,13 +235,10 @@ const defaults = {
|
|
|
236
235
|
syntaxBracket: "delim",
|
|
237
236
|
mdBold: { bold: true },
|
|
238
237
|
mdCode: {
|
|
239
|
-
bg: "primary+10",
|
|
240
|
-
fg: "black"
|
|
241
|
-
},
|
|
242
|
-
mdCodeBlock: {
|
|
243
238
|
bg: "highlight",
|
|
244
239
|
fg: "primary"
|
|
245
240
|
},
|
|
241
|
+
mdCodeBlock: "code",
|
|
246
242
|
mdCodeBlockTitle: "title",
|
|
247
243
|
mdHeading1: "mdHeading",
|
|
248
244
|
mdHeading2: {
|
|
@@ -274,7 +270,7 @@ const defaults = {
|
|
|
274
270
|
bg: "success-50",
|
|
275
271
|
fg: "success"
|
|
276
272
|
},
|
|
277
|
-
diffContext: "
|
|
273
|
+
diffContext: "highlight",
|
|
278
274
|
diffDel: {
|
|
279
275
|
bg: "error-50",
|
|
280
276
|
fg: "error"
|
|
@@ -286,7 +282,6 @@ const ansi = {
|
|
|
286
282
|
id: "ansi",
|
|
287
283
|
name: "ANSI",
|
|
288
284
|
...defaults,
|
|
289
|
-
subtle: "inherit",
|
|
290
285
|
divider: "brightBlue",
|
|
291
286
|
border: "brightBlue",
|
|
292
287
|
highlight: { bg: "brightBlack" },
|
|
@@ -343,7 +338,7 @@ function resolveTheme(theme, id) {
|
|
|
343
338
|
async function loadThemeFile(path) {
|
|
344
339
|
const raw = withError(() => readFileSync(path, "utf8"), `Failed to read theme file at ${path}`);
|
|
345
340
|
const data = withError(() => JSON.parse(raw), `Failed to parse theme JSON at ${path}`);
|
|
346
|
-
const { validateTheme } = await import("./theme.config-
|
|
341
|
+
const { validateTheme } = await import("./theme.config-B3Yx--C2.mjs");
|
|
347
342
|
return resolveTheme(validateTheme(data), basename(path, ".json"));
|
|
348
343
|
}
|
|
349
344
|
/** TokyoNight Moon — the default. Sourced from `assets/themes/tokyonight-moon.json`. */
|
|
@@ -351,4 +346,4 @@ const defaultTheme = resolveTheme(tokyonight_moon_default, "tokyonight-moon");
|
|
|
351
346
|
//#endregion
|
|
352
347
|
export { loadTheme as n, themeRegistry as r, defaultTheme as t };
|
|
353
348
|
|
|
354
|
-
//# sourceMappingURL=registry-
|
|
349
|
+
//# sourceMappingURL=registry-D-suU3g0.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-D-suU3g0.mjs","names":["moonJson"],"sources":["../assets/themes/tokyonight-moon.json","../src/themes/builtin.ts","../src/themes/default.ts","../src/themes/registry.ts"],"sourcesContent":["","// AUTO-GENERATED by `scripts/gen-themes.ts`. DO NOT EDIT.\n// Re-run `bun scripts/gen-themes.ts` after adding/renaming a theme.\n\nimport type { ThemeLoader } from \"./registry.ts\"\nimport type { Theme } from \"./types.ts\"\n\nconst importTheme = (path: string): Promise<Partial<Theme>> =>\n import(`#assets/themes/${path}.json`, { with: { type: \"json\" } }).then(\n (m) => m.default as Partial<Theme>\n )\n\n/**\n * Async loader map for every built-in theme. Each entry returns the\n * raw JSON; `themes/index.ts` wraps these with `resolveTheme` to\n * produce a fully-resolved `Theme` from the registry. Bundlers\n * code-split each `import(\"…json\")` into its own chunk, so apps only\n * pull the theme they actually load.\n *\n * `as const satisfies Record<string, ThemeLoader>` keeps the keys\n * narrow (so `BuiltinThemeName` is a literal union) but lets the\n * value type widen to `Partial<Theme>` — themes have no per-key\n * narrow types worth preserving, and the satisfies clause means\n * `themes/index.ts` can pass this map straight to `themeRegistry`\n * with no cast.\n */\nexport const builtin = {\n \"ayu-dark\": () => importTheme(\"ayu-dark\"),\n \"catppuccin-frappe\": () => importTheme(\"catppuccin-frappe\"),\n \"catppuccin-latte\": () => importTheme(\"catppuccin-latte\"),\n \"catppuccin-macchiato\": () => importTheme(\"catppuccin-macchiato\"),\n \"catppuccin-mocha\": () => importTheme(\"catppuccin-mocha\"),\n dracula: () => importTheme(\"dracula\"),\n \"dracula-soft\": () => importTheme(\"dracula-soft\"),\n \"everforest-dark\": () => importTheme(\"everforest-dark\"),\n \"everforest-light\": () => importTheme(\"everforest-light\"),\n \"github-dark\": () => importTheme(\"github-dark\"),\n \"github-light\": () => importTheme(\"github-light\"),\n \"gruvbox-dark-medium\": () => importTheme(\"gruvbox-dark-medium\"),\n \"kanagawa-dragon\": () => importTheme(\"kanagawa-dragon\"),\n \"kanagawa-wave\": () => importTheme(\"kanagawa-wave\"),\n \"material-theme-palenight\": () => importTheme(\"material-theme-palenight\"),\n \"min-dark\": () => importTheme(\"min-dark\"),\n \"min-light\": () => importTheme(\"min-light\"),\n monokai: () => importTheme(\"monokai\"),\n \"night-owl\": () => importTheme(\"night-owl\"),\n nord: () => importTheme(\"nord\"),\n \"one-dark-pro\": () => importTheme(\"one-dark-pro\"),\n \"one-light\": () => importTheme(\"one-light\"),\n poimandres: () => importTheme(\"poimandres\"),\n \"rose-pine\": () => importTheme(\"rose-pine\"),\n \"solarized-dark\": () => importTheme(\"solarized-dark\"),\n \"solarized-light\": () => importTheme(\"solarized-light\"),\n \"synthwave-84\": () => importTheme(\"synthwave-84\"),\n \"tokyonight-day\": () => importTheme(\"tokyonight-day\"),\n \"tokyonight-moon\": () => importTheme(\"tokyonight-moon\"),\n \"tokyonight-night\": () => importTheme(\"tokyonight-night\"),\n \"tokyonight-storm\": () => importTheme(\"tokyonight-storm\"),\n vesper: () => importTheme(\"vesper\"),\n \"vitesse-dark\": () => importTheme(\"vitesse-dark\"),\n \"vitesse-light\": () => importTheme(\"vitesse-light\"),\n} as const satisfies Record<string, ThemeLoader>\n","import type { Theme } from \"./types.ts\"\n\n/**\n * Slot-level fallbacks. Every Theme value is shallow-merged on top of\n * this record by `resolveTheme`, so partial JSON themes only need to\n * declare slots that diverge from these defaults.\n *\n * Distinct from `defaultTheme` — that's the precomputed `tokyonight-moon`\n * Theme bundled as the default palette for `createCtx()` etc.\n */\n// oxlint-disable-next-line sort-keys\nexport const defaults: Omit<Theme, \"id\"> = {\n // base colors\n primary: \"blue\",\n accent: \"brightMagenta\",\n\n bg: \"inherit\",\n fg: \"inherit\",\n\n // text\n muted: { dim: true },\n quiet: { dim: true, fg: \"muted\", italic: true },\n comment: { fg: \"muted\", italic: true },\n title: { bold: true, fg: \"primary\" },\n delim: \"muted\",\n\n // surface & structure\n ui: { bg: \"bg+5\" },\n overlay: { bg: \"ui\" },\n highlight: { bg: \"bg+5\" },\n\n // ui primitives\n divider: \"bg-5\",\n selection: { bg: \"brightBlue\", fg: \"black\" },\n gutter: \"bg-5\",\n prompt: \"inherit\",\n border: \"black\",\n borderTitle: \"title\",\n\n // code\n code: { bg: \"bg+5\" },\n codeTitle: \"title\",\n\n // log levels\n success: \"green\",\n info: \"cyan\",\n warn: \"yellow\",\n error: \"red\",\n\n // syntax\n syntaxNumber: \"brightBlue\",\n syntaxString: \"green\",\n syntaxBoolean: \"yellow\",\n syntaxFunction: \"blue\",\n syntaxField: \"white\",\n syntaxConstant: \"magenta\",\n syntaxSpecial: \"red\",\n syntaxDelimiter: \"delim\",\n syntaxBracket: \"delim\",\n\n // markdown\n mdBold: { bold: true },\n mdCode: { bg: \"highlight\", fg: \"primary\" },\n mdCodeBlock: \"code\",\n mdCodeBlockTitle: \"title\",\n mdHeading1: \"mdHeading\",\n mdHeading2: { bold: true, fg: \"accent\" },\n mdHeading3: \"mdHeading2\",\n mdHeading4: \"mdHeading2\",\n mdHeading5: \"mdHeading2\",\n mdHeading6: \"mdHeading2\",\n mdHeading: \"title\",\n mdHr: \"accent\",\n mdItalic: { italic: true },\n mdLink: { fg: \"primary\", underline: true },\n mdListBullet: \"accent\",\n mdListChecked: \"primary\",\n mdListUnchecked: \"primary\",\n mdQuote: \"muted\",\n mdStrikethrough: { strikethrough: true },\n mdTable: \"accent\",\n mdTableHeader: \"title\",\n\n // menu\n optionActive: \"selection\",\n optionDesc: \"muted\",\n optionName: \"primary\",\n\n // diff\n diffAdd: { bg: \"success-50\", fg: \"success\" },\n diffContext: \"highlight\",\n diffDel: { bg: \"error-50\", fg: \"error\" },\n diffLine: \"gutter\",\n diffTitle: \"title\",\n}\n\n// oxlint-disable-next-line sort-keys\nexport const ansi: Theme = {\n id: \"ansi\",\n name: \"ANSI\",\n ...defaults,\n divider: \"brightBlue\",\n border: \"brightBlue\",\n highlight: { bg: \"brightBlack\" },\n ui: { bg: \"brightBlack\" },\n selection: { inverse: true },\n diffAdd: { fg: \"success\" },\n diffDel: { fg: \"error\" },\n}\n","import type { Theme } from \"./types.ts\"\n\nimport { withError } from \"@zaly/shared\"\nimport { createRegistry } from \"@zaly/shared/registry\"\nimport { readFileSync } from \"node:fs\"\nimport { basename } from \"pathe\"\nimport moonJson from \"../../assets/themes/tokyonight-moon.json\" with { type: \"json\" }\nimport { builtin } from \"./builtin.ts\"\nimport { defaults, ansi } from \"./default.ts\"\n\n/** Built-in theme names plus the synthetic `\"ansi\"` palette (no JSON\n * — falls back to `defaults` only). */\nexport type BuiltinTheme = keyof typeof builtin | \"ansi\"\nexport type AnyTheme = BuiltinTheme | (string & {})\nexport type ThemeLoader = () => Promise<Partial<Theme>>\n\nconst DEFAULT_THEME: BuiltinTheme = \"tokyonight-moon\"\n\n/**\n * Registry of built-in themes plus any registered at runtime. The\n * registry never awaits — loaders return `Promise<Partial<Theme>>` so\n * callers `await` explicitly.\n */\nexport const themeRegistry = createRegistry<ThemeLoader>(\"theme\").from(builtin)\n// NOTE: remove the ansi theme for now, since it looks kinda broken and not really possible\n// to fix properly\nthemeRegistry.register(\"ansi\", async () => ({ ...ansi }))\n\n/**\n * Load a theme by name or path.\n */\nexport async function loadTheme(name?: string): Promise<Theme>\nexport async function loadTheme(opts: { name?: string; path?: string }): Promise<Theme>\nexport async function loadTheme(o?: string | { name?: string; path?: string }): Promise<Theme> {\n o ??= DEFAULT_THEME\n const opts = typeof o === \"string\" ? { name: o } : o\n\n if (opts.name?.endsWith(\".json\")) return loadTheme({ path: opts.name })\n if (opts.path) return loadThemeFile(opts.path)\n if (opts.name) {\n if (opts.name === DEFAULT_THEME) return defaultTheme\n if (themeRegistry.has(opts.name))\n return resolveTheme(await themeRegistry.load(opts.name), opts.name)\n throw new Error(`Theme \"${opts.name}\" not found.`)\n }\n\n return defaultTheme\n}\n\n/**\n * Fill defaults on a raw theme object. Built-in JSON is dev-controlled\n * so we don't pay typia's ~3MB of generated assertions at startup;\n * user-supplied JSON goes through `loadThemeFile` which validates.\n */\nfunction resolveTheme(theme: unknown, id: string): Theme {\n const { $schema: _, ...rest } = theme as Partial<Theme> & { $schema?: unknown }\n return { ...defaults, id, name: id, ...rest }\n}\n\n/**\n * Load a theme directly from a file path. No directory search happens —\n * this is the escape hatch for CLIs that accept an explicit `--theme\n * /path/to/theme.json` argument.\n *\n * Async because typia's generated `validateTheme` (a few thousand\n * unrolled assertions) is dynamically imported here — it's only needed\n * for user-supplied JSON and should stay off the main startup path.\n */\nasync function loadThemeFile(path: string): Promise<Theme> {\n const raw = withError(() => readFileSync(path, \"utf8\"), `Failed to read theme file at ${path}`)\n const data = withError(() => JSON.parse(raw), `Failed to parse theme JSON at ${path}`)\n const { validateTheme } = await import(\"../schemas/gen/theme.config.ts\")\n return resolveTheme(validateTheme(data), basename(path, \".json\"))\n}\n\n/** TokyoNight Moon — the default. Sourced from `assets/themes/tokyonight-moon.json`. */\nexport const defaultTheme = resolveTheme(moonJson, \"tokyonight-moon\")\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { d as createSuspenseBoundary, i as createContext, l as createRoot, n as SuspenseContext, v as provideContext } from "./reactive-f7NpAi69.mjs";
|
|
2
|
-
import { t as createCtx } from "./ctx-
|
|
2
|
+
import { t as createCtx } from "./ctx-B7BmPUCD.mjs";
|
|
3
3
|
//#region src/core/render.ts
|
|
4
4
|
const RenderContext = createContext();
|
|
5
5
|
async function createRender(node, ctx = createCtx()) {
|
|
@@ -30,4 +30,4 @@ async function renderWithDrain(node, boundary, ctx) {
|
|
|
30
30
|
//#endregion
|
|
31
31
|
export { createRender as n, RenderContext as t };
|
|
32
32
|
|
|
33
|
-
//# sourceMappingURL=render-
|
|
33
|
+
//# sourceMappingURL=render-DEIUNLkh.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-
|
|
1
|
+
{"version":3,"file":"render-DEIUNLkh.mjs","names":[],"sources":["../src/core/render.ts"],"sourcesContent":["import type { TerminalQueries } from \"../input/queries.ts\"\nimport type { StyleBuilder } from \"../style/builder.ts\"\nimport type { Theme } from \"../themes/types.ts\"\nimport type { RenderCtx } from \"./ctx.ts\"\n// oxlint-disable no-await-in-loop\nimport type { Node } from \"./node.ts\"\nimport type { Accessor, SuspenseBoundary } from \"./reactive.ts\"\n\nimport { createCtx } from \"./ctx.ts\"\nimport {\n createContext,\n createRoot,\n createSuspenseBoundary,\n provideContext,\n SuspenseContext,\n} from \"./reactive.ts\"\n\n/** Components-facing slice of the render environment — reactive\n * accessors a widget body reads via `useContext(RenderContext)`. Use\n * this when a widget needs ambient theme/style outside an `_render`\n * call (the place where `RenderCtx` is threaded in). Width is\n * deliberately omitted — that's a per-render allotted-size concept,\n * not an ambient one. */\nexport type RenderContextValue = {\n /** Active theme. Tracked — widgets that read it re-fire on swap. */\n theme: Accessor<Theme>\n /** Theme-bound chainable style builder. Derived memo over `theme`. */\n style: Accessor<StyleBuilder>\n /** Whether to render images (when supported) */\n images: Accessor<boolean>\n queries: TerminalQueries\n}\nexport const RenderContext = createContext<RenderContextValue>()\n\n/**\n * Render a Node, draining `createAsync` work in its subtree before\n * returning final rows. Two shapes:\n *\n * - `createRender(() => node, ctx?)` — factory form. Creates a fresh\n * `SuspenseBoundary` inside a new `createRoot` and runs the\n * factory in that scope so descendants find the boundary via\n * `useContext(SuspenseContext)`. For tests, benches, REPL.\n *\n * - `createRender(node, { ...ctx, boundary })` — pre-built Node\n * with a caller-provided boundary. Used by `Stream.render`: the\n * boundary was installed at `append` time, so we just render +\n * drain without a new root scope.\n *\n * `ctx` defaults to `createCtx()` in the factory form.\n *\n * ```ts\n * const rows = await createRender(() => markdown(\"**hi**\"))\n * ```\n */\nexport async function createRender(\n node: Node,\n ctx: RenderCtx & { boundary: SuspenseBoundary }\n): Promise<string[]>\nexport async function createRender(node: () => Node, ctx?: RenderCtx): Promise<string[]>\nexport async function createRender(\n node: Node | (() => Node),\n ctx: RenderCtx & { boundary?: SuspenseBoundary } = createCtx()\n): Promise<string[]> {\n if (ctx.boundary) return renderWithDrain(node as Node, ctx.boundary, ctx)\n const boundary = createSuspenseBoundary()\n const nodeFn = node as () => Node\n return createRoot(async () => {\n provideContext(SuspenseContext, boundary)\n return renderWithDrain(nodeFn(), boundary, ctx)\n })\n}\n\n/** Wait for any pending work first, then render. On warm caches the\n * initial `whenIdle` resolves on the same microtask tick — no real\n * wait — and we render exactly once with final values. On cold the\n * wait blocks until `createAsync` settles. The follow-up `while`\n * catches the in-render case: a `_render` that fires a fresh\n * `createAsync` (signal write subscribes a new effect) bumps the\n * boundary back above zero, requiring another pass. */\nasync function renderWithDrain(\n node: Node,\n boundary: SuspenseBoundary,\n ctx: RenderCtx\n): Promise<string[]> {\n if (boundary.active()) await boundary.whenIdle()\n let rows = await node.render(ctx)\n while (boundary.active()) {\n await boundary.whenIdle()\n rows = await node.render(ctx)\n }\n return rows\n}\n"],"mappings":";;;AAgCA,MAAa,gBAAgB,cAAkC;AA2B/D,eAAsB,aACpB,MACA,MAAmD,UAAU,GAC1C;CACnB,IAAI,IAAI,UAAU,OAAO,gBAAgB,MAAc,IAAI,UAAU,GAAG;CACxE,MAAM,WAAW,uBAAuB;CACxC,MAAM,SAAS;CACf,OAAO,WAAW,YAAY;EAC5B,eAAe,iBAAiB,QAAQ;EACxC,OAAO,gBAAgB,OAAO,GAAG,UAAU,GAAG;CAChD,CAAC;AACH;;;;;;;;AASA,eAAe,gBACb,MACA,UACA,KACmB;CACnB,IAAI,SAAS,OAAO,GAAG,MAAM,SAAS,SAAS;CAC/C,IAAI,OAAO,MAAM,KAAK,OAAO,GAAG;CAChC,OAAO,SAAS,OAAO,GAAG;EACxB,MAAM,SAAS,SAAS;EACxB,OAAO,MAAM,KAAK,OAAO,GAAG;CAC9B;CACA,OAAO;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { t as MarkdownRenderer } from "./renderer-MQue4Da5.mjs";
|
|
@@ -10,7 +10,7 @@ var MarkdownRenderer = class {
|
|
|
10
10
|
}
|
|
11
11
|
async render(source, ctx) {
|
|
12
12
|
this.#render ??= this.#opts.render ?? (await import("#md")).renderMarkdown;
|
|
13
|
-
const [{ createCallbacks }, { createImageCallback }] = await Promise.all([import("./callbacks-
|
|
13
|
+
const [{ createCallbacks }, { createImageCallback }] = await Promise.all([import("./callbacks-BwWTCqPJ.mjs"), import("./image-Cm5T-uw-.mjs")]);
|
|
14
14
|
const callbacks = createCallbacks(ctx);
|
|
15
15
|
const image = ctx.images ?? true ? createImageCallback({
|
|
16
16
|
add: (child) => this.#parent?.add(child),
|
|
@@ -37,4 +37,4 @@ var MarkdownRenderer = class {
|
|
|
37
37
|
//#endregion
|
|
38
38
|
export { MarkdownRenderer as t };
|
|
39
39
|
|
|
40
|
-
//# sourceMappingURL=renderer-
|
|
40
|
+
//# sourceMappingURL=renderer-MQue4Da5.mjs.map
|