@ah-oh/ao-workspaces-design-system 0.0.49 → 0.0.51

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.
@@ -2902,6 +2902,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
2902
2902
  }, template: "<nav class=\"side-nav\" role=\"navigation\" aria-label=\"Side navigation\">\n <div class=\"side-nav__header\">\n <div class=\"side-nav__logo\">\n <ng-content select=\"[aoSideNavLogo]\" />\n </div>\n </div>\n\n <ul class=\"side-nav__list\" role=\"menu\">\n @for (item of items(); track item.id) {\n @if (item.separator) {\n <li role=\"separator\" class=\"side-nav__separator\"></li>\n } @else {\n <li role=\"none\">\n <a\n class=\"side-nav__item\"\n [class.side-nav__item--active]=\"item.id === activeItemId()\"\n [class.side-nav__item--disabled]=\"item.disabled\"\n [class.side-nav__item--highlight]=\"item.highlight\"\n [attr.href]=\"item.route ?? null\"\n [attr.data-nav-id]=\"item.id\"\n [attr.aria-current]=\"item.id === activeItemId() ? 'page' : null\"\n [attr.aria-disabled]=\"item.disabled || null\"\n [attr.tabindex]=\"item.disabled ? -1 : 0\"\n [attr.title]=\"item.tooltip ?? item.label\"\n role=\"menuitem\"\n (click)=\"$event.preventDefault(); onItemClick(item)\"\n (keydown)=\"onKeydown($event, item)\"\n >\n @if (item.icon) {\n <ao-icon [svg]=\"item.icon\" size=\"sm\" class=\"side-nav__icon\" />\n }\n <span class=\"side-nav__label\">{{ item.label }}</span>\n </a>\n </li>\n }\n }\n </ul>\n\n @if (bottomItems().length > 0) {\n <div class=\"side-nav__bottom\">\n @for (item of bottomItems(); track item.id) {\n <button\n type=\"button\"\n class=\"side-nav__bottom-item\"\n [class.side-nav__bottom-item--disabled]=\"item.disabled\"\n [attr.data-nav-id]=\"item.id\"\n [attr.aria-disabled]=\"item.disabled || null\"\n [attr.title]=\"item.tooltip ?? item.label\"\n [disabled]=\"item.disabled\"\n (click)=\"onBottomItemClick(item)\"\n >\n @if (item.icon) {\n <ao-icon [svg]=\"item.icon\" size=\"lg\" />\n }\n </button>\n }\n </div>\n }\n</nav>\n", styles: [":host{position:fixed;top:0;left:0;z-index:4;display:block;width:70px;height:100vh;background-color:#fff;border-right:1px solid #e9e9e9}:host.ao-side-nav--expanded{width:140px}.side-nav{display:flex;flex-direction:column;height:100%}.side-nav__header{display:flex;align-items:center;justify-content:center;height:50px;padding:0 20px}.side-nav__logo{display:flex;align-items:center;justify-content:center}.side-nav__list{display:flex;flex-direction:column;gap:20px;flex:1;list-style:none;margin:0;padding:30px 0}.side-nav__item{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2.5px;width:100%;min-height:40px;padding:5px 20px;border:none;border-left:3px solid transparent;background:transparent;color:#212121;text-decoration:none;cursor:pointer;transition:border-color .2s ease,color .2s ease,background-color .2s ease;box-sizing:border-box;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0}.side-nav__item:hover:not(.side-nav__item--disabled){background-color:#e9e9e9}.side-nav__item:focus-visible{outline:3px solid #ff004d;outline-offset:-3px}:host(.ao-side-nav--expanded) .side-nav__item{flex-direction:row;justify-content:flex-start;gap:10px;padding:10px 15px}.side-nav__item--active{color:#ff004d;border-left-color:#ff004d;background-color:#ff004d0d}.side-nav__item--disabled{color:#909090;cursor:not-allowed}.side-nav__item--highlight,.side-nav__item--highlight .side-nav__icon{color:#ff004d}.side-nav__separator{height:0;margin:10px 20px;border:none;border-top:1px solid #e9e9e9}.side-nav__icon{flex-shrink:0}.side-nav__label{text-align:center}:host(.ao-side-nav--expanded) .side-nav__label{text-align:left;white-space:nowrap}.side-nav__bottom{display:flex;flex-direction:column;padding-bottom:50px}.side-nav__bottom-item{display:flex;align-items:center;justify-content:center;width:100%;height:50px;padding:0 20px;border:none;background:transparent;color:#212121;cursor:pointer;transition:background-color .2s ease,color .2s ease}.side-nav__bottom-item:hover:not(:disabled){background-color:#e9e9e9}.side-nav__bottom-item:focus-visible{outline:3px solid #ff004d;outline-offset:-3px}.side-nav__bottom-item:disabled{color:#909090;cursor:not-allowed}.side-nav__bottom-item--active{color:#ff004d}\n"] }]
2903
2903
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], bottomItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "bottomItems", required: false }] }], activeItemId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeItemId", required: false }] }, { type: i0.Output, args: ["activeItemIdChange"] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], itemChange: [{ type: i0.Output, args: ["itemChange"] }], bottomItemClick: [{ type: i0.Output, args: ["bottomItemClick"] }] } });
2904
2904
 
2905
+ const MAX_VISIBLE_RESULTS = 10;
2905
2906
  class AiSearchComponent {
2906
2907
  sanitizer = inject(DomSanitizer);
2907
2908
  hostRef = inject((ElementRef));
@@ -2916,6 +2917,7 @@ class AiSearchComponent {
2916
2917
  loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
2917
2918
  error = input(null, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
2918
2919
  panelOpen = model(false, ...(ngDevMode ? [{ debugName: "panelOpen" }] : /* istanbul ignore next */ []));
2920
+ voiceLanguage = input('de-DE', ...(ngDevMode ? [{ debugName: "voiceLanguage" }] : /* istanbul ignore next */ []));
2919
2921
  submit = output();
2920
2922
  voiceStart = output();
2921
2923
  queryChange = output();
@@ -2930,10 +2932,53 @@ class AiSearchComponent {
2930
2932
  caretRightIcon = phosphorCaretRight;
2931
2933
  arrowRightIcon = phosphorArrowRight;
2932
2934
  closeIcon = phosphorX;
2935
+ isVoiceRecording = signal(false, ...(ngDevMode ? [{ debugName: "isVoiceRecording" }] : /* istanbul ignore next */ []));
2936
+ voiceError = signal(null, ...(ngDevMode ? [{ debugName: "voiceError" }] : /* istanbul ignore next */ []));
2937
+ voiceButtonLabel = computed(() => this.isVoiceRecording() ? 'Voice input stoppen' : 'Voice input starten', ...(ngDevMode ? [{ debugName: "voiceButtonLabel" }] : /* istanbul ignore next */ []));
2938
+ effectiveError = computed(() => this.voiceError() ?? this.error(), ...(ngDevMode ? [{ debugName: "effectiveError" }] : /* istanbul ignore next */ []));
2933
2939
  searchInput = viewChild('searchInput', ...(ngDevMode ? [{ debugName: "searchInput" }] : /* istanbul ignore next */ []));
2934
- hasAnyResults = computed(() => this.resultGroups().length > 0 ||
2935
- this.aiSuggestions().length > 0 ||
2936
- this.pageSuggestion() !== null, ...(ngDevMode ? [{ debugName: "hasAnyResults" }] : /* istanbul ignore next */ []));
2940
+ speechRecognition = null;
2941
+ currentVoiceTranscript = '';
2942
+ visibleResultGroups = computed(() => {
2943
+ let remaining = MAX_VISIBLE_RESULTS;
2944
+ return this.resultGroups().reduce((groups, group) => {
2945
+ if (remaining <= 0) {
2946
+ return groups;
2947
+ }
2948
+ const results = group.results.slice(0, remaining);
2949
+ if (results.length === 0) {
2950
+ return groups;
2951
+ }
2952
+ remaining -= results.length;
2953
+ groups.push({ ...group, results });
2954
+ return groups;
2955
+ }, []);
2956
+ }, ...(ngDevMode ? [{ debugName: "visibleResultGroups" }] : /* istanbul ignore next */ []));
2957
+ visibleAiSuggestions = computed(() => {
2958
+ const visibleGroupCount = this.visibleResultGroups().reduce((total, group) => total + group.results.length, 0);
2959
+ const remaining = Math.max(MAX_VISIBLE_RESULTS - visibleGroupCount, 0);
2960
+ return this.aiSuggestions().slice(0, remaining);
2961
+ }, ...(ngDevMode ? [{ debugName: "visibleAiSuggestions" }] : /* istanbul ignore next */ []));
2962
+ visibleResultCount = computed(() => this.visibleResultGroups().reduce((total, group) => total + group.results.length, 0) +
2963
+ this.visibleAiSuggestions().length, ...(ngDevMode ? [{ debugName: "visibleResultCount" }] : /* istanbul ignore next */ []));
2964
+ totalResultCount = computed(() => this.resultGroups().reduce((total, group) => total + this.getGroupResultCount(group), 0) +
2965
+ this.aiSuggestions().length, ...(ngDevMode ? [{ debugName: "totalResultCount" }] : /* istanbul ignore next */ []));
2966
+ hasMoreResults = computed(() => this.totalResultCount() > MAX_VISIBLE_RESULTS, ...(ngDevMode ? [{ debugName: "hasMoreResults" }] : /* istanbul ignore next */ []));
2967
+ resultSummary = computed(() => {
2968
+ const total = this.totalResultCount();
2969
+ if (total === 1) {
2970
+ return '1 Ergebnis';
2971
+ }
2972
+ if (this.hasMoreResults()) {
2973
+ return `${this.visibleResultCount()} von ${total} Ergebnissen`;
2974
+ }
2975
+ return `${total} Ergebnisse`;
2976
+ }, ...(ngDevMode ? [{ debugName: "resultSummary" }] : /* istanbul ignore next */ []));
2977
+ hasAnyResults = computed(() => this.totalResultCount() > 0 || this.pageSuggestion() !== null, ...(ngDevMode ? [{ debugName: "hasAnyResults" }] : /* istanbul ignore next */ []));
2978
+ showNoResults = computed(() => this.value().trim().length > 0 &&
2979
+ !this.loading() &&
2980
+ this.effectiveError() === null &&
2981
+ !this.hasAnyResults(), ...(ngDevMode ? [{ debugName: "showNoResults" }] : /* istanbul ignore next */ []));
2937
2982
  showRecommendedFilters = computed(() => this.activeFilter() === null && this.recommendedFilters().length > 0, ...(ngDevMode ? [{ debugName: "showRecommendedFilters" }] : /* istanbul ignore next */ []));
2938
2983
  effectivePlaceholder = computed(() => {
2939
2984
  const filter = this.activeFilter();
@@ -2943,10 +2988,13 @@ class AiSearchComponent {
2943
2988
  return this.placeholder();
2944
2989
  }, ...(ngDevMode ? [{ debugName: "effectivePlaceholder" }] : /* istanbul ignore next */ []));
2945
2990
  hasPanelContent = computed(() => {
2991
+ if (this.effectiveError() !== null) {
2992
+ return true;
2993
+ }
2946
2994
  if (this.value().length === 0) {
2947
2995
  return this.showRecommendedFilters();
2948
2996
  }
2949
- return this.hasAnyResults() || this.loading() || this.error() !== null;
2997
+ return this.hasAnyResults() || this.loading() || this.showNoResults();
2950
2998
  }, ...(ngDevMode ? [{ debugName: "hasPanelContent" }] : /* istanbul ignore next */ []));
2951
2999
  onDocumentClick(event) {
2952
3000
  if (!this.panelOpen()) {
@@ -2963,6 +3011,7 @@ class AiSearchComponent {
2963
3011
  onInput(event) {
2964
3012
  const inputEl = event.target;
2965
3013
  const next = inputEl.value;
3014
+ this.voiceError.set(null);
2966
3015
  this.value.set(next);
2967
3016
  this.panelOpen.set(true);
2968
3017
  this.queryChange.emit(next);
@@ -2984,7 +3033,15 @@ class AiSearchComponent {
2984
3033
  }
2985
3034
  }
2986
3035
  onVoiceClick() {
3036
+ if (this.disabled()) {
3037
+ return;
3038
+ }
3039
+ if (this.isVoiceRecording()) {
3040
+ this.stopVoiceRecognition();
3041
+ return;
3042
+ }
2987
3043
  this.voiceStart.emit();
3044
+ this.startVoiceRecognition();
2988
3045
  }
2989
3046
  onFilterClick(filter) {
2990
3047
  this.activeFilter.set(filter);
@@ -3020,12 +3077,90 @@ class AiSearchComponent {
3020
3077
  }
3021
3078
  const escaped = this.escapeHtml(text);
3022
3079
  const pattern = new RegExp(this.escapeRegex(query), 'gi');
3023
- const highlighted = escaped.replace(pattern, (match) => `<mark class="ai-search__hl">${match}</mark>`);
3080
+ const highlighted = escaped.replace(pattern, match => `<mark class="ai-search__hl">${match}</mark>`);
3024
3081
  return this.sanitizer.bypassSecurityTrustHtml(highlighted);
3025
3082
  }
3026
3083
  focus() {
3027
3084
  this.searchInput()?.nativeElement.focus();
3028
3085
  }
3086
+ startVoiceRecognition() {
3087
+ const Recognition = this.getSpeechRecognitionFactory();
3088
+ if (Recognition === null) {
3089
+ this.showVoiceError('Spracheingabe wird von diesem Browser nicht unterstützt');
3090
+ return;
3091
+ }
3092
+ try {
3093
+ const recognition = new Recognition();
3094
+ this.currentVoiceTranscript = '';
3095
+ recognition.continuous = false;
3096
+ recognition.interimResults = true;
3097
+ recognition.lang = this.voiceLanguage();
3098
+ recognition.onresult = (event) => this.handleVoiceResult(event);
3099
+ recognition.onerror = (event) => this.handleVoiceError(event);
3100
+ recognition.onend = () => this.handleVoiceEnd();
3101
+ this.speechRecognition = recognition;
3102
+ this.isVoiceRecording.set(true);
3103
+ this.voiceError.set(null);
3104
+ recognition.start();
3105
+ }
3106
+ catch (err) {
3107
+ console.warn('[AiSearch] voice input failed', err);
3108
+ this.showVoiceError('Spracheingabe konnte nicht gestartet werden');
3109
+ }
3110
+ }
3111
+ stopVoiceRecognition() {
3112
+ this.speechRecognition?.stop();
3113
+ }
3114
+ handleVoiceResult(event) {
3115
+ const transcript = this.getTranscript(event);
3116
+ if (!transcript) {
3117
+ return;
3118
+ }
3119
+ this.currentVoiceTranscript = transcript;
3120
+ this.value.set(transcript);
3121
+ this.panelOpen.set(true);
3122
+ this.voiceError.set(null);
3123
+ this.queryChange.emit(transcript);
3124
+ }
3125
+ handleVoiceError(event) {
3126
+ if (event.error === 'no-speech') {
3127
+ this.showVoiceError('Keine Sprache erkannt');
3128
+ return;
3129
+ }
3130
+ this.showVoiceError('Spracheingabe fehlgeschlagen');
3131
+ }
3132
+ handleVoiceEnd() {
3133
+ const query = this.currentVoiceTranscript.trim();
3134
+ this.isVoiceRecording.set(false);
3135
+ this.speechRecognition = null;
3136
+ this.currentVoiceTranscript = '';
3137
+ if (!query) {
3138
+ return;
3139
+ }
3140
+ this.submit.emit({ query, isVoiceInput: true, filter: this.activeFilter() });
3141
+ this.panelOpen.set(false);
3142
+ }
3143
+ getTranscript(event) {
3144
+ const parts = [];
3145
+ for (let i = 0; i < event.results.length; i++) {
3146
+ const result = event.results.item(i);
3147
+ if (result.length > 0) {
3148
+ parts.push(result.item(0).transcript);
3149
+ }
3150
+ }
3151
+ return parts.join(' ').trim();
3152
+ }
3153
+ getSpeechRecognitionFactory() {
3154
+ const scope = globalThis;
3155
+ return scope.SpeechRecognition ?? scope.webkitSpeechRecognition ?? null;
3156
+ }
3157
+ showVoiceError(message) {
3158
+ this.isVoiceRecording.set(false);
3159
+ this.currentVoiceTranscript = '';
3160
+ this.speechRecognition = null;
3161
+ this.voiceError.set(message);
3162
+ this.panelOpen.set(true);
3163
+ }
3029
3164
  clearActiveFilter() {
3030
3165
  if (this.activeFilter() === null) {
3031
3166
  return;
@@ -3033,6 +3168,9 @@ class AiSearchComponent {
3033
3168
  this.activeFilter.set(null);
3034
3169
  this.filterClear.emit();
3035
3170
  }
3171
+ getGroupResultCount(group) {
3172
+ return Math.max(group.totalCount ?? 0, group.results.length);
3173
+ }
3036
3174
  escapeHtml(text) {
3037
3175
  return text
3038
3176
  .replace(/&/g, '&amp;')
@@ -3045,14 +3183,14 @@ class AiSearchComponent {
3045
3183
  return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
3046
3184
  }
3047
3185
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: AiSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3048
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: AiSearchComponent, isStandalone: true, selector: "ao-ai-search", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, recommendedFilters: { classPropertyName: "recommendedFilters", publicName: "recommendedFilters", isSignal: true, isRequired: false, transformFunction: null }, activeFilter: { classPropertyName: "activeFilter", publicName: "activeFilter", isSignal: true, isRequired: false, transformFunction: null }, resultGroups: { classPropertyName: "resultGroups", publicName: "resultGroups", isSignal: true, isRequired: false, transformFunction: null }, pageSuggestion: { classPropertyName: "pageSuggestion", publicName: "pageSuggestion", isSignal: true, isRequired: false, transformFunction: null }, aiSuggestions: { classPropertyName: "aiSuggestions", publicName: "aiSuggestions", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, panelOpen: { classPropertyName: "panelOpen", publicName: "panelOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", activeFilter: "activeFilterChange", panelOpen: "panelOpenChange", submit: "submit", voiceStart: "voiceStart", queryChange: "queryChange", filterSelect: "filterSelect", filterClear: "filterClear", resultSelect: "resultSelect", aiSuggestionSelect: "aiSuggestionSelect", pageSuggestionSelect: "pageSuggestionSelect", viewAllClick: "viewAllClick" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "ao-ai-search" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ai-search\" [class.ai-search--open]=\"panelOpen() && hasPanelContent()\">\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"ai-search__icon-left\" />\n @if (activeFilter(); as f) {\n <span class=\"ai-search__active-chip\" role=\"status\">\n <span class=\"ai-search__active-chip-label\">{{ f.label }}</span>\n <button\n type=\"button\"\n class=\"ai-search__active-chip-remove\"\n [disabled]=\"disabled()\"\n (click)=\"onChipRemove($event)\"\n [attr.aria-label]=\"'Filter ' + f.label + ' entfernen'\"\n >\n <ao-icon [svg]=\"closeIcon\" size=\"xs\" />\n </button>\n </span>\n }\n <input\n #searchInput\n type=\"text\"\n class=\"ai-search__input\"\n [placeholder]=\"effectivePlaceholder()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput($event)\"\n (keydown.enter)=\"onEnter()\"\n (keydown.escape)=\"onEscape()\"\n (keydown.backspace)=\"onBackspace($event)\"\n aria-label=\"AI Search\"\n autocomplete=\"off\"\n />\n <button\n type=\"button\"\n class=\"ai-search__voice-btn\"\n [disabled]=\"disabled()\"\n (click)=\"onVoiceClick()\"\n aria-label=\"Voice input\"\n >\n <ao-icon [svg]=\"micIcon\" size=\"sm\" />\n </button>\n</div>\n\n@if (panelOpen() && hasPanelContent()) {\n <div class=\"ai-search__panel\" role=\"listbox\">\n @if (value().length === 0) {\n @if (showRecommendedFilters()) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">Empfohlene Filter</h4>\n <div class=\"ai-search__filter-chips\">\n @for (f of recommendedFilters(); track f.id) {\n <button\n type=\"button\"\n class=\"ai-search__filter-chip\"\n (click)=\"onFilterClick(f)\"\n >\n {{ f.label }}\n </button>\n }\n </div>\n </div>\n }\n } @else {\n @if (error(); as msg) {\n <div class=\"ai-search__panel-section ai-search__status ai-search__status--error\">\n {{ msg }}\n </div>\n } @else if (loading() && !hasAnyResults()) {\n <div class=\"ai-search__panel-section ai-search__status\">\n <span class=\"ai-search__spinner\" aria-hidden=\"true\"></span>\n Suche l\u00E4uft\u2026\n </div>\n }\n @if (pageSuggestion(); as p) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">Pfad</h4>\n <button\n type=\"button\"\n class=\"ai-search__path-row\"\n (click)=\"onPathClick(p)\"\n >\n @for (crumb of p.breadcrumb; track crumb; let last = $last) {\n <span class=\"ai-search__path-crumb\">{{ crumb }}</span>\n @if (!last) {\n <ao-icon [svg]=\"caretRightIcon\" size=\"sm\" class=\"ai-search__path-sep\" />\n }\n }\n </button>\n </div>\n }\n @for (group of resultGroups(); track group.type) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">{{ group.label }}</h4>\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"ai-search__result-row\"\n (click)=\"onResultClick(r)\"\n >\n <span class=\"ai-search__result-primary\" [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n </div>\n }\n @if (aiSuggestions().length) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">KI-Vorschl\u00E4ge</h4>\n @for (r of aiSuggestions(); track r.id) {\n <button\n type=\"button\"\n class=\"ai-search__ai-row\"\n (click)=\"onAiSuggestionClick(r)\"\n >\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"ai-search__ai-icon\" />\n <span [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n </div>\n }\n @if (hasAnyResults()) {\n <button\n type=\"button\"\n class=\"ai-search__view-all\"\n (click)=\"onViewAll()\"\n >\n <span>Alle Ergebnisse anzeigen</span>\n <ao-icon [svg]=\"arrowRightIcon\" size=\"sm\" />\n </button>\n }\n }\n </div>\n}\n", styles: [":host{display:inline-block;position:relative}.ai-search{display:flex;align-items:center;gap:10px;width:400px;height:35px;padding:0 10px 0 15px;border:1px solid #223cff;background-color:#fff;border-radius:9999px;position:relative;z-index:2}.ai-search__icon-left{color:#223cff;flex-shrink:0}.ai-search__active-chip{display:inline-flex;align-items:center;gap:5px;height:23px;padding:0 5px 0 10px;background-color:#223cff14;color:#223cff;border:1px solid #223cff;border-radius:9999px;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;flex-shrink:0;max-width:50%}.ai-search__active-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.ai-search__active-chip-remove{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background-color:transparent;color:inherit;cursor:pointer;flex-shrink:0}.ai-search__active-chip-remove:hover:not(:disabled){background-color:#00000014}.ai-search__active-chip-remove:focus-visible{outline:3px solid #223cff;outline-offset:1px}.ai-search__active-chip-remove:disabled{cursor:not-allowed;opacity:.5}.ai-search__input{flex:1;height:100%;padding:0;border:none;background:transparent;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__input::placeholder{color:#212121}.ai-search__input:focus{outline:none}.ai-search__input:disabled{cursor:not-allowed}.ai-search__voice-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:50%;background-color:transparent;color:#212121;cursor:pointer;transition:color .2s ease;flex-shrink:0}.ai-search__voice-btn:hover:not(:disabled){color:#223cff}.ai-search__voice-btn:focus-visible{outline:3px solid #223cff;outline-offset:2px}.ai-search__voice-btn:disabled{opacity:.5;cursor:not-allowed}.ai-search__panel{position:absolute;top:45px;left:0;width:400px;max-height:70vh;overflow-y:auto;background-color:#fff;border:1px solid #e9e9e9;border-radius:5px;box-shadow:0 4px 16px #2121211a;z-index:10}.ai-search__panel-section{padding:15px 0;border-bottom:1px solid #e9e9e9}.ai-search__panel-section:last-of-type{border-bottom:none}.ai-search__section-title{margin:0 0 10px;padding:0 15px;font-size:12px;line-height:18px;letter-spacing:0;color:#909090;font-weight:500}.ai-search__filter-chips{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:0 15px}.ai-search__filter-chip{display:inline-flex;align-items:center;padding:5px 15px;border:1px solid #e9e9e9;background-color:#fff;color:#212121;cursor:pointer;border-radius:9999px;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;transition:background-color .15s ease,border-color .15s ease}.ai-search__filter-chip:hover{background-color:#f3f3f3;border-color:#909090}.ai-search__filter-chip:focus-visible{outline:3px solid #223cff;outline-offset:2px}.ai-search__path-row,.ai-search__result-row,.ai-search__ai-row{display:flex;align-items:center;width:100%;padding:10px 15px;border:none;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.ai-search__path-row:hover,.ai-search__result-row:hover,.ai-search__ai-row:hover{background-color:#f3f3f3}.ai-search__path-row:focus-visible,.ai-search__result-row:focus-visible,.ai-search__ai-row:focus-visible{outline:3px solid #223cff;outline-offset:-2px}.ai-search__path-row{gap:10px}.ai-search__path-sep{color:#909090}.ai-search__result-row{display:block;width:100%}.ai-search__result-primary{display:block;width:100%;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-search__ai-row{gap:10px}.ai-search__ai-icon{color:#223cff;flex-shrink:0}.ai-search__hl{background-color:#fff59d;color:inherit;padding:0;border-radius:2px}.ai-search__status{display:flex;align-items:center;gap:10px;padding:15px;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__spinner{display:inline-block;width:14px;height:14px;border:2px solid #e9e9e9;border-top-color:#223cff;border-radius:50%;animation:ao-ai-search-spin .8s linear infinite}@keyframes ao-ai-search-spin{to{transform:rotate(360deg)}}.ai-search__view-all{display:flex;align-items:center;justify-content:space-between;width:100%;padding:15px;border:none;border-top:1px solid #e9e9e9;background:transparent;cursor:pointer;text-align:left;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__view-all:hover{background-color:#f3f3f3}.ai-search__view-all:focus-visible{outline:3px solid #223cff;outline-offset:-2px}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "ao-icon", inputs: ["svg", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3186
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: AiSearchComponent, isStandalone: true, selector: "ao-ai-search", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, recommendedFilters: { classPropertyName: "recommendedFilters", publicName: "recommendedFilters", isSignal: true, isRequired: false, transformFunction: null }, activeFilter: { classPropertyName: "activeFilter", publicName: "activeFilter", isSignal: true, isRequired: false, transformFunction: null }, resultGroups: { classPropertyName: "resultGroups", publicName: "resultGroups", isSignal: true, isRequired: false, transformFunction: null }, pageSuggestion: { classPropertyName: "pageSuggestion", publicName: "pageSuggestion", isSignal: true, isRequired: false, transformFunction: null }, aiSuggestions: { classPropertyName: "aiSuggestions", publicName: "aiSuggestions", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, panelOpen: { classPropertyName: "panelOpen", publicName: "panelOpen", isSignal: true, isRequired: false, transformFunction: null }, voiceLanguage: { classPropertyName: "voiceLanguage", publicName: "voiceLanguage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", activeFilter: "activeFilterChange", panelOpen: "panelOpenChange", submit: "submit", voiceStart: "voiceStart", queryChange: "queryChange", filterSelect: "filterSelect", filterClear: "filterClear", resultSelect: "resultSelect", aiSuggestionSelect: "aiSuggestionSelect", pageSuggestionSelect: "pageSuggestionSelect", viewAllClick: "viewAllClick" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "ao-ai-search" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ai-search\" [class.ai-search--open]=\"panelOpen() && hasPanelContent()\">\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"ai-search__icon-left\" />\n @if (activeFilter(); as f) {\n <span class=\"ai-search__active-chip\" role=\"status\">\n <span class=\"ai-search__active-chip-label\">{{ f.label }}</span>\n <button\n type=\"button\"\n class=\"ai-search__active-chip-remove\"\n [disabled]=\"disabled()\"\n (click)=\"onChipRemove($event)\"\n [attr.aria-label]=\"'Filter ' + f.label + ' entfernen'\"\n >\n <ao-icon [svg]=\"closeIcon\" size=\"xs\" />\n </button>\n </span>\n }\n <input\n #searchInput\n type=\"text\"\n class=\"ai-search__input\"\n [placeholder]=\"effectivePlaceholder()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput($event)\"\n (keydown.enter)=\"onEnter()\"\n (keydown.escape)=\"onEscape()\"\n (keydown.backspace)=\"onBackspace($event)\"\n aria-label=\"AI Search\"\n autocomplete=\"off\"\n />\n <button\n type=\"button\"\n class=\"ai-search__voice-btn\"\n [class.ai-search__voice-btn--recording]=\"isVoiceRecording()\"\n [disabled]=\"disabled()\"\n (click)=\"onVoiceClick()\"\n [attr.aria-label]=\"voiceButtonLabel()\"\n [attr.aria-pressed]=\"isVoiceRecording()\"\n >\n <ao-icon [svg]=\"micIcon\" size=\"sm\" />\n </button>\n</div>\n\n@if (panelOpen() && hasPanelContent()) {\n <div class=\"ai-search__panel\" role=\"listbox\">\n @if (effectiveError(); as msg) {\n <div class=\"ai-search__panel-section ai-search__status ai-search__status--error\">\n {{ msg }}\n </div>\n } @else if (value().length === 0) {\n @if (showRecommendedFilters()) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">Empfohlene Filter</h4>\n <div class=\"ai-search__filter-chips\">\n @for (f of recommendedFilters(); track f.id) {\n <button type=\"button\" class=\"ai-search__filter-chip\" (click)=\"onFilterClick(f)\">\n {{ f.label }}\n </button>\n }\n </div>\n </div>\n }\n } @else {\n @if (loading() && !hasAnyResults()) {\n <div class=\"ai-search__panel-section ai-search__status\">\n <span class=\"ai-search__spinner\" aria-hidden=\"true\"></span>\n Suche l\u00E4uft\u2026\n </div>\n } @else if (showNoResults()) {\n <div class=\"ai-search__panel-section ai-search__status\">Keine Ergebnisse gefunden</div>\n }\n @if (pageSuggestion(); as p) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">Pfad</h4>\n <button type=\"button\" class=\"ai-search__path-row\" (click)=\"onPathClick(p)\">\n @for (crumb of p.breadcrumb; track crumb; let last = $last) {\n <span class=\"ai-search__path-crumb\">{{ crumb }}</span>\n @if (!last) {\n <ao-icon [svg]=\"caretRightIcon\" size=\"sm\" class=\"ai-search__path-sep\" />\n }\n }\n </button>\n </div>\n }\n @for (group of visibleResultGroups(); track group.type) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">{{ group.label }}</h4>\n @for (r of group.results; track r.id) {\n <button type=\"button\" class=\"ai-search__result-row\" (click)=\"onResultClick(r)\">\n <span class=\"ai-search__result-primary\" [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n </div>\n }\n @if (visibleAiSuggestions().length) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">KI-Vorschl\u00E4ge</h4>\n @for (r of visibleAiSuggestions(); track r.id) {\n <button type=\"button\" class=\"ai-search__ai-row\" (click)=\"onAiSuggestionClick(r)\">\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"ai-search__ai-icon\" />\n <span [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n </div>\n }\n @if (totalResultCount() > 0) {\n <div class=\"ai-search__result-summary\">\n {{ resultSummary() }}\n </div>\n }\n @if (hasMoreResults()) {\n <button type=\"button\" class=\"ai-search__view-all\" (click)=\"onViewAll()\">\n <span>Alle {{ totalResultCount() }} Ergebnisse anzeigen</span>\n <ao-icon [svg]=\"arrowRightIcon\" size=\"sm\" />\n </button>\n }\n }\n </div>\n}\n", styles: [":host{display:inline-block;position:relative}.ai-search{display:flex;align-items:center;gap:10px;width:400px;height:35px;padding:0 10px 0 15px;border:1px solid #223cff;background-color:#fff;border-radius:9999px;position:relative;z-index:2}.ai-search__icon-left{color:#223cff;flex-shrink:0}.ai-search__active-chip{display:inline-flex;align-items:center;gap:5px;height:23px;padding:0 5px 0 10px;background-color:#223cff14;color:#223cff;border:1px solid #223cff;border-radius:9999px;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;flex-shrink:0;max-width:50%}.ai-search__active-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.ai-search__active-chip-remove{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background-color:transparent;color:inherit;cursor:pointer;flex-shrink:0}.ai-search__active-chip-remove:hover:not(:disabled){background-color:#00000014}.ai-search__active-chip-remove:focus-visible{outline:3px solid #223cff;outline-offset:1px}.ai-search__active-chip-remove:disabled{cursor:not-allowed;opacity:.5}.ai-search__input{flex:1;height:100%;padding:0;border:none;background:transparent;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__input::placeholder{color:#212121}.ai-search__input:focus{outline:none}.ai-search__input:disabled{cursor:not-allowed}.ai-search__voice-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:50%;background-color:transparent;color:#212121;cursor:pointer;transition:color .2s ease;flex-shrink:0}.ai-search__voice-btn:hover:not(:disabled){color:#223cff}.ai-search__voice-btn--recording{color:#223cff;background-color:#223cff14}.ai-search__voice-btn:focus-visible{outline:3px solid #223cff;outline-offset:2px}.ai-search__voice-btn:disabled{opacity:.5;cursor:not-allowed}.ai-search__panel{position:absolute;top:45px;left:0;width:400px;max-height:70vh;overflow-y:auto;background-color:#fff;border:1px solid #e9e9e9;border-radius:5px;box-shadow:0 4px 16px #2121211a;z-index:10}.ai-search__panel-section{padding:15px 0;border-bottom:1px solid #e9e9e9}.ai-search__panel-section:last-of-type{border-bottom:none}.ai-search__section-title{margin:0 0 10px;padding:0 15px;font-size:12px;line-height:18px;letter-spacing:0;color:#909090;font-weight:500}.ai-search__filter-chips{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:0 15px}.ai-search__filter-chip{display:inline-flex;align-items:center;padding:5px 15px;border:1px solid #e9e9e9;background-color:#fff;color:#212121;cursor:pointer;border-radius:9999px;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;transition:background-color .15s ease,border-color .15s ease}.ai-search__filter-chip:hover{background-color:#f3f3f3;border-color:#909090}.ai-search__filter-chip:focus-visible{outline:3px solid #223cff;outline-offset:2px}.ai-search__path-row,.ai-search__result-row,.ai-search__ai-row{display:flex;align-items:center;width:100%;padding:10px 15px;border:none;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.ai-search__path-row:hover,.ai-search__result-row:hover,.ai-search__ai-row:hover{background-color:#f3f3f3}.ai-search__path-row:focus-visible,.ai-search__result-row:focus-visible,.ai-search__ai-row:focus-visible{outline:3px solid #223cff;outline-offset:-2px}.ai-search__path-row{gap:10px}.ai-search__path-sep{color:#909090}.ai-search__result-row{display:block;width:100%}.ai-search__result-primary{display:block;width:100%;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-search__ai-row{gap:10px}.ai-search__ai-icon{color:#223cff;flex-shrink:0}.ai-search__hl{background-color:#fff59d;color:inherit;padding:0;border-radius:2px}.ai-search__status{display:flex;align-items:center;gap:10px;padding:15px;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__status--error{color:#ff004d}.ai-search__result-summary{padding:10px 15px;border-top:1px solid #e9e9e9;color:#909090;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0}.ai-search__spinner{display:inline-block;width:14px;height:14px;border:2px solid #e9e9e9;border-top-color:#223cff;border-radius:50%;animation:ao-ai-search-spin .8s linear infinite}@keyframes ao-ai-search-spin{to{transform:rotate(360deg)}}.ai-search__view-all{display:flex;align-items:center;justify-content:space-between;width:100%;padding:15px;border:none;border-top:1px solid #e9e9e9;background:transparent;cursor:pointer;text-align:left;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__view-all:hover{background-color:#f3f3f3}.ai-search__view-all:focus-visible{outline:3px solid #223cff;outline-offset:-2px}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "ao-icon", inputs: ["svg", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3049
3187
  }
3050
3188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: AiSearchComponent, decorators: [{
3051
3189
  type: Component,
3052
3190
  args: [{ selector: 'ao-ai-search', imports: [IconComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: {
3053
3191
  class: 'ao-ai-search',
3054
- }, template: "<div class=\"ai-search\" [class.ai-search--open]=\"panelOpen() && hasPanelContent()\">\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"ai-search__icon-left\" />\n @if (activeFilter(); as f) {\n <span class=\"ai-search__active-chip\" role=\"status\">\n <span class=\"ai-search__active-chip-label\">{{ f.label }}</span>\n <button\n type=\"button\"\n class=\"ai-search__active-chip-remove\"\n [disabled]=\"disabled()\"\n (click)=\"onChipRemove($event)\"\n [attr.aria-label]=\"'Filter ' + f.label + ' entfernen'\"\n >\n <ao-icon [svg]=\"closeIcon\" size=\"xs\" />\n </button>\n </span>\n }\n <input\n #searchInput\n type=\"text\"\n class=\"ai-search__input\"\n [placeholder]=\"effectivePlaceholder()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput($event)\"\n (keydown.enter)=\"onEnter()\"\n (keydown.escape)=\"onEscape()\"\n (keydown.backspace)=\"onBackspace($event)\"\n aria-label=\"AI Search\"\n autocomplete=\"off\"\n />\n <button\n type=\"button\"\n class=\"ai-search__voice-btn\"\n [disabled]=\"disabled()\"\n (click)=\"onVoiceClick()\"\n aria-label=\"Voice input\"\n >\n <ao-icon [svg]=\"micIcon\" size=\"sm\" />\n </button>\n</div>\n\n@if (panelOpen() && hasPanelContent()) {\n <div class=\"ai-search__panel\" role=\"listbox\">\n @if (value().length === 0) {\n @if (showRecommendedFilters()) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">Empfohlene Filter</h4>\n <div class=\"ai-search__filter-chips\">\n @for (f of recommendedFilters(); track f.id) {\n <button\n type=\"button\"\n class=\"ai-search__filter-chip\"\n (click)=\"onFilterClick(f)\"\n >\n {{ f.label }}\n </button>\n }\n </div>\n </div>\n }\n } @else {\n @if (error(); as msg) {\n <div class=\"ai-search__panel-section ai-search__status ai-search__status--error\">\n {{ msg }}\n </div>\n } @else if (loading() && !hasAnyResults()) {\n <div class=\"ai-search__panel-section ai-search__status\">\n <span class=\"ai-search__spinner\" aria-hidden=\"true\"></span>\n Suche l\u00E4uft\u2026\n </div>\n }\n @if (pageSuggestion(); as p) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">Pfad</h4>\n <button\n type=\"button\"\n class=\"ai-search__path-row\"\n (click)=\"onPathClick(p)\"\n >\n @for (crumb of p.breadcrumb; track crumb; let last = $last) {\n <span class=\"ai-search__path-crumb\">{{ crumb }}</span>\n @if (!last) {\n <ao-icon [svg]=\"caretRightIcon\" size=\"sm\" class=\"ai-search__path-sep\" />\n }\n }\n </button>\n </div>\n }\n @for (group of resultGroups(); track group.type) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">{{ group.label }}</h4>\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"ai-search__result-row\"\n (click)=\"onResultClick(r)\"\n >\n <span class=\"ai-search__result-primary\" [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n </div>\n }\n @if (aiSuggestions().length) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">KI-Vorschl\u00E4ge</h4>\n @for (r of aiSuggestions(); track r.id) {\n <button\n type=\"button\"\n class=\"ai-search__ai-row\"\n (click)=\"onAiSuggestionClick(r)\"\n >\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"ai-search__ai-icon\" />\n <span [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n </div>\n }\n @if (hasAnyResults()) {\n <button\n type=\"button\"\n class=\"ai-search__view-all\"\n (click)=\"onViewAll()\"\n >\n <span>Alle Ergebnisse anzeigen</span>\n <ao-icon [svg]=\"arrowRightIcon\" size=\"sm\" />\n </button>\n }\n }\n </div>\n}\n", styles: [":host{display:inline-block;position:relative}.ai-search{display:flex;align-items:center;gap:10px;width:400px;height:35px;padding:0 10px 0 15px;border:1px solid #223cff;background-color:#fff;border-radius:9999px;position:relative;z-index:2}.ai-search__icon-left{color:#223cff;flex-shrink:0}.ai-search__active-chip{display:inline-flex;align-items:center;gap:5px;height:23px;padding:0 5px 0 10px;background-color:#223cff14;color:#223cff;border:1px solid #223cff;border-radius:9999px;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;flex-shrink:0;max-width:50%}.ai-search__active-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.ai-search__active-chip-remove{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background-color:transparent;color:inherit;cursor:pointer;flex-shrink:0}.ai-search__active-chip-remove:hover:not(:disabled){background-color:#00000014}.ai-search__active-chip-remove:focus-visible{outline:3px solid #223cff;outline-offset:1px}.ai-search__active-chip-remove:disabled{cursor:not-allowed;opacity:.5}.ai-search__input{flex:1;height:100%;padding:0;border:none;background:transparent;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__input::placeholder{color:#212121}.ai-search__input:focus{outline:none}.ai-search__input:disabled{cursor:not-allowed}.ai-search__voice-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:50%;background-color:transparent;color:#212121;cursor:pointer;transition:color .2s ease;flex-shrink:0}.ai-search__voice-btn:hover:not(:disabled){color:#223cff}.ai-search__voice-btn:focus-visible{outline:3px solid #223cff;outline-offset:2px}.ai-search__voice-btn:disabled{opacity:.5;cursor:not-allowed}.ai-search__panel{position:absolute;top:45px;left:0;width:400px;max-height:70vh;overflow-y:auto;background-color:#fff;border:1px solid #e9e9e9;border-radius:5px;box-shadow:0 4px 16px #2121211a;z-index:10}.ai-search__panel-section{padding:15px 0;border-bottom:1px solid #e9e9e9}.ai-search__panel-section:last-of-type{border-bottom:none}.ai-search__section-title{margin:0 0 10px;padding:0 15px;font-size:12px;line-height:18px;letter-spacing:0;color:#909090;font-weight:500}.ai-search__filter-chips{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:0 15px}.ai-search__filter-chip{display:inline-flex;align-items:center;padding:5px 15px;border:1px solid #e9e9e9;background-color:#fff;color:#212121;cursor:pointer;border-radius:9999px;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;transition:background-color .15s ease,border-color .15s ease}.ai-search__filter-chip:hover{background-color:#f3f3f3;border-color:#909090}.ai-search__filter-chip:focus-visible{outline:3px solid #223cff;outline-offset:2px}.ai-search__path-row,.ai-search__result-row,.ai-search__ai-row{display:flex;align-items:center;width:100%;padding:10px 15px;border:none;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.ai-search__path-row:hover,.ai-search__result-row:hover,.ai-search__ai-row:hover{background-color:#f3f3f3}.ai-search__path-row:focus-visible,.ai-search__result-row:focus-visible,.ai-search__ai-row:focus-visible{outline:3px solid #223cff;outline-offset:-2px}.ai-search__path-row{gap:10px}.ai-search__path-sep{color:#909090}.ai-search__result-row{display:block;width:100%}.ai-search__result-primary{display:block;width:100%;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-search__ai-row{gap:10px}.ai-search__ai-icon{color:#223cff;flex-shrink:0}.ai-search__hl{background-color:#fff59d;color:inherit;padding:0;border-radius:2px}.ai-search__status{display:flex;align-items:center;gap:10px;padding:15px;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__spinner{display:inline-block;width:14px;height:14px;border:2px solid #e9e9e9;border-top-color:#223cff;border-radius:50%;animation:ao-ai-search-spin .8s linear infinite}@keyframes ao-ai-search-spin{to{transform:rotate(360deg)}}.ai-search__view-all{display:flex;align-items:center;justify-content:space-between;width:100%;padding:15px;border:none;border-top:1px solid #e9e9e9;background:transparent;cursor:pointer;text-align:left;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__view-all:hover{background-color:#f3f3f3}.ai-search__view-all:focus-visible{outline:3px solid #223cff;outline-offset:-2px}\n"] }]
3055
- }], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], recommendedFilters: [{ type: i0.Input, args: [{ isSignal: true, alias: "recommendedFilters", required: false }] }], activeFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeFilter", required: false }] }, { type: i0.Output, args: ["activeFilterChange"] }], resultGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "resultGroups", required: false }] }], pageSuggestion: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSuggestion", required: false }] }], aiSuggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiSuggestions", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], panelOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelOpen", required: false }] }, { type: i0.Output, args: ["panelOpenChange"] }], submit: [{ type: i0.Output, args: ["submit"] }], voiceStart: [{ type: i0.Output, args: ["voiceStart"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], filterSelect: [{ type: i0.Output, args: ["filterSelect"] }], filterClear: [{ type: i0.Output, args: ["filterClear"] }], resultSelect: [{ type: i0.Output, args: ["resultSelect"] }], aiSuggestionSelect: [{ type: i0.Output, args: ["aiSuggestionSelect"] }], pageSuggestionSelect: [{ type: i0.Output, args: ["pageSuggestionSelect"] }], viewAllClick: [{ type: i0.Output, args: ["viewAllClick"] }], searchInput: [{ type: i0.ViewChild, args: ['searchInput', { isSignal: true }] }], onDocumentClick: [{
3192
+ }, template: "<div class=\"ai-search\" [class.ai-search--open]=\"panelOpen() && hasPanelContent()\">\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"ai-search__icon-left\" />\n @if (activeFilter(); as f) {\n <span class=\"ai-search__active-chip\" role=\"status\">\n <span class=\"ai-search__active-chip-label\">{{ f.label }}</span>\n <button\n type=\"button\"\n class=\"ai-search__active-chip-remove\"\n [disabled]=\"disabled()\"\n (click)=\"onChipRemove($event)\"\n [attr.aria-label]=\"'Filter ' + f.label + ' entfernen'\"\n >\n <ao-icon [svg]=\"closeIcon\" size=\"xs\" />\n </button>\n </span>\n }\n <input\n #searchInput\n type=\"text\"\n class=\"ai-search__input\"\n [placeholder]=\"effectivePlaceholder()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput($event)\"\n (keydown.enter)=\"onEnter()\"\n (keydown.escape)=\"onEscape()\"\n (keydown.backspace)=\"onBackspace($event)\"\n aria-label=\"AI Search\"\n autocomplete=\"off\"\n />\n <button\n type=\"button\"\n class=\"ai-search__voice-btn\"\n [class.ai-search__voice-btn--recording]=\"isVoiceRecording()\"\n [disabled]=\"disabled()\"\n (click)=\"onVoiceClick()\"\n [attr.aria-label]=\"voiceButtonLabel()\"\n [attr.aria-pressed]=\"isVoiceRecording()\"\n >\n <ao-icon [svg]=\"micIcon\" size=\"sm\" />\n </button>\n</div>\n\n@if (panelOpen() && hasPanelContent()) {\n <div class=\"ai-search__panel\" role=\"listbox\">\n @if (effectiveError(); as msg) {\n <div class=\"ai-search__panel-section ai-search__status ai-search__status--error\">\n {{ msg }}\n </div>\n } @else if (value().length === 0) {\n @if (showRecommendedFilters()) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">Empfohlene Filter</h4>\n <div class=\"ai-search__filter-chips\">\n @for (f of recommendedFilters(); track f.id) {\n <button type=\"button\" class=\"ai-search__filter-chip\" (click)=\"onFilterClick(f)\">\n {{ f.label }}\n </button>\n }\n </div>\n </div>\n }\n } @else {\n @if (loading() && !hasAnyResults()) {\n <div class=\"ai-search__panel-section ai-search__status\">\n <span class=\"ai-search__spinner\" aria-hidden=\"true\"></span>\n Suche l\u00E4uft\u2026\n </div>\n } @else if (showNoResults()) {\n <div class=\"ai-search__panel-section ai-search__status\">Keine Ergebnisse gefunden</div>\n }\n @if (pageSuggestion(); as p) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">Pfad</h4>\n <button type=\"button\" class=\"ai-search__path-row\" (click)=\"onPathClick(p)\">\n @for (crumb of p.breadcrumb; track crumb; let last = $last) {\n <span class=\"ai-search__path-crumb\">{{ crumb }}</span>\n @if (!last) {\n <ao-icon [svg]=\"caretRightIcon\" size=\"sm\" class=\"ai-search__path-sep\" />\n }\n }\n </button>\n </div>\n }\n @for (group of visibleResultGroups(); track group.type) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">{{ group.label }}</h4>\n @for (r of group.results; track r.id) {\n <button type=\"button\" class=\"ai-search__result-row\" (click)=\"onResultClick(r)\">\n <span class=\"ai-search__result-primary\" [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n </div>\n }\n @if (visibleAiSuggestions().length) {\n <div class=\"ai-search__panel-section\">\n <h4 class=\"ai-search__section-title\">KI-Vorschl\u00E4ge</h4>\n @for (r of visibleAiSuggestions(); track r.id) {\n <button type=\"button\" class=\"ai-search__ai-row\" (click)=\"onAiSuggestionClick(r)\">\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"ai-search__ai-icon\" />\n <span [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n </div>\n }\n @if (totalResultCount() > 0) {\n <div class=\"ai-search__result-summary\">\n {{ resultSummary() }}\n </div>\n }\n @if (hasMoreResults()) {\n <button type=\"button\" class=\"ai-search__view-all\" (click)=\"onViewAll()\">\n <span>Alle {{ totalResultCount() }} Ergebnisse anzeigen</span>\n <ao-icon [svg]=\"arrowRightIcon\" size=\"sm\" />\n </button>\n }\n }\n </div>\n}\n", styles: [":host{display:inline-block;position:relative}.ai-search{display:flex;align-items:center;gap:10px;width:400px;height:35px;padding:0 10px 0 15px;border:1px solid #223cff;background-color:#fff;border-radius:9999px;position:relative;z-index:2}.ai-search__icon-left{color:#223cff;flex-shrink:0}.ai-search__active-chip{display:inline-flex;align-items:center;gap:5px;height:23px;padding:0 5px 0 10px;background-color:#223cff14;color:#223cff;border:1px solid #223cff;border-radius:9999px;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;flex-shrink:0;max-width:50%}.ai-search__active-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.ai-search__active-chip-remove{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background-color:transparent;color:inherit;cursor:pointer;flex-shrink:0}.ai-search__active-chip-remove:hover:not(:disabled){background-color:#00000014}.ai-search__active-chip-remove:focus-visible{outline:3px solid #223cff;outline-offset:1px}.ai-search__active-chip-remove:disabled{cursor:not-allowed;opacity:.5}.ai-search__input{flex:1;height:100%;padding:0;border:none;background:transparent;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__input::placeholder{color:#212121}.ai-search__input:focus{outline:none}.ai-search__input:disabled{cursor:not-allowed}.ai-search__voice-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:50%;background-color:transparent;color:#212121;cursor:pointer;transition:color .2s ease;flex-shrink:0}.ai-search__voice-btn:hover:not(:disabled){color:#223cff}.ai-search__voice-btn--recording{color:#223cff;background-color:#223cff14}.ai-search__voice-btn:focus-visible{outline:3px solid #223cff;outline-offset:2px}.ai-search__voice-btn:disabled{opacity:.5;cursor:not-allowed}.ai-search__panel{position:absolute;top:45px;left:0;width:400px;max-height:70vh;overflow-y:auto;background-color:#fff;border:1px solid #e9e9e9;border-radius:5px;box-shadow:0 4px 16px #2121211a;z-index:10}.ai-search__panel-section{padding:15px 0;border-bottom:1px solid #e9e9e9}.ai-search__panel-section:last-of-type{border-bottom:none}.ai-search__section-title{margin:0 0 10px;padding:0 15px;font-size:12px;line-height:18px;letter-spacing:0;color:#909090;font-weight:500}.ai-search__filter-chips{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:0 15px}.ai-search__filter-chip{display:inline-flex;align-items:center;padding:5px 15px;border:1px solid #e9e9e9;background-color:#fff;color:#212121;cursor:pointer;border-radius:9999px;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;transition:background-color .15s ease,border-color .15s ease}.ai-search__filter-chip:hover{background-color:#f3f3f3;border-color:#909090}.ai-search__filter-chip:focus-visible{outline:3px solid #223cff;outline-offset:2px}.ai-search__path-row,.ai-search__result-row,.ai-search__ai-row{display:flex;align-items:center;width:100%;padding:10px 15px;border:none;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.ai-search__path-row:hover,.ai-search__result-row:hover,.ai-search__ai-row:hover{background-color:#f3f3f3}.ai-search__path-row:focus-visible,.ai-search__result-row:focus-visible,.ai-search__ai-row:focus-visible{outline:3px solid #223cff;outline-offset:-2px}.ai-search__path-row{gap:10px}.ai-search__path-sep{color:#909090}.ai-search__result-row{display:block;width:100%}.ai-search__result-primary{display:block;width:100%;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-search__ai-row{gap:10px}.ai-search__ai-icon{color:#223cff;flex-shrink:0}.ai-search__hl{background-color:#fff59d;color:inherit;padding:0;border-radius:2px}.ai-search__status{display:flex;align-items:center;gap:10px;padding:15px;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__status--error{color:#ff004d}.ai-search__result-summary{padding:10px 15px;border-top:1px solid #e9e9e9;color:#909090;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0}.ai-search__spinner{display:inline-block;width:14px;height:14px;border:2px solid #e9e9e9;border-top-color:#223cff;border-radius:50%;animation:ao-ai-search-spin .8s linear infinite}@keyframes ao-ai-search-spin{to{transform:rotate(360deg)}}.ai-search__view-all{display:flex;align-items:center;justify-content:space-between;width:100%;padding:15px;border:none;border-top:1px solid #e9e9e9;background:transparent;cursor:pointer;text-align:left;color:#212121;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0}.ai-search__view-all:hover{background-color:#f3f3f3}.ai-search__view-all:focus-visible{outline:3px solid #223cff;outline-offset:-2px}\n"] }]
3193
+ }], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], recommendedFilters: [{ type: i0.Input, args: [{ isSignal: true, alias: "recommendedFilters", required: false }] }], activeFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeFilter", required: false }] }, { type: i0.Output, args: ["activeFilterChange"] }], resultGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "resultGroups", required: false }] }], pageSuggestion: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSuggestion", required: false }] }], aiSuggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiSuggestions", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], panelOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelOpen", required: false }] }, { type: i0.Output, args: ["panelOpenChange"] }], voiceLanguage: [{ type: i0.Input, args: [{ isSignal: true, alias: "voiceLanguage", required: false }] }], submit: [{ type: i0.Output, args: ["submit"] }], voiceStart: [{ type: i0.Output, args: ["voiceStart"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], filterSelect: [{ type: i0.Output, args: ["filterSelect"] }], filterClear: [{ type: i0.Output, args: ["filterClear"] }], resultSelect: [{ type: i0.Output, args: ["resultSelect"] }], aiSuggestionSelect: [{ type: i0.Output, args: ["aiSuggestionSelect"] }], pageSuggestionSelect: [{ type: i0.Output, args: ["pageSuggestionSelect"] }], viewAllClick: [{ type: i0.Output, args: ["viewAllClick"] }], searchInput: [{ type: i0.ViewChild, args: ['searchInput', { isSignal: true }] }], onDocumentClick: [{
3056
3194
  type: HostListener,
3057
3195
  args: ['document:click', ['$event']]
3058
3196
  }] } });
@@ -5898,7 +6036,7 @@ class TopNavComponent {
5898
6036
  }
5899
6037
  }
5900
6038
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: TopNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5901
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: TopNavComponent, isStandalone: true, selector: "ao-top-nav", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, activeItemId: { classPropertyName: "activeItemId", publicName: "activeItemId", isSignal: true, isRequired: false, transformFunction: null }, showSearch: { classPropertyName: "showSearch", publicName: "showSearch", isSignal: true, isRequired: false, transformFunction: null }, showNotifications: { classPropertyName: "showNotifications", publicName: "showNotifications", isSignal: true, isRequired: false, transformFunction: null }, notificationCount: { classPropertyName: "notificationCount", publicName: "notificationCount", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, showTools: { classPropertyName: "showTools", publicName: "showTools", isSignal: true, isRequired: false, transformFunction: null }, recommendedFilters: { classPropertyName: "recommendedFilters", publicName: "recommendedFilters", isSignal: true, isRequired: false, transformFunction: null }, activeFilter: { classPropertyName: "activeFilter", publicName: "activeFilter", isSignal: true, isRequired: false, transformFunction: null }, resultGroups: { classPropertyName: "resultGroups", publicName: "resultGroups", isSignal: true, isRequired: false, transformFunction: null }, pageSuggestion: { classPropertyName: "pageSuggestion", publicName: "pageSuggestion", isSignal: true, isRequired: false, transformFunction: null }, aiSuggestions: { classPropertyName: "aiSuggestions", publicName: "aiSuggestions", isSignal: true, isRequired: false, transformFunction: null }, searchLoading: { classPropertyName: "searchLoading", publicName: "searchLoading", isSignal: true, isRequired: false, transformFunction: null }, searchError: { classPropertyName: "searchError", publicName: "searchError", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeItemId: "activeItemIdChange", activeFilter: "activeFilterChange", itemClick: "itemClick", itemChange: "itemChange", searchSubmit: "searchSubmit", searchQueryChange: "searchQueryChange", searchResultSelect: "searchResultSelect", searchAiSuggestionSelect: "searchAiSuggestionSelect", searchPageSuggestionSelect: "searchPageSuggestionSelect", searchFilterSelect: "searchFilterSelect", searchFilterClear: "searchFilterClear", searchViewAll: "searchViewAll", notificationClick: "notificationClick" }, host: { classAttribute: "ao-top-nav" }, viewQueries: [{ propertyName: "navItems", predicate: ["navItem"], descendants: true, isSignal: true }], ngImport: i0, template: "<nav class=\"top-nav-outer\" role=\"navigation\" aria-label=\"Main navigation\">\n <div class=\"top-nav\">\n <div class=\"top-nav__list-wrapper\">\n <ul class=\"top-nav__list\" role=\"menubar\">\n @for (item of items(); track item.id) {\n <li role=\"none\">\n <a\n #navItem\n class=\"top-nav__item\"\n [class.top-nav__item--active]=\"item.id === activeItemId()\"\n [class.top-nav__item--disabled]=\"item.disabled\"\n [attr.href]=\"item.route ?? null\"\n [attr.aria-current]=\"item.id === activeItemId() ? 'page' : null\"\n [attr.aria-disabled]=\"item.disabled || null\"\n [attr.tabindex]=\"item.disabled ? -1 : 0\"\n role=\"menuitem\"\n (click)=\"$event.preventDefault(); onItemClick(item)\"\n (keydown)=\"onKeydown($event, item)\"\n >\n @if (item.icon) {\n <ao-icon [svg]=\"item.icon\" size=\"sm\" />\n }\n {{ item.label }}\n </a>\n </li>\n }\n </ul>\n @if (showIndicator()) {\n <span\n class=\"top-nav__indicator\"\n [style.left]=\"indicatorStyle().left\"\n [style.width]=\"indicatorStyle().width\"\n ></span>\n }\n </div>\n\n <div class=\"top-nav__actions\">\n @if (showSearch()) {\n <ao-ai-search\n [placeholder]=\"searchPlaceholder()\"\n [(value)]=\"searchValue\"\n [recommendedFilters]=\"recommendedFilters()\"\n [(activeFilter)]=\"activeFilter\"\n [resultGroups]=\"resultGroups()\"\n [pageSuggestion]=\"pageSuggestion()\"\n [aiSuggestions]=\"aiSuggestions()\"\n [loading]=\"searchLoading()\"\n [error]=\"searchError()\"\n (submit)=\"onSearchSubmit($event)\"\n (queryChange)=\"searchQueryChange.emit($event)\"\n (resultSelect)=\"searchResultSelect.emit($event)\"\n (aiSuggestionSelect)=\"searchAiSuggestionSelect.emit($event)\"\n (pageSuggestionSelect)=\"searchPageSuggestionSelect.emit($event)\"\n (filterSelect)=\"searchFilterSelect.emit($event)\"\n (filterClear)=\"searchFilterClear.emit()\"\n (viewAllClick)=\"searchViewAll.emit($event)\"\n />\n }\n @if (showTools()) {\n <ao-nav-tools />\n }\n @if (showNotifications()) {\n <ao-notification-button\n [count]=\"notificationCount()\"\n (buttonClick)=\"onNotificationClick()\"\n />\n }\n </div>\n </div>\n</nav>\n", styles: [":host{display:block;height:50px;background-color:#fff;border-bottom:1px solid #e9e9e9;padding-left:70px}.top-nav-outer{max-width:1640px;width:calc(100% - 96px);margin:auto;height:100%}@media(max-width:1279px){.top-nav-outer{width:calc(100% - 64px)}}@media(max-width:599px){.top-nav-outer{width:calc(100% - 32px)}}.top-nav{display:flex;align-items:center;justify-content:space-between;height:100%}.top-nav__list-wrapper{position:relative;height:100%}.top-nav__list{display:flex;align-items:center;gap:30px;list-style:none;margin:0;padding:0;height:100%}.top-nav__item{display:flex;align-items:center;gap:5px;height:100%;padding:0;border:none;background:transparent;color:#212121;text-decoration:none;cursor:pointer;transition:color .2s ease;font-size:13px;font-weight:700;line-height:19.5px;letter-spacing:0}.top-nav__item:hover:not(.top-nav__item--disabled){color:#ff004d}.top-nav__item:focus-visible{outline:3px solid #ff004d;outline-offset:-3px}.top-nav__item--active{color:#ff004d}.top-nav__item--disabled{color:#909090;cursor:not-allowed}.top-nav__indicator{position:absolute;bottom:0;height:3px;background-color:#ff004d;transition:left .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1)}.top-nav__actions{display:flex;align-items:center;gap:20px}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "ao-icon", inputs: ["svg", "size"] }, { kind: "component", type: AiSearchComponent, selector: "ao-ai-search", inputs: ["placeholder", "value", "disabled", "recommendedFilters", "activeFilter", "resultGroups", "pageSuggestion", "aiSuggestions", "loading", "error", "panelOpen"], outputs: ["valueChange", "activeFilterChange", "panelOpenChange", "submit", "voiceStart", "queryChange", "filterSelect", "filterClear", "resultSelect", "aiSuggestionSelect", "pageSuggestionSelect", "viewAllClick"] }, { kind: "component", type: NotificationButtonComponent, selector: "ao-notification-button", inputs: ["count", "maxCount", "disabled"], outputs: ["buttonClick"] }, { kind: "component", type: NavToolsComponent, selector: "ao-nav-tools", inputs: ["activeCompany", "companySearch"], outputs: ["changeCompany"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6039
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: TopNavComponent, isStandalone: true, selector: "ao-top-nav", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, activeItemId: { classPropertyName: "activeItemId", publicName: "activeItemId", isSignal: true, isRequired: false, transformFunction: null }, showSearch: { classPropertyName: "showSearch", publicName: "showSearch", isSignal: true, isRequired: false, transformFunction: null }, showNotifications: { classPropertyName: "showNotifications", publicName: "showNotifications", isSignal: true, isRequired: false, transformFunction: null }, notificationCount: { classPropertyName: "notificationCount", publicName: "notificationCount", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, showTools: { classPropertyName: "showTools", publicName: "showTools", isSignal: true, isRequired: false, transformFunction: null }, recommendedFilters: { classPropertyName: "recommendedFilters", publicName: "recommendedFilters", isSignal: true, isRequired: false, transformFunction: null }, activeFilter: { classPropertyName: "activeFilter", publicName: "activeFilter", isSignal: true, isRequired: false, transformFunction: null }, resultGroups: { classPropertyName: "resultGroups", publicName: "resultGroups", isSignal: true, isRequired: false, transformFunction: null }, pageSuggestion: { classPropertyName: "pageSuggestion", publicName: "pageSuggestion", isSignal: true, isRequired: false, transformFunction: null }, aiSuggestions: { classPropertyName: "aiSuggestions", publicName: "aiSuggestions", isSignal: true, isRequired: false, transformFunction: null }, searchLoading: { classPropertyName: "searchLoading", publicName: "searchLoading", isSignal: true, isRequired: false, transformFunction: null }, searchError: { classPropertyName: "searchError", publicName: "searchError", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeItemId: "activeItemIdChange", activeFilter: "activeFilterChange", itemClick: "itemClick", itemChange: "itemChange", searchSubmit: "searchSubmit", searchQueryChange: "searchQueryChange", searchResultSelect: "searchResultSelect", searchAiSuggestionSelect: "searchAiSuggestionSelect", searchPageSuggestionSelect: "searchPageSuggestionSelect", searchFilterSelect: "searchFilterSelect", searchFilterClear: "searchFilterClear", searchViewAll: "searchViewAll", notificationClick: "notificationClick" }, host: { classAttribute: "ao-top-nav" }, viewQueries: [{ propertyName: "navItems", predicate: ["navItem"], descendants: true, isSignal: true }], ngImport: i0, template: "<nav class=\"top-nav-outer\" role=\"navigation\" aria-label=\"Main navigation\">\n <div class=\"top-nav\">\n <div class=\"top-nav__list-wrapper\">\n <ul class=\"top-nav__list\" role=\"menubar\">\n @for (item of items(); track item.id) {\n <li role=\"none\">\n <a\n #navItem\n class=\"top-nav__item\"\n [class.top-nav__item--active]=\"item.id === activeItemId()\"\n [class.top-nav__item--disabled]=\"item.disabled\"\n [attr.href]=\"item.route ?? null\"\n [attr.aria-current]=\"item.id === activeItemId() ? 'page' : null\"\n [attr.aria-disabled]=\"item.disabled || null\"\n [attr.tabindex]=\"item.disabled ? -1 : 0\"\n role=\"menuitem\"\n (click)=\"$event.preventDefault(); onItemClick(item)\"\n (keydown)=\"onKeydown($event, item)\"\n >\n @if (item.icon) {\n <ao-icon [svg]=\"item.icon\" size=\"sm\" />\n }\n {{ item.label }}\n </a>\n </li>\n }\n </ul>\n @if (showIndicator()) {\n <span\n class=\"top-nav__indicator\"\n [style.left]=\"indicatorStyle().left\"\n [style.width]=\"indicatorStyle().width\"\n ></span>\n }\n </div>\n\n <div class=\"top-nav__actions\">\n @if (showSearch()) {\n <ao-ai-search\n [placeholder]=\"searchPlaceholder()\"\n [(value)]=\"searchValue\"\n [recommendedFilters]=\"recommendedFilters()\"\n [(activeFilter)]=\"activeFilter\"\n [resultGroups]=\"resultGroups()\"\n [pageSuggestion]=\"pageSuggestion()\"\n [aiSuggestions]=\"aiSuggestions()\"\n [loading]=\"searchLoading()\"\n [error]=\"searchError()\"\n (submit)=\"onSearchSubmit($event)\"\n (queryChange)=\"searchQueryChange.emit($event)\"\n (resultSelect)=\"searchResultSelect.emit($event)\"\n (aiSuggestionSelect)=\"searchAiSuggestionSelect.emit($event)\"\n (pageSuggestionSelect)=\"searchPageSuggestionSelect.emit($event)\"\n (filterSelect)=\"searchFilterSelect.emit($event)\"\n (filterClear)=\"searchFilterClear.emit()\"\n (viewAllClick)=\"searchViewAll.emit($event)\"\n />\n }\n @if (showTools()) {\n <ao-nav-tools />\n }\n @if (showNotifications()) {\n <ao-notification-button\n [count]=\"notificationCount()\"\n (buttonClick)=\"onNotificationClick()\"\n />\n }\n </div>\n </div>\n</nav>\n", styles: [":host{display:block;height:50px;background-color:#fff;border-bottom:1px solid #e9e9e9;padding-left:70px}.top-nav-outer{max-width:1640px;width:calc(100% - 96px);margin:auto;height:100%}@media(max-width:1279px){.top-nav-outer{width:calc(100% - 64px)}}@media(max-width:599px){.top-nav-outer{width:calc(100% - 32px)}}.top-nav{display:flex;align-items:center;justify-content:space-between;height:100%}.top-nav__list-wrapper{position:relative;height:100%}.top-nav__list{display:flex;align-items:center;gap:30px;list-style:none;margin:0;padding:0;height:100%}.top-nav__item{display:flex;align-items:center;gap:5px;height:100%;padding:0;border:none;background:transparent;color:#212121;text-decoration:none;cursor:pointer;transition:color .2s ease;font-size:13px;font-weight:700;line-height:19.5px;letter-spacing:0}.top-nav__item:hover:not(.top-nav__item--disabled){color:#ff004d}.top-nav__item:focus-visible{outline:3px solid #ff004d;outline-offset:-3px}.top-nav__item--active{color:#ff004d}.top-nav__item--disabled{color:#909090;cursor:not-allowed}.top-nav__indicator{position:absolute;bottom:0;height:3px;background-color:#ff004d;transition:left .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1)}.top-nav__actions{display:flex;align-items:center;gap:20px}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "ao-icon", inputs: ["svg", "size"] }, { kind: "component", type: AiSearchComponent, selector: "ao-ai-search", inputs: ["placeholder", "value", "disabled", "recommendedFilters", "activeFilter", "resultGroups", "pageSuggestion", "aiSuggestions", "loading", "error", "panelOpen", "voiceLanguage"], outputs: ["valueChange", "activeFilterChange", "panelOpenChange", "submit", "voiceStart", "queryChange", "filterSelect", "filterClear", "resultSelect", "aiSuggestionSelect", "pageSuggestionSelect", "viewAllClick"] }, { kind: "component", type: NotificationButtonComponent, selector: "ao-notification-button", inputs: ["count", "maxCount", "disabled"], outputs: ["buttonClick"] }, { kind: "component", type: NavToolsComponent, selector: "ao-nav-tools", inputs: ["activeCompany", "companySearch"], outputs: ["changeCompany"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5902
6040
  }
5903
6041
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: TopNavComponent, decorators: [{
5904
6042
  type: Component,
@@ -5951,13 +6089,13 @@ class SearchResultsPageComponent {
5951
6089
  return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
5952
6090
  }
5953
6091
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SearchResultsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5954
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: SearchResultsPageComponent, isStandalone: true, selector: "ao-search-results-page", inputs: { query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, groups: { classPropertyName: "groups", publicName: "groups", isSignal: true, isRequired: false, transformFunction: null }, availableTypes: { classPropertyName: "availableTypes", publicName: "availableTypes", isSignal: true, isRequired: false, transformFunction: null }, typeFilter: { classPropertyName: "typeFilter", publicName: "typeFilter", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typeFilter: "typeFilterChange", dateFilter: "dateFilterChange", resultClick: "resultClick", typeFilterClick: "typeFilterClick", dateFilterClick: "dateFilterClick" }, host: { classAttribute: "ao-search-results-page" }, ngImport: i0, template: "<header class=\"search-results__header\">\n <h1 class=\"search-results__title\">Suchergebnisse</h1>\n <div class=\"search-results__filters\">\n <button\n ao-button\n variant=\"outline\"\n [iconTrailing]=\"caretDownIcon\"\n (click)=\"onTypeFilterClick()\"\n >\n Typ\n </button>\n <button\n ao-button\n variant=\"outline\"\n [iconTrailing]=\"calendarIcon\"\n (click)=\"onDateFilterClick()\"\n >\n Datum\n </button>\n </div>\n</header>\n\n@for (group of groups(); track group.type) {\n <section class=\"search-results__section\">\n <div class=\"search-results__section-header\">\n <h2 class=\"search-results__section-title\">{{ group.label }}</h2>\n <span class=\"search-results__count\">\n {{ group.totalCount ?? group.results.length }} Ergebnisse\n </span>\n </div>\n\n @if (group.type !== 'ki') {\n @if (group.columns?.length) {\n <div class=\"search-results__row search-results__row--head\">\n @for (col of group.columns; track col) {\n <span class=\"search-results__cell search-results__cell--head\">{{ col }}</span>\n }\n </div>\n }\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"search-results__row\"\n (click)=\"onResultClick(r)\"\n >\n <span class=\"search-results__cell search-results__cell--primary\" [innerHTML]=\"highlight(r.primary)\"></span>\n <span class=\"search-results__cell\">{{ r.secondary }}</span>\n <span class=\"search-results__cell\">{{ r.tertiary }}</span>\n </button>\n }\n } @else {\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"search-results__ai-row\"\n (click)=\"onResultClick(r)\"\n >\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"search-results__ai-icon\" />\n <span [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n }\n </section>\n}\n", styles: [":host{display:block;padding:25px 30px}.search-results__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:25px}.search-results__title{margin:0;font-size:24px;font-weight:400;line-height:36px;letter-spacing:0;color:#212121}.search-results__filters{display:flex;gap:10px}.search-results__section{margin-bottom:30px}.search-results__section-header{display:flex;align-items:baseline;justify-content:space-between;padding-bottom:10px;border-bottom:1px solid #e9e9e9;margin-bottom:10px}.search-results__section-title{margin:0;font-size:15px;font-weight:400;line-height:22.5px;letter-spacing:0;color:#212121}.search-results__count{font-size:12px;font-weight:500;line-height:18px;letter-spacing:0;color:#909090}.search-results__row{display:grid;grid-template-columns:1fr 2fr 2fr;gap:15px;width:100%;padding:10px 0;border:none;border-bottom:1px solid #e9e9e9;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.search-results__row:hover:not(.search-results__row--head){background-color:#f3f3f3}.search-results__row--head{cursor:default;color:#909090;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0}.search-results__cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-results__cell--primary{font-weight:600}.search-results__cell--head{color:#909090}.search-results__ai-row{display:flex;align-items:center;gap:10px;width:100%;padding:10px 0;border:none;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.search-results__ai-row:hover{background-color:#f3f3f3}.search-results__ai-icon{color:#223cff;flex-shrink:0}.search-results__hl{background-color:#fff59d;color:inherit;padding:0;border-radius:2px}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[ao-button], a[ao-button]", inputs: ["variant", "icon", "iconTrailing"] }, { kind: "component", type: IconComponent, selector: "ao-icon", inputs: ["svg", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6092
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: SearchResultsPageComponent, isStandalone: true, selector: "ao-search-results-page", inputs: { query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, groups: { classPropertyName: "groups", publicName: "groups", isSignal: true, isRequired: false, transformFunction: null }, availableTypes: { classPropertyName: "availableTypes", publicName: "availableTypes", isSignal: true, isRequired: false, transformFunction: null }, typeFilter: { classPropertyName: "typeFilter", publicName: "typeFilter", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typeFilter: "typeFilterChange", dateFilter: "dateFilterChange", resultClick: "resultClick", typeFilterClick: "typeFilterClick", dateFilterClick: "dateFilterClick" }, host: { classAttribute: "ao-search-results-page" }, ngImport: i0, template: "<header class=\"search-results__header\">\n <h1 class=\"search-results__title\">Suchergebnisse</h1>\n <div class=\"search-results__filters\">\n <button\n ao-button\n variant=\"outline\"\n [iconTrailing]=\"caretDownIcon\"\n (click)=\"onTypeFilterClick()\"\n >\n Typ\n </button>\n <button\n ao-button\n variant=\"outline\"\n [iconTrailing]=\"calendarIcon\"\n (click)=\"onDateFilterClick()\"\n >\n Datum\n </button>\n </div>\n</header>\n\n@for (group of groups(); track group.type) {\n <section class=\"search-results__section\">\n <div class=\"search-results__section-header\">\n <h2 class=\"search-results__section-title\">{{ group.label }}</h2>\n <span class=\"search-results__count\">\n {{ group.totalCount ?? group.results.length }} Ergebnisse\n </span>\n </div>\n\n @if (group.type !== 'ki') {\n @if (group.columns?.length) {\n <div class=\"search-results__row search-results__row--head\">\n @for (col of group.columns; track col) {\n <span class=\"search-results__cell search-results__cell--head\">{{ col }}</span>\n }\n </div>\n }\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"search-results__row\"\n (click)=\"onResultClick(r)\"\n >\n <span class=\"search-results__cell search-results__cell--primary\" [innerHTML]=\"highlight(r.primary)\"></span>\n <span class=\"search-results__cell\">{{ r.secondary }}</span>\n <span class=\"search-results__cell\">{{ r.tertiary }}</span>\n </button>\n }\n } @else {\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"search-results__ai-row\"\n (click)=\"onResultClick(r)\"\n >\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"search-results__ai-icon\" />\n <span [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n }\n </section>\n}\n", styles: [":host{display:block;box-sizing:border-box;width:calc(100% - var(--desktop-margin, 96px));max-width:var(--desktop-boxed, 1640px);margin:0 auto;padding-top:20px}@media(max-width:1279px){:host{width:calc(100% - var(--tablet-margin, 64px))}}@media(max-width:599px){:host{width:calc(100% - var(--mobile-margin, 32px))}}.search-results__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:25px}.search-results__title{margin:0;font-size:24px;font-weight:400;line-height:36px;letter-spacing:0;color:#212121}.search-results__filters{display:flex;gap:10px}.search-results__section{margin-bottom:30px}.search-results__section-header{display:flex;align-items:baseline;justify-content:space-between;padding-bottom:10px;border-bottom:1px solid #e9e9e9;margin-bottom:10px}.search-results__section-title{margin:0;font-size:15px;font-weight:400;line-height:22.5px;letter-spacing:0;color:#212121}.search-results__count{font-size:12px;font-weight:500;line-height:18px;letter-spacing:0;color:#909090}.search-results__row{display:grid;grid-template-columns:1fr 2fr 2fr;gap:15px;width:100%;padding:10px 0;border:none;border-bottom:1px solid #e9e9e9;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.search-results__row:hover:not(.search-results__row--head){background-color:#f3f3f3}.search-results__row--head{cursor:default;color:#909090;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0}.search-results__cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-results__cell--primary{font-weight:600}.search-results__cell--head{color:#909090}.search-results__ai-row{display:flex;align-items:center;gap:10px;width:100%;padding:10px 0;border:none;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.search-results__ai-row:hover{background-color:#f3f3f3}.search-results__ai-icon{color:#223cff;flex-shrink:0}.search-results__hl{background-color:#fff59d;color:inherit;padding:0;border-radius:2px}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[ao-button], a[ao-button]", inputs: ["variant", "icon", "iconTrailing"] }, { kind: "component", type: IconComponent, selector: "ao-icon", inputs: ["svg", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5955
6093
  }
5956
6094
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SearchResultsPageComponent, decorators: [{
5957
6095
  type: Component,
5958
6096
  args: [{ selector: 'ao-search-results-page', imports: [ButtonComponent, IconComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: {
5959
6097
  class: 'ao-search-results-page',
5960
- }, template: "<header class=\"search-results__header\">\n <h1 class=\"search-results__title\">Suchergebnisse</h1>\n <div class=\"search-results__filters\">\n <button\n ao-button\n variant=\"outline\"\n [iconTrailing]=\"caretDownIcon\"\n (click)=\"onTypeFilterClick()\"\n >\n Typ\n </button>\n <button\n ao-button\n variant=\"outline\"\n [iconTrailing]=\"calendarIcon\"\n (click)=\"onDateFilterClick()\"\n >\n Datum\n </button>\n </div>\n</header>\n\n@for (group of groups(); track group.type) {\n <section class=\"search-results__section\">\n <div class=\"search-results__section-header\">\n <h2 class=\"search-results__section-title\">{{ group.label }}</h2>\n <span class=\"search-results__count\">\n {{ group.totalCount ?? group.results.length }} Ergebnisse\n </span>\n </div>\n\n @if (group.type !== 'ki') {\n @if (group.columns?.length) {\n <div class=\"search-results__row search-results__row--head\">\n @for (col of group.columns; track col) {\n <span class=\"search-results__cell search-results__cell--head\">{{ col }}</span>\n }\n </div>\n }\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"search-results__row\"\n (click)=\"onResultClick(r)\"\n >\n <span class=\"search-results__cell search-results__cell--primary\" [innerHTML]=\"highlight(r.primary)\"></span>\n <span class=\"search-results__cell\">{{ r.secondary }}</span>\n <span class=\"search-results__cell\">{{ r.tertiary }}</span>\n </button>\n }\n } @else {\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"search-results__ai-row\"\n (click)=\"onResultClick(r)\"\n >\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"search-results__ai-icon\" />\n <span [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n }\n </section>\n}\n", styles: [":host{display:block;padding:25px 30px}.search-results__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:25px}.search-results__title{margin:0;font-size:24px;font-weight:400;line-height:36px;letter-spacing:0;color:#212121}.search-results__filters{display:flex;gap:10px}.search-results__section{margin-bottom:30px}.search-results__section-header{display:flex;align-items:baseline;justify-content:space-between;padding-bottom:10px;border-bottom:1px solid #e9e9e9;margin-bottom:10px}.search-results__section-title{margin:0;font-size:15px;font-weight:400;line-height:22.5px;letter-spacing:0;color:#212121}.search-results__count{font-size:12px;font-weight:500;line-height:18px;letter-spacing:0;color:#909090}.search-results__row{display:grid;grid-template-columns:1fr 2fr 2fr;gap:15px;width:100%;padding:10px 0;border:none;border-bottom:1px solid #e9e9e9;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.search-results__row:hover:not(.search-results__row--head){background-color:#f3f3f3}.search-results__row--head{cursor:default;color:#909090;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0}.search-results__cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-results__cell--primary{font-weight:600}.search-results__cell--head{color:#909090}.search-results__ai-row{display:flex;align-items:center;gap:10px;width:100%;padding:10px 0;border:none;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.search-results__ai-row:hover{background-color:#f3f3f3}.search-results__ai-icon{color:#223cff;flex-shrink:0}.search-results__hl{background-color:#fff59d;color:inherit;padding:0;border-radius:2px}\n"] }]
6098
+ }, template: "<header class=\"search-results__header\">\n <h1 class=\"search-results__title\">Suchergebnisse</h1>\n <div class=\"search-results__filters\">\n <button\n ao-button\n variant=\"outline\"\n [iconTrailing]=\"caretDownIcon\"\n (click)=\"onTypeFilterClick()\"\n >\n Typ\n </button>\n <button\n ao-button\n variant=\"outline\"\n [iconTrailing]=\"calendarIcon\"\n (click)=\"onDateFilterClick()\"\n >\n Datum\n </button>\n </div>\n</header>\n\n@for (group of groups(); track group.type) {\n <section class=\"search-results__section\">\n <div class=\"search-results__section-header\">\n <h2 class=\"search-results__section-title\">{{ group.label }}</h2>\n <span class=\"search-results__count\">\n {{ group.totalCount ?? group.results.length }} Ergebnisse\n </span>\n </div>\n\n @if (group.type !== 'ki') {\n @if (group.columns?.length) {\n <div class=\"search-results__row search-results__row--head\">\n @for (col of group.columns; track col) {\n <span class=\"search-results__cell search-results__cell--head\">{{ col }}</span>\n }\n </div>\n }\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"search-results__row\"\n (click)=\"onResultClick(r)\"\n >\n <span class=\"search-results__cell search-results__cell--primary\" [innerHTML]=\"highlight(r.primary)\"></span>\n <span class=\"search-results__cell\">{{ r.secondary }}</span>\n <span class=\"search-results__cell\">{{ r.tertiary }}</span>\n </button>\n }\n } @else {\n @for (r of group.results; track r.id) {\n <button\n type=\"button\"\n class=\"search-results__ai-row\"\n (click)=\"onResultClick(r)\"\n >\n <ao-icon [svg]=\"sparkleIcon\" size=\"sm\" class=\"search-results__ai-icon\" />\n <span [innerHTML]=\"highlight(r.primary)\"></span>\n </button>\n }\n }\n </section>\n}\n", styles: [":host{display:block;box-sizing:border-box;width:calc(100% - var(--desktop-margin, 96px));max-width:var(--desktop-boxed, 1640px);margin:0 auto;padding-top:20px}@media(max-width:1279px){:host{width:calc(100% - var(--tablet-margin, 64px))}}@media(max-width:599px){:host{width:calc(100% - var(--mobile-margin, 32px))}}.search-results__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:25px}.search-results__title{margin:0;font-size:24px;font-weight:400;line-height:36px;letter-spacing:0;color:#212121}.search-results__filters{display:flex;gap:10px}.search-results__section{margin-bottom:30px}.search-results__section-header{display:flex;align-items:baseline;justify-content:space-between;padding-bottom:10px;border-bottom:1px solid #e9e9e9;margin-bottom:10px}.search-results__section-title{margin:0;font-size:15px;font-weight:400;line-height:22.5px;letter-spacing:0;color:#212121}.search-results__count{font-size:12px;font-weight:500;line-height:18px;letter-spacing:0;color:#909090}.search-results__row{display:grid;grid-template-columns:1fr 2fr 2fr;gap:15px;width:100%;padding:10px 0;border:none;border-bottom:1px solid #e9e9e9;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.search-results__row:hover:not(.search-results__row--head){background-color:#f3f3f3}.search-results__row--head{cursor:default;color:#909090;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0}.search-results__cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-results__cell--primary{font-weight:600}.search-results__cell--head{color:#909090}.search-results__ai-row{display:flex;align-items:center;gap:10px;width:100%;padding:10px 0;border:none;background:transparent;text-align:left;cursor:pointer;font-size:13px;font-weight:400;line-height:19.5px;letter-spacing:0;color:#212121}.search-results__ai-row:hover{background-color:#f3f3f3}.search-results__ai-icon{color:#223cff;flex-shrink:0}.search-results__hl{background-color:#fff59d;color:inherit;padding:0;border-radius:2px}\n"] }]
5961
6099
  }], propDecorators: { query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }], groups: [{ type: i0.Input, args: [{ isSignal: true, alias: "groups", required: false }] }], availableTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableTypes", required: false }] }], typeFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "typeFilter", required: false }] }, { type: i0.Output, args: ["typeFilterChange"] }], dateFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFilter", required: false }] }, { type: i0.Output, args: ["dateFilterChange"] }], resultClick: [{ type: i0.Output, args: ["resultClick"] }], typeFilterClick: [{ type: i0.Output, args: ["typeFilterClick"] }], dateFilterClick: [{ type: i0.Output, args: ["dateFilterClick"] }] } });
5962
6100
 
5963
6101
  const ROBIN_API_BASE_URL = new InjectionToken('ROBIN_API_BASE_URL', {