@icen.ai/ui 0.8.0 → 0.8.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/AGENTS.md +15 -9
- package/README.md +8 -3
- package/dist/base.css +4 -3
- package/dist/behaviors/accordion.d.mts +5 -2
- package/dist/behaviors/accordion.mjs +36 -11
- package/dist/behaviors/ai-chat.d.mts +3 -1
- package/dist/behaviors/ai-chat.mjs +66 -43
- package/dist/behaviors/ai-composer.d.mts +28 -3
- package/dist/behaviors/ai-composer.mjs +291 -209
- package/dist/behaviors/ai-core.d.mts +9 -4
- package/dist/behaviors/ai-core.mjs +21 -8
- package/dist/behaviors/ai-diff.d.mts +2 -2
- package/dist/behaviors/ai-diff.mjs +172 -41
- package/dist/behaviors/ai-panel.d.mts +11 -8
- package/dist/behaviors/ai-panel.mjs +185 -110
- package/dist/behaviors/ai-provider.mjs +54 -48
- package/dist/behaviors/ai-tool.d.mts +12 -4
- package/dist/behaviors/ai-tool.mjs +311 -263
- package/dist/behaviors/ai-tools.d.mts +9 -6
- package/dist/behaviors/ai-tools.mjs +259 -155
- package/dist/behaviors/back-top.mjs +16 -1
- package/dist/behaviors/carousel.d.mts +5 -2
- package/dist/behaviors/carousel.mjs +53 -26
- package/dist/behaviors/charts.d.mts +68 -22
- package/dist/behaviors/charts.mjs +221 -150
- package/dist/behaviors/command-palette.d.mts +40 -6
- package/dist/behaviors/command-palette.mjs +143 -15
- package/dist/behaviors/context-menu.d.mts +21 -4
- package/dist/behaviors/context-menu.mjs +122 -38
- package/dist/behaviors/controls.d.mts +59 -0
- package/dist/behaviors/controls.mjs +601 -0
- package/dist/behaviors/copy.d.mts +5 -2
- package/dist/behaviors/copy.mjs +37 -12
- package/dist/behaviors/datatable.d.mts +12 -0
- package/dist/behaviors/datatable.mjs +226 -43
- package/dist/behaviors/date-picker.d.mts +2 -2
- package/dist/behaviors/date-picker.mjs +171 -32
- package/dist/behaviors/dropdown.d.mts +6 -2
- package/dist/behaviors/dropdown.mjs +164 -25
- package/dist/behaviors/events.d.mts +330 -0
- package/dist/behaviors/events.mjs +208 -0
- package/dist/behaviors/input.mjs +25 -12
- package/dist/behaviors/modal.d.mts +24 -5
- package/dist/behaviors/modal.mjs +76 -10
- package/dist/behaviors/nav.d.mts +1 -1
- package/dist/behaviors/nav.mjs +33 -7
- package/dist/behaviors/notification.d.mts +20 -4
- package/dist/behaviors/notification.mjs +53 -73
- package/dist/behaviors/popover.d.mts +39 -3
- package/dist/behaviors/popover.mjs +90 -4
- package/dist/behaviors/select.d.mts +4 -2
- package/dist/behaviors/select.mjs +161 -24
- package/dist/behaviors/sidebar.d.mts +5 -2
- package/dist/behaviors/sidebar.mjs +43 -13
- package/dist/behaviors/slider.d.mts +5 -2
- package/dist/behaviors/slider.mjs +54 -43
- package/dist/behaviors/split-pane.d.mts +6 -2
- package/dist/behaviors/split-pane.mjs +62 -21
- package/dist/behaviors/tabs.d.mts +3 -2
- package/dist/behaviors/tabs.mjs +65 -14
- package/dist/behaviors/tag-input.d.mts +5 -2
- package/dist/behaviors/tag-input.mjs +61 -21
- package/dist/behaviors/theme.d.mts +13 -2
- package/dist/behaviors/theme.mjs +48 -4
- package/dist/behaviors/toast.d.mts +30 -8
- package/dist/behaviors/toast.mjs +74 -7
- package/dist/behaviors/tree.d.mts +5 -2
- package/dist/behaviors/tree.mjs +38 -15
- package/dist/behaviors/upload.mjs +21 -23
- package/dist/cli.mjs +1 -1
- package/dist/components/ai-panel.css +1 -1
- package/dist/components/ai-tool-call.mjs +1 -1
- package/dist/components/badge.css +1 -1
- package/dist/components/breadcrumb.css +0 -32
- package/dist/components/chart-calendar.mjs +1 -2
- package/dist/components/chart-pie.css +0 -6
- package/dist/components/charts.css +1 -1
- package/dist/components/content.css +3 -16
- package/dist/components/datatable.css +1 -1
- package/dist/components/date-picker.css +1 -1
- package/dist/components/notification.css +2 -3
- package/dist/components/pagination.css +3 -1
- package/dist/components/pagination.mjs +1 -0
- package/dist/components/rating.mjs +1 -0
- package/dist/components/segmented.css +9 -1
- package/dist/components/segmented.mjs +1 -1
- package/dist/components/select.css +67 -4
- package/dist/components/steps.css +13 -3
- package/dist/components/steps.mjs +1 -0
- package/dist/components/switch.css +3 -1
- package/dist/components/switch.mjs +1 -0
- package/dist/components/table.mjs +1 -0
- package/dist/components/tabs.css +23 -0
- package/dist/components/tag-input.css +1 -6
- package/dist/components/upload.css +0 -15
- package/dist/index.d.mts +12 -10
- package/dist/index.mjs +2700 -1460
- package/dist/registry.json +42 -13
- package/dist/retro-effects.css +3 -16
- package/dist/tokens/retro-effects.css +3 -16
- package/dist/tokens/style-profiles.css +3 -2
- package/dist/tokens/typography.css +2 -0
- package/dist/tokens.css +5 -2
- package/dist/ui.css +138 -98
- package/docs/spec/ai-native.md +7 -4
- package/package.json +1 -1
package/dist/ui.css
CHANGED
|
@@ -1339,7 +1339,9 @@
|
|
|
1339
1339
|
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
|
|
1340
1340
|
--ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
1341
1341
|
|
|
1342
|
-
/* ── Typography 字体 ──
|
|
1342
|
+
/* ── Typography 字体 ──
|
|
1343
|
+
--line-height-heading 不在此定义:typography.css 独家拥有(icen 品牌 1.2),
|
|
1344
|
+
各 .style-* profile 需要差异化时在自己的块里覆盖。 */
|
|
1343
1345
|
--font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
|
1344
1346
|
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
1345
1347
|
--font-mono-paper: ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Courier New', monospace;
|
|
@@ -1347,7 +1349,6 @@
|
|
|
1347
1349
|
--letter-spacing-body: 0;
|
|
1348
1350
|
--letter-spacing-heading: 0;
|
|
1349
1351
|
--line-height-body: 1.5;
|
|
1350
|
-
--line-height-heading: 1.2;
|
|
1351
1352
|
}
|
|
1352
1353
|
|
|
1353
1354
|
/* ══════════════════════════════════════════════════════════════
|
|
@@ -1821,6 +1822,7 @@
|
|
|
1821
1822
|
* @icen.ai/ui — Typography Tokens(icen canonical)
|
|
1822
1823
|
* 美学基调:等宽数字精密感 × 衬线书卷气(宋体标题)
|
|
1823
1824
|
* 默认(:root)即 icen 品牌形态;.style-modern 显式回退 system-ui 栈(见 style-profiles.css)
|
|
1825
|
+
* 工具类:.font-math(数字密集区,"Numeric Math" 数学字体 + tabular-nums)
|
|
1824
1826
|
*/
|
|
1825
1827
|
|
|
1826
1828
|
/* ── 数学/等宽数字字体(数字密集区的精密感) ── */
|
|
@@ -1843,6 +1845,7 @@
|
|
|
1843
1845
|
--font-heading: 'Songti SC', 'STSong', 'Noto Serif SC', 'Source Han Serif SC', SimSun, serif;
|
|
1844
1846
|
--font-cjk: var(--font-heading);
|
|
1845
1847
|
--line-height-body: 1.7;
|
|
1848
|
+
/* 独家定义(style-profiles.css 的 :root 不再重复;profile 差异化在各 .style-* 块覆盖) */
|
|
1846
1849
|
--line-height-heading: 1.2;
|
|
1847
1850
|
}
|
|
1848
1851
|
|
|
@@ -1878,7 +1881,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
|
1878
1881
|
* ════════════════════════════════════════════════════════════════════════
|
|
1879
1882
|
* icen 组件契约(统一抽象)
|
|
1880
1883
|
* ════════════════════════════════════════════════════════════════════════
|
|
1881
|
-
* 所有
|
|
1884
|
+
* 所有 56 个组件遵循同一套抽象,由两层共同支撑:
|
|
1882
1885
|
*
|
|
1883
1886
|
* ── 层 1:--icen-* 原语 token(所有组件自洽消费)
|
|
1884
1887
|
* --icen-ring / --icen-ring-soft / --icen-ring-error /
|
|
@@ -1926,7 +1929,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
|
1926
1929
|
* 暴露的契约:
|
|
1927
1930
|
* - 元素基线:box-sizing / body / a / code / pre / img / ::selection
|
|
1928
1931
|
* - 滚动条:贴 --token-scrollbar-*(retro profile 另有硬覆盖)
|
|
1929
|
-
* - 工具类:.mono / .dim / .faint / .sr-only / .skip-link
|
|
1932
|
+
* - 工具类:.mono / .serif / .dim / .faint / .numeric / .sr-only / .skip-link
|
|
1930
1933
|
* - z-index 标尺:--z-* (浮层一律 portal 到 body)
|
|
1931
1934
|
* - 共享 keyframes:icen-pop-in(弹层进场)/ icen-spin(旋转)/ icen-skeleton-pulse(骨架脉冲)
|
|
1932
1935
|
* - 交互基元 class:.pressable / .control / .field / .lift / .surface-elevated / .focus-ring / .motion
|
|
@@ -1938,7 +1941,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
|
1938
1941
|
───────────────────────────────────────────────────────────────
|
|
1939
1942
|
所有组件消费的"原语级"变量:聚焦环、悬停、按下、禁用、过渡。
|
|
1940
1943
|
风格 profile(如 .style-retro)只需覆盖这里的少数变量,
|
|
1941
|
-
即可让
|
|
1944
|
+
即可让 56 个组件整体换肤;组件自身无需感知风格切换。
|
|
1942
1945
|
══════════════════════════════════════════════════════════════ */
|
|
1943
1946
|
:root {
|
|
1944
1947
|
/* ── 聚焦环(focus-visible) ── */
|
|
@@ -2262,6 +2265,7 @@ html {
|
|
|
2262
2265
|
<span class="field-label">姓名</span>
|
|
2263
2266
|
<span class="control"><input /></span>
|
|
2264
2267
|
<span class="field-hint">必填</span>
|
|
2268
|
+
<span class="field-error">错误</span>
|
|
2265
2269
|
</label> */
|
|
2266
2270
|
.field {
|
|
2267
2271
|
display: flex;
|
|
@@ -4122,7 +4126,7 @@ html {
|
|
|
4122
4126
|
user-select: none;
|
|
4123
4127
|
}
|
|
4124
4128
|
|
|
4125
|
-
/*
|
|
4129
|
+
/* 大号变体(消费方变体,常驻头部大号环;behavior 不产出,由使用方手写标记) */
|
|
4126
4130
|
.ai-usage-ring--lg {
|
|
4127
4131
|
width: 44px;
|
|
4128
4132
|
height: 44px;
|
|
@@ -5056,7 +5060,7 @@ html {
|
|
|
5056
5060
|
* </span>
|
|
5057
5061
|
*
|
|
5058
5062
|
* 变体:--dot 纯圆点 / --sm 小号 / --lg 大号 / --bottom 底部角
|
|
5059
|
-
* 语义色:--success(在线)/ --warning / --error / --accent
|
|
5063
|
+
* 语义色:--success(在线)/ --warning / --error / --info / --accent
|
|
5060
5064
|
*/
|
|
5061
5065
|
|
|
5062
5066
|
.badge-host {
|
|
@@ -5269,38 +5273,6 @@ html {
|
|
|
5269
5273
|
background: var(--token-fill-1);
|
|
5270
5274
|
}
|
|
5271
5275
|
|
|
5272
|
-
/* ── 溢出下拉(behavior 可选:点击 … 展开被折叠的中间路径) ── */
|
|
5273
|
-
.breadcrumb-dropdown {
|
|
5274
|
-
position: relative;
|
|
5275
|
-
}
|
|
5276
|
-
.breadcrumb-dropdown-menu {
|
|
5277
|
-
position: absolute;
|
|
5278
|
-
top: calc(100% + 4px);
|
|
5279
|
-
left: 0;
|
|
5280
|
-
min-width: 160px;
|
|
5281
|
-
padding: 4px;
|
|
5282
|
-
background: var(--token-card-strong);
|
|
5283
|
-
border: 1px solid var(--token-outline);
|
|
5284
|
-
border-radius: var(--radius-md);
|
|
5285
|
-
box-shadow: var(--token-shadow-overlay);
|
|
5286
|
-
z-index: var(--z-popover);
|
|
5287
|
-
animation: icen-pop-in var(--icen-tx-fast);
|
|
5288
|
-
}
|
|
5289
|
-
.breadcrumb-dropdown-menu[hidden] { display: none; }
|
|
5290
|
-
.breadcrumb-dropdown-menu a {
|
|
5291
|
-
display: block;
|
|
5292
|
-
padding: 4px var(--density-space-sm);
|
|
5293
|
-
font-size: var(--density-font-size-sm);
|
|
5294
|
-
color: var(--token-text-muted);
|
|
5295
|
-
text-decoration: none;
|
|
5296
|
-
border-radius: var(--radius-sm);
|
|
5297
|
-
transition: background-color var(--icen-tx-fast), color var(--icen-tx-fast);
|
|
5298
|
-
}
|
|
5299
|
-
.breadcrumb-dropdown-menu a:hover {
|
|
5300
|
-
background: var(--token-fill-1);
|
|
5301
|
-
color: var(--token-text);
|
|
5302
|
-
}
|
|
5303
|
-
|
|
5304
5276
|
/* ── 面包屑分隔符变体 ── */
|
|
5305
5277
|
.breadcrumb--slash .breadcrumb-sep::after { content: '/'; }
|
|
5306
5278
|
.breadcrumb--arrow .breadcrumb-sep::after { content: '→'; }
|
|
@@ -6013,12 +5985,6 @@ html {
|
|
|
6013
5985
|
height: 132px;
|
|
6014
5986
|
flex-shrink: 0;
|
|
6015
5987
|
}
|
|
6016
|
-
.chart-donut-center {
|
|
6017
|
-
font-variant-numeric: tabular-nums;
|
|
6018
|
-
text-anchor: middle;
|
|
6019
|
-
fill: var(--token-text);
|
|
6020
|
-
font-weight: 600;
|
|
6021
|
-
}
|
|
6022
5988
|
|
|
6023
5989
|
|
|
6024
5990
|
/* ── components/chart-radar.css ── */
|
|
@@ -6201,7 +6167,7 @@ html {
|
|
|
6201
6167
|
font-variant-numeric: tabular-nums;
|
|
6202
6168
|
}
|
|
6203
6169
|
|
|
6204
|
-
/* ──
|
|
6170
|
+
/* ── 调色盘:手写 markup 调色盘;behavior 走 charts.ts PALETTE_VARS 内联同值(两处值需人工同步) ── */
|
|
6205
6171
|
.chart-tone-1 { --chart-tone: var(--token-accent); }
|
|
6206
6172
|
.chart-tone-2 { --chart-tone: var(--token-accent-cold); }
|
|
6207
6173
|
.chart-tone-3 { --chart-tone: var(--token-success); }
|
|
@@ -6550,6 +6516,9 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
6550
6516
|
*
|
|
6551
6517
|
* 包含:kbd(按键)/ code-inline(行内代码)/ list(分隔列表)/ accordion(手风琴,behaviors/accordion 配套)/
|
|
6552
6518
|
* timeline(时间线)/ desc(描述列表)/ tree(树形,behaviors/tree 配套)
|
|
6519
|
+
* markup API 变体(正文"增强"段,behavior 不产出、由手写 markup 消费):
|
|
6520
|
+
* .accordion--cards / .code-inline--success|--warning|--error /
|
|
6521
|
+
* .timeline--right|--alternate|--sm / .timeline-extra / .timeline-dot--sm 及 dot 语义色(--error 等)
|
|
6553
6522
|
* 规格源自 opengal src/presentation/ui/data/exhibit.tsx 与 data/display.tsx。
|
|
6554
6523
|
*/
|
|
6555
6524
|
|
|
@@ -7078,22 +7047,6 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
7078
7047
|
background: var(--token-outline-soft);
|
|
7079
7048
|
}
|
|
7080
7049
|
|
|
7081
|
-
/* 树节点复选框(checkbox tree) */
|
|
7082
|
-
.tree-checkbox {
|
|
7083
|
-
width: 14px;
|
|
7084
|
-
height: 14px;
|
|
7085
|
-
flex-shrink: 0;
|
|
7086
|
-
margin-right: 2px;
|
|
7087
|
-
}
|
|
7088
|
-
|
|
7089
|
-
/* 树拖拽视觉态 */
|
|
7090
|
-
.tree-node.is-dragging {
|
|
7091
|
-
opacity: 0.5;
|
|
7092
|
-
}
|
|
7093
|
-
.tree-node.is-drop-target {
|
|
7094
|
-
box-shadow: inset 0 -2px var(--token-accent);
|
|
7095
|
-
}
|
|
7096
|
-
|
|
7097
7050
|
/* 树搜索高亮 */
|
|
7098
7051
|
.tree-label mark {
|
|
7099
7052
|
background: color-mix(in srgb, var(--token-warning) 30%, transparent);
|
|
@@ -7654,7 +7607,7 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
7654
7607
|
background: color-mix(in srgb, var(--token-accent-subtle) 82%, var(--token-fill-1));
|
|
7655
7608
|
}
|
|
7656
7609
|
|
|
7657
|
-
/* ── 行状态类(rowClassName
|
|
7610
|
+
/* ── 行状态类(rowClassName 产出;--danger/--warning/--success 同族语义行底色) ── */
|
|
7658
7611
|
.dt-row--danger { background: color-mix(in srgb, var(--token-error) 6%, transparent) !important; }
|
|
7659
7612
|
.dt-row--danger:hover { background: color-mix(in srgb, var(--token-error) 10%, transparent) !important; }
|
|
7660
7613
|
.dt-row--warning { background: color-mix(in srgb, var(--token-warning) 6%, transparent) !important; }
|
|
@@ -7667,7 +7620,7 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
7667
7620
|
*
|
|
7668
7621
|
* 契约:
|
|
7669
7622
|
* <div class="date-picker" data-date-picker data-date-picker-input="id">
|
|
7670
|
-
* <button class="date-picker-trigger" type="button" aria-haspopup="dialog">
|
|
7623
|
+
* <button class="date-picker-trigger [--sm|--lg]" type="button" aria-haspopup="dialog">
|
|
7671
7624
|
* <span class="date-picker-value">2026-07-29</span>
|
|
7672
7625
|
* <svg class="date-picker-icon">…日历 svg…</svg>
|
|
7673
7626
|
* </button>
|
|
@@ -10239,7 +10192,7 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
10239
10192
|
*
|
|
10240
10193
|
* 完整契约(由 behavior 渲染):
|
|
10241
10194
|
* <div class="notification-container" role="region" aria-label="通知" data-position="top-right">
|
|
10242
|
-
* <div class="notification [notification--success|warning|error
|
|
10195
|
+
* <div class="notification [notification--success|warning|error]
|
|
10243
10196
|
* [.is-priority] [.is-unread] [.is-progress] [.is-clickable] [.is-paused]
|
|
10244
10197
|
* [.has-avatar]" role="alert|button">
|
|
10245
10198
|
* <span class="notification-icon">…svg 或 img.notification-avatar…</span>
|
|
@@ -10311,7 +10264,7 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
10311
10264
|
.notification.notification--success { border-left-color: var(--token-success); }
|
|
10312
10265
|
.notification.notification--warning { border-left-color: var(--token-warning); }
|
|
10313
10266
|
.notification.notification--error { border-left-color: var(--token-error); }
|
|
10314
|
-
|
|
10267
|
+
/* info 为基类默认配色(基类左侧边即 --token-info),无修饰类 */
|
|
10315
10268
|
|
|
10316
10269
|
/* ── 优先级:高优先级强调(左侧加粗 + 更强阴影)── */
|
|
10317
10270
|
.notification.is-priority {
|
|
@@ -10368,7 +10321,6 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
10368
10321
|
.notification--success .notification-icon { color: var(--token-success); }
|
|
10369
10322
|
.notification--warning .notification-icon { color: var(--token-warning); }
|
|
10370
10323
|
.notification--error .notification-icon { color: var(--token-error); }
|
|
10371
|
-
.notification--info .notification-icon { color: var(--token-info); }
|
|
10372
10324
|
|
|
10373
10325
|
/* 头像(圆形图) */
|
|
10374
10326
|
.notification-avatar {
|
|
@@ -10630,7 +10582,9 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
10630
10582
|
* <button class="page-btn motion" aria-label="下一页">›</button>
|
|
10631
10583
|
* </nav>
|
|
10632
10584
|
*
|
|
10633
|
-
*
|
|
10585
|
+
* 点击接线由 behaviors/controls.ts 的 initPagination() 提供(.page-btn 激活位移 +
|
|
10586
|
+
* icen:page-change,上下页按钮按 aria-label / data-dir 推断方向);总页数与省略号
|
|
10587
|
+
* 折叠策略由消费方维护,这里只提供样式契约。
|
|
10634
10588
|
*/
|
|
10635
10589
|
|
|
10636
10590
|
.pagination {
|
|
@@ -11347,7 +11301,15 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
11347
11301
|
* …
|
|
11348
11302
|
* </div>
|
|
11349
11303
|
*
|
|
11350
|
-
* segmented/
|
|
11304
|
+
* segmented / stepper 由 behaviors/controls.ts 接线(initSegmented / initStepper,
|
|
11305
|
+
* 派 icen:segmented-change / icen:stepper-change);otp 由 behaviors/input.ts 的
|
|
11306
|
+
* initInput 接线;toggle-group 为纯 CSS 状态组件(.is-active,使用方自行驱动)。
|
|
11307
|
+
*
|
|
11308
|
+
* 增强段(正文"增强"段):
|
|
11309
|
+
* 变体:segmented--block / segmented--ghost / toggle-group--block / toggle-group--ghost
|
|
11310
|
+
* 槽位:stepper-unit(步进器单位后缀)/ otp-separator(OTP 分组分隔符)
|
|
11311
|
+
* 状态类(消费方施加):.otp.is-complete(behavior 接线中)/ .otp.is-error /
|
|
11312
|
+
* .segmented.is-error / .segmented.is-disabled / .toggle-group.is-error / .toggle-group.is-disabled
|
|
11351
11313
|
*/
|
|
11352
11314
|
|
|
11353
11315
|
/* ── 分段控件(排他单选) ── */
|
|
@@ -11662,14 +11624,24 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
11662
11624
|
*
|
|
11663
11625
|
* 完整契约:
|
|
11664
11626
|
* <div class="select [data-disabled] [.is-open]" data-select
|
|
11665
|
-
* [data-select-search] [data-select-multiple] [data-select-max="3"]
|
|
11627
|
+
* [data-select-search] [data-select-multiple] [data-select-max="3"]
|
|
11628
|
+
* [data-panel-width="220"] [data-panel-min="200"]
|
|
11629
|
+
* [data-panel-max="360"] [data-panel-max-height="320"]>
|
|
11630
|
+
* <!-- 选项 .select-option 内支持任意 HTML(色卡 / 图标 / 多行);
|
|
11631
|
+
* 面板尺寸为全库统一 PanelSizing 契约(behaviors/popover.ts) -->
|
|
11666
11632
|
* <button class="select-trigger pressable focus-ring [--sm|--lg]" aria-haspopup="listbox"
|
|
11667
11633
|
* aria-expanded="false" [disabled]>
|
|
11668
11634
|
* <span class="select-leading">…</span> 可选前缀
|
|
11669
|
-
* <span class="select-value is-empty">占位</span>
|
|
11670
|
-
* <
|
|
11635
|
+
* <span class="select-value is-empty">占位</span> 多选有选中时 behavior 隐藏它
|
|
11636
|
+
* <span class="select-chips"> ← 多选选中态由 behavior 渲染(勿手写)
|
|
11637
|
+
* <span class="select-chip">标签<span class="select-chip-x" role="button" tabindex="-1">×</span></span>
|
|
11638
|
+
* <span class="select-chip select-chip--more">+2</span>
|
|
11639
|
+
* </span>
|
|
11671
11640
|
* <svg class="select-chevron">…</svg>
|
|
11672
11641
|
* </button>
|
|
11642
|
+
* <button class="select-clear" aria-label="清除全部" hidden>×</button> ← 多选可选:
|
|
11643
|
+
* 与 trigger 同级(不能嵌套在 button 内),绝对定位叠进 trigger 右侧;
|
|
11644
|
+
* behavior 在有选中时自动显示
|
|
11673
11645
|
* <div class="select-panel" hidden role="listbox">
|
|
11674
11646
|
* <div class="select-search"> ← data-select-search 时 behavior 自动注入
|
|
11675
11647
|
* <input class="select-search-input" placeholder="搜索…" />
|
|
@@ -11867,8 +11839,13 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
11867
11839
|
box-shadow: var(--icen-control-focus-shadow);
|
|
11868
11840
|
}
|
|
11869
11841
|
|
|
11870
|
-
/* ──
|
|
11842
|
+
/* ── 多选清除按钮(与 trigger 同级,绝对定位叠进 trigger 右侧、chevron 左侧) ── */
|
|
11871
11843
|
.select-clear {
|
|
11844
|
+
position: absolute;
|
|
11845
|
+
top: 50%;
|
|
11846
|
+
right: calc(var(--density-space-sm) + 20px);
|
|
11847
|
+
transform: translateY(-50%);
|
|
11848
|
+
z-index: 1;
|
|
11872
11849
|
display: inline-flex;
|
|
11873
11850
|
align-items: center;
|
|
11874
11851
|
justify-content: center;
|
|
@@ -11889,6 +11866,53 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
11889
11866
|
color: var(--token-text);
|
|
11890
11867
|
background: var(--token-fill-1);
|
|
11891
11868
|
}
|
|
11869
|
+
/* 有清除钮时 trigger 右侧让位(clear 18px + chevron 14px + 间距) */
|
|
11870
|
+
.select:has(.select-clear) .select-trigger { padding-right: 52px; }
|
|
11871
|
+
|
|
11872
|
+
/* ── 多选 chips(tag 式展示;× 仅 hover 对应 chip 时出现) ── */
|
|
11873
|
+
.select-chips {
|
|
11874
|
+
display: inline-flex;
|
|
11875
|
+
flex-wrap: wrap;
|
|
11876
|
+
align-items: center;
|
|
11877
|
+
gap: 4px;
|
|
11878
|
+
flex: 1;
|
|
11879
|
+
min-width: 0;
|
|
11880
|
+
}
|
|
11881
|
+
.select-chip {
|
|
11882
|
+
display: inline-flex;
|
|
11883
|
+
align-items: center;
|
|
11884
|
+
max-width: 100%;
|
|
11885
|
+
font-size: var(--density-font-size-xs);
|
|
11886
|
+
line-height: 1.6;
|
|
11887
|
+
color: var(--token-text);
|
|
11888
|
+
background: var(--token-fill-2);
|
|
11889
|
+
border-radius: var(--radius-sm);
|
|
11890
|
+
padding: 0 7px;
|
|
11891
|
+
white-space: nowrap;
|
|
11892
|
+
}
|
|
11893
|
+
.select-chip-x {
|
|
11894
|
+
display: inline-flex;
|
|
11895
|
+
align-items: center;
|
|
11896
|
+
justify-content: center;
|
|
11897
|
+
width: 0;
|
|
11898
|
+
opacity: 0;
|
|
11899
|
+
overflow: hidden;
|
|
11900
|
+
margin-left: 0;
|
|
11901
|
+
color: var(--token-text-faint);
|
|
11902
|
+
border-radius: var(--radius-full);
|
|
11903
|
+
font-size: var(--density-font-size-md);
|
|
11904
|
+
line-height: 1;
|
|
11905
|
+
cursor: pointer;
|
|
11906
|
+
transition:
|
|
11907
|
+
width var(--icen-tx-fast),
|
|
11908
|
+
opacity var(--icen-tx-fast),
|
|
11909
|
+
margin-left var(--icen-tx-fast),
|
|
11910
|
+
color var(--icen-tx-fast);
|
|
11911
|
+
}
|
|
11912
|
+
.select-chip:hover .select-chip-x,
|
|
11913
|
+
.select-chip-x:focus-visible { width: 12px; opacity: 1; margin-left: 4px; }
|
|
11914
|
+
.select-chip-x:hover { color: var(--token-error); }
|
|
11915
|
+
.select-chip--more { color: var(--token-text-muted); background: var(--token-fill-1); }
|
|
11892
11916
|
|
|
11893
11917
|
/* ── 多选 trigger 高度自适应(chips 可能换行) ── */
|
|
11894
11918
|
.select[data-select-multiple] .select-trigger {
|
|
@@ -11921,6 +11945,7 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
11921
11945
|
@media (prefers-reduced-motion: reduce) {
|
|
11922
11946
|
.select-panel { animation: none; }
|
|
11923
11947
|
.select-search-input,
|
|
11948
|
+
.select-chip-x,
|
|
11924
11949
|
.select-clear { transition: none; }
|
|
11925
11950
|
}
|
|
11926
11951
|
|
|
@@ -12905,7 +12930,8 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
12905
12930
|
* @icen.ai/ui — Component: steps(步骤条,横向默认 / .steps--vertical 垂直)
|
|
12906
12931
|
*
|
|
12907
12932
|
* 完整契约:
|
|
12908
|
-
* <ol class="steps [steps--vertical] [steps--sm|steps--lg]
|
|
12933
|
+
* <ol class="steps [steps--vertical] [steps--sm|steps--lg] [steps--dots|steps--progress|steps--connected]"
|
|
12934
|
+
* aria-label="进度">
|
|
12909
12935
|
* <li class="step [step--finish|step--process|step--wait] [.step--error]">
|
|
12910
12936
|
* <span class="step-line"></span> ← 横向:右半段连线;末步自动隐藏
|
|
12911
12937
|
* <span class="step-dot">[✓ | ! | 数字]</span>
|
|
@@ -12917,7 +12943,11 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
12917
12943
|
* </ol>
|
|
12918
12944
|
*
|
|
12919
12945
|
* 四态:finish / process / wait / error(错误用 error 色 dot + 描边)。
|
|
12920
|
-
*
|
|
12946
|
+
* 变体与增强(正文下半段):--dots 纯点紧凑 / --progress 步骤间填充进度线 / --connected 虚线连接;
|
|
12947
|
+
* dot 内可放 svg.step-dot-icon;step-desc 旁可加 .step-extra 富化描述;
|
|
12948
|
+
* 可点击步骤标 .step--clickable(与 controls.ts initSteps 的 JSDoc 同口径)。
|
|
12949
|
+
* 点击 .step[role=button] 由 behaviors/controls.ts 的 initSteps() 接线(激活态位移 +
|
|
12950
|
+
* icen:step-change);跳转业务仍由使用方监听事件实现。
|
|
12921
12951
|
*/
|
|
12922
12952
|
|
|
12923
12953
|
.steps {
|
|
@@ -13044,7 +13074,9 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
13044
13074
|
padding: 0;
|
|
13045
13075
|
font-size: 0;
|
|
13046
13076
|
}
|
|
13047
|
-
|
|
13077
|
+
/* 线 top = dot 高度一半:默认 32→16 / sm 24→12 / lg 40→20 / dots 10→5;
|
|
13078
|
+
本块位于尺寸变体之后,同等特异性下靠源顺序生效,dots 与 --sm/--lg 叠加时以 5px 为准 */
|
|
13079
|
+
.steps--dots .step-line { top: 5px; }
|
|
13048
13080
|
.steps--dots .step-title,
|
|
13049
13081
|
.steps--dots .step-desc { display: none; }
|
|
13050
13082
|
.steps--dots .step { flex: none; }
|
|
@@ -13074,8 +13106,11 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
13074
13106
|
}
|
|
13075
13107
|
|
|
13076
13108
|
/* ── 进度条变体(步骤间的填充进度,非离散连线) ── */
|
|
13109
|
+
/* 高度 1px→3px 时线只向下扩张 2px,整体上移 1px 使线心与 1px 基线居中一致;
|
|
13110
|
+
用 translateY 而非改 top,可同时适配 --sm(12px)/--lg(20px) 的不同基线 */
|
|
13077
13111
|
.steps--progress .step-line {
|
|
13078
13112
|
height: 3px;
|
|
13113
|
+
transform: translateY(-1px);
|
|
13079
13114
|
border-radius: var(--radius-full);
|
|
13080
13115
|
background: var(--token-fill-2);
|
|
13081
13116
|
overflow: hidden;
|
|
@@ -13138,7 +13173,9 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
13138
13173
|
/* ── components/switch.css ── */
|
|
13139
13174
|
/*
|
|
13140
13175
|
* @icen.ai/ui — Component: switch / checkbox / radio(开关 / 勾选 / 单选行)
|
|
13141
|
-
*
|
|
13176
|
+
* 状态组件:状态全走 aria-checked / .is-selected;交互由 behaviors/controls.ts 的
|
|
13177
|
+
* initSwitch() 接线(点击 / Space / Enter 翻转并派 icen:switch-change / icen:check-change),
|
|
13178
|
+
* 不接线时亦可由使用方自行驱动状态。
|
|
13142
13179
|
*
|
|
13143
13180
|
* 完整契约:
|
|
13144
13181
|
* <button class="switch [--sm|--lg]" role="switch" aria-checked="true|false" [disabled]>
|
|
@@ -13919,6 +13956,29 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
13919
13956
|
.page-tab, .tabs a, .page-tab-close { transition: none; }
|
|
13920
13957
|
}
|
|
13921
13958
|
|
|
13959
|
+
/* ── 指示条([data-tabs-ink],与 behaviors/tabs 配套;本节为追加)── */
|
|
13960
|
+
/* tablist(.tabs)挂 data-tabs-ink 时,行为层创建并移动 .tabs-ink:
|
|
13961
|
+
宽 / translateX 由 JS 内联写入(布局定位,同 popover 模式);
|
|
13962
|
+
此处只负责视觉(高度 / 圆角 / 背景)与位移过渡(--duration / --ease token)。 */
|
|
13963
|
+
.tabs[data-tabs-ink] {
|
|
13964
|
+
position: relative;
|
|
13965
|
+
}
|
|
13966
|
+
.tabs-ink {
|
|
13967
|
+
position: absolute;
|
|
13968
|
+
bottom: -1px; /* 盖在容器 1px 底边线上,与活动 tab 的 2px 下划线同高 */
|
|
13969
|
+
left: 0;
|
|
13970
|
+
height: 2px;
|
|
13971
|
+
border-radius: var(--radius-full);
|
|
13972
|
+
background: var(--token-accent);
|
|
13973
|
+
pointer-events: none;
|
|
13974
|
+
transition:
|
|
13975
|
+
width var(--duration-normal) var(--ease-out),
|
|
13976
|
+
transform var(--duration-normal) var(--ease-out);
|
|
13977
|
+
}
|
|
13978
|
+
@media (prefers-reduced-motion: reduce) {
|
|
13979
|
+
.tabs-ink { transition: none; }
|
|
13980
|
+
}
|
|
13981
|
+
|
|
13922
13982
|
|
|
13923
13983
|
/* ── components/tag-input.css ── */
|
|
13924
13984
|
/*
|
|
@@ -13993,12 +14053,7 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
|
|
|
13993
14053
|
max-width: 100%;
|
|
13994
14054
|
animation: tag-pop var(--icen-tx-fast);
|
|
13995
14055
|
}
|
|
13996
|
-
|
|
13997
|
-
white-space: nowrap;
|
|
13998
|
-
overflow: hidden;
|
|
13999
|
-
text-overflow: ellipsis;
|
|
14000
|
-
max-width: 200px;
|
|
14001
|
-
}
|
|
14056
|
+
/* readonly 变体(消费方手写标记,behavior 不产出) */
|
|
14002
14057
|
.tag-chip--readonly { background: var(--token-fill-2); color: var(--token-text-muted); }
|
|
14003
14058
|
|
|
14004
14059
|
@keyframes tag-pop {
|
|
@@ -14875,21 +14930,6 @@ button.tag,
|
|
|
14875
14930
|
box-shadow: var(--icen-ring);
|
|
14876
14931
|
}
|
|
14877
14932
|
|
|
14878
|
-
/* 进度条(behavior 可选注入 .upload-list-item-progress) */
|
|
14879
|
-
.upload-list-item-progress {
|
|
14880
|
-
height: 2px;
|
|
14881
|
-
width: 100%;
|
|
14882
|
-
background: var(--token-fill-2);
|
|
14883
|
-
border-radius: var(--radius-full);
|
|
14884
|
-
overflow: hidden;
|
|
14885
|
-
margin-top: 2px;
|
|
14886
|
-
}
|
|
14887
|
-
.upload-list-item-progress-bar {
|
|
14888
|
-
height: 100%;
|
|
14889
|
-
background: var(--token-accent);
|
|
14890
|
-
border-radius: var(--radius-full);
|
|
14891
|
-
transition: width var(--icen-tx-normal) var(--ease-out);
|
|
14892
|
-
}
|
|
14893
14933
|
.upload-list-item.is-error {
|
|
14894
14934
|
border-color: var(--token-error);
|
|
14895
14935
|
}
|
package/docs/spec/ai-native.md
CHANGED
|
@@ -291,7 +291,7 @@ warning),点击弹层展示完整清单(popover + renderAiTodo 只读)
|
|
|
291
291
|
</aside>
|
|
292
292
|
```
|
|
293
293
|
|
|
294
|
-
- `initAiContext(root?)`:触发器 `[data-ai-context-open]` 全局委托开合;抽屉 fixed 右侧滑入(`--z-chrome`),Esc/外点关闭;`.ai-context--inline` 变体为页面流内嵌(不做 fixed
|
|
294
|
+
- `initAiContext(root?)`:触发器 `[data-ai-context-open]` 全局委托开合;抽屉 fixed 右侧滑入(`--z-chrome`),Esc/外点关闭;`.ai-context--inline` 变体为页面流内嵌(不做 fixed)。开/合从抽屉根派 `icen:ai-context-open` / `icen:ai-context-close` `{}`。
|
|
295
295
|
- `renderAiContext(el, { usage?, files?, mcpServers?, skills? })`:组合渲染(内部复用 renderAiUsage / ai-files chip / ai-item 行)。
|
|
296
296
|
- MCP server 行:`.ai-item` 基元 + `is-done`(已连接)/`is-error`(断开)。
|
|
297
297
|
|
|
@@ -388,10 +388,14 @@ export function svgIcon(svg: string): SVGElement | null; // DOMParser 消毒(
|
|
|
388
388
|
- `setComposerRefs(el, sources: { kind: 'file'|'folder'|'doc'|'agent', id, label, sub? }[])`:
|
|
389
389
|
任意位置输入 `@` 触发弹层(分组按 kind + 图标);选中后文本插入 `@label ` 且 refs chip 行 +1,
|
|
390
390
|
派 `icen:ai-ref { action: 'add', ref }`;chip × 移除(同时删文本里首个 `@label`)派 `{ action: 'remove' }`。
|
|
391
|
+
kind 开放注册:`registerRefKind(kind, { label, icon?, order? })`(照 registerAiKind 的 Map + 兜底模式);
|
|
392
|
+
未知且未注册的 kind 不丢弃——通用文档图标 + kind 原文兜底,order 缺省排最后。
|
|
391
393
|
- `setComposerUsage(el, usage, opts)`:工具条右侧挂 `renderAiUsageRing`。
|
|
392
394
|
- 历史:输入为空时按 `↑` 取回上一条已发送文本(会话内历史数组,每 composer 独立)。
|
|
393
395
|
- 运行态(v1 已有 queue/stop)补充:运行中按 `↑` 把最后一条排队消息取回输入框重新编辑(Claude Code 模式)。
|
|
394
396
|
- 弹层接管时键盘事件 preventDefault;IME 组合态安全(沿用 v1)。
|
|
397
|
+
- 三弹层尺寸走 PanelSizing 契约:composer 根 `data-panel-*` 为用户覆盖(三弹层共用),
|
|
398
|
+
`bindComposer` opts.popoverSizing 整体覆盖,原内置魔数仅为默认。
|
|
395
399
|
- 图标对齐修复:工具条按钮统一 28px 方形、svg 14px 居中、gap 走 density token。
|
|
396
400
|
|
|
397
401
|
事件新增:`icen:ai-model-change` / `icen:ai-command` / `icen:ai-ref`(全 bubbles)。
|
|
@@ -528,12 +532,11 @@ export function normalizeContentParts(raw: unknown): AiContentPart[];
|
|
|
528
532
|
### 10.3 工具与文本
|
|
529
533
|
|
|
530
534
|
```ts
|
|
531
|
-
export function isAiContentPartArray(v: unknown): v is AiContentPart[]; // 守卫(tool output 多模态探测)
|
|
532
535
|
export function contentToText(content: AiContent): string; // 拼接全部 text 部件(复制/降级传输用)
|
|
533
536
|
export function aiContentUrl(part: AiContentPart): string | undefined; // url 或 data URI(渲染 src)
|
|
534
537
|
```
|
|
535
538
|
|
|
536
|
-
`AiToolCallModel.output` 保持 `unknown`;`renderAiToolCall` 内部用 `
|
|
539
|
+
`AiToolCallModel.output` 保持 `unknown`;`renderAiToolCall` 内部用 `normalizeContentParts` 归一探测——数组部件渲染媒体/链接,其余保持 JSON `<pre>`(**MCP 回执的多模态呈现零改动打通**)。
|
|
537
540
|
|
|
538
541
|
### 10.4 估算器
|
|
539
542
|
|
|
@@ -628,7 +631,7 @@ registerAiTool(def) / unregisterAiTool(name) / getAiTool(name) / listAiTools()
|
|
|
628
631
|
|
|
629
632
|
```ts
|
|
630
633
|
createAiToolArea(el, { tools?: string[]; max?: number; itemMinHeight?: number }) → AiToolArea
|
|
631
|
-
// tools 白名单支持通配 'chart-*';max 超出
|
|
634
|
+
// tools 白名单支持通配 'chart-*';max 超出 FIFO 淘汰最旧挂载(present:'data' 的工具不占挂载位、不参与淘汰)
|
|
632
635
|
// AiToolArea: { el, count, call(name, input), can(name), setTools, setMax, clear, onChange(fn) }
|
|
633
636
|
```
|
|
634
637
|
|
package/package.json
CHANGED