ngx-strata 0.2.2 → 0.2.3

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,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, model, output, computed, Directive, Injectable, provideAppInitializer, makeEnvironmentProviders, InjectionToken, DOCUMENT, Renderer2, Input, signal, effect, DestroyRef, HostListener, Component, contentChild, HostBinding, ViewContainerRef, viewChild, contentChildren, TemplateRef, Pipe, booleanAttribute, ContentChildren, Injector, LOCALE_ID } from '@angular/core';
3
- import { computePosition, offset, arrow, autoUpdate, flip, shift } from '@floating-ui/dom';
2
+ import { inject, ElementRef, input, model, output, computed, Directive, Injectable, provideAppInitializer, makeEnvironmentProviders, DOCUMENT, signal, effect, InjectionToken, provideEnvironmentInitializer, Renderer2, Input, DestroyRef, HostListener, Component, contentChild, HostBinding, ViewContainerRef, viewChild, contentChildren, TemplateRef, Pipe, booleanAttribute, ContentChildren, Injector, LOCALE_ID } from '@angular/core';
3
+ import { computePosition, offset, arrow, autoUpdate, flip, shift, size } from '@floating-ui/dom';
4
4
  import { Observable, tap, map, fromEvent, switchMap, filter } from 'rxjs';
5
5
  import { HttpClient } from '@angular/common/http';
6
6
  import { DomSanitizer } from '@angular/platform-browser';
@@ -175,6 +175,73 @@ function provideIconRegistry() {
175
175
  };
176
176
  }
177
177
 
178
+ class DarkmodeService {
179
+ STORAGE_KEY = 'strata-darkmode';
180
+ document = inject(DOCUMENT);
181
+ osPrefersDark;
182
+ setting = signal('SYSTEM', /* @ts-ignore */
183
+ ...(ngDevMode ? [{ debugName: "setting" }] : /* istanbul ignore next */ []));
184
+ darkmode = signal('LIGHT', /* @ts-ignore */
185
+ ...(ngDevMode ? [{ debugName: "darkmode" }] : /* istanbul ignore next */ []));
186
+ currentMode = computed(() => this.darkmode(), /* @ts-ignore */
187
+ ...(ngDevMode ? [{ debugName: "currentMode" }] : /* istanbul ignore next */ []));
188
+ currentSetting = computed(() => this.setting(), /* @ts-ignore */
189
+ ...(ngDevMode ? [{ debugName: "currentSetting" }] : /* istanbul ignore next */ []));
190
+ constructor() {
191
+ effect(() => this.updateDarkmodeTagOnDOM(this.darkmode()));
192
+ this.setting.set(this.getSettingFromStorage());
193
+ this.osPrefersDark = this.getSystemDarkmodePreference();
194
+ this.calculateDarkmode();
195
+ this.saveSettingToStorage(this.setting());
196
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (event) => {
197
+ this.osPrefersDark = event.matches;
198
+ if (this.setting() === 'SYSTEM') {
199
+ this.calculateDarkmode();
200
+ }
201
+ });
202
+ }
203
+ setDarkmodeSetting(newSetting) {
204
+ this.saveSettingToStorage(newSetting);
205
+ return this.calculateDarkmode();
206
+ }
207
+ getSystemDarkmodePreference() {
208
+ return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
209
+ }
210
+ calculateDarkmode() {
211
+ if (this.setting() === 'SYSTEM') {
212
+ this.darkmode.set(this.osPrefersDark ? 'DARK' : 'LIGHT');
213
+ }
214
+ else {
215
+ this.darkmode.set(this.setting() === 'DARK' ? 'DARK' : 'LIGHT');
216
+ }
217
+ return this.darkmode();
218
+ }
219
+ updateDarkmodeTagOnDOM(mode) {
220
+ const documentNode = this.document.getElementsByTagName('html')[0];
221
+ if (mode === 'DARK') {
222
+ documentNode.setAttribute('data-theme', 'dark');
223
+ }
224
+ else {
225
+ documentNode.setAttribute('data-theme', 'light');
226
+ }
227
+ }
228
+ saveSettingToStorage(newSetting) {
229
+ localStorage.setItem(this.STORAGE_KEY, newSetting);
230
+ this.setting.set(newSetting);
231
+ }
232
+ getSettingFromStorage() {
233
+ return localStorage.getItem(this.STORAGE_KEY) ?? 'SYSTEM';
234
+ }
235
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DarkmodeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
236
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DarkmodeService, providedIn: 'root' });
237
+ }
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DarkmodeService, decorators: [{
239
+ type: Injectable,
240
+ args: [{
241
+ providedIn: 'root'
242
+ }]
243
+ }], ctorParameters: () => [] });
244
+
178
245
  const DEFAULT_CONFIG = {
179
246
  includeBaseIcons: true,
180
247
  tooltipDelayMs: 500,
@@ -184,7 +251,8 @@ const DEFAULT_CONFIG = {
184
251
  ctrl: 'Ctrl',
185
252
  shift: 'Shift',
186
253
  alt: 'Alt'
187
- }
254
+ },
255
+ overlayViewportBuffer: 16
188
256
  };
189
257
  function provideStrata(config = {}) {
190
258
  const mergedConfig = {
@@ -199,6 +267,7 @@ function provideStrata(config = {}) {
199
267
  provide: STRATA_CONFIG,
200
268
  useValue: mergedConfig
201
269
  },
270
+ provideEnvironmentInitializer(() => inject(DarkmodeService))
202
271
  ];
203
272
  if (mergedConfig.includeBaseIcons) {
204
273
  providers.push(provideBaseIcons());
@@ -318,73 +387,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
318
387
  type: Input
319
388
  }] } });
320
389
 
321
- class DarkmodeService {
322
- STORAGE_KEY = 'strata-darkmode';
323
- document = inject(DOCUMENT);
324
- osPrefersDark;
325
- setting = signal('SYSTEM', /* @ts-ignore */
326
- ...(ngDevMode ? [{ debugName: "setting" }] : /* istanbul ignore next */ []));
327
- darkmode = signal('LIGHT', /* @ts-ignore */
328
- ...(ngDevMode ? [{ debugName: "darkmode" }] : /* istanbul ignore next */ []));
329
- currentMode = computed(() => this.darkmode(), /* @ts-ignore */
330
- ...(ngDevMode ? [{ debugName: "currentMode" }] : /* istanbul ignore next */ []));
331
- currentSetting = computed(() => this.setting(), /* @ts-ignore */
332
- ...(ngDevMode ? [{ debugName: "currentSetting" }] : /* istanbul ignore next */ []));
333
- constructor() {
334
- effect(() => this.updateDarkmodeTagOnDOM(this.darkmode()));
335
- this.setting.set(this.getSettingFromStorage());
336
- this.osPrefersDark = this.getSystemDarkmodePreference();
337
- this.calculateDarkmode();
338
- this.saveSettingToStorage(this.setting());
339
- window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (event) => {
340
- this.osPrefersDark = event.matches;
341
- if (this.setting() === 'SYSTEM') {
342
- this.calculateDarkmode();
343
- }
344
- });
345
- }
346
- setDarkmodeSetting(newSetting) {
347
- this.saveSettingToStorage(newSetting);
348
- return this.calculateDarkmode();
349
- }
350
- getSystemDarkmodePreference() {
351
- return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
352
- }
353
- calculateDarkmode() {
354
- if (this.setting() === 'SYSTEM') {
355
- this.darkmode.set(this.osPrefersDark ? 'DARK' : 'LIGHT');
356
- }
357
- else {
358
- this.darkmode.set(this.setting() === 'DARK' ? 'DARK' : 'LIGHT');
359
- }
360
- return this.darkmode();
361
- }
362
- updateDarkmodeTagOnDOM(mode) {
363
- const documentNode = this.document.getElementsByTagName('html')[0];
364
- if (mode === 'DARK') {
365
- documentNode.setAttribute('data-theme', 'dark');
366
- }
367
- else {
368
- documentNode.setAttribute('data-theme', 'light');
369
- }
370
- }
371
- saveSettingToStorage(newSetting) {
372
- localStorage.setItem(this.STORAGE_KEY, newSetting);
373
- this.setting.set(newSetting);
374
- }
375
- getSettingFromStorage() {
376
- return localStorage.getItem(this.STORAGE_KEY) ?? 'SYSTEM';
377
- }
378
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DarkmodeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
379
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DarkmodeService, providedIn: 'root' });
380
- }
381
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DarkmodeService, decorators: [{
382
- type: Injectable,
383
- args: [{
384
- providedIn: 'root'
385
- }]
386
- }], ctorParameters: () => [] });
387
-
388
390
  class HotkeyService {
389
391
  config = inject(STRATA_CONFIG);
390
392
  destroyRef = inject(DestroyRef);
@@ -724,8 +726,11 @@ class StrataOverlayDirective {
724
726
  ...(ngDevMode ? [{ debugName: "overlayPlacement" }] : /* istanbul ignore next */ []));
725
727
  overlayOffset = input(8, /* @ts-ignore */
726
728
  ...(ngDevMode ? [{ debugName: "overlayOffset" }] : /* istanbul ignore next */ []));
729
+ overlayFitViewport = input(true, /* @ts-ignore */
730
+ ...(ngDevMode ? [{ debugName: "overlayFitViewport" }] : /* istanbul ignore next */ []));
727
731
  element = inject(ElementRef);
728
732
  viewContainerRef = inject(ViewContainerRef);
733
+ config = inject(STRATA_CONFIG, { optional: true });
729
734
  overlayEl;
730
735
  cleanup;
731
736
  viewRef;
@@ -749,10 +754,28 @@ class StrataOverlayDirective {
749
754
  async updatePosition() {
750
755
  if (!this.overlayEl)
751
756
  return;
757
+ const middleware = [
758
+ offset(this.overlayOffset()),
759
+ flip(),
760
+ shift()
761
+ ];
762
+ if (this.overlayFitViewport()) {
763
+ const buffer = this.config?.overlayViewportBuffer ?? 16;
764
+ middleware.push(size({
765
+ apply({ availableHeight, elements }) {
766
+ Object.assign(elements.floating.style, {
767
+ maxHeight: `${availableHeight - buffer}px`
768
+ });
769
+ }
770
+ }));
771
+ }
772
+ else {
773
+ this.overlayEl.style.maxHeight = '';
774
+ }
752
775
  const { x, y } = await computePosition(this.element.nativeElement, this.overlayEl, {
753
776
  placement: this.overlayPlacement(),
754
777
  strategy: 'fixed',
755
- middleware: [offset(this.overlayOffset()), flip(), shift()]
778
+ middleware
756
779
  });
757
780
  if (!this.overlayEl)
758
781
  return;
@@ -780,14 +803,14 @@ class StrataOverlayDirective {
780
803
  this.destroy();
781
804
  }
782
805
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
783
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: StrataOverlayDirective, isStandalone: true, selector: "[stOverlay]", inputs: { stOverlay: { classPropertyName: "stOverlay", publicName: "stOverlay", isSignal: true, isRequired: true, transformFunction: null }, overlayOpen: { classPropertyName: "overlayOpen", publicName: "overlayOpen", isSignal: true, isRequired: false, transformFunction: null }, overlayPlacement: { classPropertyName: "overlayPlacement", publicName: "overlayPlacement", isSignal: true, isRequired: false, transformFunction: null }, overlayOffset: { classPropertyName: "overlayOffset", publicName: "overlayOffset", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { overlayOpen: "overlayOpenChange" }, usesOnChanges: true, ngImport: i0 });
806
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: StrataOverlayDirective, isStandalone: true, selector: "[stOverlay]", inputs: { stOverlay: { classPropertyName: "stOverlay", publicName: "stOverlay", isSignal: true, isRequired: true, transformFunction: null }, overlayOpen: { classPropertyName: "overlayOpen", publicName: "overlayOpen", isSignal: true, isRequired: false, transformFunction: null }, overlayPlacement: { classPropertyName: "overlayPlacement", publicName: "overlayPlacement", isSignal: true, isRequired: false, transformFunction: null }, overlayOffset: { classPropertyName: "overlayOffset", publicName: "overlayOffset", isSignal: true, isRequired: false, transformFunction: null }, overlayFitViewport: { classPropertyName: "overlayFitViewport", publicName: "overlayFitViewport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { overlayOpen: "overlayOpenChange" }, usesOnChanges: true, ngImport: i0 });
784
807
  }
785
808
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataOverlayDirective, decorators: [{
786
809
  type: Directive,
787
810
  args: [{
788
811
  selector: '[stOverlay]'
789
812
  }]
790
- }], propDecorators: { stOverlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "stOverlay", required: true }] }], overlayOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOpen", required: false }] }, { type: i0.Output, args: ["overlayOpenChange"] }], overlayPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayPlacement", required: false }] }], overlayOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOffset", required: false }] }] } });
813
+ }], propDecorators: { stOverlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "stOverlay", required: true }] }], overlayOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOpen", required: false }] }, { type: i0.Output, args: ["overlayOpenChange"] }], overlayPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayPlacement", required: false }] }], overlayOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOffset", required: false }] }], overlayFitViewport: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayFitViewport", required: false }] }] } });
791
814
 
792
815
  class StrataActionMenuComponent {
793
816
  projectedButton = contentChild(StrataButtonDirective, { ...(ngDevMode ? { debugName: "projectedButton" } : /* istanbul ignore next */ {}), descendants: true,
@@ -825,7 +848,7 @@ class StrataActionMenuComponent {
825
848
  });
826
849
  }
827
850
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataActionMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
828
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataActionMenuComponent, isStandalone: true, selector: "st-action-menu", inputs: { placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "projectedButton", first: true, predicate: StrataButtonDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "actionMenuItems", predicate: StrataActionMenuItemComponent, isSignal: true }], viewQueries: [{ propertyName: "defaultButton", first: true, predicate: StrataButtonDirective, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div [stOverlay]=\"menu\" [overlayOpen]=\"menuOpen()\" [overlayPlacement]=\"placement()\">\n <ng-content select=\"button[stButton]\"></ng-content>\n @if (!projectedButton()) {\n <button stButton><st-icon name=\"more\"></st-icon></button>\n }\n</div>\n\n<ng-template #menu>\n <st-card [padding]=\"false\" class=\"action-menu-card\"><ng-content select=\"st-action-menu-item\"></ng-content></st-card>\n</ng-template>\n", styles: ["st-card{width:fit-content}\n"], dependencies: [{ kind: "component", type: StrataCardComponent, selector: "st-card", inputs: ["elevated", "selectable", "padding", "variant"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
851
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataActionMenuComponent, isStandalone: true, selector: "st-action-menu", inputs: { placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "projectedButton", first: true, predicate: StrataButtonDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "actionMenuItems", predicate: StrataActionMenuItemComponent, isSignal: true }], viewQueries: [{ propertyName: "defaultButton", first: true, predicate: StrataButtonDirective, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div [stOverlay]=\"menu\" [overlayOpen]=\"menuOpen()\" [overlayPlacement]=\"placement()\">\n <ng-content select=\"button[stButton]\"></ng-content>\n @if (!projectedButton()) {\n <button stButton><st-icon name=\"more\"></st-icon></button>\n }\n</div>\n\n<ng-template #menu>\n <st-card [padding]=\"false\" class=\"action-menu-card\"><ng-content select=\"st-action-menu-item\"></ng-content></st-card>\n</ng-template>\n", styles: ["st-card{width:fit-content}\n"], dependencies: [{ kind: "component", type: StrataCardComponent, selector: "st-card", inputs: ["elevated", "selectable", "padding", "variant"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
829
852
  }
830
853
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataActionMenuComponent, decorators: [{
831
854
  type: Component,
@@ -1287,7 +1310,7 @@ class StrataSingleSelectComponent {
1287
1310
  this.open.set(false);
1288
1311
  }
1289
1312
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataSingleSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1290
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataSingleSelectComponent, isStandalone: true, selector: "st-single-select", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchQuery: { classPropertyName: "searchQuery", publicName: "searchQuery", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", searchQuery: "searchQueryChange", itemSelected: "itemSelected" }, queries: [{ propertyName: "selectItems", predicate: StrataSelectItemComponent, isSignal: true }, { propertyName: "triggerTemplate", first: true, predicate: StrataSelectTriggerDirective, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "inputField", first: true, predicate: StrataInputFieldComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n<label class=\"st-label\" [for]=\"name()\"> {{ label() }}</label>\n}\n<div class=\"single-select-input\" [id]=\"name()\" #singleSelectInput (click)=\"toggle($event)\" [attr.data-open]=\"open()\"\n tabindex=\"0\" [stOverlay]=\"selector\" [overlayOpen]=\"open()\" [overlayPlacement]=\"placement()\">\n @if (selectedItem()) {\n @if (triggerTemplate()) {\n <ng-container *ngTemplateOutlet=\"triggerTemplate()!\"></ng-container>\n } @else {\n {{ selectedItem()!.text() }}\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n\n <st-icon name=\"expand-up-down\"></st-icon>\n</div>\n\n<ng-template #selector>\n <div class=\"single-select-selector\" #singleSelectSelector [class.full-width]=\"fullWidth()\">\n @if (searchable()) {\n <st-input-field>\n <input stInput #searchField type=\"text\" [value]=\"searchQuery() || ''\" (input)=\"searchQuery.set($any($event.target).value); onSearchChange(searchQuery())\" [placeholder]=\"searchPlaceholder()\" />\n <button stButton variant=\"ghost\" [class.visible]=\"searchQuery() !== undefined && searchQuery()!.length > 0\" suffix\n size=\"sm\" (click)=\"searchQuery.set(undefined); onSearchChange(undefined)\">\n x\n </button>\n </st-input-field>\n }\n <ng-content select=\"st-select-item\"></ng-content>\n </div>\n</ng-template>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataInputFieldComponent, selector: "st-input-field" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: StrataNativeInputRefDirective, selector: "input[stInput], textarea[stInput]" }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
1313
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataSingleSelectComponent, isStandalone: true, selector: "st-single-select", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchQuery: { classPropertyName: "searchQuery", publicName: "searchQuery", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", searchQuery: "searchQueryChange", itemSelected: "itemSelected" }, queries: [{ propertyName: "selectItems", predicate: StrataSelectItemComponent, isSignal: true }, { propertyName: "triggerTemplate", first: true, predicate: StrataSelectTriggerDirective, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "inputField", first: true, predicate: StrataInputFieldComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n<label class=\"st-label\" [for]=\"name()\"> {{ label() }}</label>\n}\n<div class=\"single-select-input\" [id]=\"name()\" #singleSelectInput (click)=\"toggle($event)\" [attr.data-open]=\"open()\"\n tabindex=\"0\" [stOverlay]=\"selector\" [overlayOpen]=\"open()\" [overlayPlacement]=\"placement()\">\n @if (selectedItem()) {\n @if (triggerTemplate()) {\n <ng-container *ngTemplateOutlet=\"triggerTemplate()!\"></ng-container>\n } @else {\n {{ selectedItem()!.text() }}\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n\n <st-icon name=\"expand-up-down\"></st-icon>\n</div>\n\n<ng-template #selector>\n <div class=\"single-select-selector\" #singleSelectSelector [class.full-width]=\"fullWidth()\">\n @if (searchable()) {\n <st-input-field>\n <input stInput #searchField type=\"text\" [value]=\"searchQuery() || ''\" (input)=\"searchQuery.set($any($event.target).value); onSearchChange(searchQuery())\" [placeholder]=\"searchPlaceholder()\" />\n <button stButton variant=\"ghost\" [class.visible]=\"searchQuery() !== undefined && searchQuery()!.length > 0\" suffix\n size=\"sm\" (click)=\"searchQuery.set(undefined); onSearchChange(undefined)\">\n x\n </button>\n </st-input-field>\n }\n <div class=\"single-select-items-container\">\n <ng-content select=\"st-select-item\"></ng-content>\n </div>\n </div>\n</ng-template>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataInputFieldComponent, selector: "st-input-field" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: StrataNativeInputRefDirective, selector: "input[stInput], textarea[stInput]" }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
1291
1314
  }
1292
1315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataSingleSelectComponent, decorators: [{
1293
1316
  type: Component,
@@ -1299,7 +1322,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
1299
1322
  FormsModule,
1300
1323
  StrataNativeInputRefDirective,
1301
1324
  StrataButtonDirective,
1302
- ], template: "@if (label()) {\n<label class=\"st-label\" [for]=\"name()\"> {{ label() }}</label>\n}\n<div class=\"single-select-input\" [id]=\"name()\" #singleSelectInput (click)=\"toggle($event)\" [attr.data-open]=\"open()\"\n tabindex=\"0\" [stOverlay]=\"selector\" [overlayOpen]=\"open()\" [overlayPlacement]=\"placement()\">\n @if (selectedItem()) {\n @if (triggerTemplate()) {\n <ng-container *ngTemplateOutlet=\"triggerTemplate()!\"></ng-container>\n } @else {\n {{ selectedItem()!.text() }}\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n\n <st-icon name=\"expand-up-down\"></st-icon>\n</div>\n\n<ng-template #selector>\n <div class=\"single-select-selector\" #singleSelectSelector [class.full-width]=\"fullWidth()\">\n @if (searchable()) {\n <st-input-field>\n <input stInput #searchField type=\"text\" [value]=\"searchQuery() || ''\" (input)=\"searchQuery.set($any($event.target).value); onSearchChange(searchQuery())\" [placeholder]=\"searchPlaceholder()\" />\n <button stButton variant=\"ghost\" [class.visible]=\"searchQuery() !== undefined && searchQuery()!.length > 0\" suffix\n size=\"sm\" (click)=\"searchQuery.set(undefined); onSearchChange(undefined)\">\n x\n </button>\n </st-input-field>\n }\n <ng-content select=\"st-select-item\"></ng-content>\n </div>\n</ng-template>" }]
1325
+ ], template: "@if (label()) {\n<label class=\"st-label\" [for]=\"name()\"> {{ label() }}</label>\n}\n<div class=\"single-select-input\" [id]=\"name()\" #singleSelectInput (click)=\"toggle($event)\" [attr.data-open]=\"open()\"\n tabindex=\"0\" [stOverlay]=\"selector\" [overlayOpen]=\"open()\" [overlayPlacement]=\"placement()\">\n @if (selectedItem()) {\n @if (triggerTemplate()) {\n <ng-container *ngTemplateOutlet=\"triggerTemplate()!\"></ng-container>\n } @else {\n {{ selectedItem()!.text() }}\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n\n <st-icon name=\"expand-up-down\"></st-icon>\n</div>\n\n<ng-template #selector>\n <div class=\"single-select-selector\" #singleSelectSelector [class.full-width]=\"fullWidth()\">\n @if (searchable()) {\n <st-input-field>\n <input stInput #searchField type=\"text\" [value]=\"searchQuery() || ''\" (input)=\"searchQuery.set($any($event.target).value); onSearchChange(searchQuery())\" [placeholder]=\"searchPlaceholder()\" />\n <button stButton variant=\"ghost\" [class.visible]=\"searchQuery() !== undefined && searchQuery()!.length > 0\" suffix\n size=\"sm\" (click)=\"searchQuery.set(undefined); onSearchChange(undefined)\">\n x\n </button>\n </st-input-field>\n }\n <div class=\"single-select-items-container\">\n <ng-content select=\"st-select-item\"></ng-content>\n </div>\n </div>\n</ng-template>" }]
1303
1326
  }], ctorParameters: () => [], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchQuery: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchQuery", required: false }] }, { type: i0.Output, args: ["searchQueryChange"] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }], selectItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataSelectItemComponent), { isSignal: true }] }], triggerTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataSelectTriggerDirective), { ...{ read: TemplateRef }, isSignal: true }] }], inputField: [{ type: i0.ViewChild, args: [i0.forwardRef(() => StrataInputFieldComponent), { isSignal: true }] }] } });
1304
1327
 
1305
1328
  class StrataDividerComponent {