wally-ui 1.11.0 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,60 +1,78 @@
1
- <div class="font-mono">
2
- <div class="max-w-4xl mx-auto p-6">
3
- <div class="mb-4">
1
+ <main class="min-h-dvh bg-white dark:bg-[#0a0a0a] font-mono" role="main">
2
+ <div class="max-w-4xl mx-auto px-4 py-8 sm:px-6 md:px-8">
3
+ <!-- Breadcrumb Navigation -->
4
+ <nav class="mb-8" aria-label="Breadcrumb navigation">
4
5
  <wally-breadcrumb [items]="breadcrumbItems"></wally-breadcrumb>
5
- </div>
6
-
7
- <h1 class="text-2xl font-bold mb-4 text-[#0a0a0a] dark:text-white">
8
- Input
9
- </h1>
10
- <p class="text-gray-700 dark:text-gray-400 mb-4">
11
- A fully-featured input component with label support, loading states, validation styling, and complete FormGroup integration.
12
- </p>
13
-
14
-
15
- <!-- AI Prompts -->
16
- <div class="flex flex-wrap gap-2 mb-6">
17
- <a [href]="claudeUrl" target="_blank"
18
- 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">
19
- <svg xmlns="http://www.w3.org/2000/svg" class="size-6" viewBox="0 0 24 24">
20
- <path fill="currentColor"
21
- 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" />
22
- </svg>
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
- Open in ChatGPT
43
- </a>
44
- </div>
6
+ </nav>
7
+
8
+ <!-- Header -->
9
+ <header class="mb-12" role="banner">
10
+ <h1 id="page-title" class="text-3xl sm:text-4xl font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
11
+ <span aria-hidden="true">&gt;_ </span>Input
12
+ </h1>
13
+ <p class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 border-l-2 border-neutral-300 dark:border-neutral-700 pl-4 leading-relaxed">
14
+ Production-ready input component with label support, loading states, validation styling, password toggle, and complete FormGroup integration. Enterprise-grade accessibility with ARIA support.
15
+ </p>
16
+
17
+ <!-- AI Assistant Links -->
18
+ <div class="flex flex-wrap gap-0 mt-6 border-2 border-neutral-300 dark:border-neutral-700" role="list" aria-label="Open documentation in AI coding assistants">
19
+ <a [href]="claudeUrl" target="_blank"
20
+ class="group flex-1 min-w-[200px] flex items-center justify-center gap-2 px-4 py-3 bg-white dark:bg-[#0a0a0a] border-b-2 sm:border-b-0 sm:border-r-2 border-neutral-300 dark:border-neutral-700 hover:bg-[#0a0a0a] dark:hover:bg-white transition-all duration-150 cursor-pointer"
21
+ rel="noopener noreferrer"
22
+ role="listitem"
23
+ aria-label="Open Input component documentation in Claude AI assistant (opens in new tab)">
24
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150" viewBox="0 0 24 24" aria-hidden="true">
25
+ <path fill="currentColor"
26
+ 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" />
27
+ </svg>
28
+ <span class="text-xs sm:text-sm font-medium text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150">
29
+ Open in Claude
30
+ </span>
31
+ </a>
32
+
33
+ <a [href]="chatGptUrl" target="_blank"
34
+ class="group flex-1 min-w-[200px] flex items-center justify-center gap-2 px-4 py-3 bg-white dark:bg-[#0a0a0a] hover:bg-[#0a0a0a] dark:hover:bg-white transition-all duration-150 cursor-pointer"
35
+ rel="noopener noreferrer"
36
+ role="listitem"
37
+ aria-label="Open Input component documentation in ChatGPT AI assistant (opens in new tab)">
38
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150" viewBox="0 0 48 48" aria-hidden="true">
39
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
40
+ d="M18.38 27.94v-14.4l11.19-6.46c6.2-3.58 17.3 5.25 12.64 13.33" />
41
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
42
+ d="m18.38 20.94l12.47-7.2l11.19 6.46c6.2 3.58 4.1 17.61-5.23 17.61" />
43
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
44
+ d="m24.44 17.44l12.47 7.2v12.93c0 7.16-13.2 12.36-17.86 4.28" />
45
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
46
+ d="M30.5 21.2v14.14L19.31 41.8c-6.2 3.58-17.3-5.25-12.64-13.33" />
47
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
48
+ 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" />
49
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
50
+ d="m24.44 31.44l-12.47-7.2V11.31c0-7.16 13.2-12.36 17.86-4.28" />
51
+ </svg>
52
+ <span class="text-xs sm:text-sm font-medium text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150">
53
+ Open in ChatGPT
54
+ </span>
55
+ </a>
56
+ </div>
57
+ </header>
45
58
 
46
59
  <!-- Installation -->
47
- <section class="mb-8">
48
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Installation</h2>
49
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
50
- <pre><code [innerHTML]="installationCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
60
+ <section id="installation" class="mb-12" aria-labelledby="installation-heading">
61
+ <h2 id="installation-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
62
+ [ Installation ]
63
+ </h2>
64
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
65
+ <pre><code [innerHTML]="installationCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
51
66
  </div>
52
67
  </section>
53
68
 
54
- <!-- Preview -->
55
- <section class="mb-8">
56
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Preview</h2>
57
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
69
+ <!-- All States Preview -->
70
+ <section id="preview" class="mb-12" aria-labelledby="preview-heading">
71
+ <h2 id="preview-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
72
+ [ All States Preview ]
73
+ </h2>
74
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
75
+ aria-label="Live preview showing all input component states: default, email, password, loading, valid, error, and disabled">
58
76
  <form>
59
77
  <div class="flex flex-col gap-4 w-full">
60
78
  <wally-input label="Full Name" placeholder="Enter your name"></wally-input>
@@ -70,293 +88,353 @@
70
88
  </section>
71
89
 
72
90
  <!-- Import -->
73
- <section class="mb-8">
74
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Import</h2>
91
+ <section id="import" class="mb-12" aria-labelledby="import-heading">
92
+ <h2 id="import-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
93
+ [ Import ]
94
+ </h2>
75
95
  <div class="space-y-4">
76
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
77
- <pre><code [innerHTML]="importCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
96
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
97
+ <pre><code [innerHTML]="importCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
78
98
  </div>
79
99
 
80
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
81
- <pre><code [innerHTML]="componentImportCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
100
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
101
+ <pre><code [innerHTML]="componentImportCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
82
102
  </div>
83
103
  </div>
84
104
  </section>
85
105
 
86
- <!-- FormGroup Usage (HIGHLIGHTED SECTION) -->
87
- <section class="mb-8">
88
- <div class="bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-700 p-4 rounded-lg mb-4">
89
- <h2 class="text-lg font-semibold mb-2 text-blue-800 dark:text-blue-200">
90
- FormGroup & ReactiveFormsModule Support
91
- </h2>
92
- <p class="text-sm text-blue-700 dark:text-blue-300">
93
- This input component is fully compatible with Angular's FormGroup and ReactiveFormsModule!
94
- Use <span class="bg-blue-100 dark:bg-blue-800 px-1 py-0.5 rounded text-xs">formControlName</span> for seamless form integration.
106
+ <!-- FormGroup Integration -->
107
+ <section id="formgroup" class="mb-12" aria-labelledby="formgroup-heading">
108
+ <h2 id="formgroup-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
109
+ [ FormGroup Integration ]
110
+ </h2>
111
+
112
+ <aside class="bg-blue-50 dark:bg-blue-900/10 border-2 border-blue-400 dark:border-blue-700 p-4 mb-8" role="note"
113
+ aria-labelledby="formgroup-note-heading">
114
+ <h3 id="formgroup-note-heading" class="text-sm sm:text-base font-bold text-blue-800 dark:text-blue-300 mb-2 uppercase">
115
+ ReactiveFormsModule Compatible
116
+ </h3>
117
+ <p class="text-xs sm:text-sm text-blue-700 dark:text-blue-400 leading-relaxed">
118
+ This input component implements ControlValueAccessor for full Angular Forms compatibility.
119
+ Use <span class="bg-blue-100 dark:bg-blue-800 px-1 py-0.5">formControlName</span> for seamless reactive forms integration.
95
120
  </p>
96
- </div>
97
-
98
- <div class="space-y-8">
99
- <div>
100
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Template Setup</h3>
101
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
102
- <pre><code [innerHTML]="formGroupTemplateCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
103
- </div>
121
+ </aside>
122
+
123
+ <!-- Template Setup -->
124
+ <article class="mb-8" aria-labelledby="template-setup-heading">
125
+ <h3 id="template-setup-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
126
+ <span aria-hidden="true">&gt; </span>Template Setup
127
+ </h3>
128
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
129
+ <pre><code [innerHTML]="formGroupTemplateCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
104
130
  </div>
105
-
106
- <div>
107
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Component Setup</h3>
108
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
109
- <pre><code [innerHTML]="formGroupSetupCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
110
- </div>
131
+ </article>
132
+
133
+ <!-- Component Setup -->
134
+ <article class="mb-8" aria-labelledby="component-setup-heading">
135
+ <h3 id="component-setup-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
136
+ <span aria-hidden="true">&gt; </span>Component Setup
137
+ </h3>
138
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
139
+ <pre><code [innerHTML]="formGroupSetupCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
111
140
  </div>
141
+ </article>
142
+
143
+ <!-- Live Example -->
144
+ <article class="mb-8" aria-labelledby="live-example-heading">
145
+ <h3 id="live-example-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
146
+ <span aria-hidden="true">&gt; </span>Live Example
147
+ </h3>
148
+ <form [formGroup]="basicForm" (ngSubmit)="onBasicSubmit()"
149
+ class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]"
150
+ aria-label="FormGroup integration live example with name and email fields">
151
+ <div class="flex flex-col gap-2 w-full">
152
+ <div>
153
+ <label class="block text-xs sm:text-sm font-medium text-neutral-700 dark:text-neutral-300 mb-2">Name</label>
154
+ <wally-input formControlName="name" placeholder="Enter your name"></wally-input>
155
+ </div>
112
156
 
113
- <div>
114
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Live Example</h3>
115
- <form [formGroup]="basicForm" (ngSubmit)="onBasicSubmit()" class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
116
- <div class="flex flex-col gap-2 w-full">
117
- <div>
118
- <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Name</label>
119
- <wally-input formControlName="name" placeholder="Enter your name"></wally-input>
120
- </div>
121
-
122
- <div>
123
- <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Email</label>
124
- <wally-input formControlName="email" type="email" placeholder="Enter your email"></wally-input>
125
- </div>
126
-
127
- <wally-button type="submit" class="w-full">
128
- Submit (Check Console)
129
- </wally-button>
130
-
131
- <div class="text-sm text-gray-600 dark:text-gray-400 mt-4">
132
- Form Value: {{ basicForm.value | json }}
133
- </div>
157
+ <div>
158
+ <label class="block text-xs sm:text-sm font-medium text-neutral-700 dark:text-neutral-300 mb-2">Email</label>
159
+ <wally-input formControlName="email" type="email" placeholder="Enter your email"></wally-input>
134
160
  </div>
135
- </form>
136
- </div>
137
- </div>
161
+
162
+ <wally-button type="submit" class="w-full">
163
+ Submit (Check Console)
164
+ </wally-button>
165
+
166
+ <div class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mt-4">
167
+ Form Value: {{ basicForm.value | json }}
168
+ </div>
169
+ </div>
170
+ </form>
171
+ </article>
138
172
  </section>
139
173
 
140
174
  <!-- Basic Usage -->
141
- <section class="mb-8">
142
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Basic Usage</h2>
175
+ <section id="basic-usage" class="mb-12" aria-labelledby="basic-usage-heading">
176
+ <h2 id="basic-usage-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
177
+ [ Basic Usage ]
178
+ </h2>
143
179
 
144
- <div class="space-y-8">
145
- <div>
146
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
147
- <pre><code [innerHTML]="basicSetupCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
148
- </div>
149
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
150
- <pre><code [innerHTML]="basicUsageCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
151
- </div>
152
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
153
- <wally-input placeholder="Enter text"></wally-input>
154
- </div>
180
+ <div class="space-y-4">
181
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
182
+ <pre><code [innerHTML]="basicSetupCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
183
+ </div>
184
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
185
+ <pre><code [innerHTML]="basicUsageCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
186
+ </div>
187
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
188
+ aria-label="Live preview of basic input component without label">
189
+ <wally-input placeholder="Enter text"></wally-input>
155
190
  </div>
156
191
  </div>
157
192
  </section>
158
193
 
159
- <!-- Input Features -->
160
- <section class="mb-8">
161
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Input Features</h2>
162
-
163
- <div class="space-y-8">
164
- <!-- Labels -->
165
- <div>
166
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">With Labels</h3>
167
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
168
- <pre><code [innerHTML]="labelCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
169
- </div>
170
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
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>
175
- </div>
194
+ <!-- States & Features -->
195
+ <section id="states" class="mb-12" aria-labelledby="states-heading">
196
+ <h2 id="states-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
197
+ [ States & Features ]
198
+ </h2>
199
+
200
+ <!-- Labels -->
201
+ <article class="mb-8" aria-labelledby="labels-heading">
202
+ <h3 id="labels-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
203
+ <span aria-hidden="true">&gt; </span>With Labels
204
+ </h3>
205
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
206
+ <pre><code [innerHTML]="labelCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
176
207
  </div>
177
-
178
- <!-- Loading State -->
179
- <div>
180
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Loading State</h3>
181
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
182
- <pre><code [innerHTML]="loadingCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
183
- </div>
184
- <div class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
185
- <wally-input label="Processing..." [loading]="true" placeholder="Loading example"></wally-input>
208
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
209
+ aria-label="Live preview showing inputs with labels for Full Name and Email Address">
210
+ <div class="flex flex-col gap-4">
211
+ <wally-input label="Full Name" placeholder="Enter your name"></wally-input>
212
+ <wally-input label="Email Address" type="email" placeholder="Enter your email"></wally-input>
186
213
  </div>
187
214
  </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>
215
+ </article>
216
+
217
+ <!-- Loading State -->
218
+ <article class="mb-8" aria-labelledby="loading-heading">
219
+ <h3 id="loading-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
220
+ <span aria-hidden="true">&gt; </span>Loading State
221
+ </h3>
222
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
223
+ <pre><code [innerHTML]="loadingCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
198
224
  </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>
225
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
226
+ aria-label="Live preview of loading state with spinner and disabled input">
227
+ <wally-input label="Processing..." [loading]="true" placeholder="Loading example"></wally-input>
209
228
  </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>
229
+ </article>
230
+
231
+ <!-- Valid State -->
232
+ <article class="mb-8" aria-labelledby="valid-heading">
233
+ <h3 id="valid-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
234
+ <span aria-hidden="true">&gt; </span>Valid State
235
+ </h3>
236
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
237
+ <pre><code [innerHTML]="validCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
220
238
  </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>
232
- </div>
239
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
240
+ aria-label="Live preview of valid state with green styling indicating successful validation">
241
+ <wally-input label="Username" [valid]="true" placeholder="Valid input example"></wally-input>
233
242
  </div>
234
- </div>
235
- </section>
236
-
237
-
238
- <!-- Form Validation -->
239
- <section class="mb-8">
240
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Form Validation</h2>
241
-
242
- <div class="space-y-8">
243
- <div>
244
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Validation Setup</h3>
245
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
246
- <pre><code [innerHTML]="validationSetupCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
247
- </div>
243
+ </article>
244
+
245
+ <!-- Error State -->
246
+ <article class="mb-8" aria-labelledby="error-heading">
247
+ <h3 id="error-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
248
+ <span aria-hidden="true">&gt; </span>Error State
249
+ </h3>
250
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
251
+ <pre><code [innerHTML]="errorCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
248
252
  </div>
249
-
250
- <div>
251
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Template with Validation</h3>
252
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg mb-4">
253
- <pre><code [innerHTML]="validationTemplateCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
254
- </div>
253
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
254
+ aria-label="Live preview of error state with red styling and error message below input">
255
+ <wally-input label="Email" errorMessage="Please enter a valid email address" placeholder="Enter email"></wally-input>
255
256
  </div>
256
-
257
- <div>
258
- <h3 class="text-md font-medium mb-3 text-[#0a0a0a] dark:text-white">Live Validation Example</h3>
259
- <form [formGroup]="validationForm" (ngSubmit)="onValidationSubmit()" class="p-6 border rounded-lg bg-white dark:bg-[#121212]">
260
- <div class="flex flex-col gap-2 w-full">
261
- <div>
262
- <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Username (min 3 chars)</label>
263
- <wally-input formControlName="username" placeholder="Enter username"></wally-input>
264
-
265
- @if (validationForm.get('username')?.invalid && validationForm.get('username')?.touched) {
266
- <div class="mt-2">
267
- <span class="text-red-500 text-sm">
268
- @if (validationForm.get('username')?.errors?.['required']) {
269
- <span>Username is required</span>
270
- }
271
- @if (validationForm.get('username')?.errors?.['minlength']) {
272
- <span>Username must be at least 3 characters</span>
273
- }
274
- </span>
275
- </div>
276
- }
277
- </div>
278
-
279
- <wally-button type="submit" [disabled]="validationForm.invalid" class="w-full">
280
- Submit ({{ validationForm.valid ? 'Valid' : 'Invalid' }})
281
- </wally-button>
282
- </div>
283
- </form>
257
+ </article>
258
+
259
+ <!-- Disabled State -->
260
+ <article class="mb-8" aria-labelledby="disabled-heading">
261
+ <h3 id="disabled-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
262
+ <span aria-hidden="true">&gt; </span>Disabled State
263
+ </h3>
264
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
265
+ <pre><code [innerHTML]="disabledCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
284
266
  </div>
285
- </div>
286
- </section>
287
-
288
- <!-- Properties -->
289
- <section class="mb-8">
290
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Properties</h2>
291
-
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>
267
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
268
+ aria-label="Live preview of disabled state with reduced opacity and cursor-not-allowed">
269
+ <wally-input label="Username" [disabled]="true" placeholder="Disabled input"></wally-input>
298
270
  </div>
299
-
300
- <div class="space-y-2">
301
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
302
- <pre><code [innerHTML]="propertyTypeCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
303
- </div>
304
- <p class="text-sm text-gray-700 dark:text-gray-400">HTML input type (text, email, password, etc.)</p>
271
+ </article>
272
+
273
+ <!-- Password with Toggle -->
274
+ <article class="mb-8" aria-labelledby="password-heading">
275
+ <h3 id="password-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
276
+ <span aria-hidden="true">&gt; </span>Password with Toggle
277
+ </h3>
278
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
279
+ <pre><code [innerHTML]="passwordCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
305
280
  </div>
306
-
307
- <div class="space-y-2">
308
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
309
- <pre><code [innerHTML]="propertyPlaceholderCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
310
- </div>
311
- <p class="text-sm text-gray-700 dark:text-gray-400">Placeholder text for the input</p>
281
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
282
+ aria-label="Live preview of password input with show/hide toggle button">
283
+ <form>
284
+ <wally-input label="Password" type="password" placeholder="Enter secure password"></wally-input>
285
+ </form>
312
286
  </div>
287
+ </article>
288
+ </section>
313
289
 
314
- <div class="space-y-2">
315
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
316
- <pre><code [innerHTML]="propertyLoadingCode" class="text-sm text-[#0a0a0a] dark:text-white"></code></pre>
317
- </div>
318
- <p class="text-sm text-gray-700 dark:text-gray-400">Shows loading spinner and disables input when true</p>
319
- </div>
320
290
 
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>
324
- </div>
325
- <p class="text-sm text-gray-700 dark:text-gray-400">Shows green styling when input is valid</p>
291
+ <!-- Form Validation -->
292
+ <section id="validation" class="mb-12" aria-labelledby="validation-heading">
293
+ <h2 id="validation-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
294
+ [ Form Validation ]
295
+ </h2>
296
+
297
+ <!-- Validation Setup -->
298
+ <article class="mb-8" aria-labelledby="validation-setup-heading">
299
+ <h3 id="validation-setup-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
300
+ <span aria-hidden="true">&gt; </span>Validation Setup
301
+ </h3>
302
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
303
+ <pre><code [innerHTML]="validationSetupCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
326
304
  </div>
327
-
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>
331
- </div>
332
- <p class="text-sm text-gray-700 dark:text-gray-400">Error message text - shows red styling and displays error below input</p>
305
+ </article>
306
+
307
+ <!-- Template with Validation -->
308
+ <article class="mb-8" aria-labelledby="validation-template-heading">
309
+ <h3 id="validation-template-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
310
+ <span aria-hidden="true">&gt; </span>Template with Validation
311
+ </h3>
312
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
313
+ <pre><code [innerHTML]="validationTemplateCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
333
314
  </div>
315
+ </article>
316
+
317
+ <!-- Live Validation Example -->
318
+ <article class="mb-8" aria-labelledby="validation-example-heading">
319
+ <h3 id="validation-example-heading" class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
320
+ <span aria-hidden="true">&gt; </span>Live Validation Example
321
+ </h3>
322
+ <form [formGroup]="validationForm" (ngSubmit)="onValidationSubmit()"
323
+ class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]"
324
+ aria-label="Live validation example with username field requiring minimum 3 characters">
325
+ <div class="flex flex-col gap-2 w-full">
326
+ <div>
327
+ <label class="block text-xs sm:text-sm font-medium text-neutral-700 dark:text-neutral-300 mb-2">Username (min 3 chars)</label>
328
+ <wally-input formControlName="username" placeholder="Enter username"></wally-input>
329
+
330
+ @if (validationForm.get('username')?.invalid && validationForm.get('username')?.touched) {
331
+ <div class="mt-2">
332
+ <span class="text-red-500 text-xs sm:text-sm">
333
+ @if (validationForm.get('username')?.errors?.['required']) {
334
+ <span>Username is required</span>
335
+ }
336
+ @if (validationForm.get('username')?.errors?.['minlength']) {
337
+ <span>Username must be at least 3 characters</span>
338
+ }
339
+ </span>
340
+ </div>
341
+ }
342
+ </div>
334
343
 
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>
344
+ <wally-button type="submit" [disabled]="validationForm.invalid" class="w-full">
345
+ Submit ({{ validationForm.valid ? 'Valid' : 'Invalid' }})
346
+ </wally-button>
338
347
  </div>
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>
348
+ </form>
349
+ </article>
350
+ </section>
351
+
352
+ <!-- API Reference -->
353
+ <section id="api" class="mb-12" aria-labelledby="api-heading">
354
+ <h2 id="api-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
355
+ [ API Reference ]
356
+ </h2>
357
+
358
+ <div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
359
+ <div class="overflow-x-auto">
360
+ <table class="w-full text-xs sm:text-sm" role="table" aria-label="Input component API reference with properties, types, defaults, and descriptions">
361
+ <thead class="bg-gray-50 dark:bg-gray-900">
362
+ <tr>
363
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100" scope="col">Property</th>
364
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100" scope="col">Type</th>
365
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100" scope="col">Default</th>
366
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100" scope="col">Description</th>
367
+ </tr>
368
+ </thead>
369
+ <tbody class="divide-y divide-gray-200 dark:divide-gray-700">
370
+ <tr>
371
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">label</td>
372
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
373
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">''</td>
374
+ <td class="p-4 text-gray-700 dark:text-gray-300">Optional label text displayed above the input</td>
375
+ </tr>
376
+ <tr>
377
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">type</td>
378
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
379
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">'text'</td>
380
+ <td class="p-4 text-gray-700 dark:text-gray-300">HTML input type (text, email, password, etc.)</td>
381
+ </tr>
382
+ <tr>
383
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">placeholder</td>
384
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
385
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">''</td>
386
+ <td class="p-4 text-gray-700 dark:text-gray-300">Placeholder text for the input</td>
387
+ </tr>
388
+ <tr>
389
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">loading</td>
390
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
391
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
392
+ <td class="p-4 text-gray-700 dark:text-gray-300">Shows loading spinner and disables input when true</td>
393
+ </tr>
394
+ <tr>
395
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">valid</td>
396
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
397
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
398
+ <td class="p-4 text-gray-700 dark:text-gray-300">Shows green styling when input is valid</td>
399
+ </tr>
400
+ <tr>
401
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">errorMessage</td>
402
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
403
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">''</td>
404
+ <td class="p-4 text-gray-700 dark:text-gray-300">Error message text - shows red styling and displays error below input</td>
405
+ </tr>
406
+ <tr>
407
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">disabled</td>
408
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
409
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
410
+ <td class="p-4 text-gray-700 dark:text-gray-300">Disables the input when true - shows visual disabled state and prevents interaction</td>
411
+ </tr>
412
+ </tbody>
413
+ </table>
340
414
  </div>
341
415
  </div>
342
416
  </section>
343
417
 
344
418
  <!-- Future Features -->
345
- <section class="mb-8">
346
- <h2 class="text-lg font-semibold mb-4 text-[#0a0a0a] dark:text-white">Future Features</h2>
347
-
348
- <div class="space-y-4">
349
- <div class="bg-gray-200 dark:bg-[#121212] p-4 rounded-lg">
350
- <div class="flex items-center gap-2 mb-2">
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>
353
- </div>
354
- <p class="text-sm text-gray-700 dark:text-gray-400">
355
- A lightweight directive for developers who want only the input styling without the full component logic.
356
- </p>
419
+ <section id="future" class="mb-12" aria-labelledby="future-heading">
420
+ <h2 id="future-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
421
+ [ Future Features ]
422
+ </h2>
423
+
424
+ <div class="bg-neutral-100 dark:bg-[#121212] border-2 border-neutral-300 dark:border-neutral-700 p-4">
425
+ <div class="flex items-center gap-3 mb-3">
426
+ <h3 class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white uppercase">
427
+ Styles-Only Directive
428
+ </h3>
429
+ <span class="text-[10px] font-bold bg-blue-500 text-white px-2 py-1 uppercase tracking-wider" aria-label="Status: Coming Soon Feature">
430
+ COMING SOON
431
+ </span>
357
432
  </div>
433
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">
434
+ A lightweight directive for developers who want only the input styling without the full component logic.
435
+ </p>
358
436
  </div>
359
437
  </section>
360
438
 
361
439
  </div>
362
- </div>
440
+ </main>