@aithe/aithe-ui 26.2.3 → 26.3.2

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 (620) hide show
  1. package/README.md +19 -11
  2. package/dist/apps/admin/app.js +12 -0
  3. package/dist/apps/admin/components/admin-app.js +83 -0
  4. package/dist/apps/admin/components/admin-layout.d.ts +0 -1
  5. package/dist/apps/admin/components/admin-layout.d.ts.map +1 -1
  6. package/dist/apps/admin/components/admin-layout.js +250 -0
  7. package/dist/apps/admin/datahub/auth.js +24 -0
  8. package/dist/apps/admin/datahub/dashboard.js +16 -0
  9. package/dist/apps/admin/datahub/index.js +42 -0
  10. package/dist/apps/admin/datahub/menu.js +16 -0
  11. package/dist/apps/admin/datahub/mock/auth.js +11 -0
  12. package/dist/apps/admin/datahub/mock/dashboard.js +10 -0
  13. package/dist/apps/admin/datahub/mock/menu.js +42 -0
  14. package/dist/apps/admin/i18n/de-DE.js +37 -0
  15. package/dist/apps/admin/i18n/en-US.js +37 -0
  16. package/dist/apps/admin/i18n/es-ES.js +38 -0
  17. package/dist/apps/admin/i18n/fr-FR.js +37 -0
  18. package/dist/apps/admin/i18n/index.js +27 -0
  19. package/dist/apps/admin/i18n/ja-JP.js +38 -0
  20. package/dist/apps/admin/i18n/ko-KR.js +37 -0
  21. package/dist/apps/admin/i18n/pt-BR.js +37 -0
  22. package/dist/apps/admin/i18n/zh-CN.js +37 -0
  23. package/dist/apps/admin/i18n/zh-HK.js +37 -0
  24. package/dist/apps/admin/i18n/zh-TW.js +37 -0
  25. package/dist/apps/admin/pages/dashboard-page.d.ts +1 -0
  26. package/dist/apps/admin/pages/dashboard-page.d.ts.map +1 -1
  27. package/dist/apps/admin/pages/dashboard-page.js +199 -0
  28. package/dist/apps/admin/pages/login-page.js +278 -0
  29. package/dist/apps/admin/pages/not-found-page.js +57 -0
  30. package/dist/apps/admin/pages/role-page.js +76 -0
  31. package/dist/apps/admin/pages/settings-page.js +95 -0
  32. package/dist/apps/admin/pages/user-page.js +76 -0
  33. package/dist/apps/admin/router/index.js +43 -0
  34. package/dist/apps/admin/standalone.js +1 -0
  35. package/dist/apps/admin/store/auth.js +42 -0
  36. package/dist/apps/api/app.js +82 -0
  37. package/dist/apps/api/demo-data.d.ts.map +1 -1
  38. package/dist/apps/api/demo-data.js +965 -0
  39. package/dist/apps/api/docs-viewer.js +684 -0
  40. package/dist/apps/api/i18n/de-DE.d.ts.map +1 -1
  41. package/dist/apps/api/i18n/de-DE.js +131 -0
  42. package/dist/apps/api/i18n/en-US.d.ts.map +1 -1
  43. package/dist/apps/api/i18n/en-US.js +141 -0
  44. package/dist/apps/api/i18n/es-ES.d.ts.map +1 -1
  45. package/dist/apps/api/i18n/es-ES.js +131 -0
  46. package/dist/apps/api/i18n/fr-FR.d.ts.map +1 -1
  47. package/dist/apps/api/i18n/fr-FR.js +131 -0
  48. package/dist/apps/api/i18n/index.js +27 -0
  49. package/dist/apps/api/i18n/ja-JP.d.ts.map +1 -1
  50. package/dist/apps/api/i18n/ja-JP.js +131 -0
  51. package/dist/apps/api/i18n/ko-KR.d.ts.map +1 -1
  52. package/dist/apps/api/i18n/ko-KR.js +131 -0
  53. package/dist/apps/api/i18n/pt-BR.d.ts.map +1 -1
  54. package/dist/apps/api/i18n/pt-BR.js +131 -0
  55. package/dist/apps/api/i18n/zh-CN.d.ts.map +1 -1
  56. package/dist/apps/api/i18n/zh-CN.js +141 -0
  57. package/dist/apps/api/i18n/zh-HK.d.ts.map +1 -1
  58. package/dist/apps/api/i18n/zh-HK.js +131 -0
  59. package/dist/apps/api/i18n/zh-TW.d.ts.map +1 -1
  60. package/dist/apps/api/i18n/zh-TW.js +131 -0
  61. package/dist/apps/api/pages/docs.d.ts.map +1 -1
  62. package/dist/apps/api/pages/docs.js +369 -0
  63. package/dist/apps/api/standalone.js +1 -0
  64. package/dist/apps/demo/app.d.ts.map +1 -1
  65. package/dist/apps/demo/app.js +275 -0
  66. package/dist/apps/demo/editor.d.ts.map +1 -1
  67. package/dist/apps/demo/editor.js +270 -0
  68. package/dist/apps/demo/helpers.js +7 -0
  69. package/dist/apps/demo/i18n/de-DE.d.ts.map +1 -1
  70. package/dist/apps/demo/i18n/de-DE.js +289 -0
  71. package/dist/apps/demo/i18n/en-US.d.ts.map +1 -1
  72. package/dist/apps/demo/i18n/en-US.js +301 -0
  73. package/dist/apps/demo/i18n/es-ES.d.ts.map +1 -1
  74. package/dist/apps/demo/i18n/es-ES.js +289 -0
  75. package/dist/apps/demo/i18n/fr-FR.d.ts.map +1 -1
  76. package/dist/apps/demo/i18n/fr-FR.js +289 -0
  77. package/dist/apps/demo/i18n/index.js +27 -0
  78. package/dist/apps/demo/i18n/ja-JP.d.ts.map +1 -1
  79. package/dist/apps/demo/i18n/ja-JP.js +289 -0
  80. package/dist/apps/demo/i18n/ko-KR.d.ts.map +1 -1
  81. package/dist/apps/demo/i18n/ko-KR.js +289 -0
  82. package/dist/apps/demo/i18n/pt-BR.d.ts.map +1 -1
  83. package/dist/apps/demo/i18n/pt-BR.js +289 -0
  84. package/dist/apps/demo/i18n/zh-CN.d.ts.map +1 -1
  85. package/dist/apps/demo/i18n/zh-CN.js +301 -0
  86. package/dist/apps/demo/i18n/zh-HK.d.ts.map +1 -1
  87. package/dist/apps/demo/i18n/zh-HK.js +289 -0
  88. package/dist/apps/demo/i18n/zh-TW.d.ts.map +1 -1
  89. package/dist/apps/demo/i18n/zh-TW.js +289 -0
  90. package/dist/apps/demo/pages/autoform.d.ts.map +1 -1
  91. package/dist/apps/demo/pages/autoform.js +422 -0
  92. package/dist/apps/demo/pages/autoview.d.ts +3 -0
  93. package/dist/apps/demo/pages/autoview.d.ts.map +1 -0
  94. package/dist/apps/demo/pages/autoview.js +310 -0
  95. package/dist/apps/demo/pages/basic.js +157 -0
  96. package/dist/apps/demo/pages/code.js +1088 -0
  97. package/dist/apps/demo/pages/container.js +42 -0
  98. package/dist/apps/demo/pages/dashboard.js +159 -0
  99. package/dist/apps/demo/pages/data.d.ts.map +1 -1
  100. package/dist/apps/demo/pages/data.js +327 -0
  101. package/dist/apps/demo/pages/display.d.ts.map +1 -1
  102. package/dist/apps/demo/pages/display.js +295 -0
  103. package/dist/apps/demo/pages/feedback.js +94 -0
  104. package/dist/apps/demo/pages/form.d.ts.map +1 -1
  105. package/dist/apps/demo/pages/form.js +119 -0
  106. package/dist/apps/demo/pages/layout.js +74 -0
  107. package/dist/apps/demo/pages/navigation.js +54 -0
  108. package/dist/apps/demo/pages/progress.js +42 -0
  109. package/dist/apps/demo/pages/theme.js +126 -0
  110. package/dist/apps/demo/standalone.js +1 -0
  111. package/dist/components/basic/AGENTS.md +1 -0
  112. package/dist/components/basic/avatar.js +168 -0
  113. package/dist/components/basic/badge.js +157 -0
  114. package/dist/components/basic/button-group.js +70 -0
  115. package/dist/components/basic/button.d.ts +2 -4
  116. package/dist/components/basic/button.d.ts.map +1 -1
  117. package/dist/components/basic/button.js +315 -0
  118. package/dist/components/basic/card.js +186 -0
  119. package/dist/components/basic/chip.js +103 -0
  120. package/dist/components/basic/divider.js +127 -0
  121. package/dist/components/basic/empty.js +72 -0
  122. package/dist/components/basic/icon.js +129 -0
  123. package/dist/components/basic/input.d.ts.map +1 -1
  124. package/dist/components/basic/input.js +314 -0
  125. package/dist/components/basic/tag.d.ts +7 -2
  126. package/dist/components/basic/tag.d.ts.map +1 -1
  127. package/dist/components/basic/tag.js +248 -0
  128. package/dist/components/basic/textarea.d.ts +0 -1
  129. package/dist/components/basic/textarea.d.ts.map +1 -1
  130. package/dist/components/basic/textarea.js +130 -0
  131. package/dist/components/container/callout.js +108 -0
  132. package/dist/components/container/details.js +117 -0
  133. package/dist/components/container/scroller.js +144 -0
  134. package/dist/components/container/split-panel.js +150 -0
  135. package/dist/components/data/AGENTS.md +1 -1
  136. package/dist/components/data/box-table.d.ts +53 -0
  137. package/dist/components/data/box-table.d.ts.map +1 -0
  138. package/dist/components/data/box-table.js +220 -0
  139. package/dist/components/data/dropdown.d.ts +8 -5
  140. package/dist/components/data/dropdown.d.ts.map +1 -1
  141. package/dist/components/data/dropdown.js +219 -0
  142. package/dist/components/data/metrics-group.js +180 -0
  143. package/dist/components/data/metrics.d.ts +11 -0
  144. package/dist/components/data/metrics.d.ts.map +1 -1
  145. package/dist/components/data/metrics.js +309 -0
  146. package/dist/components/data/pagination.js +119 -0
  147. package/dist/components/data/tab-pane.d.ts +58 -12
  148. package/dist/components/data/tab-pane.d.ts.map +1 -1
  149. package/dist/components/data/tab-pane.js +130 -0
  150. package/dist/components/data/table-column.d.ts +29 -5
  151. package/dist/components/data/table-column.d.ts.map +1 -1
  152. package/dist/components/data/table-column.js +123 -0
  153. package/dist/components/data/table.d.ts +134 -54
  154. package/dist/components/data/table.d.ts.map +1 -1
  155. package/dist/components/data/table.js +1210 -0
  156. package/dist/components/data/tabs.d.ts +60 -3
  157. package/dist/components/data/tabs.d.ts.map +1 -1
  158. package/dist/components/data/tabs.js +416 -0
  159. package/dist/components/data/timeline-item.js +127 -0
  160. package/dist/components/data/timeline.js +204 -0
  161. package/dist/components/data/tree-menu.d.ts +12 -2
  162. package/dist/components/data/tree-menu.d.ts.map +1 -1
  163. package/dist/components/data/tree-menu.js +482 -0
  164. package/dist/components/data/tree.js +269 -0
  165. package/dist/components/display/AGENTS.md +5 -2
  166. package/dist/components/display/animated-image.js +98 -0
  167. package/dist/components/display/autoview.d.ts +139 -0
  168. package/dist/components/display/autoview.d.ts.map +1 -0
  169. package/dist/components/display/autoview.js +460 -0
  170. package/dist/components/display/brief-box.d.ts +42 -0
  171. package/dist/components/display/brief-box.d.ts.map +1 -0
  172. package/dist/components/display/brief-box.js +117 -0
  173. package/dist/components/display/carousel.js +223 -0
  174. package/dist/components/display/code-editor.d.ts.map +1 -1
  175. package/dist/components/display/code-editor.js +976 -0
  176. package/dist/components/display/comparison.js +132 -0
  177. package/dist/components/display/desc-item.d.ts +48 -0
  178. package/dist/components/display/desc-item.d.ts.map +1 -0
  179. package/dist/components/display/desc-item.js +150 -0
  180. package/dist/components/display/desc.d.ts +68 -0
  181. package/dist/components/display/desc.d.ts.map +1 -0
  182. package/dist/components/display/desc.js +405 -0
  183. package/dist/components/display/detail-box.d.ts +51 -0
  184. package/dist/components/display/detail-box.d.ts.map +1 -0
  185. package/dist/components/display/detail-box.js +157 -0
  186. package/dist/components/display/label.js +166 -0
  187. package/dist/components/display/markdown-editor.js +319 -0
  188. package/dist/components/display/markdown.d.ts.map +1 -1
  189. package/dist/components/display/markdown.js +193 -0
  190. package/dist/components/display/mini-box.d.ts +31 -0
  191. package/dist/components/display/mini-box.d.ts.map +1 -0
  192. package/dist/components/display/mini-box.js +137 -0
  193. package/dist/components/display/profile.d.ts +18 -0
  194. package/dist/components/display/profile.d.ts.map +1 -0
  195. package/dist/components/display/profile.js +164 -0
  196. package/dist/components/feedback/AGENTS.md +1 -0
  197. package/dist/components/feedback/alert.js +150 -0
  198. package/dist/components/feedback/dialog.js +228 -0
  199. package/dist/components/feedback/drawer.d.ts.map +1 -1
  200. package/dist/components/feedback/drawer.js +338 -0
  201. package/dist/components/feedback/loading.js +130 -0
  202. package/dist/components/feedback/modal.d.ts.map +1 -1
  203. package/dist/components/feedback/modal.js +303 -0
  204. package/dist/components/feedback/notification.js +170 -0
  205. package/dist/components/feedback/popover.d.ts +1 -1
  206. package/dist/components/feedback/popover.js +124 -0
  207. package/dist/components/feedback/toast.js +142 -0
  208. package/dist/components/feedback/tooltip.d.ts +1 -1
  209. package/dist/components/feedback/tooltip.js +153 -0
  210. package/dist/components/form/AGENTS.md +4 -0
  211. package/dist/components/form/autoform-item.d.ts +6 -0
  212. package/dist/components/form/autoform-item.d.ts.map +1 -1
  213. package/dist/components/form/autoform-item.js +791 -0
  214. package/dist/components/form/autoform.d.ts +15 -5
  215. package/dist/components/form/autoform.d.ts.map +1 -1
  216. package/dist/components/form/autoform.js +303 -0
  217. package/dist/components/form/checkbox-group.js +118 -0
  218. package/dist/components/form/checkbox.js +123 -0
  219. package/dist/components/form/color-picker.js +148 -0
  220. package/dist/components/form/combobox.d.ts +4 -0
  221. package/dist/components/form/combobox.d.ts.map +1 -1
  222. package/dist/components/form/combobox.js +325 -0
  223. package/dist/components/form/date-picker.js +123 -0
  224. package/dist/components/form/form-item.d.ts.map +1 -1
  225. package/dist/components/form/form-item.js +141 -0
  226. package/dist/components/form/form.js +94 -0
  227. package/dist/components/form/radio-group.js +106 -0
  228. package/dist/components/form/radio.js +110 -0
  229. package/dist/components/form/rate.js +116 -0
  230. package/dist/components/form/select.d.ts +5 -1
  231. package/dist/components/form/select.d.ts.map +1 -1
  232. package/dist/components/form/select.js +539 -0
  233. package/dist/components/form/slider.js +134 -0
  234. package/dist/components/form/switch.js +146 -0
  235. package/dist/components/form/time-picker.js +92 -0
  236. package/dist/components/form/transfer.js +273 -0
  237. package/dist/components/form/upload.js +138 -0
  238. package/dist/components/framework/body.js +333 -0
  239. package/dist/components/framework/dashboard-panel.js +519 -0
  240. package/dist/components/framework/dashboard.d.ts.map +1 -1
  241. package/dist/components/framework/dashboard.js +1084 -0
  242. package/dist/components/framework/header.js +237 -0
  243. package/dist/components/framework/log-panel.js +637 -0
  244. package/dist/components/framework/page.js +151 -0
  245. package/dist/components/framework/sidebar.d.ts +4 -10
  246. package/dist/components/framework/sidebar.d.ts.map +1 -1
  247. package/dist/components/framework/sidebar.js +477 -0
  248. package/dist/components/layout/affix.js +137 -0
  249. package/dist/components/layout/col.js +103 -0
  250. package/dist/components/layout/collapse-item.js +165 -0
  251. package/dist/components/layout/collapse.js +108 -0
  252. package/dist/components/layout/container.js +92 -0
  253. package/dist/components/layout/flex.js +100 -0
  254. package/dist/components/layout/row.js +103 -0
  255. package/dist/components/layout/space.js +85 -0
  256. package/dist/components/navigation/back-top.js +127 -0
  257. package/dist/components/navigation/breadcrumb-item.js +108 -0
  258. package/dist/components/navigation/breadcrumb.js +70 -0
  259. package/dist/components/navigation/menu-item.js +181 -0
  260. package/dist/components/navigation/menu.js +126 -0
  261. package/dist/components/navigation/steps.js +183 -0
  262. package/dist/components/navigation/sub-menu.d.ts.map +1 -1
  263. package/dist/components/navigation/sub-menu.js +252 -0
  264. package/dist/components/progress/progress-bar.js +97 -0
  265. package/dist/components/progress/progress-ring.js +111 -0
  266. package/dist/components/progress/skeleton.js +108 -0
  267. package/dist/components/progress/spinner.js +129 -0
  268. package/dist/components/theme/locale-switch.js +241 -0
  269. package/dist/components/theme/shadow-picker.js +233 -0
  270. package/dist/components/theme/shape-picker.js +232 -0
  271. package/dist/components/theme/theme-picker.js +236 -0
  272. package/dist/components/theme/theme-preview.d.ts +1 -2
  273. package/dist/components/theme/theme-preview.d.ts.map +1 -1
  274. package/dist/components/theme/theme-preview.js +376 -0
  275. package/dist/components/theme/theme-switch.d.ts.map +1 -1
  276. package/dist/components/theme/theme-switch.js +318 -0
  277. package/dist/components/theme/typo-picker.js +219 -0
  278. package/dist/core/AGENTS.md +6 -1
  279. package/dist/core/aithe-element.d.ts +2 -2
  280. package/dist/core/aithe-element.js +135 -0
  281. package/dist/core/aithe-widget.js +30 -0
  282. package/dist/core/anchored-overlay.d.ts +3 -0
  283. package/dist/core/anchored-overlay.d.ts.map +1 -1
  284. package/dist/core/anchored-overlay.js +111 -0
  285. package/dist/core/autoform/autoform.js +79 -0
  286. package/dist/core/autoform/autoview.d.ts +86 -0
  287. package/dist/core/autoform/autoview.d.ts.map +1 -0
  288. package/dist/core/autoform/autoview.js +37 -0
  289. package/dist/core/autoform/condition.js +170 -0
  290. package/dist/core/autoform/index.d.ts +2 -0
  291. package/dist/core/autoform/index.d.ts.map +1 -1
  292. package/dist/core/autoform/index.js +9 -0
  293. package/dist/core/autoform/types.js +7 -0
  294. package/dist/core/datahub/__tests__/force-options.test.d.ts +8 -0
  295. package/dist/core/datahub/__tests__/force-options.test.d.ts.map +1 -0
  296. package/dist/core/datahub/__tests__/force-options.test.js +161 -0
  297. package/dist/core/datahub/config/strategy.d.ts +1 -1
  298. package/dist/core/datahub/config/strategy.d.ts.map +1 -1
  299. package/dist/core/datahub/config/strategy.js +50 -0
  300. package/dist/core/datahub/core/adapter/fetch-adapter.d.ts +1 -1
  301. package/dist/core/datahub/core/adapter/fetch-adapter.d.ts.map +1 -1
  302. package/dist/core/datahub/core/adapter/fetch-adapter.js +118 -0
  303. package/dist/core/datahub/core/adapter/index.js +7 -0
  304. package/dist/core/datahub/core/adapter/mock-adapter.d.ts +1 -1
  305. package/dist/core/datahub/core/adapter/mock-adapter.d.ts.map +1 -1
  306. package/dist/core/datahub/core/adapter/mock-adapter.js +58 -0
  307. package/dist/core/datahub/core/api-styles.d.ts +1 -1
  308. package/dist/core/datahub/core/api-styles.d.ts.map +1 -1
  309. package/dist/core/datahub/core/api-styles.js +136 -0
  310. package/dist/core/datahub/core/datahub-core.d.ts +53 -3
  311. package/dist/core/datahub/core/datahub-core.d.ts.map +1 -1
  312. package/dist/core/datahub/core/datahub-core.js +520 -0
  313. package/dist/core/datahub/core/index.js +7 -0
  314. package/dist/core/datahub/index.js +50 -0
  315. package/dist/core/datahub/types.d.ts +24 -0
  316. package/dist/core/datahub/types.d.ts.map +1 -1
  317. package/dist/core/datahub/types.js +31 -0
  318. package/dist/core/datahub/utils/cache.js +55 -0
  319. package/dist/core/datahub/utils/common.js +23 -0
  320. package/dist/core/datahub/utils/dedup.d.ts +1 -1
  321. package/dist/core/datahub/utils/dedup.d.ts.map +1 -1
  322. package/dist/core/datahub/utils/dedup.js +52 -0
  323. package/dist/core/datahub/utils/idempotent.js +61 -0
  324. package/dist/core/datahub/utils/is-query.js +53 -0
  325. package/dist/core/datahub/utils/loading.js +78 -0
  326. package/dist/core/filter/__tests__/index.test.d.ts +2 -0
  327. package/dist/core/filter/__tests__/index.test.d.ts.map +1 -0
  328. package/dist/core/filter/__tests__/index.test.js +230 -0
  329. package/dist/core/filter/builtins.d.ts +60 -0
  330. package/dist/core/filter/builtins.d.ts.map +1 -0
  331. package/dist/core/filter/builtins.js +172 -0
  332. package/dist/core/filter/factory.d.ts +54 -0
  333. package/dist/core/filter/factory.d.ts.map +1 -0
  334. package/dist/core/filter/factory.js +96 -0
  335. package/dist/core/filter/index.d.ts +11 -0
  336. package/dist/core/filter/index.d.ts.map +1 -0
  337. package/dist/core/filter/index.js +9 -0
  338. package/dist/core/filter/types.d.ts +12 -0
  339. package/dist/core/filter/types.d.ts.map +1 -0
  340. package/dist/core/filter/types.js +1 -0
  341. package/dist/core/floating.js +132 -0
  342. package/dist/core/highlight/index.js +43 -0
  343. package/dist/core/highlight/lang-bash.js +27 -0
  344. package/dist/core/highlight/lang-c.js +27 -0
  345. package/dist/core/highlight/lang-cmake.js +27 -0
  346. package/dist/core/highlight/lang-cpp.js +27 -0
  347. package/dist/core/highlight/lang-css.js +24 -0
  348. package/dist/core/highlight/lang-dart.js +27 -0
  349. package/dist/core/highlight/lang-dockerfile.js +16 -0
  350. package/dist/core/highlight/lang-fsharp.js +23 -0
  351. package/dist/core/highlight/lang-go.js +22 -0
  352. package/dist/core/highlight/lang-html.js +12 -0
  353. package/dist/core/highlight/lang-java.js +22 -0
  354. package/dist/core/highlight/lang-javascript.js +26 -0
  355. package/dist/core/highlight/lang-json.js +13 -0
  356. package/dist/core/highlight/lang-jsonline.js +13 -0
  357. package/dist/core/highlight/lang-jsx.js +30 -0
  358. package/dist/core/highlight/lang-kotlin.js +27 -0
  359. package/dist/core/highlight/lang-latex.js +22 -0
  360. package/dist/core/highlight/lang-lua.js +26 -0
  361. package/dist/core/highlight/lang-makefile.js +22 -0
  362. package/dist/core/highlight/lang-markdown.js +18 -0
  363. package/dist/core/highlight/lang-objectivec.js +24 -0
  364. package/dist/core/highlight/lang-perl.js +30 -0
  365. package/dist/core/highlight/lang-powershell.js +23 -0
  366. package/dist/core/highlight/lang-python.js +27 -0
  367. package/dist/core/highlight/lang-r.js +21 -0
  368. package/dist/core/highlight/lang-ruby.js +29 -0
  369. package/dist/core/highlight/lang-rust.js +24 -0
  370. package/dist/core/highlight/lang-scala.js +26 -0
  371. package/dist/core/highlight/lang-sql.js +21 -0
  372. package/dist/core/highlight/lang-svelte.js +27 -0
  373. package/dist/core/highlight/lang-swift.js +28 -0
  374. package/dist/core/highlight/lang-tsx.js +35 -0
  375. package/dist/core/highlight/lang-typescript.js +31 -0
  376. package/dist/core/highlight/lang-vue.js +29 -0
  377. package/dist/core/highlight/lang-wasm.js +22 -0
  378. package/dist/core/highlight/lang-xml.js +12 -0
  379. package/dist/core/highlight/lang-yaml.js +14 -0
  380. package/dist/core/highlight/registry.js +99 -0
  381. package/dist/core/logger/LoggerCore.js +626 -0
  382. package/dist/core/logger/index.js +10 -0
  383. package/dist/core/logger/types.js +29 -0
  384. package/dist/core/markdown/index.js +20 -0
  385. package/dist/core/markdown/parser.d.ts +2 -0
  386. package/dist/core/markdown/parser.d.ts.map +1 -1
  387. package/dist/core/markdown/parser.js +376 -0
  388. package/dist/core/markdown/plugins.d.ts +2 -1
  389. package/dist/core/markdown/plugins.d.ts.map +1 -1
  390. package/dist/core/markdown/plugins.js +755 -0
  391. package/dist/core/markdown/types.d.ts +5 -0
  392. package/dist/core/markdown/types.d.ts.map +1 -1
  393. package/dist/core/markdown/types.js +7 -0
  394. package/dist/core/router/index.js +244 -0
  395. package/dist/core/styles.js +44 -0
  396. package/dist/core/types.d.ts +52 -3
  397. package/dist/core/types.d.ts.map +1 -1
  398. package/dist/core/types.js +1 -0
  399. package/dist/index.d.ts +9 -0
  400. package/dist/index.d.ts.map +1 -1
  401. package/dist/index.js +3695 -1622
  402. package/dist/index.js.map +1 -1
  403. package/dist/index.umd.js +1844 -758
  404. package/dist/index.umd.js.map +1 -1
  405. package/dist/styles/aithe-ui.d.ts +23 -0
  406. package/dist/styles/aithe-ui.d.ts.map +1 -1
  407. package/dist/styles/aithe-ui.js +185 -0
  408. package/dist/styles/global.css.d.ts +1 -1
  409. package/dist/styles/global.css.d.ts.map +1 -1
  410. package/dist/styles/global.css.js +119 -0
  411. package/dist/styles/i18n/index.js +206 -0
  412. package/dist/styles/i18n/locales/de-DE.d.ts.map +1 -1
  413. package/dist/styles/i18n/locales/de-DE.js +151 -0
  414. package/dist/styles/i18n/locales/en-US.d.ts.map +1 -1
  415. package/dist/styles/i18n/locales/en-US.js +160 -0
  416. package/dist/styles/i18n/locales/es-ES.d.ts.map +1 -1
  417. package/dist/styles/i18n/locales/es-ES.js +151 -0
  418. package/dist/styles/i18n/locales/fr-FR.d.ts.map +1 -1
  419. package/dist/styles/i18n/locales/fr-FR.js +151 -0
  420. package/dist/styles/i18n/locales/index.js +14 -0
  421. package/dist/styles/i18n/locales/ja-JP.d.ts.map +1 -1
  422. package/dist/styles/i18n/locales/ja-JP.js +151 -0
  423. package/dist/styles/i18n/locales/ko-KR.d.ts.map +1 -1
  424. package/dist/styles/i18n/locales/ko-KR.js +151 -0
  425. package/dist/styles/i18n/locales/pt-BR.d.ts.map +1 -1
  426. package/dist/styles/i18n/locales/pt-BR.js +151 -0
  427. package/dist/styles/i18n/locales/zh-CN.d.ts.map +1 -1
  428. package/dist/styles/i18n/locales/zh-CN.js +160 -0
  429. package/dist/styles/i18n/locales/zh-HK.d.ts.map +1 -1
  430. package/dist/styles/i18n/locales/zh-HK.js +151 -0
  431. package/dist/styles/i18n/locales/zh-TW.d.ts.map +1 -1
  432. package/dist/styles/i18n/locales/zh-TW.js +151 -0
  433. package/dist/styles/layout/index.js +88 -0
  434. package/dist/styles/mixins.js +43 -0
  435. package/dist/styles/shadow/cyber.js +19 -0
  436. package/dist/styles/shadow/deep.js +19 -0
  437. package/dist/styles/shadow/diffuse.js +19 -0
  438. package/dist/styles/shadow/flat.js +19 -0
  439. package/dist/styles/shadow/glassmorphism.js +19 -0
  440. package/dist/styles/shadow/index.js +129 -0
  441. package/dist/styles/shadow/neumorphism.js +21 -0
  442. package/dist/styles/shadow/retro.js +19 -0
  443. package/dist/styles/shadow/sharp-business.js +19 -0
  444. package/dist/styles/shadow/skeuomorphic.js +21 -0
  445. package/dist/styles/shape/chamfer.js +19 -0
  446. package/dist/styles/shape/circle.js +19 -0
  447. package/dist/styles/shape/index.js +174 -0
  448. package/dist/styles/shape/organic.js +19 -0
  449. package/dist/styles/shape/pill.js +19 -0
  450. package/dist/styles/shape/rounded.js +21 -0
  451. package/dist/styles/shape/rounder.js +19 -0
  452. package/dist/styles/shape/sharp.js +19 -0
  453. package/dist/styles/shape/smooth.js +19 -0
  454. package/dist/styles/theme/aliyun.d.ts +1 -1
  455. package/dist/styles/theme/aliyun.d.ts.map +1 -1
  456. package/dist/styles/theme/aliyun.js +102 -0
  457. package/dist/styles/theme/amber.d.ts +1 -1
  458. package/dist/styles/theme/amber.d.ts.map +1 -1
  459. package/dist/styles/theme/amber.js +101 -0
  460. package/dist/styles/theme/blue.d.ts +1 -1
  461. package/dist/styles/theme/blue.d.ts.map +1 -1
  462. package/dist/styles/theme/blue.js +101 -0
  463. package/dist/styles/theme/charcoal.d.ts +1 -1
  464. package/dist/styles/theme/charcoal.d.ts.map +1 -1
  465. package/dist/styles/theme/charcoal.js +106 -0
  466. package/dist/styles/theme/cyan.d.ts +1 -1
  467. package/dist/styles/theme/cyan.d.ts.map +1 -1
  468. package/dist/styles/theme/cyan.js +96 -0
  469. package/dist/styles/theme/dark.d.ts +1 -1
  470. package/dist/styles/theme/dark.d.ts.map +1 -1
  471. package/dist/styles/theme/dark.js +106 -0
  472. package/dist/styles/theme/ebony.d.ts +1 -1
  473. package/dist/styles/theme/ebony.d.ts.map +1 -1
  474. package/dist/styles/theme/ebony.js +106 -0
  475. package/dist/styles/theme/festive.d.ts +1 -1
  476. package/dist/styles/theme/festive.d.ts.map +1 -1
  477. package/dist/styles/theme/festive.js +101 -0
  478. package/dist/styles/theme/graphite.d.ts +1 -1
  479. package/dist/styles/theme/graphite.d.ts.map +1 -1
  480. package/dist/styles/theme/graphite.js +106 -0
  481. package/dist/styles/theme/gray.d.ts +1 -1
  482. package/dist/styles/theme/gray.d.ts.map +1 -1
  483. package/dist/styles/theme/gray.js +101 -0
  484. package/dist/styles/theme/huawei.d.ts +1 -1
  485. package/dist/styles/theme/huawei.d.ts.map +1 -1
  486. package/dist/styles/theme/huawei.js +102 -0
  487. package/dist/styles/theme/index.d.ts +1 -1
  488. package/dist/styles/theme/index.d.ts.map +1 -1
  489. package/dist/styles/theme/index.js +276 -0
  490. package/dist/styles/theme/indigo.d.ts +1 -1
  491. package/dist/styles/theme/indigo.d.ts.map +1 -1
  492. package/dist/styles/theme/indigo.js +101 -0
  493. package/dist/styles/theme/ink.d.ts +1 -1
  494. package/dist/styles/theme/ink.d.ts.map +1 -1
  495. package/dist/styles/theme/ink.js +106 -0
  496. package/dist/styles/theme/light.d.ts +1 -1
  497. package/dist/styles/theme/light.d.ts.map +1 -1
  498. package/dist/styles/theme/light.js +102 -0
  499. package/dist/styles/theme/midnight.d.ts +1 -1
  500. package/dist/styles/theme/midnight.d.ts.map +1 -1
  501. package/dist/styles/theme/midnight.js +106 -0
  502. package/dist/styles/theme/navy.d.ts +1 -1
  503. package/dist/styles/theme/navy.d.ts.map +1 -1
  504. package/dist/styles/theme/navy.js +106 -0
  505. package/dist/styles/theme/obsidian.d.ts +1 -1
  506. package/dist/styles/theme/obsidian.d.ts.map +1 -1
  507. package/dist/styles/theme/obsidian.js +106 -0
  508. package/dist/styles/theme/onyx.d.ts +1 -1
  509. package/dist/styles/theme/onyx.d.ts.map +1 -1
  510. package/dist/styles/theme/onyx.js +106 -0
  511. package/dist/styles/theme/orange.d.ts +1 -1
  512. package/dist/styles/theme/orange.d.ts.map +1 -1
  513. package/dist/styles/theme/orange.js +101 -0
  514. package/dist/styles/theme/pink.d.ts +1 -1
  515. package/dist/styles/theme/pink.d.ts.map +1 -1
  516. package/dist/styles/theme/pink.js +101 -0
  517. package/dist/styles/theme/purple.d.ts +1 -1
  518. package/dist/styles/theme/purple.d.ts.map +1 -1
  519. package/dist/styles/theme/purple.js +101 -0
  520. package/dist/styles/theme/raisin.d.ts +1 -1
  521. package/dist/styles/theme/raisin.d.ts.map +1 -1
  522. package/dist/styles/theme/raisin.js +106 -0
  523. package/dist/styles/theme/slate.d.ts +1 -1
  524. package/dist/styles/theme/slate.d.ts.map +1 -1
  525. package/dist/styles/theme/slate.js +106 -0
  526. package/dist/styles/theme/teal.d.ts +1 -1
  527. package/dist/styles/theme/teal.d.ts.map +1 -1
  528. package/dist/styles/theme/teal.js +101 -0
  529. package/dist/styles/theme/tianyi.d.ts +1 -1
  530. package/dist/styles/theme/tianyi.d.ts.map +1 -1
  531. package/dist/styles/theme/tianyi.js +102 -0
  532. package/dist/styles/types.js +1 -0
  533. package/dist/styles/typo/business.js +34 -0
  534. package/dist/styles/typo/compact.js +34 -0
  535. package/dist/styles/typo/index.js +99 -0
  536. package/dist/styles/typo/luxury.js +34 -0
  537. package/dist/styles/typo/minimal.js +34 -0
  538. package/dist/types/index.js +2 -0
  539. package/dist/utils/dom.js +51 -0
  540. package/dist/utils/events.js +32 -0
  541. package/dist/utils/icon.js +176 -0
  542. package/dist/utils/index.js +4 -0
  543. package/dist/utils/utils.d.ts +5 -5
  544. package/dist/utils/utils.js +89 -0
  545. package/dist/utils/validation.js +52 -0
  546. package/docs/api/basic/button.md +9 -6
  547. package/docs/api/basic/tag.md +24 -17
  548. package/docs/api/data/box-table.md +73 -0
  549. package/docs/api/data/dropdown.md +3 -2
  550. package/docs/api/data/metrics.md +2 -0
  551. package/docs/api/data/table-column.md +37 -23
  552. package/docs/api/data/table.md +158 -44
  553. package/docs/api/data/tabs.md +46 -1
  554. package/docs/api/data/tree-menu.md +55 -2
  555. package/docs/api/display/autoview.md +277 -0
  556. package/docs/api/display/box.md +66 -0
  557. package/docs/api/display/brief-box.md +73 -0
  558. package/docs/api/display/desc-item.md +57 -0
  559. package/docs/api/display/desc.md +246 -0
  560. package/docs/api/display/detail-box.md +75 -0
  561. package/docs/api/display/mini-box.md +100 -0
  562. package/docs/api/display/profile.md +92 -0
  563. package/docs/api/feedback/popover.md +10 -10
  564. package/docs/api/feedback/tooltip.md +14 -14
  565. package/docs/api/form/autoform-item.md +115 -0
  566. package/docs/api/form/autoform.md +7 -3
  567. package/docs/api/form/combobox.md +27 -7
  568. package/docs/api/form/select.md +50 -28
  569. package/docs/api/framework/log-panel.md +46 -0
  570. package/docs/api/framework/sidebar.md +3 -2
  571. package/docs/api/summary.md +46 -35
  572. package/docs/api/theme/theme-switch.md +1 -1
  573. package/docs/autoform.md +14 -33
  574. package/docs/changelog/CHANGELOG.md +155 -0
  575. package/docs/changelog/VERSION_26.3.1.md +966 -0
  576. package/docs/changelog/VERSION_26.3.2.md +852 -0
  577. package/docs/datahub.md +4 -1
  578. package/docs/filter.md +332 -0
  579. package/docs/framework-integration.md +2 -2
  580. package/docs/guide.md +72 -6
  581. package/docs/i18n.md +2 -4
  582. package/docs/issue/26.3.1/issue_26.3.1.0.md +84 -0
  583. package/docs/issue/26.3.1/issue_26.3.1.1.md +72 -0
  584. package/docs/issue/26.3.1/issue_26.3.1.2.md +75 -0
  585. package/docs/issue/26.3.1/issue_26.3.1.3.md +78 -0
  586. package/docs/issue/26.3.1/issue_26.3.1.4.md +113 -0
  587. package/docs/issue/26.3.1/issue_26.3.1.5.md +142 -0
  588. package/docs/issue/26.3.1/issue_26.3.1.6.md +100 -0
  589. package/docs/issue/26.3.1/issue_26.3.1.7.md +78 -0
  590. package/docs/issue/26.3.2/issue_26.3.2.1.md +46 -0
  591. package/docs/issue/26.3.2/issue_26.3.2.2.md +82 -0
  592. package/docs/issue/26.3.2/issue_26.3.2.3.md +57 -0
  593. package/docs/issue/26.3.2/issue_26.3.2.4.md +43 -0
  594. package/docs/issue/AGENTS.md +24 -3
  595. package/docs/markdown.md +2 -2
  596. package/docs/quickstart.md +5 -5
  597. package/docs/theming.md +5 -4
  598. package/package.json +5 -2
  599. package/dist/components/navigation/dropdown.d.ts +0 -56
  600. package/dist/components/navigation/dropdown.d.ts.map +0 -1
  601. /package/docs/issue/{issue_26.2.2.1.md → 26.2.2/issue_26.2.2.1.md} +0 -0
  602. /package/docs/issue/{issue_26.2.2.2.md → 26.2.2/issue_26.2.2.2.md} +0 -0
  603. /package/docs/issue/{issue_26.2.2.3.md → 26.2.2/issue_26.2.2.3.md} +0 -0
  604. /package/docs/issue/{issue_26.2.2.4.md → 26.2.2/issue_26.2.2.4.md} +0 -0
  605. /package/docs/issue/{issue_26.2.3.1.md → 26.2.3/issue_26.2.3.1.md} +0 -0
  606. /package/docs/issue/{issue_26.2.3.10.md → 26.2.3/issue_26.2.3.10.md} +0 -0
  607. /package/docs/issue/{issue_26.2.3.11.md → 26.2.3/issue_26.2.3.11.md} +0 -0
  608. /package/docs/issue/{issue_26.2.3.12.md → 26.2.3/issue_26.2.3.12.md} +0 -0
  609. /package/docs/issue/{issue_26.2.3.13.md → 26.2.3/issue_26.2.3.13.md} +0 -0
  610. /package/docs/issue/{issue_26.2.3.14.md → 26.2.3/issue_26.2.3.14.md} +0 -0
  611. /package/docs/issue/{issue_26.2.3.15.md → 26.2.3/issue_26.2.3.15.md} +0 -0
  612. /package/docs/issue/{issue_26.2.3.16.md → 26.2.3/issue_26.2.3.16.md} +0 -0
  613. /package/docs/issue/{issue_26.2.3.2.md → 26.2.3/issue_26.2.3.2.md} +0 -0
  614. /package/docs/issue/{issue_26.2.3.3.md → 26.2.3/issue_26.2.3.3.md} +0 -0
  615. /package/docs/issue/{issue_26.2.3.4.md → 26.2.3/issue_26.2.3.4.md} +0 -0
  616. /package/docs/issue/{issue_26.2.3.5.md → 26.2.3/issue_26.2.3.5.md} +0 -0
  617. /package/docs/issue/{issue_26.2.3.6.md → 26.2.3/issue_26.2.3.6.md} +0 -0
  618. /package/docs/issue/{issue_26.2.3.7.md → 26.2.3/issue_26.2.3.7.md} +0 -0
  619. /package/docs/issue/{issue_26.2.3.8.md → 26.2.3/issue_26.2.3.8.md} +0 -0
  620. /package/docs/issue/{issue_26.2.3.9.md → 26.2.3/issue_26.2.3.9.md} +0 -0
@@ -0,0 +1,976 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { css, html, nothing, unsafeCSS } from 'lit';
8
+ import { customElement, property, query, state } from 'lit/decorators.js';
9
+ import { classMap } from 'lit/directives/class-map.js';
10
+ import { createRef, ref } from 'lit/directives/ref.js';
11
+ import { AitheElement } from '../../core/aithe-element';
12
+ import { aitheBaseStyles } from '../../core/styles';
13
+ import { SyntaxRegistry } from '../../core/highlight';
14
+ import { aitheThemeText } from '../../styles/theme';
15
+ import { t } from '../../styles/i18n';
16
+ /**
17
+ * A full-featured code editor Web Component with syntax highlighting,
18
+ * line numbers, toolbar controls, resizable preview pane, and fullscreen mode.
19
+ *
20
+ * Architecture / 架构说明:
21
+ * - Uses a transparent <textarea> overlaid on a syntax-highlighted <div>
22
+ * (the "highlight layer") so the user sees colored text while typing
23
+ * into a native textarea for reliable input handling.
24
+ * - Syntax highlighting is powered by SyntaxRegistry, a rule-based tokenizer
25
+ * that supports 30+ languages out of the box.
26
+ * - The toolbar provides language selection, theme switching, copy,
27
+ * fullscreen, line numbers toggle, and preview pane toggle.
28
+ * - The preview pane is a slot-based area that can host custom content
29
+ * (e.g., a markdown renderer in markdown-editor).
30
+ *
31
+ * 使用透明的 <textarea> 覆盖在语法高亮的 <div>("高亮层")之上,
32
+ * 用户在原生 textarea 中输入时能看到彩色文本,同时获得可靠的输入处理。
33
+ * 语法高亮由 SyntaxRegistry 驱动,它是一个基于规则的分词器,内置支持 30+ 种语言。
34
+ * 工具栏提供语言选择、主题切换、复制、全屏、行号切换和预览面板切换。
35
+ * 预览面板是基于插槽的区域,可承载自定义内容(例如 markdown-editor 中的 markdown 渲染器)。
36
+ *
37
+ * @slot toolbar-left - Custom content on the left side of toolbar. 工具栏左侧的自定义内容。
38
+ * @slot toolbar-right - Custom content on the right side of toolbar. 工具栏右侧的自定义内容。
39
+ * @slot preview - Custom preview content (when show-preview is enabled). 自定义预览内容。
40
+ *
41
+ * @property {string} value - Editor content. 编辑器内容。
42
+ * @property {string} language - Programming language for syntax highlighting. 用于语法高亮的编程语言。
43
+ * @property {boolean} readonly - Whether the editor is readonly. 是否只读。
44
+ * @property {boolean} lineNumbers - Whether to show line numbers. 是否显示行号。
45
+ * @property {string} placeholder - Placeholder text when empty. 占位符文本。
46
+ * @property {boolean} showToolbar - Whether to show the toolbar. 是否显示工具栏。
47
+ * @property {boolean} showTheme - Whether to show the theme picker. 是否显示主题选择器。
48
+ * @property {boolean} showPreview - Whether to show the preview pane. 是否显示预览面板。
49
+ * @property {boolean} showLanguage - Whether to show the language selector. 是否显示语言选择器。
50
+ * @property {boolean} showFullscreen - Whether to show the fullscreen button. 是否显示全屏按钮。
51
+ * @property {boolean} showCopy - Whether to show the copy button. 是否显示复制按钮。
52
+ * @property {boolean} showLineNumbersToggle - Whether to show the line numbers toggle button. 是否显示行号切换按钮。
53
+ *
54
+ * @fires aithe-input - Fired when editor content changes. 当编辑器内容发生变化时触发。
55
+ * @fires aithe-focus - Fired when editor gains focus. 当编辑器获得焦点时触发。
56
+ * @fires aithe-blur - Fired when editor loses focus. 当编辑器失去焦点时触发。
57
+ * @fires aithe-language-change - Fired when language is changed via toolbar select. 通过工具栏选择更改语言时触发。
58
+ * @fires aithe-line-numbers-change - Fired when line numbers visibility is toggled. 行号显示切换时触发。
59
+ * @fires aithe-fullscreen-change - Fired when fullscreen mode is toggled. 全屏模式切换时触发。
60
+ * @fires aithe-copy - Fired after copy button is clicked. 点击复制按钮后触发。
61
+ * @fires aithe-theme-change - Fired when theme is changed via toolbar picker. 通过工具栏选择更改主题时触发。
62
+ * @fires aithe-preview-toggle - Fired when preview pane is toggled. 预览面板切换时触发。
63
+ *
64
+ * @example
65
+ * ```html
66
+ * <aithe-code-editor language="javascript" show-toolbar></aithe-code-editor>
67
+ * ```
68
+ */
69
+ let AitheCodeEditor = class AitheCodeEditor extends AitheElement {
70
+ constructor() {
71
+ super(...arguments);
72
+ /* ---- Public Properties ---- */
73
+ /** Editor content. Code text displayed in the editor. 编辑器内容。 */
74
+ this.value = '';
75
+ /** Programming language for syntax highlighting. 用于语法高亮的编程语言。 */
76
+ this.language = 'javascript';
77
+ /** Whether the editor is readonly. 是否只读。 */
78
+ this.readonly = false;
79
+ /** Whether to show line numbers on the left side. 是否显示左侧行号。 */
80
+ this.lineNumbers = true;
81
+ /** Placeholder text when editor is empty. 编辑器为空时显示的占位符文本。 */
82
+ this.placeholder = '';
83
+ /** Whether to show the toolbar. 是否显示工具栏。 */
84
+ this.showToolbar = false;
85
+ /** Whether to show the theme picker in toolbar. 是否在工具栏中显示主题选择器。 */
86
+ this.showTheme = true;
87
+ /** Whether to show the preview pane. 是否显示预览面板。 */
88
+ this.showPreview = false;
89
+ /** Whether to show the language selector in toolbar. 是否在工具栏中显示语言选择器。 */
90
+ this.showLanguage = true;
91
+ /** Whether to show the fullscreen button in toolbar. 是否在工具栏中显示全屏按钮。 */
92
+ this.showFullscreen = true;
93
+ /** Whether to show the copy button in toolbar. 是否在工具栏中显示复制按钮。 */
94
+ this.showCopy = true;
95
+ /** Whether to show the line numbers toggle button in toolbar. 是否在工具栏中显示行号切换按钮。 */
96
+ this.showLineNumbersToggle = true;
97
+ /** Whether the editor is currently focused. 编辑器是否聚焦。 */
98
+ this.focused = false;
99
+ /** Whether the editor is in fullscreen mode. 是否全屏模式。 */
100
+ this.isFullscreen = false;
101
+ /** Whether the copy button was just clicked (shows feedback). 复制按钮是否刚被点击(显示反馈)。 */
102
+ this.copied = false;
103
+ /** Current editor theme (from theme picker). 当前编辑器主题(来自主题选择器)。 */
104
+ this.editorTheme = '';
105
+ /** Whether the preview pane is visible. 预览面板是否可见。 */
106
+ this.previewVisible = false;
107
+ /** Whether the preview splitter is being dragged. 预览分割条是否正在拖动。 */
108
+ this.splitterDragging = false;
109
+ /** Refs for splitter, editor body, code pane, and preview pane elements. */
110
+ this.splitterRef = createRef();
111
+ this.editorBodyRef = createRef();
112
+ this.codePaneRef = createRef();
113
+ this.previewPaneRef = createRef();
114
+ /**
115
+ * Handles splitter drag move: calculates percentage and resizes panes.
116
+ * Clamps between 20%-80% to prevent collapsing either pane.
117
+ * 处理分割条拖动移动:计算百分比并调整面板大小。
118
+ * 限制在 20%-80% 之间以防止任一面板折叠。
119
+ */
120
+ this.handleSplitterMove = (e) => {
121
+ if (!this.splitterDragging)
122
+ return;
123
+ const body = this.editorBodyRef.value;
124
+ if (!body)
125
+ return;
126
+ const rect = body.getBoundingClientRect();
127
+ const offset = e.clientX - rect.left;
128
+ const pct = Math.max(20, Math.min(80, (offset / rect.width) * 100));
129
+ const codePane = this.codePaneRef.value;
130
+ const previewPane = this.previewPaneRef.value;
131
+ if (codePane)
132
+ codePane.style.flex = `0 0 ${pct}%`;
133
+ if (previewPane)
134
+ previewPane.style.flex = `0 0 ${100 - pct}%`;
135
+ };
136
+ /**
137
+ * Handles splitter drag end: cleans up listeners and removes dragging class.
138
+ * 处理分割条拖动结束:清理监听器并移除 dragging 类。
139
+ */
140
+ this.handleSplitterUp = () => {
141
+ this.splitterDragging = false;
142
+ this.splitterRef.value?.classList.remove('dragging');
143
+ document.removeEventListener('pointermove', this.handleSplitterMove);
144
+ document.removeEventListener('pointerup', this.handleSplitterUp);
145
+ };
146
+ /**
147
+ * Handles theme change from the theme picker component.
148
+ * Stores the selected theme and emits aithe-theme-change.
149
+ * 处理主题选择器的主题变更。存储所选主题并触发 aithe-theme-change 事件。
150
+ */
151
+ this.handleThemeChange = (event) => {
152
+ event.preventDefault();
153
+ const customEvent = event;
154
+ this.editorTheme = customEvent.detail.theme;
155
+ this.emit('aithe-theme-change', { theme: this.editorTheme });
156
+ };
157
+ }
158
+ static { this.styles = [
159
+ // Theme text tokens for syntax highlighting colors
160
+ unsafeCSS(aitheThemeText),
161
+ aitheBaseStyles,
162
+ css `
163
+ :host {
164
+ display: block;
165
+ font-family: var(
166
+ --aithe-font-family-mono,
167
+ 'SF Mono',
168
+ Consolas,
169
+ 'Liberation Mono',
170
+ Menlo,
171
+ monospace
172
+ );
173
+ }
174
+
175
+ /* Main editor wrapper with border and rounded corners */
176
+ .editor-wrapper {
177
+ display: flex;
178
+ flex-direction: column;
179
+ border: 1px solid var(--aithe-color-border, #e2e8f0);
180
+ border-radius: var(--aithe-container-radius-md, 6px);
181
+ overflow: hidden;
182
+ background: var(--aithe-color-bg, #ffffff);
183
+ }
184
+
185
+ /* Fullscreen mode: fixed position covering the viewport */
186
+ .editor-wrapper.fullscreen {
187
+ position: fixed;
188
+ top: 0;
189
+ left: 0;
190
+ right: 0;
191
+ bottom: 0;
192
+ z-index: 9999;
193
+ border-radius: 0;
194
+ background: var(--aithe-color-bg, #ffffff);
195
+ }
196
+
197
+ .fullscreen .editor-body {
198
+ height: calc(100vh - 45px);
199
+ }
200
+
201
+ /* Focus state: blue border ring */
202
+ .editor-wrapper.focused {
203
+ border-color: var(--aithe-primary-6, #3b82f6);
204
+ box-shadow: 0 0 0 2px var(--aithe-primary-2, rgba(59, 130, 246, 0.2));
205
+ }
206
+
207
+ /* Readonly state: muted background */
208
+ .editor-wrapper.readonly {
209
+ background: var(--aithe-color-surface-muted, #f8fafc);
210
+ }
211
+
212
+ /* ---- Toolbar ---- */
213
+ .toolbar {
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: space-between;
217
+ padding: 8px 12px;
218
+ background: var(--aithe-color-bg-subtle, #f8fafc);
219
+ border-bottom: 1px solid var(--aithe-color-border, #e2e8f0);
220
+ gap: 8px;
221
+ }
222
+
223
+ .toolbar-left {
224
+ display: flex;
225
+ align-items: center;
226
+ gap: 8px;
227
+ }
228
+
229
+ .toolbar-right {
230
+ display: flex;
231
+ align-items: center;
232
+ gap: 4px;
233
+ }
234
+
235
+ /* Toolbar icon buttons */
236
+ .toolbar-btn {
237
+ display: inline-flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ width: 28px;
241
+ height: 28px;
242
+ padding: 0;
243
+ border: none;
244
+ border-radius: var(--aithe-radius-md, 4px);
245
+ background: transparent;
246
+ color: var(--aithe-color-text-muted, #64748b);
247
+ cursor: pointer;
248
+ transition:
249
+ background 0.15s,
250
+ color 0.15s;
251
+ }
252
+
253
+ .toolbar-btn:hover {
254
+ background: var(--aithe-color-bg, #f1f5f9);
255
+ color: var(--aithe-color-text, #1e293b);
256
+ }
257
+
258
+ .toolbar-btn:active {
259
+ background: var(--aithe-color-border, #e2e8f0);
260
+ }
261
+
262
+ .toolbar-btn.active,
263
+ ::slotted(.md-toolbar-btn.active) {
264
+ background: var(--aithe-primary-1, #f2f7ff);
265
+ color: var(--aithe-primary-6, #3b82f6);
266
+ }
267
+
268
+ /* Slotted toolbar button styling (for markdown-editor integration) */
269
+ ::slotted(.md-toolbar-btn) {
270
+ display: inline-flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ width: 28px;
274
+ height: 28px;
275
+ padding: 0;
276
+ border: none;
277
+ border-radius: var(--aithe-radius-md, 4px);
278
+ background: transparent;
279
+ color: var(--aithe-color-text-muted, #64748b);
280
+ cursor: pointer;
281
+ transition:
282
+ background 0.15s,
283
+ color 0.15s;
284
+ }
285
+
286
+ ::slotted(.md-toolbar-btn:hover) {
287
+ background: var(--aithe-color-bg, #f1f5f9);
288
+ color: var(--aithe-color-text, #1e293b);
289
+ }
290
+
291
+ /* Copied state: green color feedback */
292
+ .toolbar-btn.copied {
293
+ color: var(--aithe-success-6, #22c55e);
294
+ }
295
+
296
+ /* Language select dropdown */
297
+ .language-select {
298
+ display: inline-flex;
299
+ align-items: center;
300
+ padding: 4px 8px;
301
+ border: 1px solid var(--aithe-color-border, #e2e8f0);
302
+ border-radius: var(--aithe-radius-md, 4px);
303
+ background: var(--aithe-color-surface, #ffffff);
304
+ color: var(--aithe-color-text, #1e293b);
305
+ font-size: 12px;
306
+ cursor: pointer;
307
+ transition: border-color 0.15s;
308
+ }
309
+
310
+ .language-select:hover {
311
+ border-color: var(--aithe-primary-5, #3b82f6);
312
+ }
313
+
314
+ .language-select:focus {
315
+ outline: none;
316
+ border-color: var(--aithe-primary-6, #3b82f6);
317
+ box-shadow: 0 0 0 2px var(--aithe-primary-2, rgba(59, 130, 246, 0.2));
318
+ }
319
+
320
+ /* ---- Editor Body ---- */
321
+ .editor-body {
322
+ position: relative;
323
+ overflow: hidden;
324
+ }
325
+
326
+ /* Split layout: code on left, preview on right */
327
+ .editor-body.has-preview {
328
+ display: flex;
329
+ flex-direction: row;
330
+ }
331
+
332
+ .editor-body .code-pane {
333
+ min-width: 0;
334
+ display: flex;
335
+ flex-direction: column;
336
+ }
337
+
338
+ .editor-body .preview-pane {
339
+ flex: 1;
340
+ min-width: 0;
341
+ overflow: auto;
342
+ padding: 12px;
343
+ border-left: 1px solid var(--aithe-color-border, #e2e8f0);
344
+ background: var(--aithe-color-bg, #ffffff);
345
+ }
346
+
347
+ .editor-body .preview-pane.hidden {
348
+ display: none;
349
+ }
350
+
351
+ /* Resizable splitter between code and preview panes */
352
+ .editor-body .preview-splitter {
353
+ width: 4px;
354
+ cursor: col-resize;
355
+ background: var(--aithe-color-border, #e2e8f0);
356
+ flex-shrink: 0;
357
+ position: relative;
358
+ z-index: 2;
359
+ transition: background 0.15s;
360
+ }
361
+
362
+ .editor-body .preview-splitter:hover,
363
+ .editor-body .preview-splitter.dragging {
364
+ background: var(--aithe-primary-5, #3b82f6);
365
+ }
366
+
367
+ /* Code area container */
368
+ .editor-container {
369
+ display: flex;
370
+ width: 100%;
371
+ align-items: stretch;
372
+ overflow: auto;
373
+ }
374
+
375
+ /* Line numbers gutter */
376
+ .line-numbers {
377
+ flex-shrink: 0;
378
+ width: 44px;
379
+ padding: 12px 8px 12px 12px;
380
+ text-align: right;
381
+ color: var(--aithe-color-text-muted, #94a3b8);
382
+ background: var(--aithe-color-surface-muted, #f8fafc);
383
+ border-right: 1px solid var(--aithe-color-border, #e2e8f0);
384
+ font-size: 14px;
385
+ line-height: 1.6;
386
+ user-select: none;
387
+ white-space: pre;
388
+ }
389
+
390
+ .code-area {
391
+ position: relative;
392
+ min-width: 0;
393
+ }
394
+
395
+ /* Grid layout: highlight layer and textarea share the same grid cell */
396
+ .code-area-content {
397
+ position: relative;
398
+ display: grid;
399
+ min-height: 46.4px;
400
+ padding: 12px;
401
+ font-family: inherit;
402
+ font-size: 14px;
403
+ line-height: 1.6;
404
+ white-space: pre-wrap;
405
+ word-wrap: break-word;
406
+ }
407
+
408
+ .code-area-content > * {
409
+ grid-area: 1 / 1 / 2 / 2;
410
+ }
411
+
412
+ .fullscreen .code-area {
413
+ max-height: none;
414
+ }
415
+
416
+ /* Syntax-highlighted layer (non-interactive, behind textarea) */
417
+ .highlight-layer {
418
+ color: var(--aithe-color-text, #1e293b);
419
+ pointer-events: none;
420
+ }
421
+
422
+ /* Transparent textarea overlay (interactive, on top) */
423
+ textarea.input-layer {
424
+ resize: none;
425
+ color: transparent;
426
+ caret-color: var(--aithe-color-text, #1e293b);
427
+ background: transparent;
428
+ outline: none;
429
+ border: none;
430
+ padding: 0;
431
+ margin: 0;
432
+ font-family: inherit;
433
+ font-size: 14px;
434
+ line-height: 1.6;
435
+ white-space: pre-wrap;
436
+ word-wrap: break-word;
437
+ z-index: 1;
438
+ pointer-events: auto;
439
+ overflow: hidden;
440
+ }
441
+
442
+ .editor-container.readonly .input-layer {
443
+ pointer-events: none;
444
+ }
445
+
446
+ /* ---- Syntax Highlighting Classes ---- */
447
+ /* These classes are applied by SyntaxRegistry rules.
448
+ Colors are controlled by --aithe-code-* CSS custom properties
449
+ which are set by each Aithe theme. */
450
+
451
+ .hl-comment {
452
+ color: var(--aithe-code-comment, #94a3b8);
453
+ font-style: italic;
454
+ }
455
+
456
+ .hl-keyword {
457
+ color: var(--aithe-code-keyword, #a626a4);
458
+ }
459
+
460
+ .hl-boolean {
461
+ color: var(--aithe-code-boolean, #986801);
462
+ }
463
+
464
+ .hl-builtin {
465
+ color: var(--aithe-code-builtin, #4078f2);
466
+ }
467
+
468
+ .hl-number {
469
+ color: var(--aithe-code-number, #986801);
470
+ }
471
+
472
+ .hl-string {
473
+ color: var(--aithe-code-string, #50a14f);
474
+ }
475
+
476
+ .hl-function {
477
+ color: var(--aithe-code-function, #4078f2);
478
+ }
479
+
480
+ .hl-type {
481
+ color: var(--aithe-code-type, #c18401);
482
+ }
483
+
484
+ .hl-preprocessor {
485
+ color: var(--aithe-code-preprocessor, #a626a4);
486
+ }
487
+
488
+ .hl-tag {
489
+ color: var(--aithe-code-tag, #e45649);
490
+ }
491
+
492
+ .hl-attr {
493
+ color: var(--aithe-code-attr, #986801);
494
+ }
495
+
496
+ .hl-key {
497
+ color: var(--aithe-code-key, #e45649);
498
+ }
499
+
500
+ .hl-punctuation {
501
+ color: var(--aithe-code-punctuation, #383a42);
502
+ }
503
+
504
+ .hl-doctype {
505
+ color: var(--aithe-code-doctype, #94a3b8);
506
+ font-style: italic;
507
+ }
508
+
509
+ .hl-entity {
510
+ color: var(--aithe-code-entity, #986801);
511
+ }
512
+
513
+ .hl-placeholder {
514
+ color: var(--aithe-code-placeholder, #94a3b8);
515
+ }
516
+ `,
517
+ ]; }
518
+ /* ---- Computed Properties ---- */
519
+ /**
520
+ * Returns the syntax-highlighted HTML for the current value and language.
521
+ * Falls back to placeholder text if the editor is empty.
522
+ * 返回当前值和语言的语法高亮 HTML。编辑器为空时回退到占位符文本。
523
+ */
524
+ get highlightedHtml() {
525
+ if (!this.value) {
526
+ return this.placeholder ? `<span class="hl-placeholder">${this.placeholder}</span>` : '';
527
+ }
528
+ return SyntaxRegistry.highlightByLanguage(this.value, this.language);
529
+ }
530
+ /**
531
+ * Returns the number of lines in the current value.
532
+ * 返回当前值的行数。
533
+ */
534
+ get lineCount() {
535
+ return (this.value.match(/\n/g) || []).length + 1;
536
+ }
537
+ /* ---- Lifecycle ---- */
538
+ firstUpdated() {
539
+ // Height is handled by CSS: .code-area has max-height: 400px with overflow: auto.
540
+ // 高度由 CSS 控制:.code-area 设置 max-height: 400px 和 overflow: auto。
541
+ }
542
+ updated(changedProperties) {
543
+ // Height is handled by CSS.
544
+ // 高度由 CSS 控制。
545
+ }
546
+ /* ---- Event Handlers ---- */
547
+ /**
548
+ * Handles textarea input: updates value and emits aithe-input.
549
+ * 处理 textarea 输入:更新 value 并触发 aithe-input 事件。
550
+ */
551
+ handleInput(e) {
552
+ e.stopPropagation();
553
+ const target = e.target;
554
+ this.value = target.value;
555
+ this.emit('aithe-input', { value: this.value });
556
+ }
557
+ /** Handles focus event. 处理聚焦事件。 */
558
+ handleFocus() {
559
+ this.focused = true;
560
+ this.emit('aithe-focus');
561
+ }
562
+ /** Handles blur event. 处理失焦事件。 */
563
+ handleBlur() {
564
+ this.focused = false;
565
+ this.emit('aithe-blur');
566
+ }
567
+ /**
568
+ * Handles Tab key: inserts 2 spaces instead of moving focus.
569
+ * 处理 Tab 键:插入 2 个空格而不是切换焦点。
570
+ */
571
+ handleKeyDown(e) {
572
+ if (e.key === 'Tab') {
573
+ e.preventDefault();
574
+ const textarea = this.textarea;
575
+ const start = textarea.selectionStart;
576
+ const end = textarea.selectionEnd;
577
+ const value = textarea.value;
578
+ this.value = value.substring(0, start) + ' ' + value.substring(end);
579
+ this.emit('aithe-input', { value: this.value });
580
+ requestAnimationFrame(() => {
581
+ textarea.selectionStart = textarea.selectionEnd = start + 2;
582
+ });
583
+ }
584
+ }
585
+ /** Handles language selector change. 处理语言选择器变更。 */
586
+ handleLanguageChange(e) {
587
+ const target = e.target;
588
+ this.language = target.value;
589
+ this.emit('aithe-language-change', { language: this.language });
590
+ }
591
+ /** Toggles line numbers visibility. 切换行号显示。 */
592
+ handleToggleLineNumbers() {
593
+ this.lineNumbers = !this.lineNumbers;
594
+ this.emit('aithe-line-numbers-change', { lineNumbers: this.lineNumbers });
595
+ }
596
+ /**
597
+ * Toggles fullscreen mode. When entering fullscreen,
598
+ * locks body scroll to prevent background scrolling.
599
+ * 切换全屏模式。进入全屏时锁定 body 滚动以防止背景滚动。
600
+ */
601
+ handleFullscreen() {
602
+ this.isFullscreen = !this.isFullscreen;
603
+ this.emit('aithe-fullscreen-change', { isFullscreen: this.isFullscreen });
604
+ if (this.isFullscreen) {
605
+ document.body.style.overflow = 'hidden';
606
+ }
607
+ else {
608
+ document.body.style.overflow = '';
609
+ }
610
+ }
611
+ /**
612
+ * Copies editor content to clipboard using the Clipboard API.
613
+ * Shows a brief "copied" feedback state for 2 seconds.
614
+ * 使用 Clipboard API 将编辑器内容复制到剪贴板。
615
+ * 显示 2 秒的"已复制"反馈状态。
616
+ */
617
+ async handleCopy() {
618
+ try {
619
+ await navigator.clipboard.writeText(this.value);
620
+ this.copied = true;
621
+ this.emit('aithe-copy', { success: true, value: this.value });
622
+ setTimeout(() => {
623
+ this.copied = false;
624
+ }, 2000);
625
+ }
626
+ catch (err) {
627
+ this.emit('aithe-copy', { success: false, error: err });
628
+ }
629
+ }
630
+ /** Toggles preview pane visibility. 切换预览面板可见性。 */
631
+ handleTogglePreview() {
632
+ this.previewVisible = !this.previewVisible;
633
+ this.emit('aithe-preview-toggle', { visible: this.previewVisible });
634
+ }
635
+ /* ---- Preview Splitter (Drag to Resize) ---- */
636
+ /**
637
+ * Initializes splitter drag: captures pointer and adds move/up listeners.
638
+ * 初始化分割条拖动:捕获指针并添加 move/up 监听器。
639
+ */
640
+ handleSplitterDown(e) {
641
+ e.preventDefault();
642
+ this.splitterDragging = true;
643
+ this.splitterRef.value?.classList.add('dragging');
644
+ document.addEventListener('pointermove', this.handleSplitterMove);
645
+ document.addEventListener('pointerup', this.handleSplitterUp);
646
+ }
647
+ /**
648
+ * Global keydown handler: Escape exits fullscreen.
649
+ * 全局键盘事件处理:Escape 键退出全屏。
650
+ */
651
+ handleGlobalKeyDown(e) {
652
+ if (e.key === 'Escape' && this.isFullscreen) {
653
+ this.handleFullscreen();
654
+ }
655
+ }
656
+ /* ---- Public Methods ---- */
657
+ /** Focus the editor textarea. 将焦点设置到编辑器文本区域。 */
658
+ focus() {
659
+ this.textarea?.focus();
660
+ }
661
+ /** Get the start position of text selection. 获取选区起始位置。 */
662
+ getSelectionStart() {
663
+ return this.textarea?.selectionStart ?? 0;
664
+ }
665
+ /** Get the end position of text selection. 获取选区结束位置。 */
666
+ getSelectionEnd() {
667
+ return this.textarea?.selectionEnd ?? 0;
668
+ }
669
+ /** Set the text selection range. 设置文本选区范围。 */
670
+ setSelection(start, end) {
671
+ if (this.textarea) {
672
+ this.textarea.selectionStart = start;
673
+ this.textarea.selectionEnd = end;
674
+ }
675
+ }
676
+ /**
677
+ * Get the list of supported languages from SyntaxRegistry.
678
+ * 从 SyntaxRegistry 获取支持的语言列表。
679
+ */
680
+ static getSupportedLanguages() {
681
+ return Array.from(SyntaxRegistry.getAll().values()).map((def) => ({
682
+ langId: def.langId,
683
+ name: def.name ?? def.langId,
684
+ }));
685
+ }
686
+ /* ---- Lifecycle: Connected / Disconnected ---- */
687
+ connectedCallback() {
688
+ super.connectedCallback();
689
+ document.addEventListener('keydown', this.handleGlobalKeyDown.bind(this));
690
+ }
691
+ disconnectedCallback() {
692
+ super.disconnectedCallback();
693
+ document.removeEventListener('keydown', this.handleGlobalKeyDown.bind(this));
694
+ document.body.style.overflow = '';
695
+ }
696
+ /* ---- Render Methods ---- */
697
+ /**
698
+ * Renders the language selector dropdown.
699
+ * 渲染语言选择器下拉框。
700
+ */
701
+ renderLanguageSelect() {
702
+ if (!this.showLanguage)
703
+ return nothing;
704
+ return html `
705
+ <select
706
+ class="language-select"
707
+ .value=${this.language}
708
+ @change=${this.handleLanguageChange}
709
+ >
710
+ ${Array.from(SyntaxRegistry.getAll().values()).map((def) => html `
711
+ <option value=${def.langId} ?selected=${def.langId === this.language}>
712
+ ${def.name ?? def.langId}
713
+ </option>
714
+ `)}
715
+ </select>
716
+ `;
717
+ }
718
+ /**
719
+ * Renders the line numbers toggle button.
720
+ * 渲染行号切换按钮。
721
+ */
722
+ renderLineNumbersToggle() {
723
+ if (!this.showLineNumbersToggle)
724
+ return nothing;
725
+ return html `
726
+ <button
727
+ class="toolbar-btn ${classMap({ active: this.lineNumbers })}"
728
+ title=${this.lineNumbers
729
+ ? t('display.codeEditor.hideLineNumbers', 'Hide line numbers')
730
+ : t('display.codeEditor.showLineNumbers', 'Show line numbers')}
731
+ @click=${this.handleToggleLineNumbers}
732
+ >
733
+ <aithe-icon name="list" size="16"></aithe-icon>
734
+ </button>
735
+ `;
736
+ }
737
+ /**
738
+ * Renders the theme picker button.
739
+ * 渲染主题选择器按钮。
740
+ */
741
+ renderThemePicker() {
742
+ if (!this.showTheme)
743
+ return nothing;
744
+ return html `
745
+ <aithe-theme-picker
746
+ .value=${(this.editorTheme || this.computedTheme)}
747
+ placement="bottom-end"
748
+ icon-only
749
+ @aithe-theme-change=${this.handleThemeChange}
750
+ ></aithe-theme-picker>
751
+ `;
752
+ }
753
+ /**
754
+ * Renders the preview toggle button.
755
+ * 渲染预览切换按钮。
756
+ */
757
+ renderPreviewToggle() {
758
+ if (!this.showPreview)
759
+ return nothing;
760
+ return html `
761
+ <button
762
+ class="toolbar-btn ${classMap({ active: this.previewVisible })}"
763
+ title=${this.previewVisible
764
+ ? t('display.codeEditor.hidePreview', 'Hide preview')
765
+ : t('display.codeEditor.showPreview', 'Show preview')}
766
+ @click=${this.handleTogglePreview}
767
+ >
768
+ <aithe-icon name="eye" size="16"></aithe-icon>
769
+ </button>
770
+ `;
771
+ }
772
+ /**
773
+ * Renders the copy button.
774
+ * 渲染复制按钮。
775
+ */
776
+ renderCopyButton() {
777
+ if (!this.showCopy)
778
+ return nothing;
779
+ return html `
780
+ <button
781
+ class="toolbar-btn ${classMap({ copied: this.copied })}"
782
+ title=${this.copied
783
+ ? t('display.codeEditor.copied', 'Copied!')
784
+ : t('display.codeEditor.copyCode', 'Copy code')}
785
+ @click=${this.handleCopy}
786
+ >
787
+ <aithe-icon name="copy" size="16"></aithe-icon>
788
+ </button>
789
+ `;
790
+ }
791
+ /**
792
+ * Renders the fullscreen toggle button.
793
+ * 渲染全屏切换按钮。
794
+ */
795
+ renderFullscreenButton() {
796
+ if (!this.showFullscreen)
797
+ return nothing;
798
+ return html `
799
+ <button
800
+ class="toolbar-btn"
801
+ title=${this.isFullscreen
802
+ ? t('display.codeEditor.exitFullscreen', 'Exit fullscreen')
803
+ : t('display.codeEditor.fullscreen', 'Fullscreen')}
804
+ @click=${this.handleFullscreen}
805
+ >
806
+ <aithe-icon
807
+ name=${this.isFullscreen ? 'collapse' : 'expand'}
808
+ size="16"
809
+ ></aithe-icon>
810
+ </button>
811
+ `;
812
+ }
813
+ /**
814
+ * Renders the toolbar with language selector, theme picker,
815
+ * and action buttons (line numbers, preview, copy, fullscreen).
816
+ * 渲染工具栏,包含语言选择器、主题选择器和操作按钮。
817
+ */
818
+ renderToolbar() {
819
+ return html `
820
+ <div class="toolbar">
821
+ <div class="toolbar-left">
822
+ ${this.renderLanguageSelect()}
823
+ <slot name="toolbar-left"></slot>
824
+ </div>
825
+ <div class="toolbar-right">
826
+ <slot name="toolbar-right"></slot>
827
+ ${this.renderLineNumbersToggle()}
828
+ ${this.renderThemePicker()}
829
+ ${this.renderPreviewToggle()}
830
+ ${this.renderCopyButton()}
831
+ ${this.renderFullscreenButton()}
832
+ </div>
833
+ </div>
834
+ `;
835
+ }
836
+ /**
837
+ * Renders the editor body with line numbers gutter and
838
+ * the textarea + highlight layer overlay.
839
+ * 渲染编辑器主体,包含行号槽和 textarea + 高亮层叠加。
840
+ */
841
+ renderEditorBody() {
842
+ const containerClasses = classMap({
843
+ 'editor-container': true,
844
+ readonly: this.readonly,
845
+ });
846
+ const lineNumberItems = Array.from({ length: this.lineCount }, (_, i) => i + 1).join('\n');
847
+ return html `
848
+ <div class=${containerClasses}>
849
+ ${this.lineNumbers
850
+ ? html `
851
+ <div class="line-numbers">${lineNumberItems}</div>
852
+ `
853
+ : ''}
854
+ <div class="code-area">
855
+ <div class="code-area-content">
856
+ <!-- Syntax-highlighted layer (behind textarea, non-interactive) -->
857
+ <div class="highlight-layer" .innerHTML=${this.highlightedHtml}></div>
858
+ <!-- Transparent textarea (on top, handles all user input) -->
859
+ <textarea
860
+ class="input-layer"
861
+ spellcheck="false"
862
+ ?readonly=${this.readonly}
863
+ .value=${this.value}
864
+ @input=${this.handleInput}
865
+ @focus=${this.handleFocus}
866
+ @blur=${this.handleBlur}
867
+ @keydown=${this.handleKeyDown}
868
+ ></textarea>
869
+ </div>
870
+ </div>
871
+ </div>
872
+ `;
873
+ }
874
+ /**
875
+ * Main render: assembles the editor wrapper with toolbar,
876
+ * editor body, optional preview pane, and resizable splitter.
877
+ * 主渲染:组装编辑器外壳,包含工具栏、编辑器主体、可选预览面板和可调整分割条。
878
+ */
879
+ render() {
880
+ const wrapperClasses = classMap({
881
+ 'editor-wrapper': true,
882
+ focused: this.focused,
883
+ readonly: this.readonly,
884
+ fullscreen: this.isFullscreen,
885
+ });
886
+ const bodyClasses = classMap({
887
+ 'editor-body': true,
888
+ 'has-preview': this.showPreview && this.previewVisible,
889
+ });
890
+ const previewClasses = classMap({
891
+ 'preview-pane': true,
892
+ hidden: !this.showPreview || !this.previewVisible,
893
+ });
894
+ return html `
895
+ <div class=${wrapperClasses} data-aithe-theme=${this.editorTheme || this.computedTheme}>
896
+ ${this.showToolbar ? this.renderToolbar() : nothing}
897
+ <div class=${bodyClasses} ${ref(this.editorBodyRef)}>
898
+ <div class="code-pane" ${ref(this.codePaneRef)}>${this.renderEditorBody()}</div>
899
+ ${this.showPreview
900
+ ? html `
901
+ <div
902
+ class="preview-splitter"
903
+ ${ref(this.splitterRef)}
904
+ @pointerdown=${this.handleSplitterDown}
905
+ ></div>
906
+ <div class=${previewClasses} ${ref(this.previewPaneRef)}>
907
+ <slot name="preview"></slot>
908
+ </div>
909
+ `
910
+ : nothing}
911
+ </div>
912
+ </div>
913
+ `;
914
+ }
915
+ };
916
+ __decorate([
917
+ property({ type: String })
918
+ ], AitheCodeEditor.prototype, "value", void 0);
919
+ __decorate([
920
+ property({ type: String })
921
+ ], AitheCodeEditor.prototype, "language", void 0);
922
+ __decorate([
923
+ property({ type: Boolean, reflect: true })
924
+ ], AitheCodeEditor.prototype, "readonly", void 0);
925
+ __decorate([
926
+ property({ type: Boolean, attribute: 'line-numbers' })
927
+ ], AitheCodeEditor.prototype, "lineNumbers", void 0);
928
+ __decorate([
929
+ property({ type: String })
930
+ ], AitheCodeEditor.prototype, "placeholder", void 0);
931
+ __decorate([
932
+ property({ type: Boolean, attribute: 'show-toolbar' })
933
+ ], AitheCodeEditor.prototype, "showToolbar", void 0);
934
+ __decorate([
935
+ property({ type: Boolean, attribute: 'show-theme' })
936
+ ], AitheCodeEditor.prototype, "showTheme", void 0);
937
+ __decorate([
938
+ property({ type: Boolean, attribute: 'show-preview' })
939
+ ], AitheCodeEditor.prototype, "showPreview", void 0);
940
+ __decorate([
941
+ property({ type: Boolean, attribute: 'show-language' })
942
+ ], AitheCodeEditor.prototype, "showLanguage", void 0);
943
+ __decorate([
944
+ property({ type: Boolean, attribute: 'show-fullscreen' })
945
+ ], AitheCodeEditor.prototype, "showFullscreen", void 0);
946
+ __decorate([
947
+ property({ type: Boolean, attribute: 'show-copy' })
948
+ ], AitheCodeEditor.prototype, "showCopy", void 0);
949
+ __decorate([
950
+ property({ type: Boolean, attribute: 'show-line-numbers-toggle' })
951
+ ], AitheCodeEditor.prototype, "showLineNumbersToggle", void 0);
952
+ __decorate([
953
+ query('.input-layer')
954
+ ], AitheCodeEditor.prototype, "textarea", void 0);
955
+ __decorate([
956
+ state()
957
+ ], AitheCodeEditor.prototype, "focused", void 0);
958
+ __decorate([
959
+ state()
960
+ ], AitheCodeEditor.prototype, "isFullscreen", void 0);
961
+ __decorate([
962
+ state()
963
+ ], AitheCodeEditor.prototype, "copied", void 0);
964
+ __decorate([
965
+ state()
966
+ ], AitheCodeEditor.prototype, "editorTheme", void 0);
967
+ __decorate([
968
+ state()
969
+ ], AitheCodeEditor.prototype, "previewVisible", void 0);
970
+ __decorate([
971
+ state()
972
+ ], AitheCodeEditor.prototype, "splitterDragging", void 0);
973
+ AitheCodeEditor = __decorate([
974
+ customElement('aithe-code-editor')
975
+ ], AitheCodeEditor);
976
+ export { AitheCodeEditor };