c3-components 0.15.3 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, signal, viewChild, TemplateRef, inject, ChangeDetectorRef, effect, Component, forwardRef, model, HostListener, Directive, NgModule, Inject, ViewContainerRef, Injector, Injectable, Pipe, output, ViewEncapsulation, Optional, computed, InjectionToken, contentChild, contentChildren, HostBinding, ElementRef, DestroyRef } from '@angular/core';
2
+ import { input, signal, viewChild, TemplateRef, computed, inject, ChangeDetectorRef, effect, Component, forwardRef, ElementRef, ViewContainerRef, HostListener, Directive, NgModule, Inject, Injector, Injectable, Pipe, output, ViewEncapsulation, Optional, InjectionToken, contentChild, contentChildren, HostBinding, model, DestroyRef, PLATFORM_ID, ChangeDetectionStrategy, ContentChildren, ViewChild } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
4
+ import { CommonModule, isPlatformBrowser } from '@angular/common';
5
5
  import * as i2 from '@angular/forms';
6
6
  import { NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule } from '@angular/forms';
7
- import * as i1$1 from '@angular/cdk/overlay';
8
- import { OverlayConfig, OverlayModule } from '@angular/cdk/overlay';
7
+ import { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';
9
8
  import { TemplatePortal } from '@angular/cdk/portal';
10
- import { Subscription, Subject, merge, takeUntil, BehaviorSubject, filter, skip, debounceTime, of, mergeMap, map, tap, startWith } from 'rxjs';
11
- import * as i1$2 from '@angular/material/dialog';
9
+ import { Subscription, Subject, merge, takeUntil, BehaviorSubject, filter, skip, debounceTime, of, mergeMap, map, tap, startWith, distinctUntilChanged } from 'rxjs';
10
+ import * as i1$1 from '@angular/material/dialog';
12
11
  import { MAT_DIALOG_DATA, MatDialog, MatDialogModule } from '@angular/material/dialog';
13
12
  import * as i3 from '@angular/material/button';
14
13
  import { MatButtonModule } from '@angular/material/button';
@@ -21,9 +20,9 @@ import * as i2$1 from '@angular/material/icon';
21
20
  import { MatIconModule } from '@angular/material/icon';
22
21
  import * as i5$1 from '@angular/material/toolbar';
23
22
  import { MatToolbarModule } from '@angular/material/toolbar';
24
- import * as i1$4 from '@angular/common/http';
23
+ import * as i1$3 from '@angular/common/http';
25
24
  import { provideHttpClient, withInterceptorsFromDi, HttpClient } from '@angular/common/http';
26
- import * as i1$3 from '@angular/platform-browser';
25
+ import * as i1$2 from '@angular/platform-browser';
27
26
  import * as i3$2 from '@angular/material/core';
28
27
  import { MatNativeDateModule, MatRippleModule } from '@angular/material/core';
29
28
  import * as i5$2 from '@angular/material/menu';
@@ -34,28 +33,54 @@ import autoAnimate from '@formkit/auto-animate';
34
33
  import { FlatTreeControl } from '@angular/cdk/tree';
35
34
  import * as i4$1 from '@angular/material/progress-spinner';
36
35
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
37
- import * as i1$5 from '@angular/material/tree';
36
+ import * as i1$4 from '@angular/material/tree';
38
37
  import { MatTreeFlattener, MatTreeFlatDataSource, MatTreeModule } from '@angular/material/tree';
39
- import * as i1$6 from '@angular/router';
40
- import { Router, ActivatedRoute, RouterModule } from '@angular/router';
38
+ import * as i1$5 from '@angular/router';
39
+ import { Router, ActivatedRoute, RouterModule, NavigationEnd, RouterLink } from '@angular/router';
41
40
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
42
41
 
43
42
  class C3DropdownComponent {
44
43
  constructor() {
44
+ /** Classes set directly on the component via [panelClass]. */
45
45
  this.panelClass = input(...(ngDevMode ? [undefined, { debugName: "panelClass" }] : []));
46
+ /** Classes set by the trigger directive via [c3DropdownClass] or [dropdownClass]. */
47
+ this.dropdownClass = signal(undefined, ...(ngDevMode ? [{ debugName: "dropdownClass" }] : []));
48
+ /** Whether the dropdown is currently open. */
46
49
  this.isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
47
50
  this.template = viewChild.required((TemplateRef));
51
+ /** Merges panelClass (from component input) and dropdownClass (from trigger). */
52
+ this.mergedClass = computed(() => {
53
+ const panel = this.panelClass();
54
+ const dropdown = this.dropdownClass();
55
+ if (!panel && !dropdown)
56
+ return '';
57
+ if (!panel)
58
+ return dropdown;
59
+ if (!dropdown)
60
+ return panel;
61
+ // Merge both into an array
62
+ const toArray = (v) => {
63
+ if (typeof v === 'string')
64
+ return v ? [v] : [];
65
+ if (Array.isArray(v))
66
+ return v;
67
+ if (v instanceof Set)
68
+ return [...v];
69
+ return Object.keys(v).filter((k) => v[k]);
70
+ };
71
+ return [...toArray(panel), ...toArray(dropdown)];
72
+ }, ...(ngDevMode ? [{ debugName: "mergedClass" }] : []));
48
73
  this._changeDetectorRef = inject(ChangeDetectorRef);
49
74
  effect(() => {
50
- if (this.panelClass()) {
51
- this._changeDetectorRef.markForCheck();
52
- }
75
+ // Trigger change detection when either class source changes
76
+ this.mergedClass();
77
+ this._changeDetectorRef.markForCheck();
53
78
  });
54
79
  }
55
80
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3DropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.14", type: C3DropdownComponent, isStandalone: false, selector: "c3-dropdown", inputs: { panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "template", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], ngImport: i0, template: `
81
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.14", type: C3DropdownComponent, isStandalone: false, selector: "c3-dropdown", inputs: { panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "template", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], exportAs: ["c3Dropdown"], ngImport: i0, template: `
57
82
  <ng-template>
58
- <div class="c3-dropdown-panel" [ngClass]="panelClass()">
83
+ <div class="c3-dropdown-panel" [ngClass]="mergedClass()">
59
84
  <ng-content></ng-content>
60
85
  </div>
61
86
  </ng-template>
@@ -65,9 +90,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
65
90
  type: Component,
66
91
  args: [{
67
92
  selector: 'c3-dropdown',
93
+ exportAs: 'c3Dropdown',
68
94
  template: `
69
95
  <ng-template>
70
- <div class="c3-dropdown-panel" [ngClass]="panelClass()">
96
+ <div class="c3-dropdown-panel" [ngClass]="mergedClass()">
71
97
  <ng-content></ng-content>
72
98
  </div>
73
99
  </ng-template>
@@ -84,28 +110,42 @@ const MAT_DROPDOWN_VALUE_ACCESSOR = {
84
110
  /**
85
111
  * @description The C3DropdownTrigger directive is used to display or hide a dropdown menu
86
112
  * C3DropdownComponent when an item is clicked.
87
- * @selector [c3Dropdown]
113
+ * @selector [c3Dropdown], [c3DropdownTrigger]
88
114
  * @exportAs c3DropdownTrigger
89
115
  * @input c3Dropdown - A reference to an instance of C3DropdownComponent.
116
+ * @input c3DropdownTrigger - A reference to an instance of C3DropdownComponent (alias).
90
117
  * @input c3DropdownDisabled - A boolean indicating whether the directive should be disabled.
91
- * @input c3DropdownClass - A string, an array of strings, a set of strings or a
92
- * object representing the CSS classes to be applied to the dropdown menu.
118
+ * @input c3DropdownClass / dropdownClass - CSS classes to be applied to the dropdown panel.
93
119
  */
94
120
  class C3DropdownTrigger {
95
- constructor(_element, _overlay, _viewContainerRef) {
96
- this._element = _element;
97
- this._overlay = _overlay;
98
- this._viewContainerRef = _viewContainerRef;
121
+ constructor() {
99
122
  this._closingActionsSubscription = Subscription.EMPTY;
100
123
  this._destroyed = new Subject();
101
- /** The dropdown menu instance */
102
- this.dropdown = model.required(...(ngDevMode ? [{ debugName: "dropdown", alias: 'c3DropdownTrigger' }] : [{
103
- alias: 'c3DropdownTrigger',
104
- }]));
124
+ this._element = inject((ElementRef));
125
+ this._overlay = inject(Overlay);
126
+ this._viewContainerRef = inject(ViewContainerRef);
127
+ /** The dropdown menu instance (via [c3Dropdown] binding). */
128
+ this.c3Dropdown = input(null, ...(ngDevMode ? [{ debugName: "c3Dropdown" }] : []));
129
+ /** The dropdown menu instance (via [c3DropdownTrigger] binding). */
130
+ this.c3DropdownTrigger = input(null, ...(ngDevMode ? [{ debugName: "c3DropdownTrigger" }] : []));
131
+ /** Resolved dropdown reference (supports both binding syntaxes). */
132
+ this._dropdown = computed(() => this.c3Dropdown() ?? this.c3DropdownTrigger(), ...(ngDevMode ? [{ debugName: "_dropdown" }] : []));
105
133
  /** Whether the dropdown is disabled. */
106
- this.dropdownDisabled = input(false, ...(ngDevMode ? [{ debugName: "dropdownDisabled" }] : []));
107
- /** Classes to be passed to the dropdown menu. Supports the same syntax as `ngClass`. */
108
- this.dropdownClass = input('', ...(ngDevMode ? [{ debugName: "dropdownClass" }] : []));
134
+ this.dropdownDisabled = input(false, ...(ngDevMode ? [{ debugName: "dropdownDisabled", alias: 'c3DropdownDisabled' }] : [{
135
+ alias: 'c3DropdownDisabled',
136
+ }]));
137
+ /** Classes to be passed to the dropdown menu via [c3DropdownClass]. */
138
+ this.c3DropdownClass = input(undefined, ...(ngDevMode ? [{ debugName: "c3DropdownClass" }] : []));
139
+ /** Classes to be passed to the dropdown menu via [dropdownClass]. */
140
+ this.dropdownClass = input(undefined, ...(ngDevMode ? [{ debugName: "dropdownClass" }] : []));
141
+ // Push trigger class changes to the dropdown component
142
+ effect(() => {
143
+ const dropdown = this._dropdown();
144
+ const cls = this.c3DropdownClass() ?? this.dropdownClass();
145
+ if (dropdown) {
146
+ dropdown.dropdownClass.set(cls);
147
+ }
148
+ });
109
149
  }
110
150
  onClick() {
111
151
  this.show();
@@ -117,19 +157,21 @@ class C3DropdownTrigger {
117
157
  this.close();
118
158
  }
119
159
  show() {
120
- if (!this.dropdown().template())
160
+ const dropdown = this._dropdown();
161
+ if (!dropdown?.template())
121
162
  return;
122
- this.dropdown().isOpen.set(true);
163
+ dropdown.isOpen.set(true);
123
164
  const overlayRef = this._overlay.create(this._getOverlayConfig());
124
- const portal = new TemplatePortal(this.dropdown().template(), this._viewContainerRef);
165
+ const portal = new TemplatePortal(dropdown.template(), this._viewContainerRef);
125
166
  overlayRef.attach(portal);
126
167
  this.overlayRef = overlayRef;
127
168
  this._closingActionsSubscription = this._menuClosingActions().subscribe(() => this.close());
128
169
  }
129
170
  close() {
130
- if (this.overlayRef && this.overlayRef.hasAttached())
171
+ if (this.overlayRef?.hasAttached()) {
131
172
  this.overlayRef.detach();
132
- this.dropdown().isOpen.set(false);
173
+ }
174
+ this._dropdown()?.isOpen.set(false);
133
175
  }
134
176
  _getOverlayConfig() {
135
177
  const belowPosition = {
@@ -143,9 +185,6 @@ class C3DropdownTrigger {
143
185
  originY: 'top',
144
186
  overlayX: 'start',
145
187
  overlayY: 'bottom',
146
- // The overlay edge connected to the trigger should have squared corners, while
147
- // the opposite end has rounded corners. We apply a CSS class to swap the
148
- // border-radius based on the overlay position.
149
188
  panelClass: 'mat-autocomplete-panel-above',
150
189
  };
151
190
  const positionStrategy = this._overlay
@@ -165,17 +204,18 @@ class C3DropdownTrigger {
165
204
  const detachments = this.overlayRef.detachments();
166
205
  return merge(backdrop, detachments).pipe(takeUntil(this._destroyed));
167
206
  }
168
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3DropdownTrigger, deps: [{ token: i0.ElementRef }, { token: i1$1.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
169
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.14", type: C3DropdownTrigger, isStandalone: false, selector: "[c3DropdownTrigger]", inputs: { dropdown: { classPropertyName: "dropdown", publicName: "c3DropdownTrigger", isSignal: true, isRequired: true, transformFunction: null }, dropdownDisabled: { classPropertyName: "dropdownDisabled", publicName: "dropdownDisabled", isSignal: true, isRequired: false, transformFunction: null }, dropdownClass: { classPropertyName: "dropdownClass", publicName: "dropdownClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dropdown: "c3DropdownTriggerChange" }, host: { listeners: { "click": "onClick()" } }, providers: [MAT_DROPDOWN_VALUE_ACCESSOR], ngImport: i0 }); }
207
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3DropdownTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
208
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.14", type: C3DropdownTrigger, isStandalone: false, selector: "[c3Dropdown], [c3DropdownTrigger]", inputs: { c3Dropdown: { classPropertyName: "c3Dropdown", publicName: "c3Dropdown", isSignal: true, isRequired: false, transformFunction: null }, c3DropdownTrigger: { classPropertyName: "c3DropdownTrigger", publicName: "c3DropdownTrigger", isSignal: true, isRequired: false, transformFunction: null }, dropdownDisabled: { classPropertyName: "dropdownDisabled", publicName: "c3DropdownDisabled", isSignal: true, isRequired: false, transformFunction: null }, c3DropdownClass: { classPropertyName: "c3DropdownClass", publicName: "c3DropdownClass", isSignal: true, isRequired: false, transformFunction: null }, dropdownClass: { classPropertyName: "dropdownClass", publicName: "dropdownClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()" } }, providers: [MAT_DROPDOWN_VALUE_ACCESSOR], exportAs: ["c3DropdownTrigger"], ngImport: i0 }); }
170
209
  }
171
210
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3DropdownTrigger, decorators: [{
172
211
  type: Directive,
173
212
  args: [{
174
- selector: '[c3DropdownTrigger]',
213
+ selector: '[c3Dropdown], [c3DropdownTrigger]',
214
+ exportAs: 'c3DropdownTrigger',
175
215
  providers: [MAT_DROPDOWN_VALUE_ACCESSOR],
176
216
  standalone: false,
177
217
  }]
178
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1$1.Overlay }, { type: i0.ViewContainerRef }], propDecorators: { dropdown: [{ type: i0.Input, args: [{ isSignal: true, alias: "c3DropdownTrigger", required: true }] }, { type: i0.Output, args: ["c3DropdownTriggerChange"] }], dropdownDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownDisabled", required: false }] }], dropdownClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownClass", required: false }] }], onClick: [{
218
+ }], ctorParameters: () => [], propDecorators: { c3Dropdown: [{ type: i0.Input, args: [{ isSignal: true, alias: "c3Dropdown", required: false }] }], c3DropdownTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "c3DropdownTrigger", required: false }] }], dropdownDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "c3DropdownDisabled", required: false }] }], c3DropdownClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "c3DropdownClass", required: false }] }], dropdownClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownClass", required: false }] }], onClick: [{
179
219
  type: HostListener,
180
220
  args: ['click']
181
221
  }] } });
@@ -202,7 +242,7 @@ class C3AlertDialogComponent {
202
242
  onNoClick() {
203
243
  this.dialogRef.close();
204
244
  }
205
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3AlertDialogComponent, deps: [{ token: i1$2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
245
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3AlertDialogComponent, deps: [{ token: i1$1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
206
246
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: C3AlertDialogComponent, isStandalone: false, selector: "AlertDialogComponent", ngImport: i0, template: `
207
247
  <mat-dialog-content>
208
248
  <div [innerHtml]="data.text"></div>
@@ -212,7 +252,7 @@ class C3AlertDialogComponent {
212
252
  {{ data.acceptText || 'ok' }}
213
253
  </button>
214
254
  </mat-dialog-actions>
215
- `, isInline: true, dependencies: [{ kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i1$2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }] }); }
255
+ `, isInline: true, dependencies: [{ kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i1$1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }] }); }
216
256
  }
217
257
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3AlertDialogComponent, decorators: [{
218
258
  type: Component,
@@ -230,7 +270,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
230
270
  `,
231
271
  standalone: false
232
272
  }]
233
- }], ctorParameters: () => [{ type: i1$2.MatDialogRef }, { type: undefined, decorators: [{
273
+ }], ctorParameters: () => [{ type: i1$1.MatDialogRef }, { type: undefined, decorators: [{
234
274
  type: Inject,
235
275
  args: [MAT_DIALOG_DATA]
236
276
  }] }] });
@@ -243,7 +283,7 @@ class ConfirmDialogComponent {
243
283
  onNoClick() {
244
284
  this.dialogRef.close();
245
285
  }
246
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ConfirmDialogComponent, deps: [{ token: i1$2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
286
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ConfirmDialogComponent, deps: [{ token: i1$1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
247
287
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: ConfirmDialogComponent, isStandalone: false, selector: "ConfirmDialogComponent", ngImport: i0, template: `
248
288
  <mat-dialog-content>
249
289
  <div [innerHtml]="data.text"></div>
@@ -256,7 +296,7 @@ class ConfirmDialogComponent {
256
296
  {{ data.accept?.text }}
257
297
  </button>
258
298
  </mat-dialog-actions>
259
- `, isInline: true, dependencies: [{ kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i1$2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }] }); }
299
+ `, isInline: true, dependencies: [{ kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i1$1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }] }); }
260
300
  }
261
301
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ConfirmDialogComponent, decorators: [{
262
302
  type: Component,
@@ -277,7 +317,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
277
317
  `,
278
318
  standalone: false
279
319
  }]
280
- }], ctorParameters: () => [{ type: i1$2.MatDialogRef }, { type: undefined, decorators: [{
320
+ }], ctorParameters: () => [{ type: i1$1.MatDialogRef }, { type: undefined, decorators: [{
281
321
  type: Inject,
282
322
  args: [MAT_DIALOG_DATA]
283
323
  }] }] });
@@ -292,7 +332,7 @@ class C3PromptDialogComponent {
292
332
  onNoClick() {
293
333
  this.dialogRef.close();
294
334
  }
295
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3PromptDialogComponent, deps: [{ token: i1$2.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
335
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3PromptDialogComponent, deps: [{ token: i1$1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
296
336
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: C3PromptDialogComponent, isStandalone: false, selector: "PrompDialogComponent", ngImport: i0, template: `
297
337
  <div mat-dialog-title>{{ data.text }}</div>
298
338
  <mat-dialog-content>
@@ -329,7 +369,7 @@ class C3PromptDialogComponent {
329
369
  {{ data.accept?.text }}
330
370
  </button>
331
371
  </mat-dialog-actions>
332
- `, isInline: true, styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i1$2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: i6.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
372
+ `, isInline: true, styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i1$1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: i6.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
333
373
  }
334
374
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3PromptDialogComponent, decorators: [{
335
375
  type: Component,
@@ -370,7 +410,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
370
410
  </button>
371
411
  </mat-dialog-actions>
372
412
  `, standalone: false, styles: ["mat-form-field{width:100%}\n"] }]
373
- }], ctorParameters: () => [{ type: i1$2.MatDialogRef }, { type: undefined, decorators: [{
413
+ }], ctorParameters: () => [{ type: i1$1.MatDialogRef }, { type: undefined, decorators: [{
374
414
  type: Inject,
375
415
  args: [MAT_DIALOG_DATA]
376
416
  }] }, { type: i2.FormBuilder }] });
@@ -438,7 +478,7 @@ class C3DialogEmbedChildComponent {
438
478
  }
439
479
  }
440
480
  }
441
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3DialogEmbedChildComponent, deps: [{ token: i1$2.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
481
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3DialogEmbedChildComponent, deps: [{ token: i1$1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
442
482
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: C3DialogEmbedChildComponent, isStandalone: false, selector: "C3DialogEmbedChildComponent", viewQueries: [{ propertyName: "target", first: true, predicate: ["target"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: `
443
483
  <div [class]="'dialog-content-container ' + (data.classContainer || '')">
444
484
  @if (data.toolbar) {
@@ -497,7 +537,7 @@ class C3DialogEmbedChildComponent {
497
537
  </div>
498
538
  }
499
539
  </div>
500
- `, isInline: true, styles: [".dialog-content-container{display:flex;flex-direction:column;height:100%;padding:1rem;overflow:auto}.dialog-content-container .dialog-content{display:flex;flex-direction:column;height:100%;overflow:auto;flex-grow:1}.dialog-content-container .mat-toolbar{display:flex;justify-content:space-between;align-items:center;border-radius:.25rem}.dialog-content-container .mat-toolbar span{color:inherit}.dialog-content-container .spacer{flex:1 1 auto;min-width:16px}.dialog-actions{display:flex;justify-content:flex-end;gap:.5rem}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i1$2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }] }); }
540
+ `, isInline: true, styles: [".dialog-content-container{display:flex;flex-direction:column;height:100%;padding:1rem;overflow:auto}.dialog-content-container .dialog-content{display:flex;flex-direction:column;height:100%;overflow:auto;flex-grow:1}.dialog-content-container .mat-toolbar{display:flex;justify-content:space-between;align-items:center;border-radius:.25rem}.dialog-content-container .mat-toolbar span{color:inherit}.dialog-content-container .spacer{flex:1 1 auto;min-width:16px}.dialog-actions{display:flex;justify-content:flex-end;gap:.5rem}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i1$1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }] }); }
501
541
  }
502
542
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3DialogEmbedChildComponent, decorators: [{
503
543
  type: Component,
@@ -560,7 +600,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
560
600
  }
561
601
  </div>
562
602
  `, standalone: false, styles: [".dialog-content-container{display:flex;flex-direction:column;height:100%;padding:1rem;overflow:auto}.dialog-content-container .dialog-content{display:flex;flex-direction:column;height:100%;overflow:auto;flex-grow:1}.dialog-content-container .mat-toolbar{display:flex;justify-content:space-between;align-items:center;border-radius:.25rem}.dialog-content-container .mat-toolbar span{color:inherit}.dialog-content-container .spacer{flex:1 1 auto;min-width:16px}.dialog-actions{display:flex;justify-content:flex-end;gap:.5rem}\n"] }]
563
- }], ctorParameters: () => [{ type: i1$2.MatDialogRef }, { type: undefined, decorators: [{
603
+ }], ctorParameters: () => [{ type: i1$1.MatDialogRef }, { type: undefined, decorators: [{
564
604
  type: Inject,
565
605
  args: [MAT_DIALOG_DATA]
566
606
  }] }, { type: i0.ChangeDetectorRef }], propDecorators: { target: [{ type: i0.ViewChild, args: ['target', { ...{
@@ -931,7 +971,7 @@ class C3SafeUrlPipe {
931
971
  transform(url) {
932
972
  return url ? this.sanitizer.bypassSecurityTrustResourceUrl(url) : '';
933
973
  }
934
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3SafeUrlPipe, deps: [{ token: i1$3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe }); }
974
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3SafeUrlPipe, deps: [{ token: i1$2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe }); }
935
975
  static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: C3SafeUrlPipe, isStandalone: true, name: "c3SafeUrl" }); }
936
976
  }
937
977
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3SafeUrlPipe, decorators: [{
@@ -940,7 +980,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
940
980
  name: 'c3SafeUrl',
941
981
  standalone: true,
942
982
  }]
943
- }], ctorParameters: () => [{ type: i1$3.DomSanitizer }] });
983
+ }], ctorParameters: () => [{ type: i1$2.DomSanitizer }] });
944
984
 
945
985
  class C3FileViewerImageComponent {
946
986
  constructor() {
@@ -1050,7 +1090,7 @@ class C3FileViewerComponent {
1050
1090
  this.fileViewer().styleHeight =
1051
1091
  'calc(100% - ' + this.screenHeightOccupied() + 'px)';
1052
1092
  }
1053
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3FileViewerComponent, deps: [{ token: 'config', optional: true }, { token: i1$4.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
1093
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3FileViewerComponent, deps: [{ token: 'config', optional: true }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
1054
1094
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: C3FileViewerComponent, isStandalone: false, selector: "c3-file-viewer", inputs: { screenHeightOccupied: { classPropertyName: "screenHeightOccupied", publicName: "screenHeightOccupied", isSignal: true, isRequired: false, transformFunction: null }, fileViewer: { classPropertyName: "fileViewer", publicName: "fileViewer", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { indexChange: "indexChange", configChange: "configChange", customFileEvent: "customFileEvent" }, host: { listeners: { "mouseover": "onMouseOver()", "mouseleave": "onMouseLeave()", "window:keyup.ArrowRight": "next($event)", "window:keyup.ArrowLeft": "previous($event)" }, classAttribute: "c3-file-viewer" }, usesOnChanges: true, ngImport: i0, template: "@if (fileViewer(); as viewer) {\n<div\n class=\"c3-file-container\"\n [c3-full-screen]=\"viewer.fullscreen$ | async\"\n [style.height]=\"viewer.styleHeight\"\n [style.backgroundColor]=\"viewer.config.containerBackgroundColor\"\n (wheel)=\"viewer.scrollZoom($event)\"\n (dragover)=\"viewer.onDragOver($event)\"\n>\n @if (viewer.currentFile.type.startsWith('image')) {\n <c3-file-viewer-image\n [fileViewer]=\"viewer\"\n [style]=\"viewer.style\"\n (dragstart)=\"viewer.onDragStart($event)\"\n />\n } @else if (viewer.currentFile.type.startsWith('video')) {\n <c3-file-viewer-video\n [fileViewer]=\"viewer\"\n />\n } @else if (viewer.currentFile.type.startsWith('application/pdf')) {\n <c3-file-viewer-pdf\n [fileViewer]=\"viewer\"\n />\n } @else {\n <c3-file-viewer-default\n [fileViewer]=\"viewer\"\n />\n }\n\n <!-- Div below will be used to hide the 'ghost' image when dragging -->\n <div></div>\n @if (viewer.loading) {\n <div class=\"spinner-container\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <c3-file-viewer-actions [fileViewer]=\"viewer\" />\n </div>\n}\n", styles: [".c3-file-container{position:relative;width:100%;display:flex;justify-content:center;align-items:center;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: FullScreenDirective, selector: "[C3FullScreen], [c3-full-screen]", inputs: ["c3Screenfull", "c3-full-screen"] }, { kind: "component", type: C3FileViewerActionsComponent, selector: "c3-file-viewer-actions", inputs: ["fileViewer"] }, { kind: "component", type: C3FileViewerImageComponent, selector: "c3-file-viewer-image, [c3-file-viewer-image]", inputs: ["fileViewer"], outputs: ["dragstart"] }, { kind: "component", type: C3FileViewerPdfComponent, selector: "c3-file-viewer-pdf", inputs: ["fileViewer"], outputs: ["dragstart"] }, { kind: "component", type: C3FileViewerVideoComponent, selector: "c3-file-viewer-video", inputs: ["fileViewer"] }, { kind: "component", type: C3FileViewerDefaultComponent, selector: "c3-file-viewer-default", inputs: ["fileViewer"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
1055
1095
  }
1056
1096
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3FileViewerComponent, decorators: [{
@@ -1063,7 +1103,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
1063
1103
  }, {
1064
1104
  type: Inject,
1065
1105
  args: ['config']
1066
- }] }, { type: i1$4.HttpClient }], propDecorators: { screenHeightOccupied: [{ type: i0.Input, args: [{ isSignal: true, alias: "screenHeightOccupied", required: false }] }], fileViewer: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileViewer", required: true }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], configChange: [{ type: i0.Output, args: ["configChange"] }], customFileEvent: [{ type: i0.Output, args: ["customFileEvent"] }], onMouseOver: [{
1106
+ }] }, { type: i1$3.HttpClient }], propDecorators: { screenHeightOccupied: [{ type: i0.Input, args: [{ isSignal: true, alias: "screenHeightOccupied", required: false }] }], fileViewer: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileViewer", required: true }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], configChange: [{ type: i0.Output, args: ["configChange"] }], customFileEvent: [{ type: i0.Output, args: ["customFileEvent"] }], onMouseOver: [{
1067
1107
  type: HostListener,
1068
1108
  args: ['mouseover']
1069
1109
  }], onMouseLeave: [{
@@ -1528,7 +1568,7 @@ class C3FileViewerDialogComponent {
1528
1568
  ...this.dialogConfig(),
1529
1569
  });
1530
1570
  }
1531
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3FileViewerDialogComponent, deps: [{ token: i1$2.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
1571
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3FileViewerDialogComponent, deps: [{ token: i1$1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
1532
1572
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.14", type: C3FileViewerDialogComponent, isStandalone: false, selector: "c3-file-viewer-dialog", inputs: { fileViewer: { classPropertyName: "fileViewer", publicName: "fileViewer", isSignal: true, isRequired: true, transformFunction: null }, dialogConfig: { classPropertyName: "dialogConfig", publicName: "dialogConfig", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "openDialog()" }, classAttribute: "c3-file-viewer-dialog" }, ngImport: i0, template: ` <ng-content /> `, isInline: true }); }
1533
1573
  }
1534
1574
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3FileViewerDialogComponent, decorators: [{
@@ -1541,7 +1581,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
1541
1581
  },
1542
1582
  standalone: false
1543
1583
  }]
1544
- }], ctorParameters: () => [{ type: i1$2.MatDialog }], propDecorators: { fileViewer: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileViewer", required: true }] }], dialogConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogConfig", required: false }] }], openDialog: [{
1584
+ }], ctorParameters: () => [{ type: i1$1.MatDialog }], propDecorators: { fileViewer: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileViewer", required: true }] }], dialogConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogConfig", required: false }] }], openDialog: [{
1545
1585
  type: HostListener,
1546
1586
  args: ['click']
1547
1587
  }] } });
@@ -2117,7 +2157,7 @@ class C3TreeComponent {
2117
2157
  });
2118
2158
  }
2119
2159
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2120
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: C3TreeComponent, isStandalone: true, selector: "c3-tree", inputs: { treeData: { classPropertyName: "treeData", publicName: "treeData", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { treeData: "treeDataChange", isLoading: "isLoadingChange", treeDataSelected: "treeDataSelected" }, ngImport: i0, template: "@if(isLoading()) {\r\n<div class=\"c3-tree-loader\">\r\n <mat-spinner diameter=\"50\"></mat-spinner>\r\n</div>\r\n}\r\n\r\n<mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding class=\"children\">\r\n <button mat-ripple (click)=\"treeDataSelected.emit(node)\">\r\n {{ node.name }}\r\n </button>\r\n </mat-tree-node>\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n class=\"has-children\"\r\n >\r\n <button matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\r\n </mat-icon>\r\n </button>\r\n <div class=\"mat-tree-node-content\">\r\n <ng-content>\r\n <span>{{ node.name }}</span>\r\n </ng-content>\r\n </div>\r\n </mat-tree-node>\r\n</mat-tree>\r\n", styles: [":host{display:block;width:100%;position:relative;min-height:100%;padding:4px 0}.c3-tree-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}mat-tree{width:100%;height:100%;background-color:transparent;border:1px solid var(--mat-divider-color);border-radius:4px;overflow:auto}mat-tree mat-tree-node{display:flex;align-items:center;justify-content:start;gap:1rem}mat-tree mat-tree-node.has-children>button{height:32px;width:32px;border-radius:50%;display:flex;justify-content:center;align-items:center;border:1px solid transparent;margin:.5rem}mat-tree mat-tree-node.has-children>button:hover{border-color:var(--mat-divider-color)}mat-tree mat-tree-node.has-children:hover{background-color:var(--background-hover)}mat-tree mat-tree-node.has-children .mat-tree-node-content{padding-right:.25rem;display:flex;justify-content:space-between;align-items:center;width:100%}mat-tree mat-tree-node.children button{width:100%;border-radius:.25rem;padding:0 1rem;height:2rem;text-align:left}mat-tree mat-tree-node.children button:hover{background-color:var(--background-hover)}mat-tree mat-tree-node:hover{background-color:var(--background-hover)}\n"], dependencies: [{ kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i1$5.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i1$5.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i1$5.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i1$5.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i1$5.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i3$2.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
2160
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: C3TreeComponent, isStandalone: true, selector: "c3-tree", inputs: { treeData: { classPropertyName: "treeData", publicName: "treeData", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { treeData: "treeDataChange", isLoading: "isLoadingChange", treeDataSelected: "treeDataSelected" }, ngImport: i0, template: "@if(isLoading()) {\r\n<div class=\"c3-tree-loader\">\r\n <mat-spinner diameter=\"50\"></mat-spinner>\r\n</div>\r\n}\r\n\r\n<mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding class=\"children\">\r\n <button mat-ripple (click)=\"treeDataSelected.emit(node)\">\r\n {{ node.name }}\r\n </button>\r\n </mat-tree-node>\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n class=\"has-children\"\r\n >\r\n <button matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\r\n </mat-icon>\r\n </button>\r\n <div class=\"mat-tree-node-content\">\r\n <ng-content>\r\n <span>{{ node.name }}</span>\r\n </ng-content>\r\n </div>\r\n </mat-tree-node>\r\n</mat-tree>\r\n", styles: [":host{display:block;width:100%;position:relative;min-height:100%;padding:4px 0}.c3-tree-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}mat-tree{width:100%;height:100%;background-color:transparent;border:1px solid var(--mat-divider-color);border-radius:4px;overflow:auto}mat-tree mat-tree-node{display:flex;align-items:center;justify-content:start;gap:1rem}mat-tree mat-tree-node.has-children>button{height:32px;width:32px;border-radius:50%;display:flex;justify-content:center;align-items:center;border:1px solid transparent;margin:.5rem}mat-tree mat-tree-node.has-children>button:hover{border-color:var(--mat-divider-color)}mat-tree mat-tree-node.has-children:hover{background-color:var(--background-hover)}mat-tree mat-tree-node.has-children .mat-tree-node-content{padding-right:.25rem;display:flex;justify-content:space-between;align-items:center;width:100%}mat-tree mat-tree-node.children button{width:100%;border-radius:.25rem;padding:0 1rem;height:2rem;text-align:left}mat-tree mat-tree-node.children button:hover{background-color:var(--background-hover)}mat-tree mat-tree-node:hover{background-color:var(--background-hover)}\n"], dependencies: [{ kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i1$4.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i1$4.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i1$4.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i1$4.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i1$4.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i3$2.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
2121
2161
  }
2122
2162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TreeComponent, decorators: [{
2123
2163
  type: Component,
@@ -2385,7 +2425,7 @@ class C3MenuComponent {
2385
2425
  this._c3Menu = inject(C3MenuService);
2386
2426
  }
2387
2427
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2388
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: C3MenuComponent, isStandalone: false, selector: "c3-menu", ngImport: i0, template: "@if(!_c3Menu.isHeadless()) {\n <div id=\"app-menu\">\n <div class=\"ui-scroll\">\n <ul>\n <ng-content></ng-content>\n </ul>\n </div>\n </div>\n}\n<div class=\"layout-main\" [class.headless]=\"_c3Menu.isHeadless()\">\n <router-outlet></router-outlet>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1$6.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
2428
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: C3MenuComponent, isStandalone: false, selector: "c3-menu", ngImport: i0, template: "@if(!_c3Menu.isHeadless()) {\n <div id=\"app-menu\">\n <div class=\"ui-scroll\">\n <ul>\n <ng-content></ng-content>\n </ul>\n </div>\n </div>\n}\n<div class=\"layout-main\" [class.headless]=\"_c3Menu.isHeadless()\">\n <router-outlet></router-outlet>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1$5.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
2389
2429
  }
2390
2430
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3MenuComponent, decorators: [{
2391
2431
  type: Component,
@@ -2422,7 +2462,7 @@ class C3NavItemComponent {
2422
2462
  });
2423
2463
  }
2424
2464
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3NavItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2425
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.14", type: C3NavItemComponent, isStandalone: false, selector: "c3-nav-item", inputs: { route: { classPropertyName: "route", publicName: "route", isSignal: true, isRequired: true, transformFunction: null }, itemTitle: { classPropertyName: "itemTitle", publicName: "itemTitle", isSignal: true, isRequired: true, transformFunction: null }, check: { classPropertyName: "check", publicName: "check", isSignal: true, isRequired: false, transformFunction: null }, isExternal: { classPropertyName: "isExternal", publicName: "isExternal", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "element", first: true, predicate: ["button"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<li #button>\n <a matRipple matRippleColor=\"#ffffff66\" [routerLink]=\"isExternal() ? null : route()\" [href]=\"isExternal() ? route() : null\">\n <ng-content></ng-content>\n <span> {{ itemTitle() }} </span>\n </a>\n</li>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1$6.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i3$2.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }] }); }
2465
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.14", type: C3NavItemComponent, isStandalone: false, selector: "c3-nav-item", inputs: { route: { classPropertyName: "route", publicName: "route", isSignal: true, isRequired: true, transformFunction: null }, itemTitle: { classPropertyName: "itemTitle", publicName: "itemTitle", isSignal: true, isRequired: true, transformFunction: null }, check: { classPropertyName: "check", publicName: "check", isSignal: true, isRequired: false, transformFunction: null }, isExternal: { classPropertyName: "isExternal", publicName: "isExternal", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "element", first: true, predicate: ["button"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<li #button>\n <a matRipple matRippleColor=\"#ffffff66\" [routerLink]=\"isExternal() ? null : route()\" [href]=\"isExternal() ? route() : null\">\n <ng-content></ng-content>\n <span> {{ itemTitle() }} </span>\n </a>\n</li>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1$5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i3$2.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }] }); }
2426
2466
  }
2427
2467
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3NavItemComponent, decorators: [{
2428
2468
  type: Component,
@@ -2446,6 +2486,551 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
2446
2486
  }]
2447
2487
  }] });
2448
2488
 
2489
+ /**
2490
+ * @description Directive that highlights matching text within the host element's content.
2491
+ * Wraps matched text in `<span class="c3-highlight">` inside a `<span class="c3-highlight_container">`.
2492
+ *
2493
+ * @selector [c3HighlightText]
2494
+ * @input c3HighlightText - The text to highlight.
2495
+ * @input c3HighlightTextCaseSensitive - Whether the match should be case-sensitive (default: false).
2496
+ *
2497
+ * @example
2498
+ * ```html
2499
+ * <p [c3HighlightText]="searchTerm">Some text to search in</p>
2500
+ * <p [c3HighlightText]="searchTerm" [c3HighlightTextCaseSensitive]="true">Case-sensitive match</p>
2501
+ * ```
2502
+ */
2503
+ class C3HighlightTextDirective {
2504
+ constructor() {
2505
+ /** The text string to highlight within the host element. */
2506
+ this.highlightText = input('', ...(ngDevMode ? [{ debugName: "highlightText", alias: 'c3HighlightText' }] : [{
2507
+ alias: 'c3HighlightText',
2508
+ }]));
2509
+ /** Whether the highlighting should be case-sensitive. Defaults to false. */
2510
+ this.caseSensitive = input(false, ...(ngDevMode ? [{ debugName: "caseSensitive", alias: 'c3HighlightTextCaseSensitive' }] : [{
2511
+ alias: 'c3HighlightTextCaseSensitive',
2512
+ }]));
2513
+ this._el = inject(ElementRef);
2514
+ effect(() => {
2515
+ const text = this.highlightText();
2516
+ const sensitive = this.caseSensitive();
2517
+ if (text) {
2518
+ this._applyHighlight(this._el.nativeElement, text, sensitive);
2519
+ }
2520
+ else {
2521
+ this._resetHighlights(this._el.nativeElement);
2522
+ }
2523
+ });
2524
+ }
2525
+ /** Walks the DOM tree and wraps matching text nodes in highlight spans. */
2526
+ _applyHighlight(element, text, caseSensitive) {
2527
+ this._resetHighlights(element);
2528
+ if (!text)
2529
+ return;
2530
+ const flags = caseSensitive ? '' : 'i';
2531
+ const regex = new RegExp(`(${this._escapeRegExp(text)})`, flags);
2532
+ const textNodes = this._getTextNodes(element);
2533
+ textNodes.forEach((node) => {
2534
+ const parentNode = node.parentNode;
2535
+ if (!(parentNode instanceof Element))
2536
+ return;
2537
+ if (parentNode.classList.contains('c3-highlight_container'))
2538
+ return;
2539
+ const match = node.textContent?.match(regex);
2540
+ if (match) {
2541
+ const wrapper = document.createElement('span');
2542
+ wrapper.classList.add('c3-highlight_container');
2543
+ wrapper.innerHTML = node.textContent.replace(regex, '<span class="c3-highlight">$1</span>');
2544
+ parentNode.replaceChild(wrapper, node);
2545
+ }
2546
+ });
2547
+ }
2548
+ /** Escapes special regex characters in the search text. */
2549
+ _escapeRegExp(text) {
2550
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
2551
+ }
2552
+ /** Removes all previously applied highlight wrappers, restoring original text nodes. */
2553
+ _resetHighlights(element) {
2554
+ element
2555
+ .querySelectorAll('.c3-highlight_container')
2556
+ .forEach((highlight) => {
2557
+ const parent = highlight.parentNode;
2558
+ if (parent) {
2559
+ parent.insertBefore(document.createTextNode(highlight.textContent ?? ''), highlight);
2560
+ parent.removeChild(highlight);
2561
+ }
2562
+ });
2563
+ }
2564
+ /** Recursively collects all text nodes within an element. */
2565
+ _getTextNodes(element) {
2566
+ const textNodes = [];
2567
+ const nodes = element.childNodes;
2568
+ for (let i = 0; i < nodes.length; i++) {
2569
+ const node = nodes[i];
2570
+ if (node.nodeType === Node.TEXT_NODE) {
2571
+ textNodes.push(node);
2572
+ }
2573
+ else if (node.nodeType === Node.ELEMENT_NODE) {
2574
+ textNodes.push(...this._getTextNodes(node));
2575
+ }
2576
+ }
2577
+ return textNodes;
2578
+ }
2579
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3HighlightTextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2580
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.14", type: C3HighlightTextDirective, isStandalone: true, selector: "[c3HighlightText]", inputs: { highlightText: { classPropertyName: "highlightText", publicName: "c3HighlightText", isSignal: true, isRequired: false, transformFunction: null }, caseSensitive: { classPropertyName: "caseSensitive", publicName: "c3HighlightTextCaseSensitive", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
2581
+ }
2582
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3HighlightTextDirective, decorators: [{
2583
+ type: Directive,
2584
+ args: [{
2585
+ selector: '[c3HighlightText]',
2586
+ standalone: true,
2587
+ }]
2588
+ }], ctorParameters: () => [], propDecorators: { highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "c3HighlightText", required: false }] }], caseSensitive: [{ type: i0.Input, args: [{ isSignal: true, alias: "c3HighlightTextCaseSensitive", required: false }] }] } });
2589
+
2590
+ class C3HighlightTextModule {
2591
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3HighlightTextModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2592
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: C3HighlightTextModule, imports: [C3HighlightTextDirective], exports: [C3HighlightTextDirective] }); }
2593
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3HighlightTextModule }); }
2594
+ }
2595
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3HighlightTextModule, decorators: [{
2596
+ type: NgModule,
2597
+ args: [{
2598
+ imports: [C3HighlightTextDirective],
2599
+ exports: [C3HighlightTextDirective],
2600
+ }]
2601
+ }] });
2602
+
2603
+ /**
2604
+ * @description A rounded title container that wraps projected content in a pill-shaped element.
2605
+ * Styled via the `c3-rounded-title-theme` SCSS mixin.
2606
+ *
2607
+ * @selector c3-rounded-title
2608
+ *
2609
+ * @example
2610
+ * ```html
2611
+ * <c3-rounded-title>My Section Title</c3-rounded-title>
2612
+ * ```
2613
+ */
2614
+ class C3RoundedTitleComponent {
2615
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3RoundedTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2616
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: C3RoundedTitleComponent, isStandalone: true, selector: "c3-rounded-title", host: { classAttribute: "c3-rounded-title" }, ngImport: i0, template: `
2617
+ <div class="title">
2618
+ <ng-content></ng-content>
2619
+ </div>
2620
+ `, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
2621
+ }
2622
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3RoundedTitleComponent, decorators: [{
2623
+ type: Component,
2624
+ args: [{
2625
+ selector: 'c3-rounded-title',
2626
+ template: `
2627
+ <div class="title">
2628
+ <ng-content></ng-content>
2629
+ </div>
2630
+ `,
2631
+ encapsulation: ViewEncapsulation.None,
2632
+ host: { class: 'c3-rounded-title' },
2633
+ standalone: true,
2634
+ }]
2635
+ }] });
2636
+
2637
+ class C3RoundedTitleModule {
2638
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3RoundedTitleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2639
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: C3RoundedTitleModule, imports: [C3RoundedTitleComponent], exports: [C3RoundedTitleComponent] }); }
2640
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3RoundedTitleModule }); }
2641
+ }
2642
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3RoundedTitleModule, decorators: [{
2643
+ type: NgModule,
2644
+ args: [{
2645
+ imports: [C3RoundedTitleComponent],
2646
+ exports: [C3RoundedTitleComponent],
2647
+ }]
2648
+ }] });
2649
+
2650
+ /**
2651
+ * @description A simple navigation bar component with elevation.
2652
+ * Content is projected via `ng-content`. Styled via the `c3-navbar-theme` SCSS mixin.
2653
+ *
2654
+ * @selector c3-navbar
2655
+ *
2656
+ * @example
2657
+ * ```html
2658
+ * <c3-navbar>
2659
+ * <a routerLink="/home" routerLinkActive="selected">Home</a>
2660
+ * <a routerLink="/settings" routerLinkActive="selected">Settings</a>
2661
+ * </c3-navbar>
2662
+ * ```
2663
+ */
2664
+ class C3NavbarComponent {
2665
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3NavbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2666
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: C3NavbarComponent, isStandalone: true, selector: "c3-navbar", host: { classAttribute: "c3-navbar mat-elevation-z4" }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
2667
+ }
2668
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3NavbarComponent, decorators: [{
2669
+ type: Component,
2670
+ args: [{
2671
+ selector: 'c3-navbar',
2672
+ template: `<ng-content></ng-content>`,
2673
+ encapsulation: ViewEncapsulation.None,
2674
+ host: { class: 'c3-navbar mat-elevation-z4' },
2675
+ standalone: true,
2676
+ }]
2677
+ }] });
2678
+
2679
+ class C3NavbarModule {
2680
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3NavbarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2681
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: C3NavbarModule, imports: [C3NavbarComponent], exports: [C3NavbarComponent] }); }
2682
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3NavbarModule }); }
2683
+ }
2684
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3NavbarModule, decorators: [{
2685
+ type: NgModule,
2686
+ args: [{
2687
+ imports: [C3NavbarComponent],
2688
+ exports: [C3NavbarComponent],
2689
+ }]
2690
+ }] });
2691
+
2692
+ /**
2693
+ * @description A side-panel modal component that slides in from the right.
2694
+ * Uses a `router-outlet` for content and provides a close button that navigates
2695
+ * back to the computed return route.
2696
+ *
2697
+ * The return route is automatically computed from the current route tree,
2698
+ * or can be overridden via the `returnRoute` input.
2699
+ *
2700
+ * @selector c3-modal
2701
+ *
2702
+ * @example
2703
+ * ```html
2704
+ * <!-- Auto-computed return route -->
2705
+ * <c3-modal></c3-modal>
2706
+ *
2707
+ * <!-- Custom return route -->
2708
+ * <c3-modal returnRoute="/dashboard"></c3-modal>
2709
+ * ```
2710
+ */
2711
+ class C3ModalComponent {
2712
+ constructor() {
2713
+ /** Override the auto-computed return route. */
2714
+ this.returnRoute = input(null, ...(ngDevMode ? [{ debugName: "returnRoute" }] : []));
2715
+ /** Resolved return route (input override or auto-computed). */
2716
+ this._returnRoute = signal('/', ...(ngDevMode ? [{ debugName: "_returnRoute" }] : []));
2717
+ this.height = signal('400px', ...(ngDevMode ? [{ debugName: "height" }] : []));
2718
+ this.posButton = signal(0, ...(ngDevMode ? [{ debugName: "posButton" }] : []));
2719
+ this.container = viewChild('container', ...(ngDevMode ? [{ debugName: "container" }] : []));
2720
+ this._activatedRoute = inject(ActivatedRoute);
2721
+ this._cdr = inject(ChangeDetectorRef);
2722
+ this._platformId = inject(PLATFORM_ID);
2723
+ // Compute return route from the route tree
2724
+ const snapshot = this._activatedRoute.snapshot;
2725
+ const currentSegment = snapshot.url[0];
2726
+ const autoReturn = this._activatedRoute.pathFromRoot.reduce((accu, route) => {
2727
+ if (route.snapshot.url[0] &&
2728
+ route.snapshot.url[0] !== currentSegment) {
2729
+ accu += route.snapshot.url[0].path + '/';
2730
+ }
2731
+ return accu;
2732
+ }, '/');
2733
+ this._returnRoute.set(autoReturn);
2734
+ }
2735
+ ngAfterViewInit() {
2736
+ if (!isPlatformBrowser(this._platformId))
2737
+ return;
2738
+ // Update height on window resize
2739
+ this._updateHeight();
2740
+ this._resizeListener = () => this._updateHeight();
2741
+ window.addEventListener('resize', this._resizeListener);
2742
+ // Watch container width changes for close button positioning
2743
+ this._containerWatcher = setInterval(() => {
2744
+ const el = this.container()?.nativeElement;
2745
+ if (el && this.posButton() !== el.clientWidth - 26) {
2746
+ this.posButton.set(el.clientWidth - 26);
2747
+ this._cdr.markForCheck();
2748
+ }
2749
+ }, 1000);
2750
+ }
2751
+ ngOnDestroy() {
2752
+ if (isPlatformBrowser(this._platformId)) {
2753
+ if (this._resizeListener) {
2754
+ window.removeEventListener('resize', this._resizeListener);
2755
+ }
2756
+ if (this._containerWatcher) {
2757
+ clearInterval(this._containerWatcher);
2758
+ }
2759
+ }
2760
+ }
2761
+ _updateHeight() {
2762
+ this.height.set(window.innerHeight + 'px');
2763
+ this._cdr.markForCheck();
2764
+ }
2765
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2766
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: C3ModalComponent, isStandalone: true, selector: "c3-modal", inputs: { returnRoute: { classPropertyName: "returnRoute", publicName: "returnRoute", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "c3-modal" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, isSignal: true }], ngImport: i0, template: `
2767
+ <div class="outer" [routerLink]="_returnRoute()"></div>
2768
+ <div #container class="container" [style.height]="height()">
2769
+ <div>
2770
+ <router-outlet></router-outlet>
2771
+ </div>
2772
+ </div>
2773
+ @if (posButton()) {
2774
+ <button
2775
+ [routerLink]="_returnRoute()"
2776
+ class="close-button c3-modal"
2777
+ mat-fab
2778
+ [style.right.px]="posButton()"
2779
+ >
2780
+ <mat-icon>close</mat-icon>
2781
+ </button>
2782
+ }
2783
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$5.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1$5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2784
+ }
2785
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3ModalComponent, decorators: [{
2786
+ type: Component,
2787
+ args: [{
2788
+ selector: 'c3-modal',
2789
+ template: `
2790
+ <div class="outer" [routerLink]="_returnRoute()"></div>
2791
+ <div #container class="container" [style.height]="height()">
2792
+ <div>
2793
+ <router-outlet></router-outlet>
2794
+ </div>
2795
+ </div>
2796
+ @if (posButton()) {
2797
+ <button
2798
+ [routerLink]="_returnRoute()"
2799
+ class="close-button c3-modal"
2800
+ mat-fab
2801
+ [style.right.px]="posButton()"
2802
+ >
2803
+ <mat-icon>close</mat-icon>
2804
+ </button>
2805
+ }
2806
+ `,
2807
+ changeDetection: ChangeDetectionStrategy.OnPush,
2808
+ encapsulation: ViewEncapsulation.None,
2809
+ host: { class: 'c3-modal' },
2810
+ standalone: true,
2811
+ imports: [RouterModule, MatIconModule, MatButtonModule],
2812
+ }]
2813
+ }], ctorParameters: () => [], propDecorators: { returnRoute: [{ type: i0.Input, args: [{ isSignal: true, alias: "returnRoute", required: false }] }], container: [{ type: i0.ViewChild, args: ['container', { isSignal: true }] }] } });
2814
+
2815
+ class C3ModalModule {
2816
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3ModalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2817
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: C3ModalModule, imports: [C3ModalComponent], exports: [C3ModalComponent] }); }
2818
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3ModalModule, imports: [C3ModalComponent] }); }
2819
+ }
2820
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3ModalModule, decorators: [{
2821
+ type: NgModule,
2822
+ args: [{
2823
+ imports: [C3ModalComponent],
2824
+ exports: [C3ModalComponent],
2825
+ }]
2826
+ }] });
2827
+
2828
+ /**
2829
+ * @description A single tab item used inside `c3-tabs`.
2830
+ * Provides a ripple effect and wraps projected content.
2831
+ *
2832
+ * @selector c3-tab, [c3-tab]
2833
+ *
2834
+ * @example
2835
+ * ```html
2836
+ * <c3-tabs>
2837
+ * <c3-tab><a routerLink="/page-a">Page A</a></c3-tab>
2838
+ * <c3-tab><a routerLink="/page-b">Page B</a></c3-tab>
2839
+ * </c3-tabs>
2840
+ * ```
2841
+ */
2842
+ class C3TabComponent {
2843
+ constructor() {
2844
+ this.elementRef = inject(ElementRef);
2845
+ }
2846
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2847
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: C3TabComponent, isStandalone: true, selector: "c3-tab, [c3-tab]", host: { classAttribute: "item" }, ngImport: i0, template: `
2848
+ <div matRipple style="padding: 0 8px; border-radius: 18px">
2849
+ <ng-content></ng-content>
2850
+ </div>
2851
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i3$2.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }], encapsulation: i0.ViewEncapsulation.None }); }
2852
+ }
2853
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TabComponent, decorators: [{
2854
+ type: Component,
2855
+ args: [{
2856
+ selector: 'c3-tab, [c3-tab]',
2857
+ template: `
2858
+ <div matRipple style="padding: 0 8px; border-radius: 18px">
2859
+ <ng-content></ng-content>
2860
+ </div>
2861
+ `,
2862
+ encapsulation: ViewEncapsulation.None,
2863
+ host: { class: 'item' },
2864
+ imports: [MatRippleModule],
2865
+ }]
2866
+ }] });
2867
+
2868
+ /**
2869
+ * @description A pill-shaped tab bar with an animated background indicator
2870
+ * that slides to the active tab. Works with Angular Router to auto-detect
2871
+ * the active route.
2872
+ *
2873
+ * @selector c3-tabs, [c3-tabs]
2874
+ * @input ignoreQueryParams - If true, query params are ignored when matching active route.
2875
+ *
2876
+ * @example
2877
+ * ```html
2878
+ * <c3-tabs>
2879
+ * <c3-tab><a routerLink="/page-a">Page A</a></c3-tab>
2880
+ * <c3-tab><a routerLink="/page-b">Page B</a></c3-tab>
2881
+ * </c3-tabs>
2882
+ *
2883
+ * <!-- Ignore query params for route matching -->
2884
+ * <c3-tabs [ignoreQueryParams]="true">
2885
+ * <c3-tab><a routerLink="/search" [queryParams]="{ q: 'test' }">Search</a></c3-tab>
2886
+ * </c3-tabs>
2887
+ * ```
2888
+ */
2889
+ class C3TabsComponent {
2890
+ constructor() {
2891
+ /** Whether to ignore query parameters when matching the active route. */
2892
+ this.ignoreQueryParams = input(false, ...(ngDevMode ? [{ debugName: "ignoreQueryParams" }] : []));
2893
+ this.btnBackgroundOffset = 0;
2894
+ this.btnWidth = 0;
2895
+ this._router = inject(Router);
2896
+ this._cdr = inject(ChangeDetectorRef);
2897
+ this._platformId = inject(PLATFORM_ID);
2898
+ this._destroyRef = inject(DestroyRef);
2899
+ }
2900
+ ngAfterViewInit() {
2901
+ if (!this.items.length)
2902
+ return;
2903
+ if (!this.links.length) {
2904
+ this.setSelectedItem();
2905
+ }
2906
+ else {
2907
+ // Defer subscription to avoid ExpressionChangedAfterItHasBeenCheckedError
2908
+ setTimeout(() => this._router.events
2909
+ .pipe(startWith(null), filter((event) => event instanceof NavigationEnd || !this.selectedItem), map(() => this._getActiveTabIndex()), distinctUntilChanged(), takeUntilDestroyed(this._destroyRef))
2910
+ .subscribe((index) => this.setSelectedItem(index)), 300);
2911
+ }
2912
+ this._cdr.detectChanges();
2913
+ }
2914
+ /**
2915
+ * Gets the left position of an element relative to the viewport.
2916
+ * Returns 0 on server platform.
2917
+ */
2918
+ getLeftPositionElement(element) {
2919
+ if (!isPlatformBrowser(this._platformId))
2920
+ return 0;
2921
+ return element.getBoundingClientRect().left;
2922
+ }
2923
+ /** Computes the offset for the sliding background indicator. */
2924
+ getBtnBackgroundOffset() {
2925
+ try {
2926
+ if (!this.selectedItem)
2927
+ return 0;
2928
+ return (this.getLeftPositionElement(this.selectedItem.elementRef.nativeElement) -
2929
+ this.getLeftPositionElement(this.containerElement.nativeElement) +
2930
+ 'px');
2931
+ }
2932
+ catch {
2933
+ return 0;
2934
+ }
2935
+ }
2936
+ /** Selects a tab by index and updates the indicator position. */
2937
+ setSelectedItem(index = 0) {
2938
+ this.selectedItem = this.items.get(index);
2939
+ setTimeout(() => this._setBtn(), 0);
2940
+ }
2941
+ /**
2942
+ * Finds the active tab index by matching router links.
2943
+ * When multiple links match, the most specific one (most query params) wins.
2944
+ */
2945
+ _getActiveTabIndex() {
2946
+ const opts = {
2947
+ paths: 'exact',
2948
+ queryParams: this.ignoreQueryParams()
2949
+ ? 'ignored'
2950
+ : 'subset',
2951
+ fragment: 'ignored',
2952
+ matrixParams: 'ignored',
2953
+ };
2954
+ const linkArray = this.links.toArray();
2955
+ let bestIndex = 0;
2956
+ let bestParamCount = -1;
2957
+ for (let i = 0; i < linkArray.length; i++) {
2958
+ const link = linkArray[i];
2959
+ if (link.urlTree == null ||
2960
+ !this._router.isActive(link.urlTree, opts))
2961
+ continue;
2962
+ const paramCount = Object.keys(link.urlTree.queryParams).length;
2963
+ if (paramCount > bestParamCount) {
2964
+ bestParamCount = paramCount;
2965
+ bestIndex = i;
2966
+ }
2967
+ }
2968
+ return bestIndex;
2969
+ }
2970
+ /** Updates the sliding indicator position and width. */
2971
+ _setBtn() {
2972
+ this.btnBackgroundOffset = this.getBtnBackgroundOffset();
2973
+ if (this.selectedItem) {
2974
+ this.btnWidth =
2975
+ this.selectedItem.elementRef.nativeElement.offsetWidth + 'px';
2976
+ }
2977
+ this._cdr.markForCheck();
2978
+ }
2979
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2980
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.14", type: C3TabsComponent, isStandalone: false, selector: "c3-tabs, [c3-tabs]", inputs: { ignoreQueryParams: { classPropertyName: "ignoreQueryParams", publicName: "ignoreQueryParams", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "c3-tabs" }, queries: [{ propertyName: "items", predicate: C3TabComponent }, { propertyName: "links", predicate: RouterLink }], viewQueries: [{ propertyName: "containerElement", first: true, predicate: ["mc"], descendants: true }], ngImport: i0, template: `
2981
+ <div class="flex flex-row items-center justify-center">
2982
+ <div #mc class="menu-text__container mat-elevation-z2">
2983
+ <div
2984
+ class="toggle-btn__background mat-elevation-z2"
2985
+ [style]="{ left: btnBackgroundOffset, width: btnWidth }"
2986
+ >
2987
+ <em>&nbsp;</em>
2988
+ </div>
2989
+ <ng-content></ng-content>
2990
+ </div>
2991
+ </div>
2992
+ `, isInline: true, styles: [".c3-tabs{display:block}.c3-tabs .menu-text__container{position:relative;display:flex;border-radius:26px;height:44px;padding:4px}.c3-tabs .menu-text__container .item,.c3-tabs .menu-text__container .item a{z-index:1;cursor:pointer;transition:.5s all ease;line-height:36px;text-decoration:none;color:#fff;padding:0 8px}.c3-tabs .menu-text__container .item:not(.active),.c3-tabs .menu-text__container .item:not(.active) a{color:#fff}.c3-tabs .menu-text__container .toggle-btn__background{position:absolute;width:70px;border-radius:18px;height:36px;transition:.5s all ease;-webkit-user-select:none;user-select:none}\n"], encapsulation: i0.ViewEncapsulation.None }); }
2993
+ }
2994
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TabsComponent, decorators: [{
2995
+ type: Component,
2996
+ args: [{ selector: 'c3-tabs, [c3-tabs]', template: `
2997
+ <div class="flex flex-row items-center justify-center">
2998
+ <div #mc class="menu-text__container mat-elevation-z2">
2999
+ <div
3000
+ class="toggle-btn__background mat-elevation-z2"
3001
+ [style]="{ left: btnBackgroundOffset, width: btnWidth }"
3002
+ >
3003
+ <em>&nbsp;</em>
3004
+ </div>
3005
+ <ng-content></ng-content>
3006
+ </div>
3007
+ </div>
3008
+ `, encapsulation: ViewEncapsulation.None, host: { class: 'c3-tabs' }, standalone: false, styles: [".c3-tabs{display:block}.c3-tabs .menu-text__container{position:relative;display:flex;border-radius:26px;height:44px;padding:4px}.c3-tabs .menu-text__container .item,.c3-tabs .menu-text__container .item a{z-index:1;cursor:pointer;transition:.5s all ease;line-height:36px;text-decoration:none;color:#fff;padding:0 8px}.c3-tabs .menu-text__container .item:not(.active),.c3-tabs .menu-text__container .item:not(.active) a{color:#fff}.c3-tabs .menu-text__container .toggle-btn__background{position:absolute;width:70px;border-radius:18px;height:36px;transition:.5s all ease;-webkit-user-select:none;user-select:none}\n"] }]
3009
+ }], propDecorators: { ignoreQueryParams: [{ type: i0.Input, args: [{ isSignal: true, alias: "ignoreQueryParams", required: false }] }], containerElement: [{
3010
+ type: ViewChild,
3011
+ args: ['mc']
3012
+ }], items: [{
3013
+ type: ContentChildren,
3014
+ args: [C3TabComponent]
3015
+ }], links: [{
3016
+ type: ContentChildren,
3017
+ args: [RouterLink]
3018
+ }] } });
3019
+
3020
+ class C3TabsModule {
3021
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TabsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3022
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: C3TabsModule, declarations: [C3TabsComponent], imports: [CommonModule, RouterModule, MatRippleModule, C3TabComponent], exports: [C3TabsComponent, C3TabComponent] }); }
3023
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TabsModule, imports: [CommonModule, RouterModule, MatRippleModule, C3TabComponent] }); }
3024
+ }
3025
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: C3TabsModule, decorators: [{
3026
+ type: NgModule,
3027
+ args: [{
3028
+ declarations: [C3TabsComponent],
3029
+ imports: [CommonModule, RouterModule, MatRippleModule, C3TabComponent],
3030
+ exports: [C3TabsComponent, C3TabComponent],
3031
+ }]
3032
+ }] });
3033
+
2449
3034
  /*
2450
3035
  * Public API Surface of c3-components
2451
3036
  */
@@ -2460,5 +3045,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
2460
3045
  * Generated bundle index. Do not edit.
2461
3046
  */
2462
3047
 
2463
- export { C3AlertDialogComponent, C3AutoAnimateDirective, C3DialogEmbedChildComponent, C3DialogModule, C3DialogService, C3DialogTemplateComponent, C3DropdownComponent, C3DropdownModule, C3DropdownTrigger, C3ExpansionComponent, C3ExpansionHeaderComponent, C3ExpansionModule, C3FileDisplayCardComponent, C3FileDisplayGridComponent, C3FileDisplayIconComponent, C3FileDisplayListCellDefDirective, C3FileDisplayListColumnDefDirective, C3FileDisplayListComponent, C3FileDisplayListHeaderCellDefDirective, C3FileDisplayerModule, C3FileViewer, C3FileViewerComponent, C3FileViewerDialog, C3FileViewerDialogComponent, C3FileViewerModule, C3FlowingMenuComponent, C3FlowingMenuItemComponent, C3FlowingMenuItemContentComponent, C3FlowingMenuModule, C3MenuComponent, C3MenuModule, C3NavItemComponent, C3OpenDialogDirective, C3PreventClickDirective, C3PreventKeyboardEventDirective, C3PromptDialogComponent, C3SafeUrlPipe, C3SelectOnFocusDirective, C3StopPropagationDirective, C3TraceCardAlignLeftDirective, C3TraceCardAlignRightDirective, C3TraceCardComponent, C3TraceCardContentComponent, C3TraceCardModule, C3TraceCardTitleComponent, C3TreeComponent, C3_FILE_DISPLAY_LIST, ConfirmDialogComponent, CustomFileEvent, FullScreenDirective, MAT_DROPDOWN_VALUE_ACCESSOR };
3048
+ export { C3AlertDialogComponent, C3AutoAnimateDirective, C3DialogEmbedChildComponent, C3DialogModule, C3DialogService, C3DialogTemplateComponent, C3DropdownComponent, C3DropdownModule, C3DropdownTrigger, C3ExpansionComponent, C3ExpansionHeaderComponent, C3ExpansionModule, C3FileDisplayCardComponent, C3FileDisplayGridComponent, C3FileDisplayIconComponent, C3FileDisplayListCellDefDirective, C3FileDisplayListColumnDefDirective, C3FileDisplayListComponent, C3FileDisplayListHeaderCellDefDirective, C3FileDisplayerModule, C3FileViewer, C3FileViewerComponent, C3FileViewerDialog, C3FileViewerDialogComponent, C3FileViewerModule, C3FlowingMenuComponent, C3FlowingMenuItemComponent, C3FlowingMenuItemContentComponent, C3FlowingMenuModule, C3HighlightTextDirective, C3HighlightTextModule, C3MenuComponent, C3MenuModule, C3ModalComponent, C3ModalModule, C3NavItemComponent, C3NavbarComponent, C3NavbarModule, C3OpenDialogDirective, C3PreventClickDirective, C3PreventKeyboardEventDirective, C3PromptDialogComponent, C3RoundedTitleComponent, C3RoundedTitleModule, C3SafeUrlPipe, C3SelectOnFocusDirective, C3StopPropagationDirective, C3TabComponent, C3TabsComponent, C3TabsModule, C3TraceCardAlignLeftDirective, C3TraceCardAlignRightDirective, C3TraceCardComponent, C3TraceCardContentComponent, C3TraceCardModule, C3TraceCardTitleComponent, C3TreeComponent, C3_FILE_DISPLAY_LIST, ConfirmDialogComponent, CustomFileEvent, FullScreenDirective, MAT_DROPDOWN_VALUE_ACCESSOR };
2464
3049
  //# sourceMappingURL=c3-components.mjs.map