@kubex/zinc 1.0.25 → 1.0.99
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/.claude/project.md +556 -0
- package/.github/workflows/js_build_and_deploy.yaml +9 -10
- package/dist/custom-elements.json +13575 -8856
- package/dist/vscode.html-custom-data.json +583 -48
- package/dist/web-types.json +1441 -181
- package/dist/zn.d.ts +1645 -660
- package/dist/zn.min.css +1 -1
- package/dist/zn.min.js +1412 -893
- package/docs/_utilities/code-previews.cjs +10 -1
- package/docs/assets/scripts/docs.js +42 -18
- package/docs/data/data-table.json +229 -66
- package/docs/data/empty.json +6 -0
- package/docs/data/products-table.json +41 -193
- package/docs/pages/components/action-bar.md +121 -6
- package/docs/pages/components/alert.md +118 -15
- package/docs/pages/components/animated-button.md +299 -0
- package/docs/pages/components/audio-select.md +534 -0
- package/docs/pages/components/bulk-actions.md +79 -5
- package/docs/pages/components/button-group.md +235 -27
- package/docs/pages/components/button.md +139 -1
- package/docs/pages/components/chart.md +365 -9
- package/docs/pages/components/checkbox.md +387 -58
- package/docs/pages/components/chip.md +253 -33
- package/docs/pages/components/collapsible.md +393 -46
- package/docs/pages/components/cols.md +152 -30
- package/docs/pages/components/confirm.md +182 -16
- package/docs/pages/components/copy-button.md +169 -6
- package/docs/pages/components/data-select.md +194 -15
- package/docs/pages/components/data-table-filter.md +96 -5
- package/docs/pages/components/data-table-search.md +451 -0
- package/docs/pages/components/data-table-sort.md +66 -5
- package/docs/pages/components/data-table.md +727 -66
- package/docs/pages/components/datepicker.md +402 -7
- package/docs/pages/components/defined-label.md +120 -5
- package/docs/pages/components/dialog.md +339 -59
- package/docs/pages/components/dropdown.md +366 -11
- package/docs/pages/components/editor.md +604 -7
- package/docs/pages/components/empty-state.md +315 -16
- package/docs/pages/components/expanding-action.md +212 -28
- package/docs/pages/components/file.md +421 -12
- package/docs/pages/components/filter-container.md +158 -5
- package/docs/pages/components/filter-wrapper.md +167 -6
- package/docs/pages/components/form-group.md +383 -6
- package/docs/pages/components/hover-container.md +237 -6
- package/docs/pages/components/icon-picker.md +121 -0
- package/docs/pages/components/icon.md +454 -48
- package/docs/pages/components/inline-edit.md +787 -19
- package/docs/pages/components/input-group.md +207 -13
- package/docs/pages/components/input.md +194 -0
- package/docs/pages/components/item.md +18 -0
- package/docs/pages/components/key-container.md +115 -0
- package/docs/pages/components/key.md +101 -0
- package/docs/pages/components/menu.md +512 -6
- package/docs/pages/components/note.md +239 -36
- package/docs/pages/components/opt-group.md +107 -0
- package/docs/pages/components/pagination.md +332 -6
- package/docs/pages/components/pane.md +222 -6
- package/docs/pages/components/panel.md +213 -26
- package/docs/pages/components/popup.md +1354 -6
- package/docs/pages/components/priority-list.md +233 -0
- package/docs/pages/components/progress-bar.md +387 -6
- package/docs/pages/components/radio-group.md +242 -5
- package/docs/pages/components/radio.md +474 -6
- package/docs/pages/components/rating.md +331 -7
- package/docs/pages/components/reveal.md +524 -6
- package/docs/pages/components/scroll-container.md +552 -6
- package/docs/pages/components/select.md +762 -160
- package/docs/pages/components/skeleton.md +473 -30
- package/docs/pages/components/slideout.md +261 -5
- package/docs/pages/components/sp.md +99 -41
- package/docs/pages/components/split-button.md +347 -9
- package/docs/pages/components/split-pane.md +445 -6
- package/docs/pages/components/stat.md +549 -9
- package/docs/pages/components/status-indicator.md +230 -1
- package/docs/pages/components/stepper.md +563 -6
- package/docs/pages/components/tabs.md +439 -13
- package/docs/pages/components/textarea.md +415 -17
- package/docs/pages/components/tile.md +385 -26
- package/docs/pages/components/toggle.md +424 -6
- package/docs/pages/components/tooltip.md +367 -0
- package/docs/pages/components/translation-group.md +210 -0
- package/docs/pages/components/translations.md +319 -19
- package/docs/pages/components/vertical-stepper.md +401 -8
- package/docs/pages/components/well.md +300 -3
- package/docs/pages/getting-started/form-controls.md +162 -0
- package/docs/pages/index.md +116 -15
- package/package.json +5 -6
- package/scss/_global-spacing.scss +4 -0
- package/scss/_root.scss +2 -2
- package/scss/boot.scss +19 -0
- package/scss/shared/layout.scss +5 -0
- package/scss/themes/_light.scss +3 -3
- package/src/components/alert/alert.scss +1 -0
- package/src/components/animated-button/README.md +306 -0
- package/src/components/animated-button/animated-button.component.ts +229 -0
- package/src/components/animated-button/animated-button.scss +228 -0
- package/src/components/animated-button/animated-button.test.ts +143 -0
- package/src/components/animated-button/index.ts +12 -0
- package/src/components/button/button.component.ts +5 -0
- package/src/components/button-group/button-group.component.ts +25 -13
- package/src/components/button-group/button-group.scss +6 -0
- package/src/components/checkbox/checkbox.component.ts +4 -0
- package/src/components/checkbox/checkbox.scss +7 -4
- package/src/components/checkbox-group/checkbox-group.scss +7 -0
- package/src/components/chip/chip.component.ts +7 -2
- package/src/components/chip/chip.scss +16 -2
- package/src/components/collapsible/collapsible.component.ts +27 -20
- package/src/components/cols/cols.component.ts +14 -2
- package/src/components/cols/cols.scss +6 -12
- package/src/components/confirm/confirm.component.ts +7 -0
- package/src/components/copy-button/copy-button.component.ts +12 -11
- package/src/components/data-select/data-select.component.ts +215 -44
- package/src/components/data-select/data-select.scss +66 -6
- package/src/components/data-select/providers/currency-data-provider.ts +20 -6
- package/src/components/data-select/providers/provider.ts +1 -0
- package/src/components/data-select/providers/us-state-data-provider.ts +68 -0
- package/src/components/data-table/data-table.component.ts +81 -22
- package/src/components/data-table-search/data-table-search.component.ts +184 -0
- package/src/components/data-table-search/data-table-search.scss +17 -0
- package/src/components/data-table-search/data-table-search.test.ts +11 -0
- package/src/components/data-table-search/index.ts +12 -0
- package/src/components/datepicker/datepicker.component.ts +347 -13
- package/src/components/dialog/dialog.component.ts +1 -1
- package/src/components/empty-state/empty-state.scss +6 -1
- package/src/components/header/header.scss +3 -3
- package/src/components/icon/icon.component.ts +23 -1
- package/src/components/icon/icon.scss +23 -0
- package/src/components/icon-picker/brand-icons.ts +24 -0
- package/src/components/icon-picker/icon-picker.component.ts +407 -0
- package/src/components/icon-picker/icon-picker.scss +205 -0
- package/src/components/icon-picker/index.ts +12 -0
- package/src/components/icon-picker/line-icons.ts +612 -0
- package/src/components/icon-picker/material-icons.ts +14543 -0
- package/src/components/inline-edit/inline-edit.component.ts +190 -46
- package/src/components/inline-edit/inline-edit.scss +29 -0
- package/src/components/inline-edit/inline-edit.test.ts +314 -1
- package/src/components/input/input.component.ts +324 -5
- package/src/components/input/input.scss +87 -0
- package/src/components/input-group/input-group.component.ts +28 -7
- package/src/components/input-group/input-group.scss +48 -10
- package/src/components/item/item.component.ts +24 -3
- package/src/components/item/item.scss +18 -0
- package/src/components/key/index.ts +12 -0
- package/src/components/key/key.component.ts +47 -0
- package/src/components/key/key.scss +38 -0
- package/src/components/key-container/index.ts +12 -0
- package/src/components/key-container/key-container.component.ts +142 -0
- package/src/components/key-container/key-container.scss +33 -0
- package/src/components/menu-item/menu-item.component.ts +20 -0
- package/src/components/menu-item/menu-item.scss +69 -2
- package/src/components/navbar/navbar.component.ts +103 -11
- package/src/components/navbar/navbar.scss +6 -1
- package/src/components/opt-group/index.ts +12 -0
- package/src/components/opt-group/opt-group.component.ts +74 -0
- package/src/components/opt-group/opt-group.scss +37 -0
- package/src/components/opt-group/opt-group.test.ts +27 -0
- package/src/components/option/option.component.ts +1 -16
- package/src/components/option/option.scss +4 -0
- package/src/components/panel/panel.component.ts +10 -8
- package/src/components/panel/panel.scss +20 -0
- package/src/components/priority-list/index.ts +12 -0
- package/src/components/priority-list/priority-list.component.ts +611 -0
- package/src/components/priority-list/priority-list.scss +185 -0
- package/src/components/priority-list/priority-list.test.ts +139 -0
- package/src/components/progress-bar/progress-bar.component.ts +22 -16
- package/src/components/radio/radio.scss +10 -3
- package/src/components/select/select.component.ts +812 -72
- package/src/components/select/select.scss +108 -2
- package/src/components/select/select.test.ts +147 -2
- package/src/components/settings-container/settings-container.component.ts +44 -19
- package/src/components/settings-container/settings-container.scss +1 -1
- package/src/components/skeleton/skeleton.component.ts +6 -1
- package/src/components/slideout/slideout.scss +8 -3
- package/src/components/sp/sp.component.ts +3 -1
- package/src/components/sp/sp.scss +19 -0
- package/src/components/stepper/stepper.component.ts +16 -10
- package/src/components/textarea/textarea.scss +0 -4
- package/src/components/tile/tile.component.ts +12 -3
- package/src/components/tile/tile.scss +1 -1
- package/src/components/timer/timer.component.ts +15 -2
- package/src/components/toggle/toggle.component.ts +29 -26
- package/src/components/toggle/toggle.scss +13 -1
- package/src/components/translation-group/index.ts +12 -0
- package/src/components/translation-group/translation-group.component.ts +207 -0
- package/src/components/translation-group/translation-group.scss +8 -0
- package/src/components/translations/translations.component.ts +90 -44
- package/src/components/translations/translations.scss +4 -0
- package/src/components/vertical-stepper/vertical-stepper.component.ts +14 -9
- package/src/events/events.ts +12 -7
- package/src/events/zn-language-change.ts +7 -0
- package/src/events/zn-purchase.ts +11 -0
- package/src/events/zn-redirect.ts +7 -0
- package/src/events/zn-reorder.ts +7 -0
- package/src/events/zn-search-change.ts +11 -0
- package/src/events/zn-submit.ts +1 -1
- package/src/form-control.scss +4 -0
- package/src/internal/form-navigation.ts +510 -0
- package/src/internal/form.ts +6 -0
- package/src/zinc.ts +91 -83
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Animated Button
|
|
4
|
+
description: A stateful button component for purchase flows with built-in loading, success, and error states with smooth animations.
|
|
5
|
+
layout: component
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
```html:preview
|
|
9
|
+
<zn-animated-button></zn-animated-button>
|
|
10
|
+
|
|
11
|
+
<script>
|
|
12
|
+
document.querySelector('zn-animated-button').addEventListener('zn-purchase', async (event) => {
|
|
13
|
+
const { setSuccess } = event.detail;
|
|
14
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
15
|
+
setSuccess();
|
|
16
|
+
});
|
|
17
|
+
</script>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The Animated Button component manages the complete purchase flow through four distinct states: Idle (blue), Processing (blue with shimmer animation), Success (green with animated color fill and drawing checkmark), and Failure (red with error message). It automatically handles state transitions, disables during processing to prevent double-submission, and includes smooth, professional animations throughout including a satisfying "swoosh" checkmark that draws itself on success.
|
|
21
|
+
|
|
22
|
+
## Examples
|
|
23
|
+
|
|
24
|
+
### Basic Usage
|
|
25
|
+
|
|
26
|
+
The button emits a `zn-purchase` event when clicked. Use the provided `setSuccess()` and `setFailure()` functions to control the button state based on your purchase logic.
|
|
27
|
+
|
|
28
|
+
```html:preview
|
|
29
|
+
<zn-animated-button id="basic-example"></zn-animated-button>
|
|
30
|
+
|
|
31
|
+
<script>
|
|
32
|
+
document.getElementById('basic-example').addEventListener('zn-purchase', async (event) => {
|
|
33
|
+
const { setSuccess, setFailure } = event.detail;
|
|
34
|
+
|
|
35
|
+
// Simulate API call
|
|
36
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
37
|
+
|
|
38
|
+
// Random success or failure for demo
|
|
39
|
+
if (Math.random() > 0.3) {
|
|
40
|
+
setSuccess();
|
|
41
|
+
} else {
|
|
42
|
+
setFailure('Payment declined');
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
</script>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Custom Text Labels
|
|
49
|
+
|
|
50
|
+
Customize the text displayed in each state using the text attributes.
|
|
51
|
+
|
|
52
|
+
```html:preview
|
|
53
|
+
<zn-animated-button
|
|
54
|
+
id="custom-text-example"
|
|
55
|
+
idle-text="Buy Now"
|
|
56
|
+
processing-text="Processing Payment"
|
|
57
|
+
success-text="Payment Complete"
|
|
58
|
+
failure-text="Transaction Failed"
|
|
59
|
+
></zn-animated-button>
|
|
60
|
+
|
|
61
|
+
<script>
|
|
62
|
+
document.getElementById('custom-text-example').addEventListener('zn-purchase', async (event) => {
|
|
63
|
+
const { setSuccess } = event.detail;
|
|
64
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
65
|
+
setSuccess();
|
|
66
|
+
});
|
|
67
|
+
</script>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Error Handling
|
|
71
|
+
|
|
72
|
+
Display custom error messages when the purchase fails. The button automatically resets to idle state after 2 seconds.
|
|
73
|
+
|
|
74
|
+
```html:preview
|
|
75
|
+
<zn-animated-button id="error-example"></zn-animated-button>
|
|
76
|
+
|
|
77
|
+
<script>
|
|
78
|
+
document.getElementById('error-example').addEventListener('zn-purchase', async (event) => {
|
|
79
|
+
const { setFailure } = event.detail;
|
|
80
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
81
|
+
setFailure('Insufficient funds');
|
|
82
|
+
});
|
|
83
|
+
</script>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Manual State Control
|
|
87
|
+
|
|
88
|
+
Control the button state programmatically using the component's methods.
|
|
89
|
+
|
|
90
|
+
```html:preview
|
|
91
|
+
<zn-animated-button id="manual-example"></zn-animated-button>
|
|
92
|
+
|
|
93
|
+
<br><br>
|
|
94
|
+
|
|
95
|
+
<zn-button-group>
|
|
96
|
+
<zn-button color="success" onclick="document.getElementById('manual-example').setSuccess()">
|
|
97
|
+
Trigger Success
|
|
98
|
+
</zn-button>
|
|
99
|
+
<zn-button color="error" onclick="document.getElementById('manual-example').setFailure('Network error')">
|
|
100
|
+
Trigger Failure
|
|
101
|
+
</zn-button>
|
|
102
|
+
<zn-button color="secondary" onclick="document.getElementById('manual-example').reset()">
|
|
103
|
+
Reset
|
|
104
|
+
</zn-button>
|
|
105
|
+
</zn-button-group>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Redirect After Success
|
|
109
|
+
|
|
110
|
+
Specify a redirect URL to automatically navigate after successful purchase. The redirect happens after a configurable delay (default 1.5 seconds).
|
|
111
|
+
|
|
112
|
+
```html:preview
|
|
113
|
+
<zn-animated-button
|
|
114
|
+
id="redirect-example"
|
|
115
|
+
redirect-url="/thank-you"
|
|
116
|
+
redirect-delay="2000"
|
|
117
|
+
></zn-animated-button>
|
|
118
|
+
|
|
119
|
+
<script>
|
|
120
|
+
const redirectButton = document.getElementById('redirect-example');
|
|
121
|
+
|
|
122
|
+
redirectButton.addEventListener('zn-purchase', async (event) => {
|
|
123
|
+
const { setSuccess } = event.detail;
|
|
124
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
125
|
+
setSuccess();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
redirectButton.addEventListener('zn-redirect', (event) => {
|
|
129
|
+
alert('Would redirect to: ' + event.detail.url);
|
|
130
|
+
// Prevent actual redirect for demo
|
|
131
|
+
redirectButton.reset();
|
|
132
|
+
});
|
|
133
|
+
</script>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Custom Timing
|
|
137
|
+
|
|
138
|
+
Control how long the button stays in success state before redirecting and how long it stays in failure state before resetting.
|
|
139
|
+
|
|
140
|
+
```html:preview
|
|
141
|
+
<zn-animated-button
|
|
142
|
+
id="timing-example"
|
|
143
|
+
redirect-delay="3000"
|
|
144
|
+
failure-reset-delay="4000"
|
|
145
|
+
></zn-animated-button>
|
|
146
|
+
|
|
147
|
+
<br><br>
|
|
148
|
+
|
|
149
|
+
<zn-button-group>
|
|
150
|
+
<zn-button color="success" onclick="document.getElementById('timing-example').setSuccess()">
|
|
151
|
+
Success (3s delay)
|
|
152
|
+
</zn-button>
|
|
153
|
+
<zn-button color="error" onclick="document.getElementById('timing-example').setFailure('Error')">
|
|
154
|
+
Failure (4s reset)
|
|
155
|
+
</zn-button>
|
|
156
|
+
</zn-button-group>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Disabled State
|
|
160
|
+
|
|
161
|
+
The button can be disabled to prevent interaction.
|
|
162
|
+
|
|
163
|
+
```html:preview
|
|
164
|
+
<zn-animated-button disabled></zn-animated-button>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Integration with Form
|
|
168
|
+
|
|
169
|
+
The Purchase Button implements the `ZincFormControl` interface and can be used in forms.
|
|
170
|
+
|
|
171
|
+
```html:preview
|
|
172
|
+
<form id="purchase-form">
|
|
173
|
+
<zn-form-group>
|
|
174
|
+
<label>Amount</label>
|
|
175
|
+
<zn-input name="amount" type="number" value="100" required></zn-input>
|
|
176
|
+
</zn-form-group>
|
|
177
|
+
|
|
178
|
+
<zn-form-group>
|
|
179
|
+
<zn-animated-button
|
|
180
|
+
id="form-example"
|
|
181
|
+
name="purchase"
|
|
182
|
+
value="submit"
|
|
183
|
+
></zn-animated-button>
|
|
184
|
+
</zn-form-group>
|
|
185
|
+
</form>
|
|
186
|
+
|
|
187
|
+
<script>
|
|
188
|
+
document.getElementById('form-example').addEventListener('zn-purchase', async (event) => {
|
|
189
|
+
const { setSuccess, setFailure } = event.detail;
|
|
190
|
+
const form = document.getElementById('purchase-form');
|
|
191
|
+
|
|
192
|
+
if (!form.checkValidity()) {
|
|
193
|
+
setFailure('Please fill in all fields');
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const formData = new FormData(form);
|
|
198
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
199
|
+
|
|
200
|
+
// Simulate success
|
|
201
|
+
setSuccess();
|
|
202
|
+
});
|
|
203
|
+
</script>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## State Flow
|
|
207
|
+
|
|
208
|
+
The button transitions through four states:
|
|
209
|
+
|
|
210
|
+
1. **Idle** (Default): Blue background, shows idle text, ready for interaction
|
|
211
|
+
2. **Processing**: Triggered on click, button becomes disabled, shows spinner icon and shimmer animation
|
|
212
|
+
3. **Success**: Green background with animated check icon, auto-redirects after delay
|
|
213
|
+
4. **Failure**: Red background with error icon and message, auto-resets to Idle after delay
|
|
214
|
+
|
|
215
|
+
## Events
|
|
216
|
+
|
|
217
|
+
### `zn-purchase`
|
|
218
|
+
|
|
219
|
+
Emitted when the button is clicked in idle state. The event detail contains:
|
|
220
|
+
|
|
221
|
+
- `value`: The form control value
|
|
222
|
+
- `setSuccess()`: Function to transition to success state
|
|
223
|
+
- `setFailure(message?: string)`: Function to transition to failure state
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
button.addEventListener('zn-purchase', async (event) => {
|
|
227
|
+
const { value, setSuccess, setFailure } = event.detail;
|
|
228
|
+
|
|
229
|
+
try {
|
|
230
|
+
const response = await fetch('/api/purchase', {
|
|
231
|
+
method: 'POST',
|
|
232
|
+
body: JSON.stringify({ value })
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
if (response.ok) {
|
|
236
|
+
setSuccess();
|
|
237
|
+
} else {
|
|
238
|
+
setFailure('Payment failed');
|
|
239
|
+
}
|
|
240
|
+
} catch (error) {
|
|
241
|
+
setFailure(error.message);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### `zn-redirect`
|
|
247
|
+
|
|
248
|
+
Emitted when the redirect timer completes after success state. The event detail contains:
|
|
249
|
+
|
|
250
|
+
- `url`: The redirect URL
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
button.addEventListener('zn-redirect', (event) => {
|
|
254
|
+
console.log('Redirecting to:', event.detail.url);
|
|
255
|
+
// Custom redirect logic can be implemented here
|
|
256
|
+
});
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Methods
|
|
260
|
+
|
|
261
|
+
### `purchase(): Promise<void>`
|
|
262
|
+
|
|
263
|
+
Programmatically trigger the purchase flow.
|
|
264
|
+
|
|
265
|
+
```javascript
|
|
266
|
+
await button.purchase();
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### `setSuccess(): void`
|
|
270
|
+
|
|
271
|
+
Manually transition to success state. Starts the redirect timer.
|
|
272
|
+
|
|
273
|
+
```javascript
|
|
274
|
+
button.setSuccess();
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### `setFailure(message?: string): void`
|
|
278
|
+
|
|
279
|
+
Manually transition to failure state with optional error message. Starts the auto-reset timer.
|
|
280
|
+
|
|
281
|
+
```javascript
|
|
282
|
+
button.setFailure('Payment declined');
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### `reset(): void`
|
|
286
|
+
|
|
287
|
+
Reset the button to idle state, clearing any active timers.
|
|
288
|
+
|
|
289
|
+
```javascript
|
|
290
|
+
button.reset();
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Accessibility
|
|
294
|
+
|
|
295
|
+
- The button includes `aria-live="polite"` for screen reader announcements of state changes
|
|
296
|
+
- The button includes `aria-busy` attribute during processing state
|
|
297
|
+
- All animations respect the `prefers-reduced-motion` media query
|
|
298
|
+
- Focus states are clearly visible with proper outline styling
|
|
299
|
+
- Disabled state prevents all interaction and is properly announced to assistive technologies
|