@zaly/tui 0.0.10 → 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.
Files changed (180) hide show
  1. package/assets/schemas/theme.schema.json +351 -36
  2. package/assets/themes/ayu-dark.json +2 -21
  3. package/assets/themes/catppuccin-frappe.json +2 -21
  4. package/assets/themes/catppuccin-latte.json +2 -21
  5. package/assets/themes/catppuccin-macchiato.json +2 -21
  6. package/assets/themes/catppuccin-mocha.json +2 -21
  7. package/assets/themes/dracula-soft.json +2 -21
  8. package/assets/themes/dracula.json +2 -21
  9. package/assets/themes/everforest-dark.json +2 -21
  10. package/assets/themes/everforest-light.json +2 -21
  11. package/assets/themes/github-dark.json +2 -21
  12. package/assets/themes/github-light.json +2 -21
  13. package/assets/themes/gruvbox-dark-medium.json +2 -21
  14. package/assets/themes/kanagawa-dragon.json +2 -21
  15. package/assets/themes/kanagawa-wave.json +2 -21
  16. package/assets/themes/material-theme-palenight.json +2 -21
  17. package/assets/themes/min-dark.json +2 -18
  18. package/assets/themes/min-light.json +2 -18
  19. package/assets/themes/monokai.json +2 -21
  20. package/assets/themes/night-owl.json +2 -21
  21. package/assets/themes/nord.json +2 -18
  22. package/assets/themes/one-dark-pro.json +2 -21
  23. package/assets/themes/one-light.json +2 -20
  24. package/assets/themes/poimandres.json +2 -21
  25. package/assets/themes/rose-pine.json +2 -18
  26. package/assets/themes/solarized-dark.json +2 -21
  27. package/assets/themes/solarized-light.json +2 -21
  28. package/assets/themes/synthwave-84.json +2 -21
  29. package/assets/themes/tokyonight-day.json +4 -5
  30. package/assets/themes/tokyonight-moon.json +3 -4
  31. package/assets/themes/tokyonight-night.json +3 -4
  32. package/assets/themes/tokyonight-storm.json +3 -4
  33. package/assets/themes/vesper.json +2 -17
  34. package/assets/themes/vitesse-dark.json +2 -21
  35. package/assets/themes/vitesse-light.json +2 -21
  36. package/dist/{actions-DFboj3g5.d.mts → actions-Dc4D4uSf.d.mts} +4 -4
  37. package/dist/{actions-DFboj3g5.d.mts.map → actions-Dc4D4uSf.d.mts.map} +1 -1
  38. package/dist/{ansi-Clq0ozyA.mjs → ansi-DZlXaItJ.mjs} +37 -2
  39. package/dist/ansi-DZlXaItJ.mjs.map +1 -0
  40. package/dist/ansi.d.mts +3 -1
  41. package/dist/ansi.d.mts.map +1 -1
  42. package/dist/ansi.mjs +1 -1
  43. package/dist/{autocomplete-CxzetPOo.d.mts → autocomplete-StW1QJZJ.d.mts} +4 -4
  44. package/dist/{autocomplete-CxzetPOo.d.mts.map → autocomplete-StW1QJZJ.d.mts.map} +1 -1
  45. package/dist/{box-DLEcEvDH.mjs → box-BkP4MF82.mjs} +2 -2
  46. package/dist/box-BkP4MF82.mjs.map +1 -0
  47. package/dist/{builder-DC9byAmK.mjs → builder-1z5ewEWK.mjs} +4 -4
  48. package/dist/builder-1z5ewEWK.mjs.map +1 -0
  49. package/dist/{callbacks-D132G8dy.mjs → callbacks-BwWTCqPJ.mjs} +3 -3
  50. package/dist/{callbacks-D132G8dy.mjs.map → callbacks-BwWTCqPJ.mjs.map} +1 -1
  51. package/dist/{ctx-8Nuf5BrN.mjs → ctx-B7BmPUCD.mjs} +3 -3
  52. package/dist/{ctx-8Nuf5BrN.mjs.map → ctx-B7BmPUCD.mjs.map} +1 -1
  53. package/dist/ctx-D_JgJ8Eo.mjs +1 -0
  54. package/dist/{divider-l0-JPEIm.mjs → divider-TSx9NhI_.mjs} +2 -2
  55. package/dist/divider-TSx9NhI_.mjs.map +1 -0
  56. package/dist/{files-BUsa-RVl.d.mts → files-7DUYSeNc.d.mts} +3 -3
  57. package/dist/{files-BUsa-RVl.d.mts.map → files-7DUYSeNc.d.mts.map} +1 -1
  58. package/dist/{github-D89A3F9U.d.mts → github-C1KfXk98.d.mts} +3 -3
  59. package/dist/{github-D89A3F9U.d.mts.map → github-C1KfXk98.d.mts.map} +1 -1
  60. package/dist/github-Cy2hfWJ7.mjs.map +1 -1
  61. package/dist/{image-34bU73bW.d.mts → image-VaT7AN-S.d.mts} +2 -2
  62. package/dist/{image-34bU73bW.d.mts.map → image-VaT7AN-S.d.mts.map} +1 -1
  63. package/dist/image.d.mts +1 -1
  64. package/dist/index.d.mts +3 -3
  65. package/dist/index.mjs +4 -4
  66. package/dist/{input-Dylds_sI.d.mts → input-BAYux7qo.d.mts} +3 -3
  67. package/dist/{input-Dylds_sI.d.mts.map → input-BAYux7qo.d.mts.map} +1 -1
  68. package/dist/{input-D7fQEUdt.mjs → input-BGTTujDN.mjs} +16 -11
  69. package/dist/input-BGTTujDN.mjs.map +1 -0
  70. package/dist/{inspect-DPLRum7L.d.mts → inspect-CfNydMgO.d.mts} +11 -15
  71. package/dist/inspect-CfNydMgO.d.mts.map +1 -0
  72. package/dist/{inspect-CcgiZ_F9.mjs → inspect-jG_W4njH.mjs} +2 -2
  73. package/dist/{inspect-CcgiZ_F9.mjs.map → inspect-jG_W4njH.mjs.map} +1 -1
  74. package/dist/{log-Dy_QnPZF.mjs → log-ByKlM4iI.mjs} +5 -5
  75. package/dist/log-ByKlM4iI.mjs.map +1 -0
  76. package/dist/{logger-DvuX9DPS.mjs → logger-DSQb0sLP.mjs} +3 -3
  77. package/dist/{logger-DvuX9DPS.mjs.map → logger-DSQb0sLP.mjs.map} +1 -1
  78. package/dist/{markdown-BGPa7UzD.mjs → markdown-CwRmWuU6.mjs} +5 -5
  79. package/dist/{markdown-BGPa7UzD.mjs.map → markdown-CwRmWuU6.mjs.map} +1 -1
  80. package/dist/markdown.d.mts +1 -1
  81. package/dist/markdown.mjs +1 -1
  82. package/dist/{overlay-9WXYiGgW.mjs → overlay-BnvOKtGT.mjs} +2 -2
  83. package/dist/{overlay-9WXYiGgW.mjs.map → overlay-BnvOKtGT.mjs.map} +1 -1
  84. package/dist/{picker-JL8lZfRH.d.mts → picker-DQs_IW77.d.mts} +5 -5
  85. package/dist/{picker-JL8lZfRH.d.mts.map → picker-DQs_IW77.d.mts.map} +1 -1
  86. package/dist/{picker-BqHINl_a.mjs → picker-Dh5IUrTk.mjs} +2 -2
  87. package/dist/{picker-BqHINl_a.mjs.map → picker-Dh5IUrTk.mjs.map} +1 -1
  88. package/dist/{queries-Cvalgu6P.d.mts → queries-BDX8mcl5.d.mts} +26 -10
  89. package/dist/queries-BDX8mcl5.d.mts.map +1 -0
  90. package/dist/{registry-3hLzS4ks.mjs → registry-D-suU3g0.mjs} +15 -20
  91. package/dist/registry-D-suU3g0.mjs.map +1 -0
  92. package/dist/{render-f7M2856V.mjs → render-DEIUNLkh.mjs} +2 -2
  93. package/dist/{render-f7M2856V.mjs.map → render-DEIUNLkh.mjs.map} +1 -1
  94. package/dist/renderer-DhqbEVVR.mjs +1 -0
  95. package/dist/{renderer-DesbRwjQ.mjs → renderer-MQue4Da5.mjs} +2 -2
  96. package/dist/{renderer-DesbRwjQ.mjs.map → renderer-MQue4Da5.mjs.map} +1 -1
  97. package/dist/{renderer-V6AGjbyf.mjs → renderer-zDNlAovy.mjs} +66 -15
  98. package/dist/renderer-zDNlAovy.mjs.map +1 -0
  99. package/dist/{select-zGd5pbiB.d.mts → select-J2KtwxyK.d.mts} +3 -3
  100. package/dist/{select-zGd5pbiB.d.mts.map → select-J2KtwxyK.d.mts.map} +1 -1
  101. package/dist/services/logger.d.mts +1 -1
  102. package/dist/services/logger.mjs +1 -1
  103. package/dist/services/notifier.d.mts +1 -1
  104. package/dist/services/notifier.mjs +2 -2
  105. package/dist/services/picker.d.mts +5 -5
  106. package/dist/services/picker.mjs +6 -6
  107. package/dist/services/prompt.d.mts +4 -4
  108. package/dist/services/prompt.mjs +5 -5
  109. package/dist/shiki/server.mjs +1 -1
  110. package/dist/style.d.mts +2 -2
  111. package/dist/style.mjs +3 -3
  112. package/dist/{text-BefiXAFW.d.mts → text-CCYs9RB2.d.mts} +3 -3
  113. package/dist/{text-BefiXAFW.d.mts.map → text-CCYs9RB2.d.mts.map} +1 -1
  114. package/dist/{text-CRZD9KTN.mjs → text-CkQ7Irmt.mjs} +2 -2
  115. package/dist/{text-CRZD9KTN.mjs.map → text-CkQ7Irmt.mjs.map} +1 -1
  116. package/dist/{text-BLz1tRoC.mjs → text-XvPfweeg.mjs} +2 -2
  117. package/dist/text-XvPfweeg.mjs.map +1 -0
  118. package/dist/text.d.mts +1 -1
  119. package/dist/text.mjs +1 -1
  120. package/dist/{theme.config-BKXX_noZ.mjs → theme.config-B3Yx--C2.mjs} +12 -20
  121. package/dist/theme.config-B3Yx--C2.mjs.map +1 -0
  122. package/dist/themes.d.mts +1 -1
  123. package/dist/themes.mjs +1 -1
  124. package/dist/{tree-CArtDRec.d.mts → tree-DJl5W_B7.d.mts} +3 -3
  125. package/dist/{tree-CArtDRec.d.mts.map → tree-DJl5W_B7.d.mts.map} +1 -1
  126. package/dist/{types-C0EOLZDc.d.mts → types-D2EYlzmK.d.mts} +10 -18
  127. package/dist/types-D2EYlzmK.d.mts.map +1 -0
  128. package/dist/{widget-DtJU2-BJ.d.mts → widget-DPqBbB57.d.mts} +2 -2
  129. package/dist/{widget-DtJU2-BJ.d.mts.map → widget-DPqBbB57.d.mts.map} +1 -1
  130. package/dist/widgets/autocomplete.d.mts +1 -1
  131. package/dist/widgets/autocomplete.mjs +2 -2
  132. package/dist/widgets/box.d.mts +1 -1
  133. package/dist/widgets/box.mjs +1 -1
  134. package/dist/widgets/code.d.mts +2 -2
  135. package/dist/widgets/code.mjs +4 -4
  136. package/dist/widgets/completions/actions.d.mts +1 -1
  137. package/dist/widgets/completions/files.d.mts +1 -1
  138. package/dist/widgets/completions/github.d.mts +1 -1
  139. package/dist/widgets/completions/index.d.mts +3 -3
  140. package/dist/widgets/diff.d.mts +2 -2
  141. package/dist/widgets/diff.mjs +2 -2
  142. package/dist/widgets/divider.d.mts +3 -3
  143. package/dist/widgets/divider.mjs +1 -1
  144. package/dist/widgets/image.d.mts +1 -1
  145. package/dist/widgets/image.mjs +1 -1
  146. package/dist/widgets/input.d.mts +1 -1
  147. package/dist/widgets/input.mjs +1 -1
  148. package/dist/widgets/log.d.mts +1 -1
  149. package/dist/widgets/log.mjs +1 -1
  150. package/dist/widgets/markdown.d.mts +4 -4
  151. package/dist/widgets/markdown.mjs +1 -1
  152. package/dist/widgets/overlay.d.mts +1 -1
  153. package/dist/widgets/overlay.mjs +1 -1
  154. package/dist/widgets/picker.d.mts +1 -1
  155. package/dist/widgets/picker.mjs +1 -1
  156. package/dist/widgets/progress.d.mts +4 -4
  157. package/dist/widgets/progress.mjs.map +1 -1
  158. package/dist/widgets/select.d.mts +1 -1
  159. package/dist/widgets/show.d.mts +1 -1
  160. package/dist/widgets/spinner.d.mts +2 -2
  161. package/dist/widgets/text.d.mts +1 -1
  162. package/dist/widgets/text.mjs +1 -1
  163. package/dist/widgets/tree.d.mts +1 -1
  164. package/dist/widgets/widget.d.mts +1 -1
  165. package/package.json +2 -2
  166. package/dist/ansi-Clq0ozyA.mjs.map +0 -1
  167. package/dist/box-DLEcEvDH.mjs.map +0 -1
  168. package/dist/builder-DC9byAmK.mjs.map +0 -1
  169. package/dist/ctx-k0wTqeql.mjs +0 -1
  170. package/dist/divider-l0-JPEIm.mjs.map +0 -1
  171. package/dist/input-D7fQEUdt.mjs.map +0 -1
  172. package/dist/inspect-DPLRum7L.d.mts.map +0 -1
  173. package/dist/log-Dy_QnPZF.mjs.map +0 -1
  174. package/dist/queries-Cvalgu6P.d.mts.map +0 -1
  175. package/dist/registry-3hLzS4ks.mjs.map +0 -1
  176. package/dist/renderer-BSMOuiLM.mjs +0 -1
  177. package/dist/renderer-V6AGjbyf.mjs.map +0 -1
  178. package/dist/text-BLz1tRoC.mjs.map +0 -1
  179. package/dist/theme.config-BKXX_noZ.mjs.map +0 -1
  180. package/dist/types-C0EOLZDc.d.mts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-9WXYiGgW.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
+ {"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-Cvalgu6P.mjs";
2
- import { t as Input } from "./input-Dylds_sI.mjs";
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-zGd5pbiB.mjs";
5
- import { r as TreeProps, t as TreeItem } from "./tree-CArtDRec.mjs";
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-JL8lZfRH.d.mts.map
36
+ //# sourceMappingURL=picker-DQs_IW77.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"picker-JL8lZfRH.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
+ {"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-D7fQEUdt.mjs";
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-BqHINl_a.mjs.map
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":";;;;;;;;AAKA,MAAM,cAAc;AACpB,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAE5B,MAAM,iBAAiB,cAAc;AACrC,MAAM,gBAAgB,cAAc;AACpC,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,8BAA8B;AACpC,MAAM,oBAAoB;AAE1B,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,iBAAiB;AACvB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,cAAc;AACpB,MAAM,cAAc;AAEpB,MAAM,4BAAY,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;AAErC,MAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,IAAI,IAAI,GAAG,MAAM;CACvD,MAAM,KAAK,OAAO,aAAa,CAAC;CAChC,IAAI,KAAK,KAAK,EAAE,GAAG,OAAO;CAC1B,IAAI,OAAO,GAAG,SAAS,SAAS,EAAE,GAAG,OAAO;CAC5C,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO;CAC/B,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO;CAC/B,IAAI,KAAK,MAAM,KAAK,KAAK,OAAO;CAChC,OAAO;AACT,CAAC;AAED,SAAS,UAAU,KAAa,KAAqB;CACnD,MAAM,OAAO,IAAI,WAAW,GAAG;CAC/B,OAAO,QAAQ,MAAO,WAAW,SAAS,eAAgB;AAC5D;AAEA,IAAa,QAAb,MAAmB;CACjB;CACA,eAAoC,CAAC;CACrC;CACA;CAEA,eAAe;CACf,cAAc;CACd;CACA,aAAa;CACb,SAAS;CACT,OAAO;CAEP,SAAS;CAET,YAAY,OAAqB,CAAC,GAAG;EACnC,KAAK,QAAQ;EACb,KAAK,sBAAsB,KAAK,eAAe,iBAAiB;EAChE,KAAK,0BAA0B,KAAK,eAAe,iBAAiB;EACpE,KAAK,IAAI,OAAO,GAAG,QAAQ,GAAG,QAAQ;GACpC,KAAK,aAAa,QAAQ,CAAC;GAC3B,KAAK,IAAI,OAAO,GAAG,QAAQ,GAAG,QAC5B,KAAK,aAAa,KAAK,CAAC,QAAQ,KAAK,cAAc,MAAM,IAAI;EAEjE;CACF;CAEA,IAAI,QAAgB;EAClB,OAAO,KAAK;CACd;CAEA,eAAe,KAAa,KAAsB;EAChD,OAAO,QAAQ,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI;CAChD;CAEA,gBAAgB,KAAa,KAAsB;EACjD,OAAO,QAAQ,IAAI,SAAS,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI;CAC7D;CAEA,KAAK,KAAa,OAAqB;EACrC,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,KAAK,eAAe;EACpB,KAAK,aAAa,QAAQ,IAAI,UAAU,KAAK,QAAQ,CAAC,IAAI;EAC1D,KAAK,QAAQ,KAAA;EACb,KAAK,cAAc;EAEnB,IAAI,KAAK,UAAU,KAAK,MAAM,iBAAiB,CAAC,gBAAgB,KAAK,KAAK,GACxE,KAAK,UAAU;EAEjB,KAAK,OAAO,KAAK;CACnB;CAEA,OAAO,KAAmB;EACxB,MAAM,MAAM,UAAU,KAAK,MAAM,GAAG;EACpC,MAAM,MAAM,KAAK,UAAU,KAAA,IAAY,IAAI,MAAM,KAAK,QAAQ;EAC9D,IAAI,QAAQ;EAEZ,IAAI,MAAM,GAAG;GACX,KAAK,aAAa,UAAU,KAAK,MAAM,MAAM,CAAC;GAC9C,QAAQ,KAAK,aAAa,KAAK,WAAW,GAAG,QAAQ;GACrD,KAAK,UAAU,mBAAmB,MAAM,KAAK;GAC7C,KAAK,eAAe;GACpB,KAAK,cAAc;EACrB,OAAO;GACL,QAAQ,KAAK,aAAa,KAAK,WAAW,GAAG,QAAQ;GACrD,IAAI,KAAK,iBAAiB,GACxB,KAAK,cAAc;QACd;IACL,IAAI,SAAS,kBAAkB,QAAQ,KAAK,aAAa,KAAK,cAAc;IAC5E,QAAQ,KAAK,IAAI,OAAO,KAAK,aAAa,iBAAiB;GAC7D;GACA,KAAK;EACP;EAEA,IAAI,KAAK,UAAU,KAAA,GAAW,SAAS;EACvC,KAAK,UAAU,cAAc;EAC7B,KAAK,aAAa;EAClB,KAAK,QAAQ;CACf;CAEA,IAAI,KAAa,MAAc,IAAoB;EACjD,KAAK,KAAK,KAAK,IAAI;EACnB,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC;EAClD,OAAO,KAAK;CACd;CAEA,cAAc,MAAc,MAAsB;EAChD,IAAI,OAAO,cAAc;GACvB,IAAI,SAAS,YAAY,OAAO,KAAK;GACrC,IAAI,SAAS,gBAAgB,OAAO,KAAK;GACzC,IAAI,SAAS,cAAc,OAAO;EACpC;EACA,IACG,SAAS,cAAc,SAAS,cAChC,SAAS,eAAe,SAAS,aAElC,OAAO;EAET,IAAI,SAAS,gBAAgB,SAAS,gBAAgB,OAAO;EAC7D,IAAI,SAAS,YAAY,OAAO;EAChC,OAAO;CACT;AACF;AAEA,SAAS,gBAAgB,KAAa,OAAwB;CAC5D,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,IAAI,QAAQ,KAAK,IAAI,UAAU,IAAI,IAAI,EAAE,GAAG,OAAO;CAC/E,OAAO;AACT;;;ACvGA,IAAa,UAAb,MAAwD;CACtD;CAEA;CACA,OAAgB,CAAC;CACjB;CACA,UAAU;CACV,OAAO;CAEP,YAAY,OAAuB,CAAC,GAAG;EACrC,KAAK,OAAO;GACV,OAAO;GACP,YAAY;GACZ,WAAW;GACX,GAAG;EACL;EACA,KAAK,QAAQ,IAAI,MAAM,IAAI;CAC7B;CAEA,QAAiB;EACf,OAAO,KAAK,KAAK,WAAW;CAC9B;CAEA,KAAK,SAA0B;EAC7B,UAAU,QAAQ,KAAK;EACvB,IAAI,YAAY,KAAK,SAAS,OAAO;EAErC,KAAK,UAAU;EACf,KAAK;EACL,KAAK,OAAO,CAAC;EACb,KAAK,MAAM,KAAA;EACX,IAAI,YAAY,IAAI,OAAO;EAE3B,IAAI,KAAK,KAAK,OACZ,KAAK,OAAO,CAAC,CAAC,KAAK,SAAS,OAAO,CAAC,CAAC;OAChC;GACL,IAAI,OAAO;GACX,KAAK,MAAM,QAAQ,QAAQ,MAAM,IAAI,GAAG;IACtC,IAAI,SAAS,KAAK;KAChB,OAAO;KACP;IACF;IACA,MAAM,MAAM,KAAK,SAAS,IAAI;IAC9B,IAAI,IAAI,YAAY,IAAI;IACxB,IAAI,QAAQ,KAAK,KAAK,SAAS,GAAG,KAAK,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG;SACvD,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC;IACzB,OAAO;GACT;EACF;EAEA,KAAK,OAAO,KAAK,KAAK,KAAK,QAAQ,IAAI,UAAU,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;EAChF,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG,OAAO,EAAE,EAAE,EAAE,WAAW,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE;EACpF,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,EAAE,EAAE,WAAW,GAAG,KAAK,MAAM,KAAK,KAAK,EAAE,CAAC;EAClF,OAAO;CACT;CAEA,MAAM,OAA2B;EAC/B,IAAI,KAAK,MAAM,GAAG,OAAO;EACzB,MAAM,OAAO,OAAO,UAAU,WAAW,EAAE,MAAM,MAAM,IAAI;EAC3D,IAAI,KAAK,KAAK,OAAO,KAAK,OAAO,MAAM,KAAK,GAAG,CAAC,EAAE,SAAS;EAE3D,IAAI,QAAQ;EACZ,KAAK,MAAM,OAAO,KAAK,MAAM;GAC3B,IAAI;GACJ,KAAK,MAAM,OAAO,KAAK;IACrB,QAAQ,KAAK,OAAO,MAAM,GAAG;IAC7B,IAAI,OAAO;GACb;GACA,IAAI,CAAC,OAAO,OAAO;GACnB,SAAS,MAAM;EACjB;EACA,OAAO;CACT;CAEA,OAAO,MAAwB;EAC7B,MAAM,QAAQ,KAAK,MAAM,IAAI;EAC7B,MAAM,KAAK;EACX,GAAG,QAAQ;EACX,OAAO;CACT;CAEA,UAAU,OAA6B;EACrC,IAAI,KAAK,MAAM,GAAG,OAAO,CAAC;EAC1B,MAAM,OAAO,OAAO,UAAU,WAAW,EAAE,MAAM,MAAM,IAAI;EAC3D,MAAM,MAAgB,CAAC;EACvB,MAAM,MAAM,KAAK,KAAK,KAAK;EAC3B,KAAK,MAAM,OAAO,KAAK;GACrB,MAAM,QAAQ,KAAK,OAAO,MAAM,GAAG;GACnC,IAAI,CAAC,OAAO;GACZ,IAAI,IAAI,OAAO,IAAI,KAAK,GAAG,KAAK,gBAAgB,MAAM,QAAQ,IAAI,OAAO,MAAM,IAAI,CAAC;QAC/E,KAAK,IAAI,IAAI,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;EAC9D;EACA,OAAO,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC;CACnD;CAEA,SAAmB;EACjB,MAAM,sBAAM,IAAI,IAAY;EAC5B,KAAK,MAAM,OAAO,KAAK,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,SAAS,MAAM;EAC/D,OAAO,CAAC,GAAG,GAAG;CAChB;CAEA,SAAS,SAAsB;EAC7B,MAAM,MAAW;GAAE,OAAO,CAAC;GAAG,SAAS;GAAG;EAAQ;EAElD,IAAI,KAAK,KAAK,OAAO;GACnB,IAAI,QAAQ;GACZ,MAAM,UAAU,IAAI,QAAQ,YAAY,MAAM,IAAI;GAClD,IAAI,aAAa,KAAK,KAAK,YAAY,UAAU,KAAK,KAAK;GAC3D,IAAI;IACF,IAAI,KAAK,IAAI,OAAO,IAAI,SAAS,IAAI,aAAa,MAAM,KAAA,CAAS;GACnE,QAAQ;IACN,IAAI,KAAK,KAAA;GACX;EACF,OAAO;GACL,MAAM,OAAO,iBAAiB,OAAO;GACrC,IAAI,MAAM;IACR,IAAI,QAAQ;IACZ,IAAI,UAAU,GAAG,KAAK;GACxB;GAEA,MAAM,QAAQ,IAAI,QAAQ,MAAM,sBAAsB;GACtD,IAAI,OAAO;IACT,IAAI,QAAQ,MAAM;IAClB,IAAI,UAAU,MAAM;GACtB;GAEA,IAAI,aAAa,KAAK,KAAK;GAC3B,MAAM,UAAU,IAAI,QAAQ,YAAY,MAAM,IAAI;GAClD,IAAI,KAAK,KAAK,WAAW,IAAI,aAAa;GAC1C,IAAI,QAAQ,KAAK,KAAK;GACtB,IAAI,CAAC,IAAI,OAAO,IAAI,WAAW;GAE/B,IAAI,IAAI,QAAQ,WAAW,GAAG,GAAG;IAC/B,IAAI,QAAQ;IACZ,IAAI,UAAU;IACd,IAAI,UAAU,IAAI,QAAQ,MAAM,CAAC;IACjC,IAAI,WAAW;GACjB;GACA,IAAI,IAAI,QAAQ,WAAW,GAAG,GAAG;IAC/B,IAAI,QAAQ;IACZ,IAAI,UAAU,IAAI,QAAQ,MAAM,CAAC;IACjC,IAAI,WAAW;IACf,IAAI,IAAI,QAAQ,SAAS,GAAG,GAAG;KAC7B,IAAI,OAAO;KACX,IAAI,UAAU,IAAI,QAAQ,MAAM,GAAG,EAAE;KACrC,IAAI,WAAW;IACjB;GACF,OAAO,IAAI,IAAI,QAAQ,WAAW,GAAG,GAAG;IACtC,IAAI,QAAQ;IACZ,IAAI,cAAc;IAClB,IAAI,UAAU,IAAI,QAAQ,MAAM,CAAC;IACjC,IAAI,WAAW;GACjB;GACA,IAAI,IAAI,QAAQ,SAAS,GAAG,GAAG;IAC7B,IAAI,QAAQ;IACZ,IAAI,cAAc;IAClB,IAAI,UAAU,IAAI,QAAQ,MAAM,GAAG,EAAE;IACrC,IAAI,WAAW;GACjB;GAEA,MAAM,aAAa,IAAI,QAAQ,MAAM,UAAU,KAAK,CAAC,EAAA,CAAG;GACxD,IAAI,WAAW,KAAK,IAAI,IAAI,QAAQ,QAAQ,EAAE,IAAI,YAAY;GAC9D,IAAI,CAAC,IAAI,cAAc,CAAC,SAAS,IAAI,WAAW;GAChD,IAAI,IAAI,YAAY,IAAI,UAAU,IAAI,QAAQ,YAAY;EAC5D;EAGA,IAAI,QAAQ,CAAC,GAAG,IAAI,OAAO;EAC3B,OAAO;CACT;CAEA,OAAO,MAAkB,KAA6B;EACpD,KAAK,MAAM,SAAS,UAAU,MAAM,MAAM,MAAM,KAAA;EAChD,IAAI,MAAM,KAAK;EAEf,IAAI,IAAI,OAAO;GACb,MAAM,QAAQ,UAAU,MAAM,IAAI,KAAK;GACvC,IAAI,UAAU,KAAA,GACZ,OAAO,IAAI,UAAU;IAAE,MAAM;IAAG,OAAO;IAAM,QAAQ;IAAK;IAAK,IAAI;GAAE,IAAI,KAAA;GAC3E,MAAM;EACR;EAEA,MAAM,WAAW;EACjB,IAAI,IAAI,YAAY,MAAM,IAAI,YAAY;EAE1C,IAAI,IAAI,OAAO,OAAO,KAAK,OAAO,UAAU,GAAG;EAC/C,IAAI,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,UAAU,IAAI,KAAK;EAE1D,IAAI,OAAO;EACX,IAAI,KAAK;EACT,IAAI,IAAI,aACF;OAAA,IAAI,WAAW,IAAI,OAAO,GAAG;IAC/B,OAAO;IACP,KAAK,IAAI,QAAQ,SAAS;GAC5B;SACK,IAAI,IAAI,aACT;OAAA,IAAI,SAAS,IAAI,OAAO,GAAG;IAC7B,OAAO,IAAI,SAAS,IAAI,QAAQ;IAChC,KAAK,IAAI,SAAS;GACpB;SACK;GACL,OAAO,IAAI,QAAQ,IAAI,OAAO;GAC9B,KAAK,OAAO,IAAI,QAAQ,SAAS;GACjC,OAAO,IAAI,QAAQ,QAAQ,GAAG;IAC5B,IAAI,KAAK,MAAM,eAAe,KAAK,IAAI,KAAK,KAAK,MAAM,gBAAgB,KAAK,EAAE,GAAG;IACjF,OAAO,IAAI,QAAQ,IAAI,SAAS,KAAK,CAAC;IACtC,KAAK,OAAO,IAAI,QAAQ,SAAS;GACnC;EACF;EAEA,IAAI,IAAI,SACN,OAAO,SAAS,KAAK;GAAE,MAAM;GAAG,OAAO;GAAM,QAAQ;GAAK,KAAK;GAAU,IAAI;EAAE,IAAI,KAAA;EACrF,IAAI,QAAQ,GACV,OAAO;GAAE;GAAM,OAAO,KAAK,MAAM,IAAI,UAAU,MAAM,EAAE;GAAG,QAAQ;GAAK,KAAK;GAAU;EAAG;CAE7F;CAEA,OAAO,KAAa,KAA6B;EAC/C,MAAM,QAAQ,IAAI,IAAI,KAAK,GAAG;EAC9B,IAAI,CAAC,QAAQ,IAAI,OAAO,KAAA;EACxB,MAAM,OAAO,MAAM;EACnB,MAAM,KAAK,OAAO,MAAM,EAAE,CAAC,SAAS;EACpC,OAAO;GAAE;GAAM,OAAO,KAAK,MAAM,IAAI,KAAK,MAAM,EAAE;GAAG,QAAQ;GAAK;GAAK;EAAG;CAC5E;CAEA,WACE,KACA,UACA,SACA,OAAO,GAC2C;EAClD,MAAM,OAAO,IAAI,QAAQ,QAAQ,MAAM,IAAI,IAAI;EAC/C,IAAI,SAAS,IAAI,OAAO,KAAA;EACxB,KAAK,MAAM,KAAK,UAAU,IAAI;EAC9B,IAAI,OAAO;EACX,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;GACvC,OAAO,IAAI,QAAQ,QAAQ,IAAI,OAAO,CAAC;GAIvC,IAAI,SAAS,IAAI,OAAO,KAAA;GACxB,KAAK,MAAM,OAAO,IAAI;EACxB;EACA,OAAO;GAAE;GAAM,OAAO,KAAK,MAAM;GAAO,IAAI;EAAK;CACnD;CAEA,OAAO,KAAa,UAAkB,SAAsC;EAK1E,IAAI,OAAO,KAAK,WAAW,KAAK,UAAU,OAAO;EACjD,IAAI,CAAC,MAAM,OAAO,KAAA;EAClB,KACE,IAAI,OAAO,KAAK,WAAW,KAAK,UAAU,SAAS,KAAK,OAAO,CAAC,GAChE,MACA,OAAO,KAAK,WAAW,KAAK,UAAU,SAAS,KAAK,OAAO,CAAC,GAE5D,IAAI,KAAK,QAAQ,KAAK,OAAO,OAAO;EAEtC,OAAO;GAAE,MAAM,KAAK;GAAM,OAAO,KAAK;GAAO,QAAQ;GAAK,KAAK;GAAU,IAAI,KAAK;EAAG;CACvF;CAEA,gBAAgB,KAAa,SAAmB,MAAwB;EACtE,MAAM,MAAM,CAAC,IAAI;EACjB,IAAI,OAAO;EACX,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;GACvC,OAAO,IAAI,QAAQ,QAAQ,IAAI,OAAO,CAAC;GACvC,IAAI,SAAS,IAAI;GACjB,IAAI,KAAK,IAAI;EACf;EACA,OAAO;CACT;AACF;AAEA,SAAS,UAAU,MAAkB,OAAmC;CACtE,MAAM,QAAQ,KAAK;CACnB,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO,KAAA;CAClD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,OAAO,UAAU,UAC9E,OAAO,OAAO,KAAK;CACrB,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,KAAK,GAAG;AAEjD;AAEA,SAAS,iBAAiB,SAAqC;CAC7D,OACE,QAAQ,MAAM,0BAA0B,CAAC,GAAG,MAC5C,QAAQ,MAAM,4BAA4B,CAAC,GAAG;AAElD;;;AC5TA,SAAS,MAA4B,OAAqC;CACxE,MAAM,MAAM,MAAM,WAAW,GAAG;CAGhC,OAAO;EAAE,MAFI,MAAM,SAAS,OAEhB;EAAG;EAAK,MADP,MAAM,QAAQ,MAAM,EAAE,CAAC,CAAC,QAAQ,UAAU,EAChC;CAAE;AAC3B;AAEA,SAAgB,OACd,SAAkC;CAAC;CAAc;CAAS;AAAK,GACpD;CACX,MAAM,SAA2B,OAAO,IAAI,KAAK;CACjD,QAAQ,GAAG,MAAM;EACf,KAAK,MAAM,SAAS,QAAQ;GAC1B,IAAI,KAAc,EAAE,MAAM;GAC1B,IAAI,KAAc,EAAE,MAAM;GAC1B,IAAI,OAAO,KAAA,KAAa,OAAO,KAAA,GAAW;GAC1C,IAAI,MAAM,KAAK;IACb,KAAK,OAAO,OAAO,YAAY,MAAM,QAAQ,EAAE,IAAI,GAAG,SAAS;IAC/D,KAAK,OAAO,OAAO,YAAY,MAAM,QAAQ,EAAE,IAAI,GAAG,SAAS;GACjE;GACA,IAAI,OAAO,IAAI;GACf,IAAI,OAAO,OAAO,aAAa,OAAO,OAAO,WAAW;IACtD,KAAK,KAAK,IAAI;IACd,KAAK,KAAK,IAAI;GAChB;GACA,OAAO,QAAQ,IAAI,EAAE,KAAK,MAAM,OAAO,KAAK;EAC9C;EACA,OAAO;CACT;AACF;AAEA,SAAS,QAAQ,GAAY,GAAoB;CAC/C,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU,OAAO,IAAI;CAC/D,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU,OAAO,EAAE,cAAc,CAAC;CAC5E,OAAO,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC;AAC1C;;;ACvBA,MAAM,iBAAiB;AACvB,MAAM,eAAe;AACrB,MAAM,UAAU,OAAO,gBAAgB;AAEvC,IAAa,WAAb,MAAyD;CACvD;CACA;CACA;CACA;CAEA,YAAY,MAAwB;EAClC,KAAK,QAAQ;EACb,MAAM,WAAW,KAAK,SAAS,OAAO,KAAA,IAAY,KAAK;EACvD,KAAK,UAAU,aAAa,QAAQ,KAAA,IAAY,OAAO,QAAQ;EAC/D,KAAK,WAAW,IAAI,QAAQ,IAAI;CAClC;;;;CAKA,YAAY,MAAyC;EACnD,MAAM,IAAI,KAAK;EACf,QAAQ,MAAmB,KAAK,OAAO,UAAU,IAAI,EAAE,MAAM,CAAC;CAChE;CAEA,MAAM,OACJ,OACA,QAAQ,IACR,OAAkE,CAAC,GACzC;EAC1B,IAAI;GACF,OAAO,MAAM,KAAK,QAAQ,OAAO,OAAO,IAAI;EAC9C,SAAS,OAAO;GACd,IAAI,UAAU,SAAS,OAAO,CAAC;GAC/B,MAAM;EACR;CACF;CAEA,IAAI,QAAgB;EAClB,OAAO,KAAK,MAAM,UAAU,KAAK,UAAU,eAAe;CAC5D;CAEA,MAAM,QACJ,OACA,QAAQ,IACR,OAAkE,CAAC,GACzC;EAC1B,KAAK,KAAK,MAAM,OAAO;EAEvB,MAAM,KAAM,KAAK,MAAM,IAAI,gBAAgB;EAE3C,MAAM,IAAI,KAAK;EACf,EAAE,KAAK,KAAK;EACZ,MAAM,IAAI,KAAK,MAAM,WAAW;EAChC,MAAM,IAAI,KAAK;EACf,MAAM,QAAQ,KAAK;EACnB,MAAM,MAAuB,CAAC;EAC9B,IAAI,SAAS,SAAY,KAAK,SAAS,OAAO,IAAI;EAClD,MAAM,OACJ,MAAM,KAAK,MAAM,aAAa,CAAC,EAAE,MAAM,KACnC,IAAI,KAAoB,QAAQ,GAAG,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,IACjD,KAAA;EAEN,IAAI,OAAO,UAAU,YAAY;GAC/B,SAAS,SAAY;GACrB,QAAQ,MAAM,MAAM,OAAO,KAAK,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;GAClE,GAAG,OAAO,eAAe;EAC3B;EAEA,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC;EAEhC,MAAM,gBAAgB,MAAM,OAAO,KAAK;EAMxC,MAAM,OAAwB;GAAC,CAAC;GAAG,CAAC;GAAG,CAAC;EAAC;EACzC,IAAI,MAAM;EACV,IAAI,CAAC,MAAM,KAAK,KAAK;OAEnB,KAAK,MAAM,QAAQ,OAAO;GACxB,KAAK,MAAM;GACX,MAAM,KAAK;GACX,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC,KAAK,IAAI;QACzB,IAAI,GAAG,OAAO,KAAK,EAAE,CAAC,KAAK,IAAI;QAC/B,KAAK,EAAE,CAAC,KAAK,IAAI;EACxB;EAGF,MAAM,WAAW,CAAC,EAAE,MAAM,MAAM,KAAK,MAAM,UAAU;EAErD,IAAI,YAAY,YAAY,IAAI;EAChC,IAAI,QAAQ;EACZ,IAAI,QAAQ;EAEZ,MAAM,KAAK,MAAM,SAAS,MACxB,KAAK,MAAM,QAAQ,OAAO;GACxB,GAAG,OAAO,eAAe;GACzB,IAAI,UAAU,QAAQ,GAAG;IACvB,MAAM,MAAM,YAAY,IAAI;IAC5B,IAAI,MAAM,cAAc,KAAK,MAAM,YAAY,KAAK;KAClD,YAAY;KACZ,MAAM,IAAI,SAAS,MAAM,aAAa,CAAC,CAAC;KACxC,IAAI,KAAK,YAAY,OAAO;MAC1B,QAAQ;MACR,MAAM,KAAK,SAAS,QAAQ,CAAC;KAC/B;IACF;GACF;GACA,MAAM,KAAK,MAAM,IAAI;GACrB,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG;IAC5B,MAAM,WAAW,EAAE,GAAG,IAAI;IAC1B,GAAG,UAAU,IAAI,KAAK,IAAI,aAAa;GACzC;GACA,IAAI,YAAY,GAAG,UAAU,GAAG;GAChC,IAAI,MAAM;IACR,GAAG,OAAO;IACV,MAAM,KAAK,KAAK,IAAI,EAAE;IACtB,IAAI,GAAG,OAAO;KACZ,GAAG,OAAO;KACV,QAAQ;KACR,IAAI,GAAG,SAAS,GAAG,QAAQ,OAAO;IACpC;GACF,OAAO;IACL,IAAI,KAAK,EAAE;IACX,QAAQ;IACR,IAAI,IAAI,UAAU,OAAO,MAAM;GACjC;EACF;EAGF,OAAO,QAAQ;CACjB;CAEA,UAAU,GAAyB;EACjC,OAAO,KAAK,SAAS,UAAU,CAAC;CAClC;AACF;;;AC/HA,SAAS,OACP,OAC6B;CAC7B,OAAO,UAAU;AACnB;AAEA,MAAa,SAAS,QACgB,UAA4D;CAC9F,MAAM,UAAU,WAAW;EACzB,IAAI,MAAM,YAAY,KAAA,GAAW,OAAO,OAAO,MAAM,OAAO;EAE5D,QADY,MAAM,iBAAiB,QAAQ,MAAM,QAAQ,MAAM,QAAQ,EAAA,EAC3D,MAAM,SAAS;CAC7B,CAAC;CAED,IAAI;CACJ,IAAI;CACJ,IAAI,OAAO,KAAK,GAAG;EACjB,QAAQ;GAAE,QAAQ;GAAO,OAAO;GAAO,MAAM;GAAO,GAAG;EAAM;EAC7D,MAAM,IAAI,KAAK,KAAK;EACpB,OAAO;EACP,QAAQ,EAAE;CACZ,OAAO;EACL,OAAO,OAAO;GAAE,GAAG;GAAO,OAAO,CAAC;EAAE,CAAC;EACrC,QAAQ,MAAM;CAChB;CACA,MAAM,WAAW,IAAI,SAAY,KAAK;CAEtC,KAAK,gBAAgB,UAAU,MAAM,QAAQ;EAC3C,IAAI,MAAM,KAAK,MAAM,GAAG;EACxB,IAAI,CAAC,KAAK,OAAO,OAAO;EACxB,MAAM,WAAW,UAAU,GAAG;EAC9B,MAAM,YAAY,SAAS,UAAU,QAAQ,CAAC,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC;EACvE,OAAO,UAAU,SAAS,GAAG;GAC3B,MAAM,OAAO,UAAU,IAAI;GAC3B,IAAI,KAAK;GACT,OAAO,UAAU,UAAU,UAAU,GAAG,EAAE,MAAM,KAAK,GAAG,KAAK,UAAU,IAAI;GAC3E,MACE,UAAU,KAAK,GAAG,IAAI,IACtB,IAAI,MAAM,OAAO,SAAS,MAAM,MAAM,KAAK,CAAC,CAAC,IAC7C,UAAU,KAAK,KAAK,CAAC;EACzB;EACA,OAAO;CACT,CAAC;CAED,MAAM,UAAU,kBACd,OAAO,EAAE,UACP,MAAM,SAAS,OAAO,OAAO,KAAK,GAAG,QAAQ,GAAG,EAAE,WAAW,MAAM,IAAI,CAAC,EAAE,CAAC,GAC7E,EACE,cAAc,CAAC,EACjB,CACF;CACA,KAAK,MAAM,QAAQ;CACnB,IAAI,MAAM,OAAO,KAAK,KAAK,MAAM,KAAK;CAEtC,MAAM,gBACJ,OAAO,KAAK,MAAM,KAAK,CAAC,CACrB,KAAK,MAAM,MAAM,CAAC,MAAM,CAAC,CAAU,CAAC,CACpC,QAAQ,CAAC,UAAU,KAAK,KAAK,CAAC,CAC9B,KAAK,GAAG,OAAO,CAAC;CAErB,aAAa;EACX,MAAM,IAAI,QAAQ;EAClB,KAAK,MAAM,OAAO,EAAE,UAAU,SAAS;EACvC,IAAI,EAAE,WAAW,KAAK,QAAQ,MAAM,IAAI;EACxC,cAAc;GAGZ,IAAI,MAAM,WAAW,OAAO;IAC1B,MAAM,SAAS,KAAK;IACpB,KAAK,SAAS,EAAE,MAAM,MAAM,KAAK,MAAM,KAAK,EAAE;GAChD,OAAO,KAAK,SAAS;EACvB,CAAC;CACH,CAAC;CAED,OAAO,KAAK,YAAY;EACtB,GAAG,MAAM;EACT,qBAAqB;GACnB,MAAM,SAAS,KAAK;GACpB,MAAM,IAAI,QAAQ;GAClB,IAAI,EAAE,WAAW,GAAG,OAAO,KAAK,OAAO,aAAa;GACpD,KAAK,SAAS,KAAK,MAAM,UACpB,EAAE,WAAW,CAAC,CAAC,MAAM,MAAM,IAAI,MAAM,KAAK,EAAE,GAAG,EAAE,IACjD,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,EAAE;EACtC;EACA,qBAAqB;GACnB,MAAM,SAAS,KAAK;GACpB,MAAM,IAAI,QAAQ;GAClB,IAAI,EAAE,WAAW,GAAG,OAAO,KAAK,OAAO,aAAa;GACpD,KAAK,SAAS,KAAK,MAAM,UACpB,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,EAAE,KAC/B,EAAE,WAAW,CAAC,CAAC,MAAM,MAAM,IAAI,MAAM,KAAK,EAAE,GAAG,EAAE;EACxD;CACF,CAAC;AACH,CACF"}
@@ -1,5 +1,5 @@
1
- import { c as Color, f as Style, t as Theme } from "./types-C0EOLZDc.mjs";
2
- import { a as StyleBuilder, t as InspectOpts } from "./inspect-DPLRum7L.mjs";
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?: string | Style;
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?: string | Style;
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
- constructor(terminal: Terminal, current: (string | undefined)[], base: (string | undefined)[]);
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-Cvalgu6P.d.mts.map
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
- blend: "#222436",
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": "#222436",
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
- text: "inherit",
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
- subtle: "brightBlack",
210
- ui: { bg: "subtle" },
211
- overlay: { bg: "subtle" },
212
- highlight: { bg: "subtle" },
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: "subtle",
217
+ gutter: "bg-5",
219
218
  prompt: "inherit",
220
219
  border: "black",
221
220
  borderTitle: "title",
222
- code: { bg: "subtle" },
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: "muted",
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-BKXX_noZ.mjs");
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-3hLzS4ks.mjs.map
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-8Nuf5BrN.mjs";
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-f7M2856V.mjs.map
33
+ //# sourceMappingURL=render-DEIUNLkh.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-f7M2856V.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"}
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-D132G8dy.mjs"), import("./image-Cm5T-uw-.mjs")]);
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-DesbRwjQ.mjs.map
40
+ //# sourceMappingURL=renderer-MQue4Da5.mjs.map