@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,27 +1,382 @@
1
1
  ---
2
2
  meta:
3
3
  title: Dropdown
4
- description:
4
+ description: Dropdowns display a popup containing a menu or other content when triggered by a button or element.
5
5
  layout: component
6
6
  ---
7
7
 
8
+ Dropdowns consist of a trigger and a panel. By default, activating the trigger will expose the panel and interacting outside of the panel will close it.
9
+
10
+ Dropdowns are designed to work with menus and menu items, but they can contain any content. They also provide methods to programmatically show and hide the panel.
11
+
8
12
  ```html:preview
9
- <zn-dropdown t="[object Object]" placement="bottom-start">
10
- <zn-menu actions="[{&quot;confirm&quot;:{&quot;type&quot;:&quot;success&quot;,&quot;trigger&quot;:&quot;reactivate10&quot;,&quot;caption&quot;:&quot;Reactivate Access&quot;,&quot;content&quot;:&quot;Are you sure you want to reactivate access for John Doe?&quot;,&quot;action&quot;:&quot;#&quot;},&quot;title&quot;:&quot;Reactivate Access&quot;,&quot;style&quot;:&quot;success&quot;}]" t="[object Object]" role="menu"></zn-menu>
11
- <button slot="trigger">
12
- <zn-icon src="more_vert" t="[object Object]" size="24" library="material-symbols-outlined"></zn-icon>
13
- </button>
14
- </zn-dropdown>
13
+ <zn-dropdown>
14
+ <zn-button slot="trigger" icon="more_vert"></zn-button>
15
+ <zn-menu>
16
+ <zn-menu-item>Edit</zn-menu-item>
17
+ <zn-menu-item>Duplicate</zn-menu-item>
18
+ <zn-menu-item>Archive</zn-menu-item>
19
+ <zn-menu-item>Delete</zn-menu-item>
20
+ </zn-menu>
21
+ </zn-dropdown>
15
22
  ```
16
23
 
17
24
  ## Examples
18
25
 
19
- ### First Example
26
+ ### Getting the Dropdown to Close
27
+
28
+ By default, dropdowns close when you select a menu item in the dropdown's panel. To change this behavior, set the `stay-open-on-select` attribute to prevent the dropdown from closing when menu selections are made.
29
+
30
+ ```html:preview
31
+ <zn-dropdown stay-open-on-select>
32
+ <zn-button slot="trigger">Settings</zn-button>
33
+ <zn-menu>
34
+ <zn-menu-item>Notifications</zn-menu-item>
35
+ <zn-menu-item>Privacy</zn-menu-item>
36
+ <zn-menu-item>Security</zn-menu-item>
37
+ </zn-menu>
38
+ </zn-dropdown>
39
+ ```
40
+
41
+ ### Placement
42
+
43
+ The preferred placement of the dropdown can be set with the `placement` attribute. Note that the actual position may vary to ensure the panel remains in the viewport if you're using positioning features such as `flip` and `shift`.
44
+
45
+ ```html:preview
46
+ <zn-dropdown placement="top-start">
47
+ <zn-button slot="trigger">Top Start</zn-button>
48
+ <zn-menu>
49
+ <zn-menu-item>Edit</zn-menu-item>
50
+ <zn-menu-item>Delete</zn-menu-item>
51
+ </zn-menu>
52
+ </zn-dropdown>
53
+
54
+ <zn-dropdown placement="top">
55
+ <zn-button slot="trigger">Top</zn-button>
56
+ <zn-menu>
57
+ <zn-menu-item>Edit</zn-menu-item>
58
+ <zn-menu-item>Delete</zn-menu-item>
59
+ </zn-menu>
60
+ </zn-dropdown>
61
+
62
+ <zn-dropdown placement="top-end">
63
+ <zn-button slot="trigger">Top End</zn-button>
64
+ <zn-menu>
65
+ <zn-menu-item>Edit</zn-menu-item>
66
+ <zn-menu-item>Delete</zn-menu-item>
67
+ </zn-menu>
68
+ </zn-dropdown>
20
69
 
21
- TODO
70
+ <br><br>
22
71
 
23
- ### Second Example
72
+ <zn-dropdown placement="bottom-start">
73
+ <zn-button slot="trigger">Bottom Start</zn-button>
74
+ <zn-menu>
75
+ <zn-menu-item>Edit</zn-menu-item>
76
+ <zn-menu-item>Delete</zn-menu-item>
77
+ </zn-menu>
78
+ </zn-dropdown>
79
+
80
+ <zn-dropdown placement="bottom">
81
+ <zn-button slot="trigger">Bottom</zn-button>
82
+ <zn-menu>
83
+ <zn-menu-item>Edit</zn-menu-item>
84
+ <zn-menu-item>Delete</zn-menu-item>
85
+ </zn-menu>
86
+ </zn-dropdown>
87
+
88
+ <zn-dropdown placement="bottom-end">
89
+ <zn-button slot="trigger">Bottom End</zn-button>
90
+ <zn-menu>
91
+ <zn-menu-item>Edit</zn-menu-item>
92
+ <zn-menu-item>Delete</zn-menu-item>
93
+ </zn-menu>
94
+ </zn-dropdown>
95
+
96
+ <br><br>
97
+
98
+ <zn-dropdown placement="left-start">
99
+ <zn-button slot="trigger">Left Start</zn-button>
100
+ <zn-menu>
101
+ <zn-menu-item>Edit</zn-menu-item>
102
+ <zn-menu-item>Delete</zn-menu-item>
103
+ </zn-menu>
104
+ </zn-dropdown>
105
+
106
+ <zn-dropdown placement="left">
107
+ <zn-button slot="trigger">Left</zn-button>
108
+ <zn-menu>
109
+ <zn-menu-item>Edit</zn-menu-item>
110
+ <zn-menu-item>Delete</zn-menu-item>
111
+ </zn-menu>
112
+ </zn-dropdown>
113
+
114
+ <zn-dropdown placement="left-end">
115
+ <zn-button slot="trigger">Left End</zn-button>
116
+ <zn-menu>
117
+ <zn-menu-item>Edit</zn-menu-item>
118
+ <zn-menu-item>Delete</zn-menu-item>
119
+ </zn-menu>
120
+ </zn-dropdown>
121
+
122
+ <br><br>
123
+
124
+ <zn-dropdown placement="right-start">
125
+ <zn-button slot="trigger">Right Start</zn-button>
126
+ <zn-menu>
127
+ <zn-menu-item>Edit</zn-menu-item>
128
+ <zn-menu-item>Delete</zn-menu-item>
129
+ </zn-menu>
130
+ </zn-dropdown>
131
+
132
+ <zn-dropdown placement="right">
133
+ <zn-button slot="trigger">Right</zn-button>
134
+ <zn-menu>
135
+ <zn-menu-item>Edit</zn-menu-item>
136
+ <zn-menu-item>Delete</zn-menu-item>
137
+ </zn-menu>
138
+ </zn-dropdown>
139
+
140
+ <zn-dropdown placement="right-end">
141
+ <zn-button slot="trigger">Right End</zn-button>
142
+ <zn-menu>
143
+ <zn-menu-item>Edit</zn-menu-item>
144
+ <zn-menu-item>Delete</zn-menu-item>
145
+ </zn-menu>
146
+ </zn-dropdown>
147
+ ```
24
148
 
25
- TODO
149
+ ### Distance
150
+
151
+ Use the `distance` attribute to change how far the dropdown panel is from the trigger. This value is specified in pixels.
152
+
153
+ ```html:preview
154
+ <zn-dropdown distance="20">
155
+ <zn-button slot="trigger">Distance 20px</zn-button>
156
+ <zn-menu>
157
+ <zn-menu-item>Edit</zn-menu-item>
158
+ <zn-menu-item>Delete</zn-menu-item>
159
+ </zn-menu>
160
+ </zn-dropdown>
161
+
162
+ <zn-dropdown distance="50">
163
+ <zn-button slot="trigger">Distance 50px</zn-button>
164
+ <zn-menu>
165
+ <zn-menu-item>Edit</zn-menu-item>
166
+ <zn-menu-item>Delete</zn-menu-item>
167
+ </zn-menu>
168
+ </zn-dropdown>
169
+ ```
170
+
171
+ ### Skidding
172
+
173
+ Use the `skidding` attribute to move the dropdown panel along the trigger. This value is specified in pixels.
174
+
175
+ ```html:preview
176
+ <zn-dropdown skidding="30">
177
+ <zn-button slot="trigger">Skidding 30px</zn-button>
178
+ <zn-menu>
179
+ <zn-menu-item>Edit</zn-menu-item>
180
+ <zn-menu-item>Delete</zn-menu-item>
181
+ </zn-menu>
182
+ </zn-dropdown>
183
+
184
+ <zn-dropdown skidding="-30">
185
+ <zn-button slot="trigger">Skidding -30px</zn-button>
186
+ <zn-menu>
187
+ <zn-menu-item>Edit</zn-menu-item>
188
+ <zn-menu-item>Delete</zn-menu-item>
189
+ </zn-menu>
190
+ </zn-dropdown>
191
+ ```
192
+
193
+ ### Hoisting
194
+
195
+ Dropdown panels will be clipped if they're inside a container that has `overflow: auto|hidden|scroll`. The `hoist` attribute forces the panel to use a fixed positioning strategy, allowing it to break out of the container. In this case, the panel will be positioned relative to its containing block, which is usually the viewport unless an ancestor uses a `transform`, `perspective`, or `filter`.
196
+
197
+ The `hoist` attribute is enabled by default to prevent clipping issues.
198
+
199
+ ```html:preview
200
+ <div style="overflow: hidden; border: solid 1px var(--zn-color-neutral-200); padding: 1rem; position: relative;">
201
+ <zn-dropdown hoist>
202
+ <zn-button slot="trigger">Hoisted (Default)</zn-button>
203
+ <zn-menu>
204
+ <zn-menu-item>Edit</zn-menu-item>
205
+ <zn-menu-item>Delete</zn-menu-item>
206
+ </zn-menu>
207
+ </zn-dropdown>
208
+
209
+ <zn-dropdown hoist="false">
210
+ <zn-button slot="trigger">Not Hoisted</zn-button>
211
+ <zn-menu>
212
+ <zn-menu-item>Edit</zn-menu-item>
213
+ <zn-menu-item>Delete</zn-menu-item>
214
+ </zn-menu>
215
+ </zn-dropdown>
216
+ </div>
217
+ ```
218
+
219
+ ### Syncing Width or Height
220
+
221
+ Use the `sync` attribute to make the dropdown panel match the width or height of the trigger element. This is useful when you want the panel to be the same size as the trigger.
222
+
223
+ ```html:preview
224
+ <zn-dropdown sync="width">
225
+ <zn-button slot="trigger" style="width: 200px;">Sync Width</zn-button>
226
+ <zn-menu>
227
+ <zn-menu-item>Edit</zn-menu-item>
228
+ <zn-menu-item>Delete</zn-menu-item>
229
+ <zn-menu-item>Archive</zn-menu-item>
230
+ </zn-menu>
231
+ </zn-dropdown>
26
232
 
233
+ <zn-dropdown sync="height">
234
+ <zn-button slot="trigger" style="height: 100px;">Sync Height</zn-button>
235
+ <zn-menu>
236
+ <zn-menu-item>Edit</zn-menu-item>
237
+ <zn-menu-item>Delete</zn-menu-item>
238
+ </zn-menu>
239
+ </zn-dropdown>
240
+
241
+ <zn-dropdown sync="both">
242
+ <zn-button slot="trigger" style="width: 200px; height: 100px;">Sync Both</zn-button>
243
+ <zn-menu>
244
+ <zn-menu-item>Edit</zn-menu-item>
245
+ <zn-menu-item>Delete</zn-menu-item>
246
+ </zn-menu>
247
+ </zn-dropdown>
248
+ ```
249
+
250
+ ### Disabled
251
+
252
+ Use the `disabled` attribute to disable the dropdown so the panel will not open.
253
+
254
+ ```html:preview
255
+ <zn-dropdown disabled>
256
+ <zn-button slot="trigger">Disabled</zn-button>
257
+ <zn-menu>
258
+ <zn-menu-item>Edit</zn-menu-item>
259
+ <zn-menu-item>Delete</zn-menu-item>
260
+ </zn-menu>
261
+ </zn-dropdown>
262
+ ```
263
+
264
+ ### Custom Trigger
265
+
266
+ Any element can be used as a trigger by placing it in the `trigger` slot. The trigger should be a focusable element like a button or link.
267
+
268
+ ```html:preview
269
+ <zn-dropdown>
270
+ <a href="#" slot="trigger" onclick="event.preventDefault()">
271
+ Click to open
272
+ </a>
273
+ <zn-menu>
274
+ <zn-menu-item>Edit</zn-menu-item>
275
+ <zn-menu-item>Delete</zn-menu-item>
276
+ </zn-menu>
277
+ </zn-dropdown>
278
+ ```
279
+
280
+ ### Non-Menu Content
281
+
282
+ Dropdowns can contain any content, not just menus. Use the default slot to add custom content to the dropdown panel.
283
+
284
+ ```html:preview
285
+ <zn-dropdown>
286
+ <zn-button slot="trigger">User Profile</zn-button>
287
+ <div style="padding: 1rem;">
288
+ <h3 style="margin-top: 0;">John Doe</h3>
289
+ <p style="margin-bottom: 0;">john.doe@example.com</p>
290
+ </div>
291
+ </zn-dropdown>
292
+ ```
293
+
294
+ ### Programmatic Control
295
+
296
+ You can use the `show()` and `hide()` methods to programmatically open and close the dropdown. You can also check the `open` property to determine if the dropdown is currently open.
297
+
298
+ ```html:preview
299
+ <zn-dropdown id="dropdown-programmatic">
300
+ <zn-button slot="trigger">Dropdown</zn-button>
301
+ <zn-menu>
302
+ <zn-menu-item>Edit</zn-menu-item>
303
+ <zn-menu-item>Delete</zn-menu-item>
304
+ </zn-menu>
305
+ </zn-dropdown>
306
+
307
+ <br><br>
308
+
309
+ <zn-button onclick="document.getElementById('dropdown-programmatic').show()">Show</zn-button>
310
+ <zn-button onclick="document.getElementById('dropdown-programmatic').hide()">Hide</zn-button>
311
+
312
+ <script>
313
+ const dropdown = document.getElementById('dropdown-programmatic');
314
+ dropdown.addEventListener('zn-show', () => console.log('Dropdown opened'));
315
+ dropdown.addEventListener('zn-hide', () => console.log('Dropdown closed'));
316
+ </script>
317
+ ```
318
+
319
+ ### Keyboard Navigation
320
+
321
+ When focused on the trigger, the following keyboard interactions are available:
322
+
323
+ - **Space/Enter** - Opens the dropdown and focuses the first menu item
324
+ - **Arrow Down** - Opens the dropdown and focuses the first menu item
325
+ - **Arrow Up** - Opens the dropdown and focuses the last menu item
326
+ - **Home** - Opens the dropdown and focuses the first menu item
327
+ - **End** - Opens the dropdown and focuses the last menu item
328
+
329
+ When the dropdown is open:
330
+
331
+ - **Escape** - Closes the dropdown and returns focus to the trigger
332
+ - **Tab** - Closes the dropdown and returns focus to the trigger
333
+ - **Arrow Down** - Moves focus to the next menu item
334
+ - **Arrow Up** - Moves focus to the previous menu item
335
+
336
+ ### Remote Content
337
+
338
+ The dropdown supports loading content from a remote source using the `uri` attribute. The content will be preloaded when the user hovers over or focuses on the trigger.
339
+
340
+ ```html:preview
341
+ <zn-dropdown uri="/api/menu-content">
342
+ <zn-button slot="trigger">Load Remote Content</zn-button>
343
+ </zn-dropdown>
344
+ ```
345
+
346
+ ### Events
347
+
348
+ The dropdown emits several events that you can listen to:
349
+
350
+ - `zn-show` - Emitted when the dropdown is about to open
351
+ - `zn-after-show` - Emitted after the dropdown has opened and all animations are complete
352
+ - `zn-hide` - Emitted when the dropdown is about to close
353
+ - `zn-after-hide` - Emitted after the dropdown has closed and all animations are complete
354
+ - `zn-select` - Emitted when a menu item is selected (bubbles up from the menu)
355
+
356
+ ```html:preview
357
+ <zn-dropdown id="dropdown-events">
358
+ <zn-button slot="trigger">Open Dropdown</zn-button>
359
+ <zn-menu>
360
+ <zn-menu-item>Edit</zn-menu-item>
361
+ <zn-menu-item>Delete</zn-menu-item>
362
+ </zn-menu>
363
+ </zn-dropdown>
364
+
365
+ <div id="event-log" style="margin-top: 1rem; padding: 1rem; background: var(--zn-color-neutral-100); border-radius: 4px;">
366
+ Event log:
367
+ </div>
368
+
369
+ <script>
370
+ const dropdown = document.getElementById('dropdown-events');
371
+ const eventLog = document.getElementById('event-log');
372
+
373
+ ['zn-show', 'zn-after-show', 'zn-hide', 'zn-after-hide'].forEach(eventName => {
374
+ dropdown.addEventListener(eventName, () => {
375
+ const log = document.createElement('div');
376
+ log.textContent = `${eventName} event fired`;
377
+ eventLog.appendChild(log);
378
+ });
379
+ });
380
+ </script>
381
+ ```
27
382