@vsn-ux/ngx-gaia 0.2.0 → 0.2.2

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,16 +1,21 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, numberAttribute, Component, ViewEncapsulation, Attribute, NgModule, ChangeDetectionStrategy, Injectable, makeEnvironmentProviders, booleanAttribute, output, computed, contentChild, forwardRef, Injector, signal, linkedSignal, Directive, model, HostListener, InjectionToken, effect, TemplateRef, NgZone, Input } from '@angular/core';
2
+ import { inject, ElementRef, input, numberAttribute, Component, ViewEncapsulation, Attribute, NgModule, ChangeDetectionStrategy, Injectable, makeEnvironmentProviders, booleanAttribute, output, computed, contentChild, forwardRef, Injector, signal, linkedSignal, Directive, model, HostListener, InjectionToken, effect, TemplateRef, NgZone, Input, viewChild, contentChildren, isDevMode, afterNextRender } from '@angular/core';
3
3
  import * as i1 from 'lucide-angular';
4
4
  import { LucideAngularModule, X, CircleCheck, TriangleAlert, OctagonAlert, Info, Minus, Check, ChevronUp, ChevronDown } from 'lucide-angular';
5
- import { NG_VALUE_ACCESSOR, NgControl, NG_VALIDATORS, CheckboxRequiredValidator } from '@angular/forms';
5
+ import { NG_VALUE_ACCESSOR, NgControl, NG_VALIDATORS, CheckboxRequiredValidator, RequiredValidator } from '@angular/forms';
6
6
  import * as i1$1 from '@angular/cdk/menu';
7
7
  import { CdkMenu, CdkMenuItem, CdkMenuTrigger } from '@angular/cdk/menu';
8
- import { toSignal } from '@angular/core/rxjs-interop';
9
- import { merge, map, Subject, takeUntil } from 'rxjs';
10
- import { Overlay } from '@angular/cdk/overlay';
8
+ import { toSignal, outputToObservable } from '@angular/core/rxjs-interop';
9
+ import { merge, map, Subject, takeUntil, firstValueFrom } from 'rxjs';
10
+ import * as i1$3 from '@angular/cdk/overlay';
11
+ import { Overlay, OverlayModule } from '@angular/cdk/overlay';
11
12
  import { ComponentPortal } from '@angular/cdk/portal';
12
13
  import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
13
14
  import { NgTemplateOutlet } from '@angular/common';
15
+ import * as i1$2 from '@angular/cdk/listbox';
16
+ import { CdkOption, CdkListbox } from '@angular/cdk/listbox';
17
+ import * as i2 from '@angular/cdk/observers';
18
+ import { ObserversModule } from '@angular/cdk/observers';
14
19
 
15
20
  class GaIconComponent {
16
21
  elementRef = inject(ElementRef);
@@ -592,7 +597,10 @@ class GaInputDirective {
592
597
  hasWrapper = inject(GaInputComponent, { optional: true });
593
598
  implicitInvalid = signal(false);
594
599
  implicitErrors = signal(null);
595
- invalidInput = input(null, { transform: booleanAttribute });
600
+ invalidInput = input(null, {
601
+ alias: 'invalid',
602
+ transform: booleanAttribute,
603
+ });
596
604
  idInput = input(undefined, { alias: 'id' });
597
605
  invalid = computed(() => {
598
606
  return this.invalidInput() ?? this.implicitInvalid();
@@ -612,7 +620,7 @@ class GaInputDirective {
612
620
  }
613
621
  }
614
622
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Component });
615
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.5", type: GaInputDirective, isStandalone: true, selector: "[gaInput]", inputs: { invalidInput: { classPropertyName: "invalidInput", publicName: "invalidInput", isSignal: true, isRequired: false, transformFunction: null }, idInput: { classPropertyName: "idInput", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "id()", "class.ga-input": "!hasWrapper", "class.ga-input--invalid": "!hasWrapper && invalid()" } }, providers: [{ provide: GA_FORM_CONTROL, useExisting: GaInputDirective }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
623
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.5", type: GaInputDirective, isStandalone: true, selector: "[gaInput]", inputs: { invalidInput: { classPropertyName: "invalidInput", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, idInput: { classPropertyName: "idInput", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "id()", "class.ga-input": "!hasWrapper", "class.ga-input--invalid": "!hasWrapper && invalid()" } }, providers: [{ provide: GA_FORM_CONTROL, useExisting: GaInputDirective }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
616
624
  }
617
625
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaInputDirective, decorators: [{
618
626
  type: Component,
@@ -895,13 +903,13 @@ class GaTooltipComponent {
895
903
  this.mouseLeaveSubject.next();
896
904
  }
897
905
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
898
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: GaTooltipComponent, isStandalone: true, selector: "ga-tooltip", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hideTriggered: "hideTriggered" }, host: { listeners: { "mouseenter": "handleMouseEnter()", "mouseleave": "handleMouseLeave()" }, properties: { "attr.style": "inlineStyle()" } }, ngImport: i0, template: "<div [class]=\"cssClass()\">\n @if (text()) {\n {{ text() }}\n } @else if (template()) {\n <ng-container\n [ngTemplateOutlet]=\"template()\"\n [ngTemplateOutletContext]=\"{ hide: triggerHide }\"\n />\n }\n</div>\n", styles: [".top-start :host,.top-center :host,.top-end :host{padding-bottom:var(--ga-tooltip-offset)}.bottom-start :host,.bottom-center :host,.bottom-end :host{padding-top:var(--ga-tooltip-offset)}.left-top :host,.left-center :host,.left-bottom :host{padding-right:var(--ga-tooltip-offset)}.right-top :host,.right-center :host,.right-bottom :host{padding-left:var(--ga-tooltip-offset)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
906
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: GaTooltipComponent, isStandalone: true, selector: "ga-tooltip", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hideTriggered: "hideTriggered" }, host: { listeners: { "mouseenter": "handleMouseEnter()", "mouseleave": "handleMouseLeave()" }, properties: { "attr.style": "inlineStyle()" } }, ngImport: i0, template: "<div [class]=\"cssClass()\">\n @if (text()) {\n {{ text() }}\n } @else if (template()) {\n <ng-container\n [ngTemplateOutlet]=\"template()\"\n [ngTemplateOutletContext]=\"{ hide: triggerHide }\"\n />\n }\n</div>\n", styles: [".top-start :host,.top-center :host,.top-end :host{padding-bottom:var(--ga-tooltip-offset)}.bottom-start :host,.bottom-center :host,.bottom-end :host{padding-top:var(--ga-tooltip-offset)}.left-start :host,.left-center :host,.left-end :host{padding-right:var(--ga-tooltip-offset)}.right-start :host,.right-center :host,.right-end :host{padding-left:var(--ga-tooltip-offset)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
899
907
  }
900
908
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaTooltipComponent, decorators: [{
901
909
  type: Component,
902
910
  args: [{ selector: 'ga-tooltip', imports: [NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, host: {
903
911
  '[attr.style]': 'inlineStyle()',
904
- }, template: "<div [class]=\"cssClass()\">\n @if (text()) {\n {{ text() }}\n } @else if (template()) {\n <ng-container\n [ngTemplateOutlet]=\"template()\"\n [ngTemplateOutletContext]=\"{ hide: triggerHide }\"\n />\n }\n</div>\n", styles: [".top-start :host,.top-center :host,.top-end :host{padding-bottom:var(--ga-tooltip-offset)}.bottom-start :host,.bottom-center :host,.bottom-end :host{padding-top:var(--ga-tooltip-offset)}.left-top :host,.left-center :host,.left-bottom :host{padding-right:var(--ga-tooltip-offset)}.right-top :host,.right-center :host,.right-bottom :host{padding-left:var(--ga-tooltip-offset)}\n"] }]
912
+ }, template: "<div [class]=\"cssClass()\">\n @if (text()) {\n {{ text() }}\n } @else if (template()) {\n <ng-container\n [ngTemplateOutlet]=\"template()\"\n [ngTemplateOutletContext]=\"{ hide: triggerHide }\"\n />\n }\n</div>\n", styles: [".top-start :host,.top-center :host,.top-end :host{padding-bottom:var(--ga-tooltip-offset)}.bottom-start :host,.bottom-center :host,.bottom-end :host{padding-top:var(--ga-tooltip-offset)}.left-start :host,.left-center :host,.left-end :host{padding-right:var(--ga-tooltip-offset)}.right-start :host,.right-center :host,.right-end :host{padding-left:var(--ga-tooltip-offset)}\n"] }]
905
913
  }], propDecorators: { handleMouseEnter: [{
906
914
  type: HostListener,
907
915
  args: ['mouseenter']
@@ -1118,13 +1126,14 @@ class GaTooltipDirective {
1118
1126
  position.withPositions(positions);
1119
1127
  }
1120
1128
  getPositions(preferredPlacement) {
1129
+ const [position, direction] = preferredPlacement.split('-');
1121
1130
  let positionedOverlayY;
1122
1131
  let positionedOffsetY;
1123
- if (preferredPlacement.endsWith('start')) {
1132
+ if (direction === 'start') {
1124
1133
  positionedOverlayY = 'top';
1125
1134
  positionedOffsetY = -24;
1126
1135
  }
1127
- else if (preferredPlacement.endsWith('end')) {
1136
+ else if (direction === 'end') {
1128
1137
  positionedOverlayY = 'bottom';
1129
1138
  positionedOffsetY = 24;
1130
1139
  }
@@ -1132,19 +1141,15 @@ class GaTooltipDirective {
1132
1141
  positionedOverlayY = 'center';
1133
1142
  positionedOffsetY = 0;
1134
1143
  }
1135
- let positionedOverlayX;
1136
1144
  let positionedOffsetX;
1137
- if (preferredPlacement.endsWith('start')) {
1138
- positionedOverlayX = 'start';
1145
+ if (direction === 'start') {
1139
1146
  positionedOffsetX = -24;
1140
1147
  }
1141
- else if (preferredPlacement.endsWith('end')) {
1142
- positionedOverlayX = 'end';
1148
+ else if (direction === 'end') {
1143
1149
  positionedOffsetX = 24;
1144
1150
  }
1145
1151
  else {
1146
1152
  positionedOffsetX = 0;
1147
- positionedOverlayX = 'center';
1148
1153
  }
1149
1154
  const right = {
1150
1155
  originX: 'end',
@@ -1152,7 +1157,7 @@ class GaTooltipDirective {
1152
1157
  overlayX: 'start',
1153
1158
  overlayY: positionedOverlayY,
1154
1159
  offsetY: positionedOffsetY,
1155
- panelClass: `right-${positionedOverlayY}`,
1160
+ panelClass: `right-${direction}`,
1156
1161
  };
1157
1162
  const left = {
1158
1163
  originX: 'start',
@@ -1160,31 +1165,31 @@ class GaTooltipDirective {
1160
1165
  overlayX: 'end',
1161
1166
  overlayY: positionedOverlayY,
1162
1167
  offsetY: positionedOffsetY,
1163
- panelClass: `left-${positionedOverlayY}`,
1168
+ panelClass: `left-${direction}`,
1164
1169
  };
1165
1170
  const top = {
1166
1171
  originX: 'center',
1167
1172
  originY: 'top',
1168
- overlayX: positionedOverlayX,
1173
+ overlayX: direction,
1169
1174
  overlayY: 'bottom',
1170
1175
  offsetX: positionedOffsetX,
1171
- panelClass: `top-${positionedOverlayX}`,
1176
+ panelClass: `top-${direction}`,
1172
1177
  };
1173
1178
  const bottom = {
1174
1179
  originX: 'center',
1175
1180
  originY: 'bottom',
1176
- overlayX: positionedOverlayX,
1181
+ overlayX: direction,
1177
1182
  overlayY: 'top',
1178
1183
  offsetX: positionedOffsetX,
1179
- panelClass: `bottom-${positionedOverlayX}`,
1184
+ panelClass: `bottom-${direction}`,
1180
1185
  };
1181
- if (preferredPlacement.startsWith('right')) {
1186
+ if (position === 'right') {
1182
1187
  return [right, left, bottom, top];
1183
1188
  }
1184
- else if (preferredPlacement.startsWith('left')) {
1189
+ else if (position === 'left') {
1185
1190
  return [left, right, bottom, top];
1186
1191
  }
1187
- else if (preferredPlacement.startsWith('top')) {
1192
+ else if (position === 'top') {
1188
1193
  return [top, bottom, right, left];
1189
1194
  }
1190
1195
  else {
@@ -1245,90 +1250,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
1245
1250
  }]
1246
1251
  }] });
1247
1252
 
1248
- class GaSpinnerComponent {
1249
- size = input(32, { transform: numberAttribute });
1250
- strokeWidth = computed(() => this.size() / 5);
1251
- center = computed(() => this.size() / 2);
1252
- radius = computed(() => (this.size() - this.strokeWidth()) / 2);
1253
- circumference = computed(() => 2 * Math.PI * this.radius());
1254
- arcCircumference = computed(() => this.circumference() * 0.25);
1255
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1256
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.5", type: GaSpinnerComponent, isStandalone: true, selector: "ga-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "ga-spinner" }, ngImport: i0, template: `
1257
- <svg
1258
- [attr.width]="size()"
1259
- [attr.height]="size()"
1260
- [attr.viewBox]="'0 0 ' + size() + ' ' + size()"
1261
- xmlns="http://www.w3.org/2000/svg"
1262
- >
1263
- <circle
1264
- [attr.cx]="center()"
1265
- [attr.cy]="center()"
1266
- [attr.r]="radius()"
1267
- stroke="var(--ga-color-secondary)"
1268
- [attr.stroke-width]="strokeWidth()"
1269
- fill="none"
1270
- ></circle>
1271
- <circle
1272
- [attr.cx]="center()"
1273
- [attr.cy]="center()"
1274
- [attr.r]="radius()"
1275
- stroke="var(--ga-color-primary-70)"
1276
- [attr.stroke-width]="strokeWidth()"
1277
- stroke-linecap="round"
1278
- fill="none"
1279
- [attr.stroke-dasharray]="arcCircumference() + ' ' + circumference()"
1280
- style="transform-origin: center; animation: ga-spinner__animation 1100ms linear infinite;"
1281
- ></circle>
1282
- </svg>
1283
- `, isInline: true, styles: [".ga-spinner{display:inline-block}@keyframes ga-spinner__animation{0%{transform:rotate(0)}31.82%{transform:rotate(90deg)}63.64%{transform:rotate(180deg)}81.82%{transform:rotate(270deg)}to{transform:rotate(360deg)}}\n"], encapsulation: i0.ViewEncapsulation.None });
1284
- }
1285
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerComponent, decorators: [{
1286
- type: Component,
1287
- args: [{ selector: 'ga-spinner', template: `
1288
- <svg
1289
- [attr.width]="size()"
1290
- [attr.height]="size()"
1291
- [attr.viewBox]="'0 0 ' + size() + ' ' + size()"
1292
- xmlns="http://www.w3.org/2000/svg"
1293
- >
1294
- <circle
1295
- [attr.cx]="center()"
1296
- [attr.cy]="center()"
1297
- [attr.r]="radius()"
1298
- stroke="var(--ga-color-secondary)"
1299
- [attr.stroke-width]="strokeWidth()"
1300
- fill="none"
1301
- ></circle>
1302
- <circle
1303
- [attr.cx]="center()"
1304
- [attr.cy]="center()"
1305
- [attr.r]="radius()"
1306
- stroke="var(--ga-color-primary-70)"
1307
- [attr.stroke-width]="strokeWidth()"
1308
- stroke-linecap="round"
1309
- fill="none"
1310
- [attr.stroke-dasharray]="arcCircumference() + ' ' + circumference()"
1311
- style="transform-origin: center; animation: ga-spinner__animation 1100ms linear infinite;"
1312
- ></circle>
1313
- </svg>
1314
- `, encapsulation: ViewEncapsulation.None, host: {
1315
- class: 'ga-spinner',
1316
- }, styles: [".ga-spinner{display:inline-block}@keyframes ga-spinner__animation{0%{transform:rotate(0)}31.82%{transform:rotate(90deg)}63.64%{transform:rotate(180deg)}81.82%{transform:rotate(270deg)}to{transform:rotate(360deg)}}\n"] }]
1317
- }] });
1318
-
1319
- class GaSpinnerModule {
1320
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1321
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerModule, imports: [GaSpinnerComponent], exports: [GaSpinnerComponent] });
1322
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerModule });
1323
- }
1324
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerModule, decorators: [{
1325
- type: NgModule,
1326
- args: [{
1327
- imports: [GaSpinnerComponent],
1328
- exports: [GaSpinnerComponent],
1329
- }]
1330
- }] });
1331
-
1332
1253
  /**
1333
1254
  * Provider Expression that allows ga-radio-group to register as a ControlValueAccessor.
1334
1255
  * This allows it to support [(ngModel)] and ngControl.
@@ -1490,6 +1411,697 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
1490
1411
  }]
1491
1412
  }] });
1492
1413
 
1414
+ class GaOptionComponent {
1415
+ _isSelected = signal(false);
1416
+ _isActive = signal(false);
1417
+ selectComponent = inject(GaSelectComponent);
1418
+ cdkOption = inject(CdkOption, { self: true });
1419
+ value = input(null);
1420
+ disabled = input(false, { transform: booleanAttribute });
1421
+ withInput = input(false, { transform: booleanAttribute });
1422
+ selected = computed(() => this._isSelected() &&
1423
+ this.cdkOption.value !== undefined &&
1424
+ this.cdkOption.value !== null &&
1425
+ this.cdkOption.value !== '');
1426
+ active = this._isActive.asReadonly();
1427
+ ngDoCheck() {
1428
+ // NOTE: currently there is no other reliable way to track the selected state,
1429
+ // refactor once cdk will be based on signals or more appropriate events introduced
1430
+ this._isSelected.set(this.cdkOption.isSelected());
1431
+ this._isActive.set(this.cdkOption.isActive());
1432
+ }
1433
+ onClick() {
1434
+ if (!this.cdkOption.disabled) {
1435
+ this.selectComponent.autoClose();
1436
+ }
1437
+ }
1438
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1439
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: GaOptionComponent, isStandalone: true, selector: "ga-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, withInput: { classPropertyName: "withInput", publicName: "withInput", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()" }, properties: { "class.ga-dropdown__item--selected": "selected()", "class.ga-dropdown__item--disabled": "cdkOption.disabled", "class.ga-dropdown__item--active": "active() && !cdkOption.disabled" }, classAttribute: "ga-dropdown__item" }, hostDirectives: [{ directive: i1$2.CdkOption, inputs: ["cdkOption", "value", "cdkOptionDisabled", "disabled", "cdkOptionTypeaheadLabel", "typeaheadLabel"] }], ngImport: i0, template: "@if (withInput()) {\n @if (selectComponent.multiple()) {\n <ga-checkbox\n [checked]=\"selected()\"\n [disabled]=\"disabled()\"\n aria-hidden=\"true\"\n style=\"pointer-events: none\"\n tabindex=\"-1\"\n />\n } @else {\n <ga-radio-button\n [checked]=\"selected()\"\n [disabled]=\"disabled()\"\n aria-hidden=\"true\"\n style=\"pointer-events: none\"\n tabindex=\"-1\"\n />\n }\n}\n<ng-content />\n", dependencies: [{ kind: "ngmodule", type: GaCheckboxModule }, { kind: "component", type: GaCheckboxComponent, selector: "ga-checkbox", inputs: ["value", "disabled", "checked", "name", "id", "indeterminate", "aria-label", "aria-labelledby", "aria-describedby", "aria-invalid", "aria-errormessage", "required"], outputs: ["change", "indeterminateChange"] }, { kind: "ngmodule", type: GaRadioModule }, { kind: "component", type: GaRadioButtonComponent, selector: "ga-radio-button", inputs: ["value", "id", "name", "checked", "disabled", "aria-label", "aria-labelledby", "aria-describedby", "aria-invalid", "aria-errormessage"], outputs: ["change"] }] });
1440
+ }
1441
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaOptionComponent, decorators: [{
1442
+ type: Component,
1443
+ args: [{ selector: 'ga-option', imports: [GaCheckboxModule, GaRadioModule], hostDirectives: [
1444
+ {
1445
+ directive: CdkOption,
1446
+ inputs: [
1447
+ 'cdkOption: value',
1448
+ 'cdkOptionDisabled: disabled',
1449
+ 'cdkOptionTypeaheadLabel: typeaheadLabel',
1450
+ ],
1451
+ },
1452
+ ], host: {
1453
+ class: 'ga-dropdown__item',
1454
+ '[class.ga-dropdown__item--selected]': 'selected()',
1455
+ '[class.ga-dropdown__item--disabled]': 'cdkOption.disabled',
1456
+ '[class.ga-dropdown__item--active]': 'active() && !cdkOption.disabled',
1457
+ '(click)': 'onClick()',
1458
+ }, template: "@if (withInput()) {\n @if (selectComponent.multiple()) {\n <ga-checkbox\n [checked]=\"selected()\"\n [disabled]=\"disabled()\"\n aria-hidden=\"true\"\n style=\"pointer-events: none\"\n tabindex=\"-1\"\n />\n } @else {\n <ga-radio-button\n [checked]=\"selected()\"\n [disabled]=\"disabled()\"\n aria-hidden=\"true\"\n style=\"pointer-events: none\"\n tabindex=\"-1\"\n />\n }\n}\n<ng-content />\n" }]
1459
+ }] });
1460
+
1461
+ class GaSelectValueComponent {
1462
+ selectComponent = inject(GaSelectComponent);
1463
+ optionViewValue = computed(() => {
1464
+ const options = this.selectComponent.selectedOptions();
1465
+ if (!options.length) {
1466
+ return null;
1467
+ }
1468
+ return options
1469
+ .map((option) => option.cdkOption.element.textContent?.trim() ?? '')
1470
+ .join(', ');
1471
+ });
1472
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectValueComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1473
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.5", type: GaSelectValueComponent, isStandalone: true, selector: "ga-select-value", ngImport: i0, template: `{{ optionViewValue() }}`, isInline: true });
1474
+ }
1475
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectValueComponent, decorators: [{
1476
+ type: Component,
1477
+ args: [{
1478
+ selector: 'ga-select-value',
1479
+ template: `{{ optionViewValue() }}`,
1480
+ }]
1481
+ }] });
1482
+
1483
+ const GA_SELECT_TRIGGER = new InjectionToken('gaSelectTrigger');
1484
+
1485
+ class GaSelectTriggerComponent {
1486
+ selectComponent = inject(GaSelectComponent);
1487
+ content = viewChild('ngContent', { read: ElementRef });
1488
+ hasCustomLabel = signal(false);
1489
+ menuStatusIcon = computed(() => {
1490
+ return this.selectComponent.isOpen() ? ChevronUp : ChevronDown;
1491
+ });
1492
+ leftIcon = input();
1493
+ ngAfterViewInit() {
1494
+ this.checkIfHasCustomLabel();
1495
+ }
1496
+ checkIfHasCustomLabel() {
1497
+ this.hasCustomLabel.set(!!this.content()?.nativeElement.children.length);
1498
+ }
1499
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1500
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: GaSelectTriggerComponent, isStandalone: true, selector: "ga-select-trigger", inputs: { leftIcon: { classPropertyName: "leftIcon", publicName: "leftIcon", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "combobox", "aria-haspopup": "listbox" }, listeners: { "click": "selectComponent.toggle()", "keydown.arrowdown": "selectComponent.open(); $event.preventDefault()", "keydown.space": "selectComponent.open(); $event.preventDefault()", "keydown.enter": "selectComponent.open(); $event.preventDefault()" }, properties: { "class.ga-select--expanded": "selectComponent.isOpen()", "class.ga-select--disabled": "selectComponent.disabled()", "class.ga-select--invalid": "selectComponent.invalid()", "class.ga-select--empty": "!selectComponent.hasValue()", "attr.aria-expanded": "selectComponent.isOpen()", "attr.aria-controls": "selectComponent.listboxId()", "attr.aria-invalid": "selectComponent.invalid()", "attr.aria-disabled": "selectComponent.disabled()", "attr.aria-activedescendant": "selectComponent.activeDescendantId()", "attr.tabindex": "selectComponent.disabled() ? -1 : 0" }, classAttribute: "ga-select" }, providers: [
1501
+ {
1502
+ provide: GA_SELECT_TRIGGER,
1503
+ useExisting: forwardRef(() => GaSelectTriggerComponent),
1504
+ },
1505
+ ], viewQueries: [{ propertyName: "content", first: true, predicate: ["ngContent"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@if (leftIcon()) {\n <ga-icon [icon]=\"leftIcon()\" />\n}\n@if (selectComponent.hasValue()) {\n <div class=\"ga-select__value\">\n <span #ngContent (cdkObserveContent)=\"checkIfHasCustomLabel()\">\n <ng-content />\n </span>\n @if (!hasCustomLabel()) {\n <ga-select-value />\n }\n </div>\n} @else {\n <div class=\"ga-select__placeholder\">\n {{ selectComponent.placeholder() }}\n </div>\n}\n<ga-icon [icon]=\"menuStatusIcon()\" />\n", dependencies: [{ kind: "ngmodule", type: GaInputModule }, { kind: "ngmodule", type: GaIconModule }, { kind: "component", type: GaIconComponent, selector: "ga-icon", inputs: ["icon", "size", "color", "strokeWidth"] }, { kind: "component", type: GaSelectValueComponent, selector: "ga-select-value" }, { kind: "ngmodule", type: ObserversModule }, { kind: "directive", type: i2.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }] });
1506
+ }
1507
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectTriggerComponent, decorators: [{
1508
+ type: Component,
1509
+ args: [{ selector: 'ga-select-trigger', imports: [
1510
+ GaInputModule,
1511
+ GaIconModule,
1512
+ GaSelectValueComponent,
1513
+ ObserversModule,
1514
+ ], providers: [
1515
+ {
1516
+ provide: GA_SELECT_TRIGGER,
1517
+ useExisting: forwardRef(() => GaSelectTriggerComponent),
1518
+ },
1519
+ ], host: {
1520
+ role: 'combobox',
1521
+ class: 'ga-select',
1522
+ '[class.ga-select--expanded]': 'selectComponent.isOpen()',
1523
+ '[class.ga-select--disabled]': 'selectComponent.disabled()',
1524
+ '[class.ga-select--invalid]': 'selectComponent.invalid()',
1525
+ '[class.ga-select--empty]': '!selectComponent.hasValue()',
1526
+ 'aria-haspopup': 'listbox',
1527
+ '[attr.aria-expanded]': 'selectComponent.isOpen()',
1528
+ '[attr.aria-controls]': 'selectComponent.listboxId()',
1529
+ '[attr.aria-invalid]': 'selectComponent.invalid()',
1530
+ '[attr.aria-disabled]': 'selectComponent.disabled()',
1531
+ '[attr.aria-activedescendant]': 'selectComponent.activeDescendantId()',
1532
+ '[attr.tabindex]': 'selectComponent.disabled() ? -1 : 0',
1533
+ '(click)': 'selectComponent.toggle()',
1534
+ '(keydown.arrowdown)': 'selectComponent.open(); $event.preventDefault()',
1535
+ '(keydown.space)': 'selectComponent.open(); $event.preventDefault()',
1536
+ '(keydown.enter)': 'selectComponent.open(); $event.preventDefault()',
1537
+ }, template: "@if (leftIcon()) {\n <ga-icon [icon]=\"leftIcon()\" />\n}\n@if (selectComponent.hasValue()) {\n <div class=\"ga-select__value\">\n <span #ngContent (cdkObserveContent)=\"checkIfHasCustomLabel()\">\n <ng-content />\n </span>\n @if (!hasCustomLabel()) {\n <ga-select-value />\n }\n </div>\n} @else {\n <div class=\"ga-select__placeholder\">\n {{ selectComponent.placeholder() }}\n </div>\n}\n<ga-icon [icon]=\"menuStatusIcon()\" />\n" }]
1538
+ }] });
1539
+
1540
+ class GaSelectCustomTriggerComponent {
1541
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectCustomTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1542
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.5", type: GaSelectCustomTriggerComponent, isStandalone: true, selector: "ga-select-custom-trigger", providers: [
1543
+ {
1544
+ provide: GA_SELECT_TRIGGER,
1545
+ useExisting: forwardRef(() => GaSelectCustomTriggerComponent),
1546
+ },
1547
+ ], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
1548
+ }
1549
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectCustomTriggerComponent, decorators: [{
1550
+ type: Component,
1551
+ args: [{
1552
+ selector: 'ga-select-custom-trigger',
1553
+ template: `<ng-content></ng-content>`,
1554
+ providers: [
1555
+ {
1556
+ provide: GA_SELECT_TRIGGER,
1557
+ useExisting: forwardRef(() => GaSelectCustomTriggerComponent),
1558
+ },
1559
+ ],
1560
+ }]
1561
+ }] });
1562
+
1563
+ class GaSelectComponent {
1564
+ focusedTriggerElement = null;
1565
+ _onTouched;
1566
+ _onModelChanged;
1567
+ positions = [
1568
+ {
1569
+ originX: 'end',
1570
+ originY: 'bottom',
1571
+ overlayX: 'end',
1572
+ overlayY: 'top',
1573
+ offsetY: 8,
1574
+ },
1575
+ {
1576
+ originX: 'end',
1577
+ originY: 'top',
1578
+ overlayX: 'end',
1579
+ overlayY: 'bottom',
1580
+ offsetY: -8,
1581
+ },
1582
+ ];
1583
+ injector = inject(Injector);
1584
+ implicitInvalid = signal(false);
1585
+ _isOpen = signal(false);
1586
+ value = model(null);
1587
+ placeholder = input('');
1588
+ disabledInput = input(false, {
1589
+ alias: 'disabled',
1590
+ transform: booleanAttribute,
1591
+ });
1592
+ invalidInput = input(null, {
1593
+ alias: 'invalid',
1594
+ transform: booleanAttribute,
1595
+ });
1596
+ multiple = input(false, { transform: booleanAttribute });
1597
+ compareWith = input();
1598
+ withoutAutoFocus = signal(false);
1599
+ opened = output();
1600
+ closed = output();
1601
+ // TODO: if we rename this to options, it breaks, why?
1602
+ gaOptions = contentChildren(GaOptionComponent, {
1603
+ descendants: true,
1604
+ read: GaOptionComponent,
1605
+ });
1606
+ cdkListbox = contentChild.required(CdkListbox);
1607
+ explicitTrigger = contentChild(GA_SELECT_TRIGGER);
1608
+ isOpen = this._isOpen.asReadonly();
1609
+ disabled = linkedSignal(() => this.disabledInput());
1610
+ icon = computed(() => {
1611
+ return this._isOpen() ? ChevronUp : ChevronDown;
1612
+ });
1613
+ selectedOptions = computed(() => {
1614
+ return this.gaOptions().filter((option) => option.selected());
1615
+ });
1616
+ activeDescendantId = computed(() => {
1617
+ const activeOption = this.gaOptions().find((option) => option.active());
1618
+ return activeOption?.cdkOption.id;
1619
+ });
1620
+ hasValue = computed(() => {
1621
+ const value = this.value();
1622
+ if (this.multiple()) {
1623
+ return Array.isArray(value) && value.length > 0;
1624
+ }
1625
+ return value !== null && value !== undefined && value !== '';
1626
+ });
1627
+ invalid = computed(() => {
1628
+ return this.invalidInput() ?? this.implicitInvalid();
1629
+ });
1630
+ listboxId = computed(() => this.cdkListbox().id);
1631
+ constructor() {
1632
+ effect(() => {
1633
+ // if the select became disabled while open, close it
1634
+ if (this.disabled() && this._isOpen()) {
1635
+ this.close();
1636
+ }
1637
+ });
1638
+ }
1639
+ ngAfterContentInit() {
1640
+ effect(() => {
1641
+ this.cdkListbox().multiple = this.multiple();
1642
+ this.cdkListbox().useActiveDescendant = this.withoutAutoFocus();
1643
+ this.cdkListbox().compareWith = this.compareWith();
1644
+ this.cdkListbox().value = this.multiple()
1645
+ ? this.value()
1646
+ : [this.value()];
1647
+ }, { injector: this.injector });
1648
+ // track value changes (pull)
1649
+ this.cdkListbox().valueChange.subscribe(({ value }) => {
1650
+ if (!this.multiple()) {
1651
+ [value] = value;
1652
+ }
1653
+ this.value.set(value);
1654
+ this._onModelChanged?.(value);
1655
+ // this is needed because value could be also changed via keyboard
1656
+ this.autoClose();
1657
+ });
1658
+ if (isDevMode() &&
1659
+ this.explicitTrigger() instanceof GaSelectCustomTriggerComponent) {
1660
+ if (this.multiple()) {
1661
+ console.warn('<ga-select>: The `multiple` property requires custom handling when using a custom trigger component. If you have implemented the multiple selection logic in your custom trigger, you can ignore this warning. [This message is visible in dev mode only]');
1662
+ }
1663
+ }
1664
+ }
1665
+ ngDoCheck() {
1666
+ const implicitNgControl = this.injector.get(NgControl, null);
1667
+ // we can rely on computed because `ivalid` of NgControl is not a signal, yet
1668
+ if (implicitNgControl) {
1669
+ this.implicitInvalid.set(!!implicitNgControl.invalid && !!implicitNgControl.dirty);
1670
+ }
1671
+ }
1672
+ writeValue(value) {
1673
+ this.value.set(value);
1674
+ }
1675
+ registerOnChange(fn) {
1676
+ this._onModelChanged = fn;
1677
+ }
1678
+ registerOnTouched(fn) {
1679
+ this._onTouched = fn;
1680
+ }
1681
+ setDisabledState(disabled) {
1682
+ this.disabled.set(disabled);
1683
+ }
1684
+ toggle() {
1685
+ if (this._isOpen()) {
1686
+ this.close();
1687
+ }
1688
+ else {
1689
+ this.open();
1690
+ }
1691
+ }
1692
+ open() {
1693
+ if (this.disabled() || this._isOpen()) {
1694
+ return Promise.resolve();
1695
+ }
1696
+ this._isOpen.set(true);
1697
+ return firstValueFrom(outputToObservable(this.opened));
1698
+ }
1699
+ close() {
1700
+ if (!this._isOpen()) {
1701
+ return Promise.resolve();
1702
+ }
1703
+ this._isOpen.set(false);
1704
+ return firstValueFrom(outputToObservable(this.closed));
1705
+ }
1706
+ autoClose() {
1707
+ // close that was initiated by clicking the option
1708
+ if (!this.multiple()) {
1709
+ this.close();
1710
+ }
1711
+ }
1712
+ focusListbox() {
1713
+ this.cdkListbox().focus();
1714
+ }
1715
+ setPreviousItemActive() {
1716
+ this.setItemActive(-1);
1717
+ }
1718
+ setNextItemActive() {
1719
+ this.setItemActive(1);
1720
+ }
1721
+ setActiveItemAsSelected() {
1722
+ const options = this.gaOptions();
1723
+ let activeOption = options.find((option) => option.cdkOption.isActive());
1724
+ if (!activeOption && options.length > 0) {
1725
+ activeOption = options[0];
1726
+ }
1727
+ if (activeOption) {
1728
+ const { cdkOption } = activeOption;
1729
+ this.cdkListbox().toggle(cdkOption);
1730
+ let { value } = this.cdkListbox();
1731
+ if (!this.multiple()) {
1732
+ [value] = value;
1733
+ }
1734
+ this.value.set(value);
1735
+ }
1736
+ }
1737
+ onOverlayAttach() {
1738
+ this._isOpen.set(true);
1739
+ this.focusedTriggerElement = document.activeElement;
1740
+ this.opened.emit();
1741
+ if (!this.withoutAutoFocus()) {
1742
+ this.focusListbox();
1743
+ }
1744
+ }
1745
+ onOverlayDetach() {
1746
+ this._isOpen.set(false);
1747
+ this.focusedTriggerElement?.focus();
1748
+ this._onTouched?.();
1749
+ this.closed.emit();
1750
+ }
1751
+ setItemActive(direction) {
1752
+ const options = this.gaOptions();
1753
+ const currentIndex = options.findIndex(({ cdkOption }) => cdkOption.isActive());
1754
+ const findNextEnabled = (startIndex) => {
1755
+ let index = startIndex;
1756
+ for (let i = 0; i < options.length; i++) {
1757
+ // calculate next index with wrapping (using modulo)
1758
+ index = (index + direction + options.length) % options.length;
1759
+ if (!options[index].cdkOption.disabled) {
1760
+ return index;
1761
+ }
1762
+ }
1763
+ return -1; // no enabled options found
1764
+ };
1765
+ const nextIndex = findNextEnabled(currentIndex);
1766
+ if (nextIndex !== -1) {
1767
+ this.cdkListbox()._setActiveOption(options[nextIndex].cdkOption);
1768
+ }
1769
+ }
1770
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1771
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: GaSelectComponent, isStandalone: true, selector: "ga-select", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalidInput: { classPropertyName: "invalidInput", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", opened: "opened", closed: "closed" }, providers: [
1772
+ {
1773
+ provide: NG_VALUE_ACCESSOR,
1774
+ useExisting: forwardRef(() => GaSelectComponent),
1775
+ multi: true,
1776
+ },
1777
+ ], queries: [{ propertyName: "gaOptions", predicate: GaOptionComponent, descendants: true, read: GaOptionComponent, isSignal: true }, { propertyName: "cdkListbox", first: true, predicate: CdkListbox, descendants: true, isSignal: true }, { propertyName: "explicitTrigger", first: true, predicate: GA_SELECT_TRIGGER, descendants: true, isSignal: true }], ngImport: i0, template: "<div cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\">\n @if (explicitTrigger()) {\n <ng-content\n select=\"ga-select-custom-trigger, ga-select-trigger, ga-select-searchable-trigger\"\n />\n } @else {\n <ga-select-trigger />\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (overlayOutsideClick)=\"close()\"\n (attach)=\"onOverlayAttach()\"\n (detach)=\"onOverlayDetach()\"\n>\n <ng-content select=\"ga-select-content\" />\n</ng-template>\n", styles: ["ga-select{display:inline-block}\n"], dependencies: [{ kind: "ngmodule", type: GaIconModule }, { kind: "ngmodule", type: GaButtonModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: GaSelectTriggerComponent, selector: "ga-select-trigger", inputs: ["leftIcon"] }], encapsulation: i0.ViewEncapsulation.None });
1778
+ }
1779
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectComponent, decorators: [{
1780
+ type: Component,
1781
+ args: [{ selector: 'ga-select', imports: [
1782
+ GaIconModule,
1783
+ GaButtonModule,
1784
+ OverlayModule,
1785
+ GaSelectTriggerComponent,
1786
+ ], providers: [
1787
+ {
1788
+ provide: NG_VALUE_ACCESSOR,
1789
+ useExisting: forwardRef(() => GaSelectComponent),
1790
+ multi: true,
1791
+ },
1792
+ ], encapsulation: ViewEncapsulation.None, template: "<div cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\">\n @if (explicitTrigger()) {\n <ng-content\n select=\"ga-select-custom-trigger, ga-select-trigger, ga-select-searchable-trigger\"\n />\n } @else {\n <ga-select-trigger />\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (overlayOutsideClick)=\"close()\"\n (attach)=\"onOverlayAttach()\"\n (detach)=\"onOverlayDetach()\"\n>\n <ng-content select=\"ga-select-content\" />\n</ng-template>\n", styles: ["ga-select{display:inline-block}\n"] }]
1793
+ }], ctorParameters: () => [] });
1794
+
1795
+ class GaOptgroupComponent {
1796
+ label = input();
1797
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaOptgroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1798
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: GaOptgroupComponent, isStandalone: true, selector: "ga-optgroup", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" } }, ngImport: i0, template: `
1799
+ @if (label()) {
1800
+ <div class="ga-dropdown__caption">{{ label() }}</div>
1801
+ }
1802
+ <ng-content />
1803
+ `, isInline: true });
1804
+ }
1805
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaOptgroupComponent, decorators: [{
1806
+ type: Component,
1807
+ args: [{
1808
+ selector: 'ga-optgroup',
1809
+ template: `
1810
+ @if (label()) {
1811
+ <div class="ga-dropdown__caption">{{ label() }}</div>
1812
+ }
1813
+ <ng-content />
1814
+ `,
1815
+ host: {
1816
+ role: 'group',
1817
+ },
1818
+ }]
1819
+ }] });
1820
+
1821
+ class GaSpinnerComponent {
1822
+ size = input(32, { transform: numberAttribute });
1823
+ strokeWidth = computed(() => this.size() / 5);
1824
+ center = computed(() => this.size() / 2);
1825
+ radius = computed(() => (this.size() - this.strokeWidth()) / 2);
1826
+ circumference = computed(() => 2 * Math.PI * this.radius());
1827
+ arcCircumference = computed(() => this.circumference() * 0.25);
1828
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1829
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.5", type: GaSpinnerComponent, isStandalone: true, selector: "ga-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "ga-spinner" }, ngImport: i0, template: `
1830
+ <svg
1831
+ [attr.width]="size()"
1832
+ [attr.height]="size()"
1833
+ [attr.viewBox]="'0 0 ' + size() + ' ' + size()"
1834
+ xmlns="http://www.w3.org/2000/svg"
1835
+ >
1836
+ <circle
1837
+ [attr.cx]="center()"
1838
+ [attr.cy]="center()"
1839
+ [attr.r]="radius()"
1840
+ stroke="var(--ga-color-secondary)"
1841
+ [attr.stroke-width]="strokeWidth()"
1842
+ fill="none"
1843
+ ></circle>
1844
+ <circle
1845
+ [attr.cx]="center()"
1846
+ [attr.cy]="center()"
1847
+ [attr.r]="radius()"
1848
+ stroke="var(--ga-color-primary-70)"
1849
+ [attr.stroke-width]="strokeWidth()"
1850
+ stroke-linecap="round"
1851
+ fill="none"
1852
+ [attr.stroke-dasharray]="arcCircumference() + ' ' + circumference()"
1853
+ style="transform-origin: center; animation: ga-spinner__animation 1100ms linear infinite;"
1854
+ ></circle>
1855
+ </svg>
1856
+ `, isInline: true, styles: [".ga-spinner{display:inline-block}@keyframes ga-spinner__animation{0%{transform:rotate(0)}31.82%{transform:rotate(90deg)}63.64%{transform:rotate(180deg)}81.82%{transform:rotate(270deg)}to{transform:rotate(360deg)}}\n"], encapsulation: i0.ViewEncapsulation.None });
1857
+ }
1858
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerComponent, decorators: [{
1859
+ type: Component,
1860
+ args: [{ selector: 'ga-spinner', template: `
1861
+ <svg
1862
+ [attr.width]="size()"
1863
+ [attr.height]="size()"
1864
+ [attr.viewBox]="'0 0 ' + size() + ' ' + size()"
1865
+ xmlns="http://www.w3.org/2000/svg"
1866
+ >
1867
+ <circle
1868
+ [attr.cx]="center()"
1869
+ [attr.cy]="center()"
1870
+ [attr.r]="radius()"
1871
+ stroke="var(--ga-color-secondary)"
1872
+ [attr.stroke-width]="strokeWidth()"
1873
+ fill="none"
1874
+ ></circle>
1875
+ <circle
1876
+ [attr.cx]="center()"
1877
+ [attr.cy]="center()"
1878
+ [attr.r]="radius()"
1879
+ stroke="var(--ga-color-primary-70)"
1880
+ [attr.stroke-width]="strokeWidth()"
1881
+ stroke-linecap="round"
1882
+ fill="none"
1883
+ [attr.stroke-dasharray]="arcCircumference() + ' ' + circumference()"
1884
+ style="transform-origin: center; animation: ga-spinner__animation 1100ms linear infinite;"
1885
+ ></circle>
1886
+ </svg>
1887
+ `, encapsulation: ViewEncapsulation.None, host: {
1888
+ class: 'ga-spinner',
1889
+ }, styles: [".ga-spinner{display:inline-block}@keyframes ga-spinner__animation{0%{transform:rotate(0)}31.82%{transform:rotate(90deg)}63.64%{transform:rotate(180deg)}81.82%{transform:rotate(270deg)}to{transform:rotate(360deg)}}\n"] }]
1890
+ }] });
1891
+
1892
+ class GaSpinnerModule {
1893
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1894
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerModule, imports: [GaSpinnerComponent], exports: [GaSpinnerComponent] });
1895
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerModule });
1896
+ }
1897
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSpinnerModule, decorators: [{
1898
+ type: NgModule,
1899
+ args: [{
1900
+ imports: [GaSpinnerComponent],
1901
+ exports: [GaSpinnerComponent],
1902
+ }]
1903
+ }] });
1904
+
1905
+ class GaSelectContentLoadingComponent {
1906
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectContentLoadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1907
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.5", type: GaSelectContentLoadingComponent, isStandalone: true, selector: "ga-select-content-loading", host: { classAttribute: "ga-dropdown__content-spinner" }, ngImport: i0, template: `<ga-spinner size="16" />`, isInline: true, dependencies: [{ kind: "ngmodule", type: GaSpinnerModule }, { kind: "component", type: GaSpinnerComponent, selector: "ga-spinner", inputs: ["size"] }] });
1908
+ }
1909
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectContentLoadingComponent, decorators: [{
1910
+ type: Component,
1911
+ args: [{
1912
+ selector: 'ga-select-content-loading',
1913
+ template: `<ga-spinner size="16" />`,
1914
+ imports: [GaSpinnerModule],
1915
+ host: {
1916
+ class: 'ga-dropdown__content-spinner',
1917
+ },
1918
+ }]
1919
+ }] });
1920
+
1921
+ class GaSelectContentComponent {
1922
+ loading = input(false, { transform: booleanAttribute });
1923
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1924
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: GaSelectContentComponent, isStandalone: true, selector: "ga-select-content", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "ga-dropdown ga-dropdown__content" }, hostDirectives: [{ directive: i1$2.CdkListbox }], ngImport: i0, template: "@if (loading()) {\n <ga-select-content-loading />\n} @else {\n <ng-content />\n}\n", dependencies: [{ kind: "component", type: GaSelectContentLoadingComponent, selector: "ga-select-content-loading" }] });
1925
+ }
1926
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectContentComponent, decorators: [{
1927
+ type: Component,
1928
+ args: [{ selector: 'ga-select-content', imports: [GaSelectContentLoadingComponent], hostDirectives: [CdkListbox], host: {
1929
+ class: 'ga-dropdown ga-dropdown__content',
1930
+ }, template: "@if (loading()) {\n <ga-select-content-loading />\n} @else {\n <ng-content />\n}\n" }]
1931
+ }] });
1932
+
1933
+ class GaSelectComboboxTriggerComponent {
1934
+ injector = inject(Injector);
1935
+ selectComponent = inject(GaSelectComponent);
1936
+ content = viewChild('ngContent', { read: ElementRef });
1937
+ inputSearch = viewChild('inputSearch');
1938
+ hasCustomLabel = signal(false);
1939
+ menuStatusIcon = computed(() => {
1940
+ return this.selectComponent.isOpen() ? ChevronUp : ChevronDown;
1941
+ });
1942
+ textValue = model('');
1943
+ leftIcon = input();
1944
+ constructor() {
1945
+ this.selectComponent.withoutAutoFocus.set(true);
1946
+ this.selectComponent.opened.subscribe(() => {
1947
+ afterNextRender(() => {
1948
+ this.inputSearch().nativeElement.focus();
1949
+ }, { injector: this.injector });
1950
+ });
1951
+ this.selectComponent.closed.subscribe(() => this.textValue.set(''));
1952
+ }
1953
+ ngAfterViewInit() {
1954
+ this.checkIfHasCustomLabel();
1955
+ }
1956
+ checkIfHasCustomLabel() {
1957
+ this.hasCustomLabel.set(!!this.content()?.nativeElement.children.length);
1958
+ }
1959
+ toggle() {
1960
+ if (this.selectComponent.disabled()) {
1961
+ return;
1962
+ }
1963
+ if (!this.selectComponent.isOpen()) {
1964
+ this.open();
1965
+ }
1966
+ else {
1967
+ this.selectComponent.close();
1968
+ }
1969
+ }
1970
+ open() {
1971
+ this.selectComponent.open();
1972
+ }
1973
+ onInputKeyDown(event) {
1974
+ switch (event.code) {
1975
+ case 'ArrowDown':
1976
+ this.selectComponent.setNextItemActive();
1977
+ event.preventDefault();
1978
+ event.stopPropagation();
1979
+ break;
1980
+ case 'ArrowUp':
1981
+ this.selectComponent.setPreviousItemActive();
1982
+ event.preventDefault();
1983
+ event.stopPropagation();
1984
+ break;
1985
+ case 'Space':
1986
+ event.stopPropagation();
1987
+ break;
1988
+ case 'Enter':
1989
+ this.selectComponent.setActiveItemAsSelected();
1990
+ this.selectComponent.autoClose();
1991
+ event.preventDefault();
1992
+ event.stopPropagation();
1993
+ break;
1994
+ }
1995
+ }
1996
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectComboboxTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1997
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: GaSelectComboboxTriggerComponent, isStandalone: true, selector: "ga-select-searchable-trigger", inputs: { textValue: { classPropertyName: "textValue", publicName: "textValue", isSignal: true, isRequired: false, transformFunction: null }, leftIcon: { classPropertyName: "leftIcon", publicName: "leftIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { textValue: "textValueChange" }, host: { attributes: { "role": "combobox", "aria-haspopup": "listbox" }, listeners: { "click": "toggle()", "keydown.arrowdown": "open(); $event.preventDefault()", "keydown.space": "open(); $event.preventDefault()", "keydown.enter": "open(); $event.preventDefault()" }, properties: { "class.ga-select--expanded": "selectComponent.isOpen()", "class.ga-select--disabled": "selectComponent.disabled()", "class.ga-select--invalid": "selectComponent.invalid()", "class.ga-select--empty": "!selectComponent.hasValue()", "attr.aria-expanded": "selectComponent.isOpen()", "attr.aria-owns": "selectComponent.listboxId()", "attr.aria-invalid": "selectComponent.invalid()", "attr.aria-disabled": "selectComponent.disabled()", "attr.tabindex": "selectComponent.disabled() ? -1 : 0" }, classAttribute: "ga-select" }, providers: [
1998
+ {
1999
+ provide: GA_SELECT_TRIGGER,
2000
+ useExisting: forwardRef(() => GaSelectComboboxTriggerComponent),
2001
+ },
2002
+ ], viewQueries: [{ propertyName: "content", first: true, predicate: ["ngContent"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "inputSearch", first: true, predicate: ["inputSearch"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (leftIcon()) {\n <ga-icon [icon]=\"leftIcon()\" />\n}\n@if (selectComponent.isOpen()) {\n <input\n #inputSearch\n type=\"text\"\n class=\"ga-select__input\"\n aria-autocomplete=\"list\"\n [value]=\"textValue()\"\n (input)=\"textValue.set(inputSearch.value)\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-expanded]=\"selectComponent.isOpen()\"\n [attr.aria-controls]=\"selectComponent.listboxId()\"\n [attr.aria-activedescendant]=\"selectComponent.activeDescendantId()\"\n [placeholder]=\"selectComponent.placeholder()\"\n (keydown)=\"onInputKeyDown($event)\"\n tabindex=\"-1\"\n />\n} @else if (selectComponent.hasValue()) {\n <div class=\"ga-select__value\">\n <span #ngContent (cdkObserveContent)=\"checkIfHasCustomLabel()\">\n <ng-content />\n </span>\n @if (!hasCustomLabel()) {\n <ga-select-value />\n }\n </div>\n} @else {\n <div class=\"ga-select__placeholder\">\n {{ selectComponent.placeholder() }}\n </div>\n}\n<ga-icon [icon]=\"menuStatusIcon()\" />\n", dependencies: [{ kind: "ngmodule", type: GaInputModule }, { kind: "ngmodule", type: GaIconModule }, { kind: "component", type: GaIconComponent, selector: "ga-icon", inputs: ["icon", "size", "color", "strokeWidth"] }, { kind: "component", type: GaSelectValueComponent, selector: "ga-select-value" }, { kind: "ngmodule", type: ObserversModule }, { kind: "directive", type: i2.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }] });
2003
+ }
2004
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectComboboxTriggerComponent, decorators: [{
2005
+ type: Component,
2006
+ args: [{ selector: 'ga-select-searchable-trigger', imports: [
2007
+ GaInputModule,
2008
+ GaIconModule,
2009
+ GaSelectValueComponent,
2010
+ ObserversModule,
2011
+ ], providers: [
2012
+ {
2013
+ provide: GA_SELECT_TRIGGER,
2014
+ useExisting: forwardRef(() => GaSelectComboboxTriggerComponent),
2015
+ },
2016
+ ], host: {
2017
+ role: 'combobox',
2018
+ class: 'ga-select',
2019
+ '[class.ga-select--expanded]': 'selectComponent.isOpen()',
2020
+ '[class.ga-select--disabled]': 'selectComponent.disabled()',
2021
+ '[class.ga-select--invalid]': 'selectComponent.invalid()',
2022
+ '[class.ga-select--empty]': '!selectComponent.hasValue()',
2023
+ 'aria-haspopup': 'listbox',
2024
+ '[attr.aria-expanded]': 'selectComponent.isOpen()',
2025
+ '[attr.aria-owns]': 'selectComponent.listboxId()',
2026
+ '[attr.aria-invalid]': 'selectComponent.invalid()',
2027
+ '[attr.aria-disabled]': 'selectComponent.disabled()',
2028
+ '[attr.tabindex]': 'selectComponent.disabled() ? -1 : 0',
2029
+ '(click)': 'toggle()',
2030
+ '(keydown.arrowdown)': 'open(); $event.preventDefault()',
2031
+ '(keydown.space)': 'open(); $event.preventDefault()',
2032
+ '(keydown.enter)': 'open(); $event.preventDefault()',
2033
+ }, template: "@if (leftIcon()) {\n <ga-icon [icon]=\"leftIcon()\" />\n}\n@if (selectComponent.isOpen()) {\n <input\n #inputSearch\n type=\"text\"\n class=\"ga-select__input\"\n aria-autocomplete=\"list\"\n [value]=\"textValue()\"\n (input)=\"textValue.set(inputSearch.value)\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-expanded]=\"selectComponent.isOpen()\"\n [attr.aria-controls]=\"selectComponent.listboxId()\"\n [attr.aria-activedescendant]=\"selectComponent.activeDescendantId()\"\n [placeholder]=\"selectComponent.placeholder()\"\n (keydown)=\"onInputKeyDown($event)\"\n tabindex=\"-1\"\n />\n} @else if (selectComponent.hasValue()) {\n <div class=\"ga-select__value\">\n <span #ngContent (cdkObserveContent)=\"checkIfHasCustomLabel()\">\n <ng-content />\n </span>\n @if (!hasCustomLabel()) {\n <ga-select-value />\n }\n </div>\n} @else {\n <div class=\"ga-select__placeholder\">\n {{ selectComponent.placeholder() }}\n </div>\n}\n<ga-icon [icon]=\"menuStatusIcon()\" />\n" }]
2034
+ }], ctorParameters: () => [] });
2035
+
2036
+ const GA_SELECT_REQUIRED_VALIDATOR = {
2037
+ provide: NG_VALIDATORS,
2038
+ useExisting: forwardRef(() => GaSelectRequiredValidator),
2039
+ multi: true,
2040
+ };
2041
+ class GaSelectRequiredValidator extends RequiredValidator {
2042
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectRequiredValidator, deps: null, target: i0.ɵɵFactoryTarget.Directive });
2043
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.1.5", type: GaSelectRequiredValidator, isStandalone: true, selector: "ga-select[required][formControlName], ga-select[required][formControl], ga-select[required][ngModel]", providers: [GA_SELECT_REQUIRED_VALIDATOR], usesInheritance: true, ngImport: i0 });
2044
+ }
2045
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectRequiredValidator, decorators: [{
2046
+ type: Directive,
2047
+ args: [{
2048
+ selector: `ga-select[required][formControlName], ga-select[required][formControl], ga-select[required][ngModel]`,
2049
+ providers: [GA_SELECT_REQUIRED_VALIDATOR],
2050
+ }]
2051
+ }] });
2052
+
2053
+ class GaSelectModule {
2054
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2055
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.5", ngImport: i0, type: GaSelectModule, imports: [GaSelectComponent,
2056
+ GaOptionComponent,
2057
+ GaOptgroupComponent,
2058
+ GaSelectContentComponent,
2059
+ GaSelectCustomTriggerComponent,
2060
+ GaSelectTriggerComponent,
2061
+ GaSelectComboboxTriggerComponent,
2062
+ GaSelectContentLoadingComponent,
2063
+ GaSelectRequiredValidator], exports: [GaSelectComponent,
2064
+ GaOptionComponent,
2065
+ GaOptgroupComponent,
2066
+ GaSelectContentComponent,
2067
+ GaSelectCustomTriggerComponent,
2068
+ GaSelectComboboxTriggerComponent,
2069
+ GaSelectTriggerComponent,
2070
+ GaSelectContentLoadingComponent,
2071
+ GaSelectRequiredValidator] });
2072
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectModule, imports: [GaSelectComponent,
2073
+ GaOptionComponent,
2074
+ GaSelectTriggerComponent,
2075
+ GaSelectComboboxTriggerComponent] });
2076
+ }
2077
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: GaSelectModule, decorators: [{
2078
+ type: NgModule,
2079
+ args: [{
2080
+ imports: [
2081
+ GaSelectComponent,
2082
+ GaOptionComponent,
2083
+ GaOptgroupComponent,
2084
+ GaSelectContentComponent,
2085
+ GaSelectCustomTriggerComponent,
2086
+ GaSelectTriggerComponent,
2087
+ GaSelectComboboxTriggerComponent,
2088
+ GaSelectContentLoadingComponent,
2089
+ GaSelectRequiredValidator,
2090
+ ],
2091
+ exports: [
2092
+ GaSelectComponent,
2093
+ GaOptionComponent,
2094
+ GaOptgroupComponent,
2095
+ GaSelectContentComponent,
2096
+ GaSelectCustomTriggerComponent,
2097
+ GaSelectComboboxTriggerComponent,
2098
+ GaSelectTriggerComponent,
2099
+ GaSelectContentLoadingComponent,
2100
+ GaSelectRequiredValidator,
2101
+ ],
2102
+ }]
2103
+ }] });
2104
+
1493
2105
  /*
1494
2106
  * Public API Surface of ngx-gaia
1495
2107
  */
@@ -1498,5 +2110,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
1498
2110
  * Generated bundle index. Do not edit.
1499
2111
  */
1500
2112
 
1501
- export { CHECKBOX_CONTROL_VALUE_ACCESSOR, GA_ALERT_I18N_FACTORY, GA_CHECKBOX_REQUIRED_VALIDATOR, GA_FORM_CONTROL, GA_TOOLTIP_DEFAULT_OFFSET, GaAlertComponent, GaAlertI18n, GaAlertI18nDefault, GaAlertModule, GaAlertTitleActionsComponent, GaAlertTitleComponent, GaBadgeComponent, GaBadgeModule, GaButtonDirective, GaButtonModule, GaCardComponent, GaCardModule, GaCheckboxComponent, GaCheckboxModule, GaCheckboxRequiredValidator, GaFieldInfoComponent, GaFieldLabelComponent, GaFormControlDirective, GaFormFieldComponent, GaFormFieldModule, GaIconButtonDirective, GaIconComponent, GaIconModule, GaInputComponent, GaInputDirective, GaInputModule, GaMenuComponent, GaMenuItemComponent, GaMenuModule, GaMenuSeparatorComponent, GaMenuTitleComponent, GaMenuTriggerDirective, GaMenuTriggerIconComponent, GaRadioButtonComponent, GaRadioGroupComponent, GaRadioModule, GaSegmentedControlButtonDirective, GaSegmentedControlComponent, GaSegmentedControlModule, GaSpinnerComponent, GaSpinnerModule, GaTooltipComponent, GaTooltipDirective, GaTooltipModule, RADIO_CONTROL_VALUE_ACCESSOR, provideGaAlertI18n };
2113
+ export { CHECKBOX_CONTROL_VALUE_ACCESSOR, GA_ALERT_I18N_FACTORY, GA_CHECKBOX_REQUIRED_VALIDATOR, GA_FORM_CONTROL, GA_SELECT_REQUIRED_VALIDATOR, GA_TOOLTIP_DEFAULT_OFFSET, GaAlertComponent, GaAlertI18n, GaAlertI18nDefault, GaAlertModule, GaAlertTitleActionsComponent, GaAlertTitleComponent, GaBadgeComponent, GaBadgeModule, GaButtonDirective, GaButtonModule, GaCardComponent, GaCardModule, GaCheckboxComponent, GaCheckboxModule, GaCheckboxRequiredValidator, GaFieldInfoComponent, GaFieldLabelComponent, GaFormControlDirective, GaFormFieldComponent, GaFormFieldModule, GaIconButtonDirective, GaIconComponent, GaIconModule, GaInputComponent, GaInputDirective, GaInputModule, GaMenuComponent, GaMenuItemComponent, GaMenuModule, GaMenuSeparatorComponent, GaMenuTitleComponent, GaMenuTriggerDirective, GaMenuTriggerIconComponent, GaOptgroupComponent, GaOptionComponent, GaRadioButtonComponent, GaRadioGroupComponent, GaRadioModule, GaSegmentedControlButtonDirective, GaSegmentedControlComponent, GaSegmentedControlModule, GaSelectComboboxTriggerComponent, GaSelectComponent, GaSelectContentComponent, GaSelectContentLoadingComponent, GaSelectCustomTriggerComponent, GaSelectModule, GaSelectRequiredValidator, GaSelectTriggerComponent, GaSpinnerComponent, GaSpinnerModule, GaTooltipComponent, GaTooltipDirective, GaTooltipModule, RADIO_CONTROL_VALUE_ACCESSOR, provideGaAlertI18n };
1502
2114
  //# sourceMappingURL=vsn-ux-ngx-gaia.mjs.map