@icen.ai/ui 0.5.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 +262 -0
- package/README.md +52 -13
- package/dist/base.css +33 -5
- package/dist/behaviors/accordion.d.mts +7 -0
- package/dist/behaviors/accordion.mjs +37 -11
- package/dist/behaviors/ai-chat.d.mts +59 -0
- package/dist/behaviors/ai-chat.mjs +580 -0
- package/dist/behaviors/ai-composer.d.mts +137 -0
- package/dist/behaviors/ai-composer.mjs +2114 -0
- package/dist/behaviors/ai-core.d.mts +156 -0
- package/dist/behaviors/ai-core.mjs +504 -0
- package/dist/behaviors/ai-diff.d.mts +53 -0
- package/dist/behaviors/ai-diff.mjs +413 -0
- package/dist/behaviors/ai-panel.d.mts +101 -0
- package/dist/behaviors/ai-panel.mjs +1087 -0
- package/dist/behaviors/ai-provider.d.mts +198 -0
- package/dist/behaviors/ai-provider.mjs +1061 -0
- package/dist/behaviors/ai-tool.d.mts +26 -0
- package/dist/behaviors/ai-tool.mjs +2173 -0
- package/dist/behaviors/ai-tools.d.mts +84 -0
- package/dist/behaviors/ai-tools.mjs +1762 -0
- package/dist/behaviors/back-top.d.mts +20 -0
- package/dist/behaviors/back-top.mjs +64 -32
- package/dist/behaviors/carousel.d.mts +7 -0
- package/dist/behaviors/carousel.mjs +72 -27
- package/dist/behaviors/charts.d.mts +296 -0
- package/dist/behaviors/charts.mjs +1364 -440
- package/dist/behaviors/command-palette.d.mts +42 -0
- package/dist/behaviors/command-palette.mjs +167 -27
- package/dist/behaviors/context-menu.d.mts +53 -0
- package/dist/behaviors/context-menu.mjs +127 -39
- package/dist/behaviors/controls.d.mts +59 -0
- package/dist/behaviors/controls.mjs +601 -0
- package/dist/behaviors/copy.d.mts +7 -0
- package/dist/behaviors/copy.mjs +41 -15
- package/dist/behaviors/datatable.d.mts +90 -0
- package/dist/behaviors/datatable.mjs +279 -53
- package/dist/behaviors/date-picker.d.mts +4 -0
- package/dist/behaviors/date-picker.mjs +276 -69
- package/dist/behaviors/dropdown.d.mts +8 -0
- package/dist/behaviors/dropdown.mjs +171 -28
- package/dist/behaviors/events.d.mts +330 -0
- package/dist/behaviors/events.mjs +208 -0
- package/dist/behaviors/input.d.mts +4 -0
- package/dist/behaviors/input.mjs +52 -32
- package/dist/behaviors/modal.d.mts +30 -0
- package/dist/behaviors/modal.mjs +87 -16
- package/dist/behaviors/nav.d.mts +7 -0
- package/dist/behaviors/nav.mjs +57 -15
- package/dist/behaviors/notification.d.mts +188 -0
- package/dist/behaviors/notification.mjs +274 -140
- package/dist/behaviors/popover.d.mts +82 -0
- package/dist/behaviors/popover.mjs +92 -5
- package/dist/behaviors/select.d.mts +6 -0
- package/dist/behaviors/select.mjs +287 -45
- package/dist/behaviors/sidebar.d.mts +7 -0
- package/dist/behaviors/sidebar.mjs +44 -13
- package/dist/behaviors/slider.d.mts +7 -0
- package/dist/behaviors/slider.mjs +55 -43
- package/dist/behaviors/split-pane.d.mts +8 -0
- package/dist/behaviors/split-pane.mjs +70 -29
- package/dist/behaviors/tabs.d.mts +9 -0
- package/dist/behaviors/tabs.mjs +102 -26
- package/dist/behaviors/tag-input.d.mts +7 -0
- package/dist/behaviors/tag-input.mjs +66 -17
- package/dist/behaviors/theme.d.mts +36 -0
- package/dist/behaviors/theme.mjs +51 -5
- package/dist/behaviors/toast.d.mts +48 -0
- package/dist/behaviors/toast.mjs +98 -25
- package/dist/behaviors/tree.d.mts +7 -0
- package/dist/behaviors/tree.mjs +39 -15
- package/dist/behaviors/upload.d.mts +4 -0
- package/dist/behaviors/upload.mjs +79 -44
- package/dist/cli.mjs +1 -1
- package/dist/components/ai-chat.css +1037 -0
- package/dist/components/ai-chat.mjs +3 -0
- package/dist/components/ai-composer.mjs +3 -0
- package/dist/components/ai-context.mjs +2 -0
- package/dist/components/ai-diff.css +311 -0
- package/dist/components/ai-diff.mjs +3 -0
- package/dist/components/ai-files.mjs +3 -0
- package/dist/components/ai-message.mjs +3 -0
- package/dist/components/ai-panel.css +682 -0
- package/dist/components/ai-reasoning.mjs +3 -0
- package/dist/components/ai-subagent.mjs +2 -0
- package/dist/components/ai-todo.mjs +2 -0
- package/dist/components/ai-tool-call.mjs +2 -0
- package/dist/components/ai-tool.css +532 -0
- package/dist/components/ai-usage.mjs +3 -0
- package/dist/components/badge.css +5 -9
- package/dist/components/breadcrumb.css +0 -36
- package/dist/components/btn.css +4 -7
- package/dist/components/card.css +3 -6
- package/dist/components/chart-bar.css +10 -0
- package/dist/components/chart-calendar.mjs +4 -0
- package/dist/components/chart-gauge.css +1 -1
- package/dist/components/chart-heatmap.css +40 -0
- package/dist/components/chart-pie.css +0 -6
- package/dist/components/chart-scatter.css +24 -0
- package/dist/components/chart-scatter.mjs +4 -0
- package/dist/components/charts.css +87 -2
- package/dist/components/charts.mjs +1 -0
- package/dist/components/command-palette.css +2 -2
- package/dist/components/content.css +11 -25
- package/dist/components/copy.css +8 -8
- package/dist/components/datatable.css +5 -9
- package/dist/components/date-picker.css +4 -8
- package/dist/components/empty.css +0 -4
- package/dist/components/feedback.css +10 -17
- package/dist/components/form.css +13 -14
- package/dist/components/input.css +2 -2
- package/dist/components/layout.css +36 -36
- package/dist/components/media.css +12 -8
- package/dist/components/menu.css +2 -2
- package/dist/components/modal.css +1 -1
- package/dist/components/nav.css +11 -6
- package/dist/components/notification.css +27 -28
- package/dist/components/pagination.css +4 -2
- package/dist/components/pagination.mjs +1 -0
- package/dist/components/panel.css +16 -16
- package/dist/components/pill.css +15 -15
- package/dist/components/rating.mjs +1 -0
- package/dist/components/segmented.css +14 -6
- package/dist/components/segmented.mjs +1 -0
- package/dist/components/select.css +79 -24
- package/dist/components/sidebar.css +1 -1
- package/dist/components/split-pane.css +0 -1
- package/dist/components/stat.css +14 -18
- package/dist/components/steps.css +15 -5
- package/dist/components/steps.mjs +1 -0
- package/dist/components/switch.css +11 -13
- package/dist/components/switch.mjs +1 -0
- package/dist/components/table.css +46 -47
- package/dist/components/table.mjs +1 -0
- package/dist/components/tabs.css +57 -45
- package/dist/components/tag-input.css +5 -10
- package/dist/components/toast.css +16 -13
- package/dist/components/tooltip.css +2 -2
- package/dist/components/upload.css +0 -15
- package/dist/index.d.mts +39 -0
- package/dist/index.mjs +11243 -3312
- package/dist/registry.json +147 -9
- package/dist/retro-effects.css +23 -32
- package/dist/tokens/colors.css +4 -1
- package/dist/tokens/retro-effects.css +23 -32
- package/dist/tokens/style-profiles.css +24 -2
- package/dist/tokens/typography.css +2 -0
- package/dist/tokens.css +30 -3
- package/dist/ui.css +3420 -645
- package/docs/spec/ai-native.md +662 -0
- package/package.json +15 -5
package/dist/behaviors/copy.mjs
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
// src/behaviors/events.ts
|
|
2
|
+
function emitIcen(source, type, detail) {
|
|
3
|
+
return source.dispatchEvent(
|
|
4
|
+
new CustomEvent(type, { detail, bubbles: true, composed: true, cancelable: true })
|
|
5
|
+
);
|
|
6
|
+
}
|
|
7
|
+
|
|
1
8
|
// src/behaviors/copy.ts
|
|
2
|
-
var
|
|
9
|
+
var handlers = /* @__PURE__ */ new WeakMap();
|
|
3
10
|
var flashing = /* @__PURE__ */ new WeakMap();
|
|
4
11
|
function legacyCopy(text) {
|
|
5
12
|
const ta = document.createElement("textarea");
|
|
@@ -19,14 +26,20 @@ function legacyCopy(text) {
|
|
|
19
26
|
return ok;
|
|
20
27
|
}
|
|
21
28
|
async function copyText(text) {
|
|
22
|
-
|
|
23
|
-
|
|
29
|
+
const hasApi = typeof navigator !== "undefined" && !!navigator.clipboard?.writeText;
|
|
30
|
+
if (hasApi) {
|
|
31
|
+
try {
|
|
24
32
|
await navigator.clipboard.writeText(text);
|
|
25
|
-
return true;
|
|
33
|
+
return { ok: true };
|
|
34
|
+
} catch (err) {
|
|
35
|
+
const fallbackOk = legacyCopy(text);
|
|
36
|
+
if (fallbackOk) return { ok: true };
|
|
37
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
38
|
+
return { ok: false, reason: `clipboard API \u88AB\u62D2\uFF08${reason}\uFF09\u4E14\u56DE\u9000 execCommand \u5931\u8D25` };
|
|
26
39
|
}
|
|
27
|
-
} catch {
|
|
28
40
|
}
|
|
29
|
-
|
|
41
|
+
if (legacyCopy(text)) return { ok: true };
|
|
42
|
+
return { ok: false, reason: "\u526A\u8D34\u677F\u4E0D\u53EF\u7528\uFF08\u65E0 clipboard API \u4E14 execCommand \u56DE\u9000\u5931\u8D25\uFF09" };
|
|
30
43
|
}
|
|
31
44
|
function flashDone(btn) {
|
|
32
45
|
const prev = flashing.get(btn);
|
|
@@ -34,10 +47,10 @@ function flashDone(btn) {
|
|
|
34
47
|
const iconOnly = btn.hasAttribute("data-copy-icon");
|
|
35
48
|
const original = prev ? prev.original : iconOnly ? null : btn.textContent;
|
|
36
49
|
if (!iconOnly) btn.textContent = "\u5DF2\u590D\u5236";
|
|
37
|
-
btn.classList.add("done");
|
|
50
|
+
btn.classList.add("is-done");
|
|
38
51
|
const timer = window.setTimeout(() => {
|
|
39
52
|
if (!iconOnly) btn.textContent = original;
|
|
40
|
-
btn.classList.remove("done");
|
|
53
|
+
btn.classList.remove("is-done");
|
|
41
54
|
flashing.delete(btn);
|
|
42
55
|
}, 1400);
|
|
43
56
|
flashing.set(btn, { original, timer });
|
|
@@ -48,15 +61,28 @@ function onClick(root, ev) {
|
|
|
48
61
|
const btn = target.closest(".copy-btn[data-copy]");
|
|
49
62
|
if (!btn || !root.contains(btn)) return;
|
|
50
63
|
const text = btn.getAttribute("data-copy") ?? "";
|
|
51
|
-
void copyText(text).then((
|
|
52
|
-
if (ok)
|
|
64
|
+
void copyText(text).then((outcome) => {
|
|
65
|
+
if (outcome.ok) {
|
|
66
|
+
flashDone(btn);
|
|
67
|
+
emitIcen(btn, "icen:copy-success", { text });
|
|
68
|
+
} else {
|
|
69
|
+
emitIcen(btn, "icen:copy-error", { text, reason: outcome.reason ?? "\u672A\u77E5\u9519\u8BEF" });
|
|
70
|
+
}
|
|
53
71
|
});
|
|
54
72
|
}
|
|
55
|
-
function initCopy(root
|
|
56
|
-
if (typeof document === "undefined") return
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
73
|
+
function initCopy(root) {
|
|
74
|
+
if (typeof document === "undefined") return () => {
|
|
75
|
+
};
|
|
76
|
+
const scope = root ?? document;
|
|
77
|
+
if (handlers.has(scope)) return () => {
|
|
78
|
+
};
|
|
79
|
+
const handler = (ev) => onClick(scope, ev);
|
|
80
|
+
handlers.set(scope, handler);
|
|
81
|
+
scope.addEventListener("click", handler);
|
|
82
|
+
return () => {
|
|
83
|
+
scope.removeEventListener("click", handler);
|
|
84
|
+
handlers.delete(scope);
|
|
85
|
+
};
|
|
60
86
|
}
|
|
61
87
|
export {
|
|
62
88
|
initCopy
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { ContextMenuItem } from './context-menu.js';
|
|
2
|
+
import './popover.js';
|
|
3
|
+
|
|
4
|
+
interface TableColumn<Row = Record<string, unknown>> {
|
|
5
|
+
key: string;
|
|
6
|
+
title: string;
|
|
7
|
+
/** CSS 宽度:'72px' / '120px' / '2fr';缺省 minmax(0,1fr) */
|
|
8
|
+
width?: string;
|
|
9
|
+
align?: 'left' | 'center' | 'right';
|
|
10
|
+
sortable?: boolean;
|
|
11
|
+
/** 自定义比较(默认:数字感知的 localeCompare) */
|
|
12
|
+
sortFn?: (a: Row, b: Row) => number;
|
|
13
|
+
filterable?: boolean;
|
|
14
|
+
/** 返回 Node 可嵌套任意组件;返回 string/number 走 textContent(安全) */
|
|
15
|
+
render?: (value: unknown, row: Row, rowIndex: number) => Node | string | number | null;
|
|
16
|
+
hidden?: boolean;
|
|
17
|
+
/** 冻结列(左固定,横向滚动时不跟随) */
|
|
18
|
+
frozen?: boolean;
|
|
19
|
+
}
|
|
20
|
+
interface TableOptions<Row = Record<string, unknown>> {
|
|
21
|
+
columns: TableColumn<Row>[];
|
|
22
|
+
data: Row[];
|
|
23
|
+
/** 行唯一键:字段名或函数(多选/展开跨页保持的依据),缺省用行索引 */
|
|
24
|
+
rowKey?: keyof Row | ((row: Row) => string);
|
|
25
|
+
searchable?: boolean;
|
|
26
|
+
searchPlaceholder?: string;
|
|
27
|
+
selectable?: boolean;
|
|
28
|
+
/** 分页(默认开启,pageSize 默认 10 条/页;传 false 关闭;virtual 时忽略) */
|
|
29
|
+
pagination?: boolean;
|
|
30
|
+
pageSize?: number;
|
|
31
|
+
pageSizes?: number[];
|
|
32
|
+
/** 虚拟滚动(大数据量;与 pagination 互斥,virtual 优先) */
|
|
33
|
+
virtual?: boolean;
|
|
34
|
+
/** 虚拟行高 px(默认 44)与窗口高度(默认 '420px') */
|
|
35
|
+
rowHeight?: number;
|
|
36
|
+
height?: string;
|
|
37
|
+
/** 行展开内容(虚拟模式下忽略) */
|
|
38
|
+
expandable?: (row: Row) => Node | string;
|
|
39
|
+
/** 行右键菜单(复用 context-menu;需 menu.css,kit 入口已带) */
|
|
40
|
+
contextMenu?: (row: Row) => ContextMenuItem[];
|
|
41
|
+
striped?: boolean;
|
|
42
|
+
emptyLabel?: string;
|
|
43
|
+
loading?: boolean;
|
|
44
|
+
/** 密度:normal 默认 44px 行高 / compact 紧凑 32px */
|
|
45
|
+
density?: 'normal' | 'compact';
|
|
46
|
+
/** 列宽可拖拽调整(默认 true) */
|
|
47
|
+
resizable?: boolean;
|
|
48
|
+
/** 工具栏列显隐开关(默认 false) */
|
|
49
|
+
columnVisibility?: boolean;
|
|
50
|
+
/** 导出 CSV 按钮显示在工具栏(默认 false) */
|
|
51
|
+
exportable?: boolean;
|
|
52
|
+
/** 行自定义 class(条件着色 / 状态行) */
|
|
53
|
+
rowClassName?: (row: Row, index: number) => string;
|
|
54
|
+
onSelectionChange?: (rows: Row[]) => void;
|
|
55
|
+
onRowClick?: (row: Row) => void;
|
|
56
|
+
onSortChange?: (key: string | null, dir: 'asc' | 'desc') => void;
|
|
57
|
+
/** 搜索谓词(默认跨列 String includes;自定义拼音/高亮/索引匹配) */
|
|
58
|
+
searchFn?: (query: string, row: Row) => boolean;
|
|
59
|
+
/** 服务端/受控分页:开启后翻页只派事件与回调,不再本地切片(配 totalCount + setData/setPage 喂数) */
|
|
60
|
+
remote?: boolean;
|
|
61
|
+
/** remote 模式总条数(缺省 data.length) */
|
|
62
|
+
totalCount?: number;
|
|
63
|
+
onPageChange?: (page: number, pageSize: number) => void;
|
|
64
|
+
onPageSizeChange?: (pageSize: number) => void;
|
|
65
|
+
}
|
|
66
|
+
interface TableHandle<Row = Record<string, unknown>> {
|
|
67
|
+
setData(data: Row[]): void;
|
|
68
|
+
getSelected(): Row[];
|
|
69
|
+
clearSelection(): void;
|
|
70
|
+
setSearch(query: string): void;
|
|
71
|
+
/** values=null 清除该列筛选 */
|
|
72
|
+
setFilter(key: string, values: string[] | null): void;
|
|
73
|
+
setSort(key: string | null, dir?: 'asc' | 'desc'): void;
|
|
74
|
+
/** 获取当前管线(搜索→筛选→排序)后的数据 */
|
|
75
|
+
getData(): Row[];
|
|
76
|
+
/** 导出当前管线数据为 CSV 并触发下载 */
|
|
77
|
+
exportCSV(filename?: string): void;
|
|
78
|
+
/** 显示/隐藏列 */
|
|
79
|
+
showColumn(key: string): void;
|
|
80
|
+
/** 外部驱动页码(remote 模式与服务端同步) */
|
|
81
|
+
setPage(page: number): void;
|
|
82
|
+
setPageSize(size: number): void;
|
|
83
|
+
hideColumn(key: string): void;
|
|
84
|
+
/** 数据被外部原地修改后重渲 */
|
|
85
|
+
refresh(): void;
|
|
86
|
+
destroy(): void;
|
|
87
|
+
}
|
|
88
|
+
declare function createTable<Row = Record<string, unknown>>(el: HTMLElement, opts: TableOptions<Row>): TableHandle<Row>;
|
|
89
|
+
|
|
90
|
+
export { type TableColumn, type TableHandle, type TableOptions, createTable };
|