wally-ui 1.1.0 → 1.2.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.1.0",
3
+ "version": "1.2.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"
@@ -8,5 +8,9 @@ export const routes: Routes = [
8
8
  {
9
9
  path: 'components',
10
10
  loadChildren: () => import('./pages/components/components.routes').then(m => m.componentsRoutes)
11
+ },
12
+ {
13
+ path: 'mcp',
14
+ loadComponent: () => import('./pages/mcp/mcp').then(m => m.MCP)
11
15
  }
12
16
  ];
@@ -2,7 +2,8 @@
2
2
  group
3
3
  relative
4
4
  w-full
5
- flex items-center justify-center
5
+ flex items-center justify-center gap-2
6
+ text-white text-sm font-medium dark:text-[#0a0a0a]
6
7
  bg-[#0a0a0a] hover:bg-[#0a0a0a]/85
7
8
  disabled:bg-[#0a0a0a]/85
8
9
  dark:bg-white dark:hover:bg-white/85
@@ -10,7 +11,7 @@
10
11
  disabled:pointer-events-none
11
12
  p-2.5
12
13
  rounded-md
13
- transition delay-150 duration-300 ease-in-out
14
+ transition duration-300 ease-in-out
14
15
  antialiased
15
16
  cursor-pointer
16
17
  ">
@@ -25,7 +26,7 @@
25
26
  }
26
27
 
27
28
  @if (loading()) {
28
- <svg class="mr-3 -ml-1 size-4 animate-spin text-white dark:text-[#0a0a0a]" xmlns="http://www.w3.org/2000/svg" fill="none"
29
+ <svg class="size-4 animate-spin text-white dark:text-[#0a0a0a]" xmlns="http://www.w3.org/2000/svg" fill="none"
29
30
  viewBox="0 0 24 24">
30
31
  <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
31
32
  <path class="opacity-75" fill="currentColor"
@@ -34,12 +35,5 @@
34
35
  </svg>
35
36
  }
36
37
 
37
- <span class="
38
- text-white
39
- text-sm
40
- font-medium
41
- dark:text-[#0a0a0a]
42
- ">
43
- {{ text() }}
44
- </span>
38
+ <ng-content></ng-content>
45
39
  </button>
@@ -10,7 +10,6 @@ import { CommonModule } from '@angular/common';
10
10
  templateUrl: './button.html',
11
11
  })
12
12
  export class Button {
13
- text: InputSignal<string> = input<string>('Wally Button');
14
13
  type: InputSignal<string> = input<string>('button');
15
14
  disabled: InputSignal<boolean> = input<boolean>(false);
16
15
  loading: InputSignal<boolean> = input<boolean>(false);
@@ -0,0 +1,43 @@
1
+ import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
2
+ import { isPlatformBrowser } from '@angular/common';
3
+
4
+ @Injectable({
5
+ providedIn: 'root'
6
+ })
7
+ export class AiPromptService {
8
+
9
+ constructor(@Inject(PLATFORM_ID) private platformId: Object) {}
10
+
11
+ generateClaudeUrl(pageUrl?: string): string {
12
+ const url = pageUrl || this.getCurrentUrl();
13
+ const basePrompt = `I'm looking at this Wally UI documentation: ${url} Help me understand how to use it. Be ready to explain concepts, give examples, or help debug based on it.`;
14
+
15
+ return `https://claude.ai/new?q=${encodeURIComponent(basePrompt)}`;
16
+ }
17
+
18
+ generateChatGptUrl(pageUrl?: string): string {
19
+ const url = pageUrl || this.getCurrentUrl();
20
+ const basePrompt = `I'm looking at this Wally UI documentation: ${url} Help me understand how to use it. Be ready to explain concepts, give examples, or help debug based on it.`;
21
+
22
+ return `https://chatgpt.com/?prompt=${encodeURIComponent(basePrompt)}`;
23
+ }
24
+
25
+ private getCurrentUrl(): string {
26
+ if (isPlatformBrowser(this.platformId)) {
27
+ return window.location.href;
28
+ }
29
+ // Fallback for SSR - you can customize this
30
+ return 'https://wally-ui.com/components/button';
31
+ }
32
+
33
+ generateCustomPromptUrl(aiService: 'claude' | 'chatgpt', customPrompt: string, pageUrl?: string): string {
34
+ const url = pageUrl || this.getCurrentUrl();
35
+ const fullPrompt = `${customPrompt} ${url}`;
36
+
37
+ if (aiService === 'claude') {
38
+ return `https://claude.ai/new?q=${encodeURIComponent(fullPrompt)}`;
39
+ } else {
40
+ return `https://chatgpt.com/?prompt=${encodeURIComponent(fullPrompt)}`;
41
+ }
42
+ }
43
+ }
@@ -11,6 +11,38 @@
11
11
  A navigation component that shows the current page location within a hierarchy.
12
12
  </p>
13
13
 
14
+ <div class="flex flex-wrap gap-2 mb-6">
15
+ <a [href]="claudeUrl" target="_blank"
16
+ 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">
17
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6" viewBox="0 0 24 24">
18
+ <path fill="currentColor"
19
+ 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" />
20
+ </svg>
21
+
22
+ Open in Claude
23
+ </a>
24
+
25
+ <a [href]="chatGptUrl" target="_blank"
26
+ 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">
27
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6" viewBox="0 0 48 48">
28
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
29
+ d="M18.38 27.94v-14.4l11.19-6.46c6.2-3.58 17.3 5.25 12.64 13.33" />
30
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
31
+ d="m18.38 20.94l12.47-7.2l11.19 6.46c6.2 3.58 4.1 17.61-5.23 17.61" />
32
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
33
+ d="m24.44 17.44l12.47 7.2v12.93c0 7.16-13.2 12.36-17.86 4.28" />
34
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
35
+ d="M30.5 21.2v14.14L19.31 41.8c-6.2 3.58-17.3-5.25-12.64-13.33" />
36
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
37
+ d="m30.5 27.94l-12.47 7.2l-11.19-6.46c-6.21-3.59-4.11-17.61 5.22-17.61" />
38
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
39
+ d="m24.44 31.44l-12.47-7.2V11.31c0-7.16 13.2-12.36 17.86-4.28" />
40
+ </svg>
41
+
42
+ Open in ChatGPT
43
+ </a>
44
+ </div>
45
+
14
46
  <!-- Installation -->
15
47
  <section class="mb-8">
16
48
  <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Installation</h2>
@@ -2,6 +2,8 @@ import { Component } from '@angular/core';
2
2
 
3
3
  import { Breadcrumb, BreadcrumbItem } from '../../../components/breadcrumb/breadcrumb';
4
4
 
5
+ import { AiPromptService } from '../../../core/services/ai-prompt.service';
6
+
5
7
  @Component({
6
8
  selector: 'app-breadcrumb-docs',
7
9
  imports: [
@@ -26,4 +28,16 @@ export class BreadcrumbDocs {
26
28
  simpleBreadcrumbs: BreadcrumbItem[] = [
27
29
  { label: 'Components' }
28
30
  ];
31
+
32
+ constructor(
33
+ private aiPromptService: AiPromptService
34
+ ) { }
35
+
36
+ get claudeUrl(): string {
37
+ return this.aiPromptService.generateClaudeUrl();
38
+ }
39
+
40
+ get chatGptUrl(): string {
41
+ return this.aiPromptService.generateChatGptUrl();
42
+ }
29
43
  }
@@ -7,10 +7,43 @@
7
7
  <h1 class="text-2xl font-bold mb-4 text-[#0a0a0a] dark:text-white">
8
8
  Button
9
9
  </h1>
10
- <p class="text-gray-700 dark:text-gray-400 mb-6">
10
+ <p class="text-gray-700 dark:text-gray-400 mb-4">
11
11
  A versatile button component with loading states, notifications, and customizable text.
12
12
  </p>
13
13
 
14
+ <!-- AI Prompts -->
15
+ <div class="flex flex-wrap gap-2 mb-6">
16
+ <a [href]="claudeUrl" target="_blank"
17
+ 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">
18
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6" viewBox="0 0 24 24">
19
+ <path fill="currentColor"
20
+ 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" />
21
+ </svg>
22
+
23
+ Open in Claude
24
+ </a>
25
+
26
+ <a [href]="chatGptUrl" target="_blank"
27
+ 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">
28
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6" viewBox="0 0 48 48">
29
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
30
+ d="M18.38 27.94v-14.4l11.19-6.46c6.2-3.58 17.3 5.25 12.64 13.33" />
31
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
32
+ d="m18.38 20.94l12.47-7.2l11.19 6.46c6.2 3.58 4.1 17.61-5.23 17.61" />
33
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
34
+ d="m24.44 17.44l12.47 7.2v12.93c0 7.16-13.2 12.36-17.86 4.28" />
35
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
36
+ d="M30.5 21.2v14.14L19.31 41.8c-6.2 3.58-17.3-5.25-12.64-13.33" />
37
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
38
+ d="m30.5 27.94l-12.47 7.2l-11.19-6.46c-6.21-3.59-4.11-17.61 5.22-17.61" />
39
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
40
+ d="m24.44 31.44l-12.47-7.2V11.31c0-7.16 13.2-12.36 17.86-4.28" />
41
+ </svg>
42
+
43
+ Open in ChatGPT
44
+ </a>
45
+ </div>
46
+
14
47
  <!-- Installation -->
15
48
  <section class="mb-8">
16
49
  <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Installation</h2>
@@ -26,10 +59,47 @@
26
59
  <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Preview</h2>
27
60
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212] text-center">
28
61
  <div class="flex flex-col gap-4">
29
- <wally-button></wally-button>
30
- <wally-button text="Disabled" [disabled]="true"></wally-button>
31
- <wally-button text="Loading" [loading]="true"></wally-button>
32
- <wally-button text="Messages" [showNotification]="true"></wally-button>
62
+ <wally-button>Wally Button</wally-button>
63
+ <wally-button>
64
+ Send
65
+ <svg slot="icon-left" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2"
66
+ stroke="currentColor" class="size-5">
67
+ <path stroke-linecap="round" stroke-linejoin="round"
68
+ d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
69
+ </svg>
70
+ </wally-button>
71
+ <wally-button [disabled]="true">Disabled</wally-button>
72
+ <wally-button [loading]="true">
73
+ Loading
74
+ </wally-button>
75
+
76
+ <div class="w-full flex justify-center items-center gap-2">
77
+ <div class="w-full">
78
+ <wally-button [showNotification]="true">
79
+ Messages
80
+ </wally-button>
81
+ </div>
82
+
83
+ <div class="flex justify-center">
84
+ <wally-button [showNotification]="true">
85
+ <svg slot="icon-left" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
86
+ stroke-width="1.5" stroke="currentColor" class="size-5">
87
+ <path stroke-linecap="round" stroke-linejoin="round"
88
+ d="M2.25 13.5h3.86a2.25 2.25 0 0 1 2.012 1.244l.256.512a2.25 2.25 0 0 0 2.013 1.244h3.218a2.25 2.25 0 0 0 2.013-1.244l.256-.512a2.25 2.25 0 0 1 2.013-1.244h3.859m-19.5.338V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18v-4.162c0-.224-.034-.447-.1-.661L19.24 5.338a2.25 2.25 0 0 0-2.15-1.588H6.911a2.25 2.25 0 0 0-2.15 1.588L2.35 13.177a2.25 2.25 0 0 0-.1.661Z" />
89
+ </svg>
90
+ </wally-button>
91
+ </div>
92
+
93
+ <div class="flex justify-center">
94
+ <wally-button [showNotification]="true">
95
+ <svg slot="icon-left" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
96
+ stroke-width="1.5" stroke="currentColor" class="size-5">
97
+ <path stroke-linecap="round" stroke-linejoin="round"
98
+ d="M14.857 17.082a23.848 23.848 0 0 0 5.454-1.31A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6 9v.75a8.967 8.967 0 0 1-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 0 1-5.714 0m5.714 0a3 3 0 1 1-5.714 0M3.124 7.5A8.969 8.969 0 0 1 5.292 3m13.416 0a8.969 8.969 0 0 1 2.168 4.5" />
99
+ </svg>
100
+ </wally-button>
101
+ </div>
102
+ </div>
33
103
  </div>
34
104
  </div>
35
105
  </section>
@@ -67,31 +137,11 @@
67
137
  <div>
68
138
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
69
139
  <code class="text-sm text-[#0a0a0a] dark:text-white">
70
- {{ '<' }}wally-button{{ '>' }}{{ '<' }}/wally-button{{ '>' }}
140
+ {{ '<' }}wally-button{{ '>' }}Wally Button{{ '<' }}/wally-button{{ '>' }}
71
141
  </code>
72
142
  </div>
73
143
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
74
- <wally-button></wally-button>
75
- </div>
76
- </div>
77
- </div>
78
- </section>
79
-
80
- <!-- Custom Text -->
81
- <section class="mb-8">
82
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">
83
- Custom Text
84
- </h2>
85
-
86
- <div class="space-y-8">
87
- <div>
88
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
89
- <code class="text-sm text-[#0a0a0a] dark:text-white">
90
- {{ '<' }}wally-button text="Save Changes"{{ '>' }}{{ '<' }}/wally-button{{ '>' }}
91
- </code>
92
- </div>
93
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
94
- <wally-button text="Save Changes"></wally-button>
144
+ <wally-button>Wally Button</wally-button>
95
145
  </div>
96
146
  </div>
97
147
  </div>
@@ -111,11 +161,11 @@
111
161
  </h3>
112
162
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
113
163
  <code class="text-sm text-[#0a0a0a] dark:text-white">
114
- {{ '<' }}wally-button text="Disabled" [disabled]="true"{{ '>' }}{{ '<' }}/wally-button{{ '>' }}
164
+ {{ '<' }}wally-button [disabled]="true"{{ '>' }}Disabled{{ '<' }}/wally-button{{ '>' }}
115
165
  </code>
116
166
  </div>
117
167
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
118
- <wally-button text="Disabled" [disabled]="true"></wally-button>
168
+ <wally-button [disabled]="true">Disabled</wally-button>
119
169
  </div>
120
170
  </div>
121
171
 
@@ -126,11 +176,11 @@
126
176
  </h3>
127
177
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
128
178
  <code class="text-sm text-[#0a0a0a] dark:text-white">
129
- {{ '<' }}wally-button text="Loading" [loading]="true"{{ '>' }}{{ '<' }}/wally-button{{ '>' }}
179
+ {{ '<' }}wally-button [loading]="true"{{ '>' }}Loading{{ '<' }}/wally-button{{ '>' }}
130
180
  </code>
131
181
  </div>
132
182
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
133
- <wally-button text="Loading" [loading]="true"></wally-button>
183
+ <wally-button [loading]="true">Loading</wally-button>
134
184
  </div>
135
185
  </div>
136
186
 
@@ -141,11 +191,11 @@
141
191
  </h3>
142
192
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
143
193
  <code class="text-sm text-[#0a0a0a] dark:text-white">
144
- {{ '<' }}wally-button text="Messages" [showNotification]="true"{{ '>' }}{{ '<' }}/wally-button{{ '>' }}
194
+ {{ '<' }}wally-button [showNotification]="true"{{ '>' }}Messages{{ '<' }}/wally-button{{ '>' }}
145
195
  </code>
146
196
  </div>
147
197
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
148
- <wally-button text="Messages" [showNotification]="true"></wally-button>
198
+ <wally-button [showNotification]="true">Messages</wally-button>
149
199
  </div>
150
200
  </div>
151
201
  </div>
@@ -162,11 +212,11 @@
162
212
  <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Submit Button</h3>
163
213
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
164
214
  <code class="text-sm text-[#0a0a0a] dark:text-white">
165
- {{ '<' }}wally-button text="Submit Form" type="submit"{{ '>' }}{{ '<' }}/wally-button{{ '>' }}
215
+ {{ '<' }}wally-button type="submit"{{ '>' }}Submit Form{{ '<' }}/wally-button{{ '>' }}
166
216
  </code>
167
217
  </div>
168
218
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
169
- <wally-button text="Submit Form" type="submit"></wally-button>
219
+ <wally-button type="submit">Submit Form</wally-button>
170
220
  </div>
171
221
  </div>
172
222
  </div>
@@ -183,7 +233,7 @@
183
233
  <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Handling Click Events</h3>
184
234
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
185
235
  <code class="text-sm text-[#0a0a0a] dark:text-white">
186
- {{ '<' }}wally-button text="Click Me" (click)="handleClick()"{{ '>' }}{{ '<' }}/wally-button{{ '>' }}<br><br>
236
+ {{ '<' }}wally-button (click)="handleClick()"{{ '>' }}Click Me{{ '<' }}/wally-button{{ '>' }}<br><br>
187
237
  handleClick() {{ '{' }}<br>
188
238
  &nbsp;&nbsp;this.clickMessage.set('Button clicked!');<br>
189
239
  {{ '}' }}
@@ -191,11 +241,11 @@
191
241
  </div>
192
242
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
193
243
  <div class="space-y-4 text-center">
194
- <wally-button text="Click Me" (click)="handleClick()"></wally-button>
244
+ <wally-button (click)="handleClick()">Click Me</wally-button>
195
245
  @if (clickMessage()) {
196
- <p class="text-sm text-green-600 dark:text-green-400 font-medium mt-4">
197
- {{ clickMessage() }}
198
- </p>
246
+ <p class="text-sm text-green-600 dark:text-green-400 font-medium mt-4">
247
+ {{ clickMessage() }}
248
+ </p>
199
249
  }
200
250
  </div>
201
251
  </div>
@@ -203,25 +253,79 @@
203
253
  </div>
204
254
  </section>
205
255
 
256
+ <!-- Button with Icons -->
257
+ <section class="mb-8">
258
+ <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">
259
+ Button with Icons
260
+ </h2>
261
+
262
+ <div class="space-y-8">
263
+ <!-- Icon with Text -->
264
+ <div>
265
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Icon with Text</h3>
266
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
267
+ <code class="text-sm text-[#0a0a0a] dark:text-white">
268
+ {{ '<' }}wally-button{{ '>' }}<br>
269
+ &nbsp;&nbsp;Save<br>
270
+ &nbsp;&nbsp;{{ '<' }}svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"<br>
271
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stroke-width="1.5" stroke="currentColor" class="size-5"{{ '>' }}<br>
272
+ &nbsp;&nbsp;&nbsp;&nbsp;{{ '<' }}path stroke-linecap="round" stroke-linejoin="round"<br>
273
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" /{{ '>' }}<br>
274
+ &nbsp;&nbsp;{{ '<' }}/svg{{ '>' }}<br>
275
+ {{ '<' }}/wally-button{{ '>' }}
276
+ </code>
277
+ </div>
278
+ <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
279
+ <wally-button>
280
+ Save
281
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
282
+ stroke="currentColor" class="size-5">
283
+ <path stroke-linecap="round" stroke-linejoin="round"
284
+ d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
285
+ </svg>
286
+ </wally-button>
287
+ </div>
288
+ </div>
289
+
290
+ <!-- Icon Only -->
291
+ <div>
292
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Icon Only</h3>
293
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
294
+ <code class="text-sm text-[#0a0a0a] dark:text-white">
295
+ {{ '<' }}wally-button{{ '>' }}<br>
296
+ &nbsp;&nbsp;{{ '<' }}svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"<br>
297
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stroke-width="1.5" stroke="currentColor" class="size-5"{{ '>' }}<br>
298
+ &nbsp;&nbsp;&nbsp;&nbsp;{{ '<' }}path stroke-linecap="round" stroke-linejoin="round"<br>
299
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d="M14.857 17.082a23.848 23.848 0 0 0 5.454-1.31A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6 9v.75a8.967 8.967 0 0 1-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 0 1-5.714 0m5.714 0a3 3 0 1 1-5.714 0M3.124 7.5A8.969 8.969 0 0 1 5.292 3m13.416 0a8.969 8.969 0 0 1 2.168 4.5" /{{ '>' }}<br>
300
+ &nbsp;&nbsp;{{ '<' }}/svg{{ '>' }}<br>
301
+ {{ '<' }}/wally-button{{ '>' }}
302
+ </code>
303
+ </div>
304
+ <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
305
+ <wally-button>
306
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
307
+ stroke="currentColor" class="size-5">
308
+ <path stroke-linecap="round" stroke-linejoin="round"
309
+ d="M14.857 17.082a23.848 23.848 0 0 0 5.454-1.31A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6 9v.75a8.967 8.967 0 0 1-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 0 1-5.714 0m5.714 0a3 3 0 1 1-5.714 0M3.124 7.5A8.969 8.969 0 0 1 5.292 3m13.416 0a8.969 8.969 0 0 1 2.168 4.5" />
310
+ </svg>
311
+ </wally-button>
312
+ </div>
313
+ </div>
314
+ </div>
315
+ </section>
316
+
206
317
  <!-- Properties -->
207
318
  <section class="mb-8">
208
319
  <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Properties</h2>
209
320
 
210
321
  <div class="space-y-4">
211
- <div class="p-4 bg-gray-200 dark:bg-[#121212] rounded-lg">
212
- <div class="font-mono text-sm mb-2">
213
- <span class="text-blue-600 dark:text-blue-400">text</span><span class="text-[#0a0a0a] dark:text-white">: </span>
214
- <span class="text-purple-600 dark:text-purple-400">string</span> <span class="text-[#0a0a0a] dark:text-white"> = </span>
215
- <span class="text-green-600 dark:text-green-400">'Wally Button'</span>
216
- <span class="text-[#0a0a0a] dark:text-white">;</span>
217
- </div>
218
- <p class="text-sm text-gray-700 dark:text-gray-400">The text displayed on the button</p>
219
- </div>
220
322
 
221
323
  <div class="p-4 bg-gray-200 dark:bg-[#121212] rounded-lg">
222
324
  <div class="font-mono text-sm mb-2">
223
- <span class="text-blue-600 dark:text-blue-400">type</span><span class="text-[#0a0a0a] dark:text-white">: </span>
224
- <span class="text-purple-600 dark:text-purple-400">string</span> <span class="text-[#0a0a0a] dark:text-white"> = </span>
325
+ <span class="text-blue-600 dark:text-blue-400">type</span><span class="text-[#0a0a0a] dark:text-white">:
326
+ </span>
327
+ <span class="text-purple-600 dark:text-purple-400">string</span> <span
328
+ class="text-[#0a0a0a] dark:text-white"> = </span>
225
329
  <span class="text-green-600 dark:text-green-400">'button'</span>
226
330
  <span class="text-[#0a0a0a] dark:text-white">;</span>
227
331
  </div>
@@ -230,8 +334,10 @@
230
334
 
231
335
  <div class="p-4 bg-gray-200 dark:bg-[#121212] rounded-lg">
232
336
  <div class="font-mono text-sm mb-2">
233
- <span class="text-blue-600 dark:text-blue-400">disabled</span><span class="text-[#0a0a0a] dark:text-white">: </span>
234
- <span class="text-purple-600 dark:text-purple-400">boolean</span> <span class="text-[#0a0a0a] dark:text-white"> = </span>
337
+ <span class="text-blue-600 dark:text-blue-400">disabled</span><span class="text-[#0a0a0a] dark:text-white">:
338
+ </span>
339
+ <span class="text-purple-600 dark:text-purple-400">boolean</span> <span
340
+ class="text-[#0a0a0a] dark:text-white"> = </span>
235
341
  <span class="text-green-600 dark:text-green-400">false</span>
236
342
  <span class="text-[#0a0a0a] dark:text-white">;</span>
237
343
  </div>
@@ -240,8 +346,10 @@
240
346
 
241
347
  <div class="p-4 bg-gray-200 dark:bg-[#121212] rounded-lg">
242
348
  <div class="font-mono text-sm mb-2">
243
- <span class="text-blue-600 dark:text-blue-400">loading</span><span class="text-[#0a0a0a] dark:text-white">: </span>
244
- <span class="text-purple-600 dark:text-purple-400">boolean</span> <span class="text-[#0a0a0a] dark:text-white"> = </span>
349
+ <span class="text-blue-600 dark:text-blue-400">loading</span><span class="text-[#0a0a0a] dark:text-white">:
350
+ </span>
351
+ <span class="text-purple-600 dark:text-purple-400">boolean</span> <span
352
+ class="text-[#0a0a0a] dark:text-white"> = </span>
245
353
  <span class="text-green-600 dark:text-green-400">false</span>
246
354
  <span class="text-[#0a0a0a] dark:text-white">;</span>
247
355
  </div>
@@ -250,13 +358,27 @@
250
358
 
251
359
  <div class="p-4 bg-gray-200 dark:bg-[#121212] rounded-lg">
252
360
  <div class="font-mono text-sm mb-2">
253
- <span class="text-blue-600 dark:text-blue-400">showNotification</span><span class="text-[#0a0a0a] dark:text-white">: </span>
254
- <span class="text-purple-600 dark:text-purple-400">boolean</span> <span class="text-[#0a0a0a] dark:text-white"> = </span>
361
+ <span class="text-blue-600 dark:text-blue-400">showNotification</span><span
362
+ class="text-[#0a0a0a] dark:text-white">: </span>
363
+ <span class="text-purple-600 dark:text-purple-400">boolean</span> <span
364
+ class="text-[#0a0a0a] dark:text-white"> = </span>
255
365
  <span class="text-green-600 dark:text-green-400">false</span>
256
366
  <span class="text-[#0a0a0a] dark:text-white">;</span>
257
367
  </div>
258
368
  <p class="text-sm text-gray-700 dark:text-gray-400">Shows notification badge when true</p>
259
369
  </div>
370
+
371
+ <div class="p-4 bg-gray-200 dark:bg-[#121212] rounded-lg">
372
+ <div class="font-mono text-sm mb-2">
373
+ <span class="text-blue-600 dark:text-blue-400">icon</span><span class="text-[#0a0a0a] dark:text-white">:
374
+ </span>
375
+ <span class="text-purple-600 dark:text-purple-400">'left' | 'right' | 'none'</span> <span
376
+ class="text-[#0a0a0a] dark:text-white"> = </span>
377
+ <span class="text-green-600 dark:text-green-400">'none'</span>
378
+ <span class="text-[#0a0a0a] dark:text-white">;</span>
379
+ </div>
380
+ <p class="text-sm text-gray-700 dark:text-gray-400">Position of the icon content (left, right, or none)</p>
381
+ </div>
260
382
  </div>
261
383
  </section>
262
384
 
@@ -265,16 +387,6 @@
265
387
  <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Under Construction</h2>
266
388
 
267
389
  <div class="space-y-4">
268
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
269
- <div class="flex items-center gap-2 mb-2">
270
- <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Button with Icon</h3>
271
- <span class="text-xs bg-yellow-500 text-black px-2 py-1 rounded">Under Construction</span>
272
- </div>
273
- <p class="text-sm text-gray-700 dark:text-gray-400">
274
- Support for icons within buttons. This will include leading and trailing icon positions with proper spacing.
275
- </p>
276
- </div>
277
-
278
390
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
279
391
  <div class="flex items-center gap-2 mb-2">
280
392
  <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Button Variants</h3>
@@ -3,6 +3,8 @@ import { Component, signal, WritableSignal } from '@angular/core';
3
3
  import { Breadcrumb, BreadcrumbItem } from '../../../components/breadcrumb/breadcrumb';
4
4
  import { Button } from '../../../components/button/button';
5
5
 
6
+ import { AiPromptService } from '../../../core/services/ai-prompt.service';
7
+
6
8
  @Component({
7
9
  selector: 'app-button-docs',
8
10
  imports: [
@@ -21,7 +23,19 @@ export class ButtonDocs {
21
23
 
22
24
  clickMessage: WritableSignal<string> = signal<string>('');
23
25
 
26
+ constructor(
27
+ private aiPromptService: AiPromptService
28
+ ) {}
29
+
24
30
  handleClick(): void {
25
31
  this.clickMessage.set('Button clicked!');
26
32
  }
33
+
34
+ get claudeUrl(): string {
35
+ return this.aiPromptService.generateClaudeUrl();
36
+ }
37
+
38
+ get chatGptUrl(): string {
39
+ return this.aiPromptService.generateChatGptUrl();
40
+ }
27
41
  }
@@ -7,10 +7,10 @@ export const componentsRoutes: Routes = [
7
7
  },
8
8
  {
9
9
  path: 'button',
10
- loadComponent: () => import('./button/button-docs').then(m => m.ButtonDocs)
10
+ loadComponent: () => import('./button-docs/button-docs').then(m => m.ButtonDocs)
11
11
  },
12
12
  {
13
13
  path: 'breadcrumb',
14
- loadComponent: () => import('./breadcrumb/breadcrumb-docs').then(m => m.BreadcrumbDocs)
14
+ loadComponent: () => import('./breadcrumb-docs/breadcrumb-docs').then(m => m.BreadcrumbDocs)
15
15
  }
16
16
  ];
@@ -26,6 +26,9 @@
26
26
  <a href="/components" class="text-blue-500 underline">
27
27
  Documentation
28
28
  </a>
29
+ <a href="/mcp" class="text-blue-500 underline">
30
+ MCP Server
31
+ </a>
29
32
 
30
33
  <div class="flex gap-4 mt-2">
31
34
  <a href="https://github.com/WalissonCF/wally-ui" target="_blank" class="text-blue-500 underline text-sm">
@@ -0,0 +1 @@
1
+ /* MCP page styles - following project patterns */
@@ -0,0 +1,196 @@
1
+ <div class="max-w-4xl mx-auto p-6 font-mono">
2
+ <div class="mb-4">
3
+ <wally-breadcrumb [items]="breadcrumbItems"></wally-breadcrumb>
4
+ </div>
5
+
6
+ <!-- Header -->
7
+ <div class="mb-8">
8
+ <h1 class="text-4xl font-bold text-[#0a0a0a] dark:text-white mb-2">
9
+ Wally UI MCP Server
10
+ </h1>
11
+ <p class="text-lg text-gray-700 dark:text-gray-400">
12
+ Model Context Protocol server for intelligent AI-powered component installation with Claude Desktop.
13
+ </p>
14
+ </div>
15
+
16
+ <!-- Installation Section -->
17
+ <section class="mb-8">
18
+ <h2 class="text-2xl font-bold text-[#0a0a0a] dark:text-white mb-4">
19
+ Installation
20
+ </h2>
21
+
22
+ <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4 mb-4">
23
+ <code class="text-[#0a0a0a] dark:text-white">
24
+ <pre class="m-0">npm install -g wally-ui-mcp</pre>
25
+ </code>
26
+ </div>
27
+ </section>
28
+
29
+ <!-- Configuration Section -->
30
+ <section class="mb-8">
31
+ <h2 class="text-2xl font-bold text-[#0a0a0a] dark:text-white mb-4">
32
+ Configuration
33
+ </h2>
34
+
35
+ <p class="text-gray-700 dark:text-gray-400 mb-4">
36
+ Add to your Claude Desktop configuration file:
37
+ </p>
38
+
39
+ <div class="mb-4">
40
+ <p class="text-sm text-gray-700 dark:text-gray-400 mb-2">
41
+ <strong>Mac:</strong> <code
42
+ class="bg-gray-200 dark:bg-[#121212] px-2 py-1 rounded text-[#0a0a0a] dark:text-white">~/Library/Application Support/Claude/claude_desktop_config.json</code>
43
+ </p>
44
+ <p class="text-sm text-gray-700 dark:text-gray-400 mb-4">
45
+ <strong>Windows:</strong> <code
46
+ class="bg-gray-200 dark:bg-[#121212] px-2 py-1 rounded text-[#0a0a0a] dark:text-white">%APPDATA%\Claude\claude_desktop_config.json</code>
47
+ </p>
48
+ </div>
49
+
50
+ <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4 mb-4">
51
+ <code class="text-sm text-[#0a0a0a] dark:text-white">
52
+ {{ '{' }}<br>
53
+ &nbsp;&nbsp;"mcpServers": {{ '{' }}<br>
54
+ &nbsp;&nbsp;&nbsp;&nbsp;"wally-ui": {{ '{' }}<br>
55
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"command": "npx",<br>
56
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"args": ["wally-ui-mcp"],<br>
57
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"env": {{ '{' }}{{ '}' }}<br>
58
+ &nbsp;&nbsp;&nbsp;&nbsp;{{ '}' }}<br>
59
+ &nbsp;&nbsp;{{ '}' }}<br>
60
+ {{ '}' }}
61
+ </code>
62
+ </div>
63
+ </section>
64
+
65
+ <!-- Features Section -->
66
+ <section class="mb-8">
67
+ <h2 class="text-2xl font-bold text-[#0a0a0a] dark:text-white mb-4">
68
+ Available Tools
69
+ </h2>
70
+
71
+ <div class="grid gap-4 md:grid-cols-2">
72
+ <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
73
+ <h3 class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-2">
74
+ install-component
75
+ </h3>
76
+ <p class="text-gray-700 dark:text-gray-400 text-sm mb-2">
77
+ Installs Wally UI components directly into your Angular project.
78
+ </p>
79
+ <code class="text-xs bg-gray-200 dark:bg-[#121212] px-2 py-1 rounded text-[#0a0a0a] dark:text-white">
80
+ componentName: string
81
+ </code>
82
+ </div>
83
+
84
+ <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
85
+ <h3 class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-2">
86
+ list-components
87
+ </h3>
88
+ <p class="text-gray-700 dark:text-gray-400 text-sm mb-2">
89
+ Lists all available components in the Wally UI library.
90
+ </p>
91
+ <code class="text-xs bg-gray-200 dark:bg-[#121212] px-2 py-1 rounded text-[#0a0a0a] dark:text-white">
92
+ No parameters
93
+ </code>
94
+ </div>
95
+
96
+ <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
97
+ <h3 class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-2">
98
+ validate-component
99
+ </h3>
100
+ <p class="text-gray-700 dark:text-gray-400 text-sm mb-2">
101
+ Validates component structure and integrity.
102
+ </p>
103
+ <code class="text-xs bg-gray-200 dark:bg-[#121212] px-2 py-1 rounded text-[#0a0a0a] dark:text-white">
104
+ componentName: string
105
+ </code>
106
+ </div>
107
+
108
+ <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
109
+ <h3 class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-2">
110
+ generate-docs
111
+ </h3>
112
+ <p class="text-gray-700 dark:text-gray-400 text-sm mb-2">
113
+ Generates documentation for components.
114
+ </p>
115
+ <code class="text-xs bg-gray-200 dark:bg-[#121212] px-2 py-1 rounded text-[#0a0a0a] dark:text-white">
116
+ componentName: string
117
+ </code>
118
+ </div>
119
+ </div>
120
+ </section>
121
+
122
+ <!-- Usage Examples -->
123
+ <section class="mb-8">
124
+ <h2 class="text-2xl font-bold text-[#0a0a0a] dark:text-white mb-4">
125
+ Usage Examples
126
+ </h2>
127
+
128
+ <div class="space-y-4">
129
+ <div>
130
+ <h3 class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-2">
131
+ List Available Components
132
+ </h3>
133
+ <p class="text-gray-700 dark:text-gray-400 mb-2">
134
+ Ask Claude to show you what components are available:
135
+ </p>
136
+ <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
137
+ <code class="text-[#0a0a0a] dark:text-white">
138
+ <pre class="m-0">"Show me the available Wally UI components"</pre>
139
+ </code>
140
+ </div>
141
+ </div>
142
+
143
+ <div>
144
+ <h3 class="text-lg font-semibold text-[#0a0a0a] dark:text-white mb-2">
145
+ Install a Component
146
+ </h3>
147
+ <p class="text-gray-700 dark:text-gray-400 mb-2">
148
+ Ask Claude to install a specific component in your project:
149
+ </p>
150
+ <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
151
+ <code class="text-[#0a0a0a] dark:text-white">
152
+ <pre class="m-0">"Install the button component from Wally UI in my Angular project"</pre>
153
+ </code>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ </section>
158
+
159
+ <!-- Requirements -->
160
+ <section class="mb-8">
161
+ <h2 class="text-2xl font-bold text-[#0a0a0a] dark:text-white mb-4">
162
+ Requirements
163
+ </h2>
164
+
165
+ <ul class="list-disc list-inside text-gray-700 dark:text-gray-400 space-y-2">
166
+ <li>Node.js 18+</li>
167
+ <li>Claude Desktop with MCP support</li>
168
+ <li>Angular project (for component installation)</li>
169
+ <li>Tailwind CSS configured in your project</li>
170
+ </ul>
171
+ </section>
172
+
173
+ <!-- Links -->
174
+ <section class="mb-8">
175
+ <h2 class="text-2xl font-bold text-[#0a0a0a] dark:text-white mb-4">
176
+ Links
177
+ </h2>
178
+
179
+ <div class="flex flex-wrap gap-4">
180
+ <a href="https://www.npmjs.com/package/wally-ui-mcp" target="_blank"
181
+ class="text-blue-500 underline hover:text-blue-700">
182
+ NPM Package
183
+ </a>
184
+ <a href="https://github.com/WalissonCF/wally-ui" target="_blank"
185
+ class="text-blue-500 underline hover:text-blue-700">
186
+ GitHub Repository
187
+ </a>
188
+ <a href="https://modelcontextprotocol.io/" target="_blank" class="text-blue-500 underline hover:text-blue-700">
189
+ Model Context Protocol
190
+ </a>
191
+ <a href="/components" class="text-blue-500 underline hover:text-blue-700">
192
+ Browse Components
193
+ </a>
194
+ </div>
195
+ </section>
196
+ </div>
@@ -0,0 +1,23 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { Mcp } from './mcp';
4
+
5
+ describe('Mcp', () => {
6
+ let component: Mcp;
7
+ let fixture: ComponentFixture<Mcp>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ imports: [Mcp]
12
+ })
13
+ .compileComponents();
14
+
15
+ fixture = TestBed.createComponent(Mcp);
16
+ component = fixture.componentInstance;
17
+ fixture.detectChanges();
18
+ });
19
+
20
+ it('should create', () => {
21
+ expect(component).toBeTruthy();
22
+ });
23
+ });
@@ -0,0 +1,16 @@
1
+ import { Component } from '@angular/core';
2
+
3
+ import { Breadcrumb, BreadcrumbItem } from '../../components/breadcrumb/breadcrumb';
4
+
5
+ @Component({
6
+ selector: 'wally-mcp',
7
+ imports: [Breadcrumb],
8
+ templateUrl: './mcp.html',
9
+ styleUrl: './mcp.css'
10
+ })
11
+ export class MCP {
12
+ breadcrumbItems: BreadcrumbItem[] = [
13
+ { label: 'Home', url: '/' },
14
+ { label: 'MCP Server' }
15
+ ];
16
+ }