@manohub/kit 1.0.0 → 1.0.1
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/CONTRACT.md +52 -1
- package/package.json +1 -1
package/CONTRACT.md
CHANGED
|
@@ -497,7 +497,10 @@ import Sortable from 'sortablejs' // 行为库:不产
|
|
|
497
497
|
4. **提给 `@manohub/ui` 建件**:新件按「组件 + 面 CSS + 登记 + 导出 + 文档页」**五处齐备**,
|
|
498
498
|
少一处会静默失效。建成后把 `docs/kit-gaps.md` 里那条划掉。
|
|
499
499
|
|
|
500
|
-
已知缺件(截至 0.6.0):`DatePicker
|
|
500
|
+
已知缺件(截至 0.6.0):`DatePicker`(日期选择)。
|
|
501
|
+
(`Number`(数字输入)已于 **1.0.1** 由新件 **`NumberInput`** 关闭:与 `Input` 同族同面、类名同根
|
|
502
|
+
`mh-input--number`,`modelValue` 是 `number | null`(空值为 `null` 不是 `0`),含 `min` / `max` /
|
|
503
|
+
`step` / `precision` 与右端步进位;**输入期不钳制、归一时刻(失焦 / 回车 / 步进)才钳制与舍入**。)
|
|
501
504
|
**不要**因此回去直连底层组件库(§6 L3-3 会拦)。
|
|
502
505
|
|
|
503
506
|
---
|
|
@@ -638,6 +641,23 @@ import Sortable from 'sortablejs' // 行为库:不产
|
|
|
638
641
|
**消费 theme 一直有、却没有件消费的那套 `--ui-font-*` 档位令牌**。此前「容器里的文字层级」
|
|
639
642
|
(卡片描述、只读值、次级信息)在应用侧无合规落点,每个应用都要为它留一条定版例外登记 ——
|
|
640
643
|
这条路径至此补上。
|
|
644
|
+
- **`NumberInput`**(`@manohub/ui`,1.0.1):数字输入件,关闭 §8 登记已久的缺件 `Number`。
|
|
645
|
+
与 `Input` **同族同面**(共用 `components/input/` 目录与 `styles/components/input.css`,
|
|
646
|
+
类名同根 `mh-input--number` —— 与 `Textarea` 的 `mh-input--textarea` 同款),
|
|
647
|
+
`modelValue: number | null` + `onChange`;`min` / `max` / `step` / `precision` / `controls` /
|
|
648
|
+
`clampOnBlur`;**输入期不钳制**(`-` / `1.` 这类中间态留在框里),钳制与舍入发生在归一时刻
|
|
649
|
+
(失焦 / 回车 / 步进按钮 / 边界变化),非法输入回滚为上一个合法值。
|
|
650
|
+
出处是 aip-web 的「连接器配置内化」:34 个连接器插件里的 `FNumberSpinner` 迁到骨架层时无对应件
|
|
651
|
+
(方案见 `docs/plans/2026-10-08-connector-config-parts.md`)。
|
|
652
|
+
- **`Table` 的单元格编辑**(`@manohub/ui`,1.0.1):走 **`#cell` 插槽 + `setValue`** ——
|
|
653
|
+
作用域 `{ row, column, value, index, setValue }`;`setValue(next)` 只发一次
|
|
654
|
+
`onCellChange(row, column.key, next, index)`,**本件从不改 `data`**(与它一贯的受控口径一致)。
|
|
655
|
+
**表格不渲染编辑控件**:格子里摆什么(`Input` / `Select` / `NumberInput`、要不要套 `Form.Item`
|
|
656
|
+
拿 label 与错误位、只读态摆文本还是禁用控件、要不要按行判)全归调用方 ——
|
|
657
|
+
口径与 `Form.Item` 的默认插槽同款(「你自己放控件」),表格面里因此**没有**编辑控件的几何规则。
|
|
658
|
+
⚠️ 与 farris `FDataGrid` 的差异:**不做「点击进入编辑」**(格子里摆的就是常驻控件);
|
|
659
|
+
**序号列仍自加一列**(§10 的取舍不变);**不做列级格式化**(`value` 是原值,折文案是调用方的事)。
|
|
660
|
+
出处同 `NumberInput`(连接器配置内化)。
|
|
641
661
|
- **`Dialog.tone` 与服务层 `tone`**:`alert()` / `confirm()` 现在能表达 `info` / `success` / `warning` / `error`
|
|
642
662
|
四档(标题左侧一个裸符号 + 配色),`confirm({ tone: 'error' })` 还会把确定按钮自动染成危险色 ——
|
|
643
663
|
「删除确认」与「保存成功」不再长得一样。
|
|
@@ -673,6 +693,37 @@ import Sortable from 'sortablejs' // 行为库:不产
|
|
|
673
693
|
否则回落「按顺序配对」旧写法,两条路不叠加;`selector` 插槽拿到的 `options` 就是提取出来的项。
|
|
674
694
|
**本仓内唯一消费点**是 `apps/mcp` 的配置抽屉(`mcp-config-drawer.tsx`),已随迁移同步。
|
|
675
695
|
|
|
696
|
+
#### 五、2026-10 的破坏性变更:`Table` 改名 + 输入族 `bordered` 拆档(**版本口径破例:落 1.0.1**)
|
|
697
|
+
|
|
698
|
+
⚠️ **破例声明**:改名与**值集 / 语义**变更都属破坏性变更(`AGENTS.md` 硬约束 6),按规矩该升**次版本**
|
|
699
|
+
(`1.0.0` → `2.0.0`)。本项目裁定:本次随 **1.0.1** 一并发出 —— 依据是**消费方为零**(全仓核对,见下),
|
|
700
|
+
且同批还有两条加性变更(`NumberInput`、`Table` 单元格编辑 `#cell` + `setValue`)要与它一起发。
|
|
701
|
+
`borderless` **不保留别名**,旧写法在 1.0.1 里直接失效。
|
|
702
|
+
**下次同类改动请先核消费方:已有消费方就按硬约束升次版本,不要再破例。**
|
|
703
|
+
|
|
704
|
+
| 变更 | 1.0.1 之前 | 1.0.1 | 为什么要改 / 怎么迁 |
|
|
705
|
+
| --- | --- | --- | --- |
|
|
706
|
+
| `Table.borderless` 更名 **`Table.bordered`** | `borderless`(默认 `false`,含义是「有框」) | **`bordered`**(默认 `true`,含义是「有框」) | 「有无外框」这一维度在库内有**两种极性**:`Input` / `Textarea` / `Nav` 用肯定式 `bordered`,只有 `Table` 用否定式。统一到肯定式后,调用方不必再记「哪件用否定式」。**默认行为不变**(缺省都有框),变的只是去框的写法 |
|
|
707
|
+
| **输入族与选择器族的 `bordered` 值集扩为 `boolean \| 'focus'`**(`Input.bordered` / `Textarea.bordered` / `NumberInput.bordered` / **新增** `Select.bordered` / `SelectTree.bordered`),且 **`false` 的语义收紧** | `bordered={false}` = 无框档,但**悬停亮浅底、聚焦显出框与主色环**(一档两效果);`Select` 一族**没有**这个 prop(只能恒有框) | `false` = **无框**(常态 / 悬停 / 聚焦都不显,效果只有一种);`'focus'` = **聚焦(与悬停)才显框**(承接旧的 `false` 视觉);`Select` / `SelectTree` 多了 `bordered`,透传给共用的触发器 | 「无框」不该在聚焦时变成「有框」—— 那是另一档。拆开后:`false` 用于「要可编辑但一个框都不冒」,`'focus'` 用于行内编辑(常态像值、点进去才亮框)。`'focus'` 档**不另写状态描写**,悬停 / 聚焦复用有框档那两条。表格里 Input / Select / NumberInput 要有同一档表现,就必须让选择器也认这个 prop |
|
|
708
|
+
|
|
709
|
+
**怎么迁**:
|
|
710
|
+
|
|
711
|
+
1. `<Table borderless />` → `<Table :bordered="false" />`。⚠️ `borderless` 不再被识别,留在模板里会
|
|
712
|
+
**静默失效**(表格照旧有外框,不报错)。
|
|
713
|
+
2. `<Input bordered={false} />`(以及 `Textarea` / `NumberInput` 的同名写法)**语义收紧了**:
|
|
714
|
+
旧视觉是「悬停亮浅底 + 聚焦显框 + 主色环」,现在那是 `bordered="focus"`。
|
|
715
|
+
要旧视觉就把 `false` 改成 `'focus'`;**要继续「一个框都不冒」就保持 `false` 不动**(新的正确用法)。
|
|
716
|
+
⚠️ `bordered` 现在接字符串,`bordered="false"`(**带引号**)在 Vue 里是**字符串** `'false'`,
|
|
717
|
+
与 `false` / `'focus'` 都不同 —— 本包把它当**未命中**处理(走缺省 `true`,仍有框),不吃静默双解。
|
|
718
|
+
|
|
719
|
+
**类名**:`.mh-table--borderless`(`Table` 去框)、`.mh-input--borderless`(输入族无框)不变 ——
|
|
720
|
+
面层词根统一用**否定式**,故「prop 肯定式 / 类名否定式」是**预期**,不是笔误。新增的 `'focus'` 档用
|
|
721
|
+
`.mh-input--border-on-focus`(**肯定式**:它说的不是「关框」,而是「聚焦时给框」),
|
|
722
|
+
口径见 `packages/ui/docs/guide/naming-and-defaults.md` §2.1。
|
|
723
|
+
|
|
724
|
+
**消费点核对**(全仓,非估计):`frontend-infra` 四包 + `aip-web` 全部应用里 **零消费方** ——
|
|
725
|
+
只有 `packages/ui` 自己的文档页与单测用到,已随本次一并改(`__tests__/table.spec.ts` 的开关组用例)。
|
|
726
|
+
|
|
676
727
|
### 12.3 存量应用怎么迁
|
|
677
728
|
|
|
678
729
|
按**层**推进,每步单独可跑通(这也是最优顺序):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manohub/kit",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "子应用入口编排层:createSubApp(作用域容器与宿主锚点、pinia/路由/vue-query 装配、宿主挂载协议)、i18n 单实例与语言探测,外加随包分发的接入契约(CONTRACT.md,五层闭集条款 + 自检清单)与三个 AI 技能包。本包**零样式产物**:设计令牌(值)在 @manohub/theme,组件(类与行为)在 @manohub/ui,两者由消费方直接引入。",
|