@ticatec/uniface-element 0.2.3 → 0.3.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 (178) hide show
  1. package/dist/accordion/README.md +169 -0
  2. package/dist/accordion/README_CN.md +176 -0
  3. package/dist/action-bar/README.md +275 -0
  4. package/dist/action-bar/README_CN.md +285 -0
  5. package/dist/app-layout/README.md +374 -0
  6. package/dist/app-layout/README_CN.md +381 -0
  7. package/dist/app-top-bar/README.md +357 -0
  8. package/dist/app-top-bar/README_CN.md +365 -0
  9. package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
  10. package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
  11. package/dist/base-calendar/CalendarBase.svelte +0 -3
  12. package/dist/box/README.md +385 -0
  13. package/dist/box/README_CN.md +393 -0
  14. package/dist/breadcrumbs/README.md +442 -0
  15. package/dist/breadcrumbs/README_CN.md +442 -0
  16. package/dist/button/Button.svelte +27 -7
  17. package/dist/button/Button.svelte.d.ts +3 -1
  18. package/dist/button/IconButton.svelte +26 -6
  19. package/dist/button/IconButton.svelte.d.ts +3 -1
  20. package/dist/button/IconButton_README.md +513 -0
  21. package/dist/button/IconButton_README_CN.md +513 -0
  22. package/dist/button/README.md +428 -0
  23. package/dist/button/README_CN.md +428 -0
  24. package/dist/button/TextButton.svelte +26 -6
  25. package/dist/button/TextButton.svelte.d.ts +3 -1
  26. package/dist/button/TextButton_README.md +571 -0
  27. package/dist/button/TextButton_README_CN.md +571 -0
  28. package/dist/card/README.md +666 -0
  29. package/dist/card/README_CN.md +666 -0
  30. package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
  31. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
  32. package/dist/cascade-options-select/README.md +663 -2
  33. package/dist/cascade-options-select/README_CN.md +664 -0
  34. package/dist/checkbox/CheckBox.svelte +20 -6
  35. package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
  36. package/dist/checkbox/README.md +562 -0
  37. package/dist/checkbox/README_CN.md +727 -0
  38. package/dist/common-editor/NumberInput.svelte +39 -26
  39. package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
  40. package/dist/concise-data-table/ConciseListTable.svelte +133 -36
  41. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
  42. package/dist/concise-data-table/DataCell.svelte +5 -6
  43. package/dist/concise-data-table/DataRow.svelte +22 -2
  44. package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
  45. package/dist/concise-data-table/README.md +606 -0
  46. package/dist/concise-data-table/README_CN.md +611 -0
  47. package/dist/context-menu/ContextMenu.svelte +138 -21
  48. package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
  49. package/dist/context-menu/ContextMenuItem.d.ts +20 -4
  50. package/dist/context-menu/README.md +551 -0
  51. package/dist/context-menu/README_CN.md +551 -0
  52. package/dist/criteria-field/CriteriaField.svelte +3 -5
  53. package/dist/criteria-field/README.md +532 -0
  54. package/dist/criteria-field/README_CN.md +532 -0
  55. package/dist/data-table/README.md +712 -0
  56. package/dist/data-table/README_CN.md +712 -0
  57. package/dist/date-picker/DatePicker.svelte +44 -7
  58. package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
  59. package/dist/date-picker/DateTimePicker.svelte +32 -8
  60. package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
  61. package/dist/date-picker/README.md +326 -0
  62. package/dist/date-picker/README_CN.md +316 -0
  63. package/dist/date-picker/ScrollBar.svelte +18 -8
  64. package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
  65. package/dist/date-picker/TimePanel.svelte +5 -5
  66. package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
  67. package/dist/date-range/README.md +374 -0
  68. package/dist/date-range/README_CN.md +374 -0
  69. package/dist/dialog/DialogBoard.svelte +1 -1
  70. package/dist/dialog/README.md +596 -0
  71. package/dist/dialog/README_CN.md +596 -0
  72. package/dist/drawer/README.md +679 -1
  73. package/dist/drawer/README_CN.md +679 -0
  74. package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
  75. package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
  76. package/dist/group-box/group-check-box/README.md +749 -0
  77. package/dist/group-box/group-check-box/README_CN.md +750 -0
  78. package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
  79. package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
  80. package/dist/group-box/group-radio-box/README.md +920 -0
  81. package/dist/group-box/group-radio-box/README_CN.md +920 -0
  82. package/dist/image-files/README.md +1346 -0
  83. package/dist/image-files/README_CN.md +1346 -0
  84. package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
  85. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
  86. package/dist/lib/forwardAllEvents.d.ts +3 -0
  87. package/dist/lib/forwardAllEvents.js +24 -0
  88. package/dist/list-box/README.md +579 -0
  89. package/dist/list-box/README_CN.md +682 -0
  90. package/dist/lookup-editor/LookupEditor.svelte +15 -3
  91. package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
  92. package/dist/lookup-editor/README.md +684 -0
  93. package/dist/lookup-editor/README_CN.md +684 -0
  94. package/dist/memo-editor/MemoEditor.svelte +77 -27
  95. package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
  96. package/dist/memo-editor/README.md +819 -0
  97. package/dist/memo-editor/README_CN.md +819 -0
  98. package/dist/message-box/README.md +398 -0
  99. package/dist/message-box/README_CN.md +398 -0
  100. package/dist/number-editor/NumberEditor.svelte +2 -2
  101. package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
  102. package/dist/number-editor/README.md +353 -22
  103. package/dist/number-editor/README_CN.md +357 -0
  104. package/dist/number-range/README.md +443 -0
  105. package/dist/number-range/README_CN.md +443 -0
  106. package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
  107. package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
  108. package/dist/options-multi-select/README.md +480 -0
  109. package/dist/options-multi-select/README_CN.md +480 -0
  110. package/dist/options-select/OptionsSelect.svelte +36 -5
  111. package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
  112. package/dist/options-select/README.md +632 -0
  113. package/dist/options-select/README_CN.md +632 -0
  114. package/dist/page/README.md +605 -0
  115. package/dist/page/README_CN.md +605 -0
  116. package/dist/pagination/README.md +946 -0
  117. package/dist/pagination/README_CN.md +946 -0
  118. package/dist/pagination-panel/README.md +1075 -0
  119. package/dist/pagination-panel/README_CN.md +1075 -0
  120. package/dist/popup-hint/README.md +841 -0
  121. package/dist/popup-hint/README_CN.md +840 -0
  122. package/dist/progress-bar/README.md +242 -0
  123. package/dist/progress-bar/README_CN.md +242 -0
  124. package/dist/progress-step-bar/README.md +316 -0
  125. package/dist/progress-step-bar/README_CN.md +316 -0
  126. package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
  127. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
  128. package/dist/prompts-text-editor/README.md +329 -0
  129. package/dist/prompts-text-editor/README_CN.md +329 -0
  130. package/dist/property-editor/README.md +969 -0
  131. package/dist/property-editor/README_CN.md +969 -0
  132. package/dist/radio-button/README.md +372 -0
  133. package/dist/radio-button/README_CN.md +372 -0
  134. package/dist/radio-button/RadioButton.svelte +32 -3
  135. package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
  136. package/dist/search-box/README.md +425 -0
  137. package/dist/search-box/README_CN.md +424 -0
  138. package/dist/search-box/SearchBox.svelte +22 -6
  139. package/dist/search-box/SearchBox.svelte.d.ts +4 -1
  140. package/dist/tabs/README.md +919 -0
  141. package/dist/tabs/README_CN.md +920 -0
  142. package/dist/tag/README.md +922 -0
  143. package/dist/tag/README_CN.md +922 -0
  144. package/dist/text-editor/PasswordEditor.svelte +17 -2
  145. package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
  146. package/dist/text-editor/PasswordEditor_README.md +551 -0
  147. package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
  148. package/dist/text-editor/README.md +466 -0
  149. package/dist/text-editor/README_CN.md +466 -0
  150. package/dist/text-editor/TextEditor.svelte +51 -19
  151. package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
  152. package/dist/ticatec-uniface-web.css +1 -0
  153. package/dist/time-editor/README.md +498 -24
  154. package/dist/time-editor/README_CN.md +498 -0
  155. package/dist/time-editor/TimeEditor.svelte +7 -3
  156. package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
  157. package/dist/toast/README.md +667 -0
  158. package/dist/toast/README_CN.md +667 -0
  159. package/dist/transfer/README.md +795 -0
  160. package/dist/transfer/Transfer.svelte +6 -4
  161. package/dist/transfer/Transfer.svelte.d.ts +3 -1
  162. package/dist/tree-view/README.md +761 -0
  163. package/dist/tree-view/README_CN.md +761 -0
  164. package/dist/tree-view/TreeView.svelte +5 -3
  165. package/dist/tree-view/TreeView.svelte.d.ts +3 -1
  166. package/dist/unit-number-editor/README.md +546 -20
  167. package/dist/unit-number-editor/README_CN.md +525 -0
  168. package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
  169. package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
  170. package/docs/form-field/cn/README_CN.md +364 -0
  171. package/docs/form-field/en/README.md +364 -0
  172. package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
  173. package/docs/form-panel/flex-form/en/README.md +586 -0
  174. package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
  175. package/docs/form-panel/flex-row-form/en/README.md +787 -0
  176. package/docs/form-panel/grid-form/en/README.md +744 -0
  177. package/package.json +1 -1
  178. package/dist/drawer/README-CN.md +0 -1
@@ -0,0 +1,611 @@
1
+ # ConciseListTable 简洁数据表格组件
2
+
3
+ 一个高性能、轻量级的数据表格组件,具有自动滚动功能、自定义格式化和响应式设计。非常适合仪表板、数据展示和实时监控界面。
4
+
5
+ ## 功能特性
6
+
7
+ - **高性能**:通过最少的 DOM 操作实现高效渲染
8
+ - **自动滚动**:用于连续数据显示的无缝无限滚动
9
+ - **灵活列配置**:可配置宽度、对齐方式和自定义格式化
10
+ - **响应式设计**:使用 ResizeObserver 自动调整宽度
11
+ - **无障碍访问**:ARIA 属性和键盘导航支持
12
+ - **自定义样式**:全面的主题和样式选项
13
+ - **事件处理**:行点击事件和焦点管理
14
+ - **类型安全**:完整的 TypeScript 支持和详细接口
15
+
16
+ ## 基本用法
17
+
18
+ ```svelte
19
+ <script>
20
+ import ConciseListTable, { type Column, type TableOptions } from '@ticatec/uniface-element/ConciseListTable';
21
+
22
+ const columns: Column[] = [
23
+ { title: '姓名', field: 'name', width: 150, align: 'left' },
24
+ { title: '年龄', field: 'age', width: 80, align: 'center' },
25
+ { title: '邮箱', field: 'email', width: 200, weight: 1 }
26
+ ];
27
+
28
+ const data = [
29
+ { name: '张三', age: 30, email: 'zhang@example.com' },
30
+ { name: '李四', age: 25, email: 'li@example.com' },
31
+ { name: '王五', age: 35, email: 'wang@example.com' }
32
+ ];
33
+
34
+ const options: TableOptions = {
35
+ headerHeight: 40,
36
+ rowHeight: 35,
37
+ backgroundColor: '#ffffff',
38
+ headerBackgroundColor: '#f5f5f5'
39
+ };
40
+
41
+ const handleRowClick = (row) => {
42
+ console.log('点击行:', row);
43
+ };
44
+ </script>
45
+
46
+ <ConciseListTable
47
+ list={data}
48
+ {columns}
49
+ {options}
50
+ rowClickHandler={handleRowClick}
51
+ />
52
+ ```
53
+
54
+ ## 属性
55
+
56
+ | 属性 | 类型 | 默认值 | 描述 |
57
+ |------|------|---------|-------------|
58
+ | `list` | `Array<any>` | - | 要显示的数据对象数组 |
59
+ | `columns` | `Array<Column>` | - | 列定义配置 |
60
+ | `options` | `TableOptions` | - | 表格样式和行为选项 |
61
+ | `autoScroll` | `boolean` | `false` | 启用自动滚动 |
62
+ | `scrollInterval` | `number` | `2000` | 滚动步骤间隔毫秒数 |
63
+ | `rowClickHandler` | `RowClickHandler \| null` | `null` | 行点击事件处理器 |
64
+ | `style` | `string` | `''` | 容器的自定义 CSS 样式 |
65
+ | `className` | `string` | `''` | 附加的 CSS 类名 |
66
+ | `onfocus` | `((event: FocusEvent) => void) \| null` | `null` | 焦点事件处理器 |
67
+ | `onblur` | `((event: FocusEvent) => void) \| null` | `null` | 失焦事件处理器 |
68
+
69
+ ## 方法
70
+
71
+ | 方法 | 描述 |
72
+ |--------|-------------|
73
+ | `setFocus()` | 编程方式聚焦到第一个表格行 |
74
+
75
+ ## Column 接口
76
+
77
+ ```typescript
78
+ interface Column {
79
+ title: string; // 列标题显示文本
80
+ field: string; // 数据对象中的字段名
81
+ width: number; // 宽度(像素)
82
+ align?: "left" | "center" | "right"; // 文本对齐方式
83
+ weight?: number; // 弹性权重(0 = 固定,>0 = 比例)
84
+ formatter?: (value: any) => string; // 自定义格式化函数
85
+ escapeHTML?: boolean; // 允许单元格中的 HTML 内容
86
+ }
87
+ ```
88
+
89
+ ## TableOptions 接口
90
+
91
+ ```typescript
92
+ interface TableOptions {
93
+ backgroundColor?: string; // 表格背景色
94
+ color?: string; // 表格文字颜色
95
+ headerHeight?: number; // 标题行高度(像素)
96
+ headerBackgroundColor?: string; // 标题背景色
97
+ headerColor?: string; // 标题文字颜色
98
+ alternativeBackgroundColor?: string; // 交替行背景色
99
+ alternativeColor?: string; // 交替行文字颜色
100
+ rowHeight?: number; // 数据行高度(像素)
101
+ }
102
+ ```
103
+
104
+ ## 基础示例
105
+
106
+ ### 简单数据表格
107
+
108
+ ```svelte
109
+ <script>
110
+ import ConciseListTable from '@ticatec/uniface-element/ConciseListTable';
111
+
112
+ const employees = [
113
+ { id: 1, name: '张小明', department: '工程部', salary: 75000 },
114
+ { id: 2, name: '李小红', department: '市场部', salary: 65000 },
115
+ { id: 3, name: '王小强', department: '销售部', salary: 70000 }
116
+ ];
117
+
118
+ const columns = [
119
+ { title: 'ID', field: 'id', width: 60, align: 'center' },
120
+ { title: '姓名', field: 'name', width: 150, align: 'left' },
121
+ { title: '部门', field: 'department', width: 120, align: 'center' },
122
+ { title: '薪资', field: 'salary', width: 100, align: 'right',
123
+ formatter: (value) => `¥${value.toLocaleString()}` }
124
+ ];
125
+
126
+ const options = {
127
+ headerHeight: 40,
128
+ rowHeight: 35,
129
+ headerBackgroundColor: '#f8f9fa',
130
+ alternativeBackgroundColor: '#f8f9fa'
131
+ };
132
+ </script>
133
+
134
+ <ConciseListTable
135
+ list={employees}
136
+ {columns}
137
+ {options}
138
+ />
139
+ ```
140
+
141
+ ### 自动滚动表格
142
+
143
+ ```svelte
144
+ <script>
145
+ import ConciseListTable from '@ticatec/uniface-element/ConciseListTable';
146
+
147
+ const stockPrices = [
148
+ { symbol: 'AAPL', price: 150.25, change: '+2.15', volume: '45.2M' },
149
+ { symbol: 'GOOGL', price: 2800.50, change: '-12.30', volume: '1.8M' },
150
+ { symbol: 'MSFT', price: 305.75, change: '+1.45', volume: '28.5M' },
151
+ { symbol: 'TSLA', price: 850.20, change: '+15.60', volume: '35.1M' },
152
+ // ... 更多数据
153
+ ];
154
+
155
+ const columns = [
156
+ { title: '股票代码', field: 'symbol', width: 80, align: 'center' },
157
+ { title: '价格', field: 'price', width: 100, align: 'right',
158
+ formatter: (value) => `$${value.toFixed(2)}` },
159
+ { title: '涨跌', field: 'change', width: 80, align: 'right' },
160
+ { title: '成交量', field: 'volume', width: 100, align: 'right' }
161
+ ];
162
+
163
+ const options = {
164
+ rowHeight: 30,
165
+ headerHeight: 35,
166
+ backgroundColor: '#000',
167
+ color: '#00ff00',
168
+ headerBackgroundColor: '#333',
169
+ headerColor: '#fff'
170
+ };
171
+ </script>
172
+
173
+ <div style="height: 300px;">
174
+ <ConciseListTable
175
+ list={stockPrices}
176
+ {columns}
177
+ {options}
178
+ autoScroll={true}
179
+ scrollInterval={3000}
180
+ />
181
+ </div>
182
+ ```
183
+
184
+ ### 自定义格式化表格
185
+
186
+ ```svelte
187
+ <script>
188
+ import ConciseListTable from '@ticatec/uniface-element/ConciseListTable';
189
+
190
+ const orders = [
191
+ { id: 'ORD-001', customer: '张三', date: '2024-01-15',
192
+ amount: 299.99, status: 'shipped' },
193
+ { id: 'ORD-002', customer: '李四', date: '2024-01-16',
194
+ amount: 149.50, status: 'pending' },
195
+ { id: 'ORD-003', customer: '王五', date: '2024-01-17',
196
+ amount: 599.99, status: 'delivered' }
197
+ ];
198
+
199
+ const formatDate = (dateStr) => {
200
+ return new Date(dateStr).toLocaleDateString('zh-CN', {
201
+ year: 'numeric', month: '2-digit', day: '2-digit'
202
+ });
203
+ };
204
+
205
+ const formatStatus = (status) => {
206
+ const statusMap = {
207
+ shipped: { text: '已发货', color: '#ffc107' },
208
+ pending: { text: '待处理', color: '#6c757d' },
209
+ delivered: { text: '已送达', color: '#28a745' }
210
+ };
211
+ const { text, color } = statusMap[status];
212
+ return `<span style="color: ${color}; font-weight: bold;">${text}</span>`;
213
+ };
214
+
215
+ const columns = [
216
+ { title: '订单号', field: 'id', width: 100, align: 'left' },
217
+ { title: '客户', field: 'customer', width: 150, weight: 1 },
218
+ { title: '日期', field: 'date', width: 120, align: 'center',
219
+ formatter: formatDate },
220
+ { title: '金额', field: 'amount', width: 100, align: 'right',
221
+ formatter: (value) => `¥${value.toFixed(2)}` },
222
+ { title: '状态', field: 'status', width: 100, align: 'center',
223
+ formatter: formatStatus, escapeHTML: true }
224
+ ];
225
+
226
+ const options = {
227
+ headerHeight: 45,
228
+ rowHeight: 40,
229
+ headerBackgroundColor: '#007bff',
230
+ headerColor: '#ffffff',
231
+ alternativeBackgroundColor: '#f8f9fa'
232
+ };
233
+ </script>
234
+
235
+ <ConciseListTable
236
+ list={orders}
237
+ {columns}
238
+ {options}
239
+ />
240
+ ```
241
+
242
+ ### 响应式弹性列表格
243
+
244
+ ```svelte
245
+ <script>
246
+ import ConciseListTable from '@ticatec/uniface-element/ConciseListTable';
247
+
248
+ const products = [
249
+ { id: 1, name: '无线耳机高级版',
250
+ category: '电子产品', price: 199.99, stock: 15 },
251
+ { id: 2, name: '人体工学办公椅带腰部支撑',
252
+ category: '家具', price: 299.99, stock: 8 },
253
+ { id: 3, name: '智能家居安防摄像头系统',
254
+ category: '电子产品', price: 149.99, stock: 23 }
255
+ ];
256
+
257
+ const columns = [
258
+ { title: 'ID', field: 'id', width: 50, align: 'center' },
259
+ { title: '产品名称', field: 'name', width: 200, weight: 2 }, // 弹性
260
+ { title: '分类', field: 'category', width: 120, weight: 1 }, // 弹性
261
+ { title: '价格', field: 'price', width: 100, align: 'right',
262
+ formatter: (value) => `¥${value.toFixed(2)}` },
263
+ { title: '库存', field: 'stock', width: 80, align: 'center' }
264
+ ];
265
+
266
+ const options = {
267
+ headerHeight: 40,
268
+ rowHeight: 45,
269
+ backgroundColor: '#ffffff',
270
+ headerBackgroundColor: '#e9ecef',
271
+ alternativeBackgroundColor: '#f8f9fa'
272
+ };
273
+ </script>
274
+
275
+ <div style="width: 100%; min-width: 600px;">
276
+ <ConciseListTable
277
+ list={products}
278
+ {columns}
279
+ {options}
280
+ />
281
+ </div>
282
+ ```
283
+
284
+ ## 事件处理
285
+
286
+ ```svelte
287
+ <script>
288
+ import ConciseListTable from '@ticatec/uniface-element/ConciseListTable';
289
+
290
+ let selectedRow = null;
291
+ let focusCount = 0;
292
+ let tableRef;
293
+
294
+ const data = [
295
+ { id: 1, name: '项目 1', value: 100 },
296
+ { id: 2, name: '项目 2', value: 200 },
297
+ { id: 3, name: '项目 3', value: 300 }
298
+ ];
299
+
300
+ const columns = [
301
+ { title: 'ID', field: 'id', width: 60, align: 'center' },
302
+ { title: '名称', field: 'name', width: 150 },
303
+ { title: '数值', field: 'value', width: 100, align: 'right' }
304
+ ];
305
+
306
+ const options = {
307
+ headerHeight: 35,
308
+ rowHeight: 30
309
+ };
310
+
311
+ const handleRowClick = (row) => {
312
+ selectedRow = row;
313
+ console.log('选中行:', row);
314
+ };
315
+
316
+ const handleFocus = (event) => {
317
+ focusCount++;
318
+ console.log('表格获得焦点', focusCount);
319
+ };
320
+
321
+ const handleBlur = (event) => {
322
+ console.log('表格失去焦点');
323
+ };
324
+
325
+ const focusTable = () => {
326
+ tableRef?.setFocus();
327
+ };
328
+ </script>
329
+
330
+ <div>
331
+ <button on:click={focusTable}>聚焦表格</button>
332
+
333
+ <ConciseListTable
334
+ bind:this={tableRef}
335
+ list={data}
336
+ {columns}
337
+ {options}
338
+ rowClickHandler={handleRowClick}
339
+ onfocus={handleFocus}
340
+ onblur={handleBlur}
341
+ />
342
+
343
+ {#if selectedRow}
344
+ <div class="selected-info">
345
+ 已选中: {selectedRow.name} (ID: {selectedRow.id})
346
+ </div>
347
+ {/if}
348
+
349
+ <div class="focus-info">
350
+ 焦点次数: {focusCount}
351
+ </div>
352
+ </div>
353
+
354
+ <style>
355
+ .selected-info, .focus-info {
356
+ margin-top: 10px;
357
+ padding: 8px;
358
+ background: #e7f3ff;
359
+ border: 1px solid #b3d9ff;
360
+ border-radius: 4px;
361
+ }
362
+ </style>
363
+ ```
364
+
365
+ ## 高级示例
366
+
367
+ ### 实时数据仪表板
368
+
369
+ ```svelte
370
+ <script>
371
+ import ConciseListTable from '@ticatec/uniface-element/ConciseListTable';
372
+ import { onMount, onDestroy } from 'svelte';
373
+
374
+ let realtimeData = [];
375
+ let updateInterval;
376
+
377
+ // 模拟实时数据更新
378
+ const generateRandomData = () => {
379
+ return Array.from({ length: 20 }, (_, i) => ({
380
+ id: `SRV-${String(i + 1).padStart(3, '0')}`,
381
+ name: `服务器 ${i + 1}`,
382
+ cpu: (Math.random() * 100).toFixed(1),
383
+ memory: (Math.random() * 100).toFixed(1),
384
+ disk: (Math.random() * 100).toFixed(1),
385
+ status: Math.random() > 0.8 ? 'warning' : 'healthy',
386
+ uptime: Math.floor(Math.random() * 365) + 1
387
+ }));
388
+ };
389
+
390
+ const columns = [
391
+ { title: '服务器ID', field: 'id', width: 100, align: 'center' },
392
+ { title: '名称', field: 'name', width: 120, weight: 1 },
393
+ { title: 'CPU %', field: 'cpu', width: 80, align: 'right',
394
+ formatter: (value) => `${value}%` },
395
+ { title: '内存 %', field: 'memory', width: 80, align: 'right',
396
+ formatter: (value) => `${value}%` },
397
+ { title: '磁盘 %', field: 'disk', width: 80, align: 'right',
398
+ formatter: (value) => `${value}%` },
399
+ { title: '状态', field: 'status', width: 100, align: 'center',
400
+ formatter: (status) => {
401
+ const statusMap = {
402
+ healthy: { text: '正常', color: '#28a745' },
403
+ warning: { text: '警告', color: '#ffc107' }
404
+ };
405
+ const { text, color } = statusMap[status];
406
+ return `<span style="color: ${color}; font-weight: bold;">${text}</span>`;
407
+ },
408
+ escapeHTML: true
409
+ },
410
+ { title: '运行天数', field: 'uptime', width: 100, align: 'right' }
411
+ ];
412
+
413
+ const options = {
414
+ headerHeight: 40,
415
+ rowHeight: 35,
416
+ backgroundColor: '#1a1a1a',
417
+ color: '#ffffff',
418
+ headerBackgroundColor: '#333333',
419
+ headerColor: '#ffffff',
420
+ alternativeBackgroundColor: '#2a2a2a'
421
+ };
422
+
423
+ onMount(() => {
424
+ realtimeData = generateRandomData();
425
+
426
+ // 每5秒更新数据
427
+ updateInterval = setInterval(() => {
428
+ realtimeData = generateRandomData();
429
+ }, 5000);
430
+ });
431
+
432
+ onDestroy(() => {
433
+ if (updateInterval) {
434
+ clearInterval(updateInterval);
435
+ }
436
+ });
437
+ </script>
438
+
439
+ <div class="dashboard">
440
+ <h3>服务器监控仪表板</h3>
441
+ <div style="height: 400px; border: 1px solid #333;">
442
+ <ConciseListTable
443
+ list={realtimeData}
444
+ {columns}
445
+ {options}
446
+ autoScroll={true}
447
+ scrollInterval={4000}
448
+ />
449
+ </div>
450
+ </div>
451
+
452
+ <style>
453
+ .dashboard {
454
+ background: #1a1a1a;
455
+ color: #ffffff;
456
+ padding: 20px;
457
+ border-radius: 8px;
458
+ }
459
+
460
+ .dashboard h3 {
461
+ margin: 0 0 16px 0;
462
+ color: #ffffff;
463
+ }
464
+ </style>
465
+ ```
466
+
467
+ ### 金融交易表格
468
+
469
+ ```svelte
470
+ <script>
471
+ import ConciseListTable from '@ticatec/uniface-element/ConciseListTable';
472
+
473
+ const tradingData = [
474
+ { symbol: 'AAPL', price: 150.25, change: 2.15, changePercent: 1.45, volume: 45200000 },
475
+ { symbol: 'GOOGL', price: 2800.50, change: -12.30, changePercent: -0.44, volume: 1800000 },
476
+ { symbol: 'MSFT', price: 305.75, change: 1.45, changePercent: 0.48, volume: 28500000 },
477
+ { symbol: 'TSLA', price: 850.20, change: 15.60, changePercent: 1.87, volume: 35100000 }
478
+ ];
479
+
480
+ const formatPrice = (value) => `$${value.toFixed(2)}`;
481
+
482
+ const formatChange = (value) => {
483
+ const color = value >= 0 ? '#28a745' : '#dc3545';
484
+ const sign = value >= 0 ? '+' : '';
485
+ return `<span style="color: ${color}; font-weight: bold;">${sign}${value.toFixed(2)}</span>`;
486
+ };
487
+
488
+ const formatPercent = (value) => {
489
+ const color = value >= 0 ? '#28a745' : '#dc3545';
490
+ const sign = value >= 0 ? '+' : '';
491
+ return `<span style="color: ${color};">${sign}${value.toFixed(2)}%</span>`;
492
+ };
493
+
494
+ const formatVolume = (value) => {
495
+ if (value >= 1000000) {
496
+ return `${(value / 1000000).toFixed(1)}M`;
497
+ } else if (value >= 1000) {
498
+ return `${(value / 1000).toFixed(1)}K`;
499
+ }
500
+ return value.toString();
501
+ };
502
+
503
+ const columns = [
504
+ { title: '股票代码', field: 'symbol', width: 80, align: 'center' },
505
+ { title: '价格', field: 'price', width: 100, align: 'right',
506
+ formatter: formatPrice },
507
+ { title: '涨跌', field: 'change', width: 80, align: 'right',
508
+ formatter: formatChange, escapeHTML: true },
509
+ { title: '涨跌幅 %', field: 'changePercent', width: 80, align: 'right',
510
+ formatter: formatPercent, escapeHTML: true },
511
+ { title: '成交量', field: 'volume', width: 80, align: 'right',
512
+ formatter: formatVolume }
513
+ ];
514
+
515
+ const options = {
516
+ headerHeight: 35,
517
+ rowHeight: 30,
518
+ backgroundColor: '#000000',
519
+ color: '#ffffff',
520
+ headerBackgroundColor: '#1a1a1a',
521
+ headerColor: '#ffffff'
522
+ };
523
+
524
+ const handleStockClick = (stock) => {
525
+ console.log('选中股票:', stock.symbol);
526
+ // 可以打开详细视图、下单等
527
+ };
528
+ </script>
529
+
530
+ <div class="trading-table">
531
+ <h4>实时股价</h4>
532
+ <ConciseListTable
533
+ list={tradingData}
534
+ {columns}
535
+ {options}
536
+ rowClickHandler={handleStockClick}
537
+ />
538
+ </div>
539
+
540
+ <style>
541
+ .trading-table {
542
+ background: #000;
543
+ color: #fff;
544
+ padding: 16px;
545
+ border-radius: 4px;
546
+ font-family: 'Courier New', monospace;
547
+ }
548
+
549
+ .trading-table h4 {
550
+ margin: 0 0 12px 0;
551
+ color: #00ff00;
552
+ }
553
+ </style>
554
+ ```
555
+
556
+ ## 无障碍访问
557
+
558
+ ConciseListTable 组件包含全面的无障碍功能:
559
+
560
+ - **ARIA 角色**:正确的 `table`、`row`、`cell` 和 `columnheader` 角色
561
+ - **键盘导航**:Tab 导航和 Enter/Space 激活
562
+ - **屏幕阅读器支持**:适当的标签和行索引
563
+ - **焦点管理**:编程焦点控制
564
+ - **语义结构**:正确的表格标记和关系
565
+
566
+ ### 最佳实践
567
+
568
+ ```svelte
569
+ <!-- 好的:描述性表格标签 -->
570
+ <ConciseListTable
571
+ list={data}
572
+ columns={columns}
573
+ options={options}
574
+ aria-label="员工信息表格"
575
+ />
576
+
577
+ <!-- 好的:一致的列对齐 -->
578
+ const columns = [
579
+ { title: 'ID', field: 'id', width: 60, align: 'center' },
580
+ { title: '姓名', field: 'name', width: 150, align: 'left' },
581
+ { title: '薪资', field: 'salary', width: 100, align: 'right' }
582
+ ];
583
+
584
+ <!-- 好的:有意义的格式化器 -->
585
+ { title: '状态', field: 'status', formatter: (value) =>
586
+ value ? '激活' : '未激活' }
587
+ ```
588
+
589
+ ## 性能优化
590
+
591
+ - **高效渲染**:通过响应式变化实现最小 DOM 更新
592
+ - **自动滚动性能**:优化的基于 transform 的动画
593
+ - **ResizeObserver**:高效的视口大小监控
594
+ - **内存管理**:定时器和观察器的正确清理
595
+ - **类型安全**:完整的 TypeScript 支持减少运行时错误
596
+
597
+ ## 浏览器支持
598
+
599
+ 支持所有现代浏览器:
600
+ - ES6+ JavaScript
601
+ - ResizeObserver API
602
+ - CSS transforms 和 transitions
603
+ - 现代 DOM API
604
+
605
+ ## 迁移说明
606
+
607
+ 从旧版本升级时:
608
+ - `onChange` 事件现在是 `onchange`(小写)
609
+ - `onClick` 事件现在是 `onclick`(小写)
610
+ - 新的无障碍功能无需代码更改
611
+ - 增强的 TypeScript 支持提供更好的开发体验