wally-ui 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wally-ui",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "description": "About Where’s Wally? Right here — bringing you ready-to-use Angular components with Wally-UI. Stop searching, start building.",
5
5
  "bin": {
6
6
  "wally": "dist/cli.js"
@@ -1,28 +1,10 @@
1
- <button
2
- [type]="type()"
3
- [disabled]="disabled() || loading()"
4
- [attr.aria-label]="ariaLabel() || null"
5
- [attr.aria-describedby]="ariaDescribedBy() || null"
6
- [attr.aria-pressed]="ariaPressed()"
7
- [attr.aria-busy]="loading()"
8
- (click)="handleClick()"
9
- class="
10
- group
11
- relative
12
- w-full
13
- flex items-center justify-center gap-2
14
- text-white text-sm font-medium dark:text-[#0a0a0a]
15
- bg-[#0a0a0a] hover:bg-[#0a0a0a]/85
16
- disabled:bg-[#0a0a0a]/85
17
- dark:bg-white dark:hover:bg-white/85
18
- dark:disabled:bg-white/85
19
- disabled:pointer-events-none
20
- p-2.5
21
- rounded-md
22
- transition duration-300 ease-in-out
23
- antialiased
24
- cursor-pointer
25
- ">
1
+ <button [type]="type()" [disabled]="disabled() || loading()" [attr.aria-label]="ariaLabel() || null"
2
+ [attr.aria-describedby]="ariaDescribedBy() || null" [attr.aria-pressed]="ariaPressed()" [attr.aria-busy]="loading()"
3
+ (click)="handleClick()" class="group relative w-full flex items-center justify-center gap-2 text-sm font-medium disabled:pointer-events-none p-2.5 rounded-md transition duration-300 ease-in-out antialiased cursor-pointer
4
+ " [ngClass]="{
5
+ 'text-white dark:text-[#0a0a0a] bg-[#0a0a0a] hover:bg-[#0a0a0a]/85 disabled:bg-[#0a0a0a]/85 dark:bg-white dark:hover:bg-white/85 dark:disabled:bg-white/85 dark:disabled:text-[#0a0a0a]/60': variant() === 'primary',
6
+ 'text-[#0a0a0a] bg-neutral-200 hover:bg-neutral-200/60 disabled:bg-neutral-200/60 disabled:text-neutral-400 dark:text-white dark:bg-white/20 dark:hover:bg-white/10 dark:disabled:bg-white/5 dark:disabled:text-white/50': variant() === 'secondary',
7
+ }">
26
8
 
27
9
  @if (showNotification()) {
28
10
  <span class="absolute top-0 right-0 -mt-1 -mr-1 flex size-3">
@@ -34,8 +16,10 @@
34
16
  }
35
17
 
36
18
  @if (loading()) {
37
- <svg class="size-4 animate-spin text-white dark:text-[#0a0a0a]" xmlns="http://www.w3.org/2000/svg" fill="none"
38
- viewBox="0 0 24 24">
19
+ <svg class="size-4 animate-spin" [ngClass]="{
20
+ 'text-white dark:text-[#0a0a0a]': variant() === 'primary',
21
+ 'dark:text-white': variant() === 'secondary',
22
+ }" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
39
23
  <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
40
24
  <path class="opacity-75" fill="currentColor"
41
25
  d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">
@@ -1,6 +1,8 @@
1
1
  import { Component, input, InputSignal, output, OutputEmitterRef } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
 
4
+ type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive';
5
+
4
6
  @Component({
5
7
  selector: 'wally-button',
6
8
  imports: [
@@ -14,6 +16,7 @@ export class Button {
14
16
  disabled: InputSignal<boolean> = input<boolean>(false);
15
17
  loading: InputSignal<boolean> = input<boolean>(false);
16
18
  showNotification: InputSignal<boolean> = input<boolean>(false);
19
+ variant: InputSignal<ButtonVariant> = input<ButtonVariant>('primary');
17
20
 
18
21
  // Accessibility properties
19
22
  ariaLabel: InputSignal<string> = input<string>('');
@@ -15,6 +15,10 @@ export const ButtonCodeExamples = {
15
15
  // Basic usage
16
16
  basicUsage: `<wally-button>Wally Button</wally-button>`,
17
17
 
18
+ // Variants
19
+ primaryVariant: `<wally-button variant="primary">Primary Button</wally-button>`,
20
+ secondaryVariant: `<wally-button variant="secondary">Secondary Button</wally-button>`,
21
+
18
22
  // States
19
23
  disabled: `<wally-button [disabled]="true">Disabled</wally-button>`,
20
24
  loading: `<wally-button [loading]="true">Loading</wally-button>`,
@@ -70,6 +70,10 @@
70
70
  <wally-button [loading]="true">
71
71
  Loading
72
72
  </wally-button>
73
+ <wally-button variant="primary">Primary Button</wally-button>
74
+ <wally-button variant="secondary">Secondary Button</wally-button>
75
+ <wally-button variant="secondary" [disabled]="true">Secondary Disabled</wally-button>
76
+ <wally-button variant="secondary" [loading]="true">Secondary Loading</wally-button>
73
77
 
74
78
  <div class="w-full flex justify-center items-center gap-2">
75
79
  <div class="w-full">
@@ -134,6 +138,45 @@
134
138
  </div>
135
139
  </section>
136
140
 
141
+ <!-- Button Variants -->
142
+ <section class="mb-8">
143
+ <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">
144
+ Button Variants
145
+ </h2>
146
+
147
+ <div class="space-y-8">
148
+ <!-- Primary Variant -->
149
+ <div>
150
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">
151
+ Primary (Default)
152
+ </h3>
153
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
154
+ <pre><code [innerHTML]="primaryVariantCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
155
+ </div>
156
+ <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
157
+ <wally-button variant="primary">Primary Button</wally-button>
158
+ </div>
159
+ </div>
160
+
161
+ <!-- Secondary Variant -->
162
+ <div>
163
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">
164
+ Secondary
165
+ </h3>
166
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
167
+ <pre><code [innerHTML]="secondaryVariantCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
168
+ </div>
169
+ <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
170
+ <div class="flex flex-col gap-2">
171
+ <wally-button variant="secondary">Secondary Button</wally-button>
172
+ <wally-button variant="secondary" [disabled]="true">Secondary Disabled</wally-button>
173
+ <wally-button variant="secondary" [loading]="true">Secondary Loading</wally-button>
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ </section>
179
+
137
180
  <!-- States -->
138
181
  <section class="mb-8">
139
182
  <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">
@@ -287,8 +330,10 @@
287
330
  </div>
288
331
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
289
332
  <wally-button ariaLabel="Save document">
290
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5">
291
- <path stroke-linecap="round" stroke-linejoin="round" d="M17.593 3.322c1.1.128 1.907 1.077 1.907 2.185V21L12 17.25 4.5 21V5.507c0-1.108.806-2.057 1.907-2.185a48.507 48.507 0 0111.186 0z" />
333
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
334
+ stroke="currentColor" class="size-5">
335
+ <path stroke-linecap="round" stroke-linejoin="round"
336
+ d="M17.593 3.322c1.1.128 1.907 1.077 1.907 2.185V21L12 17.25 4.5 21V5.507c0-1.108.806-2.057 1.907-2.185a48.507 48.507 0 0111.186 0z" />
292
337
  </svg>
293
338
  </wally-button>
294
339
  </div>
@@ -318,65 +363,101 @@
318
363
  Processing...
319
364
  </wally-button>
320
365
  </div>
321
- <p class="text-sm text-gray-600 dark:text-gray-400 mt-2">
322
- Automatically sets <code class="bg-gray-200 dark:bg-[#121212] px-1 py-0.5 rounded text-xs">aria-busy="true"</code> when loading
323
- </p>
324
366
  </div>
325
367
  </div>
326
368
  </section>
327
369
 
328
- <!-- Properties -->
370
+ <!-- API Reference -->
329
371
  <section class="mb-8">
330
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Properties</h2>
331
-
332
- <div class="space-y-4">
333
- <div class="space-y-2">
334
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
335
- <pre><code [innerHTML]="propertyTypeCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
336
- </div>
337
- <p class="text-sm text-gray-700 dark:text-gray-400">HTML button type (button, submit, reset)</p>
338
- </div>
339
-
340
- <div class="space-y-2">
341
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
342
- <pre><code [innerHTML]="propertyDisabledCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
343
- </div>
344
- <p class="text-sm text-gray-700 dark:text-gray-400">Whether the button is disabled</p>
345
- </div>
346
-
347
- <div class="space-y-2">
348
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
349
- <pre><code [innerHTML]="propertyLoadingCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
350
- </div>
351
- <p class="text-sm text-gray-700 dark:text-gray-400">Shows loading spinner when true</p>
352
- </div>
353
-
354
- <div class="space-y-2">
355
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
356
- <pre><code [innerHTML]="propertyShowNotificationCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
357
- </div>
358
- <p class="text-sm text-gray-700 dark:text-gray-400">Shows notification badge when true</p>
359
- </div>
360
-
361
- <div class="space-y-2">
362
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
363
- <pre><code [innerHTML]="propertyAriaLabelCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
364
- </div>
365
- <p class="text-sm text-gray-700 dark:text-gray-400">Accessible label for screen readers (essential for icon-only buttons)</p>
366
- </div>
367
-
368
- <div class="space-y-2">
369
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
370
- <pre><code [innerHTML]="propertyAriaPressedCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
371
- </div>
372
- <p class="text-sm text-gray-700 dark:text-gray-400">Indicates pressed state for toggle buttons</p>
372
+ <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">API Reference</h2>
373
+
374
+ <div class="bg-white dark:bg-[#0f0f0f] border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden">
375
+ <div class="overflow-x-auto">
376
+ <table class="w-full text-sm">
377
+ <thead class="bg-gray-50 dark:bg-gray-900">
378
+ <tr>
379
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Property</th>
380
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Type</th>
381
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Default</th>
382
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Description</th>
383
+ </tr>
384
+ </thead>
385
+ <tbody class="divide-y divide-gray-200 dark:divide-gray-700">
386
+ <tr>
387
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">type</td>
388
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
389
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">'button'</td>
390
+ <td class="p-4 text-gray-700 dark:text-gray-300">HTML button type (button, submit, reset)</td>
391
+ </tr>
392
+ <tr>
393
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">variant</td>
394
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">'primary' | 'secondary'</td>
395
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">'primary'</td>
396
+ <td class="p-4 text-gray-700 dark:text-gray-300">Button visual style variant</td>
397
+ </tr>
398
+ <tr>
399
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">disabled</td>
400
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
401
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
402
+ <td class="p-4 text-gray-700 dark:text-gray-300">Whether the button is disabled</td>
403
+ </tr>
404
+ <tr>
405
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">loading</td>
406
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
407
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
408
+ <td class="p-4 text-gray-700 dark:text-gray-300">Shows loading spinner and disables button</td>
409
+ </tr>
410
+ <tr>
411
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">showNotification</td>
412
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
413
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
414
+ <td class="p-4 text-gray-700 dark:text-gray-300">Shows notification badge indicator</td>
415
+ </tr>
416
+ <tr>
417
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">ariaLabel</td>
418
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
419
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">''</td>
420
+ <td class="p-4 text-gray-700 dark:text-gray-300">Accessible label for screen readers (essential for icon-only buttons)</td>
421
+ </tr>
422
+ <tr>
423
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">ariaPressed</td>
424
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean | undefined</td>
425
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">undefined</td>
426
+ <td class="p-4 text-gray-700 dark:text-gray-300">Indicates pressed state for toggle buttons</td>
427
+ </tr>
428
+ <tr>
429
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">ariaDescribedBy</td>
430
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
431
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">''</td>
432
+ <td class="p-4 text-gray-700 dark:text-gray-300">References element(s) that describe the button</td>
433
+ </tr>
434
+ </tbody>
435
+ </table>
373
436
  </div>
437
+ </div>
374
438
 
375
- <div class="space-y-2">
376
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
377
- <pre><code [innerHTML]="propertyAriaDescribedByCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
439
+ <!-- Events Table -->
440
+ <div class="mt-6">
441
+ <h3 class="text-md font-medium mb-4 text-[#0a0a0a] dark:text-white">Events</h3>
442
+ <div class="bg-white dark:bg-[#0f0f0f] border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden">
443
+ <div class="overflow-x-auto">
444
+ <table class="w-full text-sm">
445
+ <thead class="bg-gray-50 dark:bg-gray-900">
446
+ <tr>
447
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Event</th>
448
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Payload</th>
449
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Description</th>
450
+ </tr>
451
+ </thead>
452
+ <tbody>
453
+ <tr>
454
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">click</td>
455
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">void</td>
456
+ <td class="p-4 text-gray-700 dark:text-gray-300">Emitted when button is clicked</td>
457
+ </tr>
458
+ </tbody>
459
+ </table>
378
460
  </div>
379
- <p class="text-sm text-gray-700 dark:text-gray-400">References element(s) that describe the button</p>
380
461
  </div>
381
462
  </div>
382
463
  </section>
@@ -388,11 +469,11 @@
388
469
  <div class="space-y-4">
389
470
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
390
471
  <div class="flex items-center gap-2 mb-2">
391
- <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Button Variants</h3>
472
+ <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Additional Button Variants</h3>
392
473
  <span class="text-xs bg-yellow-500 text-black px-2 py-1 rounded">Under Construction</span>
393
474
  </div>
394
475
  <p class="text-sm text-gray-700 dark:text-gray-400">
395
- Multiple button styles including outline, ghost, destructive, and secondary variants.
476
+ Additional button styles including outline, ghost, and destructive variants.
396
477
  </p>
397
478
  </div>
398
479
 
@@ -29,6 +29,10 @@ export class ButtonDocs {
29
29
  importCode = getFormattedCode(ButtonCodeExamples.import, 'typescript');
30
30
  componentImportCode = getFormattedCode(ButtonCodeExamples.componentImport, 'typescript');
31
31
  basicUsageTemplateCode = getFormattedCode(ButtonCodeExamples.basicUsage, 'html');
32
+
33
+ // Variants
34
+ primaryVariantCode = getFormattedCode(ButtonCodeExamples.primaryVariant, 'html');
35
+ secondaryVariantCode = getFormattedCode(ButtonCodeExamples.secondaryVariant, 'html');
32
36
  disabledCode = getFormattedCode(ButtonCodeExamples.disabled, 'html');
33
37
  loadingCode = getFormattedCode(ButtonCodeExamples.loading, 'html');
34
38
  notificationCode = getFormattedCode(ButtonCodeExamples.notification, 'html');
@@ -1,18 +1,19 @@
1
- <div class="max-w-4xl mx-auto p-6 font-mono">
2
- <div class="mb-4">
1
+ <main class="max-w-4xl mx-auto p-6 font-mono" role="main">
2
+ <nav class="mb-4" aria-label="Breadcrumb navigation">
3
3
  <wally-breadcrumb [items]="breadcrumbItems"></wally-breadcrumb>
4
- </div>
5
-
6
- <h1 class="text-2xl font-bold text-[#0a0a0a] dark:text-white mb-4">
7
- Documentation
8
- </h1>
9
- <p class="text-gray-700 dark:text-gray-400 mb-6">
10
- Welcome to Wally UI documentation. Learn how to get started and explore our component library.
11
- </p>
12
-
13
- <!-- Philosophy & Approach -->
14
- <div id="philosophy" class="mb-8">
15
- <h2 class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-4">
4
+ </nav>
5
+
6
+ <header class="mb-6">
7
+ <h1 class="text-2xl font-bold text-[#0a0a0a] dark:text-white mb-4">
8
+ Documentation
9
+ </h1>
10
+ <p class="text-gray-700 dark:text-gray-400">
11
+ Welcome to Wally UI documentation. Learn how to get started and explore our component library.
12
+ </p>
13
+ </header>
14
+
15
+ <section id="philosophy" class="mb-8" aria-labelledby="philosophy-heading">
16
+ <h2 id="philosophy-heading" class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-4">
16
17
  A Modern Approach to Angular UI Components
17
18
  </h2>
18
19
  <p class="text-gray-700 dark:text-gray-400 mb-4">
@@ -21,140 +22,143 @@
21
22
  via npx and becomes your code, ready to edit, customize, and evolve as needed.
22
23
  </p>
23
24
 
24
- <div class="grid gap-3 md:grid-cols-2 mb-6">
25
- <div class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg">
25
+ <div class="grid gap-3 md:grid-cols-2 mb-6" role="list" aria-label="Key features of Wally UI">
26
+ <article class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg" role="listitem">
26
27
  <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-2">No External Dependencies</h3>
27
28
  <p class="text-sm text-gray-700 dark:text-gray-400">
28
29
  You control the code, without being tied to third-party updates.
29
30
  </p>
30
- </div>
31
+ </article>
31
32
 
32
- <div class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg">
33
+ <article class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg" role="listitem">
33
34
  <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-2">Total Customization</h3>
34
35
  <p class="text-sm text-gray-700 dark:text-gray-400">
35
36
  Since the component is yours, it can be adapted to any design system or business rules.
36
37
  </p>
37
- </div>
38
+ </article>
38
39
 
39
- <div class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg">
40
+ <article class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg" role="listitem">
40
41
  <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-2">Lightweight</h3>
41
42
  <p class="text-sm text-gray-700 dark:text-gray-400">
42
43
  Only what you actually add goes into the bundle, without loading dozens of unused components.
43
44
  </p>
44
- </div>
45
+ </article>
45
46
 
46
- <div class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg">
47
+ <article class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg" role="listitem">
47
48
  <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-2">Tailwind Integrated</h3>
48
49
  <p class="text-sm text-gray-700 dark:text-gray-400">
49
50
  Modern, responsive, and consistent styles with the power of Tailwind CSS.
50
51
  </p>
51
- </div>
52
+ </article>
52
53
 
53
- <div class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg">
54
+ <article class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg" role="listitem">
54
55
  <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-2">Learning & Clarity</h3>
55
56
  <p class="text-sm text-gray-700 dark:text-gray-400">
56
57
  Each component serves as a practical example of Angular best practices.
57
58
  </p>
58
- </div>
59
+ </article>
59
60
 
60
- <div class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg">
61
+ <article class="bg-gray-200 dark:bg-[#121212] p-3 rounded-lg" role="listitem">
61
62
  <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-2">Standalone Components</h3>
62
63
  <p class="text-sm text-gray-700 dark:text-gray-400">
63
64
  Leverages Angular's latest features, reducing complexity and improving modularity.
64
65
  </p>
65
- </div>
66
+ </article>
66
67
  </div>
67
68
 
68
69
  <p class="text-gray-700 dark:text-gray-400">
69
70
  With Wally UI, you gain agility to start projects, flexibility to shape your UI without limitations,
70
71
  and simplicity to maintain code long-term. It's the most practical and modern way to build Angular interfaces.
71
72
  </p>
72
- </div>
73
+ </section>
73
74
 
74
- <!-- Requirements -->
75
- <div id="requirements" class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-6">
76
- <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-3">Requirements</h3>
75
+ <section id="requirements" class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-6"
76
+ aria-labelledby="requirements-heading">
77
+ <h2 id="requirements-heading" class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-3">Requirements</h2>
77
78
 
78
- <div class="space-y-3">
79
- <div>
80
- <p class="text-sm font-medium text-[#0a0a0a] dark:text-white mb-1">Angular Version</p>
79
+ <div class="space-y-3" role="list" aria-label="System requirements for Wally UI">
80
+ <div role="listitem">
81
+ <h3 class="text-sm font-medium text-[#0a0a0a] dark:text-white mb-1">Angular Version</h3>
81
82
  <p class="text-sm text-gray-700 dark:text-gray-400">
82
83
  Angular 17+ required for standalone component support
83
84
  </p>
84
85
  </div>
85
86
 
86
- <div>
87
- <p class="text-sm font-medium text-[#0a0a0a] dark:text-white mb-1">Tailwind CSS</p>
87
+ <div role="listitem">
88
+ <h3 class="text-sm font-medium text-[#0a0a0a] dark:text-white mb-1">Tailwind CSS</h3>
88
89
  <p class="text-sm text-gray-700 dark:text-gray-400 mb-2">
89
90
  Tailwind CSS v3 or v4 must be installed in your project.
90
91
  </p>
91
92
  <a href="https://tailwindcss.com/blog/tailwindcss-v4" target="_blank"
92
- class="text-xs text-blue-500 underline hover:text-blue-700">
93
+ class="text-xs text-blue-500 underline hover:text-blue-700" rel="noopener noreferrer"
94
+ aria-label="Learn about Tailwind v4 (opens in new tab)">
93
95
  Learn about Tailwind v4
94
96
  </a>
95
97
  </div>
96
98
 
97
- <div>
98
- <p class="text-sm font-medium text-[#0a0a0a] dark:text-white mb-1">Installation</p>
99
+ <div role="listitem">
100
+ <h3 class="text-sm font-medium text-[#0a0a0a] dark:text-white mb-1">Installation</h3>
99
101
  <p class="text-sm text-gray-700 dark:text-gray-400 mb-2">
100
102
  Components are standalone and can be installed individually:
101
103
  </p>
102
- <code class="text-sm text-[#0a0a0a] dark:text-white block">
104
+ <code class="text-sm text-[#0a0a0a] dark:text-white block" aria-label="Installation command example">
103
105
  npx wally-ui add {{ '<' }}component{{ '>' }}
104
106
  </code>
105
107
  </div>
106
108
  </div>
107
- </div>
109
+ </section>
108
110
 
109
- <!-- Important Notice -->
110
- <div id="important-notice"
111
- class="bg-yellow-100 dark:bg-yellow-900/20 border border-yellow-300 dark:border-yellow-700 p-4 rounded-lg mb-6">
112
- <h3 class="text-sm font-semibold text-yellow-800 dark:text-yellow-200 mb-2">⚠️ Experimental Project</h3>
111
+ <aside id="important-notice"
112
+ class="bg-yellow-100 dark:bg-yellow-900/20 border border-yellow-300 dark:border-yellow-700 p-4 rounded-lg mb-6"
113
+ role="alert" aria-labelledby="experimental-heading">
114
+ <h2 id="experimental-heading" class="text-sm font-semibold text-yellow-800 dark:text-yellow-200 mb-2">⚠️
115
+ Experimental Project</h2>
113
116
  <p class="text-sm text-yellow-700 dark:text-yellow-300">
114
117
  Wally UI is currently in experimental development. Components may change and new features are being actively
115
118
  developed. Use in production with caution.
116
119
  </p>
117
- </div>
120
+ </aside>
118
121
 
119
- <!-- List Components -->
120
- <div id="list-components" class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-6">
121
- <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-2">List Available Components</h3>
122
- <code class="text-sm text-[#0a0a0a] dark:text-white">
122
+ <section id="list-components" class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-6"
123
+ aria-labelledby="list-heading">
124
+ <h2 id="list-heading" class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-2">List Available Components
125
+ </h2>
126
+ <code class="text-sm text-[#0a0a0a] dark:text-white" aria-label="Command to list available components">
123
127
  npx wally-ui list
124
- </code>
125
- </div>
128
+ </code>
129
+ </section>
126
130
 
127
- <!-- File Structure -->
128
- <div id="installation-structure" class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-8">
129
- <h3 class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-3">Installation Structure</h3>
131
+ <section id="installation-structure" class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-8"
132
+ aria-labelledby="structure-heading">
133
+ <h2 id="structure-heading" class="text-sm font-semibold text-[#0a0a0a] dark:text-white mb-3">Installation Structure
134
+ </h2>
130
135
  <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
131
136
  When installing a component, Wally UI will create the following folder structure:
132
137
  </p>
133
- <div class="font-mono text-sm text-[#0a0a0a] dark:text-white">
134
- <div>src/</div>
135
- <div>└── app/</div>
136
- <div>&nbsp;&nbsp;&nbsp;&nbsp;└── components/</div>
137
- <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── wally-ui/</div>
138
- <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── button/</div>
139
- <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── button.ts
140
- </div>
141
- <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└──
142
- button.html</div>
143
- </div>
144
- </div>
145
-
146
- <!-- Navigation to Components -->
147
- <div class="space-y-4">
148
- <h3 class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-4">Explore</h3>
149
-
150
- <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
151
- <h4 class="text-md font-semibold text-[#0a0a0a] dark:text-white mb-2">Components</h4>
138
+ <pre class="font-mono text-sm text-[#0a0a0a] dark:text-white leading-tight" role="img"
139
+ aria-label="File structure diagram showing component installation path">
140
+ src/
141
+ └── app/
142
+ └── components/
143
+ └── wally-ui/
144
+ └── button/
145
+ ├── button.ts
146
+ └── button.html
147
+ </pre>
148
+ </section>
149
+
150
+ <section class="space-y-4" aria-labelledby="explore-heading">
151
+ <h2 id="explore-heading" class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-4">Explore</h2>
152
+
153
+ <article class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
154
+ <h3 class="text-md font-semibold text-[#0a0a0a] dark:text-white mb-2">Components</h3>
152
155
  <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
153
156
  Browse our collection of reusable Angular components with examples and documentation.
154
157
  </p>
155
- <a href="/documentation/components" class="text-blue-500 underline hover:text-blue-700 text-sm">
156
- View Components
158
+ <a [routerLink]="'/documentation/components'" class="text-blue-500 underline hover:text-blue-700 text-sm"
159
+ aria-label="Navigate to components documentation page">
160
+ View Components
157
161
  </a>
158
- </div>
159
- </div>
160
- </div>
162
+ </article>
163
+ </section>
164
+ </main>
@@ -1,10 +1,14 @@
1
+ import { RouterModule } from '@angular/router';
1
2
  import { Component } from '@angular/core';
2
3
 
3
4
  import { Breadcrumb, BreadcrumbItem } from '../../components/breadcrumb/breadcrumb';
4
5
 
5
6
  @Component({
6
7
  selector: 'wally-documentation',
7
- imports: [Breadcrumb],
8
+ imports: [
9
+ Breadcrumb,
10
+ RouterModule
11
+ ],
8
12
  templateUrl: './documentation.html',
9
13
  styleUrl: './documentation.css'
10
14
  })
@@ -1,48 +1,72 @@
1
- <div class="h-dvh antialiased font-mono">
2
- <div class="w-full h-full flex flex-col items-center justify-center p-4">
3
- <div class="max-w-md">
4
- <h1 class="text-2xl font-bold text-[#0a0a0a] dark:text-white">
5
- Wally UI
6
- </h1>
7
- <h2 class="text-xl font-semibold text-[#0a0a0a] dark:text-white">
8
- Where's Wally? Right here!
9
- </h2>
10
- <p class="mt-4 text-gray-700 dark:text-gray-400">
11
- Stop searching for the perfect Angular components. Wally UI brings you a
12
- collection of ready-to-use, beautifully crafted Angular components built with
13
- standalone architecture and Tailwind CSS that integrate seamlessly with your projects.
14
- </p>
15
- </div>
1
+ <main class="h-dvh subpixel-antialiased font-mono" role="main">
2
+ <section class="w-full h-full flex flex-col items-center justify-center p-4">
3
+ <article class="max-w-xl">
4
+ <header class="w-full">
5
+ <hgroup>
6
+ <h1 class="font-sans text-4xl font-medium tracking-tight text-[#0a0a0a] dark:text-white">
7
+ Wally UI
8
+ </h1>
16
9
 
17
- <div class="w-full max-w-md">
18
- <code
19
- class="w-full mt-6 block bg-gray-200 dark:bg-[#121212] dark:text-white text-[#0a0a0a] p-4 rounded-md text-sm cursor-pointer hover:opacity-85 transition-colorsselect-all"
20
- onclick="navigator.clipboard.writeText('npx wally-ui list')">
21
- <pre class="m-0">$ npx wally-ui list</pre>
22
- </code>
23
- </div>
10
+ <h2 class="font-sans text-lg font-normal tracking-wide text-[#0a0a0a] dark:text-white">
11
+ Where's Wally? Right here!
12
+ </h2>
13
+ </hgroup>
14
+ <p class="mt-4 text-gray-700 dark:text-neutral-300/75">
15
+ Stop searching for the perfect Angular components. Wally UI is a free, open source
16
+ design system built for modern developers and AI coding assistants. Copy-paste
17
+ ready TypeScript components with accessibility-first design, SSR compatibility,
18
+ and zero configuration. <strong>Own your code - just pure Angular + Tailwind CSS</strong>.
19
+ </p>
20
+ </header>
24
21
 
25
- <div class="mt-4 w-full max-w-md flex flex-col gap-2">
26
- <a href="/documentation" class="text-blue-500 underline">
27
- Documentation
28
- </a>
29
- <a href="/documentation/components" class="text-blue-500 underline">
30
- Components
31
- </a>
32
- <a href="/mcp" class="text-blue-500 underline">
33
- MCP Server
34
- </a>
22
+ <section class="w-full" aria-labelledby="installation-heading">
23
+ <h3 id="installation-heading" class="sr-only">Installation Command</h3>
24
+ <code
25
+ class="w-full mt-6 block bg-gray-200 dark:bg-[#121212] dark:text-white text-[#0a0a0a] p-4 rounded-md text-sm cursor-pointer hover:opacity-85 transition-colorsselect-all"
26
+ onclick="navigator.clipboard.writeText('npx wally-ui list')"
27
+ tabindex="0"
28
+ role="button"
29
+ aria-label="Copy command to clipboard: npx wally-ui list">
30
+ <pre class="m-0">$ npx wally-ui list</pre>
31
+ </code>
32
+ </section>
35
33
 
36
- <div class="flex gap-4 mt-2">
37
- <a href="https://github.com/WalissonCF/wally-ui" target="_blank"
38
- class="text-blue-500 underline text-sm">
39
- GitHub
40
- </a>
41
- <a href="https://www.npmjs.com/package/wally-ui" target="_blank"
42
- class="text-blue-500 underline text-sm">
43
- NPM
44
- </a>
45
- </div>
46
- </div>
47
- </div>
48
- </div>
34
+ <nav class="mt-6 w-full space-y-4" aria-label="Main navigation">
35
+ <div class="space-y-3">
36
+ <a [routerLink]="'/documentation'"
37
+ class="block text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 font-medium transition-colors duration-200 text-base"
38
+ aria-label="View complete documentation and setup guide for Wally UI components">
39
+ Documentation
40
+ </a>
41
+ <a [routerLink]="'/documentation/components'"
42
+ class="block text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 font-medium transition-colors duration-200 text-base"
43
+ aria-label="Browse all available Angular components with examples and API reference">
44
+ Components
45
+ </a>
46
+ <a [routerLink]="'/mcp'"
47
+ class="block text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 font-medium transition-colors duration-200 text-base"
48
+ aria-label="Learn about Wally UI MCP Server for AI coding assistants integration">
49
+ MCP Server
50
+ </a>
51
+ </div>
52
+
53
+ <div class="flex gap-4 pt-3 mt-4 border-t border-gray-200 dark:border-white" aria-label="External links">
54
+ <a href="https://github.com/WalissonCF/wally-ui"
55
+ target="_blank"
56
+ class="inline-flex items-center gap-1 text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 transition-colors duration-200"
57
+ rel="noopener noreferrer"
58
+ aria-label="View Wally UI on GitHub (opens in new tab)">
59
+ <span>GitHub</span>
60
+ </a>
61
+ <a href="https://www.npmjs.com/package/wally-ui"
62
+ target="_blank"
63
+ class="inline-flex items-center gap-1 text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 transition-colors duration-200"
64
+ rel="noopener noreferrer"
65
+ aria-label="View Wally UI on NPM (opens in new tab)">
66
+ <span>NPM</span>
67
+ </a>
68
+ </div>
69
+ </nav>
70
+ </article>
71
+ </section>
72
+ </main>
@@ -1,8 +1,9 @@
1
+ import { RouterModule } from '@angular/router';
1
2
  import { Component } from '@angular/core';
2
3
 
3
4
  @Component({
4
5
  selector: 'wally-home',
5
- imports: [],
6
+ imports: [RouterModule],
6
7
  templateUrl: './home.html',
7
8
  styleUrl: './home.css'
8
9
  })
@@ -3,11 +3,51 @@
3
3
 
4
4
  <head>
5
5
  <meta charset="utf-8">
6
- <title>Wally UI</title>
6
+ <title>A Modern Approach to Angular UI Components - Wally UI</title>
7
7
  <base href="/">
8
8
 
9
+ <script type="application/ld+json">
10
+ {
11
+ "@context": "https://schema.org",
12
+ "@type": "SoftwareApplication",
13
+ "name": "Wally UI",
14
+ "description": "Free open source Angular component library built for modern developers and AI coding assistants. Copy-paste ready TypeScript components with accessibility-first design, SSR compatibility, and zero configuration.",
15
+ "applicationCategory": "DeveloperApplication",
16
+ "operatingSystem": "Any",
17
+ "programmingLanguage": ["TypeScript", "JavaScript"],
18
+ "softwareVersion": "1.9.0",
19
+ "url": "https://wally-ui.com",
20
+ "downloadUrl": "https://www.npmjs.com/package/wally-ui",
21
+ "codeRepository": "https://github.com/WalissonCF/wally-ui",
22
+ "author": {
23
+ "@type": "Person",
24
+ "name": "Walisson Carvalho Ferreira",
25
+ "url": "https://github.com/WalissonCF"
26
+ },
27
+ "license": "https://opensource.org/licenses/MIT",
28
+ "offers": {
29
+ "@type": "Offer",
30
+ "price": "0",
31
+ "priceCurrency": "USD"
32
+ },
33
+ "keywords": ["Angular", "TypeScript", "UI Components", "Design System", "Open Source", "Accessibility", "SSR", "Tailwind CSS", "Component Library"],
34
+ "featureList": [
35
+ "Copy-paste ready components",
36
+ "Angular 20+ compatibility",
37
+ "Accessibility-first design",
38
+ "SSR compatibility",
39
+ "Zero configuration",
40
+ "AI assistant ready",
41
+ "Dark mode support"
42
+ ],
43
+ "requirements": "Angular 17+, Tailwind CSS",
44
+ "installUrl": "https://www.npmjs.com/package/wally-ui",
45
+ "documentation": "https://wally-ui.com/documentation"
46
+ }
47
+ </script>
48
+
9
49
  <script>
10
- // Baseado na documentação oficial do Tailwind 4
50
+ // Tailwind V4
11
51
  document.documentElement.classList.toggle(
12
52
  "dark",
13
53
  localStorage.theme === "dark" ||
@@ -19,9 +59,20 @@
19
59
  <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4944285767597175"
20
60
  crossorigin="anonymous"></script>
21
61
 
22
- <meta name="robots" content="index, follow">
62
+ <!-- SEO Meta Tags -->
63
+ <meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
23
64
  <meta name="viewport" content="width=device-width, initial-scale=1">
24
- <meta name="description" content="Wally UI - Angular component library">
65
+ <meta name="description" content="Free open source Angular component library for modern developers and AI assistants. Copy-paste ready TypeScript components with enterprise accessibility and zero configuration.">
66
+ <meta name="keywords" content="Angular, TypeScript, UI Components, Design System, Open Source, Accessibility, SSR, Tailwind CSS, Component Library, AI Assistant">
67
+ <meta name="author" content="Walisson Carvalho Ferreira">
68
+
69
+ <!-- Open Graph Tags -->
70
+ <meta property="og:type" content="website">
71
+ <meta property="og:title" content="Wally UI - Free Angular Component Library">
72
+ <meta property="og:description" content="Stop searching for the perfect Angular components. Free, open source design system built for developers and AI coding assistants.">
73
+ <meta property="og:url" content="https://wally-ui.com">
74
+ <meta property="og:site_name" content="Wally UI">
75
+ <meta property="og:locale" content="en_US">
25
76
 
26
77
  <link rel="icon" type="image/x-icon" href="favicon.ico">
27
78
  </head>