@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
@@ -1 +1,679 @@
1
- # Drawer
1
+ # Drawer Component
2
+
3
+ A slide-out panel component built with Svelte, providing smooth side navigation and content display with configurable positioning and animations.
4
+
5
+ ## Features
6
+
7
+ - **Left/Right Positioning**: Configurable drawer position (left or right side)
8
+ - **Smooth Animations**: Fly-in transitions with customizable duration
9
+ - **Overlay Background**: Semi-transparent backdrop with click-to-close
10
+ - **Customizable Width**: Adjustable drawer width
11
+ - **Auto-Hide Management**: Intelligent visibility state management
12
+ - **Event Handling**: Click outside to close functionality
13
+ - **Responsive Design**: Adapts to different screen sizes
14
+ - **Accessibility Support**: Proper ARIA attributes
15
+ - **CSS Customization**: Themeable with CSS variables
16
+ - **Lightweight**: Minimal performance impact
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ npm install @ticatec/uniface-element
22
+ ```
23
+
24
+ ```typescript
25
+ import Drawer from '@ticatec/uniface-element/Drawer';
26
+ ```
27
+
28
+ Or if using within the same project:
29
+ ```typescript
30
+ import Drawer from '$lib/drawer';
31
+ ```
32
+
33
+ ## Basic Usage
34
+
35
+ ```svelte
36
+ <script>
37
+ import Drawer from '$lib/drawer';
38
+ import Button from '$lib/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="Open Drawer" onClick={openDrawer} />
52
+
53
+ <Drawer bind:visible={showDrawer}>
54
+ <div style="padding: 1rem;">
55
+ <h2>Drawer Content</h2>
56
+ <p>This is the drawer content area.</p>
57
+ <Button label="Close" onClick={closeDrawer} />
58
+ </div>
59
+ </Drawer>
60
+ ```
61
+
62
+ ## Props
63
+
64
+ | Prop | Type | Default | Description |
65
+ |------|------|---------|-------------|
66
+ | `visible` | `boolean` | `false` | Controls drawer visibility |
67
+ | `width` | `number` | `300` | Drawer width in pixels |
68
+ | `position` | `'left' \| 'right'` | `'left'` | Drawer slide-in position |
69
+
70
+ ## Examples
71
+
72
+ ### Basic Left Drawer
73
+
74
+ ```svelte
75
+ <script>
76
+ import Drawer from '$lib/drawer';
77
+
78
+ let leftDrawerVisible = false;
79
+ </script>
80
+
81
+ <button on:click={() => leftDrawerVisible = true}>
82
+ Open Left Drawer
83
+ </button>
84
+
85
+ <Drawer bind:visible={leftDrawerVisible}>
86
+ <div class="drawer-content">
87
+ <h3>Navigation Menu</h3>
88
+ <ul>
89
+ <li><a href="/home">Home</a></li>
90
+ <li><a href="/about">About</a></li>
91
+ <li><a href="/contact">Contact</a></li>
92
+ </ul>
93
+ </div>
94
+ </Drawer>
95
+ ```
96
+
97
+ ### Right Side Drawer
98
+
99
+ ```svelte
100
+ <script>
101
+ import Drawer from '$lib/drawer';
102
+
103
+ let rightDrawerVisible = false;
104
+ </script>
105
+
106
+ <button on:click={() => rightDrawerVisible = true}>
107
+ Open Right Drawer
108
+ </button>
109
+
110
+ <Drawer bind:visible={rightDrawerVisible} position="right">
111
+ <div class="drawer-content">
112
+ <h3>Settings Panel</h3>
113
+ <div class="setting-item">
114
+ <label>
115
+ <input type="checkbox" /> Enable notifications
116
+ </label>
117
+ </div>
118
+ <div class="setting-item">
119
+ <label>
120
+ <input type="checkbox" /> Dark mode
121
+ </label>
122
+ </div>
123
+ </div>
124
+ </Drawer>
125
+ ```
126
+
127
+ ### Custom Width Drawer
128
+
129
+ ```svelte
130
+ <script>
131
+ import Drawer from '$lib/drawer';
132
+
133
+ let wideDrawerVisible = false;
134
+ </script>
135
+
136
+ <button on:click={() => wideDrawerVisible = true}>
137
+ Open Wide Drawer
138
+ </button>
139
+
140
+ <Drawer bind:visible={wideDrawerVisible} width={400}>
141
+ <div class="drawer-content">
142
+ <h3>Wide Content Panel</h3>
143
+ <p>This drawer is wider to accommodate more content.</p>
144
+ <div class="content-grid">
145
+ <div class="card">Card 1</div>
146
+ <div class="card">Card 2</div>
147
+ <div class="card">Card 3</div>
148
+ </div>
149
+ </div>
150
+ </Drawer>
151
+ ```
152
+
153
+ ### Mobile Navigation Drawer
154
+
155
+ ```svelte
156
+ <script>
157
+ import Drawer from '$lib/drawer';
158
+ import Icon from '$lib/icon';
159
+
160
+ let mobileMenuVisible = false;
161
+
162
+ const menuItems = [
163
+ { label: 'Dashboard', icon: 'dashboard', href: '/dashboard' },
164
+ { label: 'Projects', icon: 'folder', href: '/projects' },
165
+ { label: 'Team', icon: 'people', href: '/team' },
166
+ { label: 'Settings', icon: 'settings', href: '/settings' }
167
+ ];
168
+
169
+ function closeMenu() {
170
+ mobileMenuVisible = false;
171
+ }
172
+ </script>
173
+
174
+ <!-- Mobile header with menu button -->
175
+ <header class="mobile-header">
176
+ <button class="menu-button" on:click={() => mobileMenuVisible = true}>
177
+ <Icon name="menu" />
178
+ </button>
179
+ <h1>My App</h1>
180
+ </header>
181
+
182
+ <!-- Mobile navigation drawer -->
183
+ <Drawer bind:visible={mobileMenuVisible} width={280}>
184
+ <nav class="mobile-nav">
185
+ <div class="nav-header">
186
+ <h2>Menu</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>John Doe</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
+ ### Filter/Search Drawer
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 = ['Electronics', 'Clothing', 'Books', 'Home & Garden'];
293
+
294
+ function applyFilters() {
295
+ console.log('Applying filters:', 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
+ Show Filters
311
+ </button>
312
+
313
+ <Drawer bind:visible={filterDrawerVisible} position="right" width={350}>
314
+ <div class="filter-panel">
315
+ <div class="filter-header">
316
+ <h3>Filters</h3>
317
+ <button class="reset-button" on:click={resetFilters}>
318
+ Reset All
319
+ </button>
320
+ </div>
321
+
322
+ <div class="filter-section">
323
+ <label>Search:</label>
324
+ <TextEditor bind:value={filters.searchTerm} placeholder="Search products..." />
325
+ </div>
326
+
327
+ <div class="filter-section">
328
+ <label>Categories:</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>Price Range:</label>
346
+ <div class="price-inputs">
347
+ <input type="number" bind:value={filters.priceRange.min} min="0" />
348
+ <span>to</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="In Stock Only"
356
+ bind:checked={filters.inStock}
357
+ />
358
+ </div>
359
+
360
+ <div class="filter-actions">
361
+ <Button label="Apply Filters" 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
+ ## Animation and Transitions
423
+
424
+ The drawer uses Svelte's `fly` transition with the following behavior:
425
+
426
+ - **Slide Direction**: Based on position (left slides from left, right slides from right)
427
+ - **Duration**: 1000ms (1 second) by default
428
+ - **Opacity**: Starts at 0.5 and fades to 1.0
429
+ - **Easing**: Linear transition
430
+
431
+ ### Customizing Animation
432
+
433
+ While the component doesn't expose animation props directly, you can modify the transition by editing the component or using CSS transitions:
434
+
435
+ ```css
436
+ .uniface-drawer > div {
437
+ transition: transform 0.3s ease-out;
438
+ }
439
+ ```
440
+
441
+ ## Interaction Patterns
442
+
443
+ ### Click Outside to Close
444
+
445
+ The drawer automatically closes when clicking on the overlay background:
446
+
447
+ ```svelte
448
+ <!-- This behavior is built-in -->
449
+ <Drawer bind:visible={showDrawer}>
450
+ <!-- Clicking outside this content area will close the drawer -->
451
+ </Drawer>
452
+ ```
453
+
454
+ ### Prevent Close on Content Click
455
+
456
+ Content clicks are automatically prevented from bubbling to the overlay:
457
+
458
+ ```svelte
459
+ <Drawer bind:visible={showDrawer}>
460
+ <!-- Clicking inside here won't close the drawer -->
461
+ <div>
462
+ <button>This won't close the drawer</button>
463
+ </div>
464
+ </Drawer>
465
+ ```
466
+
467
+ ### Manual Close Control
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
+ // Close on Escape key
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
+ ✕ Close
493
+ </button>
494
+ <!-- Content -->
495
+ </div>
496
+ </Drawer>
497
+ ```
498
+
499
+ ## Styling
500
+
501
+ ### CSS Variables
502
+
503
+ The drawer can be customized using CSS variables:
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
+ ### Custom Styling
514
+
515
+ ```css
516
+ /* Dark theme drawer */
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
+ /* Rounded drawer */
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
+ /* Custom overlay */
534
+ .custom-overlay .uniface-drawer {
535
+ background-color: rgba(0, 0, 0, 0.7);
536
+ backdrop-filter: blur(4px);
537
+ }
538
+ ```
539
+
540
+ ### Responsive Design
541
+
542
+ ```scss
543
+ .drawer-content {
544
+ padding: 1rem;
545
+
546
+ @media (max-width: 768px) {
547
+ padding: 0.5rem;
548
+ }
549
+ }
550
+
551
+ /* Full-width drawer on mobile */
552
+ @media (max-width: 480px) {
553
+ .uniface-drawer > div {
554
+ width: 100% !important;
555
+ }
556
+ }
557
+ ```
558
+
559
+ ## Accessibility
560
+
561
+ - **ARIA Attributes**: The drawer includes appropriate `aria-hidden` attributes
562
+ - **Focus Management**: Consider adding focus trapping for better accessibility
563
+ - **Keyboard Support**: Implement Escape key handling for closing
564
+ - **Screen Reader Support**: Add descriptive labels and roles
565
+
566
+ ### Enhanced Accessibility Example
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
+ // Focus first interactive element when opened
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="Open navigation menu">
594
+ Open Menu
595
+ </button>
596
+
597
+ <Drawer bind:visible={drawerVisible}>
598
+ <nav bind:this={drawerContent} aria-label="Main navigation" role="navigation">
599
+ <h2 id="drawer-title">Navigation Menu</h2>
600
+ <!-- Content with proper focus management -->
601
+ </nav>
602
+ </Drawer>
603
+ ```
604
+
605
+ ## Best Practices
606
+
607
+ ### 1. Content Organization
608
+ - Keep drawer content focused and organized
609
+ - Use clear headings and sections
610
+ - Limit content to essential items
611
+
612
+ ### 2. Width Guidelines
613
+ - **Mobile**: Use 80-90% of screen width or full width
614
+ - **Tablet**: 300-400px is typically appropriate
615
+ - **Desktop**: 250-350px for navigation, up to 500px for detailed content
616
+
617
+ ### 3. Performance
618
+ - Avoid heavy content in drawers that open frequently
619
+ - Use lazy loading for complex drawer content
620
+ - Consider virtualization for long lists
621
+
622
+ ### 4. User Experience
623
+ - Provide clear close buttons or instructions
624
+ - Use consistent positioning across your application
625
+ - Ensure touch-friendly targets on mobile devices
626
+
627
+ ## Common Use Cases
628
+
629
+ ### Navigation Drawer
630
+ ```svelte
631
+ <!-- Mobile-first navigation -->
632
+ <Drawer bind:visible={navOpen} width={280}>
633
+ <nav>
634
+ <ul>
635
+ <li><a href="/">Home</a></li>
636
+ <li><a href="/products">Products</a></li>
637
+ <li><a href="/contact">Contact</a></li>
638
+ </ul>
639
+ </nav>
640
+ </Drawer>
641
+ ```
642
+
643
+ ### Settings Panel
644
+ ```svelte
645
+ <!-- Right-side settings -->
646
+ <Drawer bind:visible={settingsOpen} position="right" width={400}>
647
+ <div class="settings-panel">
648
+ <!-- Settings form content -->
649
+ </div>
650
+ </Drawer>
651
+ ```
652
+
653
+ ### Filter/Search Panel
654
+ ```svelte
655
+ <!-- Filter controls -->
656
+ <Drawer bind:visible={filtersOpen} position="right" width={350}>
657
+ <div class="filters">
658
+ <!-- Filter controls -->
659
+ </div>
660
+ </Drawer>
661
+ ```
662
+
663
+ ### Shopping Cart
664
+ ```svelte
665
+ <!-- Shopping cart drawer -->
666
+ <Drawer bind:visible={cartOpen} position="right" width={400}>
667
+ <div class="cart">
668
+ <!-- Cart items and checkout -->
669
+ </div>
670
+ </Drawer>
671
+ ```
672
+
673
+ ## Notes
674
+
675
+ - The drawer uses fixed positioning and appears above all other content
676
+ - The overlay background has a z-index of 100
677
+ - Content inside the drawer is scrollable if it exceeds the viewport height
678
+ - The drawer automatically handles show/hide state management
679
+ - Click outside behavior is built-in and cannot be disabled