@xihan-ui/web-components 1.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,86 @@
1
+ # @xihan-ui/web-components
2
+
3
+ ## 1.0.0-alpha.0
4
+
5
+ ### Major Changes
6
+
7
+ - bc65cb7: 首个公开版本:框架无关的 UI 基座。
8
+
9
+ 自研薄 FSM 内核 + headless(anatomy / machine / connect)+ 设计令牌与主题运行时 + 样式层,
10
+ 102 个组件在 Vue 与 Web Components 两套适配器上共用同一份内核,跨适配器一致性套件与
11
+ 真实 Chromium 里的无障碍扫描、浮层定位契约全绿。
12
+
13
+ 浮层定位、虚拟滚动、Web Components 响应式基类、代码着色、流式 Markdown 均为自研,
14
+ 运行时不带第三方依赖。
15
+
16
+ - 84b1aa3: 新增 Icon 原语,`@xihan-ui/icons` 整包重写为首方图标集。
17
+
18
+ 旧的 `@xihan-ui/icons` 是 27 个第三方图标集的聚合(约四万个图标),已整体移除并在
19
+ npm 上弃用。新包只收自研图标,第一批 29 个覆盖组件库自用的全部语义,24×24 单色
20
+ 描边、`stroke-width` 2。
21
+
22
+ 用法:
23
+
24
+ - `@xihan-ui/kernel` 导出 `IconRecord` / `IconNode` / `IconTag` 三个类型
25
+ - `@xihan-ui/headless` 导出 `connectIcon` / `iconAnatomy` / `iconMeta` / `iconKeyboard`
26
+ - `@xihan-ui/vue` 导出 `XhIcon`,`@xihan-ui/web-components` 注册 `<xh-icon>`
27
+ - `@xihan-ui/styles` 新增 `icon.css`,`data-size` 与 `data-weight` 各三档
28
+
29
+ 图标记录是结构化节点数组而不是 SVG 字符串,渲染端逐节点建元素,运行期不经 HTML
30
+ 解析器。图标数据传的是记录本身而不是名字:按名字查表要把全表静态引进来,摇树会
31
+ 整个失效。
32
+
33
+ WC 侧要在 `<svg data-xh-part="root">` 里留一个空的 `<g data-xh-part="glyph"></g>`
34
+ 作为授权点,元素只在它内部铺图元;不留这个空壳就一个节点都不动,手写内联 SVG 与
35
+ `<use>` 引用两种写法因此都还能用。`icon` 是对象,只能走 property 传,属性里写不出来。
36
+
37
+ 可及名字两态互斥:`label` 给了非空白文本就输出 `role="img"` 与 `aria-label`,否则
38
+ 输出 `aria-hidden="true"`。只有图标的按钮请把名字写在按钮上而不是图标上,两处都写
39
+ 读屏会念两遍。
40
+
41
+ - e788896: Select 支持多选,选中值由单值改为集合,公开 API 破坏性变更。
42
+
43
+ 多选打开方式是 `multiple`:点中条目即在集合里增删该项,列表不收起;单选行为不变,只是选中值
44
+ 的容器形状统一成了数组(单选恒为长度 ≤ 1)。
45
+
46
+ 迁移点:
47
+
48
+ - `SelectValueChangeDetails.value` 由 `string | null` 变 `string[]`。原先判空写 `details.value === null`
49
+ 的,改判 `details.value.length === 0`;取单选值写 `details.value[0]`。
50
+ - `SelectApi` 的 `value` 与 `valueText` 由单值变数组,两者逐项对应;`setValue` 签名变
51
+ `(next: string | string[]) => void`,裸串按单选简写处理;新增 `multiple`。
52
+ 想拿「显示成什么字」不必自己拼,用 `displayText`:有选中取选中项文本(多选按半角逗号加空格连起来),
53
+ 否则取 `placeholder`。
54
+ - Vue 默认插槽暴露的 `value` 与 `setValue` 随之变化;`update:value` 的载荷由单值变数组,
55
+ 因此 `v-model:value` 绑定的变量类型要一并改。`value` / `default-value` 两个 prop 仍接受裸串与 `null`。
56
+ - WC `value-change` 事件的 `detail` 由 `{ value: string | null }` 变 `{ value: string[] }`;
57
+ 新增 `multiple` 属性。`value` 属性只递得进单值,多选集合请写 property。
58
+ 表单影子 `hidden-select` 不再写 `value`,选中态一律由 `option` 的 `selected` 表达(多选时开原生
59
+ `multiple`)—— 靠读 `hidden-select.value` 反查选中项的代码要改成读 `selectedOptions`。
60
+
61
+ ### Minor Changes
62
+
63
+ - c5c5f7f: 两个适配器接上视觉层,各自走独立子入口 `@xihan-ui/vue/backgrounds` 与 `@xihan-ui/web-components/backgrounds`。
64
+
65
+ `@xihan-ui/backgrounds` 声明为**可选 peer**:主入口一行都不引它,不用视觉效果的应用不会因为装了适配器
66
+ 而多出一个 WebGL 引擎。
67
+
68
+ Vue 侧三种用法,从轻到重:`v-background` 指令、`XhBackground` 组件、`useBackground` 组合式函数。
69
+ 指令用在组件上时 Vue 会把它落到该组件的单一根元素上,所以给现成组件加背景不必改动组件本身。
70
+
71
+ WC 侧是 `<xh-background>`:元素自身就是画布容器,内容照常写在里面,效果铺在内容底下,
72
+ 画布 `pointer-events: none` 不挡交互。参数走 `.params` property,点云走 `.setCloud()`。
73
+
74
+ ### Patch Changes
75
+
76
+ - Updated dependencies [bc65cb7]
77
+ - Updated dependencies [84b1aa3]
78
+ - Updated dependencies [e788896]
79
+ - Updated dependencies [46b82b0]
80
+ - @xihan-ui/kernel@1.0.0-alpha.0
81
+ - @xihan-ui/machine@1.0.0-alpha.0
82
+ - @xihan-ui/behavior@1.0.0-alpha.0
83
+ - @xihan-ui/headless@1.0.0-alpha.0
84
+ - @xihan-ui/position@1.0.0-alpha.0
85
+ - @xihan-ui/code-highlight@1.0.0-alpha.0
86
+ - @xihan-ui/backgrounds@1.0.0-alpha.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021-Present XiHanFun and contributors.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # @xihan-ui/web-components
2
+
3
+ Web Components 适配器:把框架无关的 headless(anatomy + machine + connect)落在
4
+ 自研基类 `XhReactiveElement` 上的 **Light-DOM 行为宿主**(零第三方运行时依赖)。
5
+
6
+ - 元素不渲染结构;用户写带 `data-xh-part` 的 Light-DOM 子节点,元素发现后用
7
+ `spreadProps` 把 `connect()` 产出命令式打上去。每个组件一个 `xh-*` 元素,part 不是各自的元素。
8
+ - `MachineController` 把机器唯一解释器 `createService` 桥到 controller 生命周期,
9
+ 不重造 FSM。元素类只在 `@xihan-ui/web-components/define` 子路径,`defineXhElements()` 显式注册。
10
+ - **两个入口在 Node 下都可安全 import**:基类无 DOM 时取一个替身基座(`src/reactive/element.ts`),
11
+ 元素类的定义式不再在模块求值那一刻取 `HTMLElement`;`defineElement` 无 `customElements` 时静默跳过。
12
+ 判据在 `tests/node-smoke.spec.ts`。
13
+ - **升级前的形态**:收起态由元素在 `wire()` 里用内联 display 做,`data-scope` / `data-part` 也是
14
+ 那一刻才打上,所以 JS 到达前浮层子树既没有皮肤也没有收起。styled 的 `styles/undefined.css`
15
+ 按作者写的 `data-xh-part` 把浮层族的 backdrop / content / positioner / viewport 收起来,
16
+ SSR 直出的首屏不会把浮层内容倾泻进页面流。不引 styled 的宿主需自行处理这一段。
17
+ - 基类在 `src/reactive/`:属性 → 字段的单向转换、批量异步更新、控制器生命周期。
18
+ `tests/reactive-parity.spec.ts` 是差分判据,逐条对拍 `@lit/reactive-element`(仅 devDependency)。
19
+
20
+ ## 与 Vue 适配器的取舍记录(写 WC 适配器时发现的 core/adapter 差异)
21
+
22
+ - **Presence 模型不同(已知差异,非缺陷)**:Vue 用 Presence 卸载 content(关闭即从 DOM 移除);
23
+ WC 是 Light DOM,不能删用户节点,content **常驻**,关闭态只由 `data-state="closed"` 标记,
24
+ 视觉隐藏交给 styled 层的 `[data-state='closed']{display:none}`。因此两端关闭态 DOM 不同
25
+ (Vue 无 content 节点,WC 有 content[data-state=closed]),Button 可做逐帧 parity、
26
+ Dialog 暂用各自 conformance(Dialog 全量 parity 需 presence 容差,留待后续)。
27
+ - **顶层/Portal**:真机可给 content 加 Popover API 上顶层;jsdom 无 Popover,当前只靠
28
+ `data-state` + focus-scope + dismiss-layer,不搬运 DOM。
29
+ - **重连(元素在 DOM 中移动)**:解释器 stop 后不可复活,`MachineController` 在 stop 后
30
+ 重建机器(从 `initialState`、context 重置)——状态不跨移动保留。
31
+ 重建后的状态与重建前相同,cell 不会 bump 版本,因此**不会**自动排更新;
32
+ `connectedCallback` 显式 `requestUpdate()` 重跑一次 `wire()`,否则角色节点上仍挂着
33
+ 指向已停机器的处理器(送事件在 dev 下抛 `SEND_AFTER_STOP`)。
34
+ - **运行期增删角色节点(已抹平的差异)**:Vue 侧条目是组件,增删自带整套 props 渲染;
35
+ WC 侧作者直接改 Light DOM,元素若不看着点就会留下"死条目"(没有 `data-scope`/`data-part`/
36
+ `data-value` 与事件处理器,集合查询也看不见它)。`XhElement` 用 `MutationObserver`
37
+ 观察 `childList`(**不观察 attributes**——`wire()` 正是往角色节点写属性,一并观察会自触发成死循环),
38
+ 命中即重新发现 part 并接线。两道过滤:增删里得真有元素节点;目标与宿主之间隔着别的
39
+ `xh-*` 元素则跳过(内层子树归内层元素自己管)。
40
+ - **受控 open**:HTML 布尔属性表达不了 `undefined`,`open` 用自定义 converter(属性缺省→
41
+ `undefined`=非受控,`open="false"`→受控关)。受控 open 的跨适配器一致性留待后续。