wally-ui 1.3.0 → 1.5.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.3.0",
3
+ "version": "1.5.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"
@@ -11,4 +11,7 @@ User-agent: claudebot
11
11
  Allow: /
12
12
 
13
13
  User-agent: ChatGPT-User
14
- Allow: /
14
+ Allow: /
15
+
16
+ # Sitemap location
17
+ Sitemap: https://wally-ui.com/sitemap.xml
@@ -0,0 +1,47 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
5
+ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
6
+
7
+ <!-- Homepage -->
8
+ <url>
9
+ <loc>https://wally-ui.com/</loc>
10
+ <lastmod>2025-01-25</lastmod>
11
+ <changefreq>weekly</changefreq>
12
+ <priority>1.0</priority>
13
+ </url>
14
+
15
+ <!-- Documentation Index -->
16
+ <url>
17
+ <loc>https://wally-ui.com/documentation</loc>
18
+ <lastmod>2025-01-25</lastmod>
19
+ <changefreq>weekly</changefreq>
20
+ <priority>0.9</priority>
21
+ </url>
22
+
23
+ <!-- Components Index -->
24
+ <url>
25
+ <loc>https://wally-ui.com/documentation/components</loc>
26
+ <lastmod>2025-09-25</lastmod>
27
+ <changefreq>weekly</changefreq>
28
+ <priority>0.9</priority>
29
+ </url>
30
+
31
+ <!-- Button Documentation -->
32
+ <url>
33
+ <loc>https://wally-ui.com/documentation/components/button</loc>
34
+ <lastmod>2025-09-25</lastmod>
35
+ <changefreq>monthly</changefreq>
36
+ <priority>0.8</priority>
37
+ </url>
38
+
39
+ <!-- Input Documentation -->
40
+ <url>
41
+ <loc>https://wally-ui.com/documentation/components/input</loc>
42
+ <lastmod>2025-09-25</lastmod>
43
+ <changefreq>monthly</changefreq>
44
+ <priority>0.8</priority>
45
+ </url>
46
+
47
+ </urlset>
@@ -13,6 +13,7 @@ export interface BreadcrumbItem {
13
13
  CommonModule,
14
14
  RouterModule
15
15
  ],
16
+ // standalone: true, (If your application is lower than Angular 19, uncomment this line)
16
17
  templateUrl: './breadcrumb.html',
17
18
  })
18
19
  export class Breadcrumb {
@@ -1,27 +1,71 @@
1
+ @if (label()) {
2
+ <div class="py-2">
3
+ <label [for]="inputId" class="block text-sm font-medium text-[#0a0a0a] dark:text-white">
4
+ {{ label() }}
5
+ </label>
6
+ </div>
7
+ }
8
+
1
9
  <div class="relative">
2
- <!--
3
- ps-11 pe-9 - add padding when there is an icon
4
- -->
5
- <input [type]="type()" [value]="value()" [disabled]="disabled" [placeholder]="placeholder()" class="
10
+ <input [id]="inputId" [type]="currentInputType()" [value]="value()" [disabled]="isDisabled() || loading()"
11
+ [placeholder]="placeholder()" [autocomplete]="autocomplete() || (type() === 'password' ? 'new-password' : '')"
12
+ [attr.aria-describedby]="errorId()" [attr.aria-invalid]="!!errorMessage()" class="
6
13
  font-semibold
7
- block
14
+ block
8
15
  w-full
9
- bg-gray-100
10
16
  rounded-lg
11
- text-base md:text-sm
12
- focus:outline-none focus:ring-2 focus:ring-gray-300
13
- dark:bg-[#191919] dark:text-white dark:placeholder:text-gray-400 dark:focus:ring-gray-400
14
- disabled:opacity-85 disabled:pointer-events-none
15
- py-4 px-4
16
- ">
17
+ border-2 border-transparent
18
+ text-[#0a0a0a] text-base md:text-sm placeholder:text-neutral-400
19
+ focus:outline-none focus:ring-2 focus:ring-neutral-300
20
+ bg-gray-100
21
+ dark:bg-[#1b1b1b] dark:text-white dark:placeholder:text-neutral-500 dark:focus:ring-neutral-700
22
+ disabled:opacity-70 disabled:pointer-events-none disabled:cursor-not-allowed
23
+ transition duration-200 ease-in-out
24
+ py-4 px-4" [ngClass]="{
25
+ 'pe-12': type() === 'password',
26
+ 'ps-12': loading(),
27
+ '!bg-green-100 focus:!ring-green-500/50 placeholder:!text-green-600/70 !text-green-600 focus:!border-green-500 dark:!bg-[#1b1b1b] dark:!border-green-600 dark:!text-green-500 dark:placeholder:!text-green-400/40 dark:focus:!ring-green-500/50': valid() && !errorMessage(),
28
+ '!border-red-300 bg-red-100 !text-red-500 placeholder:text-red-300 focus:ring-red-300 dark:!text-red-500 dark:placeholder:!text-red-500 dark:!border-red-500 dark:focus:!ring-red-500': errorMessage() && !valid()
29
+ }">
17
30
 
18
- <!-- <div
19
- class="absolute inset-y-0 start-0 flex items-center pointer-events-none ps-4 peer-disabled:opacity-50 peer-disabled:pointer-events-none">
20
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"
21
- class="flex-shrink-0 size-4 text-gray-500">
22
- <path fill-rule="evenodd"
23
- d="M1.5 4.5a3 3 0 0 1 3-3h1.372c.86 0 1.61.586 1.819 1.42l1.105 4.423a1.875 1.875 0 0 1-.694 1.955l-1.293.97c-.135.101-.164.249-.126.352a11.285 11.285 0 0 0 6.697 6.697c.103.038.25.009.352-.126l.97-1.293a1.875 1.875 0 0 1 1.955-.694l4.423 1.105c.834.209 1.42.959 1.42 1.82V19.5a3 3 0 0 1-3 3h-2.25C8.552 22.5 1.5 15.448 1.5 6.75V4.5Z"
24
- clip-rule="evenodd" />
31
+ <!-- Loading spinner -->
32
+ @if (loading()) {
33
+ <div class="absolute inset-y-0 start-0 flex items-center ps-4">
34
+ <svg class="size-4 animate-spin text-neutral-500 dark:text-neutral-400" xmlns="http://www.w3.org/2000/svg"
35
+ fill="none" viewBox="0 0 24 24">
36
+ <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
37
+ <path class="opacity-75" fill="currentColor"
38
+ 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">
39
+ </path>
25
40
  </svg>
26
- </div> -->
27
- </div>
41
+ </div>
42
+ }
43
+
44
+ @if (type() === 'password' && !loading()) {
45
+ <button type="button" (click)="togglePasswordVisibility()"
46
+ class="absolute inset-y-0 end-0 flex items-center pe-4 cursor-pointer focus:outline-none transition duration-200 ease-in-out">
47
+ @if (showPassword()) {
48
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"
49
+ class="size-5 text-neutral-500 hover:text-neutral-700 dark:text-neutral-500 dark:hover:text-neutral-200">
50
+ <path stroke-linecap="round" stroke-linejoin="round"
51
+ d="M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z" />
52
+ <path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
53
+ </svg>
54
+ } @else {
55
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"
56
+ class="size-5 text-neutral-500 hover:text-neutral-700 dark:text-neutral-500 dark:hover:text-neutral-200">
57
+ <path stroke-linecap="round" stroke-linejoin="round"
58
+ d="M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88" />
59
+ </svg>
60
+ }
61
+ </button>
62
+ }
63
+ </div>
64
+
65
+ @if (errorMessage()) {
66
+ <div class="py-1" [id]="inputId + '-error'">
67
+ <span class="text-sm text-red-500 font-medium">
68
+ {{ errorMessage() }}
69
+ </span>
70
+ </div>
71
+ }
@@ -1,4 +1,7 @@
1
- import { Component, effect, forwardRef, HostListener, input, InputSignal, model, signal, untracked, WritableSignal } from '@angular/core';
1
+ import { CommonModule } from '@angular/common';
2
+ import {
3
+ Component, computed, HostListener, input, InputSignal, signal, untracked, WritableSignal
4
+ } from '@angular/core';
2
5
 
3
6
  import {
4
7
  ControlValueAccessor,
@@ -7,9 +10,11 @@ import {
7
10
 
8
11
  @Component({
9
12
  selector: 'wally-input',
10
- imports: [],
13
+ imports: [
14
+ CommonModule
15
+ ],
16
+ // standalone: true, (If your application is lower than Angular 19, uncomment this line)
11
17
  templateUrl: './input.html',
12
- styleUrl: './input.css',
13
18
  providers: [
14
19
  {
15
20
  provide: NG_VALUE_ACCESSOR,
@@ -19,31 +24,52 @@ import {
19
24
  ]
20
25
  })
21
26
  export class Input implements ControlValueAccessor {
22
- type: WritableSignal<string> = signal<string>('text');
23
- // disabled: WritableSignal<boolean> = signal<boolean>(false);
24
- disabled = false;
25
- loading: WritableSignal<boolean> = signal<boolean>(false);
26
-
27
27
  placeholder: InputSignal<string> = input<string>('');
28
+ type: InputSignal<string> = input<string>('text');
29
+ label: InputSignal<string> = input<string>('');
30
+ autocomplete: InputSignal<string> = input<string>('');
31
+
32
+ valid: InputSignal<boolean> = input<boolean>(false);
33
+ errorMessage: InputSignal<string> = input<string>('');
34
+ loading: InputSignal<boolean> = input<boolean>(false);
35
+ disabled: InputSignal<boolean> = input<boolean>(false);
36
+
37
+ protected readonly showPassword = signal<boolean>(false);
38
+ protected readonly inputId = `wally-input-${Math.random().toString(36).substring(2, 11)}`;
39
+ protected readonly errorId = computed(() =>
40
+ this.errorMessage() ? `${this.inputId}-error` : undefined
41
+ );
42
+
43
+ protected readonly isDisabled = computed(() =>
44
+ this.disabled() || this.internalDisabled()
45
+ );
46
+
47
+ private touched: WritableSignal<boolean> = signal<boolean>(false);
48
+ value: WritableSignal<string> = signal<string>('');
49
+
50
+ protected readonly currentInputType = computed(() => {
51
+ const currentType = this.type();
52
+
53
+ if (currentType !== 'password') {
54
+ return currentType;
55
+ }
56
+
57
+ if (this.showPassword()) {
58
+ return 'text';
59
+ }
28
60
 
29
- value = signal<string>('');
61
+ return 'password';
62
+ });
30
63
 
31
- private touched = signal<boolean>(false);
64
+ private internalDisabled = signal<boolean>(false);
32
65
 
33
66
  private onChange = (value: any) => { };
34
67
  private onTouched = () => { };
35
68
 
36
- constructor() {
37
- effect(() => {
38
- const currentValue = this.value();
39
- this.onChange(currentValue)
40
- });
41
- }
42
-
43
69
  writeValue(obj: any): void {
44
70
  untracked(() => {
45
71
  this.value.set(obj || '');
46
- })
72
+ });
47
73
  }
48
74
 
49
75
  registerOnChange(fn: any): void {
@@ -55,13 +81,19 @@ export class Input implements ControlValueAccessor {
55
81
  }
56
82
 
57
83
  setDisabledState?(isDisabled: boolean): void {
58
- this.disabled = isDisabled;
84
+ this.internalDisabled.set(isDisabled);
85
+ }
86
+
87
+ togglePasswordVisibility(): void {
88
+ this.showPassword.set(!this.showPassword());
59
89
  }
60
90
 
61
91
  @HostListener('input', ['$event'])
62
92
  onInputChange(event: Event): void {
63
93
  const target = event.target as HTMLInputElement;
64
- this.value.set(target.value);
94
+ const newValue = target.value;
95
+ this.value.set(newValue);
96
+ this.onChange(newValue);
65
97
  }
66
98
 
67
99
  @HostListener('blur')
@@ -71,8 +103,4 @@ export class Input implements ControlValueAccessor {
71
103
  this.onTouched();
72
104
  }
73
105
  }
74
-
75
- onInputFocus(): void {
76
-
77
- }
78
106
  }
@@ -50,7 +50,7 @@
50
50
  <div class="bg-gray-200 dark:bg-[#121212] rounded-lg p-4">
51
51
  <div class="flex items-center gap-2 mb-2">
52
52
  <h4 class="text-md font-semibold text-[#0a0a0a] dark:text-white">Input</h4>
53
- <span class="text-xs bg-yellow-500 text-black px-2 py-1 rounded">Under Construction</span>
53
+ <span class="text-xs bg-blue-500 text-white px-2 py-1 rounded">New</span>
54
54
  </div>
55
55
  <p class="text-sm text-gray-700 dark:text-gray-400 mb-3">
56
56
  A versatile input component with full FormGroup support, perfect for forms and data entry.
@@ -59,5 +59,15 @@
59
59
  View Documentation
60
60
  </a>
61
61
  </div>
62
+
63
+ <div class="w-auto h-auto">
64
+ <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4944285767597175"
65
+ crossorigin="anonymous"></script>
66
+ <ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-gw-3+1f-3d+2z"
67
+ data-ad-client="ca-pub-4944285767597175" data-ad-slot="4427496130"></ins>
68
+ <script>
69
+ (adsbygoogle = window.adsbygoogle || []).push({});
70
+ </script>
71
+ </div>
62
72
  </div>
63
73
  </div>
@@ -71,8 +71,20 @@ onSubmit() {
71
71
  username: ['', [Validators.required, Validators.minLength(3)]]
72
72
  });`,
73
73
 
74
+ // New Features Examples
75
+ withLabel: `<wally-input label="Full Name" placeholder="Enter your name"></wally-input>`,
76
+ loadingState: `<wally-input [loading]="true" placeholder="Loading..."></wally-input>`,
77
+ validState: `<wally-input [valid]="true" placeholder="Valid input"></wally-input>`,
78
+ errorState: `<wally-input errorMessage="This field is required" placeholder="Enter value"></wally-input>`,
79
+ disabledState: `<wally-input [disabled]="true" placeholder="Disabled input"></wally-input>`,
80
+ passwordWithToggle: `<wally-input type="password" label="Password" placeholder="Enter secure password"></wally-input>`,
81
+
74
82
  // Properties
83
+ propertyLabel: `label: string = '';`,
75
84
  propertyType: `type: string = 'text';`,
76
85
  propertyPlaceholder: `placeholder: string = '';`,
77
- propertyValue: `value: string = '';`
86
+ propertyLoading: `loading: boolean = false;`,
87
+ propertyValid: `valid: boolean = false;`,
88
+ propertyError: `errorMessage: string = '';`,
89
+ propertyDisabled: `disabled: boolean = false;`
78
90
  };
@@ -8,16 +8,9 @@
8
8
  Input
9
9
  </h1>
10
10
  <p class="text-gray-700 dark:text-gray-400 mb-4">
11
- A versatile input component with full FormGroup and ReactiveFormsModule support, perfect for forms and data entry.
11
+ A fully-featured input component with label support, loading states, validation styling, and complete FormGroup integration.
12
12
  </p>
13
13
 
14
- <!-- Under Construction Badge -->
15
- <div class="mb-6">
16
- <span class="text-xs bg-yellow-500 text-black px-3 py-1 rounded-full font-medium">Under Construction</span>
17
- <p class="text-sm text-gray-600 dark:text-gray-400 mt-2">
18
- This component is actively being developed. More features and improvements coming soon!
19
- </p>
20
- </div>
21
14
 
22
15
  <!-- AI Prompts -->
23
16
  <div class="flex flex-wrap gap-2 mb-6">
@@ -62,10 +55,17 @@
62
55
  <section class="mb-8">
63
56
  <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Preview</h2>
64
57
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
65
- <div class="flex flex-col gap-2 w-full">
66
- <wally-input placeholder="Enter your name"></wally-input>
67
- <wally-input type="email" placeholder="Enter your email"></wally-input>
68
- </div>
58
+ <form>
59
+ <div class="flex flex-col gap-4 w-full">
60
+ <wally-input label="Full Name" placeholder="Enter your name"></wally-input>
61
+ <wally-input label="Email Address" type="email" placeholder="Enter your email"></wally-input>
62
+ <wally-input label="Password" type="password" placeholder="Enter password"></wally-input>
63
+ <wally-input label="Loading State" [loading]="true" placeholder="Processing..."></wally-input>
64
+ <wally-input label="Valid State" [valid]="true" placeholder="Valid input"></wally-input>
65
+ <wally-input label="Error State" errorMessage="This field is required" placeholder="Invalid input"></wally-input>
66
+ <wally-input label="Disabled State" [disabled]="true" placeholder="Disabled input"></wally-input>
67
+ </div>
68
+ </form>
69
69
  </div>
70
70
  </section>
71
71
 
@@ -156,30 +156,79 @@
156
156
  </div>
157
157
  </section>
158
158
 
159
- <!-- Input Types -->
159
+ <!-- Input Features -->
160
160
  <section class="mb-8">
161
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Input Types</h2>
161
+ <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Input Features</h2>
162
162
 
163
163
  <div class="space-y-8">
164
- <!-- Email -->
164
+ <!-- Labels -->
165
165
  <div>
166
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Email Input</h3>
166
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">With Labels</h3>
167
167
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
168
- <pre><code [innerHTML]="emailTypeCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
168
+ <pre><code [innerHTML]="labelCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
169
169
  </div>
170
170
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
171
- <wally-input type="email" placeholder="Enter your email"></wally-input>
171
+ <div class="flex flex-col gap-4">
172
+ <wally-input label="Full Name" placeholder="Enter your name"></wally-input>
173
+ <wally-input label="Email Address" type="email" placeholder="Enter your email"></wally-input>
174
+ </div>
172
175
  </div>
173
176
  </div>
174
177
 
175
- <!-- Password -->
178
+ <!-- Loading State -->
176
179
  <div>
177
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Password Input</h3>
180
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Loading State</h3>
178
181
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
179
- <pre><code [innerHTML]="passwordTypeCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
182
+ <pre><code [innerHTML]="loadingCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
180
183
  </div>
181
184
  <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
182
- <wally-input type="password" placeholder="Enter password"></wally-input>
185
+ <wally-input label="Processing..." [loading]="true" placeholder="Loading example"></wally-input>
186
+ </div>
187
+ </div>
188
+
189
+ <!-- Valid State -->
190
+ <div>
191
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Valid State</h3>
192
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
193
+ <pre><code [innerHTML]="validCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
194
+ </div>
195
+ <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
196
+ <wally-input label="Username" [valid]="true" placeholder="Valid input example"></wally-input>
197
+ </div>
198
+ </div>
199
+
200
+ <!-- Error State -->
201
+ <div>
202
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Error State</h3>
203
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
204
+ <pre><code [innerHTML]="errorCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
205
+ </div>
206
+ <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
207
+ <wally-input label="Email" errorMessage="Please enter a valid email address" placeholder="Enter email"></wally-input>
208
+ </div>
209
+ </div>
210
+
211
+ <!-- Disabled State -->
212
+ <div>
213
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Disabled State</h3>
214
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
215
+ <pre><code [innerHTML]="disabledCode" 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]">
218
+ <wally-input label="Username" [disabled]="true" placeholder="Disabled input"></wally-input>
219
+ </div>
220
+ </div>
221
+
222
+ <!-- Password with Toggle -->
223
+ <div>
224
+ <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Password with Toggle</h3>
225
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
226
+ <pre><code [innerHTML]="passwordCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
227
+ </div>
228
+ <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
229
+ <form>
230
+ <wally-input label="Password" type="password" placeholder="Enter secure password"></wally-input>
231
+ </form>
183
232
  </div>
184
233
  </div>
185
234
  </div>
@@ -241,6 +290,13 @@
241
290
  <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Properties</h2>
242
291
 
243
292
  <div class="space-y-4">
293
+ <div class="space-y-2">
294
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
295
+ <pre><code [innerHTML]="propertyLabelCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
296
+ </div>
297
+ <p class="text-sm text-gray-700 dark:text-gray-400">Optional label text displayed above the input</p>
298
+ </div>
299
+
244
300
  <div class="space-y-2">
245
301
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
246
302
  <pre><code [innerHTML]="propertyTypeCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
@@ -257,55 +313,46 @@
257
313
 
258
314
  <div class="space-y-2">
259
315
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
260
- <pre><code [innerHTML]="propertyValueCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
316
+ <pre><code [innerHTML]="propertyLoadingCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
261
317
  </div>
262
- <p class="text-sm text-gray-700 dark:text-gray-400">Current value of the input</p>
318
+ <p class="text-sm text-gray-700 dark:text-gray-400">Shows loading spinner and disables input when true</p>
263
319
  </div>
264
- </div>
265
- </section>
266
-
267
- <!-- Under Construction -->
268
- <section class="mb-8">
269
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Under Construction</h2>
270
320
 
271
- <div class="space-y-4">
272
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
273
- <div class="flex items-center gap-2 mb-2">
274
- <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Input Icons</h3>
275
- <span class="text-xs bg-yellow-500 text-black px-2 py-1 rounded">Under Construction</span>
321
+ <div class="space-y-2">
322
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
323
+ <pre><code [innerHTML]="propertyValidCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
276
324
  </div>
277
- <p class="text-sm text-gray-700 dark:text-gray-400">
278
- Support for left and right icons within the input field.
279
- </p>
325
+ <p class="text-sm text-gray-700 dark:text-gray-400">Shows green styling when input is valid</p>
280
326
  </div>
281
327
 
282
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
283
- <div class="flex items-center gap-2 mb-2">
284
- <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Input Sizes</h3>
285
- <span class="text-xs bg-yellow-500 text-black px-2 py-1 rounded">Under Construction</span>
328
+ <div class="space-y-2">
329
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
330
+ <pre><code [innerHTML]="propertyErrorCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
286
331
  </div>
287
- <p class="text-sm text-gray-700 dark:text-gray-400">
288
- Different input sizes: small, medium, large for various use cases.
289
- </p>
332
+ <p class="text-sm text-gray-700 dark:text-gray-400">Error message text - shows red styling and displays error below input</p>
290
333
  </div>
291
334
 
292
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
293
- <div class="flex items-center gap-2 mb-2">
294
- <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Loading States</h3>
295
- <span class="text-xs bg-yellow-500 text-black px-2 py-1 rounded">Under Construction</span>
335
+ <div class="space-y-2">
336
+ <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
337
+ <pre><code [innerHTML]="propertyDisabledCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
296
338
  </div>
297
- <p class="text-sm text-gray-700 dark:text-gray-400">
298
- Loading spinner integration for async operations.
299
- </p>
339
+ <p class="text-sm text-gray-700 dark:text-gray-400">Disables the input when true - shows visual disabled state and prevents interaction</p>
300
340
  </div>
341
+ </div>
342
+ </section>
343
+
344
+ <!-- Future Features -->
345
+ <section class="mb-8">
346
+ <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Future Features</h2>
301
347
 
348
+ <div class="space-y-4">
302
349
  <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
303
350
  <div class="flex items-center gap-2 mb-2">
304
- <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Error States</h3>
305
- <span class="text-xs bg-yellow-500 text-black px-2 py-1 rounded">Under Construction</span>
351
+ <h3 class="text-md font-medium text-[#0a0a0a] dark:text-white">Styles-Only Directive</h3>
352
+ <span class="text-xs bg-blue-500 text-white px-2 py-1 rounded">Coming Soon</span>
306
353
  </div>
307
354
  <p class="text-sm text-gray-700 dark:text-gray-400">
308
- Built-in error styling and validation message integration.
355
+ A lightweight directive for developers who want only the input styling without the full component logic.
309
356
  </p>
310
357
  </div>
311
358
  </div>
@@ -56,10 +56,22 @@ export class InputDocs {
56
56
  validationTemplateCode = getFormattedCode(InputCodeExamples.validationTemplate, 'html');
57
57
  validationSetupCode = getFormattedCode(InputCodeExamples.validationSetup, 'typescript');
58
58
 
59
+ // New Features
60
+ labelCode = getFormattedCode(InputCodeExamples.withLabel, 'html');
61
+ loadingCode = getFormattedCode(InputCodeExamples.loadingState, 'html');
62
+ validCode = getFormattedCode(InputCodeExamples.validState, 'html');
63
+ errorCode = getFormattedCode(InputCodeExamples.errorState, 'html');
64
+ disabledCode = getFormattedCode(InputCodeExamples.disabledState, 'html');
65
+ passwordCode = getFormattedCode(InputCodeExamples.passwordWithToggle, 'html');
66
+
59
67
  // Properties
68
+ propertyLabelCode = getFormattedCode(InputCodeExamples.propertyLabel, 'typescript');
60
69
  propertyTypeCode = getFormattedCode(InputCodeExamples.propertyType, 'typescript');
61
70
  propertyPlaceholderCode = getFormattedCode(InputCodeExamples.propertyPlaceholder, 'typescript');
62
- propertyValueCode = getFormattedCode(InputCodeExamples.propertyValue, 'typescript');
71
+ propertyLoadingCode = getFormattedCode(InputCodeExamples.propertyLoading, 'typescript');
72
+ propertyValidCode = getFormattedCode(InputCodeExamples.propertyValid, 'typescript');
73
+ propertyErrorCode = getFormattedCode(InputCodeExamples.propertyError, 'typescript');
74
+ propertyDisabledCode = getFormattedCode(InputCodeExamples.propertyDisabled, 'typescript');
63
75
 
64
76
  constructor(
65
77
  private aiPromptService: AiPromptService,
@@ -16,10 +16,13 @@
16
16
  );
17
17
  </script>
18
18
 
19
+ <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4944285767597175"
20
+ crossorigin="anonymous"></script>
21
+
19
22
  <meta name="robots" content="index, follow">
20
23
  <meta name="viewport" content="width=device-width, initial-scale=1">
21
24
  <meta name="description" content="Wally UI - Angular component library">
22
-
25
+
23
26
  <link rel="icon" type="image/x-icon" href="favicon.ico">
24
27
  </head>
25
28