@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.
Files changed (199) hide show
  1. package/.claude/project.md +556 -0
  2. package/.github/workflows/js_build_and_deploy.yaml +9 -10
  3. package/dist/custom-elements.json +13575 -8856
  4. package/dist/vscode.html-custom-data.json +583 -48
  5. package/dist/web-types.json +1441 -181
  6. package/dist/zn.d.ts +1645 -660
  7. package/dist/zn.min.css +1 -1
  8. package/dist/zn.min.js +1412 -893
  9. package/docs/_utilities/code-previews.cjs +10 -1
  10. package/docs/assets/scripts/docs.js +42 -18
  11. package/docs/data/data-table.json +229 -66
  12. package/docs/data/empty.json +6 -0
  13. package/docs/data/products-table.json +41 -193
  14. package/docs/pages/components/action-bar.md +121 -6
  15. package/docs/pages/components/alert.md +118 -15
  16. package/docs/pages/components/animated-button.md +299 -0
  17. package/docs/pages/components/audio-select.md +534 -0
  18. package/docs/pages/components/bulk-actions.md +79 -5
  19. package/docs/pages/components/button-group.md +235 -27
  20. package/docs/pages/components/button.md +139 -1
  21. package/docs/pages/components/chart.md +365 -9
  22. package/docs/pages/components/checkbox.md +387 -58
  23. package/docs/pages/components/chip.md +253 -33
  24. package/docs/pages/components/collapsible.md +393 -46
  25. package/docs/pages/components/cols.md +152 -30
  26. package/docs/pages/components/confirm.md +182 -16
  27. package/docs/pages/components/copy-button.md +169 -6
  28. package/docs/pages/components/data-select.md +194 -15
  29. package/docs/pages/components/data-table-filter.md +96 -5
  30. package/docs/pages/components/data-table-search.md +451 -0
  31. package/docs/pages/components/data-table-sort.md +66 -5
  32. package/docs/pages/components/data-table.md +727 -66
  33. package/docs/pages/components/datepicker.md +402 -7
  34. package/docs/pages/components/defined-label.md +120 -5
  35. package/docs/pages/components/dialog.md +339 -59
  36. package/docs/pages/components/dropdown.md +366 -11
  37. package/docs/pages/components/editor.md +604 -7
  38. package/docs/pages/components/empty-state.md +315 -16
  39. package/docs/pages/components/expanding-action.md +212 -28
  40. package/docs/pages/components/file.md +421 -12
  41. package/docs/pages/components/filter-container.md +158 -5
  42. package/docs/pages/components/filter-wrapper.md +167 -6
  43. package/docs/pages/components/form-group.md +383 -6
  44. package/docs/pages/components/hover-container.md +237 -6
  45. package/docs/pages/components/icon-picker.md +121 -0
  46. package/docs/pages/components/icon.md +454 -48
  47. package/docs/pages/components/inline-edit.md +787 -19
  48. package/docs/pages/components/input-group.md +207 -13
  49. package/docs/pages/components/input.md +194 -0
  50. package/docs/pages/components/item.md +18 -0
  51. package/docs/pages/components/key-container.md +115 -0
  52. package/docs/pages/components/key.md +101 -0
  53. package/docs/pages/components/menu.md +512 -6
  54. package/docs/pages/components/note.md +239 -36
  55. package/docs/pages/components/opt-group.md +107 -0
  56. package/docs/pages/components/pagination.md +332 -6
  57. package/docs/pages/components/pane.md +222 -6
  58. package/docs/pages/components/panel.md +213 -26
  59. package/docs/pages/components/popup.md +1354 -6
  60. package/docs/pages/components/priority-list.md +233 -0
  61. package/docs/pages/components/progress-bar.md +387 -6
  62. package/docs/pages/components/radio-group.md +242 -5
  63. package/docs/pages/components/radio.md +474 -6
  64. package/docs/pages/components/rating.md +331 -7
  65. package/docs/pages/components/reveal.md +524 -6
  66. package/docs/pages/components/scroll-container.md +552 -6
  67. package/docs/pages/components/select.md +762 -160
  68. package/docs/pages/components/skeleton.md +473 -30
  69. package/docs/pages/components/slideout.md +261 -5
  70. package/docs/pages/components/sp.md +99 -41
  71. package/docs/pages/components/split-button.md +347 -9
  72. package/docs/pages/components/split-pane.md +445 -6
  73. package/docs/pages/components/stat.md +549 -9
  74. package/docs/pages/components/status-indicator.md +230 -1
  75. package/docs/pages/components/stepper.md +563 -6
  76. package/docs/pages/components/tabs.md +439 -13
  77. package/docs/pages/components/textarea.md +415 -17
  78. package/docs/pages/components/tile.md +385 -26
  79. package/docs/pages/components/toggle.md +424 -6
  80. package/docs/pages/components/tooltip.md +367 -0
  81. package/docs/pages/components/translation-group.md +210 -0
  82. package/docs/pages/components/translations.md +319 -19
  83. package/docs/pages/components/vertical-stepper.md +401 -8
  84. package/docs/pages/components/well.md +300 -3
  85. package/docs/pages/getting-started/form-controls.md +162 -0
  86. package/docs/pages/index.md +116 -15
  87. package/package.json +5 -6
  88. package/scss/_global-spacing.scss +4 -0
  89. package/scss/_root.scss +2 -2
  90. package/scss/boot.scss +19 -0
  91. package/scss/shared/layout.scss +5 -0
  92. package/scss/themes/_light.scss +3 -3
  93. package/src/components/alert/alert.scss +1 -0
  94. package/src/components/animated-button/README.md +306 -0
  95. package/src/components/animated-button/animated-button.component.ts +229 -0
  96. package/src/components/animated-button/animated-button.scss +228 -0
  97. package/src/components/animated-button/animated-button.test.ts +143 -0
  98. package/src/components/animated-button/index.ts +12 -0
  99. package/src/components/button/button.component.ts +5 -0
  100. package/src/components/button-group/button-group.component.ts +25 -13
  101. package/src/components/button-group/button-group.scss +6 -0
  102. package/src/components/checkbox/checkbox.component.ts +4 -0
  103. package/src/components/checkbox/checkbox.scss +7 -4
  104. package/src/components/checkbox-group/checkbox-group.scss +7 -0
  105. package/src/components/chip/chip.component.ts +7 -2
  106. package/src/components/chip/chip.scss +16 -2
  107. package/src/components/collapsible/collapsible.component.ts +27 -20
  108. package/src/components/cols/cols.component.ts +14 -2
  109. package/src/components/cols/cols.scss +6 -12
  110. package/src/components/confirm/confirm.component.ts +7 -0
  111. package/src/components/copy-button/copy-button.component.ts +12 -11
  112. package/src/components/data-select/data-select.component.ts +215 -44
  113. package/src/components/data-select/data-select.scss +66 -6
  114. package/src/components/data-select/providers/currency-data-provider.ts +20 -6
  115. package/src/components/data-select/providers/provider.ts +1 -0
  116. package/src/components/data-select/providers/us-state-data-provider.ts +68 -0
  117. package/src/components/data-table/data-table.component.ts +81 -22
  118. package/src/components/data-table-search/data-table-search.component.ts +184 -0
  119. package/src/components/data-table-search/data-table-search.scss +17 -0
  120. package/src/components/data-table-search/data-table-search.test.ts +11 -0
  121. package/src/components/data-table-search/index.ts +12 -0
  122. package/src/components/datepicker/datepicker.component.ts +347 -13
  123. package/src/components/dialog/dialog.component.ts +1 -1
  124. package/src/components/empty-state/empty-state.scss +6 -1
  125. package/src/components/header/header.scss +3 -3
  126. package/src/components/icon/icon.component.ts +23 -1
  127. package/src/components/icon/icon.scss +23 -0
  128. package/src/components/icon-picker/brand-icons.ts +24 -0
  129. package/src/components/icon-picker/icon-picker.component.ts +407 -0
  130. package/src/components/icon-picker/icon-picker.scss +205 -0
  131. package/src/components/icon-picker/index.ts +12 -0
  132. package/src/components/icon-picker/line-icons.ts +612 -0
  133. package/src/components/icon-picker/material-icons.ts +14543 -0
  134. package/src/components/inline-edit/inline-edit.component.ts +190 -46
  135. package/src/components/inline-edit/inline-edit.scss +29 -0
  136. package/src/components/inline-edit/inline-edit.test.ts +314 -1
  137. package/src/components/input/input.component.ts +324 -5
  138. package/src/components/input/input.scss +87 -0
  139. package/src/components/input-group/input-group.component.ts +28 -7
  140. package/src/components/input-group/input-group.scss +48 -10
  141. package/src/components/item/item.component.ts +24 -3
  142. package/src/components/item/item.scss +18 -0
  143. package/src/components/key/index.ts +12 -0
  144. package/src/components/key/key.component.ts +47 -0
  145. package/src/components/key/key.scss +38 -0
  146. package/src/components/key-container/index.ts +12 -0
  147. package/src/components/key-container/key-container.component.ts +142 -0
  148. package/src/components/key-container/key-container.scss +33 -0
  149. package/src/components/menu-item/menu-item.component.ts +20 -0
  150. package/src/components/menu-item/menu-item.scss +69 -2
  151. package/src/components/navbar/navbar.component.ts +103 -11
  152. package/src/components/navbar/navbar.scss +6 -1
  153. package/src/components/opt-group/index.ts +12 -0
  154. package/src/components/opt-group/opt-group.component.ts +74 -0
  155. package/src/components/opt-group/opt-group.scss +37 -0
  156. package/src/components/opt-group/opt-group.test.ts +27 -0
  157. package/src/components/option/option.component.ts +1 -16
  158. package/src/components/option/option.scss +4 -0
  159. package/src/components/panel/panel.component.ts +10 -8
  160. package/src/components/panel/panel.scss +20 -0
  161. package/src/components/priority-list/index.ts +12 -0
  162. package/src/components/priority-list/priority-list.component.ts +611 -0
  163. package/src/components/priority-list/priority-list.scss +185 -0
  164. package/src/components/priority-list/priority-list.test.ts +139 -0
  165. package/src/components/progress-bar/progress-bar.component.ts +22 -16
  166. package/src/components/radio/radio.scss +10 -3
  167. package/src/components/select/select.component.ts +812 -72
  168. package/src/components/select/select.scss +108 -2
  169. package/src/components/select/select.test.ts +147 -2
  170. package/src/components/settings-container/settings-container.component.ts +44 -19
  171. package/src/components/settings-container/settings-container.scss +1 -1
  172. package/src/components/skeleton/skeleton.component.ts +6 -1
  173. package/src/components/slideout/slideout.scss +8 -3
  174. package/src/components/sp/sp.component.ts +3 -1
  175. package/src/components/sp/sp.scss +19 -0
  176. package/src/components/stepper/stepper.component.ts +16 -10
  177. package/src/components/textarea/textarea.scss +0 -4
  178. package/src/components/tile/tile.component.ts +12 -3
  179. package/src/components/tile/tile.scss +1 -1
  180. package/src/components/timer/timer.component.ts +15 -2
  181. package/src/components/toggle/toggle.component.ts +29 -26
  182. package/src/components/toggle/toggle.scss +13 -1
  183. package/src/components/translation-group/index.ts +12 -0
  184. package/src/components/translation-group/translation-group.component.ts +207 -0
  185. package/src/components/translation-group/translation-group.scss +8 -0
  186. package/src/components/translations/translations.component.ts +90 -44
  187. package/src/components/translations/translations.scss +4 -0
  188. package/src/components/vertical-stepper/vertical-stepper.component.ts +14 -9
  189. package/src/events/events.ts +12 -7
  190. package/src/events/zn-language-change.ts +7 -0
  191. package/src/events/zn-purchase.ts +11 -0
  192. package/src/events/zn-redirect.ts +7 -0
  193. package/src/events/zn-reorder.ts +7 -0
  194. package/src/events/zn-search-change.ts +11 -0
  195. package/src/events/zn-submit.ts +1 -1
  196. package/src/form-control.scss +4 -0
  197. package/src/internal/form-navigation.ts +510 -0
  198. package/src/internal/form.ts +6 -0
  199. package/src/zinc.ts +91 -83
@@ -1,25 +1,443 @@
1
1
  ---
2
2
  meta:
3
3
  title: Toggle
4
- description:
4
+ description: Toggles allow the user to switch an option on or off.
5
5
  layout: component
6
6
  ---
7
7
 
8
8
  ```html:preview
9
- <zn-toggle></zn-toggle>
9
+ <zn-toggle checked>Enable notifications</zn-toggle>
10
10
  ```
11
11
 
12
+ :::tip
13
+ This component works with standard `<form>` elements. Please refer to the section
14
+ on [form controls](/getting-started/form-controls) to learn more about form submission and client-side validation.
15
+ :::
16
+
12
17
  ## Examples
13
18
 
14
- ### With Tooltip
19
+ ### Basic Toggle
20
+
21
+ A basic toggle switch with a label.
22
+
23
+ ```html:preview
24
+ <zn-toggle label="Settings">Dark mode</zn-toggle>
25
+ ```
26
+
27
+ ### Checked
28
+
29
+ Use the `checked` attribute to activate the toggle by default.
30
+
31
+ ```html:preview
32
+ <zn-toggle checked>Auto-save enabled</zn-toggle>
33
+ ```
34
+
35
+ ### Disabled
36
+
37
+ Use the `disabled` attribute to disable the toggle.
38
+
39
+ ```html:preview
40
+ <zn-toggle disabled>Disabled toggle</zn-toggle>
41
+ <br />
42
+ <zn-toggle disabled checked>Disabled and checked</zn-toggle>
43
+ ```
44
+
45
+ ### Sizes
46
+
47
+ Use the `size` attribute to change the toggle size. Available sizes are `small`, `medium` (default), and `large`.
48
+
49
+ ```html:preview
50
+ <zn-toggle size="small">Small toggle</zn-toggle>
51
+ <br />
52
+ <zn-toggle size="medium">Medium toggle</zn-toggle>
53
+ <br />
54
+ <zn-toggle size="large">Large toggle</zn-toggle>
55
+ ```
56
+
57
+ ### With Label
58
+
59
+ Use the `label` attribute to add a form control label above the toggle.
60
+
61
+ ```html:preview
62
+ <zn-toggle label="User Preferences">Enable email notifications</zn-toggle>
63
+ ```
64
+
65
+ ### On/Off Text with Tooltip
66
+
67
+ Use the `on-text` and `off-text` attributes to display tooltips that show when the toggle is in the on or off state. This provides additional context for the toggle's current state.
68
+
69
+ ```html:preview
70
+ <zn-toggle on-text="Notifications enabled" off-text="Notifications disabled" checked>
71
+ Push notifications
72
+ </zn-toggle>
73
+ <br /><br />
74
+ <zn-toggle on-text="Available" off-text="Unavailable" label="Status">
75
+ User availability
76
+ </zn-toggle>
77
+ ```
78
+
79
+ ### Help Text
80
+
81
+ Use the `help-text` attribute to add descriptive help text to the toggle.
82
+
83
+ ```html:preview
84
+ <zn-toggle help-text="When enabled, you will receive real-time notifications">
85
+ Enable real-time updates
86
+ </zn-toggle>
87
+ ```
88
+
89
+ ### Keyboard Navigation
90
+
91
+ Toggles support keyboard navigation using arrow keys. Press the left arrow to turn the toggle off, and the right arrow to turn it on.
92
+
93
+ ```html:preview
94
+ <zn-toggle checked>Try using arrow keys when focused</zn-toggle>
95
+ ```
96
+
97
+ <script type="module">
98
+ const toggle = document.currentScript.previousElementSibling;
99
+ const output = document.createElement('div');
100
+ output.style.cssText = 'margin-top: 1rem; padding: 0.75rem; background: #f5f5f5; border-radius: 4px;';
101
+ output.textContent = 'Focus the toggle and use left/right arrow keys';
102
+ toggle.insertAdjacentElement('afterend', output);
103
+
104
+ toggle.addEventListener('zn-change', (e) => {
105
+ output.textContent = `Toggle is now: ${e.target.checked ? 'ON' : 'OFF'}`;
106
+ });
107
+ </script>
108
+
109
+ ### Form Integration
110
+
111
+ Toggles work seamlessly with forms and will be submitted with form data.
112
+
113
+ ```html:preview
114
+ <form id="toggle-form">
115
+ <zn-toggle name="notifications" value="enabled">Enable notifications</zn-toggle>
116
+ <br />
117
+ <zn-toggle name="auto-save" value="on" checked>Auto-save changes</zn-toggle>
118
+ <br />
119
+ <zn-toggle name="analytics" value="yes" required>Accept analytics (required)</zn-toggle>
120
+ <br /><br />
121
+ <zn-button type="submit" color="primary">Submit</zn-button>
122
+ <zn-button type="reset" color="secondary">Reset</zn-button>
123
+ </form>
124
+
125
+ <script type="module">
126
+ const form = document.querySelector('#toggle-form');
127
+ form.addEventListener('submit', (event) => {
128
+ event.preventDefault();
129
+ const formData = new FormData(form);
130
+ const data = Object.fromEntries(formData.entries());
131
+ alert('Form submitted: ' + JSON.stringify(data, null, 2));
132
+ });
133
+ </script>
134
+ ```
135
+
136
+ ### Fallback Value
137
+
138
+ Use the `fallback` attribute to submit a specific value when the toggle is unchecked. This is useful when you need to ensure a value is always submitted for the field.
139
+
140
+ ```html:preview
141
+ <form id="fallback-form">
142
+ <zn-toggle name="premium-features" value="enabled" fallback="disabled" checked>
143
+ Premium features
144
+ </zn-toggle>
145
+ <br /><br />
146
+ <zn-button type="submit" color="primary">Submit</zn-button>
147
+ </form>
148
+
149
+ <script type="module">
150
+ const form = document.querySelector('#fallback-form');
151
+ form.addEventListener('submit', (event) => {
152
+ event.preventDefault();
153
+ const formData = new FormData(form);
154
+ alert('Value: ' + formData.get('premium-features'));
155
+ });
156
+ </script>
157
+ ```
158
+
159
+ ### Required Validation
160
+
161
+ Use the `required` attribute to make the toggle required. The form will not submit unless the toggle is checked.
162
+
163
+ ```html:preview
164
+ <form id="required-form">
165
+ <zn-toggle name="terms" required>
166
+ I agree to the terms and conditions
167
+ </zn-toggle>
168
+ <br /><br />
169
+ <zn-button type="submit" color="primary">Submit</zn-button>
170
+ </form>
171
+
172
+ <script type="module">
173
+ const form = document.querySelector('#required-form');
174
+ form.addEventListener('submit', (event) => {
175
+ event.preventDefault();
176
+ alert('Form is valid!');
177
+ });
178
+ </script>
179
+ ```
180
+
181
+ ### Custom Validity
182
+
183
+ Use the `setCustomValidity()` method to set a custom validation message. This will prevent the form from submitting and make the browser display the error message you provide. To clear the error, call this function with an empty string.
15
184
 
16
185
  ```html:preview
186
+ <form class="toggle-custom-validity">
187
+ <zn-toggle>I confirm that I have reviewed all settings</zn-toggle>
188
+ <br/>
189
+ <zn-button type="submit" color="primary" style="margin-top: 1rem;">Submit</zn-button>
190
+ </form>
191
+ <script type="module">
192
+ const form = document.querySelector('.toggle-custom-validity');
193
+ const toggle = form.querySelector('zn-toggle');
194
+ const errorMessage = `You must confirm that you have reviewed the settings`;
195
+
196
+ // Set initial validity as soon as the element is defined
197
+ customElements.whenDefined('zn-toggle').then(async () => {
198
+ await toggle.updateComplete;
199
+ toggle.setCustomValidity(errorMessage);
200
+ });
17
201
 
18
- <zn-toggle on-text="Available" off-text="Unavailable" label="Status"></zn-toggle>
202
+ // Update validity on change
203
+ toggle.addEventListener('zn-change', () => {
204
+ toggle.setCustomValidity(toggle.checked ? '' : errorMessage);
205
+ });
206
+
207
+ // Wait for controls to be defined before attaching form listeners
208
+ await Promise.all([
209
+ customElements.whenDefined('zn-toggle')
210
+ ]).then(() => {
211
+ form.addEventListener('submit', event => {
212
+ event.preventDefault();
213
+ alert('All fields are valid!');
214
+ });
215
+ });
216
+ </script>
19
217
  ```
20
218
 
21
- ### Second Example
219
+ ### Submit on Change
220
+
221
+ Use the `trigger-submit` attribute to automatically submit the containing form when the toggle is changed.
222
+
223
+ ```html:preview
224
+ <form id="trigger-submit-form">
225
+ <zn-toggle name="instant" trigger-submit>
226
+ Apply changes immediately
227
+ </zn-toggle>
228
+ </form>
229
+
230
+ <script type="module">
231
+ const form = document.querySelector('#trigger-submit-form');
232
+ let submitCount = 0;
233
+ form.addEventListener('submit', (event) => {
234
+ event.preventDefault();
235
+ submitCount++;
236
+ alert('Form submitted ' + submitCount + ' time(s)');
237
+ });
238
+ </script>
239
+ ```
240
+
241
+ ### External Form Association
242
+
243
+ Use the `form` attribute to associate the toggle with a form element by ID, even if the toggle is not a descendant of the form.
244
+
245
+ ```html:preview
246
+ <form id="external-toggle-form">
247
+ <zn-button type="submit" color="primary">Submit External Form</zn-button>
248
+ </form>
249
+
250
+ <br /><br />
251
+
252
+ <zn-toggle form="external-toggle-form" name="external-option" value="selected">
253
+ This toggle is associated with the form above
254
+ </zn-toggle>
255
+
256
+ <script type="module">
257
+ const form = document.querySelector('#external-toggle-form');
258
+ form.addEventListener('submit', (event) => {
259
+ event.preventDefault();
260
+ const formData = new FormData(form);
261
+ alert('External option: ' + (formData.get('external-option') || 'not selected'));
262
+ });
263
+ </script>
264
+ ```
265
+
266
+ ### Events
267
+
268
+ Toggles emit several events that you can listen to:
269
+
270
+ - `zn-change` - Emitted when the checked state changes (via the `handleClick` method)
271
+ - `zn-input` - Emitted when the toggle receives input
272
+ - `zn-focus` - Emitted when the toggle gains focus
273
+ - `zn-blur` - Emitted when the toggle loses focus
274
+ - `zn-invalid` - Emitted when form validation fails
275
+
276
+ :::tip
277
+ The `zn-change` event is emitted in the `handleClick` method when the toggle is clicked, so it fires after the checked state has been updated. Note that the component listens to native input events and emits `zn-input`, but does not explicitly emit `zn-change`, `zn-focus`, or `zn-blur` events in the component code - these would need to be added if needed.
278
+ :::
279
+
280
+ ```html:preview
281
+ <div>
282
+ <zn-toggle id="event-toggle" checked>Toggle me</zn-toggle>
283
+ <div id="event-output" style="margin-top: 1rem; padding: 1rem; background: #f5f5f5; border-radius: 4px;">
284
+ <strong>Events:</strong>
285
+ <ul id="event-list" style="margin: 0.5rem 0 0 0; padding-left: 1.5rem;"></ul>
286
+ </div>
287
+ </div>
288
+
289
+ <script type="module">
290
+ const toggle = document.querySelector('#event-toggle');
291
+ const eventList = document.querySelector('#event-list');
292
+
293
+ function logEvent(eventName, detail = '') {
294
+ const li = document.createElement('li');
295
+ li.textContent = `${eventName}${detail ? ': ' + detail : ''}`;
296
+ eventList.insertBefore(li, eventList.firstChild);
297
+
298
+ // Keep only last 5 events
299
+ while (eventList.children.length > 5) {
300
+ eventList.removeChild(eventList.lastChild);
301
+ }
302
+ }
22
303
 
23
- TODO
304
+ toggle.addEventListener('zn-input', (e) => {
305
+ logEvent('zn-input', `checked = ${e.target.checked}`);
306
+ });
24
307
 
308
+ toggle.addEventListener('focus', () => {
309
+ logEvent('focus');
310
+ });
311
+
312
+ toggle.addEventListener('blur', () => {
313
+ logEvent('blur');
314
+ });
315
+
316
+ // Monitor checked state changes
317
+ let lastChecked = toggle.checked;
318
+ toggle.addEventListener('click', () => {
319
+ if (toggle.checked !== lastChecked) {
320
+ logEvent('state-change', `checked = ${toggle.checked}`);
321
+ lastChecked = toggle.checked;
322
+ }
323
+ });
324
+ </script>
325
+ ```
326
+
327
+ ### Methods
328
+
329
+ Toggles provide several methods for programmatic control:
330
+
331
+ - `click()` - Simulates a click on the toggle
332
+ - `focus(options?)` - Sets focus on the toggle
333
+ - `blur()` - Removes focus from the toggle
334
+ - `checkValidity()` - Checks validity without showing a message
335
+ - `reportValidity()` - Checks validity and shows the browser's validation message
336
+ - `setCustomValidity(message)` - Sets a custom validation message
337
+ - `getForm()` - Returns the associated form element, if one exists
338
+
339
+ ```html:preview
340
+ <div>
341
+ <zn-toggle id="method-toggle">Programmatic control</zn-toggle>
342
+ <br /><br />
343
+ <zn-button id="click-btn" size="small">Toggle State</zn-button>
344
+ <zn-button id="focus-btn" size="small" color="info">Focus Toggle</zn-button>
345
+ <zn-button id="blur-btn" size="small" color="secondary">Blur Toggle</zn-button>
346
+ <zn-button id="validate-btn" size="small" color="warning">Check Validity</zn-button>
347
+ </div>
348
+
349
+ <script type="module">
350
+ const toggle = document.querySelector('#method-toggle');
351
+
352
+ document.querySelector('#click-btn').addEventListener('click', () => {
353
+ toggle.click();
354
+ });
355
+
356
+ document.querySelector('#focus-btn').addEventListener('click', () => {
357
+ toggle.focus();
358
+ });
359
+
360
+ document.querySelector('#blur-btn').addEventListener('click', () => {
361
+ toggle.blur();
362
+ });
363
+
364
+ document.querySelector('#validate-btn').addEventListener('click', () => {
365
+ const isValid = toggle.checkValidity();
366
+ alert('Toggle is ' + (isValid ? 'valid' : 'invalid'));
367
+ });
368
+ </script>
369
+ ```
370
+
371
+ ### Complete Example
372
+
373
+ Here's a comprehensive example demonstrating multiple toggle features together:
374
+
375
+ ```html:preview
376
+ <form id="complete-form">
377
+ <zn-toggle
378
+ label="Notification Settings"
379
+ name="email-notifications"
380
+ value="enabled"
381
+ fallback="disabled"
382
+ on-text="Email notifications are ON"
383
+ off-text="Email notifications are OFF"
384
+ help-text="Receive email updates about your account"
385
+ checked
386
+ >
387
+ Enable email notifications
388
+ </zn-toggle>
389
+
390
+ <br />
391
+
392
+ <zn-toggle
393
+ label="Privacy Settings"
394
+ name="analytics"
395
+ value="allowed"
396
+ on-text="Analytics tracking enabled"
397
+ off-text="Analytics tracking disabled"
398
+ help-text="Help us improve by sharing anonymous usage data"
399
+ size="medium"
400
+ >
401
+ Allow analytics
402
+ </zn-toggle>
403
+
404
+ <br />
405
+
406
+ <zn-toggle
407
+ name="terms"
408
+ value="accepted"
409
+ required
410
+ size="small"
411
+ >
412
+ I agree to the terms and conditions (required)
413
+ </zn-toggle>
414
+
415
+ <br /><br />
416
+ <zn-button type="submit" color="primary">Save Settings</zn-button>
417
+ <zn-button type="reset" color="secondary">Reset</zn-button>
418
+ </form>
419
+
420
+ <div id="form-output" style="margin-top: 1rem; padding: 1rem; background: #f5f5f5; border-radius: 4px; display: none;">
421
+ <strong>Form Data:</strong>
422
+ <pre id="form-data" style="margin-top: 0.5rem; white-space: pre-wrap;"></pre>
423
+ </div>
424
+
425
+ <script type="module">
426
+ const form = document.querySelector('#complete-form');
427
+ const output = document.querySelector('#form-output');
428
+ const dataDisplay = document.querySelector('#form-data');
429
+
430
+ form.addEventListener('submit', (event) => {
431
+ event.preventDefault();
432
+ const formData = new FormData(form);
433
+ const data = Object.fromEntries(formData.entries());
434
+ dataDisplay.textContent = JSON.stringify(data, null, 2);
435
+ output.style.display = 'block';
436
+ });
437
+
438
+ form.addEventListener('reset', () => {
439
+ output.style.display = 'none';
440
+ });
441
+ </script>
442
+ ```
25
443