@kubex/zinc 1.0.24 → 1.0.98

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 (198) 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 +13431 -8728
  4. package/dist/vscode.html-custom-data.json +571 -37
  5. package/dist/web-types.json +1439 -181
  6. package/dist/zn.d.ts +1642 -661
  7. package/dist/zn.min.css +1 -1
  8. package/dist/zn.min.js +1407 -887
  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/key-container.md +115 -0
  51. package/docs/pages/components/key.md +101 -0
  52. package/docs/pages/components/menu.md +512 -6
  53. package/docs/pages/components/note.md +239 -36
  54. package/docs/pages/components/opt-group.md +107 -0
  55. package/docs/pages/components/pagination.md +332 -6
  56. package/docs/pages/components/pane.md +222 -6
  57. package/docs/pages/components/panel.md +213 -26
  58. package/docs/pages/components/popup.md +1354 -6
  59. package/docs/pages/components/priority-list.md +233 -0
  60. package/docs/pages/components/progress-bar.md +387 -6
  61. package/docs/pages/components/radio-group.md +242 -5
  62. package/docs/pages/components/radio.md +474 -6
  63. package/docs/pages/components/rating.md +331 -7
  64. package/docs/pages/components/reveal.md +524 -6
  65. package/docs/pages/components/scroll-container.md +552 -6
  66. package/docs/pages/components/select.md +762 -160
  67. package/docs/pages/components/skeleton.md +473 -30
  68. package/docs/pages/components/slideout.md +261 -5
  69. package/docs/pages/components/sp.md +99 -41
  70. package/docs/pages/components/split-button.md +347 -9
  71. package/docs/pages/components/split-pane.md +445 -6
  72. package/docs/pages/components/stat.md +549 -9
  73. package/docs/pages/components/status-indicator.md +230 -1
  74. package/docs/pages/components/stepper.md +563 -6
  75. package/docs/pages/components/tabs.md +439 -13
  76. package/docs/pages/components/textarea.md +415 -17
  77. package/docs/pages/components/tile.md +385 -26
  78. package/docs/pages/components/toggle.md +424 -6
  79. package/docs/pages/components/tooltip.md +367 -0
  80. package/docs/pages/components/translation-group.md +210 -0
  81. package/docs/pages/components/translations.md +319 -18
  82. package/docs/pages/components/vertical-stepper.md +401 -8
  83. package/docs/pages/components/well.md +300 -3
  84. package/docs/pages/getting-started/form-controls.md +162 -0
  85. package/docs/pages/index.md +116 -15
  86. package/package.json +5 -6
  87. package/scss/_global-spacing.scss +4 -0
  88. package/scss/_root.scss +2 -2
  89. package/scss/boot.scss +19 -0
  90. package/scss/shared/layout.scss +5 -0
  91. package/scss/themes/_light.scss +3 -3
  92. package/src/components/alert/alert.scss +1 -0
  93. package/src/components/animated-button/README.md +306 -0
  94. package/src/components/animated-button/animated-button.component.ts +229 -0
  95. package/src/components/animated-button/animated-button.scss +228 -0
  96. package/src/components/animated-button/animated-button.test.ts +143 -0
  97. package/src/components/animated-button/index.ts +12 -0
  98. package/src/components/button/button.component.ts +5 -0
  99. package/src/components/button-group/button-group.component.ts +25 -13
  100. package/src/components/button-group/button-group.scss +6 -0
  101. package/src/components/checkbox/checkbox.component.ts +4 -0
  102. package/src/components/checkbox/checkbox.scss +7 -4
  103. package/src/components/checkbox-group/checkbox-group.scss +7 -0
  104. package/src/components/chip/chip.component.ts +7 -2
  105. package/src/components/chip/chip.scss +16 -2
  106. package/src/components/collapsible/collapsible.component.ts +27 -20
  107. package/src/components/cols/cols.component.ts +14 -2
  108. package/src/components/cols/cols.scss +6 -12
  109. package/src/components/confirm/confirm.component.ts +7 -0
  110. package/src/components/copy-button/copy-button.component.ts +12 -11
  111. package/src/components/data-select/data-select.component.ts +215 -44
  112. package/src/components/data-select/data-select.scss +66 -6
  113. package/src/components/data-select/providers/currency-data-provider.ts +20 -6
  114. package/src/components/data-select/providers/provider.ts +1 -0
  115. package/src/components/data-select/providers/us-state-data-provider.ts +68 -0
  116. package/src/components/data-table/data-table.component.ts +82 -23
  117. package/src/components/data-table-search/data-table-search.component.ts +184 -0
  118. package/src/components/data-table-search/data-table-search.scss +17 -0
  119. package/src/components/data-table-search/data-table-search.test.ts +11 -0
  120. package/src/components/data-table-search/index.ts +12 -0
  121. package/src/components/datepicker/datepicker.component.ts +347 -13
  122. package/src/components/dialog/dialog.component.ts +1 -1
  123. package/src/components/empty-state/empty-state.scss +6 -1
  124. package/src/components/header/header.scss +3 -3
  125. package/src/components/icon/icon.component.ts +23 -1
  126. package/src/components/icon/icon.scss +23 -0
  127. package/src/components/icon-picker/brand-icons.ts +24 -0
  128. package/src/components/icon-picker/icon-picker.component.ts +407 -0
  129. package/src/components/icon-picker/icon-picker.scss +205 -0
  130. package/src/components/icon-picker/index.ts +12 -0
  131. package/src/components/icon-picker/line-icons.ts +612 -0
  132. package/src/components/icon-picker/material-icons.ts +14543 -0
  133. package/src/components/inline-edit/inline-edit.component.ts +190 -46
  134. package/src/components/inline-edit/inline-edit.scss +29 -0
  135. package/src/components/inline-edit/inline-edit.test.ts +314 -1
  136. package/src/components/input/input.component.ts +328 -5
  137. package/src/components/input/input.scss +100 -4
  138. package/src/components/input-group/input-group.component.ts +28 -7
  139. package/src/components/input-group/input-group.scss +48 -10
  140. package/src/components/item/item.component.ts +11 -2
  141. package/src/components/item/item.scss +7 -0
  142. package/src/components/key/index.ts +12 -0
  143. package/src/components/key/key.component.ts +47 -0
  144. package/src/components/key/key.scss +38 -0
  145. package/src/components/key-container/index.ts +12 -0
  146. package/src/components/key-container/key-container.component.ts +142 -0
  147. package/src/components/key-container/key-container.scss +33 -0
  148. package/src/components/menu-item/menu-item.component.ts +20 -0
  149. package/src/components/menu-item/menu-item.scss +69 -2
  150. package/src/components/navbar/navbar.component.ts +103 -8
  151. package/src/components/navbar/navbar.scss +6 -1
  152. package/src/components/opt-group/index.ts +12 -0
  153. package/src/components/opt-group/opt-group.component.ts +74 -0
  154. package/src/components/opt-group/opt-group.scss +37 -0
  155. package/src/components/opt-group/opt-group.test.ts +27 -0
  156. package/src/components/option/option.component.ts +1 -16
  157. package/src/components/option/option.scss +4 -0
  158. package/src/components/panel/panel.component.ts +10 -8
  159. package/src/components/panel/panel.scss +20 -0
  160. package/src/components/priority-list/index.ts +12 -0
  161. package/src/components/priority-list/priority-list.component.ts +611 -0
  162. package/src/components/priority-list/priority-list.scss +185 -0
  163. package/src/components/priority-list/priority-list.test.ts +139 -0
  164. package/src/components/progress-bar/progress-bar.component.ts +22 -16
  165. package/src/components/radio/radio.scss +10 -3
  166. package/src/components/select/select.component.ts +812 -72
  167. package/src/components/select/select.scss +108 -2
  168. package/src/components/select/select.test.ts +147 -2
  169. package/src/components/settings-container/settings-container.component.ts +44 -19
  170. package/src/components/settings-container/settings-container.scss +1 -1
  171. package/src/components/skeleton/skeleton.component.ts +6 -1
  172. package/src/components/slideout/slideout.scss +8 -3
  173. package/src/components/sp/sp.component.ts +3 -1
  174. package/src/components/sp/sp.scss +19 -0
  175. package/src/components/stepper/stepper.component.ts +16 -10
  176. package/src/components/textarea/textarea.scss +0 -4
  177. package/src/components/tile/tile.component.ts +12 -3
  178. package/src/components/tile/tile.scss +1 -1
  179. package/src/components/timer/timer.component.ts +15 -2
  180. package/src/components/toggle/toggle.component.ts +29 -26
  181. package/src/components/toggle/toggle.scss +13 -1
  182. package/src/components/translation-group/index.ts +12 -0
  183. package/src/components/translation-group/translation-group.component.ts +207 -0
  184. package/src/components/translation-group/translation-group.scss +8 -0
  185. package/src/components/translations/translations.component.ts +90 -42
  186. package/src/components/translations/translations.scss +5 -1
  187. package/src/components/vertical-stepper/vertical-stepper.component.ts +14 -9
  188. package/src/events/events.ts +12 -7
  189. package/src/events/zn-language-change.ts +7 -0
  190. package/src/events/zn-purchase.ts +11 -0
  191. package/src/events/zn-redirect.ts +7 -0
  192. package/src/events/zn-reorder.ts +7 -0
  193. package/src/events/zn-search-change.ts +11 -0
  194. package/src/events/zn-submit.ts +1 -1
  195. package/src/form-control.scss +4 -0
  196. package/src/internal/form-navigation.ts +510 -0
  197. package/src/internal/form.ts +6 -0
  198. package/src/zinc.ts +91 -83
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  meta:
3
3
  title: Reveal
4
- description:
4
+ description: Reveals temporarily hide sensitive information and show it on hover or click, useful for displaying masked data like email addresses, passwords, or API keys.
5
5
  layout: component
6
6
  ---
7
7
 
8
- ```html:preview
8
+ Reveals provide an interactive way to protect sensitive information while still making it accessible to users when needed. They're ideal for masking email addresses, phone numbers, API keys, or any other data that should be hidden by default but can be viewed on demand.
9
9
 
10
+ ```html:preview
10
11
  <zn-reveal duration="3000"
11
12
  initial="******@hotmail.com"
12
13
  revealed="john.doe@hotmail.com">
@@ -15,10 +16,527 @@ layout: component
15
16
 
16
17
  ## Examples
17
18
 
18
- ### First Example
19
+ ### Basic Usage
20
+
21
+ A simple reveal that shows the full content on hover and hides it when the mouse leaves.
22
+
23
+ ```html:preview
24
+ <zn-reveal initial="***-***-1234"
25
+ revealed="555-123-1234">
26
+ </zn-reveal>
27
+ ```
28
+
29
+ ### Email Address Masking
30
+
31
+ Mask email addresses to protect them from bots and scrapers while still allowing users to view them.
32
+
33
+ ```html:preview
34
+ <zn-reveal initial="j***@example.com"
35
+ revealed="john.doe@example.com">
36
+ </zn-reveal>
37
+ ```
38
+
39
+ ### API Key Protection
40
+
41
+ Hide API keys and tokens by default, revealing them only when users interact with them.
42
+
43
+ ```html:preview
44
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
45
+ <div style="display: flex; align-items: center; gap: 0.5rem;">
46
+ <strong>API Key:</strong>
47
+ <zn-reveal initial="sk_live_••••••••••••••••"
48
+ revealed="sk_live_1234567890abcdef">
49
+ </zn-reveal>
50
+ </div>
51
+
52
+ <div style="display: flex; align-items: center; gap: 0.5rem;">
53
+ <strong>Secret:</strong>
54
+ <zn-reveal initial="••••••••••••••••••••"
55
+ revealed="super_secret_key_xyz">
56
+ </zn-reveal>
57
+ </div>
58
+ </div>
59
+ ```
60
+
61
+ ### With Duration (Temporary Reveal)
62
+
63
+ Use the `duration` attribute to automatically hide the content after a specified time (in milliseconds) when clicked.
64
+
65
+ ```html:preview
66
+ <zn-reveal duration="3000"
67
+ initial="******@hotmail.com"
68
+ revealed="john.doe@hotmail.com">
69
+ </zn-reveal>
70
+ <p style="font-size: 0.875rem; color: var(--zn-color-neutral-600); margin-top: 0.5rem;">
71
+ Click to reveal for 3 seconds
72
+ </p>
73
+ ```
74
+
75
+ ### Permanent Toggle
76
+
77
+ When `duration` is set to `0` or not provided while clicking, the reveal will toggle between states permanently until clicked again.
78
+
79
+ ```html:preview
80
+ <zn-reveal duration="0"
81
+ initial="Password: ••••••••"
82
+ revealed="Password: MyP@ssw0rd">
83
+ </zn-reveal>
84
+ <p style="font-size: 0.875rem; color: var(--zn-color-neutral-600); margin-top: 0.5rem;">
85
+ Click to toggle on/off
86
+ </p>
87
+ ```
88
+
89
+ ### Short Duration
90
+
91
+ Use shorter durations for quick peeks at sensitive information.
92
+
93
+ ```html:preview
94
+ <zn-reveal duration="1500"
95
+ initial="Card: •••• •••• •••• 5678"
96
+ revealed="Card: 1234 5678 9012 5678">
97
+ </zn-reveal>
98
+ <p style="font-size: 0.875rem; color: var(--zn-color-neutral-600); margin-top: 0.5rem;">
99
+ Click to reveal for 1.5 seconds
100
+ </p>
101
+ ```
102
+
103
+ ### Long Duration
104
+
105
+ Use longer durations when users need more time to read or copy the information.
106
+
107
+ ```html:preview
108
+ <zn-reveal duration="5000"
109
+ initial="Recovery Code: ••••-••••-••••"
110
+ revealed="Recovery Code: AB12-CD34-EF56">
111
+ </zn-reveal>
112
+ <p style="font-size: 0.875rem; color: var(--zn-color-neutral-600); margin-top: 0.5rem;">
113
+ Click to reveal for 5 seconds
114
+ </p>
115
+ ```
116
+
117
+ ### Social Security Number
118
+
119
+ Mask sensitive personal information like social security numbers.
120
+
121
+ ```html:preview
122
+ <zn-reveal initial="SSN: •••-••-1234"
123
+ revealed="SSN: 123-45-1234">
124
+ </zn-reveal>
125
+ ```
126
+
127
+ ### Hover-Only Behavior
128
+
129
+ Without a duration or with hover, the content is revealed only while hovering and hidden when the mouse leaves.
130
+
131
+ ```html:preview
132
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
133
+ <div>
134
+ <strong>Username:</strong>
135
+ <zn-reveal initial="u********"
136
+ revealed="user12345">
137
+ </zn-reveal>
138
+ </div>
139
+
140
+ <div>
141
+ <strong>Email:</strong>
142
+ <zn-reveal initial="e****@example.com"
143
+ revealed="email@example.com">
144
+ </zn-reveal>
145
+ </div>
146
+ </div>
147
+ <p style="font-size: 0.875rem; color: var(--zn-color-neutral-600); margin-top: 0.5rem;">
148
+ Hover to reveal
149
+ </p>
150
+ ```
151
+
152
+ ### Click and Hover Combined
153
+
154
+ When duration is set, clicking toggles temporarily while hovering still works. After clicking, the content remains revealed for the duration, and hovering won't hide it until the duration expires.
155
+
156
+ ```html:preview
157
+ <zn-reveal duration="4000"
158
+ initial="Token: ••••••••••••"
159
+ revealed="Token: abc123xyz789">
160
+ </zn-reveal>
161
+ <p style="font-size: 0.875rem; color: var(--zn-color-neutral-600); margin-top: 0.5rem;">
162
+ Hover to peek, click to lock for 4 seconds
163
+ </p>
164
+ ```
165
+
166
+ ### Partial Masking Patterns
167
+
168
+ Different approaches to masking information while still providing context.
19
169
 
20
- TODO
170
+ ```html:preview
171
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
172
+ <div>
173
+ <strong>Email (prefix):</strong>
174
+ <zn-reveal initial="john***@gmail.com"
175
+ revealed="john.doe.smith@gmail.com">
176
+ </zn-reveal>
177
+ </div>
178
+
179
+ <div>
180
+ <strong>Email (suffix):</strong>
181
+ <zn-reveal initial="j***e@example.com"
182
+ revealed="john.doe@example.com">
183
+ </zn-reveal>
184
+ </div>
185
+
186
+ <div>
187
+ <strong>Phone (last 4):</strong>
188
+ <zn-reveal initial="(•••) •••-5678"
189
+ revealed="(555) 123-5678">
190
+ </zn-reveal>
191
+ </div>
192
+
193
+ <div>
194
+ <strong>IP Address:</strong>
195
+ <zn-reveal initial="192.168.***.***"
196
+ revealed="192.168.1.100">
197
+ </zn-reveal>
198
+ </div>
199
+ </div>
200
+ ```
201
+
202
+ ### In a Table
203
+
204
+ Use reveals within table cells to protect sensitive data in tabular layouts.
205
+
206
+ ```html:preview
207
+ <table style="width: 100%; border-collapse: collapse;">
208
+ <thead>
209
+ <tr style="border-bottom: 2px solid var(--zn-color-neutral-200);">
210
+ <th style="text-align: left; padding: 0.5rem;">Name</th>
211
+ <th style="text-align: left; padding: 0.5rem;">Email</th>
212
+ <th style="text-align: left; padding: 0.5rem;">Phone</th>
213
+ </tr>
214
+ </thead>
215
+ <tbody>
216
+ <tr style="border-bottom: 1px solid var(--zn-color-neutral-200);">
217
+ <td style="padding: 0.5rem;">Alice Johnson</td>
218
+ <td style="padding: 0.5rem;">
219
+ <zn-reveal initial="a***@example.com"
220
+ revealed="alice.j@example.com">
221
+ </zn-reveal>
222
+ </td>
223
+ <td style="padding: 0.5rem;">
224
+ <zn-reveal initial="•••-•••-1234"
225
+ revealed="555-123-1234">
226
+ </zn-reveal>
227
+ </td>
228
+ </tr>
229
+ <tr style="border-bottom: 1px solid var(--zn-color-neutral-200);">
230
+ <td style="padding: 0.5rem;">Bob Smith</td>
231
+ <td style="padding: 0.5rem;">
232
+ <zn-reveal initial="b***@example.com"
233
+ revealed="bob.smith@example.com">
234
+ </zn-reveal>
235
+ </td>
236
+ <td style="padding: 0.5rem;">
237
+ <zn-reveal initial="•••-•••-5678"
238
+ revealed="555-987-5678">
239
+ </zn-reveal>
240
+ </td>
241
+ </tr>
242
+ </tbody>
243
+ </table>
244
+ ```
245
+
246
+ ### In a Form
247
+
248
+ Integrate reveals into forms for password fields or sensitive input displays.
249
+
250
+ ```html:preview
251
+ <div style="max-width: 400px; display: flex; flex-direction: column; gap: 1rem;">
252
+ <div>
253
+ <label style="display: block; margin-bottom: 0.5rem; font-weight: 500;">
254
+ Current Password
255
+ </label>
256
+ <zn-reveal duration="2000"
257
+ initial="••••••••"
258
+ revealed="MyP@ssw0rd"
259
+ style="width: 100%; display: block; padding: 0.5rem; background: var(--zn-color-neutral-100); border-radius: 4px;">
260
+ </zn-reveal>
261
+ </div>
262
+
263
+ <div>
264
+ <label style="display: block; margin-bottom: 0.5rem; font-weight: 500;">
265
+ Email Address
266
+ </label>
267
+ <zn-reveal initial="user***@example.com"
268
+ revealed="user.name@example.com"
269
+ style="width: 100%; display: block; padding: 0.5rem; background: var(--zn-color-neutral-100); border-radius: 4px;">
270
+ </zn-reveal>
271
+ </div>
272
+ </div>
273
+ ```
274
+
275
+ ### Settings Panel Example
276
+
277
+ A practical example showing credential management in a settings interface.
278
+
279
+ ```html:preview
280
+ <div style="max-width: 600px; border: 1px solid var(--zn-color-neutral-200); border-radius: 8px; overflow: hidden;">
281
+ <div style="padding: 1.5rem; background: var(--zn-color-neutral-50); border-bottom: 1px solid var(--zn-color-neutral-200);">
282
+ <h3 style="margin: 0;">API Credentials</h3>
283
+ <p style="margin: 0.5rem 0 0 0; font-size: 0.875rem; color: var(--zn-color-neutral-600);">
284
+ Manage your API access credentials
285
+ </p>
286
+ </div>
287
+
288
+ <div style="padding: 1.5rem; display: flex; flex-direction: column; gap: 1.5rem;">
289
+ <div>
290
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
291
+ <strong>Public Key</strong>
292
+ <zn-chip size="small" type="success">Active</zn-chip>
293
+ </div>
294
+ <zn-reveal duration="5000"
295
+ initial="pk_live_••••••••••••••••••••"
296
+ revealed="pk_live_abcdef1234567890"
297
+ style="font-family: monospace; padding: 0.75rem; background: var(--zn-color-neutral-100); border-radius: 4px; display: block;">
298
+ </zn-reveal>
299
+ <div style="margin-top: 0.5rem; font-size: 0.75rem; color: var(--zn-color-neutral-600);">
300
+ Click to reveal for 5 seconds
301
+ </div>
302
+ </div>
303
+
304
+ <div>
305
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
306
+ <strong>Secret Key</strong>
307
+ <zn-chip size="small" type="warning">Sensitive</zn-chip>
308
+ </div>
309
+ <zn-reveal duration="5000"
310
+ initial="sk_live_••••••••••••••••••••"
311
+ revealed="sk_live_xyz7890abcdef1234"
312
+ style="font-family: monospace; padding: 0.75rem; background: var(--zn-color-neutral-100); border-radius: 4px; display: block;">
313
+ </zn-reveal>
314
+ <div style="margin-top: 0.5rem; font-size: 0.75rem; color: var(--zn-color-neutral-600);">
315
+ Click to reveal for 5 seconds
316
+ </div>
317
+ </div>
318
+
319
+ <div>
320
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
321
+ <strong>Webhook Secret</strong>
322
+ <zn-chip size="small" type="info">Optional</zn-chip>
323
+ </div>
324
+ <zn-reveal duration="5000"
325
+ initial="whsec_••••••••••••••••••••"
326
+ revealed="whsec_1234567890abcdefghij"
327
+ style="font-family: monospace; padding: 0.75rem; background: var(--zn-color-neutral-100); border-radius: 4px; display: block;">
328
+ </zn-reveal>
329
+ <div style="margin-top: 0.5rem; font-size: 0.75rem; color: var(--zn-color-neutral-600);">
330
+ Click to reveal for 5 seconds
331
+ </div>
332
+ </div>
333
+ </div>
334
+ </div>
335
+ ```
336
+
337
+ ### User Profile Example
338
+
339
+ Show masked personal information that can be revealed on demand.
340
+
341
+ ```html:preview
342
+ <div style="max-width: 500px; border: 1px solid var(--zn-color-neutral-200); border-radius: 8px; padding: 1.5rem;">
343
+ <h3 style="margin: 0 0 1rem 0;">Personal Information</h3>
344
+
345
+ <div style="display: grid; gap: 1rem;">
346
+ <div style="display: grid; grid-template-columns: 140px 1fr; gap: 1rem; align-items: center;">
347
+ <span style="font-weight: 500;">Email:</span>
348
+ <zn-reveal initial="j***@example.com"
349
+ revealed="john.doe@example.com">
350
+ </zn-reveal>
351
+ </div>
352
+
353
+ <div style="display: grid; grid-template-columns: 140px 1fr; gap: 1rem; align-items: center;">
354
+ <span style="font-weight: 500;">Phone:</span>
355
+ <zn-reveal initial="+1 (•••) •••-5678"
356
+ revealed="+1 (555) 123-5678">
357
+ </zn-reveal>
358
+ </div>
359
+
360
+ <div style="display: grid; grid-template-columns: 140px 1fr; gap: 1rem; align-items: center;">
361
+ <span style="font-weight: 500;">SSN:</span>
362
+ <zn-reveal duration="3000"
363
+ initial="•••-••-6789"
364
+ revealed="123-45-6789">
365
+ </zn-reveal>
366
+ </div>
367
+
368
+ <div style="display: grid; grid-template-columns: 140px 1fr; gap: 1rem; align-items: center;">
369
+ <span style="font-weight: 500;">Address:</span>
370
+ <zn-reveal initial="123 Main St, ••••••"
371
+ revealed="123 Main St, Anytown, CA 12345">
372
+ </zn-reveal>
373
+ </div>
374
+ </div>
375
+ </div>
376
+ ```
21
377
 
22
- ### Second Example
378
+ ### Programmatic Control
23
379
 
24
- TODO
380
+ Control the reveal state programmatically using JavaScript.
381
+
382
+ ```html:preview
383
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
384
+ <div>
385
+ <strong>Secret Code:</strong>
386
+ <zn-reveal id="programmatic-reveal"
387
+ duration="0"
388
+ initial="••••••••"
389
+ revealed="ABC12345">
390
+ </zn-reveal>
391
+ </div>
392
+
393
+ <div style="display: flex; gap: 0.5rem;">
394
+ <zn-button id="trigger-click">Trigger Click</zn-button>
395
+ <zn-button id="trigger-hover" color="secondary">Trigger Hover</zn-button>
396
+ <zn-button id="trigger-leave" color="info">Trigger Leave</zn-button>
397
+ </div>
398
+ </div>
399
+
400
+ <script type="module">
401
+ const reveal = document.getElementById('programmatic-reveal');
402
+
403
+ document.getElementById('trigger-click').addEventListener('click', () => {
404
+ reveal.handleToggleReveal();
405
+ });
406
+
407
+ document.getElementById('trigger-hover').addEventListener('click', () => {
408
+ reveal.handleMouseEnter();
409
+ });
410
+
411
+ document.getElementById('trigger-leave').addEventListener('click', () => {
412
+ reveal.handleMouseLeave();
413
+ });
414
+ </script>
415
+ ```
416
+
417
+ ### State Monitoring
418
+
419
+ Monitor when the reveal is shown or hidden using event listeners or observers.
420
+
421
+ ```html:preview
422
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
423
+ <div>
424
+ <strong>Monitored Secret:</strong>
425
+ <zn-reveal id="monitored-reveal"
426
+ duration="2000"
427
+ initial="Hidden: ••••••••"
428
+ revealed="Revealed: SECRET123">
429
+ </zn-reveal>
430
+ </div>
431
+
432
+ <div id="state-display" style="padding: 1rem; background: var(--zn-color-neutral-100); border-radius: 4px;">
433
+ <strong>State:</strong> <span id="state-value">Hidden</span><br>
434
+ <strong>Interactions:</strong> <span id="interaction-count">0</span>
435
+ </div>
436
+ </div>
437
+
438
+ <script type="module">
439
+ const reveal = document.getElementById('monitored-reveal');
440
+ const stateValue = document.getElementById('state-value');
441
+ const interactionCount = document.getElementById('interaction-count');
442
+ let count = 0;
443
+
444
+ // Monitor click events
445
+ reveal.addEventListener('click', () => {
446
+ count++;
447
+ interactionCount.textContent = count;
448
+ stateValue.textContent = 'Revealed (click)';
449
+ stateValue.style.color = 'var(--zn-color-success)';
450
+ });
451
+
452
+ // Monitor mouse enter
453
+ reveal.addEventListener('mouseenter', () => {
454
+ if (!reveal._isToggled) {
455
+ stateValue.textContent = 'Revealed (hover)';
456
+ stateValue.style.color = 'var(--zn-color-info)';
457
+ }
458
+ });
459
+
460
+ // Monitor mouse leave
461
+ reveal.addEventListener('mouseleave', () => {
462
+ if (!reveal._isToggled) {
463
+ stateValue.textContent = 'Hidden';
464
+ stateValue.style.color = 'var(--zn-color-neutral-600)';
465
+ }
466
+ });
467
+ </script>
468
+ ```
469
+
470
+ ### Custom Styling
471
+
472
+ Apply custom styles to match your design system.
473
+
474
+ ```html:preview
475
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
476
+ <zn-reveal initial="Standard: ••••••"
477
+ revealed="Standard: abc123"
478
+ style="padding: 0.5rem 1rem; background: var(--zn-color-neutral-100); border-radius: 4px;">
479
+ </zn-reveal>
480
+
481
+ <zn-reveal initial="Primary: ••••••"
482
+ revealed="Primary: def456"
483
+ style="padding: 0.5rem 1rem; background: var(--zn-color-primary-50); border: 1px solid var(--zn-color-primary-200); border-radius: 4px; color: var(--zn-color-primary-700);">
484
+ </zn-reveal>
485
+
486
+ <zn-reveal initial="Success: ••••••"
487
+ revealed="Success: ghi789"
488
+ style="padding: 0.5rem 1rem; background: var(--zn-color-success-50); border: 1px solid var(--zn-color-success-200); border-radius: 4px; color: var(--zn-color-success-700);">
489
+ </zn-reveal>
490
+
491
+ <zn-reveal initial="Monospace: ••••••"
492
+ revealed="Monospace: jkl012"
493
+ style="padding: 0.5rem 1rem; background: var(--zn-color-neutral-900); color: var(--zn-color-neutral-100); border-radius: 4px; font-family: 'Courier New', monospace;">
494
+ </zn-reveal>
495
+ </div>
496
+ ```
497
+
498
+ ### Best Practices
499
+
500
+ Here are some best practices when using the reveal component:
501
+
502
+ 1. **Use appropriate masking patterns** - Show enough context (like email domain) so users know what they're revealing
503
+ 2. **Set appropriate durations** - Use 3-5 seconds for data that needs to be copied, 1-2 seconds for quick verification
504
+ 3. **Provide visual feedback** - Style the component so it's clear it's interactive
505
+ 4. **Consider security context** - Use longer durations or permanent toggles for less sensitive data, shorter durations for highly sensitive data
506
+ 5. **Add helper text** - Include instructions like "Click to reveal" or "Hover to show" when the interaction pattern isn't obvious
507
+ 6. **Use in combination with other security measures** - Reveals are for UI convenience, not true security
508
+
509
+ ```html:preview
510
+ <div style="max-width: 600px; display: flex; flex-direction: column; gap: 1.5rem;">
511
+ <!-- Good: Clear context and instructions -->
512
+ <div style="padding: 1rem; border: 1px solid var(--zn-color-success-200); border-radius: 4px; background: var(--zn-color-success-50);">
513
+ <div style="font-weight: 500; color: var(--zn-color-success-700); margin-bottom: 0.5rem;">
514
+ ✓ Good Example
515
+ </div>
516
+ <div style="margin-bottom: 0.5rem;">
517
+ <strong>API Key:</strong>
518
+ <zn-reveal duration="5000"
519
+ initial="pk_live_••••••••••••1234"
520
+ revealed="pk_live_abc123def456789"
521
+ style="font-family: monospace; padding: 0.25rem 0.5rem; background: white; border-radius: 4px; margin-left: 0.5rem;">
522
+ </zn-reveal>
523
+ </div>
524
+ <div style="font-size: 0.75rem; color: var(--zn-color-neutral-600);">
525
+ Click to reveal for 5 seconds. Last 4 digits shown for reference.
526
+ </div>
527
+ </div>
528
+
529
+ <!-- Bad: No context -->
530
+ <div style="padding: 1rem; border: 1px solid var(--zn-color-danger-200); border-radius: 4px; background: var(--zn-color-danger-50);">
531
+ <div style="font-weight: 500; color: var(--zn-color-danger-700); margin-bottom: 0.5rem;">
532
+ ✗ Avoid This
533
+ </div>
534
+ <zn-reveal initial="••••••••••••••••••••"
535
+ revealed="pk_live_abc123def456789">
536
+ </zn-reveal>
537
+ <div style="font-size: 0.75rem; color: var(--zn-color-neutral-600); margin-top: 0.5rem;">
538
+ No context about what this is or how to interact with it.
539
+ </div>
540
+ </div>
541
+ </div>
542
+ ```