wally-ui 1.14.1 → 1.16.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/dist/cli.js +0 -0
- package/package.json +1 -1
- package/playground/showcase/public/sitemap.xml +15 -0
- package/playground/showcase/src/app/app.routes.server.ts +8 -0
- package/playground/showcase/src/app/components/ai/ai-composer/ai-composer.html +11 -2
- package/playground/showcase/src/app/components/ai/ai-composer/ai-composer.ts +13 -3
- package/playground/showcase/src/app/components/audio-waveform/audio-waveform.css +0 -0
- package/playground/showcase/src/app/components/audio-waveform/audio-waveform.html +41 -0
- package/playground/showcase/src/app/components/audio-waveform/audio-waveform.service.spec.ts +16 -0
- package/playground/showcase/src/app/components/audio-waveform/audio-waveform.service.ts +175 -0
- package/playground/showcase/src/app/components/audio-waveform/audio-waveform.spec.ts +23 -0
- package/playground/showcase/src/app/components/audio-waveform/audio-waveform.ts +64 -0
- package/playground/showcase/src/app/components/combobox/combobox-content/combobox-content.css +0 -0
- package/playground/showcase/src/app/components/combobox/combobox-content/combobox-content.html +41 -0
- package/playground/showcase/src/app/components/combobox/combobox-content/combobox-content.spec.ts +228 -0
- package/playground/showcase/src/app/components/combobox/combobox-content/combobox-content.ts +217 -0
- package/playground/showcase/src/app/components/combobox/combobox-empty/combobox-empty.css +0 -0
- package/playground/showcase/src/app/components/combobox/combobox-empty/combobox-empty.html +3 -0
- package/playground/showcase/src/app/components/combobox/combobox-empty/combobox-empty.spec.ts +56 -0
- package/playground/showcase/src/app/components/combobox/combobox-empty/combobox-empty.ts +11 -0
- package/playground/showcase/src/app/components/combobox/combobox-group/combobox-group.css +0 -0
- package/playground/showcase/src/app/components/combobox/combobox-group/combobox-group.html +11 -0
- package/playground/showcase/src/app/components/combobox/combobox-group/combobox-group.spec.ts +57 -0
- package/playground/showcase/src/app/components/combobox/combobox-group/combobox-group.ts +11 -0
- package/playground/showcase/src/app/components/combobox/combobox-input/combobox-input.css +0 -0
- package/playground/showcase/src/app/components/combobox/combobox-input/combobox-input.html +71 -0
- package/playground/showcase/src/app/components/combobox/combobox-input/combobox-input.spec.ts +468 -0
- package/playground/showcase/src/app/components/combobox/combobox-input/combobox-input.ts +90 -0
- package/playground/showcase/src/app/components/combobox/combobox-item/combobox-item.css +0 -0
- package/playground/showcase/src/app/components/combobox/combobox-item/combobox-item.html +58 -0
- package/playground/showcase/src/app/components/combobox/combobox-item/combobox-item.spec.ts +173 -0
- package/playground/showcase/src/app/components/combobox/combobox-item/combobox-item.ts +37 -0
- package/playground/showcase/src/app/components/combobox/combobox-search/combobox-search.css +0 -0
- package/playground/showcase/src/app/components/combobox/combobox-search/combobox-search.html +11 -0
- package/playground/showcase/src/app/components/combobox/combobox-search/combobox-search.spec.ts +166 -0
- package/playground/showcase/src/app/components/combobox/combobox-search/combobox-search.ts +36 -0
- package/playground/showcase/src/app/components/combobox/combobox-trigger/combobox-trigger.css +0 -0
- package/playground/showcase/src/app/components/combobox/combobox-trigger/combobox-trigger.html +8 -0
- package/playground/showcase/src/app/components/combobox/combobox-trigger/combobox-trigger.spec.ts +137 -0
- package/playground/showcase/src/app/components/combobox/combobox-trigger/combobox-trigger.ts +30 -0
- package/playground/showcase/src/app/components/combobox/combobox.css +0 -0
- package/playground/showcase/src/app/components/combobox/combobox.html +3 -0
- package/playground/showcase/src/app/components/combobox/combobox.spec.ts +391 -0
- package/playground/showcase/src/app/components/combobox/combobox.ts +59 -0
- package/playground/showcase/src/app/components/combobox/lib/models/combobox.model.ts +13 -0
- package/playground/showcase/src/app/components/combobox/lib/service/combobox.service.spec.ts +530 -0
- package/playground/showcase/src/app/components/combobox/lib/service/combobox.service.ts +191 -0
- package/playground/showcase/src/app/components/combobox/lib/types/combobox-position.type.ts +1 -0
- package/playground/showcase/src/app/components/combobox/lib/types/combobox-trigger-mode.type.ts +1 -0
- package/playground/showcase/src/app/core/services/seo.service.ts +100 -0
- package/playground/showcase/src/app/pages/documentation/components/audio-waveform-docs/audio-waveform-docs.css +1 -0
- package/playground/showcase/src/app/pages/documentation/components/audio-waveform-docs/audio-waveform-docs.examples.ts +146 -0
- package/playground/showcase/src/app/pages/documentation/components/audio-waveform-docs/audio-waveform-docs.html +576 -0
- package/playground/showcase/src/app/pages/documentation/components/audio-waveform-docs/audio-waveform-docs.ts +124 -0
- package/playground/showcase/src/app/pages/documentation/components/combobox-docs/combobox-docs.component.css +0 -0
- package/playground/showcase/src/app/pages/documentation/components/combobox-docs/combobox-docs.component.html +383 -0
- package/playground/showcase/src/app/pages/documentation/components/combobox-docs/combobox-docs.component.spec.ts +23 -0
- package/playground/showcase/src/app/pages/documentation/components/combobox-docs/combobox-docs.component.ts +333 -0
- package/playground/showcase/src/app/pages/documentation/components/combobox-docs/combobox-docs.examples.ts +226 -0
- package/playground/showcase/src/app/pages/documentation/components/components.html +27 -0
- package/playground/showcase/src/app/pages/documentation/components/components.routes.ts +8 -0
- 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
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
<main class="min-h-dvh bg-white dark:bg-[#0a0a0a] " 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">>_ </span>Combobox
|
|
13
|
+
</h1>
|
|
14
|
+
<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">
|
|
15
|
+
A flexible combobox component with search, multi-select support, keyboard navigation, and intelligent viewport-aware positioning. Features input and custom trigger modes, item grouping, and zero external dependencies.
|
|
16
|
+
</p>
|
|
17
|
+
</header>
|
|
18
|
+
|
|
19
|
+
<!-- AI Assistant Links -->
|
|
20
|
+
<div class="flex flex-wrap gap-0 mt-6 mb-12 border-2 border-neutral-300 dark:border-neutral-700" role="list" aria-label="Open documentation in AI coding assistants">
|
|
21
|
+
<a [href]="claudeUrl" target="_blank"
|
|
22
|
+
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"
|
|
23
|
+
rel="noopener noreferrer" role="listitem" aria-label="Open Combobox component documentation in Claude AI assistant">
|
|
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" 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" />
|
|
26
|
+
</svg>
|
|
27
|
+
<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">
|
|
28
|
+
Open in Claude
|
|
29
|
+
</span>
|
|
30
|
+
</a>
|
|
31
|
+
|
|
32
|
+
<a [href]="chatGptUrl" target="_blank"
|
|
33
|
+
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"
|
|
34
|
+
rel="noopener noreferrer" role="listitem" aria-label="Open Combobox component documentation in ChatGPT AI assistant">
|
|
35
|
+
<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">
|
|
36
|
+
<path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round" d="M18.38 27.94v-14.4l11.19-6.46c6.2-3.58 17.3 5.25 12.64 13.33" />
|
|
37
|
+
<path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round" d="m18.38 20.94l12.47-7.2l11.19 6.46c6.2 3.58 4.1 17.61-5.23 17.61" />
|
|
38
|
+
<path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round" d="m24.44 17.44l12.47 7.2v12.93c0 7.16-13.2 12.36-17.86 4.28" />
|
|
39
|
+
<path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round" d="M30.5 21.2v14.14L19.31 41.8c-6.2 3.58-17.3-5.25-12.64-13.33" />
|
|
40
|
+
<path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round" 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" />
|
|
41
|
+
<path fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round" d="m24.44 31.44l-12.47-7.2V11.31c0-7.16 13.2-12.36 17.86-4.28" />
|
|
42
|
+
</svg>
|
|
43
|
+
<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">
|
|
44
|
+
Open in ChatGPT
|
|
45
|
+
</span>
|
|
46
|
+
</a>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<!-- Installation -->
|
|
50
|
+
<section id="installation" class="mb-12" aria-labelledby="installation-heading">
|
|
51
|
+
<h2 id="installation-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
52
|
+
[ Installation ]
|
|
53
|
+
</h2>
|
|
54
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
|
|
55
|
+
<pre><code [innerHTML]="installationCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
56
|
+
</div>
|
|
57
|
+
</section>
|
|
58
|
+
|
|
59
|
+
<!-- Import -->
|
|
60
|
+
<section id="import" class="mb-12" aria-labelledby="import-heading">
|
|
61
|
+
<h2 id="import-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
62
|
+
[ Import ]
|
|
63
|
+
</h2>
|
|
64
|
+
<div class="space-y-3">
|
|
65
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
|
|
66
|
+
<pre><code [innerHTML]="importCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
|
|
69
|
+
<pre><code [innerHTML]="componentImportCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</section>
|
|
73
|
+
|
|
74
|
+
<!-- Basic Usage -->
|
|
75
|
+
<section id="basic-usage" class="mb-12" aria-labelledby="basic-usage-heading">
|
|
76
|
+
<h2 id="basic-usage-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
77
|
+
[ Basic Usage ]
|
|
78
|
+
</h2>
|
|
79
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
|
|
80
|
+
<pre><code [innerHTML]="basicUsageCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
|
|
83
|
+
<pre><code [innerHTML]="componentSetupCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="border-2 border-neutral-300 dark:border-neutral-700 p-6 bg-white dark:bg-[#0a0a0a]">
|
|
86
|
+
<wally-combobox
|
|
87
|
+
[data]="fruits"
|
|
88
|
+
placeholder="Select a fruit..."
|
|
89
|
+
(selectionChange)="onSingleSelectionChange($event)">
|
|
90
|
+
<wally-combobox-input></wally-combobox-input>
|
|
91
|
+
<wally-combobox-content></wally-combobox-content>
|
|
92
|
+
</wally-combobox>
|
|
93
|
+
@if (singleSelection.length > 0) {
|
|
94
|
+
<div class="mt-4 text-sm text-neutral-600 dark:text-neutral-400">
|
|
95
|
+
Selected: <strong>{{ singleSelection[0].label }}</strong>
|
|
96
|
+
</div>
|
|
97
|
+
}
|
|
98
|
+
</div>
|
|
99
|
+
</section>
|
|
100
|
+
|
|
101
|
+
<!-- Multi-Select -->
|
|
102
|
+
<section id="multi-select" class="mb-12" aria-labelledby="multi-select-heading">
|
|
103
|
+
<h2 id="multi-select-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
104
|
+
[ Multi-Select ]
|
|
105
|
+
</h2>
|
|
106
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
|
|
107
|
+
<pre><code [innerHTML]="multiSelectCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
|
|
110
|
+
<pre><code [innerHTML]="multiSelectSetupCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
111
|
+
</div>
|
|
112
|
+
<div class="border-2 border-neutral-300 dark:border-neutral-700 p-6 bg-white dark:bg-[#0a0a0a]">
|
|
113
|
+
<wally-combobox
|
|
114
|
+
[data]="countries"
|
|
115
|
+
[multiSelect]="true"
|
|
116
|
+
[closeOnSelect]="false"
|
|
117
|
+
(selectionChange)="onMultiSelectionChange($event)">
|
|
118
|
+
<wally-combobox-input></wally-combobox-input>
|
|
119
|
+
<wally-combobox-content></wally-combobox-content>
|
|
120
|
+
</wally-combobox>
|
|
121
|
+
@if (multiSelection.length > 0) {
|
|
122
|
+
<div class="mt-4 text-sm text-neutral-600 dark:text-neutral-400">
|
|
123
|
+
{{ multiSelection.length }} countries selected
|
|
124
|
+
</div>
|
|
125
|
+
}
|
|
126
|
+
</div>
|
|
127
|
+
</section>
|
|
128
|
+
|
|
129
|
+
<!-- Grouped Items -->
|
|
130
|
+
<section id="grouped-items" class="mb-12" aria-labelledby="grouped-items-heading">
|
|
131
|
+
<h2 id="grouped-items-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
132
|
+
[ Grouped Items ]
|
|
133
|
+
</h2>
|
|
134
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
|
|
135
|
+
<pre><code [innerHTML]="groupedItemsCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
136
|
+
</div>
|
|
137
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
|
|
138
|
+
<pre><code [innerHTML]="groupedItemsSetupCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
139
|
+
</div>
|
|
140
|
+
<div class="border-2 border-neutral-300 dark:border-neutral-700 p-6 bg-white dark:bg-[#0a0a0a]">
|
|
141
|
+
<wally-combobox
|
|
142
|
+
[data]="programmingLanguages"
|
|
143
|
+
groupBy="group"
|
|
144
|
+
(selectionChange)="onGroupedSelectionChange($event)">
|
|
145
|
+
<wally-combobox-input></wally-combobox-input>
|
|
146
|
+
<wally-combobox-content></wally-combobox-content>
|
|
147
|
+
</wally-combobox>
|
|
148
|
+
@if (groupedSelection.length > 0) {
|
|
149
|
+
<div class="mt-4 text-sm text-neutral-600 dark:text-neutral-400">
|
|
150
|
+
Selected: <strong>{{ groupedSelection[0].label }}</strong>
|
|
151
|
+
@if (groupedSelection[0].group) {
|
|
152
|
+
<span class="text-xs ml-2 text-neutral-500 dark:text-neutral-500">({{ groupedSelection[0].group }})</span>
|
|
153
|
+
}
|
|
154
|
+
</div>
|
|
155
|
+
}
|
|
156
|
+
</div>
|
|
157
|
+
</section>
|
|
158
|
+
|
|
159
|
+
<!-- Custom Trigger -->
|
|
160
|
+
<section id="custom-trigger" class="mb-12" aria-labelledby="custom-trigger-heading">
|
|
161
|
+
<h2 id="custom-trigger-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
162
|
+
[ Custom Trigger ]
|
|
163
|
+
</h2>
|
|
164
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
|
|
165
|
+
<pre><code [innerHTML]="customTriggerCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
166
|
+
</div>
|
|
167
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3 mb-4">
|
|
168
|
+
<pre><code [innerHTML]="customTriggerSetupCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="border-2 border-neutral-300 dark:border-neutral-700 p-6 bg-white dark:bg-[#0a0a0a]">
|
|
171
|
+
<wally-combobox
|
|
172
|
+
[data]="programmingLanguages"
|
|
173
|
+
triggerMode="custom"
|
|
174
|
+
(selectionChange)="onCustomTriggerSelectionChange($event)">
|
|
175
|
+
<wally-combobox-trigger>
|
|
176
|
+
<wally-button variant="outline">
|
|
177
|
+
@if (customTriggerSelection.length > 0) {
|
|
178
|
+
{{ customTriggerSelection[0].label }}
|
|
179
|
+
} @else {
|
|
180
|
+
Select a language
|
|
181
|
+
}
|
|
182
|
+
</wally-button>
|
|
183
|
+
</wally-combobox-trigger>
|
|
184
|
+
<wally-combobox-content></wally-combobox-content>
|
|
185
|
+
</wally-combobox>
|
|
186
|
+
</div>
|
|
187
|
+
</section>
|
|
188
|
+
|
|
189
|
+
<!-- API Reference -->
|
|
190
|
+
<section id="api-reference" class="mb-12" aria-labelledby="api-heading">
|
|
191
|
+
<h2 id="api-heading"
|
|
192
|
+
class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
193
|
+
[ API Reference ]
|
|
194
|
+
</h2>
|
|
195
|
+
|
|
196
|
+
<!-- Combobox Props -->
|
|
197
|
+
<article class="mb-8" aria-labelledby="combobox-props-heading">
|
|
198
|
+
<h3 id="combobox-props-heading"
|
|
199
|
+
class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
|
|
200
|
+
<span aria-hidden="true">> </span>Combobox Props & Events
|
|
201
|
+
</h3>
|
|
202
|
+
<div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
|
|
203
|
+
<div class="overflow-x-auto">
|
|
204
|
+
<table class="w-full text-sm">
|
|
205
|
+
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
206
|
+
<tr>
|
|
207
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Property</th>
|
|
208
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Type</th>
|
|
209
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Default</th>
|
|
210
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Description</th>
|
|
211
|
+
</tr>
|
|
212
|
+
</thead>
|
|
213
|
+
<tbody class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
214
|
+
<tr>
|
|
215
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">data</td>
|
|
216
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">ComboboxInterface[]</td>
|
|
217
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">[]</td>
|
|
218
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Array of items to display in the dropdown</td>
|
|
219
|
+
</tr>
|
|
220
|
+
<tr>
|
|
221
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">multiSelect</td>
|
|
222
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
|
|
223
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
|
|
224
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Enable multi-select mode with chips</td>
|
|
225
|
+
</tr>
|
|
226
|
+
<tr>
|
|
227
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">triggerMode</td>
|
|
228
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">'input' | 'custom'</td>
|
|
229
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">'input'</td>
|
|
230
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">How the combobox is triggered - input field or custom trigger</td>
|
|
231
|
+
</tr>
|
|
232
|
+
<tr>
|
|
233
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">groupBy</td>
|
|
234
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">string | null</td>
|
|
235
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">null</td>
|
|
236
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Property name to group items by (enables grouping with category headers)</td>
|
|
237
|
+
</tr>
|
|
238
|
+
<tr>
|
|
239
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">placeholder</td>
|
|
240
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
|
|
241
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">'Search...'</td>
|
|
242
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Placeholder text for the input field</td>
|
|
243
|
+
</tr>
|
|
244
|
+
<tr>
|
|
245
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">closeOnSelect</td>
|
|
246
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
|
|
247
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">true</td>
|
|
248
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Whether to close dropdown after item selection</td>
|
|
249
|
+
</tr>
|
|
250
|
+
<tr>
|
|
251
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">disabled</td>
|
|
252
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">boolean</td>
|
|
253
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">false</td>
|
|
254
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Disable the combobox</td>
|
|
255
|
+
</tr>
|
|
256
|
+
<tr>
|
|
257
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">(selectionChange)</td>
|
|
258
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">OutputEmitterRef<ComboboxInterface[]></td>
|
|
259
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">-</td>
|
|
260
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Emitted when selection changes. Returns array of selected items</td>
|
|
261
|
+
</tr>
|
|
262
|
+
</tbody>
|
|
263
|
+
</table>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
</article>
|
|
267
|
+
|
|
268
|
+
<!-- ComboboxContent Props -->
|
|
269
|
+
<article class="mb-8" aria-labelledby="content-props-heading">
|
|
270
|
+
<h3 id="content-props-heading"
|
|
271
|
+
class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
|
|
272
|
+
<span aria-hidden="true">> </span>ComboboxContent Props
|
|
273
|
+
</h3>
|
|
274
|
+
<div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
|
|
275
|
+
<div class="overflow-x-auto">
|
|
276
|
+
<table class="w-full text-sm">
|
|
277
|
+
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
278
|
+
<tr>
|
|
279
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Property</th>
|
|
280
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Type</th>
|
|
281
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Default</th>
|
|
282
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Description</th>
|
|
283
|
+
</tr>
|
|
284
|
+
</thead>
|
|
285
|
+
<tbody class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
286
|
+
<tr>
|
|
287
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">position</td>
|
|
288
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">'top' | 'bottom'</td>
|
|
289
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">'bottom'</td>
|
|
290
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Preferred dropdown position. Auto-adjusts based on available viewport space</td>
|
|
291
|
+
</tr>
|
|
292
|
+
</tbody>
|
|
293
|
+
</table>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
</article>
|
|
297
|
+
|
|
298
|
+
<!-- ComboboxInterface Type -->
|
|
299
|
+
<article class="mb-8" aria-labelledby="interface-heading">
|
|
300
|
+
<h3 id="interface-heading"
|
|
301
|
+
class="text-sm sm:text-base font-bold text-[#0a0a0a] dark:text-white mb-4 uppercase">
|
|
302
|
+
<span aria-hidden="true">> </span>ComboboxInterface
|
|
303
|
+
</h3>
|
|
304
|
+
<div class="bg-white dark:bg-[#0f0f0f] border-2 border-neutral-300 dark:border-neutral-800 overflow-hidden">
|
|
305
|
+
<div class="overflow-x-auto">
|
|
306
|
+
<table class="w-full text-sm">
|
|
307
|
+
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
308
|
+
<tr>
|
|
309
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Property</th>
|
|
310
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Type</th>
|
|
311
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Required</th>
|
|
312
|
+
<th class="text-left p-4 font-medium text-gray-900 dark:text-gray-100">Description</th>
|
|
313
|
+
</tr>
|
|
314
|
+
</thead>
|
|
315
|
+
<tbody class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
316
|
+
<tr>
|
|
317
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">value</td>
|
|
318
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">any</td>
|
|
319
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">Yes</td>
|
|
320
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Unique identifier for the item</td>
|
|
321
|
+
</tr>
|
|
322
|
+
<tr>
|
|
323
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">label</td>
|
|
324
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
|
|
325
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">Yes</td>
|
|
326
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Display text for the item</td>
|
|
327
|
+
</tr>
|
|
328
|
+
<tr>
|
|
329
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">description</td>
|
|
330
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
|
|
331
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">No</td>
|
|
332
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Optional description text shown below the label</td>
|
|
333
|
+
</tr>
|
|
334
|
+
<tr>
|
|
335
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">group</td>
|
|
336
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">string</td>
|
|
337
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">No</td>
|
|
338
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Group name for categorizing items (used with groupBy prop)</td>
|
|
339
|
+
</tr>
|
|
340
|
+
<tr>
|
|
341
|
+
<td class="p-4 font-mono text-blue-600 dark:text-blue-400">[key: string]</td>
|
|
342
|
+
<td class="p-4 font-mono text-purple-600 dark:text-purple-400">any</td>
|
|
343
|
+
<td class="p-4 font-mono text-green-600 dark:text-green-400">No</td>
|
|
344
|
+
<td class="p-4 text-gray-700 dark:text-gray-300">Additional custom properties can be added</td>
|
|
345
|
+
</tr>
|
|
346
|
+
</tbody>
|
|
347
|
+
</table>
|
|
348
|
+
</div>
|
|
349
|
+
</div>
|
|
350
|
+
</article>
|
|
351
|
+
</section>
|
|
352
|
+
|
|
353
|
+
<!-- Keyboard Navigation -->
|
|
354
|
+
<section id="keyboard-navigation" class="mb-12" aria-labelledby="keyboard-navigation-heading">
|
|
355
|
+
<h2 id="keyboard-navigation-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
356
|
+
[ Keyboard Navigation ]
|
|
357
|
+
</h2>
|
|
358
|
+
<div class="bg-neutral-100 dark:bg-[#121212] border border-neutral-300 dark:border-neutral-700 p-3">
|
|
359
|
+
<pre><code [innerHTML]="keyboardNavigationCode" class="text-xs sm:text-sm text-[#0a0a0a] dark:text-white"></code></pre>
|
|
360
|
+
</div>
|
|
361
|
+
</section>
|
|
362
|
+
|
|
363
|
+
<!-- Features -->
|
|
364
|
+
<section id="features" class="mb-12" aria-labelledby="features-heading">
|
|
365
|
+
<h2 id="features-heading" class="text-[10px] sm:text-xs text-neutral-500 dark:text-neutral-500 uppercase tracking-wider mb-4">
|
|
366
|
+
[ Features ]
|
|
367
|
+
</h2>
|
|
368
|
+
<ul class="list-disc list-inside text-sm text-neutral-600 dark:text-neutral-400 space-y-2 border-l-2 border-neutral-300 dark:border-neutral-700 pl-4">
|
|
369
|
+
<li>Intelligent viewport-aware positioning (auto-adjusts based on available space)</li>
|
|
370
|
+
<li>Real-time position recalculation on window resize</li>
|
|
371
|
+
<li>Multi-select with chips inside input</li>
|
|
372
|
+
<li>Integrated search/filter functionality</li>
|
|
373
|
+
<li>Complete keyboard navigation support</li>
|
|
374
|
+
<li>Item grouping with category headers</li>
|
|
375
|
+
<li>Virtual scrolling for large datasets (1000+ items)</li>
|
|
376
|
+
<li>Dark mode supported</li>
|
|
377
|
+
<li>Click outside to close</li>
|
|
378
|
+
<li>Zero external dependencies (Tailwind only)</li>
|
|
379
|
+
</ul>
|
|
380
|
+
</section>
|
|
381
|
+
|
|
382
|
+
</div>
|
|
383
|
+
</main>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
2
|
+
|
|
3
|
+
import { ComboboxDocsComponent } from './combobox-docs.component';
|
|
4
|
+
|
|
5
|
+
describe('ComboboxDocsComponent', () => {
|
|
6
|
+
let component: ComboboxDocsComponent;
|
|
7
|
+
let fixture: ComponentFixture<ComboboxDocsComponent>;
|
|
8
|
+
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
await TestBed.configureTestingModule({
|
|
11
|
+
imports: [ComboboxDocsComponent]
|
|
12
|
+
})
|
|
13
|
+
.compileComponents();
|
|
14
|
+
|
|
15
|
+
fixture = TestBed.createComponent(ComboboxDocsComponent);
|
|
16
|
+
component = fixture.componentInstance;
|
|
17
|
+
fixture.detectChanges();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should create', () => {
|
|
21
|
+
expect(component).toBeTruthy();
|
|
22
|
+
});
|
|
23
|
+
});
|