wally-ui 1.14.1 → 1.15.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.
Files changed (18) hide show
  1. package/package.json +1 -1
  2. package/playground/showcase/public/sitemap.xml +15 -0
  3. package/playground/showcase/src/app/app.routes.server.ts +4 -0
  4. package/playground/showcase/src/app/components/ai/ai-composer/ai-composer.html +11 -2
  5. package/playground/showcase/src/app/components/ai/ai-composer/ai-composer.ts +13 -3
  6. package/playground/showcase/src/app/components/audio-waveform/audio-waveform.css +0 -0
  7. package/playground/showcase/src/app/components/audio-waveform/audio-waveform.html +41 -0
  8. package/playground/showcase/src/app/components/audio-waveform/audio-waveform.service.spec.ts +16 -0
  9. package/playground/showcase/src/app/components/audio-waveform/audio-waveform.service.ts +175 -0
  10. package/playground/showcase/src/app/components/audio-waveform/audio-waveform.spec.ts +23 -0
  11. package/playground/showcase/src/app/components/audio-waveform/audio-waveform.ts +64 -0
  12. package/playground/showcase/src/app/pages/documentation/components/audio-waveform-docs/audio-waveform-docs.css +1 -0
  13. package/playground/showcase/src/app/pages/documentation/components/audio-waveform-docs/audio-waveform-docs.examples.ts +146 -0
  14. package/playground/showcase/src/app/pages/documentation/components/audio-waveform-docs/audio-waveform-docs.html +576 -0
  15. package/playground/showcase/src/app/pages/documentation/components/audio-waveform-docs/audio-waveform-docs.ts +124 -0
  16. package/playground/showcase/src/app/pages/documentation/components/components.html +27 -0
  17. package/playground/showcase/src/app/pages/documentation/components/components.routes.ts +4 -0
  18. package/playground/showcase/src/app/pages/home/home.html +1 -1
@@ -0,0 +1,124 @@
1
+ import { Component, signal, WritableSignal } from '@angular/core';
2
+
3
+ import { AiPromptService } from '../../../../core/services/ai-prompt.service';
4
+ import { getFormattedCode } from '../../../../core/utils/prism';
5
+
6
+ import { AudioWaveformCodeExamples } from './audio-waveform-docs.examples';
7
+
8
+ import { Breadcrumb, BreadcrumbItem } from '../../../../components/breadcrumb/breadcrumb';
9
+ import { AudioWaveform } from '../../../../components/audio-waveform/audio-waveform';
10
+ import { Button } from '../../../../components/button/button';
11
+
12
+ @Component({
13
+ selector: 'app-audio-waveform-docs',
14
+ imports: [
15
+ Breadcrumb,
16
+ AudioWaveform,
17
+ Button
18
+ ],
19
+ templateUrl: './audio-waveform-docs.html',
20
+ styleUrl: './audio-waveform-docs.css'
21
+ })
22
+ export class AudioWaveformDocs {
23
+ breadcrumbItems: BreadcrumbItem[] = [
24
+ { label: 'Home', url: '/' },
25
+ { label: 'Documentation', url: '/documentation' },
26
+ { label: 'Components', url: '/documentation/components' },
27
+ { label: 'Audio Waveform' }
28
+ ];
29
+
30
+ // Installation & Import
31
+ installationCode = getFormattedCode(AudioWaveformCodeExamples.installation, 'bash');
32
+ importCode = getFormattedCode(AudioWaveformCodeExamples.import, 'typescript');
33
+ componentImportCode = getFormattedCode(AudioWaveformCodeExamples.componentImport, 'typescript');
34
+
35
+ // Basic Usage
36
+ basicUsageCode = getFormattedCode(AudioWaveformCodeExamples.basicUsage, 'html');
37
+ withTimerCode = getFormattedCode(AudioWaveformCodeExamples.withTimer, 'html');
38
+ completeExampleCode = getFormattedCode(AudioWaveformCodeExamples.completeExample, 'html');
39
+ completeExampleTsCode = getFormattedCode(AudioWaveformCodeExamples.completeExampleTs, 'typescript');
40
+
41
+ // Service Integration
42
+ serviceIntegrationCode = getFormattedCode(AudioWaveformCodeExamples.serviceIntegration, 'typescript');
43
+
44
+ // Configuration
45
+ responsiveConfigCode = getFormattedCode(AudioWaveformCodeExamples.responsiveConfig, 'typescript');
46
+ webAudioConceptsCode = getFormattedCode(AudioWaveformCodeExamples.webAudioConcepts, 'typescript');
47
+
48
+ // Future Features
49
+ futureTranscriptionCode = getFormattedCode(AudioWaveformCodeExamples.futureTranscription, 'html');
50
+
51
+ // Properties
52
+ propertyIsStartRecordingCode = getFormattedCode(AudioWaveformCodeExamples.propertyIsStartRecording, 'typescript');
53
+ propertyIsStopRecordingCode = getFormattedCode(AudioWaveformCodeExamples.propertyIsStopRecording, 'typescript');
54
+ propertyShowTimerCode = getFormattedCode(AudioWaveformCodeExamples.propertyShowTimer, 'typescript');
55
+
56
+ // Service Properties
57
+ servicePropertyIsRecordingCode = getFormattedCode(AudioWaveformCodeExamples.servicePropertyIsRecording, 'typescript');
58
+ servicePropertyAudioDataCode = getFormattedCode(AudioWaveformCodeExamples.servicePropertyAudioData, 'typescript');
59
+ servicePropertyRecordedAudioBlobCode = getFormattedCode(AudioWaveformCodeExamples.servicePropertyRecordedAudioBlob, 'typescript');
60
+ servicePropertyRecordedAudioUrlCode = getFormattedCode(AudioWaveformCodeExamples.servicePropertyRecordedAudioUrl, 'typescript');
61
+
62
+ // Methods
63
+ methodDownloadRecordingCode = getFormattedCode(AudioWaveformCodeExamples.methodDownloadRecording, 'typescript');
64
+ methodClearRecordingCode = getFormattedCode(AudioWaveformCodeExamples.methodClearRecording, 'typescript');
65
+
66
+ // Configuration
67
+ configFFTSizeCode = getFormattedCode(AudioWaveformCodeExamples.configFFTSize, 'typescript');
68
+ configBarCountCode = getFormattedCode(AudioWaveformCodeExamples.configBarCount, 'typescript');
69
+ configSmoothingCode = getFormattedCode(AudioWaveformCodeExamples.configSmoothing, 'typescript');
70
+
71
+ // Accessibility & Browser Support
72
+ accessibilityExampleCode = getFormattedCode(AudioWaveformCodeExamples.accessibilityExample, 'html');
73
+ browserSupportCode = getFormattedCode(AudioWaveformCodeExamples.browserSupport, 'typescript');
74
+
75
+ // Interactive demo state
76
+ isRecording: WritableSignal<boolean> = signal<boolean>(false);
77
+ isRecordingWithoutTimer: WritableSignal<boolean> = signal<boolean>(false);
78
+ isRecordingWithTimer: WritableSignal<boolean> = signal<boolean>(false);
79
+ isRecordingWithDownload: WritableSignal<boolean> = signal<boolean>(false);
80
+
81
+ constructor(
82
+ private aiPromptService: AiPromptService
83
+ ) { }
84
+
85
+ startRecording(): void {
86
+ this.isRecording.set(true);
87
+ }
88
+
89
+ stopRecording(): void {
90
+ this.isRecording.set(false);
91
+ }
92
+
93
+ startRecordingWithoutTimer(): void {
94
+ this.isRecordingWithoutTimer.set(true);
95
+ }
96
+
97
+ stopRecordingWithoutTimer(): void {
98
+ this.isRecordingWithoutTimer.set(false);
99
+ }
100
+
101
+ startRecordingWithTimer(): void {
102
+ this.isRecordingWithTimer.set(true);
103
+ }
104
+
105
+ stopRecordingWithTimer(): void {
106
+ this.isRecordingWithTimer.set(false);
107
+ }
108
+
109
+ startRecordingWithDownload(): void {
110
+ this.isRecordingWithDownload.set(true);
111
+ }
112
+
113
+ stopRecordingWithDownload(): void {
114
+ this.isRecordingWithDownload.set(false);
115
+ }
116
+
117
+ get claudeUrl(): string {
118
+ return this.aiPromptService.generateClaudeUrl();
119
+ }
120
+
121
+ get chatGptUrl(): string {
122
+ return this.aiPromptService.generateChatGptUrl();
123
+ }
124
+ }
@@ -40,6 +40,33 @@
40
40
  </h2>
41
41
 
42
42
  <div class="space-y-0 border-2 border-neutral-300 dark:border-neutral-700">
43
+ <!-- Audio Waveform Component -->
44
+ <article class="group border-b-2 border-neutral-300 dark:border-neutral-700 last:border-b-0" role="article"
45
+ aria-labelledby="audio-waveform-heading">
46
+ <a href="/documentation/components/audio-waveform"
47
+ class="block px-4 py-4 sm:py-5 bg-white dark:bg-[#0a0a0a] hover:bg-[#0a0a0a] dark:hover:bg-white transition-all duration-150 cursor-pointer"
48
+ aria-label="Navigate to Audio Waveform component documentation with real-time FFT analysis, responsive bar count, and audio recording">
49
+ <div class="flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3">
50
+ <div class="flex-1">
51
+ <div class="flex items-center gap-3 mb-2">
52
+ <h3 id="audio-waveform-heading"
53
+ class="text-base sm:text-lg font-bold text-[#0a0a0a] dark:text-white group-hover:text-white dark:group-hover:text-[#0a0a0a] uppercase tracking-wide transition-colors duration-150">
54
+ <span aria-hidden="true">&gt;_ </span>Audio Waveform
55
+ </h3>
56
+ <span class="text-[10px] font-bold bg-blue-500 text-white px-2 py-1 uppercase tracking-wider"
57
+ aria-label="Status: New Component">
58
+ NEW
59
+ </span>
60
+ </div>
61
+ <p
62
+ 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">
63
+ Real-time audio visualizer with Web Audio API, FFT frequency analysis, responsive bar count (mobile/desktop), 60fps animations, and automatic recording to WebM. Audio transcription coming soon.
64
+ </p>
65
+ </div>
66
+ </div>
67
+ </a>
68
+ </article>
69
+
43
70
  <!-- Breadcrumb Component -->
44
71
  <article class="group border-b-2 border-neutral-300 dark:border-neutral-700 last:border-b-0" role="article"
45
72
  aria-labelledby="breadcrumb-heading">
@@ -32,5 +32,9 @@ export const componentsRoutes: Routes = [
32
32
  {
33
33
  path: 'selection-popover',
34
34
  loadComponent: () => import('./selection-popover-docs/selection-popover-docs').then(m => m.SelectionPopoverDocs)
35
+ },
36
+ {
37
+ path: 'audio-waveform',
38
+ loadComponent: () => import('./audio-waveform-docs/audio-waveform-docs').then(m => m.AudioWaveformDocs)
35
39
  }
36
40
  ];
@@ -119,7 +119,7 @@
119
119
  </h4>
120
120
  <p
121
121
  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">
122
- Browse 4+ production-ready Angular components: Button, Input, Carousel, Breadcrumb
122
+ Browse 7+ production-ready Angular components: Button, Input, Carousel, Breadcrumb
123
123
  with TypeScript examples
124
124
  </p>
125
125
  </div>