ice-web-components 1.0.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.
Files changed (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +487 -0
  3. package/dist/index.cjs +1 -0
  4. package/dist/index.mjs +1 -0
  5. package/dist/index.umd.js +1 -0
  6. package/dist/types/components/ICEAlert.d.ts +28 -0
  7. package/dist/types/components/ICEAnchor.d.ts +69 -0
  8. package/dist/types/components/ICEAutoComplete.d.ts +71 -0
  9. package/dist/types/components/ICEAvatar.d.ts +11 -0
  10. package/dist/types/components/ICEAvatarGroup.d.ts +40 -0
  11. package/dist/types/components/ICEBackTop.d.ts +39 -0
  12. package/dist/types/components/ICEBadge.d.ts +17 -0
  13. package/dist/types/components/ICEBreadcrumb.d.ts +82 -0
  14. package/dist/types/components/ICEButton.d.ts +25 -0
  15. package/dist/types/components/ICECalendar.d.ts +84 -0
  16. package/dist/types/components/ICECard.d.ts +22 -0
  17. package/dist/types/components/ICECarousel.d.ts +86 -0
  18. package/dist/types/components/ICECascader.d.ts +84 -0
  19. package/dist/types/components/ICECheckBox.d.ts +21 -0
  20. package/dist/types/components/ICECheckboxGroup.d.ts +75 -0
  21. package/dist/types/components/ICECollapse.d.ts +49 -0
  22. package/dist/types/components/ICEColorPicker.d.ts +52 -0
  23. package/dist/types/components/ICEComment.d.ts +36 -0
  24. package/dist/types/components/ICEDatePicker.d.ts +90 -0
  25. package/dist/types/components/ICEDescriptions.d.ts +40 -0
  26. package/dist/types/components/ICEDrawer.d.ts +59 -0
  27. package/dist/types/components/ICEDropdown.d.ts +63 -0
  28. package/dist/types/components/ICEEmpty.d.ts +28 -0
  29. package/dist/types/components/ICEFloatButton.d.ts +63 -0
  30. package/dist/types/components/ICEForm.d.ts +48 -0
  31. package/dist/types/components/ICEFormItem.d.ts +65 -0
  32. package/dist/types/components/ICEGrid.d.ts +59 -0
  33. package/dist/types/components/ICEIcon.d.ts +9 -0
  34. package/dist/types/components/ICEIconTile.d.ts +53 -0
  35. package/dist/types/components/ICEImagePreview.d.ts +91 -0
  36. package/dist/types/components/ICEImageView.d.ts +62 -0
  37. package/dist/types/components/ICEInputNumber.d.ts +54 -0
  38. package/dist/types/components/ICEKanban.d.ts +85 -0
  39. package/dist/types/components/ICELabel.d.ts +28 -0
  40. package/dist/types/components/ICEList.d.ts +59 -0
  41. package/dist/types/components/ICEMenu.d.ts +48 -0
  42. package/dist/types/components/ICEModal.d.ts +73 -0
  43. package/dist/types/components/ICEPagination.d.ts +62 -0
  44. package/dist/types/components/ICEPanel.d.ts +7 -0
  45. package/dist/types/components/ICEPasswordField.d.ts +18 -0
  46. package/dist/types/components/ICEPopconfirm.d.ts +21 -0
  47. package/dist/types/components/ICEPopover.d.ts +48 -0
  48. package/dist/types/components/ICEProgressBar.d.ts +37 -0
  49. package/dist/types/components/ICERadioButton.d.ts +21 -0
  50. package/dist/types/components/ICERadioGroup.d.ts +71 -0
  51. package/dist/types/components/ICERate.d.ts +43 -0
  52. package/dist/types/components/ICEResult.d.ts +30 -0
  53. package/dist/types/components/ICEScrollPane.d.ts +72 -0
  54. package/dist/types/components/ICESegmented.d.ts +34 -0
  55. package/dist/types/components/ICESelect.d.ts +85 -0
  56. package/dist/types/components/ICESeparator.d.ts +7 -0
  57. package/dist/types/components/ICESkeleton.d.ts +29 -0
  58. package/dist/types/components/ICESlider.d.ts +63 -0
  59. package/dist/types/components/ICESpace.d.ts +51 -0
  60. package/dist/types/components/ICESpin.d.ts +33 -0
  61. package/dist/types/components/ICESplitter.d.ts +85 -0
  62. package/dist/types/components/ICEStatCard.d.ts +14 -0
  63. package/dist/types/components/ICEStatistic.d.ts +78 -0
  64. package/dist/types/components/ICESteps.d.ts +31 -0
  65. package/dist/types/components/ICESvgIcon.d.ts +9 -0
  66. package/dist/types/components/ICESwitch.d.ts +23 -0
  67. package/dist/types/components/ICETable.d.ts +250 -0
  68. package/dist/types/components/ICETabs.d.ts +17 -0
  69. package/dist/types/components/ICETag.d.ts +15 -0
  70. package/dist/types/components/ICETextArea.d.ts +8 -0
  71. package/dist/types/components/ICETextField.d.ts +80 -0
  72. package/dist/types/components/ICETileMap.d.ts +152 -0
  73. package/dist/types/components/ICETimePicker.d.ts +81 -0
  74. package/dist/types/components/ICETimeline.d.ts +33 -0
  75. package/dist/types/components/ICETooltip.d.ts +55 -0
  76. package/dist/types/components/ICETour.d.ts +97 -0
  77. package/dist/types/components/ICETransfer.d.ts +68 -0
  78. package/dist/types/components/ICETree.d.ts +107 -0
  79. package/dist/types/components/ICETreeSelect.d.ts +64 -0
  80. package/dist/types/components/ICETypography.d.ts +67 -0
  81. package/dist/types/components/ICEUpload.d.ts +75 -0
  82. package/dist/types/components/ICEVirtualList.d.ts +100 -0
  83. package/dist/types/components/ICEWatermark.d.ts +49 -0
  84. package/dist/types/components/ICEWindow.d.ts +159 -0
  85. package/dist/types/core/ICEContainer.d.ts +10 -0
  86. package/dist/types/core/ICEFocusManager.d.ts +70 -0
  87. package/dist/types/core/ICEHoverManager.d.ts +26 -0
  88. package/dist/types/core/ICEManager.d.ts +24 -0
  89. package/dist/types/core/ICEMessageManager.d.ts +80 -0
  90. package/dist/types/core/ICEOverlayManager.d.ts +92 -0
  91. package/dist/types/core/ICEPainter.d.ts +12 -0
  92. package/dist/types/core/ICEWidget.d.ts +86 -0
  93. package/dist/types/i18n/ICEI18n.d.ts +35 -0
  94. package/dist/types/index.d.ts +111 -0
  95. package/dist/types/model/ICE2048Model.d.ts +90 -0
  96. package/dist/types/model/ICEBoundedRangeModel.d.ts +20 -0
  97. package/dist/types/model/ICEButtonModel.d.ts +16 -0
  98. package/dist/types/model/ICEFormModel.d.ts +105 -0
  99. package/dist/types/model/ICEHighScoreModel.d.ts +60 -0
  100. package/dist/types/model/ICEMinesweeperModel.d.ts +102 -0
  101. package/dist/types/model/ICESelectionModel.d.ts +31 -0
  102. package/dist/types/model/ICESnakeModel.d.ts +90 -0
  103. package/dist/types/model/ICETetrisModel.d.ts +118 -0
  104. package/dist/types/model/ICEToggleModel.d.ts +14 -0
  105. package/dist/types/theme/ICEArcadeTheme.d.ts +22 -0
  106. package/dist/types/theme/ICETheme.d.ts +120 -0
  107. package/dist/types/util/ICEAccessibilityMirror.d.ts +55 -0
  108. package/dist/types/util/ICEAnimation.d.ts +71 -0
  109. package/dist/types/util/ICEDragReorder.d.ts +102 -0
  110. package/dist/types/util/ICENativeInput.d.ts +65 -0
  111. package/dist/types/util/ICEOverlayPosition.d.ts +52 -0
  112. package/dist/types/util/ICEStyle.d.ts +60 -0
  113. package/dist/types/util/ICEWorldBox.d.ts +14 -0
  114. package/package.json +56 -0
@@ -0,0 +1,8 @@
1
+ import { ICETextField } from './ICETextField';
2
+ /**
3
+ * 多行文本框:与 ICETextField 同语义(取值约定 / change 事件 / 错误态 / 焦点),
4
+ * 差别是允许换行(Enter 插入 `\n`)且默认更高。
5
+ */
6
+ export declare class ICETextArea extends ICETextField {
7
+ constructor(props?: any);
8
+ }
@@ -0,0 +1,80 @@
1
+ import { ICEWidget } from '../core/ICEWidget';
2
+ /**
3
+ * 单行文本输入:聚焦边框、错误态、表单取值约定与键盘输入;
4
+ * 子类通过覆盖 `__allowNewline()` 等钩子扩展(见 ICETextArea)。
5
+ */
6
+ export declare class ICETextField extends ICEWidget {
7
+ private textNode;
8
+ private value;
9
+ private placeholder;
10
+ private maxLength;
11
+ private __bound;
12
+ /**
13
+ * 鼠标是否正按在组件上。
14
+ *
15
+ * 为什么需要它:`mousedown` 的默认动作会(在 canvas 这种不可聚焦元素上)把焦点挪到 body,
16
+ * 于是「按下时就挂原生输入」会被紧接着的 blur 当成失焦、刚挂上就被拆掉。
17
+ * 所以鼠标路径改成**松开鼠标之后再挂**(键盘 Tab 进来时没有这个手势,照常立即挂)。
18
+ */
19
+ private __pointerDown;
20
+ /** 子类扩展点:是否允许多行(Enter 插入换行)。 */
21
+ protected allowNewline: boolean;
22
+ /** 聚焦期间挂载的原生输入替身(浏览器环境才有;见 ICENativeInput) */
23
+ private nativeInput;
24
+ constructor(props?: any);
25
+ getValue(): string;
26
+ getFormValue(): any;
27
+ setFormValue(value: any): void;
28
+ setValue(value: string): this;
29
+ getPlaceholder(): string;
30
+ setPlaceholder(placeholder: string): this;
31
+ focus(): this;
32
+ blur(): this;
33
+ /** 文本输入由控件自己的 keydown 处理(见 __onGlobalKeyDown);Enter/Space 不额外触发 click。 */
34
+ activate(): void;
35
+ protected afterAddHandler(): void;
36
+ private __bindGlobalEvents;
37
+ private __onGlobalMouseDown;
38
+ /** 松开鼠标:这时候再挂原生输入,就不会被 mousedown 的默认焦点转移打掉。 */
39
+ private __onGlobalMouseUp;
40
+ private __onGlobalKeyDown;
41
+ private __emitChange;
42
+ /**
43
+ * 挂载原生输入替身(见 `ICENativeInput`)。
44
+ *
45
+ * 只在浏览器环境挂:没有 `document`(Node / 小程序)时直接返回,输入走原来的 keydown 路径。
46
+ * 组件的包围盒在「还没渲染过」(单测)时拿不到,这里兜底成 (0,0) —— 定位不准也只影响
47
+ * 光标的落点,不影响输入本身。
48
+ */
49
+ private __mountNativeInput;
50
+ /**
51
+ * 替身失焦时的处理。
52
+ *
53
+ * DOM 层失焦**不等于**组件失焦:`mousedown` / `click` 的默认动作、focus 管理器重新聚焦、
54
+ * 浏览器的一些内部行为都可能让替身瞬间丢焦点(QA 里表现为「点了输入框,输入框却立刻丢焦点,
55
+ * 字打不进去」)。所以这里只看**组件自己**的状态:
56
+ * - 组件仍然聚焦 → 把 DOM 焦点抢回来(不是我们想失焦,是别人捣乱);
57
+ * - 组件已经失焦(例如点到了别的控件、焦点管理器清了焦点)→ 什么都不用做,
58
+ * 因为那条路径已经由 `__applyFocusState` 收起替身了。
59
+ */
60
+ private __handleNativeBlur;
61
+ private __unmountNativeInput;
62
+ /** 原生输入回写:**同值不重复触发 change**(IME 收尾时会再补一次同值事件)。 */
63
+ private __applyNativeValue;
64
+ private __isPointInside;
65
+ /** 当前显示的文本(含聚焦时的光标占位)。 */
66
+ getFieldText(): string;
67
+ /** 子类改动了显示相关状态后,重新渲染字段。 */
68
+ protected refresh(): void;
69
+ /**
70
+ * 子类扩展点:把真实值转成显示文本(密码掩码)。
71
+ * 光标仍然按真实值长度渲染在末尾。
72
+ */
73
+ protected formatDisplayValue(value: string): string;
74
+ private __normalize;
75
+ /** 基类在焦点变化后回调:同步边框与光标显示。 */
76
+ protected __applyFocusState(): void;
77
+ /** 校验失败时边框标红(错误文案由 ICEFormItem 渲染在下方)。 */
78
+ protected __applyValidateState(): void;
79
+ private __sync;
80
+ }
@@ -0,0 +1,152 @@
1
+ import { ICEWidget } from '../core/ICEWidget';
2
+ import { ICEFrameDriver } from '../util/ICEAnimation';
3
+ /**
4
+ * 格子图(tile map):**一个节点画完整块网格**。
5
+ *
6
+ * 棋盘类界面(俄罗斯方块 / 贪吃蛇 / 扫雷 / 座位图 / 热力图 / 仓库货位图)如果「一格一个
7
+ * 组件」,200 格就是 200 个节点、每次变化全量 setState —— 脏矩形再聪明也架不住节点多。
8
+ * 这个组件把整块网格收进一个组件的 `doRender()`:底板由 ICEWidget 自己画(它继承的是矩形
9
+ * 容器),格子和高亮由这里用引擎的 ctx 直接绘制。
10
+ *
11
+ * 约定:
12
+ * - `setTiles` 的长度不对**直接抛**(这是编程错误,不该静默画错图);
13
+ * - 数据没变不置 dirty —— 游戏每帧调它也不会白刷;
14
+ * - 未知调色板 key 不画(留空),所以用 `null` 表示空格最省事;
15
+ * - `pulse()` 用 tween 把透明度从 1 拉到 0,消行 / 吃到食物这种「闪一下」直接用它。
16
+ */
17
+ /** 单个格子的绘制样式。 */
18
+ export interface ICETileMapCellStyle {
19
+ fillStyle: string;
20
+ strokeStyle?: string;
21
+ lineWidth?: number;
22
+ radius?: number;
23
+ /** 有标签时用来画格子里的数字 / 文字(不填就用组件默认值) */
24
+ fontSize?: number;
25
+ fontWeight?: string;
26
+ fontFamily?: string;
27
+ textColor?: string;
28
+ }
29
+ /** 调色板:key → 样式。 */
30
+ export declare type ICETileMapPalette = Record<string, ICETileMapCellStyle>;
31
+ /** 常驻高亮(描边层,比如幽灵落点)。 */
32
+ export interface ICETileMapHighlight {
33
+ row: number;
34
+ col: number;
35
+ fillStyle?: string;
36
+ strokeStyle?: string;
37
+ lineWidth?: number;
38
+ radius?: number;
39
+ }
40
+ /** 瞬时脉冲(填充层,跟随 tween 淡出)。 */
41
+ export interface ICETileMapPulse {
42
+ row: number;
43
+ col: number;
44
+ /** 覆盖脉冲颜色(默认取 `pulseColor` 选项) */
45
+ color?: string;
46
+ }
47
+ export interface ICETileMapOptions {
48
+ id?: string;
49
+ left?: number;
50
+ top?: number;
51
+ rows: number;
52
+ cols: number;
53
+ /** 每格边长(含间隙),默认 20 */
54
+ cellSize?: number;
55
+ /** 格子之间的间隙,默认 2(均分在格子两边) */
56
+ gap?: number;
57
+ /** 格子圆角默认值,默认 4 */
58
+ cellRadius?: number;
59
+ /** 整块棋盘的宽高(默认 cols*cellSize / rows*cellSize;给大了就留白,便于居中摆放) */
60
+ width?: number;
61
+ height?: number;
62
+ palette?: ICETileMapPalette;
63
+ /** 脉冲默认颜色 */
64
+ pulseColor?: string;
65
+ /** 高亮默认描边色 */
66
+ highlightColor?: string;
67
+ /** 标签默认字号 / 颜色(格子样式里可以逐项覆盖) */
68
+ labelFontSize?: number;
69
+ labelColor?: string;
70
+ [key: string]: any;
71
+ }
72
+ export declare class ICETileMap extends ICEWidget {
73
+ private rows;
74
+ private cols;
75
+ private cellSize;
76
+ private gap;
77
+ private cellRadius;
78
+ private palette;
79
+ private tiles;
80
+ /** 标签层:和 tiles 一一对应的文字(2048 的数字、扫雷的雷数都靠它) */
81
+ private labels;
82
+ /** 数据签名:用来跳过「值没变」的重复设置 */
83
+ private tileKey;
84
+ private labelKey;
85
+ private highlights;
86
+ private pulses;
87
+ private pulseAlpha;
88
+ private pulseHandle;
89
+ private pulseColor;
90
+ private highlightColor;
91
+ private labelFontSize;
92
+ private labelColor;
93
+ /** 自绘流程执行次数(浏览器里由 render() 驱动;单测可直接调 paintBoard()) */
94
+ private paintCount;
95
+ constructor(props: ICETileMapOptions);
96
+ getRows(): number;
97
+ getCols(): number;
98
+ getCellSize(): number;
99
+ getGap(): number;
100
+ /** 格子在组件内的矩形(gap 均分在两边)。 */
101
+ getCellRect(row: number, col: number): {
102
+ left: number;
103
+ top: number;
104
+ width: number;
105
+ height: number;
106
+ };
107
+ /** 组件内坐标 → 格子(边界外返回 null;落在间隙里算最近的格子)。 */
108
+ getCellAt(x: number, y: number): {
109
+ row: number;
110
+ col: number;
111
+ } | null;
112
+ /** 设置格子数据:一维(长度 = rows*cols)或二维(rows 行);数字会被当成字符串 key。 */
113
+ setTiles(tiles: Array<string | number | null> | Array<Array<string | number | null>>): this;
114
+ getTiles(): Array<string | null>;
115
+ /** 设置标签层(和 tiles 一样长度,值可以是任意字符串)。 */
116
+ setLabels(labels: Array<string | number | null> | Array<Array<string | number | null>>): this;
117
+ getLabels(): Array<string | null>;
118
+ setPalette(palette: ICETileMapPalette): this;
119
+ /** 调色板拷贝(改返回值不会影响组件内部)。 */
120
+ getPalette(): ICETileMapPalette;
121
+ /** 某个 key 对应的样式(未知 key 返回 null = 不绘制)。 */
122
+ resolveCellStyle(key: string | null): ICETileMapCellStyle | null;
123
+ setHighlights(highlights: ICETileMapHighlight[]): this;
124
+ getHighlights(): ICETileMapHighlight[];
125
+ /** 闪一下(消行 / 吃到食物):用 tween 把 alpha 从 1 拉到 0,结束后自动清空。 */
126
+ pulse(cells: ICETileMapPulse[], options?: {
127
+ duration?: number;
128
+ color?: string;
129
+ driver?: ICEFrameDriver;
130
+ }): this;
131
+ getPulses(): ICETileMapPulse[];
132
+ getPulseAlpha(): number;
133
+ getPaintCount(): number;
134
+ /** 自绘整块网格。浏览器里由 `doRender()` 自动调用;单测可以直接调来数自绘次数。 */
135
+ paintBoard(): void;
136
+ protected doRender(): void;
137
+ protected initEvents(): void;
138
+ /**
139
+ * 请求重画。
140
+ *
141
+ * 只置组件自己的 `dirty` 是**不够的**:引擎的渲染循环看的是 `ice.dirty`
142
+ * (`CanvasRenderer.frameEvtHandler` 里 `if (this.ice.dirty)` 才排队),组件的 `dirty`
143
+ * 只决定「这一趟要不要重画我」。自绘动画(比如 `pulse` 的 tween 每帧回调)如果只置自己的
144
+ * dirty,画面根本不会逐帧更新 —— 表现为白色脉冲**卡在格子上不动**,直到下一次别的原因触发重绘。
145
+ */
146
+ private requestPaint;
147
+ private __normalize;
148
+ /** 把标签居中画在格子里(字体 / 颜色优先取格子样式,其次取组件默认)。 */
149
+ private __drawLabel;
150
+ private __drawRect;
151
+ private __cellFromEvent;
152
+ }
@@ -0,0 +1,81 @@
1
+ import { ICEPanel } from './ICEPanel';
2
+ import { ICEWidget } from '../core/ICEWidget';
3
+ import { ICEScrollPane } from './ICEScrollPane';
4
+ import { ICEOverlayManager } from '../core/ICEOverlayManager';
5
+ /**
6
+ * 时间选择器(Ant TimePicker 的最小版)。
7
+ *
8
+ * - 字段区显示所选时间,未选显示 placeholder,错误态边框标红;
9
+ * - 浮层是「时/分/秒」三列(`format: 'HH:mm'` 时只有两列),列内用 `ICEScrollPane` 滚动,
10
+ * 打开时自动滚到当前取值;
11
+ * - 取值受步进控制(`hourStep` / `minuteStep` / `secondStep`);
12
+ * - 点某个取值 → 只改该单位 → 回写值 + 关闭 + `onChange`(与 `ICEDatePicker` 的交互一致);
13
+ * - 关闭策略与 Select 系列一致:浮层 closeOnOutsideClick:false,由组件自己判断点外 + Esc。
14
+ */
15
+ export declare type ICETimeUnit = 'hour' | 'minute' | 'second';
16
+ export declare type ICETimePickerFormat = 'HH:mm:ss' | 'HH:mm';
17
+ export declare type ICETimePickerPlacement = 'bottomLeft' | 'bottomRight';
18
+ export interface ICETimePickerOptions {
19
+ /** 组件 id(引擎会用它做唯一标识,e2e/调试时可按 id 定位) */
20
+ id?: string;
21
+ value?: string;
22
+ placeholder?: string;
23
+ disabled?: boolean;
24
+ /** 值格式:HH:mm:ss(默认)或 HH:mm */
25
+ format?: ICETimePickerFormat;
26
+ hourStep?: number;
27
+ minuteStep?: number;
28
+ secondStep?: number;
29
+ left?: number;
30
+ top?: number;
31
+ width?: number;
32
+ height?: number;
33
+ placement?: ICETimePickerPlacement;
34
+ onChange?: (value: string) => void;
35
+ manager?: ICEOverlayManager;
36
+ }
37
+ export declare class ICETimePicker extends ICEWidget {
38
+ private value?;
39
+ private placeholder;
40
+ private disabled;
41
+ private format;
42
+ private steps;
43
+ private placement;
44
+ private manager;
45
+ private onChangeCallback;
46
+ private handle;
47
+ private panel;
48
+ private fieldLabel;
49
+ private columnNodes;
50
+ private optionNodes;
51
+ private running;
52
+ constructor(props?: ICETimePickerOptions);
53
+ protected afterAddHandler(): void;
54
+ getValue(): string | undefined;
55
+ setValue(value: string | null | undefined): this;
56
+ getFormValue(): any;
57
+ setFormValue(value: any): void;
58
+ getUnits(): ICETimeUnit[];
59
+ /** 某一列的候选取值(补零字符串,受对应 step 控制)。 */
60
+ getColumnValues(unit: ICETimeUnit): string[];
61
+ getFieldLabel(): string;
62
+ isOpen(): boolean;
63
+ getPanel(): ICEPanel | null;
64
+ getColumnNode(unit: ICETimeUnit): ICEScrollPane | null;
65
+ getOptionNode(unit: ICETimeUnit, value: string): ICEWidget | null;
66
+ activate(): void;
67
+ toggle(): this;
68
+ open(): this;
69
+ close(): this;
70
+ protected __applyValidateState(): void;
71
+ /** 解析当前值(未选/非法时全部按 0 起算)。 */
72
+ private __parse;
73
+ private __format;
74
+ private __pick;
75
+ private __onClick;
76
+ private __onKeyDown;
77
+ private __onGlobalMouseDown;
78
+ private __worldBox;
79
+ private __syncField;
80
+ private __renderPanel;
81
+ }
@@ -0,0 +1,33 @@
1
+ import { ICEWidget } from '../core/ICEWidget';
2
+ /**
3
+ * 时间线(Ant Timeline):竖线 + 节点圆点 + 标题/描述/时间。
4
+ */
5
+ export interface ICETimelineItem {
6
+ title: string;
7
+ description?: string;
8
+ time?: string;
9
+ color?: string;
10
+ }
11
+ export interface ICETimelineOptions {
12
+ /** 组件 id(引擎会用它做唯一标识,e2e/调试时可按 id 定位) */
13
+ id?: string;
14
+ items: ICETimelineItem[];
15
+ left?: number;
16
+ top?: number;
17
+ width?: number;
18
+ itemHeight?: number;
19
+ }
20
+ export declare class ICETimeline extends ICEWidget {
21
+ private items;
22
+ private itemHeight;
23
+ private itemNodes;
24
+ private dots;
25
+ constructor(props: ICETimelineOptions);
26
+ getItemNodes(): ICEWidget[];
27
+ getDotColor(index: number): string;
28
+ /** 替换数据并重排(内容随选中项变化时用)。 */
29
+ setItems(items: ICETimelineItem[]): this;
30
+ /** 宽度变化时重排(理由同 ICEDescriptions:引擎只回调 __afterStateMerge)。 */
31
+ protected __afterStateMerge(sizeChanged: boolean): void;
32
+ private __render;
33
+ }
@@ -0,0 +1,55 @@
1
+ import { ICEOverlayManager } from '../core/ICEOverlayManager';
2
+ import type { ICEOverlayPlacement } from '../util/ICEOverlayPosition';
3
+ /** tooltip 文本字号与左右内边距(面板宽度按它估算) */
4
+ export declare const ICE_TOOLTIP_FONT_SIZE = 12;
5
+ export declare const ICE_TOOLTIP_PADDING_X = 8;
6
+ /** 气泡面板宽度:按文字估算(中文 1em、拉丁 0.6em),避免长中文被压出色块外面。 */
7
+ export declare function tooltipPanelWidth(title: string): number;
8
+ /**
9
+ * 工具提示:鼠标悬停在目标组件上、延时后弹出的小浮层。
10
+ *
11
+ * - 悬停检测复用 `ICEWidget` 的 hover 状态(ICEHoverManager 命中后调 `setHovered`,
12
+ * 本组件监听目标的 `hoverchange` 事件);
13
+ * - 弹出/关闭都有延时(Ant 的 mouseEnterDelay / mouseLeaveDelay 语义),进入延时期内离开则不弹;
14
+ * - 浮层定位、点外关闭、z 序全部交给 `ICEOverlayManager`(工具层,恒在组件之上);
15
+ * - 浮层关闭时内容会被销毁,所以内容每次弹出都新建(`title` 字符串自动包成小面板,
16
+ * 或用 `content: () => component` 自定义)。
17
+ */
18
+ export interface ICETooltipOptions {
19
+ /** 文本内容(自动包成深色小气泡) */
20
+ title?: string;
21
+ /** 自定义内容工厂:每次弹出调用一次 */
22
+ content?: () => any;
23
+ placement?: ICEOverlayPlacement;
24
+ /** 与目标的间距(默认 8) */
25
+ offset?: number;
26
+ mouseEnterDelay?: number;
27
+ mouseLeaveDelay?: number;
28
+ enterAnimation?: 'none' | 'fade' | 'scale';
29
+ /** 复用外部浮层管理器(测试注入) */
30
+ manager?: ICEOverlayManager;
31
+ }
32
+ export declare class ICETooltip {
33
+ private ice;
34
+ private target;
35
+ private options;
36
+ private manager;
37
+ private handle;
38
+ private enterTimer;
39
+ private leaveTimer;
40
+ private running;
41
+ constructor(ice: any, target: any, options?: ICETooltipOptions);
42
+ /** 绑定目标的 hover 事件(幂等)。 */
43
+ start(): this;
44
+ destroy(): this;
45
+ isOpen(): boolean;
46
+ /** 立即弹出(不走进入延时)。 */
47
+ show(): this;
48
+ /** 立即关闭。 */
49
+ hide(): this;
50
+ private __onHoverChange;
51
+ private __createContent;
52
+ private __clearTimers;
53
+ }
54
+ /** 便捷绑定:`attachTooltip(ice, target, options)`。 */
55
+ export declare function attachTooltip(ice: any, target: any, options?: ICETooltipOptions): ICETooltip;
@@ -0,0 +1,97 @@
1
+ import { ICEButton } from './ICEButton';
2
+ import { ICEPanel } from './ICEPanel';
3
+ import { ICEWidget } from '../core/ICEWidget';
4
+ import { ICEOverlayManager } from '../core/ICEOverlayManager';
5
+ import { ICEFocusManager } from '../core/ICEFocusManager';
6
+ /**
7
+ * 漫游式引导(Ant Tour):一步一步把用户带过关键界面。
8
+ *
9
+ * - 每一步有目标组件 + 标题 + 描述;目标被一圈主色边框框住,四周用遮罩压暗;
10
+ * - 面板显示「当前/总数」,带「上一步 / 下一步(最后一步为完成)/ 跳过」;
11
+ * - 键盘:→/Enter 下一步、← 上一步、Esc 跳过;
12
+ * - 关闭途径:完成(`finish()`,回调 `onFinish`)、跳过、Esc、`close()`。
13
+ */
14
+ export interface ICETourStep {
15
+ target: any;
16
+ title: string;
17
+ description?: string;
18
+ /** 面板相对目标的位置,默认 bottom */
19
+ placement?: 'top' | 'bottom' | 'left' | 'right';
20
+ }
21
+ export interface ICETourOptions {
22
+ steps: ICETourStep[];
23
+ /** 初始步骤,默认 0 */
24
+ current?: number;
25
+ /** 面板宽度,默认 260 */
26
+ panelWidth?: number;
27
+ onNext?: (index: number) => void;
28
+ onPrev?: (index: number) => void;
29
+ onChange?: (index: number) => void;
30
+ onFinish?: () => void;
31
+ onClose?: (reason: 'skip' | 'esc' | 'api') => void;
32
+ manager?: ICEOverlayManager;
33
+ focusManager?: ICEFocusManager;
34
+ }
35
+ declare type ICETourCloseReason = 'skip' | 'esc' | 'api';
36
+ export declare class ICETour {
37
+ private ice;
38
+ private options;
39
+ private manager;
40
+ private focus;
41
+ private handle;
42
+ private mask;
43
+ private highlight;
44
+ private panel;
45
+ private titleNode;
46
+ private descriptionNode;
47
+ private counterNode;
48
+ private prevButton;
49
+ private nextButton;
50
+ private skipButton;
51
+ private steps;
52
+ private current;
53
+ private finished;
54
+ private bound;
55
+ private pendingReason;
56
+ constructor(ice: any, options: ICETourOptions);
57
+ isOpen(): boolean;
58
+ isFinished(): boolean;
59
+ getCurrent(): number;
60
+ getCurrentStep(): ICETourStep | null;
61
+ getSteps(): ICETourStep[];
62
+ getPanel(): ICEPanel | null;
63
+ getMask(): ICEWidget | null;
64
+ getHighlightNode(): ICEWidget | null;
65
+ getTitleText(): string;
66
+ getDescriptionText(): string;
67
+ getCounterText(): string;
68
+ getNextButton(): ICEButton | null;
69
+ getPrevButton(): ICEButton | null;
70
+ getSkipButton(): ICEButton | null;
71
+ /** 当前高亮框(世界坐标)。 */
72
+ getHighlightBox(): {
73
+ left: number;
74
+ top: number;
75
+ width: number;
76
+ height: number;
77
+ } | null;
78
+ setSteps(steps: ICETourStep[]): this;
79
+ open(index?: number): this;
80
+ close(reason?: ICETourCloseReason): this;
81
+ next(): this;
82
+ prev(): this;
83
+ /** 完成引导(最后一步的「下一步」/ 外部主动调用)。 */
84
+ finish(): this;
85
+ skip(): this;
86
+ private __goTo;
87
+ /** 重画当前步骤:聚光孔 + 高亮边框 + 引导面板。 */
88
+ private __renderStep;
89
+ /** 面板默认放在目标下方;下方放不下就翻到上方。 */
90
+ private __resolvePlacement;
91
+ private __bindKeyboard;
92
+ private __unbindKeyboard;
93
+ private __onKeyDown;
94
+ private __handleClosed;
95
+ private __visibleRect;
96
+ }
97
+ export {};
@@ -0,0 +1,68 @@
1
+ import { ICEWidget } from '../core/ICEWidget';
2
+ /**
3
+ * 穿梭框(Ant Transfer 的最小版)。
4
+ *
5
+ * - 按 `targetKeys` 把 `dataSource` 分成「源 / 目标」两栏,栏内各自可滚动;
6
+ * - 点行切换勾选;中间按钮把勾选项整体右移 / 左移,移动后清空勾选并回调;
7
+ * - 没有勾选(或只有被移动方向的非法项)时按钮不可用;
8
+ * - `disabled` 的行不能勾选、不会被移动;值 = `targetKeys`(字符串数组,可直接进表单)。
9
+ */
10
+ export interface ICETransferItem {
11
+ key: string;
12
+ title: string;
13
+ description?: string;
14
+ disabled?: boolean;
15
+ }
16
+ export declare type ICETransferDirection = 'left' | 'right';
17
+ export interface ICETransferOptions {
18
+ /** 组件 id(引擎会用它做唯一标识,e2e/调试时可按 id 定位) */
19
+ id?: string;
20
+ dataSource: ICETransferItem[];
21
+ targetKeys?: string[];
22
+ titles?: [string, string];
23
+ left?: number;
24
+ top?: number;
25
+ width?: number;
26
+ height?: number;
27
+ rowHeight?: number;
28
+ onChange?: (targetKeys: string[], direction: ICETransferDirection, moveKeys: string[]) => void;
29
+ }
30
+ export declare class ICETransfer extends ICEWidget {
31
+ private dataSource;
32
+ private targetKeys;
33
+ private titles;
34
+ private rowHeight;
35
+ private onChangeCallback;
36
+ private checked;
37
+ private sourceRows;
38
+ private targetRows;
39
+ private moveRightButton;
40
+ private moveLeftButton;
41
+ constructor(props: ICETransferOptions);
42
+ getSourceKeys(): string[];
43
+ getTargetKeys(): string[];
44
+ setTargetKeys(keys: string[]): this;
45
+ getFormValue(): any;
46
+ setFormValue(value: any): void;
47
+ getCheckedKeys(): string[];
48
+ isChecked(key: string): boolean;
49
+ getSourceNode(key: string): ICEWidget | null;
50
+ getTargetNode(key: string): ICEWidget | null;
51
+ getMoveRightButton(): ICEWidget | null;
52
+ getMoveLeftButton(): ICEWidget | null;
53
+ isMoveRightEnabled(): boolean;
54
+ isMoveLeftEnabled(): boolean;
55
+ moveRight(): void;
56
+ moveLeft(): void;
57
+ activate(): void;
58
+ protected __applyValidateState(): void;
59
+ private __emit;
60
+ /** 只保留 dataSource 里真实存在、且未禁用的 key,去重并保持传入顺序。 */
61
+ private __sanitize;
62
+ private __movable;
63
+ private __toggleCheck;
64
+ private __render;
65
+ private __renderPanel;
66
+ private __renderRow;
67
+ private __renderMoveButton;
68
+ }
@@ -0,0 +1,107 @@
1
+ import { ICEWidget } from '../core/ICEWidget';
2
+ import { ICEScrollPane } from './ICEScrollPane';
3
+ import { ICESelectionMode } from '../model/ICESelectionModel';
4
+ /**
5
+ * 树(Swing JTree / Ant Tree 的最小可用版)。
6
+ *
7
+ * - 可见行 = 深度优先遍历、只展开 expandedKeys 里的节点;
8
+ * - 每层缩进 16px,有子节点的行显示 ▸ / ▾(点箭头只切换展开,不改选择);
9
+ * - 选择走 `ICESelectionModel`(single / multiple);
10
+ * - 键盘:↑/↓ 移动激活行、→ 展开(已展开则进入首个子节点)、← 折叠(叶子则回父节点)、
11
+ * Enter/Space 选中;
12
+ * - 内容超出可视高度时自动套 `ICEScrollPane`。
13
+ */
14
+ export interface ICETreeNode {
15
+ key: string;
16
+ label: string;
17
+ children?: ICETreeNode[];
18
+ disabled?: boolean;
19
+ }
20
+ export interface ICETreeOptions {
21
+ /** 组件 id(引擎会用它做唯一标识,e2e/调试时可按 id 定位) */
22
+ id?: string;
23
+ nodes: ICETreeNode[];
24
+ mode?: ICESelectionMode;
25
+ value?: string[];
26
+ expandedKeys?: string[];
27
+ defaultExpandAll?: boolean;
28
+ left?: number;
29
+ top?: number;
30
+ width?: number;
31
+ height?: number;
32
+ itemHeight?: number;
33
+ indent?: number;
34
+ onSelect?: (keys: string[], node?: ICETreeNode) => void;
35
+ onExpand?: (expandedKeys: string[]) => void;
36
+ /** 开启节点拖拽(按住行拖:上 1/3 插前面、中 1/3 放进去、下 1/3 插后面) */
37
+ draggable?: boolean;
38
+ /** 拖拽落下后的回调(与 `nodedrop` 事件同义) */
39
+ onDrop?: (info: {
40
+ key: string;
41
+ targetKey: string;
42
+ position: string;
43
+ nodes: ICETreeNode[];
44
+ }) => void;
45
+ }
46
+ export declare class ICETree extends ICEWidget {
47
+ private nodes;
48
+ private model;
49
+ private expanded;
50
+ private itemHeight;
51
+ private indent;
52
+ private onSelect;
53
+ private onExpand;
54
+ private pane;
55
+ /** 节点拖拽:按行拖,三分法决定 before / inside / after */
56
+ private draggable;
57
+ private dragState;
58
+ private onDrop;
59
+ private content;
60
+ private rows;
61
+ private rowNodes;
62
+ private activeKey;
63
+ private running;
64
+ constructor(props: ICETreeOptions);
65
+ protected afterAddHandler(): void;
66
+ getExpandedKeys(): string[];
67
+ setExpandedKeys(keys: string[]): this;
68
+ expandAll(): this;
69
+ collapseAll(): this;
70
+ getSelectedKeys(): string[];
71
+ setSelectedKeys(keys: string[]): this;
72
+ getActiveKey(): string | null;
73
+ getRowNode(key: string): ICEWidget | null;
74
+ getVisibleNodes(): ICETreeNode[];
75
+ /** 行所在层级(0 = 根层;缩进 = depth × indent)。 */
76
+ getRowDepth(key: string): number;
77
+ getScrollPane(): ICEScrollPane | null;
78
+ /** 键盘:只有焦点在树上时生效。 */
79
+ isDraggable(): boolean;
80
+ isDragging(): boolean;
81
+ getDropTarget(): {
82
+ index: number;
83
+ position: 'before' | 'inside' | 'after';
84
+ } | null;
85
+ /**
86
+ * 把 `dragKey` 移到 `targetKey` 的 before / inside / after。
87
+ *
88
+ * 生效后重排整棵树并抛 `nodedrop`(带新树)。返回是否真的动了 ——
89
+ * 拖进自己的后代、未知 key、位置没变都返回 false(判定逻辑在纯函数 `moveTreeNode` 里)。
90
+ */
91
+ moveNode(dragKey: string, targetKey: string, position: 'before' | 'inside' | 'after'): boolean;
92
+ /** 指针落在第几行(把滚动偏移加回来)。 */
93
+ private __rowIndexAt;
94
+ private __onGlobalMouseDown;
95
+ private __onGlobalMouseMove;
96
+ private __onGlobalMouseUp;
97
+ private __updateDrag;
98
+ private __onKeyDown;
99
+ private __activeIndex;
100
+ private __toggleExpand;
101
+ private __pick;
102
+ /** 可见行 = 深度优先、只展开 expanded 内的分支。 */
103
+ private __flatten;
104
+ private __collectExpandableKeys;
105
+ private __render;
106
+ private __syncRows;
107
+ }