tt-design-web-vue 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3751 -2747
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/ai/AiArtifactRow/AiArtifactRow.vue.d.ts +54 -0
- package/dist/types/ai/AiArtifactRow/index.d.ts +2 -0
- package/dist/types/ai/AiExecutionFeed/AiExecutionFeed.vue.d.ts +43 -0
- package/dist/types/ai/AiExecutionFeed/index.d.ts +1 -0
- package/dist/types/ai/AiFoldText/AiFoldText.vue.d.ts +35 -0
- package/dist/types/ai/AiFoldText/index.d.ts +1 -0
- package/dist/types/ai/AiResultPanel/AiResultPanel.vue.d.ts +23 -0
- package/dist/types/ai/AiResultPanel/index.d.ts +1 -0
- package/dist/types/ai/AiStatusCode/AiStatusCode.vue.d.ts +20 -0
- package/dist/types/ai/AiStatusCode/index.d.ts +3 -0
- package/dist/types/ai/AiStatusCode/status.d.ts +27 -0
- package/dist/types/ai/AiSubagentLineage/AiSubagentLineage.vue.d.ts +33 -0
- package/dist/types/ai/AiSubagentLineage/index.d.ts +2 -0
- package/dist/types/ai/AiTodoProgress/AiTodoProgress.vue.d.ts +41 -0
- package/dist/types/ai/AiTodoProgress/index.d.ts +2 -0
- package/dist/types/ai/AiToolCall/AiToolCall.vue.d.ts +64 -0
- package/dist/types/ai/AiToolCall/index.d.ts +1 -0
- package/dist/types/components/Badge/Badge.vue.d.ts +2 -2
- package/dist/types/components/CardSelect/CardSelect.vue.d.ts +1 -1
- package/dist/types/components/Carousel/Carousel.vue.d.ts +2 -2
- package/dist/types/components/Cascader/Cascader.vue.d.ts +2 -2
- package/dist/types/components/Chart/Chart.vue.d.ts +1 -1
- package/dist/types/components/Color/Color.vue.d.ts +1 -1
- package/dist/types/components/Descriptions/Descriptions.vue.d.ts +2 -2
- package/dist/types/components/EChartsWrapper/EChartsWrapper.vue.d.ts +1 -1
- package/dist/types/components/Form/Form.vue.d.ts +5 -1
- package/dist/types/components/Form/FormItem.vue.d.ts +3 -1
- package/dist/types/components/Grid/Col.vue.d.ts +2 -2
- package/dist/types/components/Icon/ttIcons/TtIconApiOutline14.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconBranchOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconBrowseOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconChecklistOutline14.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconChevronDownOutline14.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconClockOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconCodeOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconCompactOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconEditOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconGoalOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconLoadingOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconRefreshOutline14.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconSearchOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconSparkle16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconThinkOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/TtIconWarningOutline16.vue.d.ts +6 -0
- package/dist/types/components/Icon/ttIcons/index.d.ts +22 -0
- package/dist/types/components/Icon/ttIcons/props.d.ts +13 -0
- package/dist/types/components/InputNumber/InputNumber.vue.d.ts +2 -2
- package/dist/types/components/Progress/Progress.vue.d.ts +2 -2
- package/dist/types/components/QRCode/QRCode.vue.d.ts +1 -1
- package/dist/types/components/Space/SpaceCompact.vue.d.ts +1 -1
- package/dist/types/components/Space/index.d.ts +3 -3
- package/dist/types/components/Steps/Step.vue.d.ts +2 -2
- package/dist/types/components/Switch/Switch.vue.d.ts +2 -2
- package/dist/types/components/Tag/CheckableTag.vue.d.ts +2 -2
- package/dist/types/components/Tag/Tag.vue.d.ts +15 -4
- package/dist/types/components/Tag/index.d.ts +21 -15
- package/dist/types/components/Upload/Upload.vue.d.ts +2 -2
- package/dist/types/index.d.ts +13 -0
- package/docs/component-compatibility.md +26 -2
- package/docs/component-manifest.json +27 -3
- package/docs/theme.md +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,61 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 0.1.5
|
|
6
|
+
- **`TtAi*` 一族迁到 `src/ai/`**:8 个 AI 会话组件(`AiExecutionFeed` / `AiToolCall` / `AiStatusCode` / `AiFoldText` / `AiResultPanel` / `AiArtifactRow` / `AiTodoProgress` / `AiSubagentLineage`)从 `src/components/` 移到 `src/ai/`,与通用组件分开管理,避免通用组件目录被「只服务 AI 会话信息流、其他页面不消费」的组件淹没。**对消费方无影响**:公开入口仍是 `src/index.ts`,`TtAi*` 的导出名、props、事件、插槽、`tt-*` 类名与全部视觉行为逐项不变;`package.json` 的 `exports` 只暴露包根与 `style.css` / `rich-text.css`,不含内部目录路径,单文件深路径引用本就不在公共契约内。族内样式注册(`src/styles/index.scss`)、定向 Vitest、Storybook story 与文档登记方式一并保持不变;`TtAi*` 之间的相对引用与族契约的路径锚点已同步更新。
|
|
7
|
+
- **破坏性变更与行为变更(`TtAiToolCall` / `TtAiExecutionFeed`,消费方升级前必读)**
|
|
8
|
+
- **过程行几何 28px → 24px**:`--tt-ai-tool-call-row-height` 默认改为 `var(--tt-control-height-sm)`(24px,复用既有控件高度档,不新增数值)。行结构按 DSH `ToolRow` 重建为 24px 单行:`[16px 行首盒(状态/图标,悬停切箭头)] 6px [title] 8px [2px 分隔点] 8px [summary 占满并单行省略]`。
|
|
9
|
+
- **移除 `lines?: number`**:明细改「段内滚动」后不再有行数上限概念,保留会造成「接受了但不生效」的静默空转。`TtAiFoldText` 组件本身保留(其折叠能力仍被宿主的思考文本与过程文本使用),移除的只是 `TtAiToolCall` 对它的用法与该入参;折叠与段内滚动**二选一**,不叠加(叠加会形成「折叠里再折叠」——用户先要展开行、再要展开文本,且折叠后的可视线索与段内滚动条重复)。
|
|
10
|
+
- **移除明细「两个并排卡片」结构**:类 `.tt-ai-tool-call__panes` / `__pane` / `__pane-label` / `__pane-body` 与变量 `--tt-ai-tool-call-pane-gap` / `--tt-ai-tool-call-pane-min-width` / `--tt-ai-tool-call-pane-max-height` 全部删除(此前靠 `repeat(auto-fit)` 栅格排版,`240px` 硬下限在窄容器下会把整行撑出容器)。
|
|
11
|
+
- **移除 `.tt-ai-tool-call__status` 与 `.tt-ai-tool-call__spacer`**:行尾不再渲染任何状态标记或箭头,状态下沉到行首(原先行尾的可见 `AiStatusCode` 用法与 `size="sm"` 一并移除,行首状态点改用 `marker="dot"`);摘要占满剩余宽度后不再需要撑开用的 spacer。
|
|
12
|
+
- **`statusLabel` 语义变更**:此前是**可见**的行尾标签,现改为**视觉隐藏**文本(仍传同一 prop,但不再可见);依赖可见状态文案的调用方需改走别的行内容。
|
|
13
|
+
- **状态语义改由「视觉隐藏文本」承载**(不变量 3「状态不靠颜色」):行首状态点是装饰性的(`aria-hidden`),状态的文字名以 1px 裁剪盒交给辅助技术(**用 `clip` 而非 `display: none`**,后者会把文本移出可访问性树);文案仍一律由调用方经 `statusLabel` 提供,组件不内置任何状态文案;`TtAiStatusCode` 的标记(状态点或图标)同样一律 `aria-hidden`,文字名由调用方经 `label` 提供,`label` 与 `name` 都为空时组件整体 `aria-hidden`,不会自己编出一句状态文案。
|
|
14
|
+
- **`TtAiExecutionFeed` 折叠行:成功态不再渲染可见状态标记**(需求人裁决「跟 DSH 一样成功态无状态标记」;DSH 的 `TurnProcessNodeView` 折叠行只有 `label + chevron`,任何状态都不给状态点):成功态只保留「标题 + 计数摘要 + chevron」;非成功态(进行中 / 失败 / 中断等待 / 未知)仍在行首给状态点、行尾给可见状态名。状态语义仍对辅助技术可读 —— 新增 `__status-text` 视觉隐藏载体,放在按钮**内**使状态名进入该行的可访问名(读屏播报「执行过程 · N 次工具调用 · 已完成」)。
|
|
15
|
+
- **新增 `summary?: string`**:渲染为 title 之后的「2px 分隔点 + 单行省略文本」,占据行的剩余宽度;**空 summary 连分隔点一起不渲染**(行末不留孤立圆点)。摘要取 `--tt-text-placeholder` 档(H2 裁决:TT 无 tertiary 档,与 DSH caption 同档)。
|
|
16
|
+
- **行首承担状态**(对齐 DSH `ToolRow.leadingFor()`):**失败**与**中断等待**显示状态点,其余(含**成功**、进行中、未定)显示节点图标 —— 由此「成功态无可见状态标记」成立:成功行显示的是工具自己的图标,不是状态标记。
|
|
17
|
+
- **箭头改悬停出现**:收起态在行首盒内同时渲染节点图标与预览箭头,行悬停或行获得键盘焦点时图标淡出、箭头淡入;展开态只显示箭头。两处均带 `prefers-reduced-motion` 兜底。
|
|
18
|
+
- **与 DSH 的一处有意分歧**:DSH 的行是 `div[role="button"]` + 内嵌 `button.leading`;Vue 侧照抄会形成 **button 套 button 的非法 HTML**。故改为「整行单一原生 `<button>` + 行首为装饰 `<span>`」:点行首即点整行,一次事件、天然不重复触发,并已加用例锁定行内不得出现嵌套 `button` / `[role="button"]`。
|
|
19
|
+
- **`TtAiToolCall` 明细重构为「一个卡片 + IN/OUT 两段」**(按 DSH `.ioCard` / `.ioSection` / `.ioLabel`):一个数据面容器(1px 描边 + `--tt-radius-xl` 12px 圆角 + `--tt-bg-subtle` 底,`overflow: hidden`),内部两段各自按 `--tt-ai-tool-call-io-max-height`(默认 150px)**限高并独立纵向滚动**,段间为**全宽分隔线**;段内为「标签列 + 载荷列」网格(`grid-template-columns: max-content 1fr`、`column-gap` 12px、`align-items: baseline`),标签取 `--tt-text-placeholder`(比载荷淡一档,读作标签而非内容)并 `position: sticky; top: 0`,失败调用的输出用 `--tt-color-error`。滚动条做了内缩(`::-webkit-scrollbar-thumb` 透明边框 + `padding-box` 裁剪),滑块不贴圆角卡片边缘。
|
|
20
|
+
- **窄容器防回归按新结构重验**:防溢出机制由「栅格下限夹取」改为「换行 + 收缩链」(卡片与段均 `min-width: 0`、段 `overflow-x: hidden`、载荷 `white-space: pre-wrap` + `overflow-wrap: anywhere`)。**真实浏览器实测**(Vite SSR 渲染真实组件 DOM + 无头 Chrome 取几何):120 / 160 / 200 / 240 / 320 / 480 / 640px 七个宽度下,卡片、段与文档横向溢出均为 **0**;段高恒 ≤ 150px;段间分隔线铺满卡片内容宽;长内容确实在段内滚动而非撑开卡片。旧机制相关源码已彻底移除,不留「变量还在但不再生效」的假防线。
|
|
21
|
+
- 新增明细结构类 `__io-card` / `__io-section` / `__io-label` / `__io-text`(+ 失败态 `__io-text--error`)/ `__io-divider`;新增行首结构类 `__leading` / `__leading-state` / `__sep` / `__summary` / `__status-text`。**未变**:`title` / `icon` / `meta` / `status` / `input` / `output` / `inputLabel` / `outputLabel` / `nested` / `v-model:expanded` 及事件、插槽。
|
|
22
|
+
- 同步更新:`AiToolCall.stories.ts` 重写为「状态 × 摘要 × 明细有无」矩阵并新增「明细两段」story(长短不一 / 两段都长 / 无空格长串 / 只有 IN 段 / 失败输出);`AiExecutionFeed.stories.ts` 消费处改用 `summary`;`ai-tool-call.spec.ts` 18 → 32 → **35 条**(H3 结构与无障碍用例、H4 明细结构性用例 12 条,状态与明细用例改写为新机制);`ai-execution-feed.spec.ts` 调整 2 处原断言(原要求成功态渲染状态点与可见状态名)并新增「成功无标记 / 非成功有标记」对照断言;族契约 `ai-message-flow.spec.ts` 随两轮各更新三处并**保持约束强度**(过程行 28px → 24px;高度 4px 阶梯校验允许**字面 0**(「0 即 0×4」,分隔线改用 `border-top` 表达、盒高归零),并对视觉隐藏块加**精确豁免**并写明理由;状态载体断言改为新机制;`repeat()` 栅格夹取不变量**本体仍全量生效**,仅把锚点从「AiToolCall 含 auto-fit 栅格」改为「AiToolCall 用 `max-content 1fr` 且不含 auto-fit」,避免锚定一个已消失的写法)。
|
|
23
|
+
|
|
24
|
+
- **新增 AI 会话组件族(`TtAi*`,首期 8 个)**,把会话详情页执行信息流的视觉与交互一次性收进组件库,页面只做组合、不写覆盖样式。此前库内没有 AI 对话专用组件(`ActivityFeed` 只是 `Timeline` 的薄包装、`Message` 是 toast),执行过程的「每类节点一张彩色卡 + 彩色状态圆点」由此无处收敛,只能落在页面样式里。族内分工:`TtAiExecutionFeed` 是过程区的**唯一入口**(32px 整行按钮折叠行 + 24px 单列过程行容器 + 左侧 1px 中性引导线,两层折叠、收起不影响承载位);`TtAiToolCall` 是过程行(16px 图标盒 + 主文案 + 摘要 + 悬停箭头,行内明细为「一个卡片 + IN/OUT 两段」,`nested` 用左缩进 + 中性左边框表达递归子调用层级);`TtAiStatusCode` 承担状态多通道;`TtAiFoldText` 统一截断与折叠语;`TtAiResultPanel` 是结果区唯一的数据面容器(r8、无阴影、内部 12px 栅格);`TtAiArtifactRow` 把产物从大卡片改为行、超过 4 项折叠为「全部 N 个」;`TtAiTodoProgress` 是输入区 dock 的待办/目标变体;`TtAiSubagentLineage` 是会话头部血缘(只身份 + 状态)。
|
|
25
|
+
- **状态色**按「成功态一律中性色、彩色只用于进行中/失败/中断等待」落定:`--tt-ai-status-code-color` 在 `success` 上是 `--tt-text-secondary`,`pending` / `unknown` 是 `--tt-text-placeholder`,只有 `running` / `failed` / `warning` 分别取 `--tt-color-primary` / `--tt-color-error` / `--tt-text-warning`,且**不使用** `--tt-color-success` 与任何底色 —— 原来的绿色完成点正是被反馈的对象。`status` 是必填项,`TtAiToolCall` 不传 `status` 时**不渲染任何状态标记**:缺失终态不会被默认判成成功(不变量「不编造执行事实」)。
|
|
26
|
+
- **`TtAiFoldText` 的截断契约**:截断语统一为「… 其余 N 行」,且**展开后能拿到完整内容**(折叠只按换行截取前 N 行,展开后原样给出传入的整段文本,不做二次截断;`text` 与展示上限无关)。与折叠正交的 `truncated` 用于调用方声明「上游数据本身已被截断」——那种情况下库里没有完整内容,组件始终给出标注,不静默丢内容。
|
|
27
|
+
- **几何落在 4px 阶梯上并全部走变量**:折叠行 `--tt-ai-execution-feed-row-height` 默认 `var(--tt-control-height)`(32px)、过程行 `--tt-ai-tool-call-row-height` 默认 `var(--tt-control-height-sm)`(24px)、产物行 `--tt-ai-artifact-row-height` 默认 `var(--tt-control-height)`(32px)、图标盒 16px(`TtIcon` 的 `size`)、行间距 4px(`--tt-space-1`)、明细区圆角 8px(`--tt-radius-lg`)、状态点圆角 `--tt-radius-round`。样式里没有裸色值、没有 `--dsw-*`、没有 12px 圆角与 0.5px 发丝边(不引入 DSH 视觉语言),字阶与间距全部读 `--tt-*`。
|
|
28
|
+
- **无障碍**:折叠行与过程行整行是原生 `<button>`(`aria-expanded` + `aria-controls` 指向受控节点,无可展开内容时渲染 `<div>` 而不是 disabled 按钮);焦点可见(`--tt-focus-ring`);`TtAiFoldText` / `TtAiArtifactRow` / `TtAiTodoProgress` 的展开控件都带 `aria-expanded` 与辅助技术名称;`reduced-motion` 下关掉 chevron 旋转、状态图标 spin 与进度条过渡。
|
|
29
|
+
- **承载位与过程行的诚实边界**:`TtAiTodoProgress` 在清单为空时**整块不渲染**(清单为空是「没有投影」,不是「一件都没做」,给出 `0/0` 会被读成后者);`TtAiToolCall` 在没有明细可展开时渲染 `<div>` 而不是按钮,指针手势与 hover 反馈只挂在 `--expandable` 修饰类下;`TtAiSubagentLineage` 同理只在 `selectable` 打开时才是按钮,默认不给点了没反应的假交互。
|
|
30
|
+
- **定向测试**:8 个组件用例(`ai-status-code` / `ai-fold-text` / `ai-execution-feed` / `ai-tool-call` / `ai-result-panel` / `ai-artifact-row` / `ai-todo-progress` / `ai-subagent-lineage`)+ 族契约 `ai-message-flow`。族契约直接读组件源码与样式,锁住「只吃 `--tt-*`、无裸色值、无 `--dsw-*`、无 `--tt-color-success`、几何落在折叠行 32px / 过程行 24px / 图标盒 16px、凡有过渡或动画的样式文件都带 `prefers-reduced-motion`」。
|
|
31
|
+
- 同步 `docs/component-manifest.json` 与 `docs/component-compatibility.md`:8 个 `TtAi*` 组件登记为 Vue-only 默认扩展。**注**:本条原先记的导出计数快照「默认再导出 83 → 91、运行时组件/子组件导出 109 → 117」与当前 manifest 实测值(`vueDefaultReexports: 107`、`vueRuntimeComponentExportCount: 133`)不一致,计数口径待确认后补正,不留下对不上的数字。
|
|
32
|
+
|
|
33
|
+
- **新增 TtIcon 图标族 `ttIcons/`(取自 DeepSeek Harness,MIT)**:按需求人裁决「图标不自行设计,直接用 DSH 的图标」,用一次性脚本 `scripts/extract-dsh-icons.mjs` 从 DSH 的 `packages/client/ui-primitives/src/icons/index.tsx`(单文件 78 个内联 SVG)静态抽取 **16 个**过程区所需图标,生成到 `src/components/Icon/ttIcons/`,并由 `src/index.ts` 的 `export * from './components/Icon/ttIcons'` 统一导出。每个 SFC 的 props 为 `size`(默认 = 该图标自身绘制尺寸,由源签名解析,不按名字猜)与 `color`(默认 `currentColor`),文件头逐条写明来源、原始导出名、源路径与 MIT 许可(Copyright (c) 2026 DeepSeek)。脚本幂等(重复运行不产生 diff,`--check` 只校验)、失败即停(源里找不到图标、默认尺寸解析不出、子节点含动态 JSX、出现未映射的驼峰属性都显式报错,不静默生成错图标),生成物可逐行 `git diff` 审查。
|
|
34
|
+
- **`TtIcon` 无需适配即可承载新图标**(已验证,未改 `Icon.vue`):`TtIcon` 以 `font-size` 承载尺寸,Element Plus 的 `.el-icon svg{width:1em;height:1em}` 覆盖 SVG 自身的 `width`/`height` 呈现属性,因此 `<TtIcon :icon="TtIconSearchOutline16" :size="12" />` 按 12px 渲染,与库内既有 `@element-plus/icons-vue` 图标同一机制;单独使用时回落该图标固有尺寸。宿主前置条件(先加载 `element-plus/dist/index.css`)已写入 `ttIcons/README.md`。
|
|
35
|
+
- **未自造任何图标**:本轮请求的 16 个图标在 DSH 源中全部命中,无缺口;DSH 其余 62 个候选池与「先查池、查不到再报需求人设计」的规则登记在 `ttIcons/README.md`。
|
|
36
|
+
- **定向用例 `tests/components/tt-icons.spec.ts`(现 10 条)**:清单与生成物一一对应、每个图标的画布与默认尺寸与 DSH 源**独立解析**结果一致、`size`/`color` 可覆盖、文件头许可齐备、`TtIcon` 组合契约,以及**逐条核对每段路径数据原文存在于 DSH 源**(证明是移植而非自造)。该「移植性」断言做过定点变异验证:改动一条路径数据的单个字符即被捕获并报出具体图标名。
|
|
37
|
+
|
|
38
|
+
- **新增 `TtSelect` / `TtTreeSelect` 选中标签的限宽与单行截断**:此前只有 `TtTag` 有截断能力,选择器内部自己渲染的 `.el-tag` 没有覆盖 —— 标签高度固定 24px,超长文案(如项目资料名)换行会把标签撑变形,宿主只能写 `:deep(.el-tag){max-width}` 与 `:deep(.el-tag__content){overflow/text-overflow/white-space}` 两处绕过组件库(应用端项目资料选择器即为其一)。现新增 `--tt-select-tag-max-width` 出口(默认 `100%`,即 Element Plus 原值,不赋值时行为与改动前逐项一致),并让 `.el-tag__content` 单行省略。变量用**回退值**写法(`var(--x, 100%)`)而不是在根元素声明默认值,宿主在组件元素或祖先容器任一处赋值都生效;截断无条件生效(固定高度下换行本就是错显示)。同步删除应用端项目资料选择器的两处 `:deep()` 绕过与其重复声明的 `min-height`。
|
|
39
|
+
|
|
40
|
+
- **新增 `TtTag` 的 `neutral` 属性**,用于**不带状态语义**的类型 / 分类标识(白底 + 控件描边 + 中性文字色),默认关闭、行为与改动前一致。此前这类标签只能写 `effect="plain"`,但 Element Plus 默认给标签加 `.el-tag--primary`,组件库里 `.el-tag--primary.el-tag--plain` 会把描边与文字染成品牌色(实测描边 `--tt-color-primary-3`、文字 `--tt-color-primary`),宿主想拿到「灰框 + 深色字」只能自己写选择器覆盖库内颜色。`neutral` 把任意 `type` 拉回中性格;语义状态标签仍用 `type` + `effect`,两者正交。
|
|
41
|
+
- 新增 `--tt-tag-plain-color`(默认 `var(--tt-text-secondary)`,与改动前一致)驱动中性描边形态的文字色,`.el-tag--plain` 不再写死次级色;宿主按上下文需要更深字色时下发变量即可,不必覆盖库内规则。
|
|
42
|
+
- 新增回归测试 `tag.spec.ts`:覆盖 `neutral` 规则必须排在全部 typed plain 规则之后(同特异性后写者胜)、三项中性取值、默认关闭时不加类名,以及 `neutral` 不作为未知属性透出到 DOM。
|
|
43
|
+
|
|
44
|
+
- 新增 `TtCard` 可点击形态的悬浮底色变量 `--tt-card-interactive-hover-bg`(默认 `var(--tt-color-primary-1)`,取值与改动前逐项一致):`interactive` 卡片的悬浮底色原先写死为浅蓝填充,这对「多选一」的选择型卡片是对的,但「整卡即入口」的导航卡片(例如应用端自动化列表卡)需要只高亮描边、不要整卡填充。宿主把该变量设成卡片自身底色即可,不必写选择器覆盖 `.tt-card--interactive:hover`。与 `--tt-card-body-padding` 同一做法:默认值声明在组件元素自身,宿主必须在卡片元素上赋值。
|
|
45
|
+
- 新增 `TtCard` 的悬浮阴影变量 `--tt-card-hover-shadow`(默认 `0 4px 12px var(--tt-shadow-color)`,取值与改动前逐项一致):`shadow="hover"` 原先固定「高亮描边 + y4/blur12 阴影」,对卡片列表偏重;宿主把该变量设成 `none` 即可只保留按钮式的描边高亮。
|
|
46
|
+
- 统一 5 种浮层组件(`TtSelect` / `TtDropdown` / `TtCascader` / `TtMenu` / `TtTreeSelect`)的下拉面板阴影:原来写死的 `0 2px 20px var(--tt-color-grey-2)` 改为登记值 `var(--tt-shadow-md)`。原写法把「颜色」当「阴影色」用——浅色主题下 `--tt-color-grey-2` 是 `#e9ecf2`(近白),20px 模糊会摊成一圈发光;暗色主题下同一变量翻成 `#082337`(近黑),又变成一团黑雾。改用语义阴影 token 后,浅色为 `0 8px 24px rgb(8 17 38 / 12%)`、暗色为 `0 8px 24px rgb(0 0 0 / 36%)`,与 `TtDialog` / `TtDrawer` / `TtDatePicker` 等既有浮层一致;同时也修掉了 `TtDropdown` 与 `TtMenuPanel` 违反各自规范(`surfaceShadow -> --tt-shadow-md`)的问题。面板尺寸、圆角、内边距、选项几何与交互全部不变。
|
|
47
|
+
- 新增浮层阴影契约用例:锁定这 5 个组件的 popover surface 必须使用 `--tt-shadow-md`;全库任何 `box-shadow` **声明**中不得再出现 `0 2px 20px`(历史取值仅作为说明性注释保留);并逐条审查所有组件的 `box-shadow` 声明,禁止把 `--tt-color-grey-*` 当阴影色(`inset` 描边不在此列)。
|
|
48
|
+
|
|
49
|
+
- 修复 `TtForm` / `TtFormItem` 把 Element Plus 布尔属性默认值 `true` 覆盖为 `false` 的问题:两者用 `defineProps<Partial<FormProps | FormItemProps>>()` 声明属性后把整个 `props` 合并回 `$attrs` 再透传,而 Vue 对**声明过但缺席的 Boolean 属性**会解析成 `false`,于是 `showMessage`、`validateOnRuleChange`、`scrollIntoViewOptions` 被显式写成 `false` 传给 Element Plus,压过对方 `default: true` 的默认值。实际后果是**表单校验失败只有红框、没有任何错误文案**(`showMessage` 在 Element Plus 里同时控制字段与表单两级,任一为 `false` 即不渲染 `.el-form-item__error`),宿主只能每个页面显式再传一次 `show-message` 绕过。现按 Element Plus 的默认值补齐三项,未传时与对方一致,显式传 `false` 时仍可关闭。其余 Boolean 属性(`inline`、`hideRequiredAsterisk`、`scrollToError`、`disabled`、`inlineMessage` 等)的 Element Plus 默认值本就是 `false`/`undefined`,未做改动。
|
|
50
|
+
- 新增回归测试 `form.spec.ts`:覆盖「错误态同时渲染错误文案」「显式 `showMessage=false` 只保留错误态」「未传 `showMessage` 时组件自身与内部 `ElFormItem` / `ElForm` 的取值都是 `true`」,后两条同时锁住「不得再把对方默认值透传成 `false`」这条契约。
|
|
51
|
+
- 修复 `TtButton` **链接形态(`link`)在页面上渲染成浅灰描边白底块**:规范登记 `link`「不承载普通按钮的高度、背景、边框或阴影」,且明确「`text` 与 `link` 形态在组件库内解析为 `min-width: auto`、透明边框与透明底色」,但组件库此前只给 `text` 形态做了透明解析,`link` 只有一条 `text-decoration: underline`。于是基础规则 `.tt-button.el-button` 里**无条件**的 `border-color` / `background-color`(0,3,0)生效,而 Element Plus 自身的 `.el-button.is-link{border-color:transparent;background:transparent}`(0,2,0)权重更低且更早加载,透明解析被静默压掉。现给链接形态补齐透明边框与透明底色,并把 `hover` / `focus` / `active` 三个状态一并清零(基础规则对应分支为 0,4,0,不清零则悬浮 / 聚焦 / 按下时边框与底色会重新出现);写法与基础规则同为 0,3,0 / 0,4,0 且置于文件后部,靠顺序取胜,不引入提权。文字色不在本层写死,仍由基础规则读 `--el-button-*-text-color`,`.tt-button-danger.tt-button-link` 因此继续得到错误色;`:focus-visible` 的焦点环未被覆盖,键盘焦点环不变。**本缺陷影响所有 `<TtButton link>` 使用点,应用端资料库「会话来源」链接即为其一。**
|
|
52
|
+
- 补齐 `TtButton` **`link` 与 `text` 形态的高度清零**:规范「Link Button 正常态」登记这两个形态「不承载普通按钮的高度」,但基础规则 `.tt-button.el-button` 给所有按钮 `height: var(--tt-control-height)`(32px)且二者都没覆盖。后果是行内文字操作会把所在行撑高:应用端资料库的文档详情元信息、目录树「来源」列的行高被撑到 **32px**,修复后在真实浏览器(构建产物 + headless Chrome)实测 `height` 为 **23.33px**(内容自适应)。现给 `link` 与 `text` 各补 `height: auto; min-height: 0`(`min-height` 用于防止 flex 容器把行内文字操作拉伸回控件高)。修复方式为同权重后写,不引入提权、不涉及公开 API。
|
|
53
|
+
- `button.spec.ts` 15 → 17 → **18 条**:新增链接形态透明解析的契约断言(含三个状态分支必须存在、且本层不得写死品牌色)与链接形态 DOM 类名断言;并断言 `link` 的**顶层**声明区与 `text` 块内都必须含 `height: auto` 与 `min-height: 0`。两轮新增断言都做过**定点变异**(分别删掉 `link` / `text` 的清零、删掉顶层透明声明)均被捕获,恢复后全绿。透明解析断言还有**两处自身缺陷在验证中被逐次暴露并修正**:①按非贪婪匹配取到的是库内**另一处**同名选择器(盒几何 `padding` 清零),误报「不含透明声明」,改为按内容取到承载透明解析的那一块;②修正后做反向验证**未被捕获** —— 取到的整块包含嵌套的 `hover` / `focus` / `active` 分支,其内的透明声明把顶层缺失掩盖了;改为只截取块内第一个 `&:` 之前的**顶层**声明区再断言,反向验证通过(删掉顶层清零即失败)。这条缺陷本身说明:断言「存在某字符串」不等于断言「该声明在正确层级」。
|
|
54
|
+
- 修复 `TtInput` 字数计数器(`show-word-limit`)在应用端呈蓝色:Element Plus 用 `--el-color-info` 给计数器着色,而宿主主题桥会把该变量映射成品牌色,计数器因此跟着变蓝。计数器属于辅助文字,现由组件库显式声明为占位文字色 `--tt-text-placeholder`,超出上限时切 `--tt-color-error`(不依赖宿主变量,也不会把 Element Plus 的超限红色压掉)。
|
|
55
|
+
- 修复 `TtDatePicker` 日期区间(`daterange` / `datetimerange`)的文字与占位符居中:Element Plus 的 `.el-date-editor .el-range-input { text-align: center }` 会把「开始时间 / 结束时间」顶到控件中间,在筛选工具栏里与相邻的搜索框、下拉选择不是一套观感。现改回左对齐,与 `.el-input__inner` 同一口径。单日期选择、时间选择、面板与浮层几何不变。
|
|
56
|
+
- **`TtAiToolCall` 明细双栏栅格在窄容器下的横向溢出(当时记录;该机制已被上文「一个卡片 + 两段」整体取代)**:栅格原为 `repeat(auto-fit, minmax(var(--tt-ai-tool-call-pane-min-width), 1fr))`,`240px` 是**硬下限**,栅格宽度不足 240px 时轨道压不到下限以下、整行被撑出容器;当时改为 `minmax(min(240px, 100%), 1fr)`(列宽行为在宽容器下与改动前逐项相同)并实测「栅格宽度 120 / 180 / 200 / 239px 时改动前分别溢出 136 / 76 / 56 / 17px,改动后溢出均为 0 且折叠为单列铺满」;注意真实组件里栅格比外层窄 16px(`__detail` 的左内边距),因此**外层** 240px 时改动前仍会溢出 16px,等价点换算到外层是 256px。该 `auto-fit` 栅格随后在明细重构中被整体移除,防溢出改由「换行 + 收缩链」承担(见上文),相关源码、变量与定向用例一并随之改写。
|
|
57
|
+
|
|
58
|
+
- 规范与元数据:上述各条改动**均未修改设计系统规范数值** —— 图标来源属实现层事实(不新增规范数值);`TtButton` 的 link/text 合同与 `TtForm` 的默认值行为早已登记在 `docs/design-system` 侧(`button/spec.md:190`、`:228`),本次是组件库实现向规范收敛,不涉及规范改值。`docs/component-manifest.json` 与 `docs/component-compatibility.md` 按新增组件同步登记。
|
|
59
|
+
|
|
5
60
|
## 0.1.4
|
|
6
61
|
|
|
7
62
|
> 本版是 `0.1.1` 之后第一个发布到 registry 的版本。下方 `0.1.3` / `0.1.2` 两节的编号已归档,但从未发布,其内容一并包含在本版中:宿主从 `0.1.1` 升级到本版时,请连同那两节一起阅读。
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
基于 Vue 3 与 Element Plus 的 TT Design 风格组件库。
|
|
4
4
|
|
|
5
|
-
> 当前版本为 `0.1.
|
|
5
|
+
> 当前版本为 `0.1.5`(下一次发布的版本号,发布即 `npm publish`,不再改版本)。registry 上的最新已发布版本可用 `npm view tt-design-web-vue dist-tags` 查询。本项目从原 workspace 的 `tt-design-vue` 迁出,作为独立项目构建并提供真实的 JavaScript、类型声明和 CSS 产物。
|
|
6
6
|
|
|
7
7
|
## 安装
|
|
8
8
|
|