wally-ui 1.11.2 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/cli.js +7 -0
  2. package/dist/cli.js.map +1 -1
  3. package/package.json +4 -2
  4. package/playground/showcase/public/sitemap.xml +32 -0
  5. package/playground/showcase/src/app/app.config.ts +9 -2
  6. package/playground/showcase/src/app/app.routes.server.ts +8 -0
  7. package/playground/showcase/src/app/components/ai/ai-chat/ai-chat.css +0 -0
  8. package/playground/showcase/src/app/components/ai/ai-chat/ai-chat.html +5 -0
  9. package/playground/showcase/src/app/components/ai/ai-chat/ai-chat.spec.ts +23 -0
  10. package/playground/showcase/src/app/components/ai/ai-chat/ai-chat.ts +17 -0
  11. package/playground/showcase/src/app/components/ai/ai-composer/ai-composer.css +0 -0
  12. package/playground/showcase/src/app/components/ai/ai-composer/ai-composer.html +69 -0
  13. package/playground/showcase/src/app/components/ai/ai-composer/ai-composer.spec.ts +23 -0
  14. package/playground/showcase/src/app/components/ai/ai-composer/ai-composer.ts +19 -0
  15. package/playground/showcase/src/app/components/ai/ai-prompt-input/ai-prompt-input.css +0 -0
  16. package/playground/showcase/src/app/components/ai/ai-prompt-input/ai-prompt-input.html +10 -0
  17. package/playground/showcase/src/app/components/ai/ai-prompt-input/ai-prompt-input.spec.ts +23 -0
  18. package/playground/showcase/src/app/components/ai/ai-prompt-input/ai-prompt-input.ts +25 -0
  19. package/playground/showcase/src/app/components/button/button.html +5 -1
  20. package/playground/showcase/src/app/components/button/button.ts +1 -0
  21. package/playground/showcase/src/app/components/carousel/carousel.ts +1 -2
  22. package/playground/showcase/src/app/components/tooltip/tooltip.css +0 -0
  23. package/playground/showcase/src/app/components/tooltip/tooltip.html +9 -0
  24. package/playground/showcase/src/app/components/tooltip/tooltip.ts +189 -0
  25. package/playground/showcase/src/app/pages/documentation/chat-sdk/chat-sdk.html +99 -0
  26. package/playground/showcase/src/app/pages/documentation/chat-sdk/chat-sdk.ts +20 -0
  27. package/playground/showcase/src/app/pages/documentation/components/components.html +23 -0
  28. package/playground/showcase/src/app/pages/documentation/components/components.routes.ts +4 -0
  29. package/playground/showcase/src/app/pages/documentation/components/tooltip-docs/tooltip-docs.css +1 -0
  30. package/playground/showcase/src/app/pages/documentation/components/tooltip-docs/tooltip-docs.examples.ts +150 -0
  31. package/playground/showcase/src/app/pages/documentation/components/tooltip-docs/tooltip-docs.html +467 -0
  32. package/playground/showcase/src/app/pages/documentation/components/tooltip-docs/tooltip-docs.ts +69 -0
  33. package/playground/showcase/src/app/pages/documentation/documentation.routes.ts +4 -0
  34. package/playground/showcase/src/app/pages/home/home.html +26 -0
  35. package/playground/showcase/src/app/pages/home/home.ts +3 -2
  36. package/playground/showcase/src/index.html +7 -4
@@ -0,0 +1,467 @@
1
+ <main class="min-h-dvh bg-white dark:bg-[#0a0a0a] font-mono" role="main">
2
+ <div class="max-w-4xl mx-auto px-4 py-8 sm:px-6 md:px-8">
3
+
4
+ <!-- Breadcrumb Navigation -->
5
+ <nav class="mb-8" aria-label="Breadcrumb navigation">
6
+ <wally-breadcrumb [items]="breadcrumbItems"></wally-breadcrumb>
7
+ </nav>
8
+
9
+ <!-- Header -->
10
+ <header class="mb-12" role="banner">
11
+ <h1 id="page-title" class="text-3xl sm:text-4xl font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
12
+ <span aria-hidden="true">&gt;_ </span>Tooltip
13
+ </h1>
14
+ <p
15
+ class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 border-l-2 border-neutral-300 dark:border-neutral-700 pl-4 leading-relaxed">
16
+ Accessible tooltip component with smart auto-positioning, overflow detection, and smooth animations. Wraps any element to provide contextual information on hover or focus.
17
+ </p>
18
+ </header>
19
+
20
+ <!-- AI Assistant Links -->
21
+ <div class="flex flex-wrap gap-0 mt-6 mb-12 border-2 border-neutral-300 dark:border-neutral-700" role="list"
22
+ aria-label="Open documentation in AI coding assistants">
23
+ <a [href]="claudeUrl" target="_blank"
24
+ 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"
25
+ rel="noopener noreferrer" role="listitem"
26
+ aria-label="Open Tooltip component documentation in Claude AI assistant (opens in new tab)">
27
+ <svg xmlns="http://www.w3.org/2000/svg"
28
+ class="size-5 text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150"
29
+ viewBox="0 0 24 24" aria-hidden="true">
30
+ <path fill="currentColor"
31
+ 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" />
32
+ </svg>
33
+ <span
34
+ 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">
35
+ Open in Claude
36
+ </span>
37
+ </a>
38
+
39
+ <a [href]="chatGptUrl" target="_blank"
40
+ 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"
41
+ rel="noopener noreferrer" role="listitem"
42
+ aria-label="Open Tooltip component documentation in ChatGPT AI assistant (opens in new tab)">
43
+ <svg xmlns="http://www.w3.org/2000/svg"
44
+ class="size-5 text-[#0a0a0a] dark:text-neutral-400 group-hover:text-white dark:group-hover:text-[#0a0a0a] transition-colors duration-150"
45
+ viewBox="0 0 48 48" aria-hidden="true">
46
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
47
+ d="M18.38 27.94v-14.4l11.19-6.46c6.2-3.58 17.3 5.25 12.64 13.33" />
48
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
49
+ d="m18.38 20.94l12.47-7.2l11.19 6.46c6.2 3.58 4.1 17.61-5.23 17.61" />
50
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
51
+ d="m24.44 17.44l12.47 7.2v12.93c0 7.16-13.2 12.36-17.86 4.28" />
52
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
53
+ d="M30.5 21.2v14.14L19.31 41.8c-6.2 3.58-17.3-5.25-12.64-13.33" />
54
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
55
+ 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" />
56
+ <path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"
57
+ d="m24.44 31.44l-12.47-7.2V11.31c0-7.16 13.2-12.36 17.86-4.28" />
58
+ </svg>
59
+ <span
60
+ 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">
61
+ Open in ChatGPT
62
+ </span>
63
+ </a>
64
+ </div>
65
+
66
+ <!-- Installation -->
67
+ <section id="installation" class="mb-12" aria-labelledby="installation-heading">
68
+ <h2 id="installation-heading"
69
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
70
+ [ Installation ]
71
+ </h2>
72
+ <code
73
+ class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white block bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3"
74
+ aria-label="Installation command for Tooltip component">
75
+ <pre><code [innerHTML]="installationCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
76
+ </code>
77
+ </section>
78
+
79
+ <!-- Import -->
80
+ <section id="import" class="mb-12" aria-labelledby="import-heading">
81
+ <h2 id="import-heading"
82
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
83
+ [ Import ]
84
+ </h2>
85
+ <div class="space-y-3">
86
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
87
+ <pre><code [innerHTML]="importCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
88
+ </div>
89
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
90
+ <pre><code [innerHTML]="componentImportCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
91
+ </div>
92
+ </div>
93
+ </section>
94
+
95
+ <!-- Basic Usage -->
96
+ <section id="basic-usage" class="mb-12" aria-labelledby="basic-usage-heading">
97
+ <h2 id="basic-usage-heading"
98
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
99
+ [ Basic Usage ]
100
+ </h2>
101
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
102
+ <pre><code [innerHTML]="basicUsageCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
103
+ </div>
104
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] flex items-center justify-center" role="img"
105
+ aria-label="Live preview of basic tooltip on hover">
106
+ <wally-tooltip text="This is a tooltip">
107
+ <wally-button variant="secondary">Hover me</wally-button>
108
+ </wally-tooltip>
109
+ </div>
110
+ </section>
111
+
112
+ <!-- Positioning System -->
113
+ <section id="positioning" class="mb-12" aria-labelledby="positioning-heading">
114
+ <h2 id="positioning-heading"
115
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
116
+ [ Smart Auto-Positioning ]
117
+ </h2>
118
+
119
+ <article class="mb-8" aria-labelledby="auto-position-heading">
120
+ <h3 id="auto-position-heading"
121
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
122
+ <span aria-hidden="true">&gt; </span>Auto Position (Default)
123
+ </h3>
124
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
125
+ Automatically detects viewport space and positions tooltip optimally. Includes overflow detection for edge cases.
126
+ </p>
127
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
128
+ <pre><code [innerHTML]="positionsCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
129
+ </div>
130
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] flex items-center justify-center" role="img"
131
+ aria-label="Live preview of tooltip positioning options">
132
+ <div class="flex flex-wrap gap-4 justify-center">
133
+ <wally-tooltip text="Auto positioned" position="auto">
134
+ <wally-button variant="outline">Auto</wally-button>
135
+ </wally-tooltip>
136
+ <wally-tooltip text="Always on top" position="top">
137
+ <wally-button variant="outline">Top</wally-button>
138
+ </wally-tooltip>
139
+ <wally-tooltip text="Always on bottom" position="bottom">
140
+ <wally-button variant="outline">Bottom</wally-button>
141
+ </wally-tooltip>
142
+ <wally-tooltip text="Always on left" position="left">
143
+ <wally-button variant="outline">Left</wally-button>
144
+ </wally-tooltip>
145
+ <wally-tooltip text="Always on right" position="right">
146
+ <wally-button variant="outline">Right</wally-button>
147
+ </wally-tooltip>
148
+ </div>
149
+ </div>
150
+ </article>
151
+ </section>
152
+
153
+ <!-- Usage Examples -->
154
+ <section id="examples" class="mb-12" aria-labelledby="examples-heading">
155
+ <h2 id="examples-heading"
156
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
157
+ [ Usage Examples ]
158
+ </h2>
159
+
160
+ <!-- With Button -->
161
+ <article class="mb-8" aria-labelledby="with-button-heading">
162
+ <h3 id="with-button-heading"
163
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
164
+ <span aria-hidden="true">&gt; </span>With Button Component
165
+ </h3>
166
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
167
+ <pre><code [innerHTML]="withButtonCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
168
+ </div>
169
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] flex items-center justify-center" role="img"
170
+ aria-label="Live preview of tooltip with button component">
171
+ <wally-tooltip text="Save your changes">
172
+ <wally-button variant="primary">Save</wally-button>
173
+ </wally-tooltip>
174
+ </div>
175
+ </article>
176
+
177
+ <!-- With Icon Button -->
178
+ <article class="mb-8" aria-labelledby="with-icon-heading">
179
+ <h3 id="with-icon-heading"
180
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
181
+ <span aria-hidden="true">&gt; </span>Icon-Only Button
182
+ </h3>
183
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
184
+ Essential for icon-only buttons to provide context for screen readers and visual users.
185
+ </p>
186
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
187
+ <pre><code [innerHTML]="withIconCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
188
+ </div>
189
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] flex items-center justify-center" role="img"
190
+ aria-label="Live preview of tooltip with icon button">
191
+ <wally-tooltip text="Send message">
192
+ <wally-button [variant]="'ghost'" [rounded]="true" ariaLabel="Send">
193
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5">
194
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 12 3.269 3.125A59.769 59.769 0 0 1 21.485 12 59.768 59.768 0 0 1 3.27 20.875L5.999 12Zm0 0h7.5" />
195
+ </svg>
196
+ </wally-button>
197
+ </wally-tooltip>
198
+ </div>
199
+ </article>
200
+ </section>
201
+
202
+ <!-- Configuration -->
203
+ <section id="configuration" class="mb-12" aria-labelledby="configuration-heading">
204
+ <h2 id="configuration-heading"
205
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
206
+ [ Configuration ]
207
+ </h2>
208
+
209
+ <!-- Custom Delay -->
210
+ <article class="mb-8" aria-labelledby="delay-heading">
211
+ <h3 id="delay-heading"
212
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
213
+ <span aria-hidden="true">&gt; </span>Custom Delay
214
+ </h3>
215
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
216
+ <pre><code [innerHTML]="customDelayCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
217
+ </div>
218
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] flex items-center justify-center" role="img"
219
+ aria-label="Live preview of tooltips with custom delays">
220
+ <div class="flex gap-4">
221
+ <wally-tooltip text="Quick tooltip" [delay]="100">
222
+ <wally-button variant="ghost">Fast (100ms)</wally-button>
223
+ </wally-tooltip>
224
+ <wally-tooltip text="Delayed tooltip" [delay]="500">
225
+ <wally-button variant="ghost">Slow (500ms)</wally-button>
226
+ </wally-tooltip>
227
+ </div>
228
+ </div>
229
+ </article>
230
+
231
+ <!-- Disabled State -->
232
+ <article class="mb-8" aria-labelledby="disabled-heading">
233
+ <h3 id="disabled-heading"
234
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
235
+ <span aria-hidden="true">&gt; </span>Disabled State
236
+ </h3>
237
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
238
+ <pre><code [innerHTML]="disabledCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
239
+ </div>
240
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] flex items-center justify-center" role="img"
241
+ aria-label="Live preview of disabled tooltip">
242
+ <wally-tooltip text="This won't show" [disabled]="true">
243
+ <wally-button variant="secondary">Disabled Tooltip</wally-button>
244
+ </wally-tooltip>
245
+ </div>
246
+ </article>
247
+
248
+ <!-- Custom Offset -->
249
+ <article class="mb-8" aria-labelledby="offset-heading">
250
+ <h3 id="offset-heading"
251
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
252
+ <span aria-hidden="true">&gt; </span>Custom Offset
253
+ </h3>
254
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
255
+ <pre><code [innerHTML]="customOffsetCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
256
+ </div>
257
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] flex items-center justify-center" role="img"
258
+ aria-label="Live preview of tooltips with custom offset spacing">
259
+ <div class="flex gap-4">
260
+ <wally-tooltip text="More space" [offset]="4">
261
+ <wally-button variant="secondary">Large offset</wally-button>
262
+ </wally-tooltip>
263
+ <wally-tooltip text="Close" [offset]="1">
264
+ <wally-button variant="secondary">Small offset</wally-button>
265
+ </wally-tooltip>
266
+ </div>
267
+ </div>
268
+ </article>
269
+ </section>
270
+
271
+ <!-- Production Examples -->
272
+ <section id="production-examples" class="mb-12" aria-labelledby="production-heading">
273
+ <h2 id="production-heading"
274
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
275
+ [ Production Examples ]
276
+ </h2>
277
+
278
+ <!-- Dashboard Toolbar -->
279
+ <article class="mb-8" aria-labelledby="dashboard-heading">
280
+ <h3 id="dashboard-heading"
281
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
282
+ <span aria-hidden="true">&gt; </span>Dashboard Toolbar
283
+ </h3>
284
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
285
+ <pre><code [innerHTML]="dashboardCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
286
+ </div>
287
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a] flex items-center justify-center" role="img"
288
+ aria-label="Live preview of dashboard toolbar with tooltips">
289
+ <div class="flex gap-2">
290
+ <wally-tooltip text="Export data to CSV">
291
+ <wally-button variant="outline" ariaLabel="Export">
292
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5">
293
+ <path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3" />
294
+ </svg>
295
+ </wally-button>
296
+ </wally-tooltip>
297
+
298
+ <wally-tooltip text="Refresh dashboard">
299
+ <wally-button variant="outline" ariaLabel="Refresh">
300
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5">
301
+ <path stroke-linecap="round" stroke-linejoin="round" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
302
+ </svg>
303
+ </wally-button>
304
+ </wally-tooltip>
305
+
306
+ <wally-tooltip text="Settings">
307
+ <wally-button variant="outline" ariaLabel="Settings">
308
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5">
309
+ <path stroke-linecap="round" stroke-linejoin="round" d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" />
310
+ <path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
311
+ </svg>
312
+ </wally-button>
313
+ </wally-tooltip>
314
+ </div>
315
+ </div>
316
+ </article>
317
+
318
+ <!-- Form Field Help -->
319
+ <article class="mb-8" aria-labelledby="form-field-heading">
320
+ <h3 id="form-field-heading"
321
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
322
+ <span aria-hidden="true">&gt; </span>Form Field Help
323
+ </h3>
324
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
325
+ <pre><code [innerHTML]="formFieldCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
326
+ </div>
327
+ <div class="p-8 border-2 border-neutral-300 dark:border-neutral-700 bg-white dark:bg-[#0a0a0a]" role="img"
328
+ aria-label="Live preview of form field with help tooltip">
329
+ <div class="flex items-start gap-2">
330
+ <wally-input label="Email" type="email" placeholder="your@email.com" class="flex-1" />
331
+ <wally-tooltip text="We'll never share your email">
332
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-4 text-neutral-500 cursor-help mt-[30px]">
333
+ <path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
334
+ </svg>
335
+ </wally-tooltip>
336
+ </div>
337
+ </div>
338
+ </article>
339
+ </section>
340
+
341
+ <!-- Future Features -->
342
+ <section id="future-features" class="mb-12" aria-labelledby="future-heading">
343
+ <h2 id="future-heading"
344
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
345
+ [ Future Features ]
346
+ </h2>
347
+
348
+ <article class="mb-8" aria-labelledby="rich-content-heading">
349
+ <h3 id="rich-content-heading"
350
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-3 uppercase">
351
+ <span aria-hidden="true">&gt; </span>Rich Content Support (Coming Soon)
352
+ </h3>
353
+ <p class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 mb-3 leading-relaxed">
354
+ Future version will support custom HTML content projection, allowing images, formatted text, and interactive elements inside tooltips.
355
+ </p>
356
+ <div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
357
+ <pre><code [innerHTML]="richContentCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
358
+ </div>
359
+ </article>
360
+ </section>
361
+
362
+ <!-- API Reference -->
363
+ <section id="api-reference" class="mb-12" aria-labelledby="api-heading">
364
+ <h2 id="api-heading"
365
+ class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
366
+ [ API Reference ]
367
+ </h2>
368
+
369
+ <!-- Input Properties -->
370
+ <article class="mb-8" aria-labelledby="input-properties-heading">
371
+ <h3 id="input-properties-heading"
372
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
373
+ <span aria-hidden="true">&gt; </span>Input Properties
374
+ </h3>
375
+ <div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
376
+ <div class="overflow-x-auto">
377
+ <table class="w-full text-sm">
378
+ <thead class="bg-gray-50 dark:bg-gray-900">
379
+ <tr>
380
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Property</th>
381
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Type</th>
382
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Default</th>
383
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Description</th>
384
+ </tr>
385
+ </thead>
386
+ <tbody class="divide-y divide-gray-200 dark:divide-gray-700">
387
+ <tr>
388
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">text</td>
389
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
390
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">required</td>
391
+ <td class="p-4 text-gray-700 dark:text-gray-300">Text content displayed in the tooltip</td>
392
+ </tr>
393
+ <tr>
394
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">position</td>
395
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">'top' | 'bottom' | 'left' | 'right' | 'auto'</td>
396
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">'auto'</td>
397
+ <td class="p-4 text-gray-700 dark:text-gray-300">Tooltip position. 'auto' intelligently detects best position based on viewport space</td>
398
+ </tr>
399
+ <tr>
400
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">delay</td>
401
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">number</td>
402
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">200</td>
403
+ <td class="p-4 text-gray-700 dark:text-gray-300">Show delay in milliseconds</td>
404
+ </tr>
405
+ <tr>
406
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">disabled</td>
407
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
408
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
409
+ <td class="p-4 text-gray-700 dark:text-gray-300">Disables tooltip display</td>
410
+ </tr>
411
+ <tr>
412
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">offset</td>
413
+ <td class="p-4 font-mono text-purple-600 dark:text-purple-400">number</td>
414
+ <td class="p-4 font-mono text-green-600 dark:text-green-400">2</td>
415
+ <td class="p-4 text-gray-700 dark:text-gray-300">Distance from target element in pixels</td>
416
+ </tr>
417
+ </tbody>
418
+ </table>
419
+ </div>
420
+ </div>
421
+ </article>
422
+
423
+ <!-- Technical Features -->
424
+ <article class="mb-8" aria-labelledby="technical-heading">
425
+ <h3 id="technical-heading"
426
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
427
+ <span aria-hidden="true">&gt; </span>Technical Features
428
+ </h3>
429
+ <div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
430
+ <div class="overflow-x-auto">
431
+ <table class="w-full text-sm">
432
+ <thead class="bg-gray-50 dark:bg-gray-900">
433
+ <tr>
434
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Feature</th>
435
+ <th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Description</th>
436
+ </tr>
437
+ </thead>
438
+ <tbody class="divide-y divide-gray-200 dark:divide-gray-700">
439
+ <tr>
440
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">Auto-Positioning</td>
441
+ <td class="p-4 text-gray-700 dark:text-gray-300">Detects viewport space and positions tooltip automatically with priority: top → bottom → right → left</td>
442
+ </tr>
443
+ <tr>
444
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">Overflow Detection</td>
445
+ <td class="p-4 text-gray-700 dark:text-gray-300">Automatically shifts tooltip horizontally/vertically when near viewport edges (8px padding)</td>
446
+ </tr>
447
+ <tr>
448
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">Smooth Animation</td>
449
+ <td class="p-4 text-gray-700 dark:text-gray-300">GPU-accelerated fade transitions (150ms show, 100ms hide)</td>
450
+ </tr>
451
+ <tr>
452
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">Accessibility</td>
453
+ <td class="p-4 text-gray-700 dark:text-gray-300">role="tooltip", aria-hidden, keyboard support (focus/blur events)</td>
454
+ </tr>
455
+ <tr>
456
+ <td class="p-4 font-mono text-blue-600 dark:text-blue-400">Dark Mode</td>
457
+ <td class="p-4 text-gray-700 dark:text-gray-300">Automatic theme detection and color adaptation</td>
458
+ </tr>
459
+ </tbody>
460
+ </table>
461
+ </div>
462
+ </div>
463
+ </article>
464
+ </section>
465
+
466
+ </div>
467
+ </main>
@@ -0,0 +1,69 @@
1
+ import { Component } from '@angular/core';
2
+
3
+ import { AiPromptService } from '../../../../core/services/ai-prompt.service';
4
+ import { getFormattedCode } from '../../../../core/utils/prism';
5
+
6
+ import { TooltipCodeExamples } from './tooltip-docs.examples';
7
+
8
+ import { Breadcrumb, BreadcrumbItem } from '../../../../components/breadcrumb/breadcrumb';
9
+ import { Button } from '../../../../components/button/button';
10
+ import { Tooltip } from '../../../../components/tooltip/tooltip';
11
+ import { Input } from '../../../../components/input/input';
12
+
13
+ @Component({
14
+ selector: 'app-tooltip-docs',
15
+ imports: [
16
+ Button,
17
+ Breadcrumb,
18
+ Tooltip,
19
+ Input
20
+ ],
21
+ templateUrl: './tooltip-docs.html',
22
+ styleUrl: './tooltip-docs.css'
23
+ })
24
+ export class TooltipDocs {
25
+ breadcrumbItems: BreadcrumbItem[] = [
26
+ { label: 'Home', url: '/' },
27
+ { label: 'Documentation', url: '/documentation' },
28
+ { label: 'Components', url: '/documentation/components' },
29
+ { label: 'Tooltip' }
30
+ ];
31
+
32
+ // Installation & Import
33
+ installationCode = getFormattedCode(TooltipCodeExamples.installation, 'bash');
34
+ importCode = getFormattedCode(TooltipCodeExamples.import, 'typescript');
35
+ componentImportCode = getFormattedCode(TooltipCodeExamples.componentImport, 'typescript');
36
+ basicUsageCode = getFormattedCode(TooltipCodeExamples.basicUsage, 'html');
37
+
38
+ // Positioning
39
+ positionsCode = getFormattedCode(TooltipCodeExamples.positions, 'html');
40
+
41
+ // Examples
42
+ withButtonCode = getFormattedCode(TooltipCodeExamples.withButton, 'html');
43
+ withIconCode = getFormattedCode(TooltipCodeExamples.withIcon, 'html');
44
+ customDelayCode = getFormattedCode(TooltipCodeExamples.customDelay, 'html');
45
+ disabledCode = getFormattedCode(TooltipCodeExamples.disabled, 'html');
46
+ customOffsetCode = getFormattedCode(TooltipCodeExamples.customOffset, 'html');
47
+
48
+ // Production Examples
49
+ dashboardCode = getFormattedCode(TooltipCodeExamples.dashboard, 'html');
50
+ formFieldCode = getFormattedCode(TooltipCodeExamples.formField, 'html');
51
+ navigationCode = getFormattedCode(TooltipCodeExamples.navigation, 'html');
52
+ avatarCode = getFormattedCode(TooltipCodeExamples.avatar, 'html');
53
+ statusBadgeCode = getFormattedCode(TooltipCodeExamples.statusBadge, 'html');
54
+
55
+ // Future Features
56
+ richContentCode = getFormattedCode(TooltipCodeExamples.richContent, 'html');
57
+
58
+ constructor(
59
+ private aiPromptService: AiPromptService
60
+ ) { }
61
+
62
+ get claudeUrl(): string {
63
+ return this.aiPromptService.generateClaudeUrl();
64
+ }
65
+
66
+ get chatGptUrl(): string {
67
+ return this.aiPromptService.generateChatGptUrl();
68
+ }
69
+ }
@@ -8,5 +8,9 @@ export const documentationRoutes: Routes = [
8
8
  {
9
9
  path: 'components',
10
10
  loadChildren: () => import('./components/components.routes').then(m => m.componentsRoutes)
11
+ },
12
+ {
13
+ path: 'chat-sdk',
14
+ loadComponent: () => import('./chat-sdk/chat-sdk').then(m => m.ChatSdk)
11
15
  }
12
16
  ];
@@ -1,5 +1,9 @@
1
1
  <main class="min-h-dvh subpixel-antialiased font-mono bg-white dark:bg-[#0a0a0a]" role="main">
2
2
  <div class="w-full min-h-dvh flex flex-col items-center justify-center px-4 py-12 sm:px-6 md:px-8 lg:px-12">
3
+ <!-- <div class="w-full max-w-4xl">
4
+ <wally-ai-chat></wally-ai-chat>
5
+ </div> -->
6
+
3
7
  <article class="w-full max-w-3xl">
4
8
  <header class="w-full mb-10 sm:mb-12 space-y-6">
5
9
  <hgroup class="space-y-6">
@@ -121,6 +125,28 @@
121
125
  </div>
122
126
  </a>
123
127
 
128
+ <a [routerLink]="'/documentation/chat-sdk'"
129
+ class="group block px-4 py-3 sm:py-4 bg-white dark:bg-[#0a0a0a] border-b-2 border-neutral-300 dark:border-neutral-700 hover:bg-[#0a0a0a] dark:hover:bg-white hover:border-[#0a0a0a] dark:hover:border-white transition-all duration-150 cursor-pointer"
130
+ aria-label="Chat SDK - Complete chat development SDK with AI interface, message matrix, streaming service, and Wally UI components">
131
+ <div class="flex items-start justify-between gap-4">
132
+ <div class="flex-1 min-w-0">
133
+ <div class="flex items-center gap-3 mb-1">
134
+ <h4
135
+ class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white group-hover:text-white dark:group-hover:text-[#0a0a0a] uppercase tracking-wide transition-colors duration-150">
136
+ <span aria-hidden="true">&gt;_ </span>Chat SDK
137
+ </h4>
138
+ <span class="text-[10px] font-bold bg-blue-500 text-white px-2 py-1 uppercase tracking-wider" aria-label="Status: Coming Soon">
139
+ COMING SOON
140
+ </span>
141
+ </div>
142
+ <p
143
+ class="text-xs sm:text-sm text-neutral-600 dark:text-neutral-400 group-hover:text-neutral-300 dark:group-hover:text-neutral-600 transition-colors duration-150">
144
+ Complete chat development SDK: AI interface with message matrix (ai: 1/2, me: 1/1), streaming data service, and full visual customization using Wally UI components
145
+ </p>
146
+ </div>
147
+ </div>
148
+ </a>
149
+
124
150
  <a [routerLink]="'/mcp'"
125
151
  class="group block px-4 py-3 sm:py-4 bg-white dark:bg-[#0a0a0a] hover:bg-[#0a0a0a] dark:hover:bg-white hover:border-[#0a0a0a] dark:hover:border-white transition-all duration-150 cursor-pointer"
126
152
  aria-label="Learn about Wally UI MCP Server integration with AI coding assistants like Claude, ChatGPT, and Cursor">
@@ -1,10 +1,11 @@
1
1
  import { RouterModule } from '@angular/router';
2
2
  import { Component } from '@angular/core';
3
- import { Carousel } from "../../components/carousel/carousel";
3
+
4
+ import { AiChat } from '../../components/ai/ai-chat/ai-chat';
4
5
 
5
6
  @Component({
6
7
  selector: 'wally-home',
7
- imports: [RouterModule, Carousel],
8
+ imports: [RouterModule, AiChat],
8
9
  templateUrl: './home.html',
9
10
  styleUrl: './home.css'
10
11
  })
@@ -47,12 +47,15 @@
47
47
  </script>
48
48
 
49
49
  <script>
50
- // Tailwind V4
50
+ // Tailwind V4 - Auto theme detection (ignores localStorage)
51
51
  function updateTheme() {
52
- const isDark = localStorage.theme === "dark" ||
53
- (!("theme" in localStorage) &&
54
- window.matchMedia("(prefers-color-scheme: dark)").matches);
52
+ // Remove any cached theme preference from other projects
53
+ if (localStorage.theme) {
54
+ localStorage.removeItem('theme');
55
+ }
55
56
 
57
+ // Always use system preference
58
+ const isDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
56
59
  document.documentElement.classList.toggle("dark", isDark);
57
60
  }
58
61