agentcss 0.24.2 → 0.25.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/01-tokens/README.md +1 -1
- package/01-tokens/tokens.css +67 -1
- package/01-tokens/typography.css +1 -1
- package/02-primitives/button/demo.html +8 -0
- package/02-primitives/card/README.md +15 -0
- package/02-primitives/choice/README.md +30 -0
- package/02-primitives/choice/choice.css +1 -1
- package/02-primitives/input/README.md +1 -0
- package/02-primitives/select/README.md +42 -2
- package/02-primitives/select/demo.html +11 -6
- package/02-primitives/select/select.js +184 -94
- package/02-primitives/timeline/demo.html +2 -2
- package/02-primitives/timeline/timeline.css +1 -1
- package/03-patterns/accordion/README.md +15 -0
- package/03-patterns/content/README.md +11 -0
- package/03-patterns/drawer/README.md +1 -1
- package/03-patterns/dropdown/demo.html +1 -1
- package/03-patterns/form-validation/README.md +18 -0
- package/03-patterns/form-validation/form-validation.css +12 -1
- package/03-patterns/list/README.md +11 -0
- package/03-patterns/overlay/README.md +26 -6
- package/03-patterns/overlay/overlay.css +22 -3
- package/03-patterns/overlay/overlay.js +63 -17
- package/03-patterns/states/README.md +15 -0
- package/03-patterns/states/states.css +18 -1
- package/03-patterns/tooltip/README.md +12 -0
- package/04-recipes/longform/longform.html +3 -3
- package/04-recipes/report/README.md +9 -0
- package/04-recipes/report/report.css +5 -0
- package/04-recipes/table/README.md +16 -0
- package/04-recipes/tierA-tokens.css +3 -3
- package/09-assets/README.md +18 -0
- package/09-assets/bar/bar.css +25 -10
- package/09-assets/echarts-adapter/demo.html +3 -1
- package/09-assets/echarts-adapter/echarts-adapter.js +107 -34
- package/09-assets/scientific-plot/README.md +2 -1
- package/09-assets/scientific-plot/scientific-plot.js +0 -7
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +317 -18
- package/CONTRIBUTING.md +6 -5
- package/README.md +6 -2
- package/README.zh-CN.md +19 -7
- package/SECURITY.md +5 -2
- package/START-HERE.md +7 -7
- package/SUPPORT.md +86 -24
- package/ai/START-HERE.md +3 -2
- package/ai/cli.js +126 -6
- package/ai/components.json +258 -2
- package/ai/components.meta.json +257 -40
- package/ai/components.schema.json +96 -0
- package/ai/contract.schema.json +11 -0
- package/ai/pdf-pages.js +79 -0
- package/ai/pdf.js +354 -0
- package/ai/tokens.json +2 -2
- package/ai/validate.js +48 -1
- package/dist/01-tokens/tokens.css +1 -1
- package/dist/02-primitives/select/select.js +158 -71
- package/dist/03-patterns/form-validation/form-validation.css +1 -1
- package/dist/03-patterns/overlay/overlay.css +1 -1
- package/dist/03-patterns/overlay/overlay.js +40 -11
- package/dist/03-patterns/states/states.css +1 -1
- package/dist/04-recipes/report/report.css +1 -1
- package/dist/04-recipes/tierA-tokens.css +1 -1
- package/dist/09-assets/bar/bar.css +1 -1
- package/dist/09-assets/echarts-adapter/echarts-adapter.js +75 -33
- package/dist/09-assets/scientific-plot/scientific-plot.js +0 -7
- package/dist/COSTS.md +37 -37
- package/docs/ACCESSIBILITY.md +3 -3
- package/docs/FACTS.md +1 -1
- package/docs/LAYER-BASELINE.md +28 -3
- package/docs/PRINT.md +450 -0
- package/docs/RELEASE-PROCESS.md +78 -3
- package/index.html +1 -1
- package/llms-full.txt +7 -7
- package/llms.txt +5 -0
- package/package.json +6 -1
package/01-tokens/README.md
CHANGED
|
@@ -255,7 +255,7 @@ node ai/cli.js tree [--set=light|dark] [--cat=color] # 第二种
|
|
|
255
255
|
1. **必须排在 `tokens.css` 之后** —— 同权重靠顺序定胜负。
|
|
256
256
|
2. **不许写进 `tokens.css`** —— 那会让六个靠词法读 CSS 的工具静默读错
|
|
257
257
|
(`contrast` / `gen-ai-contract` / `gen-tokens-tree` / `token-audience` /
|
|
258
|
-
`theme-sync
|
|
258
|
+
`theme-sync`)。真实事故:一条 `@layer` 让六个工具同时读错,且都没有报错。
|
|
259
259
|
3. 选择器是 `:root[data-market="intl"]` (0,2,0),**不是** `:where(...)` (0) ——
|
|
260
260
|
`:where()` 抢不过 `:root` 的 (0,1,0),写了等于没写(E135)。
|
|
261
261
|
|
package/01-tokens/tokens.css
CHANGED
|
@@ -651,7 +651,9 @@
|
|
|
651
651
|
用 @media 是目前兼容性最好的做法。
|
|
652
652
|
---------------------------------------------------------------- */
|
|
653
653
|
|
|
654
|
-
|
|
654
|
+
/* `screen and` 承重:暗色是屏幕概念,纸没有深色模式。
|
|
655
|
+
缺了它,暗色令牌在 print 里照样生效 ⇒ 浅字配被丢弃的深底。 */
|
|
656
|
+
@media screen and (prefers-color-scheme: dark) {
|
|
655
657
|
/* ========================================================================
|
|
656
658
|
第二次修正(上一版被 真机实测否决)
|
|
657
659
|
------------------------------------------------------------------------
|
|
@@ -839,6 +841,7 @@
|
|
|
839
841
|
/* === END: light-via-attr === */
|
|
840
842
|
|
|
841
843
|
/* === BEGIN: dark-via-attr(由 05-audit/theme-sync.py 生成,勿手改)=== */
|
|
844
|
+
@media screen {
|
|
842
845
|
:root[data-theme="dark"],
|
|
843
846
|
[data-theme="dark"] {
|
|
844
847
|
--raw-accent: #7AA9DE;
|
|
@@ -913,6 +916,7 @@
|
|
|
913
916
|
--warning: var(--raw-warning);
|
|
914
917
|
--warning-bg: var(--raw-warning-bg);
|
|
915
918
|
}
|
|
919
|
+
}
|
|
916
920
|
/* === END: dark-via-attr === */
|
|
917
921
|
|
|
918
922
|
/* 🔴 涨跌口径切换(`[data-market="intl"]`)**不在本文件里**,在 `01-tokens/market.css`。
|
|
@@ -1065,3 +1069,65 @@ input[type="submit"],
|
|
|
1065
1069
|
为什么是 44px:**WCAG 2.5.5 Target Size (Level AAA)** 要求 44×44 CSS px。
|
|
1066
1070
|
⚠️ 注意区分:
|
|
1067
1071
|
· WCAG 2.5.8(AA 级)只要 24×24 */
|
|
1072
|
+
|
|
1073
|
+
/* ============================================================================
|
|
1074
|
+
打印(print)—— 纸没有主题:暗色已被上面的 `@media screen and` 关在屏幕里。
|
|
1075
|
+
剩下的只有一处:实心控件的字。打印丢弃背景色,而它们的
|
|
1076
|
+
`--text-on-accent` 是 #ffffff ⇒ 白纸白字(实测产物 2.30:1)。
|
|
1077
|
+
改这两个令牌一处,好过改 8 个组件。
|
|
1078
|
+
========================================================================== */
|
|
1079
|
+
/* ==========================================================================
|
|
1080
|
+
X · 打印(工具类 + 全局策略)
|
|
1081
|
+
放这里而不是新建 print.css:新 .css 会连带 dist / docs / README 一串连锁。
|
|
1082
|
+
完整说明(收窄层级的理由、为什么没写 thead、代价)见 docs/PRINT.md。
|
|
1083
|
+
========================================================================== */
|
|
1084
|
+
|
|
1085
|
+
/* 屏幕上隐藏、纸上显示(块级元素用)。 */
|
|
1086
|
+
.print-only { display: none; }
|
|
1087
|
+
|
|
1088
|
+
@media print {
|
|
1089
|
+
:root {
|
|
1090
|
+
color-scheme: light; /* 表单控件/滚动条别跟着系统去暗色 */
|
|
1091
|
+
--text-on-accent: #15181c;
|
|
1092
|
+
--text-on-solid: #15181c;
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
/* 使用者控制器:加 .no-print 的元素不上纸。全库唯一的 !important ——
|
|
1096
|
+
不加就永远可能被使用者自己写的 display 覆盖,等于没提供这个能力。 */
|
|
1097
|
+
.no-print { display: none !important; }
|
|
1098
|
+
.print-only { display: block; }
|
|
1099
|
+
|
|
1100
|
+
/* 打印前展开折叠内容 —— 不展开 = 静默截断(页数正常、内容少一半)。
|
|
1101
|
+
⚠️ 必须带组件根前缀:tokens.css 在 head 里最先加载,同特异性的规则会被
|
|
1102
|
+
组件 CSS 覆盖(实测:不加前缀时 PDF 与改动前逐字节相同)。
|
|
1103
|
+
accordion 三条缺一不可。逐条理由见 docs/PRINT.md。 */
|
|
1104
|
+
.tabs .tabs__panel[hidden] { display: block; }
|
|
1105
|
+
.accordion .accordion__panel[hidden] {
|
|
1106
|
+
display: grid !important; /* ① 它有 display:none !important */
|
|
1107
|
+
grid-template-rows: 1fr; /* ② 收起态是 0fr */
|
|
1108
|
+
visibility: visible; /* ③ 它还有 visibility:hidden(缺这条就一个字不印) */
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
/* 浮层与纯导航。不用裸 button(accordion 标题在 button 里),
|
|
1112
|
+
不动 .btn / .upload(文档页会空、表单控件有状态)。见 docs/PRINT.md。 */
|
|
1113
|
+
.toast, .tooltip, .popover, .skeleton,
|
|
1114
|
+
.tabs__list, .nav__list, .nav__toggle, .pagination,
|
|
1115
|
+
.accordion__marker { display: none !important; }
|
|
1116
|
+
|
|
1117
|
+
/* ⚠️ 模态的遮罩规则**不在这里**,在 03-patterns/overlay/overlay.css。
|
|
1118
|
+
原因不是洁癖:`.dialog-backdrop { position: static }` 写在这里会被
|
|
1119
|
+
overlay.css 里同特异性的 `position: fixed` 盖掉 —— 规则写了、不生效、
|
|
1120
|
+
不报错(E254 的同一个形状,2026-11-02 由 print-policy-gate 的 L3 抓到)。 */
|
|
1121
|
+
|
|
1122
|
+
/* 不跨页切断。代价:高于半页的卡片会被整体推到下一页 ⇒ 页数可能变多。 */
|
|
1123
|
+
tr, img, figure, svg,
|
|
1124
|
+
.card, .metric, .sparkline, .splot { break-inside: avoid; }
|
|
1125
|
+
|
|
1126
|
+
/* 退出开关:高块想省纸就加这个类(标定表见 docs/PRINT.md)。
|
|
1127
|
+
必须写在上一条之后 —— 同特异性靠顺序取胜,不靠 !important。 */
|
|
1128
|
+
.print-allow-break { break-inside: auto; }
|
|
1129
|
+
|
|
1130
|
+
/* ⚠️ 这里**没有** `p, li, blockquote { orphans/widows }` ——
|
|
1131
|
+
裸标签选择器会改掉宿主页面所有段落(`bleed-gate` 的硬红线)。
|
|
1132
|
+
孤行寡行只在库里自己的文档容器内生效,见 `04-recipes/report/report.css`。 */
|
|
1133
|
+
}
|
package/01-tokens/typography.css
CHANGED
|
@@ -22,6 +22,14 @@
|
|
|
22
22
|
transition: all 200ms; }
|
|
23
23
|
.btn--naive:hover { filter: brightness(1.08); transform: scale(1.05); }
|
|
24
24
|
.btn--naive:disabled { opacity: 0.5; }
|
|
25
|
+
/* 🔴 打印:反例按钮的底色会被丢弃,白字就成了白纸白字。
|
|
26
|
+
实测(0.24.2,Chromium,printBackground:false):产物里 6 段文字是
|
|
27
|
+
#ABABAB,对白纸 2.30:1。这里换成描边 + 正文墨色 —— 反例照样看得出
|
|
28
|
+
"它长得像按钮",但纸上读得出来。 */
|
|
29
|
+
@media print {
|
|
30
|
+
.btn--naive { background: transparent; color: var(--text-primary);
|
|
31
|
+
outline: 1px dashed currentColor; }
|
|
32
|
+
}
|
|
25
33
|
</style>
|
|
26
34
|
</head>
|
|
27
35
|
<body class="page">
|
|
@@ -56,6 +56,21 @@
|
|
|
56
56
|
| `.card--row` | 横向排列(图左文右) |
|
|
57
57
|
| `.card--selected` | 选中态 |
|
|
58
58
|
|
|
59
|
+
| 部件 | 用途 |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `.card__body` | 内容区(内边距都在这里,**不是可选的**) |
|
|
62
|
+
| `.card__footer` | 底部条:上边框分隔 + 两端对齐(左说明 / 右操作),字号取 `--fs-xs` |
|
|
63
|
+
|
|
64
|
+
```html
|
|
65
|
+
<div class="card">
|
|
66
|
+
<div class="card__body"><p>本月营收 1,280,000</p></div>
|
|
67
|
+
<div class="card__footer">
|
|
68
|
+
<span>数据截至 10 月 31 日</span>
|
|
69
|
+
<a href="/reports">查看明细</a>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
```
|
|
73
|
+
|
|
59
74
|
依赖:`01-tokens/tokens.css` + `01-tokens/typography.css`(正文)+
|
|
60
75
|
`01-tokens/page.css`(`.wrap` / `.small` 等页面骨架)。
|
|
61
76
|
|
|
@@ -47,6 +47,22 @@ input 被 `opacity:0` 覆盖后,它自己的 `outline` 你根本看不见。
|
|
|
47
47
|
|
|
48
48
|
`:indeterminate` **只能由 JS 设置**(`el.indeterminate = true`),CSS 不影响它。
|
|
49
49
|
|
|
50
|
+
### `.choice__hint`:选项的补充说明
|
|
51
|
+
|
|
52
|
+
勾选框右侧、标签下方的一行小字(`--fs-xs` + `--text-tertiary`)。用于"选了这个会怎样"
|
|
53
|
+
这类**必须先看再选**的说明——比如"同意后我们会给你发月度报告"。
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<label class="choice choice--checkbox">
|
|
57
|
+
<input class="choice__input" type="checkbox">
|
|
58
|
+
<span class="choice__label">订阅月度报告</span>
|
|
59
|
+
<span class="choice__hint">每月 1 日发一封,可随时退订</span>
|
|
60
|
+
</label>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
⚠️ 别把这段说明塞进 `aria-describedby` 之外的地方:它是**解释**,不是标签的一部分,
|
|
64
|
+
读屏应该念"订阅月度报告,复选框",再念说明。
|
|
65
|
+
|
|
50
66
|
---
|
|
51
67
|
|
|
52
68
|
## radio 组:必须 `fieldset + legend`
|
|
@@ -88,6 +104,20 @@ input 被 `opacity:0` 覆盖后,它自己的 `outline` 你根本看不见。
|
|
|
88
104
|
|
|
89
105
|
select 用 `:focus` 不用 `:focus-visible`——和 input 一样,用户必须随时知道当前选的是哪个。
|
|
90
106
|
|
|
107
|
+
结构(注意:这里的 `.select` 是**原生 select 的外壳**,与
|
|
108
|
+
`02-primitives/select/select.css` 里那个自定义下拉的 `.select` **同名不同义**,
|
|
109
|
+
同页面同时用两个组件会互相覆盖,详见 `05-audit/css-ownership.json`):
|
|
110
|
+
|
|
111
|
+
| 类 | 作用 |
|
|
112
|
+
|---|---|
|
|
113
|
+
| `.select` | 外壳(`position:relative` + `inline-flex`,给箭头定位用) |
|
|
114
|
+
| `.select__control` | **原生 `<select>` 本体**,高度 44px、字号 16px 硬下限(iOS 防缩放) |
|
|
115
|
+
| `.select__arrow` | 自绘箭头(必须 `pointer-events:none`,否则吃掉点击) |
|
|
116
|
+
| `.select__control--auto` | 高度改 `auto`(`min-height:44px`),用于**选项文字会换行**的场合,例如多选列表式的长选项 |
|
|
117
|
+
|
|
118
|
+
`.select__control--auto` 的存在理由:固定 44px 高度遇到换行文字会把第二行裁掉。
|
|
119
|
+
它把 `height` 放开、`padding-block` 加到 `--sp-2`,行数变多时整块自然长高。
|
|
120
|
+
|
|
91
121
|
---
|
|
92
122
|
|
|
93
123
|
## disabled
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
🔴 不做这个态,"全选"复选框就没法正确表达中间状态。 */
|
|
199
199
|
.choice--checkbox .choice__input:indeterminate ~ .choice__label .choice__mark {
|
|
200
200
|
/* 🔴 由「深蓝满色块」改为「白底 + accent 描边 + accent 横线」。
|
|
201
|
-
|
|
201
|
+
满色块的问题:半选塞一整块深色,视觉太重。
|
|
202
202
|
描边式同样能表达"部分选中",且更轻。 */
|
|
203
203
|
background: var(--surface);
|
|
204
204
|
border-color: var(--accent);
|
|
@@ -122,6 +122,7 @@ python 05-audit/states.py 02-primitives/input/input.css
|
|
|
122
122
|
| 类 | 作用 | 什么时候用 |
|
|
123
123
|
|---|---|---|
|
|
124
124
|
| `.field__input--sm` | 小尺寸(表格 / 紧凑栏) | 表格行内、侧栏等密度高的场景 |
|
|
125
|
+
| `.field__input--textarea` | 多行:`height:auto` + `min-height:88px` + `padding:--sp-3` + `resize:vertical` | 备注、说明、地址等会换行的输入;直接拿 `.field__input` 配 `<textarea>` 会被 44px 固定高度裁掉 |
|
|
125
126
|
|
|
126
127
|
> ⚠️ **demo 里没有演示这一档** —— 它是留给复用者的钩子,
|
|
127
128
|
> 不是"看起来有其实没有"。要用就自己加类。
|
|
@@ -61,9 +61,10 @@ const sel = Select.create(元素, { multiple: false, value: 'b', label: '选项'
|
|
|
61
61
|
| 打开后焦点 | **落在选中项**(不是第一项,也不是按钮)|
|
|
62
62
|
| `↑` `↓` | 循环上下移动 |
|
|
63
63
|
| `Home` / `End` | 跳首/ 末 |
|
|
64
|
-
| `Enter` / `Space` |
|
|
64
|
+
| `Enter` / `Space` | 单选:选中并关闭;**多选:切换该项、列表不关** |
|
|
65
65
|
| `Esc` | 关闭,并**把焦点还给按钮** |
|
|
66
66
|
| `Alt` + `↓` | 直接打开 |
|
|
67
|
+
| 关闭态打字 | 打开并跳到首个匹配项(同原生 `<select>`) |
|
|
67
68
|
|
|
68
69
|
**① 为什么强调"落在选中项"**:这是 APG 明确要求的,也是最常做错的一条。
|
|
69
70
|
打开后焦点在第一项,用户按一次`↓` 就跳到第二项 —— 原来选的那项被跳过了。
|
|
@@ -73,6 +74,41 @@ const sel = Select.create(元素, { multiple: false, value: 'b', label: '选项'
|
|
|
73
74
|
去要求它落进 `<ul>` 会判成缺陷,实际不是。本库的判据也是按前一种断的
|
|
74
75
|
(`opener-path-check` 里这条组件的 `focus` 声明为 `activedesc`)。
|
|
75
76
|
|
|
77
|
+
## 多选与表单提交
|
|
78
|
+
|
|
79
|
+
`multiple: true` 时:
|
|
80
|
+
|
|
81
|
+
- 内部状态是**数组**,`aria-multiselectable="true"` 与 `aria-selected` 都按它写
|
|
82
|
+
—— 不是"写着多选、其实只有一个值"。
|
|
83
|
+
- 按钮文本按勾选顺序拼成 `A、B、C`,过长由 CSS 截断,`title` 里保留全量。
|
|
84
|
+
- **提交值一个选项一个 `input[type=hidden]`,同名多条**:
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<input type="hidden" name="sector" value="a">
|
|
88
|
+
<input type="hidden" name="sector" value="c">
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
name 依次取 `create({name})` → 根上的 `data-name` → 作者自己写的 hidden 的 name → 根元素 `id`。
|
|
92
|
+
一个都不给的话多选提交不出去,所以最后一档兜底到 `id`。
|
|
93
|
+
|
|
94
|
+
- 每次值变化都会在**根元素上派发原生 `change`**(冒泡),
|
|
95
|
+
React 受控组件 / `form.reset` 监听器认的是这个;`fl-change` 仍然发,给本库自己的使用者。
|
|
96
|
+
|
|
97
|
+
## API
|
|
98
|
+
|
|
99
|
+
```js
|
|
100
|
+
const sel = Select.create(el, { multiple: true, value: ['a', 'c'], name: 'sector' });
|
|
101
|
+
|
|
102
|
+
sel.value // 单选:字符串或 null;多选:数组
|
|
103
|
+
sel.values // 数组副本(多选常用)
|
|
104
|
+
sel.value = 'b' // 赋值后立即重绘 + 派发 change
|
|
105
|
+
sel.open() / sel.close()
|
|
106
|
+
sel.destroy() // 摘掉 keydown/click/dismissable/typeahead,删掉自己补的 hidden
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`destroy()` 之前没暴露过:动态移除组件时 `document` 上的 dismissable 监听、
|
|
110
|
+
typeahead 缓冲、按钮上的 keydown 会一直留着。现在必须调,重复调是安全的。
|
|
111
|
+
|
|
76
112
|
## 类型搜索(typeahead)
|
|
77
113
|
|
|
78
114
|
连续打字跳到匹配项。**原生 `<select>` 有这个能力,所以自建的必须有**。
|
|
@@ -109,4 +145,8 @@ const sel = Select.create(元素, { multiple: false, value: 'b', label: '选项'
|
|
|
109
145
|
|
|
110
146
|
## 门禁
|
|
111
147
|
|
|
112
|
-
`05-audit/select-check.js` ——
|
|
148
|
+
`05-audit/select-check.js` —— 覆盖键盘契约、ARIA 同步、多值与表单提交。
|
|
149
|
+
|
|
150
|
+
外部审计(2026-11)指出"↑↓ 一次走两格、多选 Enter 选上又取消、空列表抛错、
|
|
151
|
+
没有 destroy"之后,这四条变成了**精确断言**(一次按键只准走一格、Enter 只准切一次、
|
|
152
|
+
空列表不准抛、destroy 后不准再响应)。旧断言只判"序列有变化",所以双处理器能混过去。
|
|
@@ -81,7 +81,7 @@ label.f { display: block; margin-bottom: var(--sp-1); font-size: var(--fs-sm); }
|
|
|
81
81
|
|
|
82
82
|
<h2>2 · 多选</h2>
|
|
83
83
|
<div class="pad">
|
|
84
|
-
<div class="select select--block" id="s2">
|
|
84
|
+
<div class="select select--block" id="s2" data-name="sector">
|
|
85
85
|
<button class="select__btn" data-select-btn type="button">
|
|
86
86
|
<span class="select__value">请选择板块</span>
|
|
87
87
|
<span class="select__caret"></span>
|
|
@@ -146,16 +146,21 @@ label.f { display: block; margin-bottom: var(--sp-1); font-size: var(--fs-sm); }
|
|
|
146
146
|
<script>
|
|
147
147
|
(function () {
|
|
148
148
|
var log = document.getElementById('log');
|
|
149
|
+
function show(v, text) {
|
|
150
|
+
var hidden = document.querySelector('#s1 input[type=hidden]');
|
|
151
|
+
log.textContent = 'value=' + v + ' 文字=「' + text + '」 hidden=' +
|
|
152
|
+
(hidden ? hidden.value : '(无)') + ' [aria-current 项带 ✓]';
|
|
153
|
+
}
|
|
149
154
|
var s1 = Select.create(document.getElementById('s1'), {
|
|
150
155
|
label: '投资市场',
|
|
151
156
|
value: 'a', /* 默认选中 A 股主板 */
|
|
152
157
|
placeholder: '请选择市场',
|
|
153
|
-
onChange:
|
|
154
|
-
var hidden = document.querySelector('#s1 input[type=hidden]');
|
|
155
|
-
log.textContent = 'value=' + v + ' 文字=「' + text + '」 hidden=' +
|
|
156
|
-
(hidden ? hidden.value : '(无)') + ' [aria-current 项带 ✓]';
|
|
157
|
-
},
|
|
158
|
+
onChange: show,
|
|
158
159
|
});
|
|
160
|
+
/* 🔴 初始化**不派发** change(和原生 <select> 一致:挂载不是用户操作),
|
|
161
|
+
所以这里手动补一次回显 —— 否则页面一开始只有一句占位话,
|
|
162
|
+
看不出组件已经带着默认值、hidden input 也已经填好了。 */
|
|
163
|
+
show(s1.value, document.querySelector('#s1 .select__value').textContent.trim());
|
|
159
164
|
|
|
160
165
|
Select.create(document.getElementById('s2'), {
|
|
161
166
|
label: '板块', multiple: true, placeholder: '请选择板块',
|