@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.
- package/dist/accordion/README.md +169 -0
- package/dist/accordion/README_CN.md +176 -0
- package/dist/action-bar/README.md +275 -0
- package/dist/action-bar/README_CN.md +285 -0
- package/dist/app-layout/README.md +374 -0
- package/dist/app-layout/README_CN.md +381 -0
- package/dist/app-top-bar/README.md +357 -0
- package/dist/app-top-bar/README_CN.md +365 -0
- package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
- package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
- package/dist/base-calendar/CalendarBase.svelte +0 -3
- package/dist/box/README.md +385 -0
- package/dist/box/README_CN.md +393 -0
- package/dist/breadcrumbs/README.md +442 -0
- package/dist/breadcrumbs/README_CN.md +442 -0
- package/dist/button/Button.svelte +27 -7
- package/dist/button/Button.svelte.d.ts +3 -1
- package/dist/button/IconButton.svelte +26 -6
- package/dist/button/IconButton.svelte.d.ts +3 -1
- package/dist/button/IconButton_README.md +513 -0
- package/dist/button/IconButton_README_CN.md +513 -0
- package/dist/button/README.md +428 -0
- package/dist/button/README_CN.md +428 -0
- package/dist/button/TextButton.svelte +26 -6
- package/dist/button/TextButton.svelte.d.ts +3 -1
- package/dist/button/TextButton_README.md +571 -0
- package/dist/button/TextButton_README_CN.md +571 -0
- package/dist/card/README.md +666 -0
- package/dist/card/README_CN.md +666 -0
- package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
- package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
- package/dist/cascade-options-select/README.md +663 -2
- package/dist/cascade-options-select/README_CN.md +664 -0
- package/dist/checkbox/CheckBox.svelte +20 -6
- package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
- package/dist/checkbox/README.md +562 -0
- package/dist/checkbox/README_CN.md +727 -0
- package/dist/common-editor/NumberInput.svelte +39 -26
- package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
- package/dist/concise-data-table/ConciseListTable.svelte +133 -36
- package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
- package/dist/concise-data-table/DataCell.svelte +5 -6
- package/dist/concise-data-table/DataRow.svelte +22 -2
- package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
- package/dist/concise-data-table/README.md +606 -0
- package/dist/concise-data-table/README_CN.md +611 -0
- package/dist/context-menu/ContextMenu.svelte +138 -21
- package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
- package/dist/context-menu/ContextMenuItem.d.ts +20 -4
- package/dist/context-menu/README.md +551 -0
- package/dist/context-menu/README_CN.md +551 -0
- package/dist/criteria-field/CriteriaField.svelte +3 -5
- package/dist/criteria-field/README.md +532 -0
- package/dist/criteria-field/README_CN.md +532 -0
- package/dist/data-table/README.md +712 -0
- package/dist/data-table/README_CN.md +712 -0
- package/dist/date-picker/DatePicker.svelte +44 -7
- package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
- package/dist/date-picker/DateTimePicker.svelte +32 -8
- package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
- package/dist/date-picker/README.md +326 -0
- package/dist/date-picker/README_CN.md +316 -0
- package/dist/date-picker/ScrollBar.svelte +18 -8
- package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
- package/dist/date-picker/TimePanel.svelte +5 -5
- package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
- package/dist/date-range/README.md +374 -0
- package/dist/date-range/README_CN.md +374 -0
- package/dist/dialog/DialogBoard.svelte +1 -1
- package/dist/dialog/README.md +596 -0
- package/dist/dialog/README_CN.md +596 -0
- package/dist/drawer/README.md +679 -1
- package/dist/drawer/README_CN.md +679 -0
- package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
- package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
- package/dist/group-box/group-check-box/README.md +749 -0
- package/dist/group-box/group-check-box/README_CN.md +750 -0
- package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
- package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
- package/dist/group-box/group-radio-box/README.md +920 -0
- package/dist/group-box/group-radio-box/README_CN.md +920 -0
- package/dist/image-files/README.md +1346 -0
- package/dist/image-files/README_CN.md +1346 -0
- package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
- package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
- package/dist/lib/forwardAllEvents.d.ts +3 -0
- package/dist/lib/forwardAllEvents.js +24 -0
- package/dist/list-box/README.md +579 -0
- package/dist/list-box/README_CN.md +682 -0
- package/dist/lookup-editor/LookupEditor.svelte +15 -3
- package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
- package/dist/lookup-editor/README.md +684 -0
- package/dist/lookup-editor/README_CN.md +684 -0
- package/dist/memo-editor/MemoEditor.svelte +77 -27
- package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
- package/dist/memo-editor/README.md +819 -0
- package/dist/memo-editor/README_CN.md +819 -0
- package/dist/message-box/README.md +398 -0
- package/dist/message-box/README_CN.md +398 -0
- package/dist/number-editor/NumberEditor.svelte +2 -2
- package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
- package/dist/number-editor/README.md +353 -22
- package/dist/number-editor/README_CN.md +357 -0
- package/dist/number-range/README.md +443 -0
- package/dist/number-range/README_CN.md +443 -0
- package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
- package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
- package/dist/options-multi-select/README.md +480 -0
- package/dist/options-multi-select/README_CN.md +480 -0
- package/dist/options-select/OptionsSelect.svelte +36 -5
- package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
- package/dist/options-select/README.md +632 -0
- package/dist/options-select/README_CN.md +632 -0
- package/dist/page/README.md +605 -0
- package/dist/page/README_CN.md +605 -0
- package/dist/pagination/README.md +946 -0
- package/dist/pagination/README_CN.md +946 -0
- package/dist/pagination-panel/README.md +1075 -0
- package/dist/pagination-panel/README_CN.md +1075 -0
- package/dist/popup-hint/README.md +841 -0
- package/dist/popup-hint/README_CN.md +840 -0
- package/dist/progress-bar/README.md +242 -0
- package/dist/progress-bar/README_CN.md +242 -0
- package/dist/progress-step-bar/README.md +316 -0
- package/dist/progress-step-bar/README_CN.md +316 -0
- package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
- package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
- package/dist/prompts-text-editor/README.md +329 -0
- package/dist/prompts-text-editor/README_CN.md +329 -0
- package/dist/property-editor/README.md +969 -0
- package/dist/property-editor/README_CN.md +969 -0
- package/dist/radio-button/README.md +372 -0
- package/dist/radio-button/README_CN.md +372 -0
- package/dist/radio-button/RadioButton.svelte +32 -3
- package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
- package/dist/search-box/README.md +425 -0
- package/dist/search-box/README_CN.md +424 -0
- package/dist/search-box/SearchBox.svelte +22 -6
- package/dist/search-box/SearchBox.svelte.d.ts +4 -1
- package/dist/tabs/README.md +919 -0
- package/dist/tabs/README_CN.md +920 -0
- package/dist/tag/README.md +922 -0
- package/dist/tag/README_CN.md +922 -0
- package/dist/text-editor/PasswordEditor.svelte +17 -2
- package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
- package/dist/text-editor/PasswordEditor_README.md +551 -0
- package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
- package/dist/text-editor/README.md +466 -0
- package/dist/text-editor/README_CN.md +466 -0
- package/dist/text-editor/TextEditor.svelte +51 -19
- package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
- package/dist/ticatec-uniface-web.css +1 -0
- package/dist/time-editor/README.md +498 -24
- package/dist/time-editor/README_CN.md +498 -0
- package/dist/time-editor/TimeEditor.svelte +7 -3
- package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
- package/dist/toast/README.md +667 -0
- package/dist/toast/README_CN.md +667 -0
- package/dist/transfer/README.md +795 -0
- package/dist/transfer/Transfer.svelte +6 -4
- package/dist/transfer/Transfer.svelte.d.ts +3 -1
- package/dist/tree-view/README.md +761 -0
- package/dist/tree-view/README_CN.md +761 -0
- package/dist/tree-view/TreeView.svelte +5 -3
- package/dist/tree-view/TreeView.svelte.d.ts +3 -1
- package/dist/unit-number-editor/README.md +546 -20
- package/dist/unit-number-editor/README_CN.md +525 -0
- package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
- package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
- package/docs/form-field/cn/README_CN.md +364 -0
- package/docs/form-field/en/README.md +364 -0
- package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
- package/docs/form-panel/flex-form/en/README.md +586 -0
- package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
- package/docs/form-panel/flex-row-form/en/README.md +787 -0
- package/docs/form-panel/grid-form/en/README.md +744 -0
- package/package.json +1 -1
- package/dist/drawer/README-CN.md +0 -1
package/dist/drawer/README.md
CHANGED
|
@@ -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
|