niuma-ui 2.0.4 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/NOTICE +0 -1
  3. package/README.md +3 -3
  4. package/README.zh-CN.md +3 -3
  5. package/dist/components/_shared/index.d.ts +2 -2
  6. package/dist/components/_shared/src/overlay-utils.d.ts +44 -1
  7. package/dist/components/_shared/src/overlay-utils.js +87 -2
  8. package/dist/components/alert/index.d.ts +1 -0
  9. package/dist/components/alert/src/RsAlert.css +120 -65
  10. package/dist/components/alert/src/RsAlert.d.ts +24 -5
  11. package/dist/components/alert/src/RsAlert.impl.js +108 -36
  12. package/dist/components/alert/src/RsAlert.js +1 -1
  13. package/dist/components/alert/src/alert-utils.d.ts +37 -0
  14. package/dist/components/alert/src/alert-utils.js +71 -0
  15. package/dist/components/auto-complete/src/RsAutoComplete.d.ts +1 -1
  16. package/dist/components/button/src/RsButton.css +75 -72
  17. package/dist/components/button/src/RsButton.d.ts +1 -4
  18. package/dist/components/button/src/RsButton.impl.js +3 -7
  19. package/dist/components/button/src/RsButton.js +1 -1
  20. package/dist/components/card/src/RsCard.d.ts +1 -1
  21. package/dist/components/code-block/index.d.ts +1 -0
  22. package/dist/components/code-block/src/RsCodeBlock.css +93 -52
  23. package/dist/components/code-block/src/RsCodeBlock.d.ts +36 -9
  24. package/dist/components/code-block/src/RsCodeBlock.impl.js +203 -84
  25. package/dist/components/code-block/src/RsCodeBlock.js +1 -1
  26. package/dist/components/code-block/src/code-block-highlight.d.ts +4 -0
  27. package/dist/components/code-block/src/code-block-highlight.js +34 -0
  28. package/dist/components/code-block/src/code-block-utils.d.ts +23 -0
  29. package/dist/components/code-block/src/code-block-utils.js +71 -0
  30. package/dist/components/code-editor/index.d.ts +1 -1
  31. package/dist/components/code-editor/src/RsCodeEditor.css +118 -92
  32. package/dist/components/code-editor/src/RsCodeEditor.d.ts +14 -3
  33. package/dist/components/code-editor/src/RsCodeEditor.impl.js +261 -94
  34. package/dist/components/code-editor/src/RsCodeEditor.js +1 -1
  35. package/dist/components/code-editor/src/code-editor-utils.d.ts +15 -0
  36. package/dist/components/code-editor/src/code-editor-utils.js +36 -1
  37. package/dist/components/code-editor/src/code-mirror-completion.d.ts +1 -1
  38. package/dist/components/code-editor/src/code-mirror-completion.js +8 -5
  39. package/dist/components/code-editor/src/code-mirror-diagnostics.d.ts +2 -3
  40. package/dist/components/code-editor/src/code-mirror-diagnostics.js +3 -4
  41. package/dist/components/code-editor/src/code-mirror-ghost.d.ts +1 -1
  42. package/dist/components/code-editor/src/code-mirror-ghost.js +12 -3
  43. package/dist/components/code-editor/src/code-mirror-inline-edit.js +8 -3
  44. package/dist/components/code-editor/src/code-mirror-intel.d.ts +2 -2
  45. package/dist/components/code-editor/src/code-mirror-intel.js +50 -39
  46. package/dist/components/code-editor/src/code-mirror-lang.js +4 -0
  47. package/dist/components/code-editor/src/code-mirror-session.d.ts +13 -0
  48. package/dist/components/code-editor/src/code-mirror-session.js +30 -0
  49. package/dist/components/config-provider/src/RsConfigProvider.css +1 -1
  50. package/dist/components/config-provider/src/RsConfigProvider.d.ts +2 -2
  51. package/dist/components/config-provider/src/RsConfigProvider.impl.js +7 -16
  52. package/dist/components/config-provider/src/RsConfigProvider.js +1 -1
  53. package/dist/components/context-menu/index.d.ts +1 -1
  54. package/dist/components/context-menu/src/RsContextMenu.css +115 -89
  55. package/dist/components/context-menu/src/RsContextMenu.d.ts +32 -11
  56. package/dist/components/context-menu/src/RsContextMenu.impl.js +795 -48
  57. package/dist/components/context-menu/src/RsContextMenuItems.d.ts +25 -1
  58. package/dist/components/context-menu/src/RsContextMenuItems.impl.js +110 -61
  59. package/dist/components/context-menu/src/context-menu-utils.d.ts +89 -3
  60. package/dist/components/context-menu/src/context-menu-utils.js +168 -3
  61. package/dist/components/date-picker/src/RsDatePicker.d.ts +2 -2
  62. package/dist/components/date-picker/src/RsDateTimePicker.d.ts +2 -2
  63. package/dist/components/descriptions/index.d.ts +1 -1
  64. package/dist/components/descriptions/src/RsDescriptions.css +38 -11
  65. package/dist/components/descriptions/src/RsDescriptions.d.ts +20 -4
  66. package/dist/components/descriptions/src/RsDescriptions.impl.js +89 -19
  67. package/dist/components/descriptions/src/RsDescriptionsItem.impl.js +13 -6
  68. package/dist/components/descriptions/src/descriptions-utils.d.ts +19 -0
  69. package/dist/components/descriptions/src/descriptions-utils.js +39 -1
  70. package/dist/components/dialog/index.d.ts +1 -1
  71. package/dist/components/dialog/src/RsConfirmDialog.css +47 -21
  72. package/dist/components/dialog/src/RsConfirmDialog.d.ts +19 -7
  73. package/dist/components/dialog/src/RsConfirmDialog.impl.js +349 -119
  74. package/dist/components/dialog/src/RsConfirmDialog.js +2 -1
  75. package/dist/components/dialog/src/RsDialog.css +102 -109
  76. package/dist/components/dialog/src/RsDialog.d.ts +34 -24
  77. package/dist/components/dialog/src/RsDialog.impl.js +410 -177
  78. package/dist/components/dialog/src/RsDialog.js +2 -1
  79. package/dist/components/dialog/src/dialog-utils.d.ts +40 -1
  80. package/dist/components/dialog/src/dialog-utils.js +152 -1
  81. package/dist/components/dialog/src/dialog-window.js +29 -8
  82. package/dist/components/drawer/index.d.ts +1 -1
  83. package/dist/components/drawer/src/RsDrawer.css +61 -29
  84. package/dist/components/drawer/src/RsDrawer.d.ts +37 -21
  85. package/dist/components/drawer/src/RsDrawer.impl.js +441 -223
  86. package/dist/components/drawer/src/drawer-utils.d.ts +35 -0
  87. package/dist/components/drawer/src/drawer-utils.js +131 -1
  88. package/dist/components/dropdown/index.d.ts +1 -1
  89. package/dist/components/dropdown/src/RsDropdown.css +140 -61
  90. package/dist/components/dropdown/src/RsDropdown.d.ts +39 -6
  91. package/dist/components/dropdown/src/RsDropdown.impl.js +693 -63
  92. package/dist/components/dropdown/src/RsDropdownItemView.impl.js +17 -7
  93. package/dist/components/dropdown/src/RsDropdownItems.d.ts +32 -3
  94. package/dist/components/dropdown/src/RsDropdownItems.impl.js +171 -59
  95. package/dist/components/dropdown/src/dropdown-utils.d.ts +50 -0
  96. package/dist/components/dropdown/src/dropdown-utils.js +103 -3
  97. package/dist/components/empty/index.d.ts +1 -0
  98. package/dist/components/empty/src/RsEmpty.css +105 -23
  99. package/dist/components/empty/src/RsEmpty.d.ts +27 -4
  100. package/dist/components/empty/src/RsEmpty.impl.js +154 -11
  101. package/dist/components/empty/src/RsEmpty.js +2 -1
  102. package/dist/components/empty/src/empty-utils.d.ts +28 -0
  103. package/dist/components/empty/src/empty-utils.js +55 -0
  104. package/dist/components/form/src/RsForm.d.ts +1 -1
  105. package/dist/components/input-number/src/RsInputNumber.d.ts +1 -1
  106. package/dist/components/label/src/RsLabel.d.ts +1 -1
  107. package/dist/components/loading/index.d.ts +1 -0
  108. package/dist/components/loading/src/RsLoading.css +13 -97
  109. package/dist/components/loading/src/RsLoading.d.ts +52 -2
  110. package/dist/components/loading/src/RsLoading.impl.js +216 -33
  111. package/dist/components/loading/src/RsLoading.js +2 -1
  112. package/dist/components/loading/src/loading-status.css +210 -0
  113. package/dist/components/loading/src/loading-status.d.ts +34 -0
  114. package/dist/components/loading/src/loading-status.impl.js +84 -0
  115. package/dist/components/loading/src/loading-status.js +8 -0
  116. package/dist/components/loading/src/loading-utils.d.ts +51 -4
  117. package/dist/components/loading/src/loading-utils.js +122 -0
  118. package/dist/components/loading-bar/index.d.ts +1 -0
  119. package/dist/components/loading-bar/src/RsLoadingBar.css +72 -8
  120. package/dist/components/loading-bar/src/RsLoadingBar.d.ts +55 -11
  121. package/dist/components/loading-bar/src/RsLoadingBar.impl.js +298 -57
  122. package/dist/components/loading-bar/src/RsLoadingBar.js +1 -1
  123. package/dist/components/loading-bar/src/loading-bar-utils.d.ts +69 -0
  124. package/dist/components/loading-bar/src/loading-bar-utils.js +97 -0
  125. package/dist/components/log/src/RsLog.css +52 -144
  126. package/dist/components/log/src/RsLog.d.ts +12 -11
  127. package/dist/components/log/src/RsLog.impl.js +181 -148
  128. package/dist/components/log/src/RsLog.js +1 -1
  129. package/dist/components/log/src/RsLogRow.css +152 -0
  130. package/dist/components/log/src/RsLogRow.d.ts +35 -0
  131. package/dist/components/log/src/RsLogRow.impl.js +91 -0
  132. package/dist/components/log/src/RsLogRow.js +8 -0
  133. package/dist/components/log/src/log-utils.d.ts +8 -0
  134. package/dist/components/log/src/log-utils.js +71 -10
  135. package/dist/components/markdown/index.d.ts +1 -1
  136. package/dist/components/markdown/src/RsMarkdown.css +75 -32
  137. package/dist/components/markdown/src/RsMarkdown.d.ts +6 -2
  138. package/dist/components/markdown/src/RsMarkdown.impl.js +185 -17
  139. package/dist/components/markdown/src/markdown-utils.d.ts +26 -0
  140. package/dist/components/markdown/src/markdown-utils.js +114 -12
  141. package/dist/components/mentions/src/RsMentions.d.ts +2 -2
  142. package/dist/components/menu/index.d.ts +1 -1
  143. package/dist/components/menu/src/RsMenu.css +70 -29
  144. package/dist/components/menu/src/RsMenu.d.ts +58 -4
  145. package/dist/components/menu/src/RsMenu.impl.js +93 -46
  146. package/dist/components/menu/src/RsMenuItems.d.ts +22 -5
  147. package/dist/components/menu/src/RsMenuItems.impl.js +506 -154
  148. package/dist/components/menu/src/menu-utils.d.ts +56 -0
  149. package/dist/components/menu/src/menu-utils.js +139 -6
  150. package/dist/components/monaco-editor/index.d.ts +1 -1
  151. package/dist/components/monaco-editor/src/RsMonacoEditor.css +28 -16
  152. package/dist/components/monaco-editor/src/RsMonacoEditor.d.ts +39 -41
  153. package/dist/components/monaco-editor/src/RsMonacoEditor.impl.js +212 -133
  154. package/dist/components/monaco-editor/src/RsMonacoEditor.js +1 -1
  155. package/dist/components/monaco-editor/src/monaco-editor-utils.d.ts +126 -0
  156. package/dist/components/monaco-editor/src/monaco-editor-utils.js +302 -0
  157. package/dist/components/pagination/index.d.ts +2 -2
  158. package/dist/components/pagination/src/RsPagination.css +93 -46
  159. package/dist/components/pagination/src/RsPagination.d.ts +68 -8
  160. package/dist/components/pagination/src/RsPagination.impl.js +229 -86
  161. package/dist/components/pagination/src/RsPagination.js +1 -1
  162. package/dist/components/pagination/src/pagination-utils.d.ts +59 -0
  163. package/dist/components/pagination/src/pagination-utils.js +105 -1
  164. package/dist/components/popover/index.d.ts +1 -0
  165. package/dist/components/popover/src/RsPopover.css +124 -14
  166. package/dist/components/popover/src/RsPopover.d.ts +38 -7
  167. package/dist/components/popover/src/RsPopover.impl.js +546 -35
  168. package/dist/components/popover/src/RsPopover.js +2 -1
  169. package/dist/components/popover/src/popover-utils.d.ts +24 -2
  170. package/dist/components/popover/src/popover-utils.js +55 -0
  171. package/dist/components/sidebar/index.d.ts +1 -0
  172. package/dist/components/sidebar/src/RsSidebar.css +91 -33
  173. package/dist/components/sidebar/src/RsSidebar.d.ts +17 -9
  174. package/dist/components/sidebar/src/RsSidebar.impl.js +124 -22
  175. package/dist/components/sidebar/src/RsSidebar.js +1 -1
  176. package/dist/components/sidebar/src/RsSidebarGroup.css +23 -6
  177. package/dist/components/sidebar/src/RsSidebarGroup.d.ts +6 -2
  178. package/dist/components/sidebar/src/RsSidebarGroup.impl.js +17 -4
  179. package/dist/components/sidebar/src/RsSidebarGroup.js +1 -1
  180. package/dist/components/sidebar/src/RsSidebarItem.css +50 -20
  181. package/dist/components/sidebar/src/RsSidebarItem.d.ts +21 -3
  182. package/dist/components/sidebar/src/RsSidebarItem.impl.js +71 -20
  183. package/dist/components/sidebar/src/RsSidebarItem.js +1 -1
  184. package/dist/components/sidebar/src/sidebar-utils.d.ts +47 -0
  185. package/dist/components/sidebar/src/sidebar-utils.js +72 -0
  186. package/dist/components/split-pane/index.d.ts +2 -2
  187. package/dist/components/split-pane/src/RsSplitPane.css +41 -30
  188. package/dist/components/split-pane/src/RsSplitPane.d.ts +6 -2
  189. package/dist/components/split-pane/src/RsSplitPane.impl.js +153 -45
  190. package/dist/components/split-pane/src/split-pane-utils.d.ts +23 -0
  191. package/dist/components/split-pane/src/split-pane-utils.js +18 -1
  192. package/dist/components/stat-card/index.d.ts +1 -0
  193. package/dist/components/stat-card/src/RsStatCard.css +129 -25
  194. package/dist/components/stat-card/src/RsStatCard.d.ts +40 -4
  195. package/dist/components/stat-card/src/RsStatCard.impl.js +106 -12
  196. package/dist/components/stat-card/src/RsStatCard.js +1 -1
  197. package/dist/components/stat-card/src/stat-card-utils.d.ts +39 -0
  198. package/dist/components/stat-card/src/stat-card-utils.js +113 -0
  199. package/dist/components/steps/index.d.ts +1 -1
  200. package/dist/components/steps/src/RsSteps.css +158 -37
  201. package/dist/components/steps/src/RsSteps.d.ts +69 -5
  202. package/dist/components/steps/src/RsSteps.impl.js +168 -28
  203. package/dist/components/steps/src/RsSteps.js +1 -1
  204. package/dist/components/steps/src/steps-utils.d.ts +51 -1
  205. package/dist/components/steps/src/steps-utils.js +67 -1
  206. package/dist/components/table/src/RsTable.impl.js +4 -2
  207. package/dist/components/table/src/composables/useRsTableContextMenu.d.ts +16 -0
  208. package/dist/components/table/src/composables/useRsTableContextMenu.js +1 -1
  209. package/dist/components/table/src/composables/useRsTableEngine.js +6 -2
  210. package/dist/components/table/src/composables/useRsTableScrollLayout.js +2 -0
  211. package/dist/components/table/src/composables/useRsTableShell.d.ts +16 -0
  212. package/dist/components/table/src/rs-table-props.d.ts +1 -1
  213. package/dist/components/table/src/rs-table-props.js +0 -1
  214. package/dist/components/table/src/table-body/RsTableBody.impl.js +1 -0
  215. package/dist/components/table/src/table-body/RsTableCell.impl.js +1 -1
  216. package/dist/components/table/src/table-body/RsTableCellEditor.impl.js +10 -2
  217. package/dist/components/table/src/table-body/RsTableColGroup.impl.js +1 -0
  218. package/dist/components/table/src/table-footer/RsTableSummaryRow.impl.js +1 -0
  219. package/dist/components/table/src/table-header/RsTableHeader.impl.js +1 -0
  220. package/dist/components/table/src/utils/table-utils.d.ts +10 -6
  221. package/dist/components/table/src/utils/table-utils.js +27 -25
  222. package/dist/components/table/style/rs-table.css +86 -28
  223. package/dist/components/tabs/index.d.ts +2 -2
  224. package/dist/components/tabs/src/RsTabs.css +225 -101
  225. package/dist/components/tabs/src/RsTabs.d.ts +37 -8
  226. package/dist/components/tabs/src/RsTabs.impl.js +400 -270
  227. package/dist/components/tabs/src/tabs-utils.d.ts +41 -2
  228. package/dist/components/tabs/src/tabs-utils.js +55 -1
  229. package/dist/components/terminal/index.d.ts +1 -1
  230. package/dist/components/terminal/src/RsTerminal.css +60 -37
  231. package/dist/components/terminal/src/RsTerminal.d.ts +36 -4
  232. package/dist/components/terminal/src/RsTerminal.impl.js +288 -68
  233. package/dist/components/terminal/src/RsTerminal.js +1 -1
  234. package/dist/components/terminal/src/terminal-utils.d.ts +42 -4
  235. package/dist/components/terminal/src/terminal-utils.js +113 -10
  236. package/dist/components/textarea/src/RsTextarea.d.ts +1 -1
  237. package/dist/components/time-picker/src/RsTimePicker.d.ts +2 -2
  238. package/dist/components/toaster/src/RsToaster.css +156 -203
  239. package/dist/components/toaster/src/RsToaster.d.ts +32 -2
  240. package/dist/components/toaster/src/RsToaster.impl.js +309 -34
  241. package/dist/components/toaster/src/toast-store.d.ts +95 -0
  242. package/dist/components/toaster/src/toast-store.js +177 -0
  243. package/dist/components/toaster/src/toast-utils.d.ts +60 -0
  244. package/dist/components/toaster/src/toast-utils.js +86 -0
  245. package/dist/components/toolbar/index.d.ts +1 -1
  246. package/dist/components/toolbar/src/RsToolbar.css +206 -32
  247. package/dist/components/toolbar/src/RsToolbar.d.ts +41 -16
  248. package/dist/components/toolbar/src/RsToolbar.impl.js +146 -18
  249. package/dist/components/toolbar/src/RsToolbar.js +2 -1
  250. package/dist/components/toolbar/src/toolbar-utils.d.ts +20 -0
  251. package/dist/components/toolbar/src/toolbar-utils.js +105 -0
  252. package/dist/components/tooltip/index.d.ts +1 -0
  253. package/dist/components/tooltip/src/RsTooltip.css +104 -26
  254. package/dist/components/tooltip/src/RsTooltip.d.ts +38 -16
  255. package/dist/components/tooltip/src/RsTooltip.impl.js +420 -51
  256. package/dist/components/tooltip/src/RsTooltip.js +2 -1
  257. package/dist/components/tooltip/src/RsTooltipProvider.d.ts +4 -4
  258. package/dist/components/tooltip/src/RsTooltipProvider.impl.js +51 -14
  259. package/dist/components/tooltip/src/tooltip-utils.d.ts +30 -0
  260. package/dist/components/tooltip/src/tooltip-utils.js +23 -0
  261. package/dist/components/tree/index.d.ts +2 -2
  262. package/dist/components/tree/src/RsTree.css +84 -75
  263. package/dist/components/tree/src/RsTree.d.ts +20 -20
  264. package/dist/components/tree/src/RsTree.impl.js +292 -66
  265. package/dist/components/tree/src/RsTree.js +1 -1
  266. package/dist/components/tree/src/tree-utils.d.ts +22 -0
  267. package/dist/components/tree/src/tree-utils.js +18 -4
  268. package/dist/components/tree-select/src/RsTreeSelect.d.ts +1 -1
  269. package/dist/components/virtual-list/index.d.ts +1 -1
  270. package/dist/components/virtual-list/src/RsVirtualList.css +64 -9
  271. package/dist/components/virtual-list/src/RsVirtualList.d.ts +31 -5
  272. package/dist/components/virtual-list/src/RsVirtualList.impl.js +425 -76
  273. package/dist/components/virtual-list/src/RsVirtualList.js +1 -1
  274. package/dist/components/virtual-list/src/virtual-list-utils.d.ts +64 -1
  275. package/dist/components/virtual-list/src/virtual-list-utils.js +215 -1
  276. package/dist/composables/useRsLoadingBar.d.ts +2 -5
  277. package/dist/composables/useRsLoadingBar.js +21 -5
  278. package/dist/composables/useRsTabsNav.d.ts +3 -1
  279. package/dist/composables/useRsTabsNav.js +96 -28
  280. package/dist/composables/useRsToast.d.ts +11 -13
  281. package/dist/composables/useRsToast.js +66 -17
  282. package/dist/index.d.ts +30 -21
  283. package/dist/index.js +14 -0
  284. package/dist/locale/apply.js +6 -1
  285. package/dist/locale/messages.js +128 -2
  286. package/dist/styles.css +465 -808
  287. package/dist/theme/brand.example.css +3 -2
  288. package/dist/vite-plugins/niuma-ui-host.js +1 -1
  289. package/package.json +2 -5
  290. package/dist/components/_shared/src/reka.d.ts +0 -2
  291. package/dist/components/_shared/src/reka.js +0 -2
@@ -3,17 +3,28 @@ import RsLoading_default from "../../loading/src/RsLoading.js";
3
3
  import RsContextMenu_default from "../../context-menu/src/RsContextMenu.js";
4
4
  import { beginClipboardPrefetch, copyTextToClipboard, readClipboardText } from "../../../utils/rs-clipboard.js";
5
5
  import { readTerminalFontFamily, readTerminalFontSizePx, readTerminalFontWeight, readTerminalFontWeightBold } from "../../../theme/css-token.js";
6
- import { mergeTerminalTheme, needsPtyWriteViewportPrep, prepareTerminalForPtyWrite, proposeTerminalGeometry, readXtermCssCellSize, resolveTerminalTheme, terminalShortcutLabel } from "./terminal-utils.js";
6
+ import { findTerminalHttpLinks, isSafeTerminalLink, mergeTerminalTheme, needsPtyWriteViewportPrep, prepareTerminalForPtyWrite, proposeTerminalGeometry, readXtermCssCellSize, resolveTerminalTheme, subscribeTerminalTheme, terminalLinkCellRange, terminalShortcutLabel } from "./terminal-utils.js";
7
7
  import { attachWheelScrollGuard, isAlternateTerminalBuffer } from "./terminal-wheel.js";
8
- import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeProps, nextTick, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderSlot, toDisplayString, unref, vModelText, watch, withCtx, withDirectives, withModifiers } from "vue";
8
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeProps, nextTick, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderSlot, toDisplayString, unref, useId, vModelText, watch, withCtx, withDirectives, withModifiers } from "vue";
9
9
  import { FitAddon } from "@xterm/addon-fit";
10
10
  import { SearchAddon } from "@xterm/addon-search";
11
11
  import { Terminal } from "@xterm/xterm";
12
12
  import "@xterm/xterm/css/xterm.css";
13
13
  //#region src/components/terminal/src/RsTerminal.vue?vue&type=script&setup=true&lang.ts
14
- var _hoisted_1 = ["placeholder", "aria-label"];
15
- var _hoisted_2 = { key: 0 };
16
- var _hoisted_3 = {
14
+ var _hoisted_1 = [
15
+ "id",
16
+ "aria-label",
17
+ "aria-busy",
18
+ "aria-readonly"
19
+ ];
20
+ var _hoisted_2 = [
21
+ "placeholder",
22
+ "aria-label",
23
+ "aria-describedby"
24
+ ];
25
+ var _hoisted_3 = ["id"];
26
+ var _hoisted_4 = { key: 0 };
27
+ var _hoisted_5 = {
17
28
  key: 1,
18
29
  class: "rs-terminal__overlay-action"
19
30
  };
@@ -22,6 +33,7 @@ var TERMINAL_LINE_HEIGHT = 1.2;
22
33
  /** 令牌缺省字号;仅在挂载前(含 SSR)占位,挂载后由 syncResolvedFontSize 换成实测值。 */
23
34
  var FALLBACK_FONT_SIZE_PX = 14;
24
35
  var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
36
+ name: "RsTerminal",
25
37
  inheritAttrs: false,
26
38
  __name: "RsTerminal",
27
39
  props: {
@@ -87,6 +99,21 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
87
99
  type: Boolean,
88
100
  default: false
89
101
  },
102
+ cursorStyle: { default: "block" },
103
+ screenReaderMode: {
104
+ type: Boolean,
105
+ default: false
106
+ },
107
+ openLinks: {
108
+ type: Boolean,
109
+ default: true
110
+ },
111
+ rescaleOverlappingGlyphs: {
112
+ type: Boolean,
113
+ default: true
114
+ },
115
+ ariaLabel: {},
116
+ id: {},
90
117
  minimumContrastRatio: { default: 4.5 }
91
118
  },
92
119
  emits: [
@@ -96,17 +123,24 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
96
123
  "action",
97
124
  "askAi",
98
125
  "selectionChange",
99
- "extraSelect"
126
+ "extraSelect",
127
+ "titleChange",
128
+ "bell",
129
+ "link"
100
130
  ],
101
131
  setup(__props, { expose: __expose, emit: __emit }) {
102
132
  const props = __props;
103
133
  const emit = __emit;
104
134
  const { t } = useRsI18n();
105
135
  const hostEl = ref(null);
136
+ const regionLabel = computed(() => props.ariaLabel || t("terminal.label", "Terminal"));
106
137
  const terminalReady = ref(false);
107
138
  const hasSelection = ref(false);
108
- /** 右键菜单打开瞬间的选区快照(capture 阶段,早于 xterm word-select) */
109
- const menuSelectionSnapshot = ref("");
139
+ /**
140
+ * 右键打开前的选区文本。不用 ref:菜单禁用只看 hasSelection,
141
+ * 避免大段文本写回响应式数据时把菜单再排一次。
142
+ */
143
+ let menuSelectionText = "";
110
144
  const resolvedThemeMode = ref(resolveTerminalTheme(props.themeMode));
111
145
  /** fit 后量一次真实行高,避免亚像素漂移;非每帧更新 */
112
146
  const zebraRowStepPx = ref(null);
@@ -148,13 +182,14 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
148
182
  label: t("terminal.copy", "Copy"),
149
183
  icon: "copy",
150
184
  shortcut: terminalShortcutLabel("C"),
151
- disabled: false
185
+ disabled: !hasSelection.value
152
186
  },
153
187
  {
154
188
  key: "paste",
155
189
  label: t("terminal.paste", "Paste"),
156
190
  icon: "clipboard-paste",
157
- shortcut: terminalShortcutLabel("V")
191
+ shortcut: terminalShortcutLabel("V"),
192
+ disabled: !props.inputEnabled
158
193
  },
159
194
  {
160
195
  key: "selectAll",
@@ -177,7 +212,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
177
212
  key: "askAi",
178
213
  label: t("terminal.askAi", "Ask AI"),
179
214
  icon: "bot",
180
- disabled: !hasSelection.value && !menuSelectionSnapshot.value
215
+ disabled: !hasSelection.value
181
216
  });
182
217
  if (props.extraContextMenuItems?.length) items.push({
183
218
  key: "sep-extra",
@@ -199,24 +234,53 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
199
234
  });
200
235
  const searchOpen = ref(false);
201
236
  const searchQuery = ref("");
237
+ const searchStatus = ref("");
202
238
  const searchInputEl = ref(null);
239
+ const searchStatusId = useId();
203
240
  let terminal = null;
204
241
  let fitAddon = null;
205
242
  let searchAddon = null;
206
243
  let resizeObserver = null;
207
- let themeObserver = null;
244
+ let unsubscribeTheme = null;
208
245
  let detachWheelGuard = null;
246
+ let dataDisposable = null;
247
+ let selectionDisposable = null;
248
+ let titleDisposable = null;
249
+ let bellDisposable = null;
250
+ let linkDisposable = null;
251
+ let motionMedia = null;
209
252
  let lastGeometry = {
210
253
  cols: 0,
211
254
  rows: 0
212
255
  };
213
256
  let fitRaf = 0;
257
+ let selectionFrame = 0;
214
258
  let didInitialFit = false;
259
+ let alive = true;
215
260
  function resolveAllowTransparency() {
216
261
  return props.allowTransparency || props.zebraStripes;
217
262
  }
218
263
  function buildXtermTheme() {
219
- return mergeTerminalTheme(resolvedThemeMode.value, props.theme);
264
+ return mergeTerminalTheme(resolvedThemeMode.value, props.theme, hostEl.value);
265
+ }
266
+ function prefersReducedMotion() {
267
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
268
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
269
+ }
270
+ function syncCursorBlink() {
271
+ if (!terminal) return;
272
+ terminal.options.cursorBlink = props.cursorBlink && !prefersReducedMotion();
273
+ }
274
+ function onMotionPreference() {
275
+ syncCursorBlink();
276
+ }
277
+ function syncInputEnabled() {
278
+ if (!terminal) return;
279
+ terminal.options.disableStdin = !props.inputEnabled;
280
+ }
281
+ function labelTerminalInput() {
282
+ const textarea = hostEl.value?.querySelector("textarea");
283
+ if (textarea instanceof HTMLTextAreaElement) textarea.setAttribute("aria-label", regionLabel.value);
220
284
  }
221
285
  function applyThemeToTerminal() {
222
286
  if (!terminal) return;
@@ -242,7 +306,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
242
306
  });
243
307
  }
244
308
  function refreshResolvedTheme() {
245
- resolvedThemeMode.value = resolveTerminalTheme(props.themeMode);
309
+ resolvedThemeMode.value = resolveTerminalTheme(props.themeMode, hostEl.value);
246
310
  applyThemeToTerminal();
247
311
  }
248
312
  function currentGeometry() {
@@ -265,7 +329,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
265
329
  emit("resize", geometry);
266
330
  }
267
331
  async function fit() {
268
- if (!fitAddon || !terminal || !hostEl.value) return;
332
+ if (!alive || !fitAddon || !terminal || !hostEl.value) return;
269
333
  const { clientWidth, clientHeight } = hostEl.value;
270
334
  if (clientWidth <= 0 || clientHeight <= 0) return;
271
335
  if (!didInitialFit) {
@@ -273,7 +337,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
273
337
  await nextTick();
274
338
  await rafTwice();
275
339
  }
276
- if (!fitAddon || !terminal) return;
340
+ if (!alive || !fitAddon || !terminal || !hostEl.value) return;
277
341
  try {
278
342
  fitAddon.fit();
279
343
  } catch {}
@@ -308,9 +372,10 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
308
372
  if (nextRows < terminal.rows) terminal.resize(terminal.cols, nextRows);
309
373
  }
310
374
  function scheduleFit() {
311
- if (fitRaf) return;
375
+ if (!alive || fitRaf) return;
312
376
  fitRaf = requestAnimationFrame(() => {
313
377
  fitRaf = 0;
378
+ if (!alive) return;
314
379
  fit();
315
380
  });
316
381
  }
@@ -332,37 +397,61 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
332
397
  return String(terminal?.getSelection?.() ?? "");
333
398
  }
334
399
  function syncSelectionState() {
335
- hasSelection.value = Boolean(terminal?.hasSelection());
336
- emit("selectionChange", getSelectionText());
400
+ const text = getSelectionText();
401
+ const selected = Boolean(terminal?.hasSelection());
402
+ if (hasSelection.value !== selected) hasSelection.value = selected;
403
+ menuSelectionText = selected ? text.trim() : "";
404
+ emit("selectionChange", text);
405
+ }
406
+ /** 选区文本留到下一帧再序列化,右键和松开鼠标先把画面画完。 */
407
+ function scheduleSelectionText() {
408
+ if (selectionFrame) return;
409
+ selectionFrame = requestAnimationFrame(() => {
410
+ selectionFrame = 0;
411
+ if (!alive) return;
412
+ syncSelectionState();
413
+ });
337
414
  }
338
- /** 优先活选区;若被右键 word-select / 失焦冲掉,则回退菜单快照。 */
415
+ /** 优先活选区;菜单抢走焦点后回退打开时记下的文本。 */
339
416
  function resolveMenuSelectionText() {
340
417
  const live = getSelectionText().trim();
341
- const snap = menuSelectionSnapshot.value.trim();
342
- if (live && (!snap || live.length >= snap.length)) return live;
343
- return snap;
418
+ if (live) return live;
419
+ return menuSelectionText;
420
+ }
421
+ function ensureSearchAddon() {
422
+ if (!terminal || !props.searchEnabled) return null;
423
+ if (!searchAddon) {
424
+ searchAddon = new SearchAddon();
425
+ terminal.loadAddon(searchAddon);
426
+ }
427
+ return searchAddon;
344
428
  }
345
429
  function openSearch() {
346
- if (!props.searchEnabled) return;
430
+ if (!props.searchEnabled || !alive) return;
431
+ ensureSearchAddon();
347
432
  searchOpen.value = true;
433
+ searchStatus.value = "";
348
434
  nextTick(() => {
435
+ if (!alive) return;
349
436
  searchInputEl.value?.focus();
350
437
  searchInputEl.value?.select();
351
438
  });
352
439
  }
353
440
  function closeSearch() {
354
441
  searchOpen.value = false;
442
+ searchStatus.value = "";
355
443
  searchAddon?.clearDecorations();
356
- terminal?.focus();
444
+ if (alive) terminal?.focus();
357
445
  }
358
446
  function runSearch(direction) {
359
447
  const query = searchQuery.value;
360
- if (!query || !searchAddon) return;
361
- if (direction === "prev") {
362
- searchAddon.findPrevious(query);
448
+ const addon = ensureSearchAddon();
449
+ if (!query || !addon) {
450
+ searchStatus.value = "";
363
451
  return;
364
452
  }
365
- searchAddon.findNext(query);
453
+ const found = direction === "prev" ? addon.findPrevious(query) : addon.findNext(query);
454
+ searchStatus.value = found ? "" : t("terminal.searchEmpty", "No matches");
366
455
  }
367
456
  function onSearchKeydown(event) {
368
457
  if (event.key === "Escape") {
@@ -370,7 +459,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
370
459
  closeSearch();
371
460
  return;
372
461
  }
373
- if (event.key === "Enter") {
462
+ if (event.key === "Enter" && !event.isComposing) {
374
463
  event.preventDefault();
375
464
  runSearch(event.shiftKey ? "prev" : "next");
376
465
  }
@@ -381,32 +470,35 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
381
470
  }
382
471
  async function copySelection() {
383
472
  const text = resolveMenuSelectionText();
384
- if (!text) return;
385
- if (await copyTextToClipboard(text)) emit("action", "copy");
473
+ if (!text || !alive) return;
474
+ const copied = await copyTextToClipboard(text);
475
+ if (!alive || !copied) return;
476
+ emit("action", "copy");
386
477
  }
387
478
  async function pasteFromClipboard() {
388
- if (!terminal || !props.inputEnabled) return;
479
+ if (!alive || !terminal || !props.inputEnabled) return;
389
480
  terminal.focus();
390
481
  const textarea = terminal.element?.querySelector("textarea");
391
482
  if (textarea instanceof HTMLTextAreaElement) textarea.focus();
392
483
  const text = await readClipboardText();
393
- if (!text) return;
484
+ if (!alive || !text || !terminal) return;
394
485
  terminal.paste(text);
395
486
  emit("action", "paste");
396
487
  }
397
488
  function onTerminalContextMenu() {
398
489
  beginClipboardPrefetch();
399
- const existing = getSelectionText().trim();
400
- if (existing) {
401
- menuSelectionSnapshot.value = existing;
402
- hasSelection.value = true;
403
- } else menuSelectionSnapshot.value = "";
404
- nextTick(() => {
405
- syncSelectionState();
406
- const after = getSelectionText().trim();
407
- if (after && (!menuSelectionSnapshot.value || after.length > menuSelectionSnapshot.value.length)) menuSelectionSnapshot.value = after;
408
- if (menuSelectionSnapshot.value) hasSelection.value = true;
409
- });
490
+ const term = terminal;
491
+ if (!term) return;
492
+ const selected = Boolean(term.hasSelection());
493
+ if (selected && props.rightClickSelectsWord) {
494
+ term.options.rightClickSelectsWord = false;
495
+ queueMicrotask(() => {
496
+ if (alive && terminal) terminal.options.rightClickSelectsWord = props.rightClickSelectsWord;
497
+ });
498
+ }
499
+ if (hasSelection.value !== selected) hasSelection.value = selected;
500
+ if (!selected) menuSelectionText = "";
501
+ scheduleSelectionText();
410
502
  }
411
503
  function selectAll() {
412
504
  terminal?.selectAll();
@@ -512,8 +604,23 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
512
604
  terminal.options.fontWeightBold = resolveTerminalFontWeightBold();
513
605
  fit();
514
606
  });
515
- watch(() => props.cursorBlink, (value) => {
516
- if (terminal) terminal.options.cursorBlink = value;
607
+ watch(() => props.cursorBlink, syncCursorBlink);
608
+ watch(() => props.cursorStyle, (value) => {
609
+ if (terminal) terminal.options.cursorStyle = value;
610
+ });
611
+ watch(() => props.inputEnabled, syncInputEnabled);
612
+ watch(regionLabel, labelTerminalInput);
613
+ watch(searchQuery, () => {
614
+ searchStatus.value = "";
615
+ });
616
+ watch(() => props.screenReaderMode, (value) => {
617
+ if (terminal) terminal.options.screenReaderMode = value;
618
+ });
619
+ watch(() => props.rescaleOverlappingGlyphs, (value) => {
620
+ if (terminal) terminal.options.rescaleOverlappingGlyphs = value;
621
+ });
622
+ watch(() => props.searchEnabled, (value) => {
623
+ if (!value) closeSearch();
517
624
  });
518
625
  watch(() => props.convertEol, (value) => {
519
626
  if (terminal) terminal.options.convertEol = value;
@@ -534,11 +641,80 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
534
641
  watch(() => props.minimumContrastRatio, (value) => {
535
642
  if (terminal) terminal.options.minimumContrastRatio = value;
536
643
  });
644
+ function releaseDisposable(handle) {
645
+ handle?.dispose();
646
+ }
647
+ function openTerminalLink(raw) {
648
+ const text = raw.trim();
649
+ if (!alive || !isSafeTerminalLink(text)) return;
650
+ emit("link", text);
651
+ if (!props.openLinks || typeof window === "undefined") return;
652
+ window.open(text, "_blank", "noopener,noreferrer");
653
+ }
654
+ function attachLinkProvider() {
655
+ if (!terminal) return;
656
+ linkDisposable = terminal.registerLinkProvider({ provideLinks(bufferLineNumber, callback) {
657
+ const term = terminal;
658
+ if (!alive || !term) {
659
+ callback(void 0);
660
+ return;
661
+ }
662
+ const row = term.buffer.active.getLine(bufferLineNumber - 1);
663
+ if (!row) {
664
+ callback(void 0);
665
+ return;
666
+ }
667
+ const hits = findTerminalHttpLinks(row.translateToString(true));
668
+ if (!hits.length) {
669
+ callback(void 0);
670
+ return;
671
+ }
672
+ const cells = [];
673
+ for (let index = 0; index < row.length; index += 1) {
674
+ const cell = row.getCell(index);
675
+ cells.push({
676
+ chars: cell?.getChars() || "",
677
+ width: cell?.getWidth() ?? 1
678
+ });
679
+ }
680
+ callback(hits.map((hit) => {
681
+ const range = terminalLinkCellRange(cells, hit.start, hit.end);
682
+ return {
683
+ text: hit.text,
684
+ range: {
685
+ start: {
686
+ x: range.startX,
687
+ y: bufferLineNumber
688
+ },
689
+ end: {
690
+ x: range.endX,
691
+ y: bufferLineNumber
692
+ }
693
+ },
694
+ activate(_event, uri) {
695
+ openTerminalLink(uri);
696
+ }
697
+ };
698
+ }));
699
+ } });
700
+ }
701
+ function attachMotionPreference() {
702
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
703
+ motionMedia = window.matchMedia("(prefers-reduced-motion: reduce)");
704
+ motionMedia.addEventListener("change", onMotionPreference);
705
+ }
706
+ function detachMotionPreference() {
707
+ motionMedia?.removeEventListener("change", onMotionPreference);
708
+ motionMedia = null;
709
+ }
537
710
  onMounted(async () => {
711
+ alive = true;
538
712
  if (!hostEl.value) return;
539
713
  refreshResolvedTheme();
540
714
  terminal = new Terminal({
541
- cursorBlink: props.cursorBlink,
715
+ cursorBlink: props.cursorBlink && !prefersReducedMotion(),
716
+ cursorStyle: props.cursorStyle,
717
+ disableStdin: !props.inputEnabled,
542
718
  fontFamily: resolveTerminalFontFamily(),
543
719
  fontSize: resolveTerminalFontSize(),
544
720
  fontWeight: resolveTerminalFontWeight(),
@@ -551,40 +727,56 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
551
727
  scrollback: props.scrollback,
552
728
  convertEol: props.convertEol,
553
729
  rightClickSelectsWord: props.rightClickSelectsWord,
554
- theme: buildXtermTheme()
730
+ screenReaderMode: props.screenReaderMode,
731
+ rescaleOverlappingGlyphs: props.rescaleOverlappingGlyphs,
732
+ theme: buildXtermTheme(),
733
+ linkHandler: { activate(_event, text) {
734
+ openTerminalLink(text);
735
+ } }
555
736
  });
556
737
  fitAddon = new FitAddon();
557
738
  terminal.loadAddon(fitAddon);
558
- searchAddon = new SearchAddon();
559
- terminal.loadAddon(searchAddon);
739
+ if (props.searchEnabled) ensureSearchAddon();
560
740
  terminal.open(hostEl.value);
561
- terminal.onData((data) => {
562
- if (props.inputEnabled) emit("data", data);
741
+ labelTerminalInput();
742
+ dataDisposable = terminal.onData((data) => {
743
+ if (alive && props.inputEnabled) emit("data", data);
563
744
  });
564
- terminal.onSelectionChange(() => {
565
- syncSelectionState();
745
+ selectionDisposable = terminal.onSelectionChange(() => {
746
+ if (!alive || !terminal) return;
747
+ const selected = Boolean(terminal.hasSelection());
748
+ if (hasSelection.value !== selected) hasSelection.value = selected;
749
+ scheduleSelectionText();
750
+ });
751
+ titleDisposable = terminal.onTitleChange((title) => {
752
+ if (alive) emit("titleChange", title);
566
753
  });
754
+ bellDisposable = terminal.onBell(() => {
755
+ if (alive) emit("bell");
756
+ });
757
+ attachLinkProvider();
567
758
  attachShortcuts();
759
+ attachMotionPreference();
568
760
  await nextTick();
761
+ if (!alive || !terminal || !hostEl.value) return;
569
762
  attachWheelGuard();
570
763
  terminalReady.value = true;
571
764
  await fit();
765
+ if (!alive || !terminal || !hostEl.value) return;
572
766
  emit("ready");
573
767
  resizeObserver = new ResizeObserver(() => {
574
768
  scheduleFit();
575
769
  });
576
770
  resizeObserver.observe(hostEl.value);
577
- themeObserver = new MutationObserver(() => {
578
- if (props.themeMode === "auto") refreshResolvedTheme();
579
- });
580
- themeObserver.observe(document.documentElement, {
581
- attributes: true,
582
- attributeFilter: ["data-rs-theme"]
771
+ unsubscribeTheme = subscribeTerminalTheme(() => {
772
+ if (alive && props.themeMode === "auto") refreshResolvedTheme();
583
773
  });
584
774
  });
585
775
  onBeforeUnmount(() => {
586
- themeObserver?.disconnect();
587
- themeObserver = null;
776
+ alive = false;
777
+ unsubscribeTheme?.();
778
+ unsubscribeTheme = null;
779
+ detachMotionPreference();
588
780
  resizeObserver?.disconnect();
589
781
  resizeObserver = null;
590
782
  detachWheelGuard?.();
@@ -593,10 +785,25 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
593
785
  cancelAnimationFrame(fitRaf);
594
786
  fitRaf = 0;
595
787
  }
788
+ if (selectionFrame) {
789
+ cancelAnimationFrame(selectionFrame);
790
+ selectionFrame = 0;
791
+ }
792
+ releaseDisposable(dataDisposable);
793
+ releaseDisposable(selectionDisposable);
794
+ releaseDisposable(titleDisposable);
795
+ releaseDisposable(bellDisposable);
796
+ releaseDisposable(linkDisposable);
797
+ dataDisposable = null;
798
+ selectionDisposable = null;
799
+ titleDisposable = null;
800
+ bellDisposable = null;
801
+ linkDisposable = null;
802
+ searchAddon?.dispose?.();
803
+ searchAddon = null;
596
804
  terminal?.dispose();
597
805
  terminal = null;
598
806
  fitAddon = null;
599
- searchAddon = null;
600
807
  didInitialFit = false;
601
808
  });
602
809
  __expose({
@@ -619,14 +826,20 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
619
826
  onSelect: onContextMenuSelect
620
827
  }, {
621
828
  default: withCtx(() => [createElementVNode("section", mergeProps(_ctx.$attrs, {
829
+ id: __props.id,
622
830
  class: ["rs-terminal", { "rs-terminal--zebra": __props.zebraStripes }],
623
831
  style: zebraStyle.value,
832
+ dir: "ltr",
833
+ "aria-label": regionLabel.value,
834
+ "aria-busy": showLoading.value ? "true" : void 0,
835
+ "aria-readonly": __props.inputEnabled ? void 0 : "true",
624
836
  onClick: focus,
625
837
  onContextmenuCapture: onTerminalContextMenu
626
838
  }), [
627
839
  __props.searchEnabled && searchOpen.value ? (openBlock(), createElementBlock("div", {
628
840
  key: 0,
629
841
  class: "rs-terminal__search",
842
+ role: "search",
630
843
  onClick: _cache[3] || (_cache[3] = withModifiers(() => {}, ["stop"]))
631
844
  }, [
632
845
  withDirectives(createElementVNode("input", {
@@ -635,10 +848,12 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
635
848
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
636
849
  class: "rs-terminal__search-input",
637
850
  type: "search",
851
+ enterkeyhint: "search",
638
852
  placeholder: unref(t)("terminal.searchPlaceholder", "Find in terminal"),
639
853
  "aria-label": unref(t)("terminal.search", "Search"),
854
+ "aria-describedby": searchStatus.value ? unref(searchStatusId) : void 0,
640
855
  onKeydown: onSearchKeydown
641
- }, null, 40, _hoisted_1), [[vModelText, searchQuery.value]]),
856
+ }, null, 40, _hoisted_2), [[vModelText, searchQuery.value]]),
642
857
  createElementVNode("button", {
643
858
  type: "button",
644
859
  class: "rs-terminal__search-btn",
@@ -653,7 +868,12 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
653
868
  type: "button",
654
869
  class: "rs-terminal__search-btn",
655
870
  onClick: closeSearch
656
- }, toDisplayString(unref(t)("terminal.searchClose", "Close search")), 1)
871
+ }, toDisplayString(unref(t)("terminal.searchClose", "Close search")), 1),
872
+ searchStatus.value ? (openBlock(), createElementBlock("output", {
873
+ key: 0,
874
+ id: unref(searchStatusId),
875
+ class: "rs-terminal__search-status"
876
+ }, toDisplayString(searchStatus.value), 9, _hoisted_3)) : createCommentVNode("", true)
657
877
  ])) : createCommentVNode("", true),
658
878
  createElementVNode("div", {
659
879
  ref_key: "hostEl",
@@ -668,8 +888,8 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
668
888
  __props.overlay || _ctx.$slots.overlayAction ? (openBlock(), createElementBlock("output", {
669
889
  key: 2,
670
890
  class: normalizeClass(["rs-terminal__overlay", { "rs-terminal__overlay--interactive": Boolean(_ctx.$slots.overlayAction) }])
671
- }, [__props.overlay ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(__props.overlay), 1)) : createCommentVNode("", true), _ctx.$slots.overlayAction ? (openBlock(), createElementBlock("div", _hoisted_3, [renderSlot(_ctx.$slots, "overlayAction", {}, void 0, true)])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)
672
- ], 16)]),
891
+ }, [__props.overlay ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(__props.overlay), 1)) : createCommentVNode("", true), _ctx.$slots.overlayAction ? (openBlock(), createElementBlock("div", _hoisted_5, [renderSlot(_ctx.$slots, "overlayAction", {}, void 0, true)])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)
892
+ ], 16, _hoisted_1)]),
673
893
  _: 3
674
894
  }, 8, ["disabled", "items"]);
675
895
  };
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
3
3
  import RsTerminal_vue_vue_type_script_setup_true_lang_default from "./RsTerminal.impl.js";
4
4
 
5
5
  //#region src/components/terminal/src/RsTerminal.vue
6
- var RsTerminal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsTerminal_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-fcddd3a1"]]);
6
+ var RsTerminal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsTerminal_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-79324a27"]]);
7
7
  //#endregion
8
8
  export { RsTerminal_default as default };
@@ -1,6 +1,7 @@
1
1
  import type { ITheme, Terminal } from '@xterm/xterm';
2
2
  export type RsTerminalThemeMode = 'auto' | 'light' | 'dark';
3
3
  export type RsResolvedTerminalTheme = 'light' | 'dark';
4
+ export type RsTerminalCursorStyle = 'block' | 'underline' | 'bar';
4
5
  export type RsTerminalAction = 'copy' | 'paste' | 'selectAll' | 'clear' | 'askAi' | 'search';
5
6
  export type RsTerminalGeometry = {
6
7
  cols: number;
@@ -29,11 +30,15 @@ export interface RsTerminalExpose {
29
30
  export declare function normalizeTerminalHexColor(value: string): string | null;
30
31
  /** 将 lab()/color() 等现代 CSS 色值转为 xterm 可解析的 #RRGGBB */
31
32
  export declare function resolveCssColorForXterm(value: string): string | null;
32
- /** 从全局 `--rs-terminal-*` token 构建 xterm 调色板(须已加载 styles.css) */
33
- export declare function readTerminalThemeFromCss(mode: RsResolvedTerminalTheme): ITheme;
34
- export declare function resolveTerminalTheme(mode?: RsTerminalThemeMode): RsResolvedTerminalTheme;
33
+ /**
34
+ * auto 看最近的 `data-rs-theme`,没有时看 documentElement。
35
+ * 未写或不是 dark 时跟全库浅色。传入元素时深色岛不必改整页。
36
+ */
37
+ export declare function resolveTerminalTheme(mode?: RsTerminalThemeMode, el?: HTMLElement | null): RsResolvedTerminalTheme;
38
+ /** 从 `--rs-terminal-*` 构建 xterm 调色板。传入宿主时读继承到的 token。 */
39
+ export declare function readTerminalThemeFromCss(mode: RsResolvedTerminalTheme, el?: HTMLElement | null): ITheme;
35
40
  export declare function getTerminalThemePalette(mode: RsResolvedTerminalTheme): ITheme;
36
- export declare function mergeTerminalTheme(mode: RsResolvedTerminalTheme, overrides?: Partial<ITheme>): ITheme;
41
+ export declare function mergeTerminalTheme(mode: RsResolvedTerminalTheme, overrides?: Partial<ITheme>, el?: HTMLElement | null): ITheme;
37
42
  /** 读取斑马纹行底色(`--rs-terminal-row-stripe`,解析后供 xterm decoration 使用) */
38
43
  export declare function readTerminalRowStripeFromCss(mode: RsResolvedTerminalTheme): string;
39
44
  /** PTY 输出是否含终端控制序列(ESC / CSI),此类数据不应批量延迟。 */
@@ -81,5 +86,38 @@ export declare function prepareTerminalForPtyWrite(terminal: Terminal, data: str
81
86
  export declare function isMacPlatform(): boolean;
82
87
  /** 菜单/文档展示的修饰键标签 */
83
88
  export declare function terminalShortcutLabel(key: string): string;
89
+ type ThemeListener = () => void;
90
+ /**
91
+ * 多个终端共用一个 `data-rs-theme` 观察器(含主题岛)。
92
+ * 最后一个退订时断开,避免卸载后仍监听整棵文档。
93
+ */
94
+ export declare function subscribeTerminalTheme(listener: ThemeListener): () => void;
95
+ /** 当前仍挂着的主题订阅数。测试用来确认卸载成对退订。 */
96
+ export declare function terminalThemeSubscriptionCount(): number;
97
+ export type RsTerminalLinkHit = {
98
+ start: number;
99
+ end: number;
100
+ text: string;
101
+ };
102
+ /** 只放行 http(s) 与 mailto。javascript: / data: 一律拒绝。 */
103
+ export declare function isSafeTerminalLink(value: string): boolean;
104
+ /** 从一行可见文本里找出可点的 http(s) / mailto。end 为不含尾标点的字符串下标。 */
105
+ export declare function findTerminalHttpLinks(line: string): RsTerminalLinkHit[];
106
+ /**
107
+ * 把字符串下标换成 xterm 1-based 单元格列。
108
+ * 宽字符占两格,后续 width 0 的格子跳过,避免链接框落在汉字上。
109
+ */
110
+ export declare function terminalCellIndexForString(cells: ReadonlyArray<{
111
+ chars: string;
112
+ width: number;
113
+ }>, stringIndex: number): number;
114
+ export declare function terminalLinkCellRange(cells: ReadonlyArray<{
115
+ chars: string;
116
+ width: number;
117
+ }>, start: number, end: number): {
118
+ startX: number;
119
+ endX: number;
120
+ };
84
121
  /** ANSI 16 色演示文本 */
85
122
  export declare function buildAnsiColorDemo(): string;
123
+ export {};