wally-ui 1.11.0 → 1.11.1

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.
@@ -1,32 +1,49 @@
1
- <div class="font-mono">
2
- <div class="max-w-4xl mx-auto p-6">
3
- <div class="mb-4">
1
+ <main class="min-h-dvh bg-white dark:bg-[#0a0a0a] font-mono" role="main">
2
+ <div class="max-w-4xl mx-auto px-4 py-8 sm:px-6 md:px-8">
3
+
4
+ <!-- Breadcrumb Navigation -->
5
+ <nav class="mb-8" aria-label="Breadcrumb navigation">
4
6
  <wally-breadcrumb [items]="breadcrumbItems"></wally-breadcrumb>
5
- </div>
7
+ </nav>
6
8
 
7
9
  <!-- Header -->
8
- <h1 class="text-2xl font-bold mb-4 text-[#0a0a0a] dark:text-white">
9
- Button
10
- </h1>
11
- <p class="text-gray-700 dark:text-gray-400 mb-4">
12
- A production-ready button component with multiple variants, loading states, notifications, and comprehensive
13
- accessibility support. Built with Angular Signals and optimized for modern applications.
14
- </p>
15
-
16
- <!-- AI Prompts -->
17
- <div class="flex flex-wrap gap-2 mb-6">
10
+ <header class="mb-12" role="banner">
11
+ <h1 id="page-title" class="text-3xl sm:text-4xl font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
12
+ <span aria-hidden="true">&gt;_ </span>Button
13
+ </h1>
14
+ <p
15
+ class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 border-l-2 border-neutral-300 dark:border-neutral-700 pl-4 leading-relaxed">
16
+ Production-ready button component with multiple variants, loading states, notifications, and comprehensive
17
+ accessibility support. Built with Angular Signals and optimized for modern applications.
18
+ </p>
19
+ </header>
20
+
21
+ <!-- AI Assistant Links -->
22
+ <div class="flex flex-wrap gap-0 mt-6 mb-12 border-2 border-neutral-300 dark:border-neutral-700" role="list"
23
+ aria-label="Open documentation in AI coding assistants">
18
24
  <a [href]="claudeUrl" target="_blank"
19
- class="inline-flex items-center gap-2 px-3 py-1.5 text-xs bg-gray-200 dark:bg-[#121212] text-gray-600 dark:text-gray-300 rounded-lg hover:bg-gray-300 dark:hover:bg-[#1a1a1a] hover:text-[#0a0a0a] dark:hover:text-white transition-colors">
20
- <svg xmlns="http://www.w3.org/2000/svg" class="size-6" viewBox="0 0 24 24">
25
+ class="group flex-1 min-w-[200px] flex items-center justify-center gap-2 px-4 py-3 bg-white dark:bg-[#0a0a0a] border-b-2 sm:border-b-0 sm:border-r-2 border-neutral-300 dark:border-neutral-700 hover:bg-[#0a0a0a] dark:hover:bg-white transition-all duration-150 cursor-pointer"
26
+ rel="noopener noreferrer" role="listitem"
27
+ aria-label="Open Button component documentation in Claude AI assistant (opens in new tab)">
28
+ <svg xmlns="http://www.w3.org/2000/svg"
29
+ class="size-5 text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150"
30
+ viewBox="0 0 24 24" aria-hidden="true">
21
31
  <path fill="currentColor"
22
32
  d="m4.714 15.956l4.718-2.648l.079-.23l-.08-.128h-.23l-.79-.048l-2.695-.073l-2.337-.097l-2.265-.122l-.57-.121l-.535-.704l.055-.353l.48-.321l.685.06l1.518.104l2.277.157l1.651.098l2.447.255h.389l.054-.158l-.133-.097l-.103-.098l-2.356-1.596l-2.55-1.688l-1.336-.972l-.722-.491L2 6.223l-.158-1.008l.656-.722l.88.06l.224.061l.893.686l1.906 1.476l2.49 1.833l.364.304l.146-.104l.018-.072l-.164-.274l-1.354-2.446l-1.445-2.49l-.644-1.032l-.17-.619a3 3 0 0 1-.103-.729L6.287.133L6.7 0l.995.134l.42.364l.619 1.415L9.735 4.14l1.555 3.03l.455.898l.243.832l.09.255h.159V9.01l.127-1.706l.237-2.095l.23-2.695l.08-.76l.376-.91l.747-.492l.583.28l.48.685l-.067.444l-.286 1.851l-.558 2.903l-.365 1.942h.213l.243-.242l.983-1.306l1.652-2.064l.728-.82l.85-.904l.547-.431h1.032l.759 1.129l-.34 1.166l-1.063 1.347l-.88 1.142l-1.263 1.7l-.79 1.36l.074.11l.188-.02l2.853-.606l1.542-.28l1.84-.315l.832.388l.09.395l-.327.807l-1.967.486l-2.307.462l-3.436.813l-.043.03l.049.061l1.548.146l.662.036h1.62l3.018.225l.79.522l.473.638l-.08.485l-1.213.62l-1.64-.389l-3.825-.91l-1.31-.329h-.183v.11l1.093 1.068l2.003 1.81l2.508 2.33l.127.578l-.321.455l-.34-.049l-2.204-1.657l-.85-.747l-1.925-1.62h-.127v.17l.443.649l2.343 3.521l.122 1.08l-.17.353l-.607.213l-.668-.122l-1.372-1.924l-1.415-2.168l-1.141-1.943l-.14.08l-.674 7.254l-.316.37l-.728.28l-.607-.461l-.322-.747l.322-1.476l.388-1.924l.316-1.53l.285-1.9l.17-.632l-.012-.042l-.14.018l-1.432 1.967l-2.18 2.945l-1.724 1.845l-.413.164l-.716-.37l.066-.662l.401-.589l2.386-3.036l1.439-1.882l.929-1.086l-.006-.158h-.055L4.138 18.56l-1.13.146l-.485-.456l.06-.746l.231-.243l1.907-1.312Z" />
23
33
  </svg>
24
- Open in Claude
34
+ <span
35
+ class="text-xs sm:text-sm font-medium text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150">
36
+ Open in Claude
37
+ </span>
25
38
  </a>
26
39
 
27
40
  <a [href]="chatGptUrl" target="_blank"
28
- class="inline-flex items-center gap-2 px-3 py-1.5 text-xs bg-gray-200 dark:bg-[#121212] text-gray-600 dark:text-gray-300 rounded-lg hover:bg-gray-300 dark:hover:bg-[#1a1a1a] hover:text-[#0a0a0a] dark:hover:text-white transition-colors">
29
- <svg xmlns="http://www.w3.org/2000/svg" class="size-6" viewBox="0 0 48 48">
41
+ class="group flex-1 min-w-[200px] flex items-center justify-center gap-2 px-4 py-3 bg-white dark:bg-[#0a0a0a] hover:bg-[#0a0a0a] dark:hover:bg-white transition-all duration-150 cursor-pointer"
42
+ rel="noopener noreferrer" role="listitem"
43
+ aria-label="Open Button component documentation in ChatGPT AI assistant (opens in new tab)">
44
+ <svg xmlns="http://www.w3.org/2000/svg"
45
+ class="size-5 text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150"
46
+ viewBox="0 0 48 48" aria-hidden="true">
30
47
  <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
31
48
  d="M18.38 27.94v-14.4l11.19-6.46c6.2-3.58 17.3 5.25 12.64 13.33" />
32
49
  <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
@@ -40,46 +57,65 @@
40
57
  <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
41
58
  d="m24.44 31.44l-12.47-7.2V11.31c0-7.16 13.2-12.36 17.86-4.28" />
42
59
  </svg>
43
- Open in ChatGPT
60
+ <span
61
+ class="text-xs sm:text-sm font-medium text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150">
62
+ Open in ChatGPT
63
+ </span>
44
64
  </a>
45
65
  </div>
46
66
 
47
67
  <!-- Installation -->
48
- <section class="mb-8">
49
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Installation</h2>
50
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
51
- <pre><code [innerHTML]="basicUsageCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
52
- </div>
68
+ <section id="installation" class="mb-12" aria-labelledby="installation-heading">
69
+ <h2 id="installation-heading"
70
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
71
+ [ Installation ]
72
+ </h2>
73
+ <code
74
+ class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white block bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3"
75
+ aria-label="Installation command for Button component">
76
+ <pre><code [innerHTML]="basicUsageCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
77
+ </code>
53
78
  </section>
54
79
 
55
80
  <!-- Import -->
56
- <section class="mb-8">
57
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Import</h2>
58
- <div class="space-y-4">
59
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
60
- <pre><code [innerHTML]="importCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
81
+ <section id="import" class="mb-12" aria-labelledby="import-heading">
82
+ <h2 id="import-heading"
83
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
84
+ [ Import ]
85
+ </h2>
86
+ <div class="space-y-3">
87
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
88
+ <pre><code [innerHTML]="importCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
61
89
  </div>
62
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
63
- <pre><code [innerHTML]="componentImportCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
90
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
91
+ <pre><code [innerHTML]="componentImportCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
64
92
  </div>
65
93
  </div>
66
94
  </section>
67
95
 
68
96
  <!-- Basic Usage -->
69
- <section class="mb-8">
70
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Basic Usage</h2>
71
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
72
- <pre><code [innerHTML]="basicUsageTemplateCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
73
- </div>
74
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
97
+ <section id="basic-usage" class="mb-12" aria-labelledby="basic-usage-heading">
98
+ <h2 id="basic-usage-heading"
99
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
100
+ [ Basic Usage ]
101
+ </h2>
102
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
103
+ <pre><code [innerHTML]="basicUsageTemplateCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
104
+ </div>
105
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
106
+ aria-label="Live preview of basic button">
75
107
  <wally-button>Click me</wally-button>
76
108
  </div>
77
109
  </section>
78
110
 
79
111
  <!-- All Variants Preview -->
80
- <section class="mb-8">
81
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">All Variants</h2>
82
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
112
+ <section id="all-variants" class="mb-12" aria-labelledby="variants-preview-heading">
113
+ <h2 id="variants-preview-heading"
114
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
115
+ [ All Variants ]
116
+ </h2>
117
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
118
+ aria-label="Live preview of all button variants">
83
119
  <div class="flex flex-col gap-4">
84
120
  <wally-button variant="primary">Primary</wally-button>
85
121
  <wally-button variant="secondary">Secondary</wally-button>
@@ -92,129 +128,163 @@
92
128
  </section>
93
129
 
94
130
  <!-- Variants Documentation -->
95
- <section class="mb-8">
96
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Variants</h2>
131
+ <section id="variants" class="mb-12" aria-labelledby="variants-heading">
132
+ <h2 id="variants-heading"
133
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
134
+ [ Variants ]
135
+ </h2>
97
136
 
98
137
  <!-- Primary -->
99
- <div class="mb-6">
100
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Primary (Default)</h3>
101
- <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
138
+ <article class="mb-8" aria-labelledby="primary-variant-heading">
139
+ <h3 id="primary-variant-heading"
140
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
141
+ <span aria-hidden="true">&gt; </span>Primary (Default)
142
+ </h3>
143
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
102
144
  High emphasis. Use for main actions and CTAs.
103
145
  </p>
104
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
105
- <pre><code [innerHTML]="primaryVariantCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
146
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
147
+ <pre><code [innerHTML]="primaryVariantCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
106
148
  </div>
107
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
108
- <div class="flex flex-col gap-2">
149
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
150
+ aria-label="Live preview of primary button variant in normal, disabled, and loading states">
151
+ <div class="flex flex-col gap-4">
109
152
  <wally-button variant="primary">Primary</wally-button>
110
153
  <wally-button variant="primary" [disabled]="true">Disabled</wally-button>
111
154
  <wally-button variant="primary" [loading]="true">Loading</wally-button>
112
155
  </div>
113
156
  </div>
114
- </div>
157
+ </article>
115
158
 
116
159
  <!-- Secondary -->
117
- <div class="mb-6">
118
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Secondary</h3>
119
- <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
160
+ <article class="mb-8" aria-labelledby="secondary-variant-heading">
161
+ <h3 id="secondary-variant-heading"
162
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
163
+ <span aria-hidden="true">&gt; </span>Secondary
164
+ </h3>
165
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
120
166
  Medium emphasis. Use for secondary actions.
121
167
  </p>
122
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
123
- <pre><code [innerHTML]="secondaryVariantCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
168
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
169
+ <pre><code [innerHTML]="secondaryVariantCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
124
170
  </div>
125
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
126
- <div class="flex flex-col gap-2">
171
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
172
+ aria-label="Live preview of secondary button variant in normal, disabled, and loading states">
173
+ <div class="flex flex-col gap-4">
127
174
  <wally-button variant="secondary">Secondary</wally-button>
128
175
  <wally-button variant="secondary" [disabled]="true">Disabled</wally-button>
129
176
  <wally-button variant="secondary" [loading]="true">Loading</wally-button>
130
177
  </div>
131
178
  </div>
132
- </div>
179
+ </article>
133
180
 
134
181
  <!-- Destructive -->
135
- <div class="mb-6">
136
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Destructive</h3>
137
- <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
182
+ <article class="mb-8" aria-labelledby="destructive-variant-heading">
183
+ <h3 id="destructive-variant-heading"
184
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
185
+ <span aria-hidden="true">&gt; </span>Destructive
186
+ </h3>
187
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
138
188
  Use for dangerous actions like delete or remove.
139
189
  </p>
140
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
141
- <pre><code [innerHTML]="destructiveVariantCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
190
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
191
+ <pre><code [innerHTML]="destructiveVariantCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
142
192
  </div>
143
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
144
- <div class="flex flex-col gap-2">
193
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
194
+ aria-label="Live preview of destructive button variant in normal, disabled, and loading states">
195
+ <div class="flex flex-col gap-4">
145
196
  <wally-button variant="destructive">Delete</wally-button>
146
197
  <wally-button variant="destructive" [disabled]="true">Disabled</wally-button>
147
198
  <wally-button variant="destructive" [loading]="true">Deleting...</wally-button>
148
199
  </div>
149
200
  </div>
150
- </div>
201
+ </article>
151
202
 
152
203
  <!-- Outline -->
153
- <div class="mb-6">
154
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Outline</h3>
155
- <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
204
+ <article class="mb-8" aria-labelledby="outline-variant-heading">
205
+ <h3 id="outline-variant-heading"
206
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
207
+ <span aria-hidden="true">&gt; </span>Outline
208
+ </h3>
209
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
156
210
  Low emphasis with border. Use for tertiary actions.
157
211
  </p>
158
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
159
- <pre><code [innerHTML]="outlineVariantCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
212
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
213
+ <pre><code [innerHTML]="outlineVariantCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
160
214
  </div>
161
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
162
- <div class="flex flex-col gap-2">
215
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
216
+ aria-label="Live preview of outline button variant in normal, disabled, and loading states">
217
+ <div class="flex flex-col gap-4">
163
218
  <wally-button variant="outline">Outline</wally-button>
164
219
  <wally-button variant="outline" [disabled]="true">Disabled</wally-button>
165
220
  <wally-button variant="outline" [loading]="true">Loading</wally-button>
166
221
  </div>
167
222
  </div>
168
- </div>
223
+ </article>
169
224
 
170
225
  <!-- Ghost -->
171
- <div class="mb-6">
172
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Ghost</h3>
173
- <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
226
+ <article class="mb-8" aria-labelledby="ghost-variant-heading">
227
+ <h3 id="ghost-variant-heading"
228
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
229
+ <span aria-hidden="true">&gt; </span>Ghost
230
+ </h3>
231
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
174
232
  Minimal styling. Use for less prominent actions.
175
233
  </p>
176
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
177
- <pre><code [innerHTML]="ghostVariantCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
234
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
235
+ <pre><code [innerHTML]="ghostVariantCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
178
236
  </div>
179
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
180
- <div class="flex flex-col gap-2">
237
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
238
+ aria-label="Live preview of ghost button variant in normal, disabled, and loading states">
239
+ <div class="flex flex-col gap-4">
181
240
  <wally-button variant="ghost">Ghost</wally-button>
182
241
  <wally-button variant="ghost" [disabled]="true">Disabled</wally-button>
183
242
  <wally-button variant="ghost" [loading]="true">Loading</wally-button>
184
243
  </div>
185
244
  </div>
186
- </div>
245
+ </article>
187
246
 
188
247
  <!-- Link -->
189
- <div class="mb-6">
190
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Link</h3>
191
- <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
248
+ <article class="mb-8" aria-labelledby="link-variant-heading">
249
+ <h3 id="link-variant-heading"
250
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
251
+ <span aria-hidden="true">&gt; </span>Link
252
+ </h3>
253
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
192
254
  Styled as a link. Supports internal routing and external URLs.
193
255
  </p>
194
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
195
- <pre><code [innerHTML]="linkVariantCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
256
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
257
+ <pre><code [innerHTML]="linkVariantCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
196
258
  </div>
197
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
198
- <div class="flex flex-col gap-2">
259
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
260
+ aria-label="Live preview of link button variant with internal route, external URL, and disabled state">
261
+ <div class="flex flex-col gap-4">
199
262
  <wally-button variant="link" href="/components">Internal Link</wally-button>
200
263
  <wally-button variant="link" href="https://github.com">External Link</wally-button>
201
264
  <wally-button variant="link" [disabled]="true">Disabled</wally-button>
202
265
  </div>
203
266
  </div>
204
- </div>
267
+ </article>
205
268
  </section>
206
269
 
207
270
  <!-- Production Examples -->
208
- <section class="mb-8">
209
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Production Examples</h2>
271
+ <section id="production-examples" class="mb-12" aria-labelledby="production-heading">
272
+ <h2 id="production-heading"
273
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
274
+ [ Production Examples ]
275
+ </h2>
210
276
 
211
277
  <!-- CTA -->
212
- <div class="mb-6">
213
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Call-to-Action Button</h3>
214
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
215
- <pre><code [innerHTML]="ctaExampleCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
216
- </div>
217
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
278
+ <article class="mb-8" aria-labelledby="cta-example-heading">
279
+ <h3 id="cta-example-heading"
280
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
281
+ <span aria-hidden="true">&gt; </span>Call-to-Action Button
282
+ </h3>
283
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
284
+ <pre><code [innerHTML]="ctaExampleCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
285
+ </div>
286
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
287
+ aria-label="Live preview of call-to-action button with icon">
218
288
  <wally-button>
219
289
  Get Started Free
220
290
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2"
@@ -223,48 +293,60 @@
223
293
  </svg>
224
294
  </wally-button>
225
295
  </div>
226
- </div>
296
+ </article>
227
297
 
228
298
  <!-- Login Form -->
229
- <div class="mb-6">
230
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Login Form</h3>
231
- <div class="space-y-4">
232
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
233
- <pre><code [innerHTML]="loginExampleCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
299
+ <article class="mb-8" aria-labelledby="login-example-heading">
300
+ <h3 id="login-example-heading"
301
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
302
+ <span aria-hidden="true">&gt; </span>Login Form
303
+ </h3>
304
+ <div class="space-y-3">
305
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
306
+ <pre><code [innerHTML]="loginExampleCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
234
307
  </div>
235
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
236
- <pre><code [innerHTML]="loginExampleTsCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
308
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
309
+ <pre><code [innerHTML]="loginExampleTsCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
237
310
  </div>
238
311
  </div>
239
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212] mt-4">
312
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] mt-4" role="img"
313
+ aria-label="Live preview of login form buttons with primary submit and secondary create account">
240
314
  <div class="flex gap-2">
241
315
  <wally-button type="submit">Sign In</wally-button>
242
316
  <wally-button variant="secondary">Create Account</wally-button>
243
317
  </div>
244
318
  </div>
245
- </div>
319
+ </article>
246
320
 
247
321
  <!-- Delete Confirmation -->
248
- <div class="mb-6">
249
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Delete Confirmation Modal</h3>
250
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
251
- <pre><code [innerHTML]="deleteExampleCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
252
- </div>
253
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
322
+ <article class="mb-8" aria-labelledby="delete-example-heading">
323
+ <h3 id="delete-example-heading"
324
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
325
+ <span aria-hidden="true">&gt; </span>Delete Confirmation Modal
326
+ </h3>
327
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
328
+ <pre><code [innerHTML]="deleteExampleCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
329
+ </div>
330
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
331
+ aria-label="Live preview of delete confirmation modal buttons with ghost cancel and destructive delete">
254
332
  <div class="flex gap-2 justify-end">
255
333
  <wally-button variant="ghost">Cancel</wally-button>
256
334
  <wally-button variant="destructive">Delete Account</wally-button>
257
335
  </div>
258
336
  </div>
259
- </div>
337
+ </article>
260
338
 
261
339
  <!-- Dashboard Actions -->
262
- <div class="mb-6">
263
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Dashboard Actions</h3>
264
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
265
- <pre><code [innerHTML]="dashboardExampleCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
266
- </div>
267
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
340
+ <article class="mb-8" aria-labelledby="dashboard-example-heading">
341
+ <h3 id="dashboard-example-heading"
342
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
343
+ <span aria-hidden="true">&gt; </span>Dashboard Actions
344
+ </h3>
345
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
346
+ <pre><code [innerHTML]="dashboardExampleCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
347
+ </div>
348
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
349
+ aria-label="Live preview of dashboard action buttons with outline export and primary create new">
268
350
  <div class="flex gap-2">
269
351
  <wally-button variant="outline">
270
352
  Export
@@ -283,42 +365,57 @@
283
365
  </wally-button>
284
366
  </div>
285
367
  </div>
286
- </div>
368
+ </article>
287
369
  </section>
288
370
 
289
371
  <!-- States -->
290
- <section class="mb-8">
291
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">States</h2>
372
+ <section id="states" class="mb-12" aria-labelledby="states-heading">
373
+ <h2 id="states-heading"
374
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
375
+ [ States ]
376
+ </h2>
292
377
 
293
378
  <!-- Disabled -->
294
- <div class="mb-6">
295
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Disabled</h3>
296
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
297
- <pre><code [innerHTML]="disabledCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
298
- </div>
299
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
379
+ <article class="mb-8" aria-labelledby="disabled-state-heading">
380
+ <h3 id="disabled-state-heading"
381
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
382
+ <span aria-hidden="true">&gt; </span>Disabled
383
+ </h3>
384
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
385
+ <pre><code [innerHTML]="disabledCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
386
+ </div>
387
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
388
+ aria-label="Live preview of disabled button state">
300
389
  <wally-button [disabled]="true">Disabled Button</wally-button>
301
390
  </div>
302
- </div>
391
+ </article>
303
392
 
304
393
  <!-- Loading -->
305
- <div class="mb-6">
306
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Loading</h3>
307
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
308
- <pre><code [innerHTML]="loadingCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
309
- </div>
310
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
394
+ <article class="mb-8" aria-labelledby="loading-state-heading">
395
+ <h3 id="loading-state-heading"
396
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
397
+ <span aria-hidden="true">&gt; </span>Loading
398
+ </h3>
399
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
400
+ <pre><code [innerHTML]="loadingCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
401
+ </div>
402
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
403
+ aria-label="Live preview of loading button state with spinner">
311
404
  <wally-button [loading]="true">Loading...</wally-button>
312
405
  </div>
313
- </div>
406
+ </article>
314
407
 
315
408
  <!-- Notification -->
316
- <div class="mb-6">
317
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">With Notification Badge</h3>
318
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
319
- <pre><code [innerHTML]="notificationButtonCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
320
- </div>
321
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
409
+ <article class="mb-8" aria-labelledby="notification-state-heading">
410
+ <h3 id="notification-state-heading"
411
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
412
+ <span aria-hidden="true">&gt; </span>With Notification Badge
413
+ </h3>
414
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
415
+ <pre><code [innerHTML]="notificationButtonCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
416
+ </div>
417
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
418
+ aria-label="Live preview of button with notification badge indicator">
322
419
  <wally-button [showNotification]="true" ariaLabel="View messages">
323
420
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
324
421
  stroke="currentColor" class="size-5">
@@ -327,50 +424,65 @@
327
424
  </svg>
328
425
  </wally-button>
329
426
  </div>
330
- </div>
427
+ </article>
331
428
  </section>
332
429
 
333
430
  <!-- Button Types -->
334
- <section class="mb-8">
335
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Button Types</h2>
431
+ <section id="button-types" class="mb-12" aria-labelledby="types-heading">
432
+ <h2 id="types-heading"
433
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
434
+ [ Button Types ]
435
+ </h2>
336
436
 
337
437
  <!-- Submit -->
338
- <div class="mb-6">
339
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Submit Button</h3>
340
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
341
- <pre><code [innerHTML]="submitCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
342
- </div>
343
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
438
+ <article class="mb-8" aria-labelledby="submit-type-heading">
439
+ <h3 id="submit-type-heading"
440
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
441
+ <span aria-hidden="true">&gt; </span>Submit Button
442
+ </h3>
443
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
444
+ <pre><code [innerHTML]="submitCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
445
+ </div>
446
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
447
+ aria-label="Live preview of submit type button for form submission">
344
448
  <wally-button type="submit">Submit Form</wally-button>
345
449
  </div>
346
- </div>
450
+ </article>
347
451
 
348
452
  <!-- Reset -->
349
- <div class="mb-6">
350
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Reset Button</h3>
351
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
352
- <pre><code [innerHTML]="resetCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
353
- </div>
354
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
453
+ <article class="mb-8" aria-labelledby="reset-type-heading">
454
+ <h3 id="reset-type-heading"
455
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
456
+ <span aria-hidden="true">&gt; </span>Reset Button
457
+ </h3>
458
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
459
+ <pre><code [innerHTML]="resetCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
460
+ </div>
461
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
462
+ aria-label="Live preview of reset type button for form reset">
355
463
  <wally-button type="reset" variant="ghost">Reset</wally-button>
356
464
  </div>
357
- </div>
465
+ </article>
358
466
  </section>
359
467
 
360
468
  <!-- Events -->
361
- <section class="mb-8">
362
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Click Events</h2>
469
+ <section id="events" class="mb-12" aria-labelledby="events-heading">
470
+ <h2 id="events-heading"
471
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
472
+ [ Click Events ]
473
+ </h2>
363
474
 
364
- <div class="space-y-4">
365
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
366
- <pre><code [innerHTML]="clickCodeHTML" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
475
+ <div class="space-y-3 mb-4">
476
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
477
+ <pre><code [innerHTML]="clickCodeHTML" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
367
478
  </div>
368
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
369
- <pre><code [innerHTML]="clickCodeTs" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
479
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
480
+ <pre><code [innerHTML]="clickCodeTs" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
370
481
  </div>
371
482
  </div>
372
483
 
373
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212] mt-4">
484
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
485
+ aria-label="Live preview of button click event handling with feedback message">
374
486
  <div class="flex flex-col gap-2 text-center">
375
487
  <wally-button (click)="handleClick()">Click Me</wally-button>
376
488
  @if (clickMessage()) {
@@ -383,16 +495,22 @@
383
495
  </section>
384
496
 
385
497
  <!-- Icons -->
386
- <section class="mb-8">
387
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Button with Icons</h2>
498
+ <section id="icons" class="mb-12" aria-labelledby="icons-heading">
499
+ <h2 id="icons-heading"
500
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
501
+ [ Button with Icons ]
502
+ </h2>
388
503
 
389
504
  <!-- Icon with Text -->
390
- <div class="mb-6">
391
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Icon with Text</h3>
392
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
393
- <pre><code [innerHTML]="iconCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
394
- </div>
395
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
505
+ <article class="mb-8" aria-labelledby="icon-text-heading">
506
+ <h3 id="icon-text-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
507
+ <span aria-hidden="true">&gt; </span>Icon with Text
508
+ </h3>
509
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
510
+ <pre><code [innerHTML]="iconCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
511
+ </div>
512
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
513
+ aria-label="Live preview of button with text and icon on the right">
396
514
  <wally-button>
397
515
  Save Changes
398
516
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
@@ -402,15 +520,18 @@
402
520
  </svg>
403
521
  </wally-button>
404
522
  </div>
405
- </div>
523
+ </article>
406
524
 
407
525
  <!-- Icon Only -->
408
- <div class="mb-6">
409
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Icon Only</h3>
410
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
411
- <pre><code [innerHTML]="iconOnlyCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
412
- </div>
413
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
526
+ <article class="mb-8" aria-labelledby="icon-only-heading">
527
+ <h3 id="icon-only-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
528
+ <span aria-hidden="true">&gt; </span>Icon Only
529
+ </h3>
530
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
531
+ <pre><code [innerHTML]="iconOnlyCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
532
+ </div>
533
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
534
+ aria-label="Live preview of icon-only button with ARIA label">
414
535
  <wally-button ariaLabel="Notifications">
415
536
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
416
537
  stroke="currentColor" class="size-5">
@@ -419,15 +540,18 @@
419
540
  </svg>
420
541
  </wally-button>
421
542
  </div>
422
- </div>
543
+ </article>
423
544
 
424
545
  <!-- Icon Left -->
425
- <div class="mb-6">
426
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Icon Left</h3>
427
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
428
- <pre><code [innerHTML]="iconLeftCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
429
- </div>
430
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
546
+ <article class="mb-8" aria-labelledby="icon-left-heading">
547
+ <h3 id="icon-left-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
548
+ <span aria-hidden="true">&gt; </span>Icon Left
549
+ </h3>
550
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
551
+ <pre><code [innerHTML]="iconLeftCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
552
+ </div>
553
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
554
+ aria-label="Live preview of button with icon on the left and text on the right">
431
555
  <wally-button>
432
556
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2"
433
557
  stroke="currentColor" class="size-5">
@@ -436,21 +560,27 @@
436
560
  Back
437
561
  </wally-button>
438
562
  </div>
439
- </div>
563
+ </article>
440
564
  </section>
441
565
 
442
566
  <!-- Accessibility -->
443
- <section class="mb-8">
444
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Accessibility</h2>
567
+ <section id="accessibility" class="mb-12" aria-labelledby="accessibility-heading">
568
+ <h2 id="accessibility-heading"
569
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
570
+ [ Accessibility ]
571
+ </h2>
445
572
 
446
573
  <!-- ARIA Label -->
447
- <div class="mb-6">
448
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">ARIA Label (Essential for Icon-Only
449
- Buttons)</h3>
450
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
451
- <pre><code [innerHTML]="ariaLabelCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
452
- </div>
453
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
574
+ <article class="mb-8" aria-labelledby="aria-label-heading">
575
+ <h3 id="aria-label-heading"
576
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
577
+ <span aria-hidden="true">&gt; </span>ARIA Label (Essential for Icon-Only Buttons)
578
+ </h3>
579
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
580
+ <pre><code [innerHTML]="ariaLabelCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
581
+ </div>
582
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
583
+ aria-label="Live preview of icon-only button with ARIA label for screen readers">
454
584
  <wally-button ariaLabel="Save document">
455
585
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
456
586
  stroke="currentColor" class="size-5">
@@ -459,56 +589,72 @@
459
589
  </svg>
460
590
  </wally-button>
461
591
  </div>
462
- </div>
592
+ </article>
463
593
 
464
594
  <!-- Toggle Button -->
465
- <div class="mb-6">
466
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Toggle Button with ARIA Pressed</h3>
467
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
468
- <pre><code [innerHTML]="ariaPressedCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
469
- </div>
470
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
595
+ <article class="mb-8" aria-labelledby="aria-pressed-heading">
596
+ <h3 id="aria-pressed-heading"
597
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
598
+ <span aria-hidden="true">&gt; </span>Toggle Button with ARIA Pressed
599
+ </h3>
600
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
601
+ <pre><code [innerHTML]="ariaPressedCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
602
+ </div>
603
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
604
+ aria-label="Live preview of toggle button with ARIA pressed state">
471
605
  <wally-button [ariaPressed]="toggleState()">
472
606
  {{ toggleState() ? 'On' : 'Off' }}
473
607
  </wally-button>
474
608
  </div>
475
- </div>
609
+ </article>
476
610
 
477
611
  <!-- Loading State ARIA -->
478
- <div class="mb-6">
479
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Loading State (Automatic ARIA Busy)</h3>
480
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
481
- <pre><code [innerHTML]="ariaBusyCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
482
- </div>
483
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
612
+ <article class="mb-8" aria-labelledby="aria-busy-heading">
613
+ <h3 id="aria-busy-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
614
+ <span aria-hidden="true">&gt; </span>Loading State (Automatic ARIA Busy)
615
+ </h3>
616
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
617
+ <pre><code [innerHTML]="ariaBusyCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
618
+ </div>
619
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
620
+ aria-label="Live preview of button in loading state with automatic ARIA busy attribute">
484
621
  <wally-button [loading]="true">Processing...</wally-button>
485
622
  </div>
486
- </div>
623
+ </article>
487
624
 
488
625
  <!-- ARIA Described By -->
489
- <div class="mb-6">
490
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">ARIA Described By</h3>
491
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
492
- <pre><code [innerHTML]="ariaDescribedByCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
493
- </div>
494
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
626
+ <article class="mb-8" aria-labelledby="aria-describedby-heading">
627
+ <h3 id="aria-describedby-heading"
628
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
629
+ <span aria-hidden="true">&gt; </span>ARIA Described By
630
+ </h3>
631
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
632
+ <pre><code [innerHTML]="ariaDescribedByCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
633
+ </div>
634
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
635
+ aria-label="Live preview of button with ARIA described by attribute linking to description element">
495
636
  <wally-button ariaDescribedBy="save-description">Save</wally-button>
496
- <p id="save-description" class="text-xs text-gray-600 dark:text-gray-400 mt-2">
637
+ <p id="save-description" class="text-xs text-neutral-600 dark:text-neutral-400 mt-2">
497
638
  Saves your changes permanently
498
639
  </p>
499
640
  </div>
500
- </div>
641
+ </article>
501
642
  </section>
502
643
 
503
644
  <!-- API Reference -->
504
- <section class="mb-8">
505
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">API Reference</h2>
645
+ <section id="api-reference" class="mb-12" aria-labelledby="api-heading">
646
+ <h2 id="api-heading"
647
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
648
+ [ API Reference ]
649
+ </h2>
506
650
 
507
651
  <!-- Input Properties -->
508
- <div class="mb-6">
509
- <h3 class="text-md font-medium mb-4 text-[#0a0a0a] dark:text-white">Input Properties</h3>
510
- <div
511
- class="bg-white dark:bg-[#0f0f0f] border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden">
652
+ <article class="mb-8" aria-labelledby="input-properties-heading">
653
+ <h3 id="input-properties-heading"
654
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
655
+ <span aria-hidden="true">&gt; </span>Input Properties
656
+ </h3>
657
+ <div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
512
658
  <div class="overflow-x-auto">
513
659
  <table class="w-full text-sm">
514
660
  <thead class="bg-gray-50 dark:bg-gray-900">
@@ -587,13 +733,15 @@
587
733
  </table>
588
734
  </div>
589
735
  </div>
590
- </div>
736
+ </article>
591
737
 
592
738
  <!-- Output Events -->
593
- <div class="mb-6">
594
- <h3 class="text-md font-medium mb-4 text-[#0a0a0a] dark:text-white">Output Events</h3>
595
- <div
596
- class="bg-white dark:bg-[#0f0f0f] border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden">
739
+ <article class="mb-8" aria-labelledby="output-events-heading">
740
+ <h3 id="output-events-heading"
741
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
742
+ <span aria-hidden="true">&gt; </span>Output Events
743
+ </h3>
744
+ <div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
597
745
  <div class="overflow-x-auto">
598
746
  <table class="w-full text-sm">
599
747
  <thead class="bg-gray-50 dark:bg-gray-900">
@@ -614,13 +762,14 @@
614
762
  </table>
615
763
  </div>
616
764
  </div>
617
- </div>
765
+ </article>
618
766
 
619
767
  <!-- Methods -->
620
- <div class="mb-6">
621
- <h3 class="text-md font-medium mb-4 text-[#0a0a0a] dark:text-white">Methods</h3>
622
- <div
623
- class="bg-white dark:bg-[#0f0f0f] border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden">
768
+ <article class="mb-8" aria-labelledby="methods-heading">
769
+ <h3 id="methods-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
770
+ <span aria-hidden="true">&gt; </span>Methods
771
+ </h3>
772
+ <div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
624
773
  <div class="overflow-x-auto">
625
774
  <table class="w-full text-sm">
626
775
  <thead class="bg-gray-50 dark:bg-gray-900">
@@ -643,13 +792,15 @@
643
792
  </table>
644
793
  </div>
645
794
  </div>
646
- </div>
795
+ </article>
647
796
 
648
797
  <!-- Computed Properties -->
649
- <div class="mb-6">
650
- <h3 class="text-md font-medium mb-4 text-[#0a0a0a] dark:text-white">Computed Properties</h3>
651
- <div
652
- class="bg-white dark:bg-[#0f0f0f] border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden">
798
+ <article class="mb-8" aria-labelledby="computed-properties-heading">
799
+ <h3 id="computed-properties-heading"
800
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
801
+ <span aria-hidden="true">&gt; </span>Computed Properties
802
+ </h3>
803
+ <div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
653
804
  <div class="overflow-x-auto">
654
805
  <table class="w-full text-sm">
655
806
  <thead class="bg-gray-50 dark:bg-gray-900">
@@ -670,7 +821,124 @@
670
821
  </table>
671
822
  </div>
672
823
  </div>
673
- </div>
824
+ </article>
674
825
  </section>
826
+
827
+ <!-- Advanced Usage & Edge Cases -->
828
+ <section id="advanced-usage" class="mb-12" aria-labelledby="advanced-heading">
829
+ <h2 id="advanced-heading"
830
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
831
+ [ Advanced Usage & Edge Cases ]
832
+ </h2>
833
+
834
+ <!-- Form Integration -->
835
+ <article class="mb-8" aria-labelledby="form-integration-heading">
836
+ <h3 id="form-integration-heading"
837
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
838
+ <span aria-hidden="true">&gt; </span>Form Validation Integration
839
+ </h3>
840
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-4 leading-relaxed">
841
+ Button automatically integrates with Angular Forms. Combine disabled with form validation for better UX.
842
+ </p>
843
+ <div class="space-y-4">
844
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
845
+ <pre><code [innerHTML]="formIntegrationCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
846
+ </div>
847
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
848
+ <pre><code [innerHTML]="formIntegrationTsCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
849
+ </div>
850
+ </div>
851
+ </article>
852
+
853
+ <!-- Router Integration -->
854
+ <article class="mb-8" aria-labelledby="router-integration-heading">
855
+ <h3 id="router-integration-heading"
856
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
857
+ <span aria-hidden="true">&gt; </span>Router Integration
858
+ </h3>
859
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-4 leading-relaxed">
860
+ Use variant="link" for declarative navigation, or programmatic navigation with click events.
861
+ </p>
862
+ <div class="space-y-4">
863
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
864
+ <pre><code [innerHTML]="routerExampleCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
865
+ </div>
866
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
867
+ <pre><code [innerHTML]="routerExampleTsCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
868
+ </div>
869
+ </div>
870
+ </article>
871
+
872
+ <!-- Loading + Disabled Behavior -->
873
+ <article class="mb-8" aria-labelledby="loading-disabled-heading">
874
+ <h3 id="loading-disabled-heading"
875
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
876
+ <span aria-hidden="true">&gt; </span>Loading + Disabled Behavior
877
+ </h3>
878
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-4 leading-relaxed">
879
+ When both loading and disabled are set, loading takes precedence. The button will show the loading spinner.
880
+ </p>
881
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
882
+ <pre><code [innerHTML]="loadingDisabledExampleCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
883
+ </div>
884
+ </article>
885
+
886
+ <!-- Icon Recommendations -->
887
+ <article class="mb-8" aria-labelledby="icon-recommendations-heading">
888
+ <h3 id="icon-recommendations-heading"
889
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
890
+ <span aria-hidden="true">&gt; </span>Icon Library Recommendations
891
+ </h3>
892
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-4 leading-relaxed">
893
+ Use size-5 (20px) icons for optimal visual balance. Compatible with all SVG icon libraries.
894
+ </p>
895
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
896
+ <pre><code [innerHTML]="iconRecommendationsCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
897
+ </div>
898
+ </article>
899
+
900
+ <!-- Signals Pattern -->
901
+ <article class="mb-8" aria-labelledby="signals-pattern-heading">
902
+ <h3 id="signals-pattern-heading"
903
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
904
+ <span aria-hidden="true">&gt; </span>Using Angular Signals (Recommended)
905
+ </h3>
906
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-4 leading-relaxed">
907
+ Button properties work seamlessly with Angular Signals for reactive state management.
908
+ </p>
909
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
910
+ <pre><code [innerHTML]="signalsPatternCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
911
+ </div>
912
+ </article>
913
+
914
+ <!-- Button Type Explained -->
915
+ <article class="mb-8" aria-labelledby="button-type-heading">
916
+ <h3 id="button-type-heading"
917
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
918
+ <span aria-hidden="true">&gt; </span>Understanding Button Types
919
+ </h3>
920
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-4 leading-relaxed">
921
+ Always specify type="button" for non-form buttons to prevent accidental form submission.
922
+ </p>
923
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
924
+ <pre><code [innerHTML]="buttonTypeExplainedCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
925
+ </div>
926
+ </article>
927
+
928
+ <!-- Href Behavior -->
929
+ <article class="mb-8" aria-labelledby="href-behavior-heading">
930
+ <h3 id="href-behavior-heading"
931
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
932
+ <span aria-hidden="true">&gt; </span>Href Behavior (Important)
933
+ </h3>
934
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-4 leading-relaxed">
935
+ The href property only works when variant="link" is set. Otherwise, it's ignored.
936
+ </p>
937
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
938
+ <pre><code [innerHTML]="hrefBehaviorCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
939
+ </div>
940
+ </article>
941
+ </section>
942
+
675
943
  </div>
676
- </div>
944
+ </main>