@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,666 @@
1
+ # Card 卡片组件
2
+
3
+ 一个灵活的卡片容器组件,以结构化格式显示内容,具有可选的头部、操作栏和各种样式选项。非常适合显示结构化信息、用户资料、产品详情等。
4
+
5
+ ## 功能特性
6
+
7
+ - **灵活结构**: 头部、内容和操作栏部分
8
+ - **多种头部选项**: 简单标题或通过插槽自定义头部内容
9
+ - **操作栏支持**: 内置操作按钮,支持图标/图片和回调函数
10
+ - **视觉变体**: 平面和3D阴影变体
11
+ - **自定义样式**: 灵活的样式定制
12
+ - **基于插槽的内容**: 通过插槽支持丰富内容
13
+ - **交互操作**: 点击处理,具备防抖和悬停提示功能
14
+
15
+ ## 基本用法
16
+
17
+ ```svelte
18
+ <script>
19
+ import Card from '@ticatec/uniface-element/Card';
20
+
21
+ const cardData = { id: 1, name: '张三' };
22
+ </script>
23
+
24
+ <Card
25
+ title="用户资料"
26
+ data={cardData}
27
+ >
28
+ <p>这是卡片的内容区域。</p>
29
+ </Card>
30
+ ```
31
+
32
+ ## 属性参数
33
+
34
+ | 属性 | 类型 | 默认值 | 描述 |
35
+ |------|------|---------|-------------|
36
+ | `style` | `string` | `''` | 自定义CSS样式 |
37
+ | `title` | `string` | `null` | 简单头部标题文本 |
38
+ | `actions` | `CardAction[]` | `[]` | 操作按钮数组 |
39
+ | `variant` | `'plain' \| '3d'` | `'plain'` | 卡片视觉变体 |
40
+ | `iconColor` | `string \| null` | `null` | 操作图标的自定义颜色 |
41
+ | `data` | `any` | `null` | 传递给操作回调的数据对象 |
42
+
43
+ ## CardAction 接口
44
+
45
+ ```typescript
46
+ interface CardAction {
47
+ icon?: string; // 图标字体类(如FontAwesome)
48
+ img?: string; // 自定义图标的图片URL
49
+ hint?: string; // 悬停时的工具提示文本
50
+ disabled?: boolean; // 操作是否禁用
51
+ callback: (data: any) => void; // 操作回调函数
52
+ }
53
+ ```
54
+
55
+ ## 插槽
56
+
57
+ | 插槽 | 描述 |
58
+ |------|-------------|
59
+ | `header-bar` | 自定义头部内容(覆盖title属性) |
60
+ | `default` | 主要卡片内容 |
61
+ | `action-bar` | 自定义操作栏内容(当没有actions属性时) |
62
+
63
+ ## 卡片变体
64
+
65
+ ```svelte
66
+ <!-- 平面卡片(默认) -->
67
+ <Card title="平面卡片" variant="plain">
68
+ <p>简单的扁平卡片设计</p>
69
+ </Card>
70
+
71
+ <!-- 3D阴影卡片 -->
72
+ <Card title="3D卡片" variant="3d">
73
+ <p>带阴影效果的卡片</p>
74
+ </Card>
75
+ ```
76
+
77
+ ## 带操作的卡片
78
+
79
+ ```svelte
80
+ <script>
81
+ import Card, { type CardAction } from '@ticatec/uniface-element/Card';
82
+
83
+ const userData = { id: 1, name: '张三', email: 'zhang@example.com' };
84
+
85
+ const actions: CardAction[] = [
86
+ {
87
+ icon: 'fas fa-edit',
88
+ hint: '编辑用户',
89
+ callback: (data) => editUser(data)
90
+ },
91
+ {
92
+ icon: 'fas fa-trash',
93
+ hint: '删除用户',
94
+ callback: (data) => deleteUser(data)
95
+ },
96
+ {
97
+ icon: 'fas fa-share',
98
+ hint: '分享资料',
99
+ callback: (data) => shareProfile(data)
100
+ }
101
+ ];
102
+
103
+ const editUser = (user) => {
104
+ console.log('编辑用户:', user);
105
+ };
106
+
107
+ const deleteUser = (user) => {
108
+ console.log('删除用户:', user);
109
+ };
110
+
111
+ const shareProfile = (user) => {
112
+ console.log('分享资料:', user);
113
+ };
114
+ </script>
115
+
116
+ <Card
117
+ title="用户资料"
118
+ {actions}
119
+ data={userData}
120
+ variant="3d"
121
+ >
122
+ <div class="profile-content">
123
+ <h3>{userData.name}</h3>
124
+ <p>{userData.email}</p>
125
+ </div>
126
+ </Card>
127
+ ```
128
+
129
+ ## 自定义头部插槽
130
+
131
+ ```svelte
132
+ <Card variant="3d">
133
+ <div slot="header-bar" class="custom-header">
134
+ <div class="header-left">
135
+ <img src="/avatar.jpg" alt="用户" class="avatar" />
136
+ <h3>张三</h3>
137
+ </div>
138
+ <div class="header-right">
139
+ <span class="status online">在线</span>
140
+ </div>
141
+ </div>
142
+
143
+ <div class="profile-details">
144
+ <p>软件开发工程师</p>
145
+ <p>北京市</p>
146
+ </div>
147
+ </Card>
148
+
149
+ <style>
150
+ .custom-header {
151
+ display: flex;
152
+ justify-content: space-between;
153
+ align-items: center;
154
+ padding: 16px;
155
+ }
156
+
157
+ .header-left {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 12px;
161
+ }
162
+
163
+ .avatar {
164
+ width: 40px;
165
+ height: 40px;
166
+ border-radius: 50%;
167
+ }
168
+
169
+ .status.online {
170
+ color: #22c55e;
171
+ font-weight: 500;
172
+ }
173
+ </style>
174
+ ```
175
+
176
+ ## 自定义操作栏
177
+
178
+ ```svelte
179
+ <Card title="项目卡片">
180
+ <div class="project-info">
181
+ <h4>项目 Alpha</h4>
182
+ <p>一个革命性的新应用程序</p>
183
+ </div>
184
+
185
+ <div slot="action-bar" class="custom-actions">
186
+ <button class="btn-primary">查看详情</button>
187
+ <button class="btn-secondary">编辑</button>
188
+ <button class="btn-danger">删除</button>
189
+ </div>
190
+ </Card>
191
+ ```
192
+
193
+ ## 高级示例
194
+
195
+ ### 产品卡片
196
+
197
+ ```svelte
198
+ <script>
199
+ const product = {
200
+ id: 101,
201
+ name: '无线耳机',
202
+ price: 199.99,
203
+ image: '/headphones.jpg'
204
+ };
205
+
206
+ const productActions = [
207
+ {
208
+ icon: 'fas fa-heart',
209
+ hint: '添加到收藏',
210
+ callback: (data) => addToFavorites(data)
211
+ },
212
+ {
213
+ icon: 'fas fa-shopping-cart',
214
+ hint: '添加到购物车',
215
+ callback: (data) => addToCart(data)
216
+ },
217
+ {
218
+ icon: 'fas fa-share',
219
+ hint: '分享产品',
220
+ callback: (data) => shareProduct(data)
221
+ }
222
+ ];
223
+ </script>
224
+
225
+ <Card
226
+ actions={productActions}
227
+ data={product}
228
+ variant="3d"
229
+ style="max-width: 300px;"
230
+ >
231
+ <div slot="header-bar" class="product-header">
232
+ <img src={product.image} alt={product.name} class="product-image" />
233
+ </div>
234
+
235
+ <div class="product-details">
236
+ <h3>{product.name}</h3>
237
+ <div class="price">¥{product.price}</div>
238
+ <div class="rating">
239
+ ⭐⭐⭐⭐⭐ (128 条评价)
240
+ </div>
241
+ </div>
242
+ </Card>
243
+ ```
244
+
245
+ ### 仪表板小部件
246
+
247
+ ```svelte
248
+ <script>
249
+ const widgetData = {
250
+ title: '销售概览',
251
+ value: 12345,
252
+ change: '+15.3%'
253
+ };
254
+
255
+ const widgetActions = [
256
+ {
257
+ icon: 'fas fa-refresh',
258
+ hint: '刷新数据',
259
+ callback: (data) => refreshWidget(data)
260
+ },
261
+ {
262
+ icon: 'fas fa-cog',
263
+ hint: '设置',
264
+ callback: (data) => openSettings(data)
265
+ }
266
+ ];
267
+ </script>
268
+
269
+ <Card
270
+ title={widgetData.title}
271
+ actions={widgetActions}
272
+ data={widgetData}
273
+ iconColor="#007acc"
274
+ >
275
+ <div class="widget-content">
276
+ <div class="metric-value">¥{widgetData.value.toLocaleString()}</div>
277
+ <div class="metric-change positive">{widgetData.change}</div>
278
+ </div>
279
+ </Card>
280
+
281
+ <style>
282
+ .widget-content {
283
+ text-align: center;
284
+ padding: 20px;
285
+ }
286
+
287
+ .metric-value {
288
+ font-size: 2rem;
289
+ font-weight: bold;
290
+ color: #333;
291
+ }
292
+
293
+ .metric-change {
294
+ font-size: 1rem;
295
+ margin-top: 8px;
296
+ }
297
+
298
+ .metric-change.positive {
299
+ color: #22c55e;
300
+ }
301
+ </style>
302
+ ```
303
+
304
+ ### 博客文章卡片
305
+
306
+ ```svelte
307
+ <script>
308
+ const post = {
309
+ id: 1,
310
+ title: 'Svelte 入门指南',
311
+ excerpt: '学习 Svelte 框架的基础知识...',
312
+ author: '李小明',
313
+ date: '2024-03-15',
314
+ tags: ['svelte', 'javascript', '教程']
315
+ };
316
+
317
+ const postActions = [
318
+ {
319
+ icon: 'fas fa-bookmark',
320
+ hint: '收藏文章',
321
+ callback: (data) => bookmarkPost(data)
322
+ },
323
+ {
324
+ icon: 'fas fa-share',
325
+ hint: '分享文章',
326
+ callback: (data) => sharePost(data)
327
+ }
328
+ ];
329
+ </script>
330
+
331
+ <Card
332
+ actions={postActions}
333
+ data={post}
334
+ variant="plain"
335
+ >
336
+ <div slot="header-bar" class="post-header">
337
+ <h2 class="post-title">{post.title}</h2>
338
+ <div class="post-meta">
339
+ <span>作者:{post.author}</span>
340
+ <span>{post.date}</span>
341
+ </div>
342
+ </div>
343
+
344
+ <div class="post-content">
345
+ <p>{post.excerpt}</p>
346
+ <div class="tags">
347
+ {#each post.tags as tag}
348
+ <span class="tag">#{tag}</span>
349
+ {/each}
350
+ </div>
351
+ </div>
352
+ </Card>
353
+ ```
354
+
355
+ ### 联系人卡片
356
+
357
+ ```svelte
358
+ <script>
359
+ const contact = {
360
+ name: '王小红',
361
+ role: '项目经理',
362
+ email: 'wang@company.com',
363
+ phone: '+86 138-0013-8000',
364
+ avatar: '/sarah.jpg'
365
+ };
366
+
367
+ const contactActions = [
368
+ {
369
+ icon: 'fas fa-envelope',
370
+ hint: '发送邮件',
371
+ callback: (data) => sendEmail(data.email)
372
+ },
373
+ {
374
+ icon: 'fas fa-phone',
375
+ hint: '拨打电话',
376
+ callback: (data) => makeCall(data.phone)
377
+ },
378
+ {
379
+ icon: 'fas fa-edit',
380
+ hint: '编辑联系人',
381
+ callback: (data) => editContact(data)
382
+ }
383
+ ];
384
+ </script>
385
+
386
+ <Card
387
+ actions={contactActions}
388
+ data={contact}
389
+ variant="3d"
390
+ >
391
+ <div class="contact-card">
392
+ <img src={contact.avatar} alt={contact.name} class="contact-avatar" />
393
+ <h3>{contact.name}</h3>
394
+ <p class="contact-role">{contact.role}</p>
395
+ <div class="contact-info">
396
+ <div class="contact-item">
397
+ <i class="fas fa-envelope"></i>
398
+ <span>{contact.email}</span>
399
+ </div>
400
+ <div class="contact-item">
401
+ <i class="fas fa-phone"></i>
402
+ <span>{contact.phone}</span>
403
+ </div>
404
+ </div>
405
+ </div>
406
+ </Card>
407
+ ```
408
+
409
+ ### 设置卡片
410
+
411
+ ```svelte
412
+ <script>
413
+ let notifications = true;
414
+ let darkMode = false;
415
+
416
+ const settingsData = { notifications, darkMode };
417
+
418
+ const saveSettings = (data) => {
419
+ console.log('保存设置:', data);
420
+ // 保存设置逻辑
421
+ };
422
+
423
+ const resetSettings = (data) => {
424
+ notifications = true;
425
+ darkMode = false;
426
+ };
427
+
428
+ const settingsActions = [
429
+ {
430
+ icon: 'fas fa-save',
431
+ hint: '保存设置',
432
+ callback: saveSettings
433
+ },
434
+ {
435
+ icon: 'fas fa-undo',
436
+ hint: '重置为默认值',
437
+ callback: resetSettings
438
+ }
439
+ ];
440
+ </script>
441
+
442
+ <Card
443
+ title="偏好设置"
444
+ actions={settingsActions}
445
+ data={settingsData}
446
+ >
447
+ <div class="settings-form">
448
+ <div class="setting-item">
449
+ <label>
450
+ <input type="checkbox" bind:checked={notifications} />
451
+ 启用通知
452
+ </label>
453
+ </div>
454
+ <div class="setting-item">
455
+ <label>
456
+ <input type="checkbox" bind:checked={darkMode} />
457
+ 深色模式
458
+ </label>
459
+ </div>
460
+ </div>
461
+ </Card>
462
+ ```
463
+
464
+ ## 操作类型
465
+
466
+ ### 图标操作
467
+
468
+ ```svelte
469
+ <script>
470
+ const iconActions = [
471
+ {
472
+ icon: 'fas fa-star',
473
+ hint: '标记为收藏',
474
+ callback: (data) => toggleFavorite(data)
475
+ },
476
+ {
477
+ icon: 'fas fa-download',
478
+ hint: '下载',
479
+ callback: (data) => downloadFile(data)
480
+ }
481
+ ];
482
+ </script>
483
+ ```
484
+
485
+ ### 图片操作
486
+
487
+ ```svelte
488
+ <script>
489
+ const imageActions = [
490
+ {
491
+ img: '/icons/custom-icon.svg',
492
+ hint: '自定义操作',
493
+ callback: (data) => customAction(data)
494
+ }
495
+ ];
496
+ </script>
497
+ ```
498
+
499
+ ### 禁用操作
500
+
501
+ ```svelte
502
+ <script>
503
+ const mixedActions = [
504
+ {
505
+ icon: 'fas fa-edit',
506
+ hint: '编辑(可用)',
507
+ callback: (data) => editItem(data)
508
+ },
509
+ {
510
+ icon: 'fas fa-trash',
511
+ hint: '删除(不可用)',
512
+ disabled: true,
513
+ callback: (data) => deleteItem(data)
514
+ }
515
+ ];
516
+ </script>
517
+ ```
518
+
519
+ ## 样式定制
520
+
521
+ 组件使用以下CSS类:
522
+
523
+ - `.uniface-card` - 主卡片容器
524
+ - `.shadowBox` - 当variant="3d"时应用
525
+ - `.card-header` - 头部部分容器
526
+ - `.card-header.simple` - 仅标题的简单头部
527
+ - `.card-content` - 主要内容区域
528
+ - `.card-action-bar` - 操作栏容器
529
+ - `.card-action-bar.simple` - 内置操作栏
530
+ - `.action-item` - 单个操作按钮
531
+ - `.action-item.disabled` - 禁用操作样式
532
+
533
+ ### CSS示例
534
+
535
+ ```css
536
+ .uniface-card {
537
+ border: 1px solid #e5e7eb;
538
+ border-radius: 8px;
539
+ background: white;
540
+ overflow: hidden;
541
+ }
542
+
543
+ .uniface-card.shadowBox {
544
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
545
+ }
546
+
547
+ .card-header {
548
+ border-bottom: 1px solid #e5e7eb;
549
+ padding: 16px;
550
+ background: #f9fafb;
551
+ }
552
+
553
+ .card-content {
554
+ padding: 16px;
555
+ }
556
+
557
+ .card-action-bar {
558
+ border-top: 1px solid #e5e7eb;
559
+ padding: 8px 16px;
560
+ background: #f9fafb;
561
+ display: flex;
562
+ gap: 12px;
563
+ justify-content: flex-end;
564
+ }
565
+
566
+ .action-item {
567
+ cursor: pointer;
568
+ padding: 8px;
569
+ border-radius: 4px;
570
+ transition: background-color 0.2s;
571
+ }
572
+
573
+ .action-item:hover:not(.disabled) {
574
+ background: rgba(0, 0, 0, 0.05);
575
+ }
576
+
577
+ .action-item.disabled {
578
+ opacity: 0.5;
579
+ cursor: not-allowed;
580
+ }
581
+ ```
582
+
583
+ ## 最佳实践
584
+
585
+ 1. **一致的数据结构**: 为类似的卡片类型使用一致的数据对象
586
+ 2. **有意义的操作**: 提供清晰、可操作的操作,并配有描述性提示
587
+ 3. **适当的变体**: 谨慎使用3D变体以强调重点
588
+ 4. **可访问的内容**: 确保内容可读且操作标签清晰
589
+ 5. **响应式设计**: 考虑卡片在不同屏幕尺寸上的堆叠和调整
590
+ 6. **加载状态**: 为动态内容显示加载指示器
591
+ 7. **错误处理**: 优雅地处理操作回调错误
592
+
593
+ ## 常见模式
594
+
595
+ ### 卡片网格
596
+
597
+ ```svelte
598
+ <div class="card-grid">
599
+ {#each items as item}
600
+ <Card title={item.title} actions={cardActions} data={item}>
601
+ <p>{item.description}</p>
602
+ </Card>
603
+ {/each}
604
+ </div>
605
+
606
+ <style>
607
+ .card-grid {
608
+ display: grid;
609
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
610
+ gap: 16px;
611
+ padding: 16px;
612
+ }
613
+ </style>
614
+ ```
615
+
616
+ ### 卡片列表
617
+
618
+ ```svelte
619
+ <div class="card-list">
620
+ {#each items as item}
621
+ <Card variant="plain" actions={listActions} data={item}>
622
+ <div class="list-item">
623
+ <h4>{item.title}</h4>
624
+ <p>{item.description}</p>
625
+ </div>
626
+ </Card>
627
+ {/each}
628
+ </div>
629
+ ```
630
+
631
+ ### 仪表板布局
632
+
633
+ ```svelte
634
+ <div class="dashboard">
635
+ <div class="dashboard-row">
636
+ <Card title="收入" variant="3d">
637
+ <div class="metric">¥45,230</div>
638
+ </Card>
639
+ <Card title="用户" variant="3d">
640
+ <div class="metric">1,234</div>
641
+ </Card>
642
+ </div>
643
+ </div>
644
+ ```
645
+
646
+ ## 无障碍访问
647
+
648
+ - 在卡片内容中使用语义化HTML
649
+ - 为屏幕阅读器提供有意义的操作提示
650
+ - 确保足够的颜色对比度
651
+ - 支持操作的键盘导航
652
+ - 在卡片内容中使用适当的标题层级
653
+
654
+ ## 浏览器支持
655
+
656
+ Card组件在支持以下特性的所有现代浏览器中工作:
657
+ - ES6+ JavaScript
658
+ - CSS Grid 和 Flexbox
659
+ - 现代DOM API
660
+
661
+ ## 性能
662
+
663
+ - 高效的操作处理,内置防抖功能
664
+ - 通过正确的key使用实现最小重新渲染
665
+ - 轻量级DOM结构
666
+ - 可选的卡片内容懒加载