For AI agents: the complete documentation index is available at https://a3s-lab.github.io/UI/v0.4.0/llms.txt, the full documentation bundle is available at https://a3s-lab.github.io/UI/v0.4.0/llms-full.txt, and this page is available as Markdown at https://a3s-lab.github.io/UI/v0.4.0/components/code-editor.md.

代码编辑器

代码编辑器包含两层能力:A3S UI 提供框架无关的原生编辑契约,下面的完整工作台则演示如何接入真正的 Monaco Editor,构建接近 VS Code 的多文件开发体验。

完整 Monaco 工作台

实时预览
Release 审查示例工作区

正在启动 Monaco 语言服务…

main行 1, 列 1空格: 2UTF-8A3S ACL
命令面板

这是一个可交互的真实 Monaco 示例,而不是静态效果图。它包含四个独立文件模型、文件树与标签页、搜索和修改状态、ACL 自定义语法高亮与补全、TypeScript 和 JSON 诊断、问题/输出/终端面板、Minimap、明暗主题同步,以及命令面板。

  • 按 Ctrl/Cmd + Shift + P 或 F1 打开命令面板。
  • 按 Ctrl/Cmd + S 保存当前模型,按 Ctrl/Cmd + J 显示或隐藏底部面板。
  • 在文件树和标签页之间切换时,Monaco 会保留每个文件的内容、光标与撤销历史。
  • 点击问题面板中的警告会回到对应 ACL 行;搜索、格式化、Minimap 与主题命令均可实际操作。

工作区内容用于演示交互和语言服务,并不代表一套可直接部署的生产配置。宿主应用仍应负责文件持久化、权限、远程语言服务与运行任务。

原生回退

无需 Monaco 时,使用 A3S UI 自带的 textarea 控制器即可获得缩进快捷键、行列状态、保存状态和 JSON 校验。

实时预览
workflow.ts
TypeScriptCtrl/Cmd S
已保存

用法

先加载运行时,再加载代码编辑器控制器;也可以直接使用组合 JavaScript 包。完整的 A3S 样式包已经包含结构层与视觉层。

<div
  class="code-editor"
  role="group"
  data-language="typescript"
  aria-label="工作流代码编辑器"
>
  <header>
    <div data-code-editor-file><strong>workflow.ts</strong></div>
    <div data-code-editor-actions>
      <span data-code-editor-language>TypeScript</span>
    </div>
  </header>
  <section>
    <textarea aria-label="工作流 TypeScript 代码" spellcheck="false"></textarea>
  </section>
  <footer>
    <div data-code-editor-info>
      <span data-code-editor-state aria-live="polite">已保存</span
      ><span data-code-editor-lines></span
      ><span data-code-editor-characters></span>
    </div>
    <div data-code-editor-meta>
      <output data-code-editor-position aria-label="光标位置"></output>
    </div>
  </footer>
</div>
<script type="module">
  import "@a3s-lab/ui/runtime";
  import "@a3s-lab/ui/code-editor";
</script>

使用完整运行时包时,写法等价于:

import "@a3s-lab/ui/all";

参数

参数可选值默认值用途
根 data-language任意语言标识text描述文档类型;设为 json 时自动启用 JSON 校验
根 data-validationjson—独立于语言标签显式启用校验
根 data-indent-size正整数2Tab 插入、Shift+Tab 删除的空格数
根 data-sizesm、lg—紧凑或高编辑区;默认高度为 15rem
根 data-line-numbersfalse—隐藏行号槽
根 data-wraptrue—在原生编辑模式下换行显示长行
--code-editor-min-heightCSS 长度15rem最小与默认编辑高度
--code-editor-font-sizeCSS 长度0.75rem编辑区与行号字号
--code-editor-line-heightCSS 长度1.375rem文本与行号共用的行高
--code-editor-tab-size正整数2可视 Tab 宽度

生成的状态文案可以通过 data-label-* 属性本地化。可用名称包括 labelLine、labelLines、labelCharacter、labelCharacters、labelPosition、labelSaved、labelDirty、labelReadonly、labelDisabled、labelValid、labelInvalidPrefix 与 labelEmpty。JSON 错误位置也使用 labelPosition 模板。

header、[data-code-editor-file]、[data-code-editor-actions]、[data-code-editor-language]、footer 与状态输出均为可选项。即使省略外层装饰,也要为 textarea 保留可访问名称。

JavaScript API

使用原生 textarea 回退模式时,控制器初始化后会在根节点添加以下方法:

方法用途
editor.getValue()返回当前 textarea 值
editor.setValue(value, { clean })设置值并刷新状态;clean: true 将其设为已保存基线
editor.markClean()将当前值标记为已保存
editor.refresh()读取应用代码直接修改的值并刷新状态

根节点会在用户或程序修改时发出 a3s:code-input,在按下 Ctrl/Cmd+S 时发出 a3s:code-save,在 markClean() 后发出 a3s:code-clean。事件详情包含 value、lines、characters、position、dirty 与 validationState。

状态与变体

JSON 校验

设置 data-validation="json"(或 data-language="json")并提供消息目标。空值视为待完成,有效值会播报校验通过,格式错误会在 textarea 上设置 aria-invalid="true"。

实时预览
settings.json
JSON
已保存

只读

使用原生 readonly 属性保留选择和复制能力,同时禁止修改;当值不应参与交互或提交时,使用 disabled。

实时预览
runtime.yaml
YAML

Monaco 集成契约

完整示例通过独立挂载目标加载 Monaco,并保留 A3S 工作台的头部、侧栏、面板和状态栏契约。设计系统负责布局与视觉层;宿主适配器负责 worker、语言注册、补全、诊断、模型生命周期、持久化,以及状态输出和 data-* 状态的同步。

<div
  class="code-editor"
  role="group"
  data-language="typescript"
  aria-label="工作流代码编辑器"
>
  <header>...</header>
  <section>
    <div data-code-editor-viewport id="workflow-editor-mount"></div>
  </section>
  <footer>...</footer>
</div>

可访问性

Monaco 示例为编辑器、工作区导航、面板和命令对话框提供独立的可访问名称,并把保存与命令结果放入礼貌播报区域;键盘用户可使用文件按钮、标签页和标准编辑快捷键完成整个流程。Monaco 自身管理可访问文本输入、光标与诊断信息。

原生回退的编辑表面是 textarea,因此无需 JavaScript 编辑器引擎即可使用选择、复制、撤销、重做、屏幕阅读器文本编辑与浏览器表单提交。为它提供明确的 aria-label,或通过 for 关联可见 <label>;根节点有可访问名称时应设置 role="group"。只把保存状态放入 aria-live="polite" 区域,避免每次按键都播报光标位置和统计信息;校验消息会自行管理 status 或 alert 角色。行号槽是装饰内容,控制器会将其标记为 aria-hidden。

控制器遵循 readonly、disabled、减少动态效果、浏览器缩放与 RTL 方向。只有当可编辑 textarea 获得焦点时才会拦截 Ctrl/Cmd+S;Tab 与 Shift+Tab 缩进当前行或选区,其他修饰键组合仍交给浏览器和辅助技术处理。