@ticatec/uniface-element 0.2.4 → 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 (176) 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/README.md +596 -0
  70. package/dist/dialog/README_CN.md +596 -0
  71. package/dist/drawer/README.md +679 -1
  72. package/dist/drawer/README_CN.md +679 -0
  73. package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
  74. package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
  75. package/dist/group-box/group-check-box/README.md +749 -0
  76. package/dist/group-box/group-check-box/README_CN.md +750 -0
  77. package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
  78. package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
  79. package/dist/group-box/group-radio-box/README.md +920 -0
  80. package/dist/group-box/group-radio-box/README_CN.md +920 -0
  81. package/dist/image-files/README.md +1346 -0
  82. package/dist/image-files/README_CN.md +1346 -0
  83. package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
  84. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
  85. package/dist/lib/forwardAllEvents.d.ts +3 -0
  86. package/dist/lib/forwardAllEvents.js +24 -0
  87. package/dist/list-box/README.md +579 -0
  88. package/dist/list-box/README_CN.md +682 -0
  89. package/dist/lookup-editor/LookupEditor.svelte +15 -3
  90. package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
  91. package/dist/lookup-editor/README.md +684 -0
  92. package/dist/lookup-editor/README_CN.md +684 -0
  93. package/dist/memo-editor/MemoEditor.svelte +77 -27
  94. package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
  95. package/dist/memo-editor/README.md +819 -0
  96. package/dist/memo-editor/README_CN.md +819 -0
  97. package/dist/message-box/README.md +398 -0
  98. package/dist/message-box/README_CN.md +398 -0
  99. package/dist/number-editor/NumberEditor.svelte +2 -2
  100. package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
  101. package/dist/number-editor/README.md +353 -22
  102. package/dist/number-editor/README_CN.md +357 -0
  103. package/dist/number-range/README.md +443 -0
  104. package/dist/number-range/README_CN.md +443 -0
  105. package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
  106. package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
  107. package/dist/options-multi-select/README.md +480 -0
  108. package/dist/options-multi-select/README_CN.md +480 -0
  109. package/dist/options-select/OptionsSelect.svelte +36 -5
  110. package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
  111. package/dist/options-select/README.md +632 -0
  112. package/dist/options-select/README_CN.md +632 -0
  113. package/dist/page/README.md +605 -0
  114. package/dist/page/README_CN.md +605 -0
  115. package/dist/pagination/README.md +946 -0
  116. package/dist/pagination/README_CN.md +946 -0
  117. package/dist/pagination-panel/README.md +1075 -0
  118. package/dist/pagination-panel/README_CN.md +1075 -0
  119. package/dist/popup-hint/README.md +841 -0
  120. package/dist/popup-hint/README_CN.md +840 -0
  121. package/dist/progress-bar/README.md +242 -0
  122. package/dist/progress-bar/README_CN.md +242 -0
  123. package/dist/progress-step-bar/README.md +316 -0
  124. package/dist/progress-step-bar/README_CN.md +316 -0
  125. package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
  126. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
  127. package/dist/prompts-text-editor/README.md +329 -0
  128. package/dist/prompts-text-editor/README_CN.md +329 -0
  129. package/dist/property-editor/README.md +969 -0
  130. package/dist/property-editor/README_CN.md +969 -0
  131. package/dist/radio-button/README.md +372 -0
  132. package/dist/radio-button/README_CN.md +372 -0
  133. package/dist/radio-button/RadioButton.svelte +32 -3
  134. package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
  135. package/dist/search-box/README.md +425 -0
  136. package/dist/search-box/README_CN.md +424 -0
  137. package/dist/search-box/SearchBox.svelte +22 -6
  138. package/dist/search-box/SearchBox.svelte.d.ts +4 -1
  139. package/dist/tabs/README.md +919 -0
  140. package/dist/tabs/README_CN.md +920 -0
  141. package/dist/tag/README.md +922 -0
  142. package/dist/tag/README_CN.md +922 -0
  143. package/dist/text-editor/PasswordEditor.svelte +17 -2
  144. package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
  145. package/dist/text-editor/PasswordEditor_README.md +551 -0
  146. package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
  147. package/dist/text-editor/README.md +466 -0
  148. package/dist/text-editor/README_CN.md +466 -0
  149. package/dist/text-editor/TextEditor.svelte +51 -19
  150. package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
  151. package/dist/time-editor/README.md +498 -24
  152. package/dist/time-editor/README_CN.md +498 -0
  153. package/dist/time-editor/TimeEditor.svelte +7 -3
  154. package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
  155. package/dist/toast/README.md +667 -0
  156. package/dist/toast/README_CN.md +667 -0
  157. package/dist/transfer/README.md +795 -0
  158. package/dist/transfer/Transfer.svelte +6 -4
  159. package/dist/transfer/Transfer.svelte.d.ts +3 -1
  160. package/dist/tree-view/README.md +761 -0
  161. package/dist/tree-view/README_CN.md +761 -0
  162. package/dist/tree-view/TreeView.svelte +5 -3
  163. package/dist/tree-view/TreeView.svelte.d.ts +3 -1
  164. package/dist/unit-number-editor/README.md +546 -20
  165. package/dist/unit-number-editor/README_CN.md +525 -0
  166. package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
  167. package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
  168. package/docs/form-field/cn/README_CN.md +364 -0
  169. package/docs/form-field/en/README.md +364 -0
  170. package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
  171. package/docs/form-panel/flex-form/en/README.md +586 -0
  172. package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
  173. package/docs/form-panel/flex-row-form/en/README.md +787 -0
  174. package/docs/form-panel/grid-form/en/README.md +744 -0
  175. package/package.json +1 -1
  176. package/dist/drawer/README-CN.md +0 -1
@@ -0,0 +1,679 @@
1
+ # Drawer 抽屉组件
2
+
3
+ 基于 Svelte 构建的滑出面板组件,提供具有可配置定位和动画的平滑侧边导航和内容显示。
4
+
5
+ ## 特性
6
+
7
+ - **左/右定位**:可配置的抽屉位置(左侧或右侧)
8
+ - **平滑动画**:具有可自定义持续时间的飞入过渡效果
9
+ - **遮罩背景**:半透明背景,支持点击关闭
10
+ - **可自定义宽度**:可调整的抽屉宽度
11
+ - **自动隐藏管理**:智能的可见性状态管理
12
+ - **事件处理**:点击外部关闭功能
13
+ - **响应式设计**:适应不同屏幕尺寸
14
+ - **无障碍访问支持**:适当的 ARIA 属性
15
+ - **CSS 自定义**:可使用 CSS 变量进行主题化
16
+ - **轻量级**:最小的性能影响
17
+
18
+ ## 安装
19
+
20
+ ```bash
21
+ npm install @ticatec/uniface-element
22
+ ```
23
+
24
+ ```typescript
25
+ import Drawer from '@ticatec/uniface-element/Drawer';
26
+ ```
27
+
28
+ 或者在同一项目中使用:
29
+ ```typescript
30
+ import Drawer from '$lib/drawer';
31
+ ```
32
+
33
+ ## 基本用法
34
+
35
+ ```svelte
36
+ <script>
37
+ import Drawer from '@ticatec/uniface-element/Drawer';
38
+ import Button from '@ticatec/uniface-elemen/Button';
39
+
40
+ let showDrawer = false;
41
+
42
+ function openDrawer() {
43
+ showDrawer = true;
44
+ }
45
+
46
+ function closeDrawer() {
47
+ showDrawer = false;
48
+ }
49
+ </script>
50
+
51
+ <Button label="打开抽屉" onClick={openDrawer} />
52
+
53
+ <Drawer bind:visible={showDrawer}>
54
+ <div style="padding: 1rem;">
55
+ <h2>抽屉内容</h2>
56
+ <p>这是抽屉内容区域。</p>
57
+ <Button label="关闭" onClick={closeDrawer} />
58
+ </div>
59
+ </Drawer>
60
+ ```
61
+
62
+ ## 属性
63
+
64
+ | 属性 | 类型 | 默认值 | 描述 |
65
+ |------|------|---------|-------------|
66
+ | `visible` | `boolean` | `false` | 控制抽屉可见性 |
67
+ | `width` | `number` | `300` | 抽屉宽度(像素) |
68
+ | `position` | `'left' \| 'right'` | `'left'` | 抽屉滑入位置 |
69
+
70
+ ## 示例
71
+
72
+ ### 基本左侧抽屉
73
+
74
+ ```svelte
75
+ <script>
76
+ import Drawer from '@ticatec/uniface-element/Drawer';
77
+
78
+ let leftDrawerVisible = false;
79
+ </script>
80
+
81
+ <button on:click={() => leftDrawerVisible = true}>
82
+ 打开左侧抽屉
83
+ </button>
84
+
85
+ <Drawer bind:visible={leftDrawerVisible}>
86
+ <div class="drawer-content">
87
+ <h3>导航菜单</h3>
88
+ <ul>
89
+ <li><a href="/home">首页</a></li>
90
+ <li><a href="/about">关于</a></li>
91
+ <li><a href="/contact">联系</a></li>
92
+ </ul>
93
+ </div>
94
+ </Drawer>
95
+ ```
96
+
97
+ ### 右侧抽屉
98
+
99
+ ```svelte
100
+ <script>
101
+ import Drawer from '@ticatec/uniface-element/Drawer';
102
+
103
+ let rightDrawerVisible = false;
104
+ </script>
105
+
106
+ <button on:click={() => rightDrawerVisible = true}>
107
+ 打开右侧抽屉
108
+ </button>
109
+
110
+ <Drawer bind:visible={rightDrawerVisible} position="right">
111
+ <div class="drawer-content">
112
+ <h3>设置面板</h3>
113
+ <div class="setting-item">
114
+ <label>
115
+ <input type="checkbox" /> 启用通知
116
+ </label>
117
+ </div>
118
+ <div class="setting-item">
119
+ <label>
120
+ <input type="checkbox" /> 深色模式
121
+ </label>
122
+ </div>
123
+ </div>
124
+ </Drawer>
125
+ ```
126
+
127
+ ### 自定义宽度抽屉
128
+
129
+ ```svelte
130
+ <script>
131
+ import Drawer from '@ticatec/uniface-element/Drawer';
132
+
133
+ let wideDrawerVisible = false;
134
+ </script>
135
+
136
+ <button on:click={() => wideDrawerVisible = true}>
137
+ 打开宽抽屉
138
+ </button>
139
+
140
+ <Drawer bind:visible={wideDrawerVisible} width={400}>
141
+ <div class="drawer-content">
142
+ <h3>宽内容面板</h3>
143
+ <p>这个抽屉更宽,可以容纳更多内容。</p>
144
+ <div class="content-grid">
145
+ <div class="card">卡片 1</div>
146
+ <div class="card">卡片 2</div>
147
+ <div class="card">卡片 3</div>
148
+ </div>
149
+ </div>
150
+ </Drawer>
151
+ ```
152
+
153
+ ### 移动端导航抽屉
154
+
155
+ ```svelte
156
+ <script>
157
+ import Drawer from '@ticatec/uniface-element/Drawer';
158
+ import Icon from '@ticatec/uniface-element/Icon';
159
+
160
+ let mobileMenuVisible = false;
161
+
162
+ const menuItems = [
163
+ { label: '仪表板', icon: 'dashboard', href: '/dashboard' },
164
+ { label: '项目', icon: 'folder', href: '/projects' },
165
+ { label: '团队', icon: 'people', href: '/team' },
166
+ { label: '设置', icon: 'settings', href: '/settings' }
167
+ ];
168
+
169
+ function closeMenu() {
170
+ mobileMenuVisible = false;
171
+ }
172
+ </script>
173
+
174
+ <!-- 带菜单按钮的移动端头部 -->
175
+ <header class="mobile-header">
176
+ <button class="menu-button" on:click={() => mobileMenuVisible = true}>
177
+ <Icon name="menu" />
178
+ </button>
179
+ <h1>我的应用</h1>
180
+ </header>
181
+
182
+ <!-- 移动端导航抽屉 -->
183
+ <Drawer bind:visible={mobileMenuVisible} width={280}>
184
+ <nav class="mobile-nav">
185
+ <div class="nav-header">
186
+ <h2>菜单</h2>
187
+ <button class="close-button" on:click={closeMenu}>
188
+ <Icon name="close" />
189
+ </button>
190
+ </div>
191
+
192
+ <ul class="nav-menu">
193
+ {#each menuItems as item}
194
+ <li>
195
+ <a href={item.href} on:click={closeMenu}>
196
+ <Icon name={item.icon} />
197
+ <span>{item.label}</span>
198
+ </a>
199
+ </li>
200
+ {/each}
201
+ </ul>
202
+
203
+ <div class="nav-footer">
204
+ <div class="user-info">
205
+ <Icon name="account_circle" />
206
+ <span>张三</span>
207
+ </div>
208
+ </div>
209
+ </nav>
210
+ </Drawer>
211
+
212
+ <style>
213
+ .mobile-header {
214
+ display: flex;
215
+ align-items: center;
216
+ padding: 1rem;
217
+ background: #fff;
218
+ border-bottom: 1px solid #e1e1e1;
219
+ }
220
+
221
+ .menu-button {
222
+ background: none;
223
+ border: none;
224
+ margin-right: 1rem;
225
+ cursor: pointer;
226
+ }
227
+
228
+ .mobile-nav {
229
+ height: 100%;
230
+ display: flex;
231
+ flex-direction: column;
232
+ }
233
+
234
+ .nav-header {
235
+ display: flex;
236
+ justify-content: space-between;
237
+ align-items: center;
238
+ padding: 1rem;
239
+ border-bottom: 1px solid #e1e1e1;
240
+ }
241
+
242
+ .nav-menu {
243
+ flex: 1;
244
+ list-style: none;
245
+ padding: 0;
246
+ margin: 0;
247
+ }
248
+
249
+ .nav-menu a {
250
+ display: flex;
251
+ align-items: center;
252
+ padding: 1rem;
253
+ text-decoration: none;
254
+ color: #333;
255
+ border-bottom: 1px solid #f0f0f0;
256
+ }
257
+
258
+ .nav-menu a:hover {
259
+ background: #f5f5f5;
260
+ }
261
+
262
+ .nav-footer {
263
+ padding: 1rem;
264
+ border-top: 1px solid #e1e1e1;
265
+ }
266
+
267
+ .user-info {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 0.5rem;
271
+ }
272
+ </style>
273
+ ```
274
+
275
+ ### 筛选/搜索抽屉
276
+
277
+ ```svelte
278
+ <script>
279
+ import Drawer from '$lib/drawer';
280
+ import TextEditor from '$lib/text-editor';
281
+ import Checkbox from '$lib/checkbox';
282
+ import Button from '$lib/button';
283
+
284
+ let filterDrawerVisible = false;
285
+ let filters = {
286
+ searchTerm: '',
287
+ categories: [],
288
+ priceRange: { min: 0, max: 1000 },
289
+ inStock: false
290
+ };
291
+
292
+ const categories = ['电子产品', '服装', '图书', '家居园艺'];
293
+
294
+ function applyFilters() {
295
+ console.log('应用筛选:', filters);
296
+ filterDrawerVisible = false;
297
+ }
298
+
299
+ function resetFilters() {
300
+ filters = {
301
+ searchTerm: '',
302
+ categories: [],
303
+ priceRange: { min: 0, max: 1000 },
304
+ inStock: false
305
+ };
306
+ }
307
+ </script>
308
+
309
+ <button on:click={() => filterDrawerVisible = true}>
310
+ 显示筛选
311
+ </button>
312
+
313
+ <Drawer bind:visible={filterDrawerVisible} position="right" width={350}>
314
+ <div class="filter-panel">
315
+ <div class="filter-header">
316
+ <h3>筛选</h3>
317
+ <button class="reset-button" on:click={resetFilters}>
318
+ 重置全部
319
+ </button>
320
+ </div>
321
+
322
+ <div class="filter-section">
323
+ <label>搜索:</label>
324
+ <TextEditor bind:value={filters.searchTerm} placeholder="搜索产品..." />
325
+ </div>
326
+
327
+ <div class="filter-section">
328
+ <label>分类:</label>
329
+ {#each categories as category}
330
+ <Checkbox
331
+ label={category}
332
+ checked={filters.categories.includes(category)}
333
+ onchange={(checked) => {
334
+ if (checked) {
335
+ filters.categories = [...filters.categories, category];
336
+ } else {
337
+ filters.categories = filters.categories.filter(c => c !== category);
338
+ }
339
+ }}
340
+ />
341
+ {/each}
342
+ </div>
343
+
344
+ <div class="filter-section">
345
+ <label>价格范围:</label>
346
+ <div class="price-inputs">
347
+ <input type="number" bind:value={filters.priceRange.min} min="0" />
348
+ <span>到</span>
349
+ <input type="number" bind:value={filters.priceRange.max} min="0" />
350
+ </div>
351
+ </div>
352
+
353
+ <div class="filter-section">
354
+ <Checkbox
355
+ label="仅显示有库存"
356
+ bind:checked={filters.inStock}
357
+ />
358
+ </div>
359
+
360
+ <div class="filter-actions">
361
+ <Button label="应用筛选" type="primary" onClick={applyFilters} />
362
+ </div>
363
+ </div>
364
+ </Drawer>
365
+
366
+ <style>
367
+ .filter-panel {
368
+ padding: 1rem;
369
+ height: 100%;
370
+ display: flex;
371
+ flex-direction: column;
372
+ }
373
+
374
+ .filter-header {
375
+ display: flex;
376
+ justify-content: space-between;
377
+ align-items: center;
378
+ margin-bottom: 1rem;
379
+ padding-bottom: 1rem;
380
+ border-bottom: 1px solid #e1e1e1;
381
+ }
382
+
383
+ .filter-section {
384
+ margin-bottom: 1.5rem;
385
+ }
386
+
387
+ .filter-section label {
388
+ display: block;
389
+ font-weight: 600;
390
+ margin-bottom: 0.5rem;
391
+ }
392
+
393
+ .price-inputs {
394
+ display: flex;
395
+ align-items: center;
396
+ gap: 0.5rem;
397
+ }
398
+
399
+ .price-inputs input {
400
+ width: 80px;
401
+ padding: 0.25rem;
402
+ border: 1px solid #ccc;
403
+ border-radius: 4px;
404
+ }
405
+
406
+ .filter-actions {
407
+ margin-top: auto;
408
+ padding-top: 1rem;
409
+ border-top: 1px solid #e1e1e1;
410
+ }
411
+
412
+ .reset-button {
413
+ background: none;
414
+ border: none;
415
+ color: #666;
416
+ cursor: pointer;
417
+ text-decoration: underline;
418
+ }
419
+ </style>
420
+ ```
421
+
422
+ ## 动画和过渡
423
+
424
+ 抽屉使用 Svelte 的 `fly` 过渡,具有以下行为:
425
+
426
+ - **滑动方向**:基于位置(左侧从左滑入,右侧从右滑入)
427
+ - **持续时间**:默认 1000ms(1 秒)
428
+ - **不透明度**:从 0.5 开始淡入到 1.0
429
+ - **缓动**:线性过渡
430
+
431
+ ### 自定义动画
432
+
433
+ 虽然组件没有直接暴露动画属性,但您可以通过编辑组件或使用 CSS 过渡来修改过渡效果:
434
+
435
+ ```css
436
+ .uniface-drawer > div {
437
+ transition: transform 0.3s ease-out;
438
+ }
439
+ ```
440
+
441
+ ## 交互模式
442
+
443
+ ### 点击外部关闭
444
+
445
+ 抽屉在点击遮罩背景时自动关闭:
446
+
447
+ ```svelte
448
+ <!-- 此行为是内置的 -->
449
+ <Drawer bind:visible={showDrawer}>
450
+ <!-- 点击此内容区域外会关闭抽屉 -->
451
+ </Drawer>
452
+ ```
453
+
454
+ ### 防止内容点击关闭
455
+
456
+ 内容点击会自动阻止冒泡到遮罩层:
457
+
458
+ ```svelte
459
+ <Drawer bind:visible={showDrawer}>
460
+ <!-- 在这里点击不会关闭抽屉 -->
461
+ <div>
462
+ <button>这不会关闭抽屉</button>
463
+ </div>
464
+ </Drawer>
465
+ ```
466
+
467
+ ### 手动关闭控制
468
+
469
+ ```svelte
470
+ <script>
471
+ import Drawer from '$lib/drawer';
472
+
473
+ let drawerVisible = false;
474
+
475
+ function closeDrawer() {
476
+ drawerVisible = false;
477
+ }
478
+
479
+ // Escape 键关闭
480
+ function handleKeydown(event) {
481
+ if (event.key === 'Escape' && drawerVisible) {
482
+ closeDrawer();
483
+ }
484
+ }
485
+ </script>
486
+
487
+ <svelte:window on:keydown={handleKeydown} />
488
+
489
+ <Drawer bind:visible={drawerVisible}>
490
+ <div class="drawer-content">
491
+ <button class="close-button" on:click={closeDrawer}>
492
+ ✕ 关闭
493
+ </button>
494
+ <!-- 内容 -->
495
+ </div>
496
+ </Drawer>
497
+ ```
498
+
499
+ ## 样式定制
500
+
501
+ ### CSS 变量
502
+
503
+ 可以使用 CSS 变量自定义抽屉:
504
+
505
+ ```css
506
+ :root {
507
+ --uniface-drawer-bg: #ffffff;
508
+ --uniface-drawer-shadow: rgba(0, 0, 0, 0.16) 0 3px 6px, rgba(0, 0, 0, 0.23) 0 3px 6px;
509
+ --uniface-drawer-border-color: #e1e1e1;
510
+ }
511
+ ```
512
+
513
+ ### 自定义样式
514
+
515
+ ```css
516
+ /* 深色主题抽屉 */
517
+ .dark-drawer {
518
+ --uniface-drawer-bg: #2a2a2a;
519
+ --uniface-drawer-border-color: #444;
520
+ --uniface-drawer-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
521
+ color: white;
522
+ }
523
+
524
+ /* 圆角抽屉 */
525
+ .rounded-drawer .uniface-drawer > div {
526
+ border-radius: 0 12px 12px 0;
527
+ }
528
+
529
+ .rounded-drawer .uniface-drawer > div.right {
530
+ border-radius: 12px 0 0 12px;
531
+ }
532
+
533
+ /* 自定义遮罩 */
534
+ .custom-overlay .uniface-drawer {
535
+ background-color: rgba(0, 0, 0, 0.7);
536
+ backdrop-filter: blur(4px);
537
+ }
538
+ ```
539
+
540
+ ### 响应式设计
541
+
542
+ ```scss
543
+ .drawer-content {
544
+ padding: 1rem;
545
+
546
+ @media (max-width: 768px) {
547
+ padding: 0.5rem;
548
+ }
549
+ }
550
+
551
+ /* 移动端全宽抽屉 */
552
+ @media (max-width: 480px) {
553
+ .uniface-drawer > div {
554
+ width: 100% !important;
555
+ }
556
+ }
557
+ ```
558
+
559
+ ## 无障碍访问
560
+
561
+ - **ARIA 属性**:抽屉包含适当的 `aria-hidden` 属性
562
+ - **焦点管理**:考虑添加焦点陷阱以提高无障碍访问
563
+ - **键盘支持**:实现 Escape 键处理以关闭
564
+ - **屏幕阅读器支持**:添加描述性标签和角色
565
+
566
+ ### 增强无障碍访问示例
567
+
568
+ ```svelte
569
+ <script>
570
+ import Drawer from '$lib/drawer';
571
+
572
+ let drawerVisible = false;
573
+ let drawerContent;
574
+
575
+ function openDrawer() {
576
+ drawerVisible = true;
577
+ // 打开时聚焦第一个可交互元素
578
+ setTimeout(() => {
579
+ const firstButton = drawerContent?.querySelector('button, a, input, select, textarea');
580
+ firstButton?.focus();
581
+ }, 100);
582
+ }
583
+
584
+ function handleKeydown(event) {
585
+ if (event.key === 'Escape' && drawerVisible) {
586
+ drawerVisible = false;
587
+ }
588
+ }
589
+ </script>
590
+
591
+ <svelte:window on:keydown={handleKeydown} />
592
+
593
+ <button on:click={openDrawer} aria-label="打开导航菜单">
594
+ 打开菜单
595
+ </button>
596
+
597
+ <Drawer bind:visible={drawerVisible}>
598
+ <nav bind:this={drawerContent} aria-label="主导航" role="navigation">
599
+ <h2 id="drawer-title">导航菜单</h2>
600
+ <!-- 带有适当焦点管理的内容 -->
601
+ </nav>
602
+ </Drawer>
603
+ ```
604
+
605
+ ## 最佳实践
606
+
607
+ ### 1. 内容组织
608
+ - 保持抽屉内容专注和有组织
609
+ - 使用清晰的标题和章节
610
+ - 将内容限制为基本项目
611
+
612
+ ### 2. 宽度指南
613
+ - **移动端**:使用屏幕宽度的 80-90% 或全宽
614
+ - **平板**:通常 300-400px 合适
615
+ - **桌面端**:导航使用 250-350px,详细内容最多 500px
616
+
617
+ ### 3. 性能
618
+ - 避免在频繁打开的抽屉中放置重内容
619
+ - 对复杂的抽屉内容使用懒加载
620
+ - 对长列表考虑虚拟化
621
+
622
+ ### 4. 用户体验
623
+ - 提供清晰的关闭按钮或说明
624
+ - 在应用中使用一致的定位
625
+ - 确保移动设备上的触摸友好目标
626
+
627
+ ## 常见用例
628
+
629
+ ### 导航抽屉
630
+ ```svelte
631
+ <!-- 移动优先导航 -->
632
+ <Drawer bind:visible={navOpen} width={280}>
633
+ <nav>
634
+ <ul>
635
+ <li><a href="/">首页</a></li>
636
+ <li><a href="/products">产品</a></li>
637
+ <li><a href="/contact">联系</a></li>
638
+ </ul>
639
+ </nav>
640
+ </Drawer>
641
+ ```
642
+
643
+ ### 设置面板
644
+ ```svelte
645
+ <!-- 右侧设置 -->
646
+ <Drawer bind:visible={settingsOpen} position="right" width={400}>
647
+ <div class="settings-panel">
648
+ <!-- 设置表单内容 -->
649
+ </div>
650
+ </Drawer>
651
+ ```
652
+
653
+ ### 筛选/搜索面板
654
+ ```svelte
655
+ <!-- 筛选控件 -->
656
+ <Drawer bind:visible={filtersOpen} position="right" width={350}>
657
+ <div class="filters">
658
+ <!-- 筛选控件 -->
659
+ </div>
660
+ </Drawer>
661
+ ```
662
+
663
+ ### 购物车
664
+ ```svelte
665
+ <!-- 购物车抽屉 -->
666
+ <Drawer bind:visible={cartOpen} position="right" width={400}>
667
+ <div class="cart">
668
+ <!-- 购物车项目和结账 -->
669
+ </div>
670
+ </Drawer>
671
+ ```
672
+
673
+ ## 注意事项
674
+
675
+ - 抽屉使用固定定位,显示在所有其他内容之上
676
+ - 遮罩背景的 z-index 为 100
677
+ - 如果抽屉内容超过视口高度,会自动滚动
678
+ - 抽屉自动处理显示/隐藏状态管理
679
+ - 点击外部行为是内置的,无法禁用