ngx-strata 0.1.0 → 0.2.1

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.
Files changed (72) hide show
  1. package/assets/styles/base.scss +7 -3
  2. package/assets/styles/colors.scss +3 -11
  3. package/assets/styles/components/_breadcrumb.scss +68 -0
  4. package/assets/styles/components/accordion.scss +4 -2
  5. package/assets/styles/components/action-menu.scss +14 -3
  6. package/assets/styles/components/alert.scss +112 -0
  7. package/assets/styles/components/avatar.scss +40 -22
  8. package/assets/styles/components/button.scss +27 -20
  9. package/assets/styles/components/card.scss +21 -13
  10. package/assets/styles/components/checkbox.scss +11 -9
  11. package/assets/styles/components/icon.scss +5 -0
  12. package/assets/styles/components/input-field.scss +6 -3
  13. package/assets/styles/components/item.scss +11 -1
  14. package/assets/styles/components/modal.scss +3 -9
  15. package/assets/styles/components/notification.scss +40 -20
  16. package/assets/styles/components/overlay.scss +4 -0
  17. package/assets/styles/components/pagination.scss +16 -8
  18. package/assets/styles/components/progress.scss +32 -22
  19. package/assets/styles/components/radio.scss +101 -0
  20. package/assets/styles/components/segmented-control.scss +41 -9
  21. package/assets/styles/components/select.scss +24 -30
  22. package/assets/styles/components/sidemenu.scss +62 -0
  23. package/assets/styles/components/spinner.scss +10 -7
  24. package/assets/styles/components/table.scss +4 -2
  25. package/assets/styles/components/tabs.scss +71 -0
  26. package/assets/styles/components/tag.scss +17 -13
  27. package/assets/styles/components/toggle.scss +69 -40
  28. package/assets/styles/focus-outline.scss +2 -1
  29. package/assets/styles/primitives/color-primitives.scss +88 -0
  30. package/assets/styles/primitives/spacing-primitives.scss +16 -0
  31. package/assets/styles/public-api.scss +43 -34
  32. package/assets/styles/semantics/color-semantic.scss +121 -0
  33. package/assets/styles/typography.scss +123 -34
  34. package/dist/strata/strata.css +1 -1
  35. package/fesm2022/ngx-strata.mjs +1154 -439
  36. package/fesm2022/ngx-strata.mjs.map +1 -1
  37. package/package.json +3 -3
  38. package/skills/ngx-strata/SKILL.md +106 -0
  39. package/skills/ngx-strata/components/accordion.md +38 -0
  40. package/skills/ngx-strata/components/action-menu.md +36 -0
  41. package/skills/ngx-strata/components/alert.md +28 -0
  42. package/skills/ngx-strata/components/avatar.md +33 -0
  43. package/skills/ngx-strata/components/breadcrumb.md +32 -0
  44. package/skills/ngx-strata/components/button.md +34 -0
  45. package/skills/ngx-strata/components/card.md +24 -0
  46. package/skills/ngx-strata/components/checkbox.md +22 -0
  47. package/skills/ngx-strata/components/divider.md +19 -0
  48. package/skills/ngx-strata/components/icon.md +21 -0
  49. package/skills/ngx-strata/components/input-field.md +29 -0
  50. package/skills/ngx-strata/components/item.md +31 -0
  51. package/skills/ngx-strata/components/kbd.md +18 -0
  52. package/skills/ngx-strata/components/message-state.md +32 -0
  53. package/skills/ngx-strata/components/modal.md +86 -0
  54. package/skills/ngx-strata/components/notification.md +46 -0
  55. package/skills/ngx-strata/components/number-display.md +26 -0
  56. package/skills/ngx-strata/components/overlay.md +20 -0
  57. package/skills/ngx-strata/components/pagination.md +23 -0
  58. package/skills/ngx-strata/components/progress.md +46 -0
  59. package/skills/ngx-strata/components/radio.md +29 -0
  60. package/skills/ngx-strata/components/segmented-control.md +38 -0
  61. package/skills/ngx-strata/components/shell.md +18 -0
  62. package/skills/ngx-strata/components/sidemenu.md +41 -0
  63. package/skills/ngx-strata/components/single-select.md +45 -0
  64. package/skills/ngx-strata/components/slider.md +24 -0
  65. package/skills/ngx-strata/components/spinner.md +17 -0
  66. package/skills/ngx-strata/components/tabs.md +27 -0
  67. package/skills/ngx-strata/components/tag.md +17 -0
  68. package/skills/ngx-strata/components/text-stack.md +21 -0
  69. package/skills/ngx-strata/components/theming.md +19 -0
  70. package/skills/ngx-strata/components/toggle.md +22 -0
  71. package/types/ngx-strata.d.ts +464 -228
  72. package/dist/my-lib/strata.css +0 -1
@@ -1,13 +1,45 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, provideAppInitializer, inject, makeEnvironmentProviders, InjectionToken, input, DOCUMENT, Input, Inject, Directive, signal, computed, effect, model, HostListener, Component, HostBinding, contentChild, ElementRef, output, ChangeDetectionStrategy, ViewContainerRef, viewChild, contentChildren, Renderer2, Pipe, LOCALE_ID } from '@angular/core';
2
+ import { inject, ElementRef, input, model, output, computed, Directive, Injectable, provideAppInitializer, makeEnvironmentProviders, InjectionToken, DOCUMENT, Input, Inject, signal, effect, DestroyRef, HostListener, Component, contentChild, HostBinding, ViewContainerRef, viewChild, contentChildren, Renderer2, TemplateRef, Pipe, booleanAttribute, ContentChildren, Injector, LOCALE_ID } from '@angular/core';
3
3
  import { computePosition, offset, arrow, autoUpdate, flip, shift } from '@floating-ui/dom';
4
- import { Observable, tap, map, BehaviorSubject } from 'rxjs';
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';
7
- import * as i1 from '@angular/forms';
7
+ import { takeUntilDestroyed, toSignal, toObservable } from '@angular/core/rxjs-interop';
8
+ import * as i1 from '@angular/common';
9
+ import { CommonModule, NgTemplateOutlet, DecimalPipe, formatNumber, getLocaleNumberSymbol, NumberSymbol } from '@angular/common';
10
+ import * as i1$1 from '@angular/forms';
8
11
  import { FormsModule } from '@angular/forms';
9
- import * as i2 from '@angular/common';
10
- import { NgTemplateOutlet, CommonModule, DecimalPipe, formatNumber, getLocaleNumberSymbol, NumberSymbol } from '@angular/common';
12
+ import { Router, NavigationEnd, RouterLinkActive } from '@angular/router';
13
+
14
+ class StrataActivatableDirective {
15
+ _elementRef = inject(ElementRef);
16
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
17
+ interactable = model(true, ...(ngDevMode ? [{ debugName: "interactable" }] : []));
18
+ activated = output();
19
+ isFocusable = computed(() => this.interactable() && !this.disabled(), ...(ngDevMode ? [{ debugName: "isFocusable" }] : []));
20
+ onKeyDown(event) {
21
+ if (!this.isFocusable()) {
22
+ return;
23
+ }
24
+ if (event.key === ' ' || event.key === 'Enter') {
25
+ event.preventDefault();
26
+ this.activated.emit(event);
27
+ this._elementRef.nativeElement.click();
28
+ }
29
+ }
30
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataActivatableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
31
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: StrataActivatableDirective, isStandalone: true, selector: "[stActivatable]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, interactable: { classPropertyName: "interactable", publicName: "interactable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { interactable: "interactableChange", activated: "activated" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "attr.tabindex": "isFocusable() ? \"0\" : null" } }, ngImport: i0 });
32
+ }
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataActivatableDirective, decorators: [{
34
+ type: Directive,
35
+ args: [{
36
+ selector: '[stActivatable]',
37
+ host: {
38
+ '(keydown)': 'onKeyDown($event)',
39
+ '[attr.tabindex]': 'isFocusable() ? "0" : null',
40
+ },
41
+ }]
42
+ }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], interactable: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactable", required: false }] }, { type: i0.Output, args: ["interactableChange"] }], activated: [{ type: i0.Output, args: ["activated"] }] } });
11
43
 
12
44
  class IconLoader {
13
45
  }
@@ -146,9 +178,20 @@ function provideIconRegistry() {
146
178
  const DEFAULT_CONFIG = {
147
179
  includeBaseIcons: true,
148
180
  tooltipDelayMs: 500,
181
+ crossPlatformHotkeys: true,
182
+ shortcutLabels: {
183
+ meta: '⌘',
184
+ ctrl: 'Ctrl',
185
+ shift: 'Shift',
186
+ alt: 'Alt',
187
+ },
149
188
  };
150
189
  function provideStrata(config = {}) {
151
- const mergedConfig = { ...DEFAULT_CONFIG, ...config };
190
+ const mergedConfig = {
191
+ ...DEFAULT_CONFIG,
192
+ ...config,
193
+ shortcutLabels: { ...DEFAULT_CONFIG.shortcutLabels, ...config.shortcutLabels },
194
+ };
152
195
  const providers = [
153
196
  provideIconLoader(),
154
197
  provideIconRegistry(),
@@ -164,7 +207,7 @@ function provideStrata(config = {}) {
164
207
  }
165
208
  const STRATA_CONFIG = new InjectionToken('STRATA_CONFIG');
166
209
 
167
- class TooltipDirective {
210
+ class StrataTooltipDirective {
168
211
  document;
169
212
  element;
170
213
  renderer;
@@ -259,16 +302,17 @@ class TooltipDirective {
259
302
  }
260
303
  this.tooltipContentElement?.removeAttribute('data-show');
261
304
  this.tooltipContentElement?.setAttribute('aria-hidden', 'true');
262
- this.autoUpdateCleanupFunction();
305
+ if (this.autoUpdateCleanupFunction) {
306
+ this.autoUpdateCleanupFunction();
307
+ }
263
308
  }
264
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TooltipDirective, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
265
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: TooltipDirective, isStandalone: true, selector: "[stSimpleTooltip]", inputs: { stSimpleTooltip: { classPropertyName: "stSimpleTooltip", publicName: "stSimpleTooltip", isSignal: true, isRequired: true, transformFunction: null }, tooltipEnabled: { classPropertyName: "tooltipEnabled", publicName: "tooltipEnabled", isSignal: false, isRequired: false, transformFunction: null }, tooltipPlacement: { classPropertyName: "tooltipPlacement", publicName: "tooltipPlacement", isSignal: false, isRequired: false, transformFunction: null }, tooltipAlwaysShow: { classPropertyName: "tooltipAlwaysShow", publicName: "tooltipAlwaysShow", isSignal: false, isRequired: false, transformFunction: null } }, ngImport: i0 });
309
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTooltipDirective, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
310
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: StrataTooltipDirective, isStandalone: true, selector: "[stSimpleTooltip]", inputs: { stSimpleTooltip: { classPropertyName: "stSimpleTooltip", publicName: "stSimpleTooltip", isSignal: true, isRequired: true, transformFunction: null }, tooltipEnabled: { classPropertyName: "tooltipEnabled", publicName: "tooltipEnabled", isSignal: false, isRequired: false, transformFunction: null }, tooltipPlacement: { classPropertyName: "tooltipPlacement", publicName: "tooltipPlacement", isSignal: false, isRequired: false, transformFunction: null }, tooltipAlwaysShow: { classPropertyName: "tooltipAlwaysShow", publicName: "tooltipAlwaysShow", isSignal: false, isRequired: false, transformFunction: null } }, ngImport: i0 });
266
311
  }
267
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TooltipDirective, decorators: [{
312
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTooltipDirective, decorators: [{
268
313
  type: Directive,
269
314
  args: [{
270
315
  selector: '[stSimpleTooltip]',
271
- standalone: true,
272
316
  }]
273
317
  }], ctorParameters: () => [{ type: Document, decorators: [{
274
318
  type: Inject,
@@ -344,7 +388,96 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
344
388
  }]
345
389
  }], ctorParameters: () => [] });
346
390
 
347
- class CheckboxComponent {
391
+ class HotkeyService {
392
+ config = inject(STRATA_CONFIG);
393
+ destroyRef = inject(DestroyRef);
394
+ registrations = new Map();
395
+ constructor() {
396
+ fromEvent(document, 'keydown')
397
+ .pipe(takeUntilDestroyed(this.destroyRef))
398
+ .subscribe((event) => this.handleKeydown(event));
399
+ }
400
+ /**
401
+ * Register a keyboard shortcut.
402
+ *
403
+ * @param combo - A combo string like `'meta+k'`, `'ctrl+shift+p'`, `'shift+?'`.
404
+ * Use `'meta'` for ⌘ on Mac / Win key on Windows. When `crossPlatformHotkeys` is
405
+ * enabled in StrataConfig (default), registering `meta+k` also fires on `ctrl+k`
406
+ * and vice-versa.
407
+ * @param handler - Callback invoked when the combo is matched.
408
+ * @param options - Optional configuration per registration.
409
+ * @returns A teardown function — call it to unregister the hotkey.
410
+ */
411
+ register(combo, handler, options = {}) {
412
+ const id = Symbol();
413
+ const parsed = this.parseCombo(combo);
414
+ const combos = this.config.crossPlatformHotkeys ? this.expandCrossPlatform(parsed) : [parsed];
415
+ this.registrations.set(id, {
416
+ combos,
417
+ handler,
418
+ options: { allowInInput: false, ...options },
419
+ });
420
+ return () => this.registrations.delete(id);
421
+ }
422
+ handleKeydown(event) {
423
+ for (const registration of this.registrations.values()) {
424
+ if (!registration.options.allowInInput && this.isInputFocused(event)) {
425
+ continue;
426
+ }
427
+ if (registration.combos.some((combo) => this.matchesCombo(event, combo))) {
428
+ event.preventDefault();
429
+ registration.handler();
430
+ }
431
+ }
432
+ }
433
+ matchesCombo(event, combo) {
434
+ return (event.key.toLowerCase() === combo.key &&
435
+ event.metaKey === combo.meta &&
436
+ event.ctrlKey === combo.ctrl &&
437
+ event.shiftKey === combo.shift &&
438
+ event.altKey === combo.alt);
439
+ }
440
+ parseCombo(combo) {
441
+ const parts = combo.toLowerCase().split('+');
442
+ const key = parts[parts.length - 1];
443
+ return {
444
+ key,
445
+ meta: parts.includes('meta'),
446
+ ctrl: parts.includes('ctrl'),
447
+ shift: parts.includes('shift'),
448
+ alt: parts.includes('alt'),
449
+ };
450
+ }
451
+ /**
452
+ * When crossPlatformHotkeys is enabled, mirror meta ↔ ctrl so that
453
+ * a single `register('meta+k', ...)` call fires on both ⌘K (Mac) and Ctrl+K (Win/Linux).
454
+ */
455
+ expandCrossPlatform(parsed) {
456
+ const combos = [parsed];
457
+ if (parsed.meta && !parsed.ctrl) {
458
+ combos.push({ ...parsed, meta: false, ctrl: true });
459
+ }
460
+ else if (parsed.ctrl && !parsed.meta) {
461
+ combos.push({ ...parsed, ctrl: false, meta: true });
462
+ }
463
+ return combos;
464
+ }
465
+ isInputFocused(event) {
466
+ const target = event.target;
467
+ if (!target)
468
+ return false;
469
+ const tag = target.tagName.toLowerCase();
470
+ return tag === 'input' || tag === 'textarea' || target.isContentEditable;
471
+ }
472
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HotkeyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
473
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HotkeyService, providedIn: 'root' });
474
+ }
475
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HotkeyService, decorators: [{
476
+ type: Injectable,
477
+ args: [{ providedIn: 'root' }]
478
+ }], ctorParameters: () => [] });
479
+
480
+ class StrataCheckboxComponent {
348
481
  value = model(false, ...(ngDevMode ? [{ debugName: "value" }] : []));
349
482
  label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : []));
350
483
  name = input(undefined, ...(ngDevMode ? [{ debugName: "name" }] : []));
@@ -352,10 +485,10 @@ class CheckboxComponent {
352
485
  event.stopImmediatePropagation();
353
486
  this.value.set(!this.value());
354
487
  }
355
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
356
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: CheckboxComponent, isStandalone: true, selector: "st-checkbox", inputs: { value: { classPropertyName: "value", publicName: "value", 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 } }, outputs: { value: "valueChange" }, host: { listeners: { "click": "onClick($event)" } }, ngImport: i0, template: "<input type=\"checkbox\" [checked]=\"value()\" />\n<div class=\"checkbox-visual\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path\n d=\"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z\"\n ></path>\n </svg>\n</div>\n@if (label()) {\n <label [for]=\"name()\"> {{ label() }}</label>\n}\n" });
488
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
489
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataCheckboxComponent, isStandalone: true, selector: "st-checkbox", inputs: { value: { classPropertyName: "value", publicName: "value", 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 } }, outputs: { value: "valueChange" }, host: { listeners: { "click": "onClick($event)" } }, ngImport: i0, template: "<input type=\"checkbox\" [checked]=\"value()\" />\n<div class=\"checkbox-visual\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path\n d=\"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z\"\n ></path>\n </svg>\n</div>\n@if (label()) {\n <label [for]=\"name()\"> {{ label() }}</label>\n}\n" });
357
490
  }
358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CheckboxComponent, decorators: [{
491
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataCheckboxComponent, decorators: [{
359
492
  type: Component,
360
493
  args: [{ selector: 'st-checkbox', imports: [], template: "<input type=\"checkbox\" [checked]=\"value()\" />\n<div class=\"checkbox-visual\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path\n d=\"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z\"\n ></path>\n </svg>\n</div>\n@if (label()) {\n <label [for]=\"name()\"> {{ label() }}</label>\n}\n" }]
361
494
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], onClick: [{
@@ -363,59 +496,75 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
363
496
  args: ['click', ['$event']]
364
497
  }] } });
365
498
 
366
- class ToggleComponent {
499
+ class StrataToggleComponent {
500
+ _activatable = inject(StrataActivatableDirective);
367
501
  checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
368
- get isChecked() {
369
- return this.checked();
370
- }
371
- size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
372
- get sizeClass() {
373
- return this.size();
374
- }
375
- onCheckChanged() {
502
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : []));
503
+ labelPosition = input('after', ...(ngDevMode ? [{ debugName: "labelPosition" }] : []));
504
+ disabled = this._activatable.disabled;
505
+ onCheckChanged(event) {
506
+ if (this.disabled()) {
507
+ return;
508
+ }
509
+ if (event) {
510
+ event.stopPropagation();
511
+ }
376
512
  this.checked.set(!this.checked());
377
513
  }
378
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
379
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: ToggleComponent, isStandalone: true, selector: "st-toggle", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange" }, host: { attributes: { "tabindex": "0" }, listeners: { "click": "onCheckChanged()" }, properties: { "attr.data-checked": "this.isChecked", "class": "this.sizeClass" } }, ngImport: i0, template: "<div class=\"toggle-handle\"></div>\n" });
514
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
515
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataToggleComponent, isStandalone: true, selector: "st-toggle", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, labelPosition: { classPropertyName: "labelPosition", publicName: "labelPosition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange" }, host: { attributes: { "role": "switch" }, listeners: { "click": "onCheckChanged($event)" }, properties: { "attr.aria-checked": "checked()", "attr.aria-disabled": "disabled()", "attr.data-checked": "checked()", "attr.data-disabled": "disabled()", "class.st-toggle-label-before": "labelPosition() === 'before'", "class.st-toggle-label-after": "labelPosition() === 'after'" } }, hostDirectives: [{ directive: StrataActivatableDirective, inputs: ["disabled", "disabled"], outputs: ["activated", "activated"] }], ngImport: i0, template: "<div class=\"st-toggle-track\">\n <div class=\"toggle-handle\"></div>\n</div>\n@if (label()) {\n <span class=\"st-toggle-label\">{{ label() }}</span>\n}\n<ng-content></ng-content>\n" });
380
516
  }
381
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ToggleComponent, decorators: [{
517
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataToggleComponent, decorators: [{
382
518
  type: Component,
383
- args: [{ selector: 'st-toggle', imports: [], host: {
384
- '(click)': 'onCheckChanged()',
385
- tabindex: '0',
386
- }, template: "<div class=\"toggle-handle\"></div>\n" }]
387
- }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], isChecked: [{
388
- type: HostBinding,
389
- args: ['attr.data-checked']
390
- }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], sizeClass: [{
391
- type: HostBinding,
392
- args: ['class']
393
- }] } });
519
+ args: [{ selector: 'st-toggle', imports: [], hostDirectives: [
520
+ {
521
+ directive: StrataActivatableDirective,
522
+ inputs: ['disabled'],
523
+ outputs: ['activated'],
524
+ },
525
+ ], host: {
526
+ '(click)': 'onCheckChanged($event)',
527
+ role: 'switch',
528
+ '[attr.aria-checked]': 'checked()',
529
+ '[attr.aria-disabled]': 'disabled()',
530
+ '[attr.data-checked]': 'checked()',
531
+ '[attr.data-disabled]': 'disabled()',
532
+ '[class.st-toggle-label-before]': "labelPosition() === 'before'",
533
+ '[class.st-toggle-label-after]': "labelPosition() === 'after'",
534
+ }, template: "<div class=\"st-toggle-track\">\n <div class=\"toggle-handle\"></div>\n</div>\n@if (label()) {\n <span class=\"st-toggle-label\">{{ label() }}</span>\n}\n<ng-content></ng-content>\n" }]
535
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], labelPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPosition", required: false }] }] } });
394
536
 
395
- class ActionMenuItemComponent {
396
- checkbox = contentChild(CheckboxComponent, { ...(ngDevMode ? { debugName: "checkbox" } : {}), read: ElementRef });
397
- toggle = contentChild(ToggleComponent, { ...(ngDevMode ? { debugName: "toggle" } : {}), read: ElementRef });
537
+ class StrataActionMenuItemComponent {
538
+ checkbox = contentChild(StrataCheckboxComponent, { ...(ngDevMode ? { debugName: "checkbox" } : {}), read: ElementRef });
539
+ toggle = contentChild(StrataToggleComponent, { ...(ngDevMode ? { debugName: "toggle" } : {}), read: ElementRef });
398
540
  closeMenuOnClick = input(true, ...(ngDevMode ? [{ debugName: "closeMenuOnClick" }] : []));
399
- onMenuItemClicked = output();
541
+ active = input(false, ...(ngDevMode ? [{ debugName: "active" }] : []));
542
+ get isActive() {
543
+ return this.active();
544
+ }
545
+ menuItemClicked = output();
400
546
  elementRef = inject(ElementRef);
401
547
  onHostClick(event) {
402
- this.onMenuItemClicked.emit(this.closeMenuOnClick());
548
+ this.menuItemClicked.emit(this.closeMenuOnClick());
403
549
  event.stopPropagation();
404
550
  this.checkbox()?.nativeElement.click();
405
551
  this.toggle()?.nativeElement.click();
406
552
  }
407
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ActionMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
408
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: ActionMenuItemComponent, isStandalone: true, selector: "st-action-menu-item", inputs: { closeMenuOnClick: { classPropertyName: "closeMenuOnClick", publicName: "closeMenuOnClick", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onMenuItemClicked: "onMenuItemClicked" }, host: { listeners: { "click": "onHostClick($event)" } }, queries: [{ propertyName: "checkbox", first: true, predicate: CheckboxComponent, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "toggle", first: true, predicate: ToggleComponent, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<span class=\"item-start\">\n <ng-content select=\"[area='start']\"></ng-content\n></span>\n<span class=\"item-default\"> <ng-content></ng-content></span>\n<span class=\"item-end\">\n <ng-content select=\"[area='end']\"></ng-content>\n</span>\n", styles: [":host{height:48px}\n"] });
553
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataActionMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
554
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataActionMenuItemComponent, isStandalone: true, selector: "st-action-menu-item", inputs: { closeMenuOnClick: { classPropertyName: "closeMenuOnClick", publicName: "closeMenuOnClick", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClicked: "menuItemClicked" }, host: { listeners: { "click": "onHostClick($event)" }, properties: { "class.active": "this.isActive" } }, queries: [{ propertyName: "checkbox", first: true, predicate: StrataCheckboxComponent, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "toggle", first: true, predicate: StrataToggleComponent, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<span class=\"item-start\">\n <ng-content select=\"[area='start']\"></ng-content\n></span>\n<span class=\"item-default\"> <ng-content></ng-content></span>\n<span class=\"item-end\">\n <ng-content select=\"[area='end']\"></ng-content>\n</span>\n", styles: [":host{height:48px}\n"] });
409
555
  }
410
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ActionMenuItemComponent, decorators: [{
556
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataActionMenuItemComponent, decorators: [{
411
557
  type: Component,
412
558
  args: [{ selector: 'st-action-menu-item', imports: [], template: "<span class=\"item-start\">\n <ng-content select=\"[area='start']\"></ng-content\n></span>\n<span class=\"item-default\"> <ng-content></ng-content></span>\n<span class=\"item-end\">\n <ng-content select=\"[area='end']\"></ng-content>\n</span>\n", styles: [":host{height:48px}\n"] }]
413
- }], propDecorators: { checkbox: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CheckboxComponent), { ...{ read: ElementRef }, isSignal: true }] }], toggle: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ToggleComponent), { ...{ read: ElementRef }, isSignal: true }] }], closeMenuOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeMenuOnClick", required: false }] }], onMenuItemClicked: [{ type: i0.Output, args: ["onMenuItemClicked"] }], onHostClick: [{
559
+ }], propDecorators: { checkbox: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataCheckboxComponent), { ...{ read: ElementRef }, isSignal: true }] }], toggle: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataToggleComponent), { ...{ read: ElementRef }, isSignal: true }] }], closeMenuOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeMenuOnClick", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], isActive: [{
560
+ type: HostBinding,
561
+ args: ['class.active']
562
+ }], menuItemClicked: [{ type: i0.Output, args: ["menuItemClicked"] }], onHostClick: [{
414
563
  type: HostListener,
415
564
  args: ['click', ['$event']]
416
565
  }] } });
417
566
 
418
- class ButtonDirective {
567
+ class StrataButtonDirective {
419
568
  host = inject(ElementRef);
420
569
  variant = input('secondary', ...(ngDevMode ? [{ debugName: "variant" }] : []));
421
570
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
@@ -423,7 +572,6 @@ class ButtonDirective {
423
572
  iconAtStart = signal(false, ...(ngDevMode ? [{ debugName: "iconAtStart" }] : []));
424
573
  iconAtEnd = signal(false, ...(ngDevMode ? [{ debugName: "iconAtEnd" }] : []));
425
574
  iconOnly = signal(false, ...(ngDevMode ? [{ debugName: "iconOnly" }] : []));
426
- constructor() { }
427
575
  get classes() {
428
576
  return [
429
577
  'st-button',
@@ -448,7 +596,7 @@ class ButtonDirective {
448
596
  this.iconAtEnd.set(this.nodeIsStIcon(nodes[nodes.length - 1]));
449
597
  }
450
598
  nodeIsStIcon(node) {
451
- if (node.nodeType === Node.TEXT_NODE && !node.textContent.trim()) {
599
+ if (node.nodeType === Node.TEXT_NODE && !node.textContent?.trim()) {
452
600
  return false;
453
601
  }
454
602
  if (node.nodeType === Node.ELEMENT_NODE) {
@@ -457,20 +605,21 @@ class ButtonDirective {
457
605
  }
458
606
  return false;
459
607
  }
460
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
461
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: ButtonDirective, isStandalone: true, selector: "[stButton]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, ngImport: i0 });
608
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
609
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: StrataButtonDirective, isStandalone: true, selector: "[stButton]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, ngImport: i0 });
462
610
  }
463
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ButtonDirective, decorators: [{
611
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataButtonDirective, decorators: [{
464
612
  type: Directive,
465
613
  args: [{
466
614
  selector: '[stButton]',
467
615
  }]
468
- }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], classes: [{
616
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], classes: [{
469
617
  type: HostBinding,
470
618
  args: ['class']
471
619
  }] } });
472
620
 
473
- class CardComponent {
621
+ class StrataCardComponent {
622
+ elementRef = inject(ElementRef);
474
623
  elevated = input(false, ...(ngDevMode ? [{ debugName: "elevated" }] : []));
475
624
  selectable = input(false, ...(ngDevMode ? [{ debugName: "selectable" }] : []));
476
625
  padding = input(true, ...(ngDevMode ? [{ debugName: "padding" }] : []));
@@ -493,12 +642,18 @@ class CardComponent {
493
642
  get isOutline() {
494
643
  return this.variant() === 'outline';
495
644
  }
496
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
497
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: CardComponent, isStandalone: true, selector: "st-card", inputs: { elevated: { classPropertyName: "elevated", publicName: "elevated", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.with-padding": "this.withPadding", "class.selectable": "this.isSelectable", "attr.tabindex": "this.tabIndex", "class.elevated": "this.isElevated", "class.flat": "this.isFlat", "class.outline": "this.isOutline" } }, ngImport: i0, template: "<div class=\"cover-area\">\n <ng-content select=\"[area='cover']\"></ng-content>\n</div>\n<div class=\"card-content\">\n <ng-content></ng-content>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
645
+ handleKeyboardEvent(event) {
646
+ if (this.selectable()) {
647
+ event.preventDefault();
648
+ this.elementRef.nativeElement.click();
649
+ }
650
+ }
651
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
652
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataCardComponent, isStandalone: true, selector: "st-card", inputs: { elevated: { classPropertyName: "elevated", publicName: "elevated", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown.enter": "handleKeyboardEvent($event)", "keydown.space": "handleKeyboardEvent($event)" }, properties: { "class.with-padding": "this.withPadding", "class.selectable": "this.isSelectable", "attr.tabindex": "this.tabIndex", "class.elevated": "this.isElevated", "class.flat": "this.isFlat", "class.outline": "this.isOutline" } }, ngImport: i0, template: "<div class=\"cover-area\">\n <ng-content select=\"[area='cover']\"></ng-content>\n</div>\n<div class=\"card-content\">\n <ng-content></ng-content>\n</div>\n" });
498
653
  }
499
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CardComponent, decorators: [{
654
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataCardComponent, decorators: [{
500
655
  type: Component,
501
- args: [{ selector: 'st-card', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cover-area\">\n <ng-content select=\"[area='cover']\"></ng-content>\n</div>\n<div class=\"card-content\">\n <ng-content></ng-content>\n</div>\n" }]
656
+ args: [{ selector: 'st-card', imports: [], template: "<div class=\"cover-area\">\n <ng-content select=\"[area='cover']\"></ng-content>\n</div>\n<div class=\"card-content\">\n <ng-content></ng-content>\n</div>\n" }]
502
657
  }], propDecorators: { elevated: [{ type: i0.Input, args: [{ isSignal: true, alias: "elevated", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], withPadding: [{
503
658
  type: HostBinding,
504
659
  args: ['class.with-padding']
@@ -517,71 +672,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
517
672
  }], isOutline: [{
518
673
  type: HostBinding,
519
674
  args: ['class.outline']
675
+ }], handleKeyboardEvent: [{
676
+ type: HostListener,
677
+ args: ['keydown.enter', ['$event']]
678
+ }, {
679
+ type: HostListener,
680
+ args: ['keydown.space', ['$event']]
520
681
  }] } });
521
682
 
522
- class IconComponent {
523
- defaultIcon = 'question';
524
- name = input.required(...(ngDevMode ? [{ debugName: "name" }] : []));
525
- size = model('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
526
- get sizeClass() {
527
- return this.size() === 'xs';
528
- }
529
- get sizeSmClass() {
530
- return this.size() === 'sm';
531
- }
532
- get sizeMdClass() {
533
- return this.size() === 'md';
534
- }
535
- get sizeLgClass() {
536
- return this.size() === 'lg';
537
- }
538
- svgMarkdown;
539
- iconSubscription;
683
+ class StrataIconComponent {
540
684
  iconRegistry = inject(IconRegistry);
541
- ngOnDestroy() {
542
- if (this.iconSubscription) {
543
- this.iconSubscription.unsubscribe();
544
- }
545
- }
546
- ngOnChanges() {
547
- const name = this.name();
548
- if (!name) {
549
- this.setIcon(this.defaultIcon);
550
- }
551
- else {
552
- this.setIcon(name);
553
- }
554
- }
555
- setIcon(iconName) {
556
- this.iconSubscription = this.iconRegistry.getIcon(iconName).subscribe((value) => {
557
- this.svgMarkdown = value;
558
- });
559
- }
560
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
561
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: IconComponent, isStandalone: true, selector: "st-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { size: "sizeChange" }, host: { properties: { "class.xs": "this.sizeClass", "class.sm": "this.sizeSmClass", "class.md": "this.sizeMdClass", "class.lg": "this.sizeLgClass" } }, usesOnChanges: true, ngImport: i0, template: '<span [innerHTML]="svgMarkdown"></span>', isInline: true });
685
+ name = input('question', ...(ngDevMode ? [{ debugName: "name" }] : []));
686
+ size = model('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
687
+ svgMarkdown = toSignal(toObservable(this.name).pipe(switchMap((name) => this.iconRegistry.getIcon(name || 'question'))));
688
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
689
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataIconComponent, isStandalone: true, selector: "st-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { size: "sizeChange" }, host: { properties: { "class.xs": "size() === \"xs\"", "class.sm": "size() === \"sm\"", "class.md": "size() === \"md\"", "class.lg": "size() === \"lg\"" } }, ngImport: i0, template: "<span [innerHTML]=\"svgMarkdown()\"></span>\n" });
562
690
  }
563
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IconComponent, decorators: [{
691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataIconComponent, decorators: [{
564
692
  type: Component,
565
- args: [{
566
- selector: 'st-icon',
567
- imports: [],
568
- template: '<span [innerHTML]="svgMarkdown"></span>',
569
- }]
570
- }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }, { type: i0.Output, args: ["sizeChange"] }], sizeClass: [{
571
- type: HostBinding,
572
- args: ['class.xs']
573
- }], sizeSmClass: [{
574
- type: HostBinding,
575
- args: ['class.sm']
576
- }], sizeMdClass: [{
577
- type: HostBinding,
578
- args: ['class.md']
579
- }], sizeLgClass: [{
580
- type: HostBinding,
581
- args: ['class.lg']
582
- }] } });
693
+ args: [{ selector: 'st-icon', imports: [], host: {
694
+ '[class.xs]': 'size() === "xs"',
695
+ '[class.sm]': 'size() === "sm"',
696
+ '[class.md]': 'size() === "md"',
697
+ '[class.lg]': 'size() === "lg"',
698
+ }, template: "<span [innerHTML]=\"svgMarkdown()\"></span>\n" }]
699
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }, { type: i0.Output, args: ["sizeChange"] }] } });
583
700
 
584
- class OverlayDirective {
701
+ class StrataOverlayDirective {
585
702
  stOverlay = input.required(...(ngDevMode ? [{ debugName: "stOverlay" }] : []));
586
703
  overlayOpen = model(false, ...(ngDevMode ? [{ debugName: "overlayOpen" }] : []));
587
704
  overlayPlacement = input('bottom', ...(ngDevMode ? [{ debugName: "overlayPlacement" }] : []));
@@ -590,7 +707,7 @@ class OverlayDirective {
590
707
  viewContainerRef = inject(ViewContainerRef);
591
708
  overlayEl;
592
709
  cleanup;
593
- constructor() { }
710
+ viewRef;
594
711
  ngOnChanges() {
595
712
  if (this.overlayOpen()) {
596
713
  this.create();
@@ -602,9 +719,9 @@ class OverlayDirective {
602
719
  async create() {
603
720
  if (this.overlayEl)
604
721
  return;
605
- const view = this.viewContainerRef.createEmbeddedView(this.stOverlay());
606
- view.detectChanges();
607
- this.overlayEl = view.rootNodes[0];
722
+ this.viewRef = this.viewContainerRef.createEmbeddedView(this.stOverlay());
723
+ this.viewRef.detectChanges();
724
+ this.overlayEl = this.viewRef.rootNodes[0];
608
725
  document.body.appendChild(this.overlayEl);
609
726
  this.cleanup = autoUpdate(this.element.nativeElement, this.overlayEl, () => this.updatePosition());
610
727
  }
@@ -613,15 +730,17 @@ class OverlayDirective {
613
730
  return;
614
731
  const { x, y } = await computePosition(this.element.nativeElement, this.overlayEl, {
615
732
  placement: this.overlayPlacement(),
733
+ strategy: 'fixed',
616
734
  middleware: [offset(this.overlayOffset()), flip(), shift()],
617
735
  });
618
736
  if (!this.overlayEl)
619
737
  return;
620
- const { width, height } = this.element.nativeElement.getBoundingClientRect();
738
+ const { width } = this.element.nativeElement.getBoundingClientRect();
621
739
  Object.assign(this.overlayEl.style, {
622
- position: 'absolute',
740
+ position: 'fixed',
623
741
  left: `${x}px`,
624
742
  top: `${y}px`,
743
+ zIndex: '10000',
625
744
  });
626
745
  this.overlayEl.style.setProperty('--st-overlay-anchor-element-width', `${width}px`);
627
746
  }
@@ -630,63 +749,148 @@ class OverlayDirective {
630
749
  this.cleanup();
631
750
  if (this.overlayEl)
632
751
  this.overlayEl.remove();
752
+ if (this.viewRef) {
753
+ this.viewRef.destroy();
754
+ this.viewRef = undefined;
755
+ }
633
756
  this.overlayEl = undefined;
634
757
  }
635
758
  ngOnDestroy() {
636
759
  this.destroy();
637
760
  }
638
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: OverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
639
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: OverlayDirective, 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 });
761
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
762
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", 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 });
640
763
  }
641
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: OverlayDirective, decorators: [{
764
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataOverlayDirective, decorators: [{
642
765
  type: Directive,
643
766
  args: [{
644
767
  selector: '[stOverlay]',
645
768
  }]
646
- }], ctorParameters: () => [], 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 }] }] } });
769
+ }], 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 }] }] } });
647
770
 
648
- class ActionMenuComponent {
649
- projectedButton = contentChild(ButtonDirective, { ...(ngDevMode ? { debugName: "projectedButton" } : {}), descendants: true,
771
+ class StrataActionMenuComponent {
772
+ projectedButton = contentChild(StrataButtonDirective, { ...(ngDevMode ? { debugName: "projectedButton" } : {}), descendants: true,
650
773
  read: ElementRef });
651
- defaultButton = viewChild(ButtonDirective, { ...(ngDevMode ? { debugName: "defaultButton" } : {}), read: ElementRef });
652
- actionMenuItems = contentChildren(ActionMenuItemComponent, ...(ngDevMode ? [{ debugName: "actionMenuItems" }] : []));
774
+ defaultButton = viewChild(StrataButtonDirective, { ...(ngDevMode ? { debugName: "defaultButton" } : {}), read: ElementRef });
775
+ actionMenuItems = contentChildren(StrataActionMenuItemComponent, ...(ngDevMode ? [{ debugName: "actionMenuItems" }] : []));
653
776
  placement = input('bottom-end', ...(ngDevMode ? [{ debugName: "placement" }] : []));
654
777
  renderer = inject(Renderer2);
655
778
  menuOpen = signal(false, ...(ngDevMode ? [{ debugName: "menuOpen" }] : []));
656
- ngAfterViewInit() {
657
- const button = this.projectedButton() ?? this.defaultButton();
658
- this.renderer.listen(button.nativeElement, 'click', () => {
659
- this.menuOpen.set(!this.menuOpen());
779
+ constructor() {
780
+ effect((onCleanup) => {
781
+ const button = this.projectedButton() ?? this.defaultButton();
782
+ if (!button) {
783
+ return;
784
+ }
785
+ const unlisten = this.renderer.listen(button.nativeElement, 'click', () => {
786
+ this.menuOpen.set(!this.menuOpen());
787
+ });
788
+ onCleanup(() => {
789
+ unlisten();
790
+ });
660
791
  });
661
- this.actionMenuItems().forEach((item) => {
662
- item.onMenuItemClicked.subscribe((shouldClose) => {
792
+ effect((onCleanup) => {
793
+ const subs = this.actionMenuItems().map((item) => item.menuItemClicked.subscribe((shouldClose) => {
663
794
  if (shouldClose) {
664
795
  this.menuOpen.set(false);
665
796
  }
797
+ }));
798
+ onCleanup(() => {
799
+ subs.forEach((sub) => sub.unsubscribe());
666
800
  });
667
801
  });
668
802
  }
669
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ActionMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
670
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ActionMenuComponent, isStandalone: true, selector: "st-action-menu", inputs: { placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "projectedButton", first: true, predicate: ButtonDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "actionMenuItems", predicate: ActionMenuItemComponent, isSignal: true }], viewQueries: [{ propertyName: "defaultButton", first: true, predicate: ButtonDirective, 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\"><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: CardComponent, selector: "st-card", inputs: ["elevated", "selectable", "padding", "variant"] }, { kind: "directive", type: OverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset"], outputs: ["overlayOpenChange"] }, { kind: "component", type: IconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: ButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
803
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataActionMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
804
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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"] }] });
671
805
  }
672
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ActionMenuComponent, decorators: [{
806
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataActionMenuComponent, decorators: [{
673
807
  type: Component,
674
- args: [{ selector: 'st-action-menu', imports: [CardComponent, OverlayDirective, IconComponent, ButtonDirective], 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\"><ng-content select=\"st-action-menu-item\"></ng-content></st-card>\n</ng-template>\n", styles: ["st-card{width:fit-content}\n"] }]
675
- }], propDecorators: { projectedButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ButtonDirective), { ...{
808
+ args: [{ selector: 'st-action-menu', imports: [StrataCardComponent, StrataOverlayDirective, StrataIconComponent, StrataButtonDirective], 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"] }]
809
+ }], ctorParameters: () => [], propDecorators: { projectedButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataButtonDirective), { ...{
676
810
  descendants: true,
677
811
  read: ElementRef,
678
- }, isSignal: true }] }], defaultButton: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ButtonDirective), { ...{
812
+ }, isSignal: true }] }], defaultButton: [{ type: i0.ViewChild, args: [i0.forwardRef(() => StrataButtonDirective), { ...{
679
813
  read: ElementRef,
680
- }, isSignal: true }] }], actionMenuItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ActionMenuItemComponent), { isSignal: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }] } });
814
+ }, isSignal: true }] }], actionMenuItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataActionMenuItemComponent), { isSignal: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }] } });
815
+
816
+ class StrataTextStackComponent {
817
+ overflow = input('truncate', ...(ngDevMode ? [{ debugName: "overflow" }] : []));
818
+ get cssClasses() {
819
+ return [this.overflow()];
820
+ }
821
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTextStackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
822
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataTextStackComponent, isStandalone: true, selector: "st-text-stack", inputs: { overflow: { classPropertyName: "overflow", publicName: "overflow", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.cssClasses" } }, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [""] });
823
+ }
824
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTextStackComponent, decorators: [{
825
+ type: Component,
826
+ args: [{ selector: 'st-text-stack', imports: [], template: "<ng-content></ng-content>\n" }]
827
+ }], propDecorators: { overflow: [{ type: i0.Input, args: [{ isSignal: true, alias: "overflow", required: false }] }], cssClasses: [{
828
+ type: HostBinding,
829
+ args: ['class']
830
+ }] } });
831
+
832
+ class StrataAlertComponent {
833
+ header = input(undefined, ...(ngDevMode ? [{ debugName: "header" }] : []));
834
+ message = input.required(...(ngDevMode ? [{ debugName: "message" }] : []));
835
+ iconName = input(undefined, ...(ngDevMode ? [{ debugName: "iconName" }] : []));
836
+ dismissible = input(false, ...(ngDevMode ? [{ debugName: "dismissible" }] : []));
837
+ dismiss = output();
838
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
839
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataAlertComponent, isStandalone: true, selector: "st-alert", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null }, iconName: { classPropertyName: "iconName", publicName: "iconName", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismiss: "dismiss" }, ngImport: i0, template: "<div class=\"st-alert-container\">\n @if (iconName()) {\n <div class=\"st-alert-icon\">\n <st-icon [name]=\"iconName()!\"></st-icon>\n </div>\n }\n\n <div class=\"st-alert-content\">\n <st-text-stack overflow=\"wrap\">\n @if (header()) {\n <p class=\"st-body-bold st-alert-header\">{{ header() }}</p>\n }\n <p class=\"st-alert-message\">{{ message() }}</p>\n </st-text-stack>\n </div>\n\n\n\n\n <div class=\"st-alert-actions\">\n <ng-content select=\"[actions]\"></ng-content>\n </div>\n\n @if (dismissible()) {\n <button stButton variant=\"ghost\" size=\"sm\" class=\"st-alert-dismiss\" (click)=\"dismiss.emit()\"\n aria-label=\"Dismiss alert\">\n <st-icon name=\"close\"></st-icon>\n </button>\n }\n</div>", dependencies: [{ kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }, { kind: "component", type: StrataTextStackComponent, selector: "st-text-stack", inputs: ["overflow"] }] });
840
+ }
841
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAlertComponent, decorators: [{
842
+ type: Component,
843
+ args: [{ selector: 'st-alert', imports: [StrataIconComponent, StrataButtonDirective, StrataTextStackComponent], template: "<div class=\"st-alert-container\">\n @if (iconName()) {\n <div class=\"st-alert-icon\">\n <st-icon [name]=\"iconName()!\"></st-icon>\n </div>\n }\n\n <div class=\"st-alert-content\">\n <st-text-stack overflow=\"wrap\">\n @if (header()) {\n <p class=\"st-body-bold st-alert-header\">{{ header() }}</p>\n }\n <p class=\"st-alert-message\">{{ message() }}</p>\n </st-text-stack>\n </div>\n\n\n\n\n <div class=\"st-alert-actions\">\n <ng-content select=\"[actions]\"></ng-content>\n </div>\n\n @if (dismissible()) {\n <button stButton variant=\"ghost\" size=\"sm\" class=\"st-alert-dismiss\" (click)=\"dismiss.emit()\"\n aria-label=\"Dismiss alert\">\n <st-icon name=\"close\"></st-icon>\n </button>\n }\n</div>" }]
844
+ }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }], iconName: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconName", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], dismiss: [{ type: i0.Output, args: ["dismiss"] }] } });
845
+
846
+ class StrataBreadcrumbItemComponent {
847
+ text = input.required(...(ngDevMode ? [{ debugName: "text" }] : []));
848
+ icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : []));
849
+ interactable = input(false, ...(ngDevMode ? [{ debugName: "interactable" }] : []));
850
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
851
+ activated = output();
852
+ separatorIcon = signal(undefined, ...(ngDevMode ? [{ debugName: "separatorIcon" }] : []));
853
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataBreadcrumbItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
854
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataBreadcrumbItemComponent, isStandalone: true, selector: "st-breadcrumb-item", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, interactable: { classPropertyName: "interactable", publicName: "interactable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activated: "activated" }, host: { classAttribute: "st-breadcrumb-item" }, ngImport: i0, template: "<li class=\"st-breadcrumb-item-container\">\n <div class=\"st-breadcrumb-item-content\"\n stActivatable\n [interactable]=\"interactable()\"\n [disabled]=\"disabled()\"\n (click)=\"activated.emit($event)\">\n @if (icon()) {\n <st-icon [name]=\"icon()!\" size=\"sm\" class=\"st-breadcrumb-item-icon\"></st-icon>\n }\n <span class=\"st-breadcrumb-item-text\">{{ text() }}</span>\n </div>\n\n @if (separatorIcon()) {\n <st-icon [name]=\"separatorIcon()!\" size=\"sm\" class=\"st-breadcrumb-separator\"></st-icon>\n }\n</li>\n", dependencies: [{ kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataActivatableDirective, selector: "[stActivatable]", inputs: ["disabled", "interactable"], outputs: ["interactableChange", "activated"] }] });
855
+ }
856
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataBreadcrumbItemComponent, decorators: [{
857
+ type: Component,
858
+ args: [{ selector: 'st-breadcrumb-item', imports: [StrataIconComponent, StrataActivatableDirective], host: {
859
+ 'class': 'st-breadcrumb-item',
860
+ }, template: "<li class=\"st-breadcrumb-item-container\">\n <div class=\"st-breadcrumb-item-content\"\n stActivatable\n [interactable]=\"interactable()\"\n [disabled]=\"disabled()\"\n (click)=\"activated.emit($event)\">\n @if (icon()) {\n <st-icon [name]=\"icon()!\" size=\"sm\" class=\"st-breadcrumb-item-icon\"></st-icon>\n }\n <span class=\"st-breadcrumb-item-text\">{{ text() }}</span>\n </div>\n\n @if (separatorIcon()) {\n <st-icon [name]=\"separatorIcon()!\" size=\"sm\" class=\"st-breadcrumb-separator\"></st-icon>\n }\n</li>\n" }]
861
+ }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], interactable: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], activated: [{ type: i0.Output, args: ["activated"] }] } });
862
+
863
+ class StrataBreadcrumbComponent {
864
+ separatorIcon = input('arrow-right', ...(ngDevMode ? [{ debugName: "separatorIcon" }] : []));
865
+ items = contentChildren(StrataBreadcrumbItemComponent, { ...(ngDevMode ? { debugName: "items" } : {}), descendants: true });
866
+ constructor() {
867
+ effect(() => {
868
+ const items = this.items();
869
+ const separator = this.separatorIcon();
870
+ items.forEach((item, index) => {
871
+ const isLast = index === items.length - 1;
872
+ item.separatorIcon.set(isLast ? undefined : separator);
873
+ });
874
+ });
875
+ }
876
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataBreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
877
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataBreadcrumbComponent, isStandalone: true, selector: "st-breadcrumb", inputs: { separatorIcon: { classPropertyName: "separatorIcon", publicName: "separatorIcon", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "st-breadcrumb" }, queries: [{ propertyName: "items", predicate: StrataBreadcrumbItemComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<nav aria-label=\"Breadcrumb\">\n <ol class=\"st-breadcrumb-list\">\n <ng-content></ng-content>\n </ol>\n</nav>\n" });
878
+ }
879
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataBreadcrumbComponent, decorators: [{
880
+ type: Component,
881
+ args: [{ selector: 'st-breadcrumb', imports: [], host: {
882
+ 'class': 'st-breadcrumb',
883
+ }, template: "<nav aria-label=\"Breadcrumb\">\n <ol class=\"st-breadcrumb-list\">\n <ng-content></ng-content>\n </ol>\n</nav>\n" }]
884
+ }], ctorParameters: () => [], propDecorators: { separatorIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "separatorIcon", required: false }] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataBreadcrumbItemComponent), { ...{ descendants: true }, isSignal: true }] }] } });
681
885
 
682
- class AccordionItemComponent {
886
+ class StrataAccordionItemComponent {
683
887
  title = input.required(...(ngDevMode ? [{ debugName: "title" }] : []));
684
888
  open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
685
889
  toggled = output();
686
890
  constructor() {
687
891
  let firstRun = true;
688
892
  effect(() => {
689
- let value = this.open();
893
+ const value = this.open();
690
894
  if (!firstRun) {
691
895
  this.toggled.emit(value);
692
896
  }
@@ -697,10 +901,10 @@ class AccordionItemComponent {
697
901
  get isOpen() {
698
902
  return this.open();
699
903
  }
700
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AccordionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
701
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: AccordionItemComponent, isStandalone: true, selector: "st-accordion-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", toggled: "toggled" }, host: { properties: { "attr.open": "this.isOpen" } }, ngImport: i0, template: "<div class=\"accordion-header\" (click)=\"this.open.set(!this.open())\">\n {{ title() }}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path\n d=\"M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z\"\n ></path>\n </svg>\n</div>\n\n<div class=\"accordion-content\">\n <ng-content></ng-content>\n</div>\n" });
904
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAccordionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
905
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataAccordionItemComponent, isStandalone: true, selector: "st-accordion-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", toggled: "toggled" }, host: { properties: { "attr.open": "this.isOpen" } }, ngImport: i0, template: "<div class=\"accordion-header\" (click)=\"this.open.set(!this.open())\">\n {{ title() }}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path\n d=\"M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z\"\n ></path>\n </svg>\n</div>\n\n<div class=\"accordion-content\">\n <ng-content></ng-content>\n</div>\n" });
702
906
  }
703
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AccordionItemComponent, decorators: [{
907
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAccordionItemComponent, decorators: [{
704
908
  type: Component,
705
909
  args: [{ selector: 'st-accordion-item', imports: [], template: "<div class=\"accordion-header\" (click)=\"this.open.set(!this.open())\">\n {{ title() }}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path\n d=\"M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z\"\n ></path>\n </svg>\n</div>\n\n<div class=\"accordion-content\">\n <ng-content></ng-content>\n</div>\n" }]
706
910
  }], ctorParameters: () => [], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], toggled: [{ type: i0.Output, args: ["toggled"] }], isOpen: [{
@@ -708,15 +912,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
708
912
  args: ['attr.open']
709
913
  }] } });
710
914
 
711
- class AccordionGroupComponent {
712
- items = contentChildren(AccordionItemComponent, ...(ngDevMode ? [{ debugName: "items" }] : []));
915
+ class StrataAccordionGroupComponent {
916
+ items = contentChildren(StrataAccordionItemComponent, ...(ngDevMode ? [{ debugName: "items" }] : []));
713
917
  allowMultipleOpen = input(false, ...(ngDevMode ? [{ debugName: "allowMultipleOpen" }] : []));
714
- ngAfterContentInit() {
715
- this.items().forEach((item) => {
716
- item.toggled.subscribe((open) => {
918
+ constructor() {
919
+ effect((onCleanup) => {
920
+ const subs = this.items().map((item) => item.toggled.subscribe((open) => {
717
921
  if (open && !this.allowMultipleOpen()) {
718
922
  this.closeOtherItems(item);
719
923
  }
924
+ }));
925
+ onCleanup(() => {
926
+ subs.forEach((sub) => sub.unsubscribe());
720
927
  });
721
928
  });
722
929
  }
@@ -727,16 +934,16 @@ class AccordionGroupComponent {
727
934
  }
728
935
  });
729
936
  }
730
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AccordionGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
731
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: AccordionGroupComponent, isStandalone: true, selector: "st-accordion-group", inputs: { allowMultipleOpen: { classPropertyName: "allowMultipleOpen", publicName: "allowMultipleOpen", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "items", predicate: AccordionItemComponent, isSignal: true }], ngImport: i0, template: "<ng-content></ng-content>\n" });
937
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAccordionGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
938
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataAccordionGroupComponent, isStandalone: true, selector: "st-accordion-group", inputs: { allowMultipleOpen: { classPropertyName: "allowMultipleOpen", publicName: "allowMultipleOpen", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "items", predicate: StrataAccordionItemComponent, isSignal: true }], ngImport: i0, template: "<ng-content></ng-content>\n" });
732
939
  }
733
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AccordionGroupComponent, decorators: [{
940
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAccordionGroupComponent, decorators: [{
734
941
  type: Component,
735
942
  args: [{ selector: 'st-accordion-group', imports: [], template: "<ng-content></ng-content>\n" }]
736
- }], propDecorators: { items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => AccordionItemComponent), { isSignal: true }] }], allowMultipleOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowMultipleOpen", required: false }] }] } });
943
+ }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataAccordionItemComponent), { isSignal: true }] }], allowMultipleOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowMultipleOpen", required: false }] }] } });
737
944
 
738
- class AvatarComponent {
739
- iconComponents = contentChildren(IconComponent, { ...(ngDevMode ? { debugName: "iconComponents" } : {}), descendants: true });
945
+ class StrataAvatarComponent {
946
+ iconComponents = contentChildren(StrataIconComponent, { ...(ngDevMode ? { debugName: "iconComponents" } : {}), descendants: true });
740
947
  text = input(null, ...(ngDevMode ? [{ debugName: "text" }] : []));
741
948
  size = model('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
742
949
  get elementClasses() {
@@ -749,19 +956,19 @@ class AvatarComponent {
749
956
  });
750
957
  });
751
958
  }
752
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
753
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: AvatarComponent, isStandalone: true, selector: "st-avatar", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { size: "sizeChange" }, host: { properties: { "class": "this.elementClasses" } }, queries: [{ propertyName: "iconComponents", predicate: IconComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (text() !== null) {\n <span>{{ text() }}</span>\n}\n<ng-content></ng-content>\n" });
959
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
960
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataAvatarComponent, isStandalone: true, selector: "st-avatar", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { size: "sizeChange" }, host: { properties: { "class": "this.elementClasses" } }, queries: [{ propertyName: "iconComponents", predicate: StrataIconComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (text() !== null) {\n <span>{{ text() }}</span>\n}\n<ng-content></ng-content>\n" });
754
961
  }
755
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AvatarComponent, decorators: [{
962
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAvatarComponent, decorators: [{
756
963
  type: Component,
757
964
  args: [{ selector: 'st-avatar', imports: [], template: "@if (text() !== null) {\n <span>{{ text() }}</span>\n}\n<ng-content></ng-content>\n" }]
758
- }], propDecorators: { iconComponents: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => IconComponent), { ...{ descendants: true }, isSignal: true }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }, { type: i0.Output, args: ["sizeChange"] }], elementClasses: [{
965
+ }], propDecorators: { iconComponents: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataIconComponent), { ...{ descendants: true }, isSignal: true }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }, { type: i0.Output, args: ["sizeChange"] }], elementClasses: [{
759
966
  type: HostBinding,
760
967
  args: ['class']
761
968
  }] } });
762
969
 
763
- class AvatarStackComponent {
764
- avatarRefs = contentChildren(AvatarComponent, { ...(ngDevMode ? { debugName: "avatarRefs" } : {}), descendants: true,
970
+ class StrataAvatarStackComponent {
971
+ avatarRefs = contentChildren(StrataAvatarComponent, { ...(ngDevMode ? { debugName: "avatarRefs" } : {}), descendants: true,
765
972
  read: ElementRef });
766
973
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
767
974
  spacing = input('mid', ...(ngDevMode ? [{ debugName: "spacing" }] : []));
@@ -799,13 +1006,13 @@ class AvatarStackComponent {
799
1006
  });
800
1007
  }, 1);
801
1008
  }
802
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AvatarStackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
803
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: AvatarStackComponent, isStandalone: true, selector: "st-avatar-stack", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, firstOnFront: { classPropertyName: "firstOnFront", publicName: "firstOnFront", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.xs": "this.xsClass", "class.sm": "this.smClass", "class.md": "this.mdClass", "class.lg": "this.lgClass", "class.first-on-front": "this.firstOnFrontClass", "class.loose": "this.looseClass", "class.mid": "this.midClass", "class.tight": "this.tightClass" } }, queries: [{ propertyName: "avatarRefs", predicate: AvatarComponent, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<ng-content></ng-content>\n" });
1009
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAvatarStackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1010
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataAvatarStackComponent, isStandalone: true, selector: "st-avatar-stack", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, firstOnFront: { classPropertyName: "firstOnFront", publicName: "firstOnFront", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.xs": "this.xsClass", "class.sm": "this.smClass", "class.md": "this.mdClass", "class.lg": "this.lgClass", "class.first-on-front": "this.firstOnFrontClass", "class.loose": "this.looseClass", "class.mid": "this.midClass", "class.tight": "this.tightClass" } }, queries: [{ propertyName: "avatarRefs", predicate: StrataAvatarComponent, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<ng-content></ng-content>\n" });
804
1011
  }
805
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AvatarStackComponent, decorators: [{
1012
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAvatarStackComponent, decorators: [{
806
1013
  type: Component,
807
1014
  args: [{ selector: 'st-avatar-stack', imports: [], template: "<ng-content></ng-content>\n" }]
808
- }], propDecorators: { avatarRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => AvatarComponent), { ...{
1015
+ }], propDecorators: { avatarRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataAvatarComponent), { ...{
809
1016
  descendants: true,
810
1017
  read: ElementRef,
811
1018
  }, isSignal: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }], firstOnFront: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstOnFront", required: false }] }], xsClass: [{
@@ -834,33 +1041,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
834
1041
  args: ['class.tight']
835
1042
  }] } });
836
1043
 
837
- class ButtonGroupComponent {
1044
+ class StrataButtonGroupComponent {
838
1045
  renderer = inject(Renderer2);
839
1046
  justification = input('start', ...(ngDevMode ? [{ debugName: "justification" }] : []));
840
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ButtonGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
841
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: ButtonGroupComponent, isStandalone: true, selector: "st-button-group", inputs: { justification: { classPropertyName: "justification", publicName: "justification", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-content select=\"[stButton], st-divider\" #buttons></ng-content>\n" });
1047
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataButtonGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1048
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataButtonGroupComponent, isStandalone: true, selector: "st-button-group", inputs: { justification: { classPropertyName: "justification", publicName: "justification", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-content select=\"[stButton], st-divider\" #buttons></ng-content>\n" });
842
1049
  }
843
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ButtonGroupComponent, decorators: [{
1050
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataButtonGroupComponent, decorators: [{
844
1051
  type: Component,
845
1052
  args: [{ selector: 'st-button-group', imports: [], template: "<ng-content select=\"[stButton], st-divider\" #buttons></ng-content>\n" }]
846
1053
  }], propDecorators: { justification: [{ type: i0.Input, args: [{ isSignal: true, alias: "justification", required: false }] }] } });
847
1054
 
848
- class NativeInputRefDirective {
1055
+ class StrataNativeInputRefDirective {
849
1056
  el = inject((ElementRef));
850
- constructor() { }
851
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NativeInputRefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
852
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: NativeInputRefDirective, isStandalone: true, selector: "input[stInput], textarea[stInput]", ngImport: i0 });
1057
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataNativeInputRefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1058
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: StrataNativeInputRefDirective, isStandalone: true, selector: "input[stInput], textarea[stInput]", ngImport: i0 });
853
1059
  }
854
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NativeInputRefDirective, decorators: [{
1060
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataNativeInputRefDirective, decorators: [{
855
1061
  type: Directive,
856
1062
  args: [{
857
1063
  selector: 'input[stInput], textarea[stInput]',
858
1064
  }]
859
- }], ctorParameters: () => [] });
1065
+ }] });
860
1066
 
861
- class InputFieldComponent {
862
- iconComponents = contentChildren(IconComponent, { ...(ngDevMode ? { debugName: "iconComponents" } : {}), descendants: true });
863
- inputField = contentChild(NativeInputRefDirective, { ...(ngDevMode ? { debugName: "inputField" } : {}), descendants: true });
1067
+ class StrataInputFieldComponent {
1068
+ iconComponents = contentChildren(StrataIconComponent, { ...(ngDevMode ? { debugName: "iconComponents" } : {}), descendants: true });
1069
+ inputField = contentChild(StrataNativeInputRefDirective, { ...(ngDevMode ? { debugName: "inputField" } : {}), descendants: true });
864
1070
  pendingFocus = signal(false, ...(ngDevMode ? [{ debugName: "pendingFocus" }] : []));
865
1071
  constructor() {
866
1072
  effect(() => {
@@ -875,7 +1081,6 @@ class InputFieldComponent {
875
1081
  setTimeout(() => this.iconComponents().forEach((icon) => icon.size.set('sm')), 1);
876
1082
  }
877
1083
  focus() {
878
- const input = this.inputField();
879
1084
  this.pendingFocus.set(true);
880
1085
  }
881
1086
  blur() {
@@ -884,17 +1089,70 @@ class InputFieldComponent {
884
1089
  get nativeInput() {
885
1090
  return this.inputField()?.el.nativeElement;
886
1091
  }
887
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: InputFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
888
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: InputFieldComponent, isStandalone: true, selector: "st-input-field", queries: [{ propertyName: "iconComponents", predicate: IconComponent, descendants: true, isSignal: true }, { propertyName: "inputField", first: true, predicate: NativeInputRefDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-content select=\"label\"></ng-content>\n<div class=\"st-input-wrapper\">\n <div class=\"affix\">\n <ng-content select=\"[prefix]\"></ng-content>\n </div>\n <ng-content select=\"input,textarea\"></ng-content>\n <div class=\"affix\">\n <ng-content select=\"[suffix]\"></ng-content>\n </div>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
1092
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataInputFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1093
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataInputFieldComponent, isStandalone: true, selector: "st-input-field", queries: [{ propertyName: "iconComponents", predicate: StrataIconComponent, descendants: true, isSignal: true }, { propertyName: "inputField", first: true, predicate: StrataNativeInputRefDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-content select=\"label\"></ng-content>\n<div class=\"st-input-wrapper\">\n <div class=\"affix\">\n <ng-content select=\"[prefix]\"></ng-content>\n </div>\n <ng-content select=\"input,textarea\"></ng-content>\n <div class=\"affix\">\n <ng-content select=\"[suffix]\"></ng-content>\n </div>\n</div>\n" });
889
1094
  }
890
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: InputFieldComponent, decorators: [{
1095
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataInputFieldComponent, decorators: [{
891
1096
  type: Component,
892
- args: [{ selector: 'st-input-field', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content select=\"label\"></ng-content>\n<div class=\"st-input-wrapper\">\n <div class=\"affix\">\n <ng-content select=\"[prefix]\"></ng-content>\n </div>\n <ng-content select=\"input,textarea\"></ng-content>\n <div class=\"affix\">\n <ng-content select=\"[suffix]\"></ng-content>\n </div>\n</div>\n" }]
893
- }], ctorParameters: () => [], propDecorators: { iconComponents: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => IconComponent), { ...{ descendants: true }, isSignal: true }] }], inputField: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NativeInputRefDirective), { ...{
1097
+ args: [{ selector: 'st-input-field', imports: [], template: "<ng-content select=\"label\"></ng-content>\n<div class=\"st-input-wrapper\">\n <div class=\"affix\">\n <ng-content select=\"[prefix]\"></ng-content>\n </div>\n <ng-content select=\"input,textarea\"></ng-content>\n <div class=\"affix\">\n <ng-content select=\"[suffix]\"></ng-content>\n </div>\n</div>\n" }]
1098
+ }], ctorParameters: () => [], propDecorators: { iconComponents: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataIconComponent), { ...{ descendants: true }, isSignal: true }] }], inputField: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataNativeInputRefDirective), { ...{
894
1099
  descendants: true,
895
1100
  }, isSignal: true }] }] } });
896
1101
 
897
- class DropdownComponent {
1102
+ class StrataSelectItemComponent {
1103
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
1104
+ text = input.required(...(ngDevMode ? [{ debugName: "text" }] : []));
1105
+ itemClicked = output();
1106
+ hidden = signal(false, ...(ngDevMode ? [{ debugName: "hidden" }] : []));
1107
+ elementRef = inject(ElementRef);
1108
+ get display() {
1109
+ return this.hidden() ? 'none' : 'block';
1110
+ }
1111
+ onClick(event) {
1112
+ this.itemClicked.emit(this);
1113
+ event.stopPropagation();
1114
+ }
1115
+ onMouseOver(event) {
1116
+ event.stopPropagation();
1117
+ event.stopImmediatePropagation();
1118
+ event.preventDefault();
1119
+ }
1120
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSelectItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1121
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataSelectItemComponent, isStandalone: true, selector: "st-select-item", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { itemClicked: "itemClicked" }, host: { listeners: { "click": "onClick($event)", "mouseover": "onMouseOver($event)" }, properties: { "style.display": "this.display" }, classAttribute: "single-select-item" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true });
1122
+ }
1123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSelectItemComponent, decorators: [{
1124
+ type: Component,
1125
+ args: [{
1126
+ selector: 'st-select-item',
1127
+ imports: [],
1128
+ template: '<ng-content></ng-content>',
1129
+ host: {
1130
+ class: 'single-select-item',
1131
+ },
1132
+ }]
1133
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], itemClicked: [{ type: i0.Output, args: ["itemClicked"] }], display: [{
1134
+ type: HostBinding,
1135
+ args: ['style.display']
1136
+ }], onClick: [{
1137
+ type: HostListener,
1138
+ args: ['click', ['$event']]
1139
+ }], onMouseOver: [{
1140
+ type: HostListener,
1141
+ args: ['mouseover', ['$event']]
1142
+ }] } });
1143
+
1144
+ class StrataSelectTriggerDirective {
1145
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSelectTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1146
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: StrataSelectTriggerDirective, isStandalone: true, selector: "[stSelectTrigger]", ngImport: i0 });
1147
+ }
1148
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSelectTriggerDirective, decorators: [{
1149
+ type: Directive,
1150
+ args: [{
1151
+ selector: '[stSelectTrigger]',
1152
+ }]
1153
+ }] });
1154
+
1155
+ class StrataSingleSelectComponent {
898
1156
  open = signal(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
899
1157
  placeholder = input('Select', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
900
1158
  placement = input('bottom-start', ...(ngDevMode ? [{ debugName: "placement" }] : []));
@@ -902,23 +1160,45 @@ class DropdownComponent {
902
1160
  label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
903
1161
  name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
904
1162
  selected = model(...(ngDevMode ? [undefined, { debugName: "selected" }] : []));
905
- size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
1163
+ selectedItem = computed(() => {
1164
+ const val = this.selected();
1165
+ if (val === undefined)
1166
+ return undefined;
1167
+ return this.selectItems().find(item => item.value() === val);
1168
+ }, ...(ngDevMode ? [{ debugName: "selectedItem" }] : []));
906
1169
  searchable = input(false, ...(ngDevMode ? [{ debugName: "searchable" }] : []));
907
1170
  searchQuery = model(...(ngDevMode ? [undefined, { debugName: "searchQuery" }] : []));
908
1171
  searchPlaceholder = input('Search', ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : []));
909
- dropdownItems = input.required(...(ngDevMode ? [{ debugName: "dropdownItems" }] : []));
910
- shownItems = computed(() => {
911
- if (!this.searchQuery()) {
912
- return this.dropdownItems();
1172
+ itemSelected = output();
1173
+ selectItems = contentChildren(StrataSelectItemComponent, ...(ngDevMode ? [{ debugName: "selectItems" }] : []));
1174
+ triggerTemplate = contentChild(StrataSelectTriggerDirective, { ...(ngDevMode ? { debugName: "triggerTemplate" } : {}), read: TemplateRef });
1175
+ inputField = viewChild(StrataInputFieldComponent, ...(ngDevMode ? [{ debugName: "inputField" }] : []));
1176
+ destroyRef = inject(DestroyRef);
1177
+ constructor() {
1178
+ effect((onCleanup) => {
1179
+ const items = this.selectItems();
1180
+ const subs = items.map((item) => item.itemClicked.subscribe((clickedItem) => {
1181
+ this.onItemClick(clickedItem);
1182
+ }));
1183
+ onCleanup(() => {
1184
+ subs.forEach((sub) => sub.unsubscribe());
1185
+ });
1186
+ });
1187
+ }
1188
+ onSearchChange(query) {
1189
+ const q = query?.toLowerCase().trim() || '';
1190
+ const items = this.selectItems();
1191
+ for (const item of items) {
1192
+ if (!q) {
1193
+ item.hidden.set(false);
1194
+ }
1195
+ else {
1196
+ const match = item.text().toLowerCase().includes(q);
1197
+ item.hidden.set(!match);
1198
+ }
913
1199
  }
914
- return this.dropdownItems().filter((item) => item.text.toLowerCase().includes(this.searchQuery().toLowerCase().trim()));
915
- }, ...(ngDevMode ? [{ debugName: "shownItems" }] : []));
916
- onSelect = output();
917
- inputField = viewChild(InputFieldComponent, ...(ngDevMode ? [{ debugName: "inputField" }] : []));
918
- get classList() {
919
- return [this.size()];
920
1200
  }
921
- toggleDropdown(event) {
1201
+ toggle(event) {
922
1202
  if (event) {
923
1203
  event.preventDefault();
924
1204
  event.stopPropagation();
@@ -930,16 +1210,10 @@ class DropdownComponent {
930
1210
  this.show();
931
1211
  }
932
1212
  }
933
- onItemClick(item, mouseEvent) {
934
- this.toggleDropdown();
935
- mouseEvent.stopPropagation();
936
- this.selected.set(item);
937
- this.onSelect.emit(item);
938
- }
939
- onItemHover(mouseEvent) {
940
- mouseEvent.stopPropagation();
941
- mouseEvent.stopImmediatePropagation();
942
- mouseEvent.preventDefault();
1213
+ onItemClick(item) {
1214
+ this.hide();
1215
+ this.selected.set(item.value());
1216
+ this.itemSelected.emit(item.value());
943
1217
  }
944
1218
  show() {
945
1219
  this.open.set(true);
@@ -950,45 +1224,43 @@ class DropdownComponent {
950
1224
  hide() {
951
1225
  this.open.set(false);
952
1226
  }
953
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
954
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DropdownComponent, isStandalone: true, selector: "st-dropdown", 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 }, size: { classPropertyName: "size", publicName: "size", 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 }, dropdownItems: { classPropertyName: "dropdownItems", publicName: "dropdownItems", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selected: "selectedChange", searchQuery: "searchQueryChange", onSelect: "onSelect" }, host: { properties: { "class": "this.classList" } }, viewQueries: [{ propertyName: "inputField", first: true, predicate: InputFieldComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n <label [for]=\"name()\"> {{ label() }}</label>\n}\n<div\n class=\"dropdown-input\"\n [id]=\"name()\"\n #dropdownInput\n (click)=\"toggleDropdown($event)\"\n [attr.data-open]=\"open()\"\n tabindex=\"0\"\n [stOverlay]=\"selector\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\">\n @if (selected()) {\n {{ selected()!.text }}\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=\"dropdown-selector\" #dropdownSelector [class.full-width]=\"fullWidth()\">\n @if (searchable()) {\n <st-input-field>\n <input stInput #searchField type=\"text\" [(ngModel)]=\"searchQuery\" [placeholder]=\"searchPlaceholder()\" />\n <button\n stButton\n variant=\"ghost\"\n [class.visible]=\"searchQuery() !== undefined && searchQuery()!.length > 0\"\n suffix\n size=\"sm\"\n (click)=\"searchQuery.set(undefined)\">\n x\n </button>\n </st-input-field>\n }\n @for (item of shownItems(); track item.id) {\n <div class=\"dropdown-item\" (click)=\"onItemClick(item, $event)\" (mouseover)=\"onItemHover($event)\">\n {{ item.text }}\n </div>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: IconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: OverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset"], outputs: ["overlayOpenChange"] }, { kind: "component", type: InputFieldComponent, selector: "st-input-field" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[stInput], textarea[stInput]" }, { kind: "directive", type: ButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
1227
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSingleSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1228
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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"] }] });
955
1229
  }
956
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DropdownComponent, decorators: [{
1230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSingleSelectComponent, decorators: [{
957
1231
  type: Component,
958
- args: [{ selector: 'st-dropdown', imports: [
959
- IconComponent,
960
- OverlayDirective,
961
- InputFieldComponent,
1232
+ args: [{ selector: 'st-single-select', imports: [
1233
+ CommonModule,
1234
+ StrataIconComponent,
1235
+ StrataOverlayDirective,
1236
+ StrataInputFieldComponent,
962
1237
  FormsModule,
963
- NativeInputRefDirective,
964
- ButtonDirective,
965
- ], template: "@if (label()) {\n <label [for]=\"name()\"> {{ label() }}</label>\n}\n<div\n class=\"dropdown-input\"\n [id]=\"name()\"\n #dropdownInput\n (click)=\"toggleDropdown($event)\"\n [attr.data-open]=\"open()\"\n tabindex=\"0\"\n [stOverlay]=\"selector\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\">\n @if (selected()) {\n {{ selected()!.text }}\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=\"dropdown-selector\" #dropdownSelector [class.full-width]=\"fullWidth()\">\n @if (searchable()) {\n <st-input-field>\n <input stInput #searchField type=\"text\" [(ngModel)]=\"searchQuery\" [placeholder]=\"searchPlaceholder()\" />\n <button\n stButton\n variant=\"ghost\"\n [class.visible]=\"searchQuery() !== undefined && searchQuery()!.length > 0\"\n suffix\n size=\"sm\"\n (click)=\"searchQuery.set(undefined)\">\n x\n </button>\n </st-input-field>\n }\n @for (item of shownItems(); track item.id) {\n <div class=\"dropdown-item\" (click)=\"onItemClick(item, $event)\" (mouseover)=\"onItemHover($event)\">\n {{ item.text }}\n </div>\n }\n </div>\n</ng-template>\n" }]
966
- }], 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"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], 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 }] }], dropdownItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownItems", required: true }] }], onSelect: [{ type: i0.Output, args: ["onSelect"] }], inputField: [{ type: i0.ViewChild, args: [i0.forwardRef(() => InputFieldComponent), { isSignal: true }] }], classList: [{
967
- type: HostBinding,
968
- args: ['class']
969
- }] } });
1238
+ StrataNativeInputRefDirective,
1239
+ StrataButtonDirective,
1240
+ ], 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>" }]
1241
+ }], 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 }] }] } });
970
1242
 
971
- class DividerComponent {
1243
+ class StrataDividerComponent {
972
1244
  label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
973
1245
  margin = input(true, ...(ngDevMode ? [{ debugName: "margin" }] : []));
974
1246
  vertical = input(false, ...(ngDevMode ? [{ debugName: "vertical" }] : []));
975
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
976
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DividerComponent, isStandalone: true, selector: "st-divider", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (!label() || vertical()) {\n <div class=\"divider-line\" [class.divider-margin]=\"margin()\" [class.vertical]=\"vertical()\"></div>\n} @else {\n <div class=\"divider-line-with-text\" [class.divider-margin]=\"margin()\">\n <div class=\"divider-line\"></div>\n <span>{{ label() }}</span>\n <div class=\"divider-line\"></div>\n </div>\n}\n" });
1247
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataDividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1248
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataDividerComponent, isStandalone: true, selector: "st-divider", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (!label() || vertical()) {\n <div class=\"divider-line\" [class.divider-margin]=\"margin()\" [class.vertical]=\"vertical()\"></div>\n} @else {\n <div class=\"divider-line-with-text\" [class.divider-margin]=\"margin()\">\n <div class=\"divider-line\"></div>\n <span>{{ label() }}</span>\n <div class=\"divider-line\"></div>\n </div>\n}\n" });
977
1249
  }
978
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DividerComponent, decorators: [{
1250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataDividerComponent, decorators: [{
979
1251
  type: Component,
980
1252
  args: [{ selector: 'st-divider', imports: [], template: "@if (!label() || vertical()) {\n <div class=\"divider-line\" [class.divider-margin]=\"margin()\" [class.vertical]=\"vertical()\"></div>\n} @else {\n <div class=\"divider-line-with-text\" [class.divider-margin]=\"margin()\">\n <div class=\"divider-line\"></div>\n <span>{{ label() }}</span>\n <div class=\"divider-line\"></div>\n </div>\n}\n" }]
981
1253
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], margin: [{ type: i0.Input, args: [{ isSignal: true, alias: "margin", required: false }] }], vertical: [{ type: i0.Input, args: [{ isSignal: true, alias: "vertical", required: false }] }] } });
982
1254
 
983
- class TagComponent {
1255
+ class StrataTagComponent {
984
1256
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
985
1257
  get class() {
986
1258
  return this.size();
987
1259
  }
988
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
989
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: TagComponent, isStandalone: true, selector: "st-tag", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.class" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true });
1260
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1261
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataTagComponent, isStandalone: true, selector: "st-tag", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.class" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true });
990
1262
  }
991
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TagComponent, decorators: [{
1263
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTagComponent, decorators: [{
992
1264
  type: Component,
993
1265
  args: [{
994
1266
  selector: 'st-tag',
@@ -1000,47 +1272,156 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1000
1272
  args: ['class']
1001
1273
  }] } });
1002
1274
 
1003
- class ItemComponent {
1004
- interactable = input(false, ...(ngDevMode ? [{ debugName: "interactable" }] : []));
1275
+ class StrataKbdComponent {
1276
+ config = inject(STRATA_CONFIG);
1277
+ /**
1278
+ * The sequence of keys to display.
1279
+ * Can be an array like `['⌘', 'K']` or a string combo like `'meta+k'`.
1280
+ */
1281
+ keys = input([], ...(ngDevMode ? [{ debugName: "keys" }] : []));
1282
+ resolvedKeys = computed(() => {
1283
+ const rawKeys = this.keys();
1284
+ const labels = this.config.shortcutLabels;
1285
+ const parseKey = (part) => {
1286
+ const p = part.trim().toLowerCase();
1287
+ if (p === 'meta')
1288
+ return labels?.meta || '⌘';
1289
+ if (p === 'ctrl')
1290
+ return labels?.ctrl || 'Ctrl';
1291
+ if (p === 'shift')
1292
+ return labels?.shift || 'Shift';
1293
+ if (p === 'alt')
1294
+ return labels?.alt || 'Alt';
1295
+ return p.length === 1 ? p.toUpperCase() : part.trim();
1296
+ };
1297
+ if (typeof rawKeys === 'string') {
1298
+ return rawKeys.split('+').map(parseKey);
1299
+ }
1300
+ return Array.isArray(rawKeys) ? rawKeys.map(parseKey) : [];
1301
+ }, ...(ngDevMode ? [{ debugName: "resolvedKeys" }] : []));
1302
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataKbdComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1303
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataKbdComponent, isStandalone: true, selector: "st-kbd", inputs: { keys: { classPropertyName: "keys", publicName: "keys", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@for (key of resolvedKeys(); track key) {\n<kbd class=\"st-kbd-key st-mono-s\">{{ key }}</kbd>\n}", styles: [":host{--st-kbd-bg: transparent;--st-kbd-border: var(--st-color-text-secondary);--st-kbd-text: var(--st-color-text-secondary);display:inline-flex;align-items:center;gap:4px}:host .st-kbd-key{font-style:normal;line-height:1;padding:3px 6px;border-radius:var(--st-border-radius-sm);background:var(--st-kbd-bg);border:1px solid var(--st-kbd-border);color:var(--st-kbd-text);white-space:nowrap;-webkit-user-select:none;user-select:none}\n"] });
1304
+ }
1305
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataKbdComponent, decorators: [{
1306
+ type: Component,
1307
+ args: [{ selector: 'st-kbd', imports: [], template: "@for (key of resolvedKeys(); track key) {\n<kbd class=\"st-kbd-key st-mono-s\">{{ key }}</kbd>\n}", styles: [":host{--st-kbd-bg: transparent;--st-kbd-border: var(--st-color-text-secondary);--st-kbd-text: var(--st-color-text-secondary);display:inline-flex;align-items:center;gap:4px}:host .st-kbd-key{font-style:normal;line-height:1;padding:3px 6px;border-radius:var(--st-border-radius-sm);background:var(--st-kbd-bg);border:1px solid var(--st-kbd-border);color:var(--st-kbd-text);white-space:nowrap;-webkit-user-select:none;user-select:none}\n"] }]
1308
+ }], propDecorators: { keys: [{ type: i0.Input, args: [{ isSignal: true, alias: "keys", required: false }] }] } });
1309
+
1310
+ class StrataRadioComponent {
1311
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
1312
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : []));
1313
+ checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
1314
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
1315
+ select = output();
1316
+ get isChecked() {
1317
+ return this.checked();
1318
+ }
1319
+ get isDisabled() {
1320
+ return this.disabled();
1321
+ }
1322
+ onClick(event) {
1323
+ if (this.disabled()) {
1324
+ return;
1325
+ }
1326
+ event.stopImmediatePropagation();
1327
+ this.select.emit();
1328
+ this.checked.set(true);
1329
+ }
1330
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1331
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataRadioComponent, isStandalone: true, selector: "st-radio", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange", select: "select" }, host: { listeners: { "click": "onClick($event)" }, properties: { "attr.data-checked": "this.isChecked", "attr.data-disabled": "this.isDisabled" } }, ngImport: i0, template: "<input type=\"radio\" [checked]=\"checked()\" [disabled]=\"disabled()\" />\n<div class=\"radio-visual\"></div>\n@if (label()) {\n <label>{{ label() }}</label>\n}\n" });
1332
+ }
1333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataRadioComponent, decorators: [{
1334
+ type: Component,
1335
+ args: [{ selector: 'st-radio', imports: [], template: "<input type=\"radio\" [checked]=\"checked()\" [disabled]=\"disabled()\" />\n<div class=\"radio-visual\"></div>\n@if (label()) {\n <label>{{ label() }}</label>\n}\n" }]
1336
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], select: [{ type: i0.Output, args: ["select"] }], isChecked: [{
1337
+ type: HostBinding,
1338
+ args: ['attr.data-checked']
1339
+ }], isDisabled: [{
1340
+ type: HostBinding,
1341
+ args: ['attr.data-disabled']
1342
+ }], onClick: [{
1343
+ type: HostListener,
1344
+ args: ['click', ['$event']]
1345
+ }] } });
1346
+
1347
+ class StrataItemComponent {
1348
+ element = inject(ElementRef);
1349
+ _activatable = inject(StrataActivatableDirective);
1350
+ checkbox = contentChild(StrataCheckboxComponent, { ...(ngDevMode ? { debugName: "checkbox" } : {}), read: ElementRef });
1351
+ toggle = contentChild(StrataToggleComponent, { ...(ngDevMode ? { debugName: "toggle" } : {}), read: ElementRef });
1352
+ radio = contentChild(StrataRadioComponent, { ...(ngDevMode ? { debugName: "radio" } : {}), read: ElementRef });
1353
+ interactable = this._activatable.interactable;
1354
+ disabled = this._activatable.disabled;
1355
+ constructor() {
1356
+ this.interactable.set(false);
1357
+ }
1005
1358
  get isInteractable() {
1006
- return this.interactable();
1359
+ return this._activatable.isFocusable();
1007
1360
  }
1008
- get tabIndex() {
1009
- return this.interactable() ? 0 : null;
1361
+ get isDisabledClass() {
1362
+ return this.disabled();
1363
+ }
1364
+ onHostClick(event) {
1365
+ if (this.disabled() || !this.interactable()) {
1366
+ return;
1367
+ }
1368
+ // Only trigger if we didn't click an interactive element within the item
1369
+ const target = event.target;
1370
+ const isControl = target.closest('st-checkbox, st-toggle, st-radio');
1371
+ if (!isControl) {
1372
+ this.onActivated();
1373
+ }
1374
+ }
1375
+ onActivated() {
1376
+ if (this.disabled())
1377
+ return;
1378
+ // Trigger children if they exist
1379
+ this.checkbox()?.nativeElement.click();
1380
+ this.toggle()?.nativeElement.click();
1381
+ this.radio()?.nativeElement.click();
1010
1382
  }
1011
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1012
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: ItemComponent, isStandalone: true, selector: "st-item", inputs: { interactable: { classPropertyName: "interactable", publicName: "interactable", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.interactable": "this.isInteractable", "attr.tabindex": "this.tabIndex" } }, ngImport: i0, template: "<span class=\"item-start\">\n <ng-content select=\"[area='start']\"></ng-content\n></span>\n<span class=\"item-default\"> <ng-content></ng-content></span>\n<span class=\"item-end\">\n <ng-content select=\"[area='end']\"></ng-content>\n</span>\n", styles: [""] });
1383
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1384
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataItemComponent, isStandalone: true, selector: "st-item", host: { listeners: { "click": "onHostClick($event)" }, properties: { "class.interactable": "this.isInteractable", "class.disabled": "this.isDisabledClass" } }, queries: [{ propertyName: "checkbox", first: true, predicate: StrataCheckboxComponent, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "toggle", first: true, predicate: StrataToggleComponent, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "radio", first: true, predicate: StrataRadioComponent, descendants: true, read: ElementRef, isSignal: true }], hostDirectives: [{ directive: StrataActivatableDirective, inputs: ["disabled", "disabled", "interactable", "interactable"], outputs: ["activated", "activated"] }], ngImport: i0, template: "<span class=\"item-start\">\n <ng-content select=\"[area='start']\"></ng-content\n></span>\n<span class=\"item-default\"> <ng-content></ng-content></span>\n<span class=\"item-end\">\n <ng-content select=\"[area='end']\"></ng-content>\n</span>\n", styles: [""] });
1013
1385
  }
1014
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ItemComponent, decorators: [{
1386
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataItemComponent, decorators: [{
1015
1387
  type: Component,
1016
- args: [{ selector: 'st-item', imports: [], template: "<span class=\"item-start\">\n <ng-content select=\"[area='start']\"></ng-content\n></span>\n<span class=\"item-default\"> <ng-content></ng-content></span>\n<span class=\"item-end\">\n <ng-content select=\"[area='end']\"></ng-content>\n</span>\n" }]
1017
- }], propDecorators: { interactable: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactable", required: false }] }], isInteractable: [{
1388
+ args: [{ selector: 'st-item', imports: [], hostDirectives: [
1389
+ {
1390
+ directive: StrataActivatableDirective,
1391
+ inputs: ['disabled', 'interactable'],
1392
+ outputs: ['activated'],
1393
+ },
1394
+ ], template: "<span class=\"item-start\">\n <ng-content select=\"[area='start']\"></ng-content\n></span>\n<span class=\"item-default\"> <ng-content></ng-content></span>\n<span class=\"item-end\">\n <ng-content select=\"[area='end']\"></ng-content>\n</span>\n" }]
1395
+ }], ctorParameters: () => [], propDecorators: { checkbox: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataCheckboxComponent), { ...{ read: ElementRef }, isSignal: true }] }], toggle: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataToggleComponent), { ...{ read: ElementRef }, isSignal: true }] }], radio: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataRadioComponent), { ...{ read: ElementRef }, isSignal: true }] }], isInteractable: [{
1018
1396
  type: HostBinding,
1019
1397
  args: ['class.interactable']
1020
- }], tabIndex: [{
1398
+ }], isDisabledClass: [{
1021
1399
  type: HostBinding,
1022
- args: ['attr.tabindex']
1400
+ args: ['class.disabled']
1401
+ }], onHostClick: [{
1402
+ type: HostListener,
1403
+ args: ['click', ['$event']]
1023
1404
  }] } });
1024
1405
 
1025
- class ItemListComponent {
1406
+ class StrataItemListComponent {
1026
1407
  items = input.required(...(ngDevMode ? [{ debugName: "items" }] : []));
1027
1408
  dividers = input(true, ...(ngDevMode ? [{ debugName: "dividers" }] : []));
1028
1409
  template = input(...(ngDevMode ? [undefined, { debugName: "template" }] : []));
1029
1410
  get hostClasses() {
1030
1411
  return [this.dividers() ? 'with-dividers' : ''];
1031
1412
  }
1032
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ItemListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1033
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ItemListComponent, isStandalone: true, selector: "st-item-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, dividers: { classPropertyName: "dividers", publicName: "dividers", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClasses" } }, ngImport: i0, template: "@for (item of items(); track item; let last = $last) {\n <ng-template #defaultItemTemplate>\n <st-item>{{ item }}</st-item>\n </ng-template>\n <ng-container\n [ngTemplateOutlet]=\"template() || defaultItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n}\n", dependencies: [{ kind: "component", type: ItemComponent, selector: "st-item", inputs: ["interactable"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: CommonModule }] });
1413
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataItemListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1414
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataItemListComponent, isStandalone: true, selector: "st-item-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, dividers: { classPropertyName: "dividers", publicName: "dividers", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClasses" } }, ngImport: i0, template: "@for (item of items(); track item; let last = $last) {\n <ng-template #defaultItemTemplate>\n <st-item>{{ item }}</st-item>\n </ng-template>\n <ng-container\n [ngTemplateOutlet]=\"template() || defaultItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n}\n", dependencies: [{ kind: "component", type: StrataItemComponent, selector: "st-item" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: CommonModule }] });
1034
1415
  }
1035
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ItemListComponent, decorators: [{
1416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataItemListComponent, decorators: [{
1036
1417
  type: Component,
1037
- args: [{ selector: 'st-item-list', imports: [ItemComponent, NgTemplateOutlet, CommonModule], template: "@for (item of items(); track item; let last = $last) {\n <ng-template #defaultItemTemplate>\n <st-item>{{ item }}</st-item>\n </ng-template>\n <ng-container\n [ngTemplateOutlet]=\"template() || defaultItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n}\n" }]
1418
+ args: [{ selector: 'st-item-list', imports: [StrataItemComponent, NgTemplateOutlet, CommonModule], template: "@for (item of items(); track item; let last = $last) {\n <ng-template #defaultItemTemplate>\n <st-item>{{ item }}</st-item>\n </ng-template>\n <ng-container\n [ngTemplateOutlet]=\"template() || defaultItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n}\n" }]
1038
1419
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], dividers: [{ type: i0.Input, args: [{ isSignal: true, alias: "dividers", required: false }] }], template: [{ type: i0.Input, args: [{ isSignal: true, alias: "template", required: false }] }], hostClasses: [{
1039
1420
  type: HostBinding,
1040
1421
  args: ['class']
1041
1422
  }] } });
1042
1423
 
1043
- class AutoResizeDirective {
1424
+ class StrataAutoResizeDirective {
1044
1425
  minimumRows = input(1, ...(ngDevMode ? [{ debugName: "minimumRows" }] : []));
1045
1426
  maximumRows = input(...(ngDevMode ? [undefined, { debugName: "maximumRows" }] : []));
1046
1427
  lineHeight = 0;
@@ -1051,7 +1432,6 @@ class AutoResizeDirective {
1051
1432
  onWindowResize() {
1052
1433
  this.resize();
1053
1434
  }
1054
- constructor() { }
1055
1435
  ngAfterViewInit() {
1056
1436
  this.calculateLineHeight();
1057
1437
  this.resize();
@@ -1083,15 +1463,15 @@ class AutoResizeDirective {
1083
1463
  textarea.style.height = `${newHeight}px`;
1084
1464
  textarea.style.overflowY = scrollHeight > maxHeight ? 'auto' : 'hidden';
1085
1465
  }
1086
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AutoResizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1087
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: AutoResizeDirective, isStandalone: true, selector: "[stAutoResize]", inputs: { minimumRows: { classPropertyName: "minimumRows", publicName: "minimumRows", isSignal: true, isRequired: false, transformFunction: null }, maximumRows: { classPropertyName: "maximumRows", publicName: "maximumRows", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput()", "window:resize": "onWindowResize()" } }, usesOnChanges: true, ngImport: i0 });
1466
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAutoResizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1467
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: StrataAutoResizeDirective, isStandalone: true, selector: "[stAutoResize]", inputs: { minimumRows: { classPropertyName: "minimumRows", publicName: "minimumRows", isSignal: true, isRequired: false, transformFunction: null }, maximumRows: { classPropertyName: "maximumRows", publicName: "maximumRows", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput()", "window:resize": "onWindowResize()" } }, usesOnChanges: true, ngImport: i0 });
1088
1468
  }
1089
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AutoResizeDirective, decorators: [{
1469
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAutoResizeDirective, decorators: [{
1090
1470
  type: Directive,
1091
1471
  args: [{
1092
1472
  selector: '[stAutoResize]',
1093
1473
  }]
1094
- }], ctorParameters: () => [], propDecorators: { minimumRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "minimumRows", required: false }] }], maximumRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "maximumRows", required: false }] }], onInput: [{
1474
+ }], propDecorators: { minimumRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "minimumRows", required: false }] }], maximumRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "maximumRows", required: false }] }], onInput: [{
1095
1475
  type: HostListener,
1096
1476
  args: ['input']
1097
1477
  }], onWindowResize: [{
@@ -1099,15 +1479,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1099
1479
  args: ['window:resize']
1100
1480
  }] } });
1101
1481
 
1102
- class PaginationComponent {
1482
+ class StrataPaginationComponent {
1103
1483
  currentPage = model(1, ...(ngDevMode ? [{ debugName: "currentPage" }] : []));
1104
1484
  totalPages = input.required(...(ngDevMode ? [{ debugName: "totalPages" }] : []));
1105
- onPageSelect = output();
1485
+ pageSelected = output();
1106
1486
  pageButtons = computed(() => this.calculatePageButtons(this.currentPage(), this.totalPages()), ...(ngDevMode ? [{ debugName: "pageButtons" }] : []));
1107
1487
  hideNextPreviousAtStartEnd = input(false, ...(ngDevMode ? [{ debugName: "hideNextPreviousAtStartEnd" }] : []));
1108
1488
  changePage(newPage) {
1109
1489
  this.currentPage.set(newPage);
1110
- this.onPageSelect.emit(this.currentPage());
1490
+ this.pageSelected.emit(this.currentPage());
1111
1491
  }
1112
1492
  calculatePageButtons(currentPage, totalPages) {
1113
1493
  const buttons = [];
@@ -1168,19 +1548,19 @@ class PaginationComponent {
1168
1548
  clickable: true,
1169
1549
  };
1170
1550
  }
1171
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1172
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: PaginationComponent, isStandalone: true, selector: "st-pagination", inputs: { currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: false, transformFunction: null }, totalPages: { classPropertyName: "totalPages", publicName: "totalPages", isSignal: true, isRequired: true, transformFunction: null }, hideNextPreviousAtStartEnd: { classPropertyName: "hideNextPreviousAtStartEnd", publicName: "hideNextPreviousAtStartEnd", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { currentPage: "currentPageChange", onPageSelect: "onPageSelect" }, ngImport: i0, template: "<button\n [disabled]=\"currentPage() === 1\"\n [class.clickable]=\"true\"\n [class.hideOnDisabled]=\"hideNextPreviousAtStartEnd()\"\n (click)=\"changePage(currentPage() - 1)\"\n>\n Previous\n</button>\n@for (page of pageButtons(); track page) {\n <button\n [class.selected]=\"page.page === currentPage()\"\n [class.clickable]=\"page.clickable\"\n (click)=\"page.page ? changePage(page.page) : null\"\n >\n {{ page.text }}\n </button>\n}\n<button\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"changePage(currentPage() + 1)\"\n [class.clickable]=\"true\"\n [class.hideOnDisabled]=\"hideNextPreviousAtStartEnd()\"\n>\n Next\n</button>\n" });
1551
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1552
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataPaginationComponent, isStandalone: true, selector: "st-pagination", inputs: { currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: false, transformFunction: null }, totalPages: { classPropertyName: "totalPages", publicName: "totalPages", isSignal: true, isRequired: true, transformFunction: null }, hideNextPreviousAtStartEnd: { classPropertyName: "hideNextPreviousAtStartEnd", publicName: "hideNextPreviousAtStartEnd", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { currentPage: "currentPageChange", pageSelected: "pageSelected" }, ngImport: i0, template: "<button\n [disabled]=\"currentPage() === 1\"\n [class.clickable]=\"true\"\n [class.hideOnDisabled]=\"hideNextPreviousAtStartEnd()\"\n (click)=\"changePage(currentPage() - 1)\"\n>\n Previous\n</button>\n@for (page of pageButtons(); track page) {\n <button\n [class.selected]=\"page.page === currentPage()\"\n [class.clickable]=\"page.clickable\"\n (click)=\"page.page ? changePage(page.page) : null\"\n >\n {{ page.text }}\n </button>\n}\n<button\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"changePage(currentPage() + 1)\"\n [class.clickable]=\"true\"\n [class.hideOnDisabled]=\"hideNextPreviousAtStartEnd()\"\n>\n Next\n</button>\n" });
1173
1553
  }
1174
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PaginationComponent, decorators: [{
1554
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataPaginationComponent, decorators: [{
1175
1555
  type: Component,
1176
1556
  args: [{ selector: 'st-pagination', imports: [], template: "<button\n [disabled]=\"currentPage() === 1\"\n [class.clickable]=\"true\"\n [class.hideOnDisabled]=\"hideNextPreviousAtStartEnd()\"\n (click)=\"changePage(currentPage() - 1)\"\n>\n Previous\n</button>\n@for (page of pageButtons(); track page) {\n <button\n [class.selected]=\"page.page === currentPage()\"\n [class.clickable]=\"page.clickable\"\n (click)=\"page.page ? changePage(page.page) : null\"\n >\n {{ page.text }}\n </button>\n}\n<button\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"changePage(currentPage() + 1)\"\n [class.clickable]=\"true\"\n [class.hideOnDisabled]=\"hideNextPreviousAtStartEnd()\"\n>\n Next\n</button>\n" }]
1177
- }], propDecorators: { currentPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentPage", required: false }] }, { type: i0.Output, args: ["currentPageChange"] }], totalPages: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalPages", required: true }] }], onPageSelect: [{ type: i0.Output, args: ["onPageSelect"] }], hideNextPreviousAtStartEnd: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideNextPreviousAtStartEnd", required: false }] }] } });
1557
+ }], propDecorators: { currentPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentPage", required: false }] }, { type: i0.Output, args: ["currentPageChange"] }], totalPages: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalPages", required: true }] }], pageSelected: [{ type: i0.Output, args: ["pageSelected"] }], hideNextPreviousAtStartEnd: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideNextPreviousAtStartEnd", required: false }] }] } });
1178
1558
 
1179
1559
  class CapitalizePipe {
1180
1560
  static capitalize(value) {
1181
1561
  return value.substring(0, 1).toLocaleUpperCase() + value.substring(1);
1182
1562
  }
1183
- transform(value, ...args) {
1563
+ transform(value, ..._args) {
1184
1564
  return CapitalizePipe.capitalize(value);
1185
1565
  }
1186
1566
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CapitalizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
@@ -1195,16 +1575,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1195
1575
  }]
1196
1576
  }] });
1197
1577
 
1198
- class ProgressComponent {
1578
+ class StrataProgressLinearComponent {
1199
1579
  min = input(0, ...(ngDevMode ? [{ debugName: "min" }] : []));
1200
1580
  max = input(100, ...(ngDevMode ? [{ debugName: "max" }] : []));
1201
1581
  value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
1202
- type = input('linear', ...(ngDevMode ? [{ debugName: "type" }] : []));
1203
1582
  showLabel = input(true, ...(ngDevMode ? [{ debugName: "showLabel" }] : []));
1204
1583
  labelFormat = input('percentage', ...(ngDevMode ? [{ debugName: "labelFormat" }] : []));
1205
1584
  growDirection = input('right', ...(ngDevMode ? [{ debugName: "growDirection" }] : []));
1206
- size = input(120, ...(ngDevMode ? [{ debugName: "size" }] : []));
1207
- strokeWidth = input(10, ...(ngDevMode ? [{ debugName: "strokeWidth" }] : []));
1208
1585
  percentage = computed(() => {
1209
1586
  if (this.max() <= this.min()) {
1210
1587
  return 0;
@@ -1214,22 +1591,19 @@ class ProgressComponent {
1214
1591
  const progressableValues = this.max() - this.min();
1215
1592
  return (progressedValue / progressableValues) * 100;
1216
1593
  }, ...(ngDevMode ? [{ debugName: "percentage" }] : []));
1217
- radius = computed(() => (this.size() - this.strokeWidth()) / 2, ...(ngDevMode ? [{ debugName: "radius" }] : []));
1218
- circumference = computed(() => 2 * Math.PI * this.radius(), ...(ngDevMode ? [{ debugName: "circumference" }] : []));
1219
- dashOffset = computed(() => this.circumference() * (1 - this.percentage() / 100), ...(ngDevMode ? [{ debugName: "dashOffset" }] : []));
1220
1594
  get cssClasses() {
1221
- return [this.type(), `grow-${this.growDirection()}`];
1595
+ return [`grow-${this.growDirection()}`];
1222
1596
  }
1223
1597
  get percentageProperty() {
1224
1598
  return this.percentage();
1225
1599
  }
1226
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1227
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ProgressComponent, isStandalone: true, selector: "st-progress", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, labelFormat: { classPropertyName: "labelFormat", publicName: "labelFormat", isSignal: true, isRequired: false, transformFunction: null }, growDirection: { classPropertyName: "growDirection", publicName: "growDirection", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.cssClasses", "style.--st-progress-percentage": "this.percentageProperty" } }, ngImport: i0, template: "@switch (type()) {\n @case (\"linear\") {\n <div class=\"linear-container\">\n <div class=\"linear-bar\" [style.width.%]=\"percentage()\"></div>\n </div>\n\n <ng-container [ngTemplateOutlet]=\"label\"></ng-container>\n }\n @case (\"radial\") {\n <div class=\"radial-container\">\n <svg width=\"100%\" height=\"100%\">\n <circle class=\"background\"></circle>\n\n <circle class=\"progress\" stroke-linecap=\"round\"></circle>\n </svg>\n\n <ng-container [ngTemplateOutlet]=\"label\"></ng-container>\n </div>\n }\n}\n\n<ng-template #label>\n @if (showLabel()) {\n <span class=\"label\">\n @switch (labelFormat()) {\n @case (\"percentage\") {\n {{ percentage() | number: \"1.0-0\" }}%\n }\n @case (\"value\") {\n {{ value() | number: \"1.0-0\" }}\n }\n }\n </span>\n }\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DecimalPipe, name: "number" }] });
1600
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataProgressLinearComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1601
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataProgressLinearComponent, isStandalone: true, selector: "st-progress-linear", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, labelFormat: { classPropertyName: "labelFormat", publicName: "labelFormat", isSignal: true, isRequired: false, transformFunction: null }, growDirection: { classPropertyName: "growDirection", publicName: "growDirection", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.cssClasses", "style.--st-progress-percentage": "this.percentageProperty" } }, ngImport: i0, template: "<div class=\"linear-container\">\n <div class=\"linear-bar\" [style.width.%]=\"percentage()\"></div>\n</div>\n\n<ng-container [ngTemplateOutlet]=\"label\"></ng-container>\n\n<ng-template #label>\n @if (showLabel()) {\n <span class=\"label\">\n @switch (labelFormat()) {\n @case (\"percentage\") {\n {{ percentage() | number: \"1.0-0\" }}%\n }\n @case (\"value\") {\n {{ value() | number: \"1.0-0\" }}\n }\n }\n </span>\n }\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DecimalPipe, name: "number" }] });
1228
1602
  }
1229
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ProgressComponent, decorators: [{
1603
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataProgressLinearComponent, decorators: [{
1230
1604
  type: Component,
1231
- args: [{ selector: 'st-progress', imports: [DecimalPipe, NgTemplateOutlet], template: "@switch (type()) {\n @case (\"linear\") {\n <div class=\"linear-container\">\n <div class=\"linear-bar\" [style.width.%]=\"percentage()\"></div>\n </div>\n\n <ng-container [ngTemplateOutlet]=\"label\"></ng-container>\n }\n @case (\"radial\") {\n <div class=\"radial-container\">\n <svg width=\"100%\" height=\"100%\">\n <circle class=\"background\"></circle>\n\n <circle class=\"progress\" stroke-linecap=\"round\"></circle>\n </svg>\n\n <ng-container [ngTemplateOutlet]=\"label\"></ng-container>\n </div>\n }\n}\n\n<ng-template #label>\n @if (showLabel()) {\n <span class=\"label\">\n @switch (labelFormat()) {\n @case (\"percentage\") {\n {{ percentage() | number: \"1.0-0\" }}%\n }\n @case (\"value\") {\n {{ value() | number: \"1.0-0\" }}\n }\n }\n </span>\n }\n</ng-template>\n" }]
1232
- }], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }], labelFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelFormat", required: false }] }], growDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "growDirection", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], cssClasses: [{
1605
+ args: [{ selector: 'st-progress-linear', imports: [DecimalPipe, NgTemplateOutlet], template: "<div class=\"linear-container\">\n <div class=\"linear-bar\" [style.width.%]=\"percentage()\"></div>\n</div>\n\n<ng-container [ngTemplateOutlet]=\"label\"></ng-container>\n\n<ng-template #label>\n @if (showLabel()) {\n <span class=\"label\">\n @switch (labelFormat()) {\n @case (\"percentage\") {\n {{ percentage() | number: \"1.0-0\" }}%\n }\n @case (\"value\") {\n {{ value() | number: \"1.0-0\" }}\n }\n }\n </span>\n }\n</ng-template>\n" }]
1606
+ }], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }], labelFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelFormat", required: false }] }], growDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "growDirection", required: false }] }], cssClasses: [{
1233
1607
  type: HostBinding,
1234
1608
  args: ['class']
1235
1609
  }], percentageProperty: [{
@@ -1237,11 +1611,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1237
1611
  args: ['style.--st-progress-percentage']
1238
1612
  }] } });
1239
1613
 
1240
- class SegmentedControlItemComponent {
1614
+ class StrataProgressRadialComponent {
1615
+ min = input(0, ...(ngDevMode ? [{ debugName: "min" }] : []));
1616
+ max = input(100, ...(ngDevMode ? [{ debugName: "max" }] : []));
1617
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
1618
+ showLabel = input(true, ...(ngDevMode ? [{ debugName: "showLabel" }] : []));
1619
+ labelFormat = input('percentage', ...(ngDevMode ? [{ debugName: "labelFormat" }] : []));
1620
+ size = input(120, ...(ngDevMode ? [{ debugName: "size" }] : []));
1621
+ strokeWidth = input(10, ...(ngDevMode ? [{ debugName: "strokeWidth" }] : []));
1622
+ percentage = computed(() => {
1623
+ if (this.max() <= this.min()) {
1624
+ return 0;
1625
+ }
1626
+ const clampedValue = Math.min(Math.max(this.value(), this.min()), this.max());
1627
+ const progressedValue = clampedValue - this.min();
1628
+ const progressableValues = this.max() - this.min();
1629
+ return (progressedValue / progressableValues) * 100;
1630
+ }, ...(ngDevMode ? [{ debugName: "percentage" }] : []));
1631
+ radius = computed(() => (this.size() - this.strokeWidth()) / 2, ...(ngDevMode ? [{ debugName: "radius" }] : []));
1632
+ circumference = computed(() => 2 * Math.PI * this.radius(), ...(ngDevMode ? [{ debugName: "circumference" }] : []));
1633
+ dashOffset = computed(() => this.circumference() * (1 - this.percentage() / 100), ...(ngDevMode ? [{ debugName: "dashOffset" }] : []));
1634
+ get percentageProperty() {
1635
+ return this.percentage();
1636
+ }
1637
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataProgressRadialComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1638
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataProgressRadialComponent, isStandalone: true, selector: "st-progress-radial", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, labelFormat: { classPropertyName: "labelFormat", publicName: "labelFormat", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--st-progress-percentage": "this.percentageProperty" } }, ngImport: i0, template: "<div class=\"radial-container\">\n <svg width=\"100%\" height=\"100%\">\n <circle class=\"background\"></circle>\n\n <circle class=\"progress\" stroke-linecap=\"round\"></circle>\n </svg>\n\n <ng-container [ngTemplateOutlet]=\"label\"></ng-container>\n</div>\n\n<ng-template #label>\n @if (showLabel()) {\n <span class=\"label\">\n @switch (labelFormat()) {\n @case (\"percentage\") {\n {{ percentage() | number: \"1.0-0\" }}%\n }\n @case (\"value\") {\n {{ value() | number: \"1.0-0\" }}\n }\n }\n </span>\n }\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DecimalPipe, name: "number" }] });
1639
+ }
1640
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataProgressRadialComponent, decorators: [{
1641
+ type: Component,
1642
+ args: [{ selector: 'st-progress-radial', imports: [DecimalPipe, NgTemplateOutlet], template: "<div class=\"radial-container\">\n <svg width=\"100%\" height=\"100%\">\n <circle class=\"background\"></circle>\n\n <circle class=\"progress\" stroke-linecap=\"round\"></circle>\n </svg>\n\n <ng-container [ngTemplateOutlet]=\"label\"></ng-container>\n</div>\n\n<ng-template #label>\n @if (showLabel()) {\n <span class=\"label\">\n @switch (labelFormat()) {\n @case (\"percentage\") {\n {{ percentage() | number: \"1.0-0\" }}%\n }\n @case (\"value\") {\n {{ value() | number: \"1.0-0\" }}\n }\n }\n </span>\n }\n</ng-template>\n" }]
1643
+ }], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }], labelFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelFormat", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], percentageProperty: [{
1644
+ type: HostBinding,
1645
+ args: ['style.--st-progress-percentage']
1646
+ }] } });
1647
+
1648
+ class StrataRadioGroupComponent {
1649
+ value = model('', ...(ngDevMode ? [{ debugName: "value" }] : []));
1650
+ radios = contentChildren(StrataRadioComponent, { ...(ngDevMode ? { debugName: "radios" } : {}), descendants: true });
1651
+ constructor() {
1652
+ // Sync group value -> children checked state
1653
+ effect(() => {
1654
+ const currentValue = this.value();
1655
+ this.radios().forEach((radio) => {
1656
+ radio.checked.set(radio.value() === currentValue);
1657
+ });
1658
+ });
1659
+ // Handle child selection -> update group value
1660
+ effect((onCleanup) => {
1661
+ const radios = this.radios();
1662
+ const subs = radios.map((radio) => radio.select.subscribe(() => {
1663
+ this.value.set(radio.value());
1664
+ }));
1665
+ onCleanup(() => {
1666
+ subs.forEach((s) => s.unsubscribe());
1667
+ });
1668
+ });
1669
+ }
1670
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataRadioGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1671
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataRadioGroupComponent, isStandalone: true, selector: "st-radio-group", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, queries: [{ propertyName: "radios", predicate: StrataRadioComponent, descendants: true, isSignal: true }], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
1672
+ }
1673
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataRadioGroupComponent, decorators: [{
1674
+ type: Component,
1675
+ args: [{
1676
+ selector: 'st-radio-group',
1677
+ imports: [],
1678
+ template: `<ng-content></ng-content>`,
1679
+ }]
1680
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], radios: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataRadioComponent), { ...{ descendants: true }, isSignal: true }] }] } });
1681
+
1682
+ class StrataSegmentedControlItemComponent {
1241
1683
  text = input.required(...(ngDevMode ? [{ debugName: "text" }] : []));
1242
1684
  selected = model(false, ...(ngDevMode ? [{ debugName: "selected" }] : []));
1243
1685
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
1244
- onSelection = output();
1686
+ selectionChanged = output();
1245
1687
  get tabIndex() {
1246
1688
  return this.selected() || this.disabled() ? null : 0;
1247
1689
  }
@@ -1250,17 +1692,17 @@ class SegmentedControlItemComponent {
1250
1692
  }
1251
1693
  onClick() {
1252
1694
  this.selected.set(true);
1253
- this.onSelection.emit();
1695
+ this.selectionChanged.emit();
1254
1696
  }
1255
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SegmentedControlItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1256
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: SegmentedControlItemComponent, isStandalone: true, selector: "st-segmented-control-item", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", onSelection: "onSelection" }, host: { listeners: { "click": "onClick()" }, properties: { "attr.tabindex": "this.tabIndex", "attr.disabled": "this.disabledAttribute" } }, ngImport: i0, template: `{{ text() }} `, isInline: true, styles: [""] });
1697
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSegmentedControlItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1698
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataSegmentedControlItemComponent, isStandalone: true, selector: "st-segmented-control-item", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", selectionChanged: "selectionChanged" }, host: { listeners: { "click": "onClick()" }, properties: { "attr.tabindex": "this.tabIndex", "attr.disabled": "this.disabledAttribute" } }, ngImport: i0, template: "{{ text() }}\n", styles: [""] });
1257
1699
  }
1258
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SegmentedControlItemComponent, decorators: [{
1700
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSegmentedControlItemComponent, decorators: [{
1259
1701
  type: Component,
1260
- args: [{ selector: 'st-segmented-control-item', imports: [], template: `{{ text() }} `, host: {
1702
+ args: [{ selector: 'st-segmented-control-item', imports: [], host: {
1261
1703
  '(click)': 'onClick()',
1262
- } }]
1263
- }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], onSelection: [{ type: i0.Output, args: ["onSelection"] }], tabIndex: [{
1704
+ }, template: "{{ text() }}\n" }]
1705
+ }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectionChanged: [{ type: i0.Output, args: ["selectionChanged"] }], tabIndex: [{
1264
1706
  type: HostBinding,
1265
1707
  args: ['attr.tabindex']
1266
1708
  }], disabledAttribute: [{
@@ -1268,27 +1710,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1268
1710
  args: ['attr.disabled']
1269
1711
  }] } });
1270
1712
 
1271
- class SegmentedControlComponent {
1272
- segmentItems = contentChildren(SegmentedControlItemComponent, ...(ngDevMode ? [{ debugName: "segmentItems" }] : []));
1273
- segmentItemsRefs = contentChildren(SegmentedControlItemComponent, { ...(ngDevMode ? { debugName: "segmentItemsRefs" } : {}), read: ElementRef });
1713
+ class StrataSegmentedControlComponent {
1714
+ elementRef = inject(ElementRef);
1715
+ destroyRef = inject(DestroyRef);
1716
+ fullWidth = input(false, { ...(ngDevMode ? { debugName: "fullWidth" } : {}), transform: booleanAttribute });
1717
+ segmentItems = contentChildren(StrataSegmentedControlItemComponent, ...(ngDevMode ? [{ debugName: "segmentItems" }] : []));
1718
+ segmentItemsRefs = contentChildren(StrataSegmentedControlItemComponent, { ...(ngDevMode ? { debugName: "segmentItemsRefs" } : {}), read: ElementRef });
1274
1719
  selectedItem = signal(null, ...(ngDevMode ? [{ debugName: "selectedItem" }] : []));
1275
1720
  selectedIndex = signal(0, ...(ngDevMode ? [{ debugName: "selectedIndex" }] : []));
1276
- offset = computed(() => this.widths()[this.selectedIndex()], ...(ngDevMode ? [{ debugName: "offset" }] : []));
1277
- widths = signal([], ...(ngDevMode ? [{ debugName: "widths" }] : []));
1721
+ offsets = signal([], ...(ngDevMode ? [{ debugName: "offsets" }] : []));
1722
+ itemWidths = signal([], ...(ngDevMode ? [{ debugName: "itemWidths" }] : []));
1723
+ tops = signal([], ...(ngDevMode ? [{ debugName: "tops" }] : []));
1724
+ heights = signal([], ...(ngDevMode ? [{ debugName: "heights" }] : []));
1725
+ offset = computed(() => this.offsets()[this.selectedIndex()] ?? 0, ...(ngDevMode ? [{ debugName: "offset" }] : []));
1726
+ indicatorWidth = computed(() => this.itemWidths()[this.selectedIndex()] ?? 0, ...(ngDevMode ? [{ debugName: "indicatorWidth" }] : []));
1727
+ indicatorTop = computed(() => this.tops()[this.selectedIndex()] ?? 0, ...(ngDevMode ? [{ debugName: "indicatorTop" }] : []));
1728
+ indicatorHeight = computed(() => this.heights()[this.selectedIndex()] ?? 0, ...(ngDevMode ? [{ debugName: "indicatorHeight" }] : []));
1278
1729
  ngAfterViewInit() {
1279
1730
  if (this.segmentItems().length === 0) {
1280
1731
  return;
1281
1732
  }
1282
- const widths = [];
1283
- for (let i = 0; i < this.segmentItems().length; i++) {
1284
- widths.push(this.calculateOffset(i));
1285
- }
1286
- this.widths.set(widths);
1287
- for (const item of this.segmentItems()) {
1288
- item.onSelection.subscribe(() => {
1289
- this.selectItem(item);
1290
- });
1291
- }
1733
+ this.updateDimensions();
1292
1734
  const initiallySelected = this.segmentItems().find((item) => item.selected());
1293
1735
  if (!initiallySelected) {
1294
1736
  const firstItem = this.segmentItems()[0];
@@ -1298,31 +1740,152 @@ class SegmentedControlComponent {
1298
1740
  else {
1299
1741
  this.selectItem(initiallySelected);
1300
1742
  }
1743
+ const observer = new ResizeObserver(() => {
1744
+ this.updateDimensions();
1745
+ });
1746
+ observer.observe(this.elementRef.nativeElement);
1747
+ this.destroyRef.onDestroy(() => observer.disconnect());
1748
+ }
1749
+ constructor() {
1750
+ effect((onCleanup) => {
1751
+ const items = this.segmentItems();
1752
+ const subs = items.map((item) => item.selectionChanged.subscribe(() => {
1753
+ this.selectItem(item);
1754
+ }));
1755
+ // Also update dimensions when items change
1756
+ this.updateDimensions();
1757
+ onCleanup(() => {
1758
+ subs.forEach((sub) => sub.unsubscribe());
1759
+ });
1760
+ });
1301
1761
  }
1302
1762
  selectItem(selectedItem) {
1303
1763
  this.selectedItem.set(selectedItem);
1304
1764
  this.selectedIndex.set(this.segmentItems().indexOf(selectedItem));
1305
1765
  }
1306
- calculateOffset(currentIndex) {
1307
- const elementsBeforeIndex = this.segmentItemsRefs().slice(0, currentIndex) ?? [];
1308
- if (elementsBeforeIndex.length > 0) {
1309
- return elementsBeforeIndex
1310
- .map((element) => element.nativeElement.offsetWidth)
1311
- .reduce((sum, currentValue) => (sum += currentValue));
1312
- }
1313
- return 0;
1314
- }
1315
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SegmentedControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1316
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: SegmentedControlComponent, isStandalone: true, selector: "st-segmented-control", queries: [{ propertyName: "segmentItems", predicate: SegmentedControlItemComponent, isSignal: true }, { propertyName: "segmentItemsRefs", predicate: SegmentedControlItemComponent, read: ElementRef, isSignal: true }], ngImport: i0, template: "<ng-content select=\"st-segmented-control-item\"></ng-content>\n<div class=\"selection-item\" id=\"selection-indicator\" [style.marginLeft]=\"this.offset() + 'px'\">\n {{ this.selectedItem()?.text() }}\n</div>\n" });
1766
+ updateDimensions() {
1767
+ const refs = this.segmentItemsRefs();
1768
+ if (!refs || refs.length === 0)
1769
+ return;
1770
+ const offsets = refs.map(ref => ref.nativeElement.offsetLeft);
1771
+ const widths = refs.map(ref => ref.nativeElement.offsetWidth);
1772
+ const tops = refs.map(ref => ref.nativeElement.offsetTop);
1773
+ const heights = refs.map(ref => ref.nativeElement.offsetHeight);
1774
+ this.offsets.set(offsets);
1775
+ this.itemWidths.set(widths);
1776
+ this.tops.set(tops);
1777
+ this.heights.set(heights);
1778
+ }
1779
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSegmentedControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1780
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataSegmentedControlComponent, isStandalone: true, selector: "st-segmented-control", inputs: { fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.st-segmented-control-full-width": "fullWidth()" } }, queries: [{ propertyName: "segmentItems", predicate: StrataSegmentedControlItemComponent, isSignal: true }, { propertyName: "segmentItemsRefs", predicate: StrataSegmentedControlItemComponent, read: ElementRef, isSignal: true }], ngImport: i0, template: "<ng-content select=\"st-segmented-control-item\"></ng-content>\n<div class=\"selection-item\" id=\"selection-indicator\" \n [style.left]=\"this.offset() + 'px'\"\n [style.top]=\"this.indicatorTop() + 'px'\"\n [style.width]=\"this.indicatorWidth() + 'px'\"\n [style.height]=\"this.indicatorHeight() + 'px'\">\n {{ this.selectedItem()?.text() }}\n</div>\n" });
1317
1781
  }
1318
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SegmentedControlComponent, decorators: [{
1782
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSegmentedControlComponent, decorators: [{
1319
1783
  type: Component,
1320
- args: [{ selector: 'st-segmented-control', imports: [], template: "<ng-content select=\"st-segmented-control-item\"></ng-content>\n<div class=\"selection-item\" id=\"selection-indicator\" [style.marginLeft]=\"this.offset() + 'px'\">\n {{ this.selectedItem()?.text() }}\n</div>\n" }]
1321
- }], propDecorators: { segmentItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SegmentedControlItemComponent), { isSignal: true }] }], segmentItemsRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SegmentedControlItemComponent), { ...{
1784
+ args: [{ selector: 'st-segmented-control', imports: [], host: {
1785
+ '[class.st-segmented-control-full-width]': 'fullWidth()',
1786
+ }, template: "<ng-content select=\"st-segmented-control-item\"></ng-content>\n<div class=\"selection-item\" id=\"selection-indicator\" \n [style.left]=\"this.offset() + 'px'\"\n [style.top]=\"this.indicatorTop() + 'px'\"\n [style.width]=\"this.indicatorWidth() + 'px'\"\n [style.height]=\"this.indicatorHeight() + 'px'\">\n {{ this.selectedItem()?.text() }}\n</div>\n" }]
1787
+ }], ctorParameters: () => [], propDecorators: { fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], segmentItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataSegmentedControlItemComponent), { isSignal: true }] }], segmentItemsRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataSegmentedControlItemComponent), { ...{
1322
1788
  read: ElementRef,
1323
1789
  }, isSignal: true }] }] } });
1324
1790
 
1325
- class SliderComponent {
1791
+ class StrataSidemenuComponent {
1792
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSidemenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1793
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", type: StrataSidemenuComponent, isStandalone: true, selector: "st-sidemenu", ngImport: i0, template: "<div class=\"st-sidemenu-header\">\n <ng-content select=\"[st-sidemenu-header]\"></ng-content>\n</div>\n<div class=\"st-sidemenu-content\">\n <ng-content></ng-content>\n</div>\n<div class=\"st-sidemenu-footer\">\n <ng-content select=\"[st-sidemenu-footer]\"></ng-content>\n</div>\n", styles: [":host{--st-sidemenu-min-width: 200px;--st-sidemenu-padding: var(--st-size-xs, 12px);--st-sidemenu-header-spacing: var(--st-size-sm, 16px);--st-sidemenu-footer-spacing: var(--st-size-sm, 16px);--st-sidemenu-bg: var(--st-color-bg-default);display:flex;flex-direction:column;height:100%;width:max-content;min-width:var(--st-sidemenu-min-width);box-sizing:border-box;background-color:var(--st-sidemenu-bg)}:host .st-sidemenu-header{display:flex;flex-direction:column;margin-bottom:var(--st-sidemenu-header-spacing)}:host .st-sidemenu-header:empty{display:none;margin-bottom:0}:host .st-sidemenu-content{display:flex;flex-direction:column;flex:1;overflow-y:auto;padding:var(--st-sidemenu-padding)}:host .st-sidemenu-footer{display:flex;flex-direction:column;margin-top:auto;padding-top:var(--st-sidemenu-footer-spacing)}:host .st-sidemenu-footer:empty{display:none;padding-top:0}\n"] });
1794
+ }
1795
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSidemenuComponent, decorators: [{
1796
+ type: Component,
1797
+ args: [{ selector: 'st-sidemenu', template: "<div class=\"st-sidemenu-header\">\n <ng-content select=\"[st-sidemenu-header]\"></ng-content>\n</div>\n<div class=\"st-sidemenu-content\">\n <ng-content></ng-content>\n</div>\n<div class=\"st-sidemenu-footer\">\n <ng-content select=\"[st-sidemenu-footer]\"></ng-content>\n</div>\n", styles: [":host{--st-sidemenu-min-width: 200px;--st-sidemenu-padding: var(--st-size-xs, 12px);--st-sidemenu-header-spacing: var(--st-size-sm, 16px);--st-sidemenu-footer-spacing: var(--st-size-sm, 16px);--st-sidemenu-bg: var(--st-color-bg-default);display:flex;flex-direction:column;height:100%;width:max-content;min-width:var(--st-sidemenu-min-width);box-sizing:border-box;background-color:var(--st-sidemenu-bg)}:host .st-sidemenu-header{display:flex;flex-direction:column;margin-bottom:var(--st-sidemenu-header-spacing)}:host .st-sidemenu-header:empty{display:none;margin-bottom:0}:host .st-sidemenu-content{display:flex;flex-direction:column;flex:1;overflow-y:auto;padding:var(--st-sidemenu-padding)}:host .st-sidemenu-footer{display:flex;flex-direction:column;margin-top:auto;padding-top:var(--st-sidemenu-footer-spacing)}:host .st-sidemenu-footer:empty{display:none;padding-top:0}\n"] }]
1798
+ }] });
1799
+
1800
+ class StrataSidemenuSectionComponent {
1801
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
1802
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSidemenuSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1803
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataSidemenuSectionComponent, isStandalone: true, selector: "st-sidemenu-section", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (label()) {\n<p class=\"st-sidemenu-section-header st-label\">{{ label() }}</p>\n}\n<div class=\"st-sidemenu-section-content\">\n <ng-content></ng-content>\n</div>", styles: [":host{--st-sidemenu-section-spacing: var(--st-size-sm, 16px);--st-sidemenu-section-header-padding: var(--st-size-xxs, 8px) var(--st-size-xs, 12px);--st-sidemenu-section-header-spacing: var(--st-size-xxxs, 4px);--st-sidemenu-section-gap: var(--st-size-xxxs, 4px);display:flex;flex-direction:column;width:100%;margin-block-end:var(--st-sidemenu-section-spacing)}.st-sidemenu-section-header{padding:var(--st-sidemenu-section-header-padding);margin-block-end:var(--st-sidemenu-section-header-spacing)}.st-sidemenu-section-content{display:flex;flex-direction:column;gap:var(--st-sidemenu-section-gap)}\n"] });
1804
+ }
1805
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSidemenuSectionComponent, decorators: [{
1806
+ type: Component,
1807
+ args: [{ selector: 'st-sidemenu-section', template: "@if (label()) {\n<p class=\"st-sidemenu-section-header st-label\">{{ label() }}</p>\n}\n<div class=\"st-sidemenu-section-content\">\n <ng-content></ng-content>\n</div>", styles: [":host{--st-sidemenu-section-spacing: var(--st-size-sm, 16px);--st-sidemenu-section-header-padding: var(--st-size-xxs, 8px) var(--st-size-xs, 12px);--st-sidemenu-section-header-spacing: var(--st-size-xxxs, 4px);--st-sidemenu-section-gap: var(--st-size-xxxs, 4px);display:flex;flex-direction:column;width:100%;margin-block-end:var(--st-sidemenu-section-spacing)}.st-sidemenu-section-header{padding:var(--st-sidemenu-section-header-padding);margin-block-end:var(--st-sidemenu-section-header-spacing)}.st-sidemenu-section-content{display:flex;flex-direction:column;gap:var(--st-sidemenu-section-gap)}\n"] }]
1808
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
1809
+
1810
+ class StrataSidemenuItemDirective {
1811
+ active = input(false, ...(ngDevMode ? [{ debugName: "active" }] : []));
1812
+ elementRef = inject(ElementRef);
1813
+ constructor() {
1814
+ effect(() => {
1815
+ if (this.active()) {
1816
+ this.elementRef.nativeElement.scrollIntoView({
1817
+ block: 'nearest',
1818
+ inline: 'nearest',
1819
+ });
1820
+ }
1821
+ });
1822
+ }
1823
+ isSidemenuItem = true;
1824
+ get isSelected() {
1825
+ return this.active();
1826
+ }
1827
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSidemenuItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1828
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: StrataSidemenuItemDirective, isStandalone: true, selector: "[stSidemenuItem]", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.st-sidemenu-item": "this.isSidemenuItem", "class.selected": "this.isSelected" } }, ngImport: i0 });
1829
+ }
1830
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSidemenuItemDirective, decorators: [{
1831
+ type: Directive,
1832
+ args: [{
1833
+ selector: '[stSidemenuItem]'
1834
+ }]
1835
+ }], ctorParameters: () => [], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], isSidemenuItem: [{
1836
+ type: HostBinding,
1837
+ args: ['class.st-sidemenu-item']
1838
+ }], isSelected: [{
1839
+ type: HostBinding,
1840
+ args: ['class.selected']
1841
+ }] } });
1842
+
1843
+ class StrataSidemenuItemGroupComponent {
1844
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
1845
+ expanded = signal(false, ...(ngDevMode ? [{ debugName: "expanded" }] : []));
1846
+ hasActiveChild = signal(false, ...(ngDevMode ? [{ debugName: "hasActiveChild" }] : []));
1847
+ router = inject(Router, { optional: true });
1848
+ destroyRef = inject(DestroyRef);
1849
+ routerLinks;
1850
+ ngAfterContentInit() {
1851
+ setTimeout(() => {
1852
+ this.checkActiveState();
1853
+ });
1854
+ if (this.router) {
1855
+ this.router.events
1856
+ .pipe(filter((e) => e instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef))
1857
+ .subscribe(() => {
1858
+ // Wait a tick for RouterLinkActive to update its isActive status
1859
+ setTimeout(() => {
1860
+ this.checkActiveState();
1861
+ });
1862
+ });
1863
+ }
1864
+ }
1865
+ toggle() {
1866
+ this.expanded.update((e) => !e);
1867
+ }
1868
+ checkActiveState() {
1869
+ if (!this.routerLinks)
1870
+ return;
1871
+ const isActive = this.routerLinks.some((rla) => rla.isActive);
1872
+ this.hasActiveChild.set(isActive);
1873
+ if (isActive) {
1874
+ this.expanded.set(true);
1875
+ }
1876
+ }
1877
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSidemenuItemGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1878
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataSidemenuItemGroupComponent, isStandalone: true, selector: "st-sidemenu-item-group", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null } }, queries: [{ propertyName: "routerLinks", predicate: RouterLinkActive, descendants: true }], ngImport: i0, template: "<button stSidemenuItem type=\"button\" [active]=\"hasActiveChild()\" (click)=\"toggle()\">\n <span class=\"st-sidemenu-item-group-label\">{{ label() }}</span>\n <st-icon name=\"arrow-down\" size=\"sm\" class=\"st-sidemenu-item-group-icon\" [class.expanded]=\"expanded()\"></st-icon>\n</button>\n\n<div class=\"st-sidemenu-item-group-content\" [hidden]=\"!expanded()\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{--st-sidemenu-item-group-gap: var(--st-size-xxxs, 4px);--st-sidemenu-item-group-indent: var(--st-size-sm, 16px);--st-sidemenu-item-group-spacing: var(--st-size-xxxs, 4px);display:flex;flex-direction:column;width:100%}.st-sidemenu-item-group-icon{margin-left:auto;color:var(--st-color-text-secondary);transition:transform .2s ease}.st-sidemenu-item-group-icon.expanded{transform:rotate(180deg)}.st-sidemenu-item-group-content{display:flex;flex-direction:column;gap:var(--st-sidemenu-item-group-gap);padding-left:var(--st-sidemenu-item-group-indent);margin-top:var(--st-sidemenu-item-group-spacing)}.st-sidemenu-item-group-content[hidden]{display:none!important}\n"], dependencies: [{ kind: "directive", type: StrataSidemenuItemDirective, selector: "[stSidemenuItem]", inputs: ["active"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }] });
1879
+ }
1880
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSidemenuItemGroupComponent, decorators: [{
1881
+ type: Component,
1882
+ args: [{ selector: 'st-sidemenu-item-group', imports: [StrataSidemenuItemDirective, StrataIconComponent], template: "<button stSidemenuItem type=\"button\" [active]=\"hasActiveChild()\" (click)=\"toggle()\">\n <span class=\"st-sidemenu-item-group-label\">{{ label() }}</span>\n <st-icon name=\"arrow-down\" size=\"sm\" class=\"st-sidemenu-item-group-icon\" [class.expanded]=\"expanded()\"></st-icon>\n</button>\n\n<div class=\"st-sidemenu-item-group-content\" [hidden]=\"!expanded()\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{--st-sidemenu-item-group-gap: var(--st-size-xxxs, 4px);--st-sidemenu-item-group-indent: var(--st-size-sm, 16px);--st-sidemenu-item-group-spacing: var(--st-size-xxxs, 4px);display:flex;flex-direction:column;width:100%}.st-sidemenu-item-group-icon{margin-left:auto;color:var(--st-color-text-secondary);transition:transform .2s ease}.st-sidemenu-item-group-icon.expanded{transform:rotate(180deg)}.st-sidemenu-item-group-content{display:flex;flex-direction:column;gap:var(--st-sidemenu-item-group-gap);padding-left:var(--st-sidemenu-item-group-indent);margin-top:var(--st-sidemenu-item-group-spacing)}.st-sidemenu-item-group-content[hidden]{display:none!important}\n"] }]
1883
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], routerLinks: [{
1884
+ type: ContentChildren,
1885
+ args: [RouterLinkActive, { descendants: true }]
1886
+ }] } });
1887
+
1888
+ class StrataSliderComponent {
1326
1889
  wrapper = viewChild.required('wrapper');
1327
1890
  resizeObserver;
1328
1891
  value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
@@ -1367,23 +1930,23 @@ class SliderComponent {
1367
1930
  const size = styles.getPropertyValue('--st-slider-thumb-size');
1368
1931
  return parseFloat(size);
1369
1932
  }
1370
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1371
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: SliderComponent, isStandalone: true, selector: "st-slider", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, minimum: { classPropertyName: "minimum", publicName: "minimum", isSignal: true, isRequired: true, transformFunction: null }, maximum: { classPropertyName: "maximum", publicName: "maximum", isSignal: true, isRequired: true, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #wrapper\n class=\"range-wrapper\"\n [style.--steps]=\"steps()\"\n [class.stepped]=\"isStepped()\"\n>\n <input\n type=\"range\"\n [(ngModel)]=\"value\"\n [min]=\"minimum()\"\n [max]=\"maximum()\"\n [step]=\"computedStep()\"\n />\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
1933
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1934
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataSliderComponent, isStandalone: true, selector: "st-slider", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, minimum: { classPropertyName: "minimum", publicName: "minimum", isSignal: true, isRequired: true, transformFunction: null }, maximum: { classPropertyName: "maximum", publicName: "maximum", isSignal: true, isRequired: true, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #wrapper\n class=\"range-wrapper\"\n [style.--steps]=\"steps()\"\n [class.stepped]=\"isStepped()\"\n>\n <input\n type=\"range\"\n [(ngModel)]=\"value\"\n [min]=\"minimum()\"\n [max]=\"maximum()\"\n [step]=\"computedStep()\"\n />\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
1372
1935
  }
1373
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SliderComponent, decorators: [{
1936
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSliderComponent, decorators: [{
1374
1937
  type: Component,
1375
1938
  args: [{ selector: 'st-slider', imports: [FormsModule], template: "<div\n #wrapper\n class=\"range-wrapper\"\n [style.--steps]=\"steps()\"\n [class.stepped]=\"isStepped()\"\n>\n <input\n type=\"range\"\n [(ngModel)]=\"value\"\n [min]=\"minimum()\"\n [max]=\"maximum()\"\n [step]=\"computedStep()\"\n />\n</div>\n" }]
1376
1939
  }], propDecorators: { wrapper: [{ type: i0.ViewChild, args: ['wrapper', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], minimum: [{ type: i0.Input, args: [{ isSignal: true, alias: "minimum", required: true }] }], maximum: [{ type: i0.Input, args: [{ isSignal: true, alias: "maximum", required: true }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }] } });
1377
1940
 
1378
- class SpinnerComponent {
1941
+ class StrataSpinnerComponent {
1379
1942
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
1380
1943
  get cssClasses() {
1381
1944
  return [this.size()];
1382
1945
  }
1383
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1384
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: SpinnerComponent, isStandalone: true, selector: "st-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.cssClasses" } }, ngImport: i0, template: "<span class=\"st-spinner\"></span>\n" });
1946
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1947
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: StrataSpinnerComponent, isStandalone: true, selector: "st-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.cssClasses" } }, ngImport: i0, template: "<span class=\"st-spinner\"></span>\n" });
1385
1948
  }
1386
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SpinnerComponent, decorators: [{
1949
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataSpinnerComponent, decorators: [{
1387
1950
  type: Component,
1388
1951
  args: [{ selector: 'st-spinner', imports: [], template: "<span class=\"st-spinner\"></span>\n" }]
1389
1952
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], cssClasses: [{
@@ -1391,23 +1954,151 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1391
1954
  args: ['class']
1392
1955
  }] } });
1393
1956
 
1394
- class TextStackComponent {
1395
- overflow = input('truncate', ...(ngDevMode ? [{ debugName: "overflow" }] : []));
1396
- get cssClasses() {
1397
- return [this.overflow()];
1957
+ class StrataTabItemComponent {
1958
+ /**
1959
+ * The text label for the tab.
1960
+ * Can also be provided via content projection.
1961
+ */
1962
+ text = input(...(ngDevMode ? [undefined, { debugName: "text" }] : []));
1963
+ /**
1964
+ * Whether the tab is currently selected.
1965
+ */
1966
+ selected = model(false, ...(ngDevMode ? [{ debugName: "selected" }] : []));
1967
+ /**
1968
+ * Whether the tab is disabled.
1969
+ */
1970
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
1971
+ /**
1972
+ * Emitted when the tab is clicked.
1973
+ */
1974
+ selectionChanged = output();
1975
+ get isSelected() {
1976
+ return this.selected();
1977
+ }
1978
+ get isDisabled() {
1979
+ return this.disabled();
1980
+ }
1981
+ get tabIndex() {
1982
+ return this.selected() || this.disabled() ? null : 0;
1983
+ }
1984
+ get activeClass() {
1985
+ return this.selected();
1986
+ }
1987
+ get disabledClass() {
1988
+ return this.disabled();
1989
+ }
1990
+ onClick() {
1991
+ if (this.disabled()) {
1992
+ return;
1993
+ }
1994
+ this.selected.set(true);
1995
+ this.selectionChanged.emit();
1398
1996
  }
1399
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TextStackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1400
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: TextStackComponent, isStandalone: true, selector: "st-text-stack", inputs: { overflow: { classPropertyName: "overflow", publicName: "overflow", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.cssClasses" } }, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [""] });
1997
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTabItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1998
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataTabItemComponent, isStandalone: true, selector: "st-tab-item", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", selectionChanged: "selectionChanged" }, host: { attributes: { "role": "tab" }, listeners: { "click": "onClick()" }, properties: { "attr.aria-selected": "this.isSelected", "attr.aria-disabled": "this.isDisabled", "attr.tabindex": "this.tabIndex", "class.active": "this.activeClass", "class.disabled": "this.disabledClass" } }, ngImport: i0, template: "@if (text()) {\n {{ text() }}\n} @else {\n <ng-content></ng-content>\n}\n" });
1401
1999
  }
1402
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TextStackComponent, decorators: [{
2000
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTabItemComponent, decorators: [{
1403
2001
  type: Component,
1404
- args: [{ selector: 'st-text-stack', imports: [], template: "<ng-content></ng-content>\n" }]
1405
- }], propDecorators: { overflow: [{ type: i0.Input, args: [{ isSignal: true, alias: "overflow", required: false }] }], cssClasses: [{
2002
+ args: [{ selector: 'st-tab-item', imports: [], host: {
2003
+ 'role': 'tab',
2004
+ '(click)': 'onClick()',
2005
+ }, template: "@if (text()) {\n {{ text() }}\n} @else {\n <ng-content></ng-content>\n}\n" }]
2006
+ }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectionChanged: [{ type: i0.Output, args: ["selectionChanged"] }], isSelected: [{
1406
2007
  type: HostBinding,
1407
- args: ['class']
2008
+ args: ['attr.aria-selected']
2009
+ }], isDisabled: [{
2010
+ type: HostBinding,
2011
+ args: ['attr.aria-disabled']
2012
+ }], tabIndex: [{
2013
+ type: HostBinding,
2014
+ args: ['attr.tabindex']
2015
+ }], activeClass: [{
2016
+ type: HostBinding,
2017
+ args: ['class.active']
2018
+ }], disabledClass: [{
2019
+ type: HostBinding,
2020
+ args: ['class.disabled']
1408
2021
  }] } });
1409
2022
 
1410
- class ThemeDirective {
2023
+ class StrataTabsComponent {
2024
+ tabItems = contentChildren(StrataTabItemComponent, { ...(ngDevMode ? { debugName: "tabItems" } : {}), descendants: true });
2025
+ tabItemsRefs = contentChildren(StrataTabItemComponent, { ...(ngDevMode ? { debugName: "tabItemsRefs" } : {}), descendants: true,
2026
+ read: ElementRef });
2027
+ indicator = viewChild('indicator', ...(ngDevMode ? [{ debugName: "indicator" }] : []));
2028
+ selectedTab = signal(null, ...(ngDevMode ? [{ debugName: "selectedTab" }] : []));
2029
+ selectedIndex = signal(0, ...(ngDevMode ? [{ debugName: "selectedIndex" }] : []));
2030
+ resizeObserver;
2031
+ constructor() {
2032
+ // Coordinate child selection
2033
+ effect((onCleanup) => {
2034
+ const items = this.tabItems();
2035
+ const subs = items.map((item, index) => item.selectionChanged.subscribe(() => {
2036
+ this.selectTab(item, index);
2037
+ }));
2038
+ onCleanup(() => {
2039
+ subs.forEach((sub) => sub.unsubscribe());
2040
+ });
2041
+ });
2042
+ // Handle responsive indicator updates
2043
+ effect((onCleanup) => {
2044
+ const indicatorEl = this.indicator()?.nativeElement;
2045
+ const refs = this.tabItemsRefs();
2046
+ const index = this.selectedIndex();
2047
+ if (!indicatorEl || refs.length === 0 || index < 0)
2048
+ return;
2049
+ const activeRef = refs[index].nativeElement;
2050
+ // Update immediately
2051
+ this.updateIndicator(activeRef, indicatorEl);
2052
+ // And on every resize of the active tab
2053
+ this.resizeObserver = new ResizeObserver(() => {
2054
+ this.updateIndicator(activeRef, indicatorEl);
2055
+ });
2056
+ this.resizeObserver.observe(activeRef);
2057
+ onCleanup(() => this.resizeObserver?.disconnect());
2058
+ });
2059
+ }
2060
+ ngAfterViewInit() {
2061
+ // Set initial selection
2062
+ const items = this.tabItems();
2063
+ if (items.length > 0) {
2064
+ const initiallySelected = items.find((item) => item.selected());
2065
+ if (initiallySelected) {
2066
+ this.selectTab(initiallySelected, items.indexOf(initiallySelected));
2067
+ }
2068
+ else {
2069
+ this.selectTab(items[0], 0);
2070
+ }
2071
+ }
2072
+ }
2073
+ updateIndicator(activeElement, indicatorElement) {
2074
+ indicatorElement.style.width = `${activeElement.offsetWidth}px`;
2075
+ indicatorElement.style.left = `${activeElement.offsetLeft}px`;
2076
+ }
2077
+ selectTab(tab, index) {
2078
+ // Unselect others
2079
+ this.tabItems().forEach((item) => {
2080
+ if (item !== tab) {
2081
+ item.selected.set(false);
2082
+ }
2083
+ });
2084
+ tab.selected.set(true);
2085
+ this.selectedTab.set(tab);
2086
+ this.selectedIndex.set(index);
2087
+ }
2088
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2089
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: StrataTabsComponent, isStandalone: true, selector: "st-tabs", host: { classAttribute: "st-tabs-host" }, queries: [{ propertyName: "tabItems", predicate: StrataTabItemComponent, descendants: true, isSignal: true }, { propertyName: "tabItemsRefs", predicate: StrataTabItemComponent, descendants: true, read: ElementRef, isSignal: true }], viewQueries: [{ propertyName: "indicator", first: true, predicate: ["indicator"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"tabs-container\" role=\"tablist\">\n <ng-content></ng-content>\n <div #indicator class=\"selection-indicator\"></div>\n</div>\n" });
2090
+ }
2091
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataTabsComponent, decorators: [{
2092
+ type: Component,
2093
+ args: [{ selector: 'st-tabs', imports: [], host: {
2094
+ 'class': 'st-tabs-host',
2095
+ }, template: "<div class=\"tabs-container\" role=\"tablist\">\n <ng-content></ng-content>\n <div #indicator class=\"selection-indicator\"></div>\n</div>\n" }]
2096
+ }], ctorParameters: () => [], propDecorators: { tabItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataTabItemComponent), { ...{ descendants: true }, isSignal: true }] }], tabItemsRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataTabItemComponent), { ...{
2097
+ descendants: true,
2098
+ read: ElementRef,
2099
+ }, isSignal: true }] }], indicator: [{ type: i0.ViewChild, args: ['indicator', { isSignal: true }] }] } });
2100
+
2101
+ class StrataThemeDirective {
1411
2102
  element = inject(ElementRef);
1412
2103
  stTheme = input.required(...(ngDevMode ? [{ debugName: "stTheme" }] : []));
1413
2104
  constructor() {
@@ -1423,57 +2114,31 @@ class ThemeDirective {
1423
2114
  el.classList.add(`st-theme-${theme}`);
1424
2115
  });
1425
2116
  }
1426
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ThemeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1427
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: ThemeDirective, isStandalone: true, selector: "[stTheme]", inputs: { stTheme: { classPropertyName: "stTheme", publicName: "stTheme", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
2117
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataThemeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2118
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: StrataThemeDirective, isStandalone: true, selector: "[stTheme]", inputs: { stTheme: { classPropertyName: "stTheme", publicName: "stTheme", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
1428
2119
  }
1429
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ThemeDirective, decorators: [{
2120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataThemeDirective, decorators: [{
1430
2121
  type: Directive,
1431
2122
  args: [{
1432
2123
  selector: '[stTheme]',
1433
- standalone: true,
1434
2124
  }]
1435
2125
  }], ctorParameters: () => [], propDecorators: { stTheme: [{ type: i0.Input, args: [{ isSignal: true, alias: "stTheme", required: true }] }] } });
1436
2126
 
1437
- class Stack {
1438
- items = [];
1439
- push(item) {
1440
- this.items.push(item);
1441
- }
1442
- pop() {
1443
- const lastItem = this.items.pop();
1444
- if (lastItem === undefined) {
1445
- throw new Error();
1446
- }
1447
- return lastItem;
1448
- }
1449
- peek() {
1450
- return this.items[this.items.length - 1];
1451
- }
1452
- empty() {
1453
- return this.items.length === 0;
1454
- }
1455
- size() {
1456
- return this.items.length;
1457
- }
1458
- }
1459
-
1460
2127
  class ModalService {
1461
- stack = new Stack();
1462
- currentModals = new BehaviorSubject(this.stack);
2128
+ _modals = signal([], ...(ngDevMode ? [{ debugName: "_modals" }] : []));
2129
+ modals = this._modals.asReadonly();
1463
2130
  showModal(config) {
1464
- this.stack.push({
1465
- ...config,
1466
- id: crypto.randomUUID(),
1467
- size: config.size ?? 'md',
1468
- });
1469
- this.currentModals.next(this.stack);
2131
+ if (!config.size) {
2132
+ config.size = 'md';
2133
+ }
2134
+ this._modals.update((prev) => [...prev, config]);
1470
2135
  }
1471
2136
  showAlert(config, callback) {
1472
2137
  this.showModal({
1473
- component: AlertContentComponent,
2138
+ component: StrataAlertContentComponent,
1474
2139
  size: 'xs',
1475
2140
  hideCloseButton: true,
1476
- onModalClosed: callback,
2141
+ onModalClosed: (val) => callback(val),
1477
2142
  disableBackdropClosure: true,
1478
2143
  inputs: {
1479
2144
  title: config.title,
@@ -1486,10 +2151,26 @@ class ModalService {
1486
2151
  });
1487
2152
  }
1488
2153
  closeCurrentModal(value) {
1489
- const currentModal = this.stack.pop();
1490
- this.currentModals.next(this.stack);
1491
- if (currentModal.onModalClosed) {
1492
- currentModal.onModalClosed(value);
2154
+ const currentStack = this._modals();
2155
+ if (currentStack.length === 0) {
2156
+ return;
2157
+ }
2158
+ const modalToClose = currentStack[currentStack.length - 1];
2159
+ this.close(modalToClose, value);
2160
+ }
2161
+ close(config, value) {
2162
+ const currentStack = this._modals();
2163
+ const index = currentStack.lastIndexOf(config);
2164
+ if (index === -1) {
2165
+ return;
2166
+ }
2167
+ this._modals.update((prev) => {
2168
+ const next = [...prev];
2169
+ next.splice(index, 1);
2170
+ return next;
2171
+ });
2172
+ if (config.onModalClosed) {
2173
+ config.onModalClosed(value);
1493
2174
  }
1494
2175
  }
1495
2176
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -1502,7 +2183,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1502
2183
  }]
1503
2184
  }] });
1504
2185
 
1505
- class AlertContentComponent {
2186
+ class StrataAlertContentComponent {
1506
2187
  modalService;
1507
2188
  title = input.required(...(ngDevMode ? [{ debugName: "title" }] : []));
1508
2189
  message = input(...(ngDevMode ? [undefined, { debugName: "message" }] : []));
@@ -1522,15 +2203,24 @@ class AlertContentComponent {
1522
2203
  onCancel() {
1523
2204
  this.modalService.closeCurrentModal(false);
1524
2205
  }
1525
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AlertContentComponent, deps: [{ token: ModalService }], target: i0.ɵɵFactoryTarget.Component });
1526
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: AlertContentComponent, isStandalone: true, selector: "st-alert-content", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, affirmativeButton: { classPropertyName: "affirmativeButton", publicName: "affirmativeButton", isSignal: true, isRequired: true, transformFunction: null }, cancelButton: { classPropertyName: "cancelButton", publicName: "cancelButton", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"alert-content\">\n @if (icon() !== undefined) {\n <st-avatar size=\"lg\" [stTheme]=\"theme()\">\n <st-icon [name]=\"computedIcon()\"></st-icon>\n </st-avatar>\n }\n\n <p class=\"alert-title\">{{ title() }}</p>\n @if (message()) {\n <p class=\"alert-message\">{{ message() }}</p>\n }\n</div>\n<st-button-group justification=\"expand\">\n @if (cancelButton()) {\n <button stButton (click)=\"onCancel()\">{{ cancelButton() }}</button>\n }\n <button stButton [stTheme]=\"theme()\" variant=\"primary\" (click)=\"onAffirmation()\">{{ affirmativeButton() }}</button>\n</st-button-group>\n", dependencies: [{ kind: "component", type: AvatarComponent, selector: "st-avatar", inputs: ["text", "size"], outputs: ["sizeChange"] }, { kind: "component", type: IconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: ThemeDirective, selector: "[stTheme]", inputs: ["stTheme"] }, { kind: "component", type: ButtonGroupComponent, selector: "st-button-group", inputs: ["justification"] }, { kind: "directive", type: ButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
2206
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAlertContentComponent, deps: [{ token: ModalService }], target: i0.ɵɵFactoryTarget.Component });
2207
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataAlertContentComponent, isStandalone: true, selector: "st-alert-content", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, affirmativeButton: { classPropertyName: "affirmativeButton", publicName: "affirmativeButton", isSignal: true, isRequired: true, transformFunction: null }, cancelButton: { classPropertyName: "cancelButton", publicName: "cancelButton", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"alert-content\">\n @if (icon() !== undefined) {\n <st-avatar size=\"lg\" [stTheme]=\"theme()\">\n <st-icon [name]=\"computedIcon()\"></st-icon>\n </st-avatar>\n }\n\n <p class=\"alert-title\">{{ title() }}</p>\n @if (message()) {\n <p class=\"alert-message\">{{ message() }}</p>\n }\n</div>\n<st-button-group justification=\"expand\">\n @if (cancelButton()) {\n <button stButton (click)=\"onCancel()\">{{ cancelButton() }}</button>\n }\n <button stButton [stTheme]=\"theme()\" variant=\"primary\" (click)=\"onAffirmation()\">{{ affirmativeButton() }}</button>\n</st-button-group>\n", dependencies: [{ kind: "component", type: StrataAvatarComponent, selector: "st-avatar", inputs: ["text", "size"], outputs: ["sizeChange"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataThemeDirective, selector: "[stTheme]", inputs: ["stTheme"] }, { kind: "component", type: StrataButtonGroupComponent, selector: "st-button-group", inputs: ["justification"] }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
1527
2208
  }
1528
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AlertContentComponent, decorators: [{
2209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataAlertContentComponent, decorators: [{
1529
2210
  type: Component,
1530
- args: [{ selector: 'st-alert-content', imports: [AvatarComponent, IconComponent, ThemeDirective, ButtonGroupComponent, ButtonDirective], template: "<div class=\"alert-content\">\n @if (icon() !== undefined) {\n <st-avatar size=\"lg\" [stTheme]=\"theme()\">\n <st-icon [name]=\"computedIcon()\"></st-icon>\n </st-avatar>\n }\n\n <p class=\"alert-title\">{{ title() }}</p>\n @if (message()) {\n <p class=\"alert-message\">{{ message() }}</p>\n }\n</div>\n<st-button-group justification=\"expand\">\n @if (cancelButton()) {\n <button stButton (click)=\"onCancel()\">{{ cancelButton() }}</button>\n }\n <button stButton [stTheme]=\"theme()\" variant=\"primary\" (click)=\"onAffirmation()\">{{ affirmativeButton() }}</button>\n</st-button-group>\n" }]
2211
+ args: [{ selector: 'st-alert-content', imports: [
2212
+ StrataAvatarComponent,
2213
+ StrataIconComponent,
2214
+ StrataThemeDirective,
2215
+ StrataButtonGroupComponent,
2216
+ StrataButtonDirective,
2217
+ ], template: "<div class=\"alert-content\">\n @if (icon() !== undefined) {\n <st-avatar size=\"lg\" [stTheme]=\"theme()\">\n <st-icon [name]=\"computedIcon()\"></st-icon>\n </st-avatar>\n }\n\n <p class=\"alert-title\">{{ title() }}</p>\n @if (message()) {\n <p class=\"alert-message\">{{ message() }}</p>\n }\n</div>\n<st-button-group justification=\"expand\">\n @if (cancelButton()) {\n <button stButton (click)=\"onCancel()\">{{ cancelButton() }}</button>\n }\n <button stButton [stTheme]=\"theme()\" variant=\"primary\" (click)=\"onAffirmation()\">{{ affirmativeButton() }}</button>\n</st-button-group>\n" }]
1531
2218
  }], ctorParameters: () => [{ type: ModalService }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], affirmativeButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "affirmativeButton", required: true }] }], cancelButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelButton", required: false }] }] } });
1532
2219
 
1533
- class ModalHeaderComponent {
2220
+ class StrataModalRef {
2221
+ }
2222
+
2223
+ class StrataModalHeaderComponent {
1534
2224
  modalService = inject(ModalService);
1535
2225
  title = input(null, ...(ngDevMode ? [{ debugName: "title" }] : []));
1536
2226
  showCloseButton = input(true, ...(ngDevMode ? [{ debugName: "showCloseButton" }] : []));
@@ -1538,15 +2228,17 @@ class ModalHeaderComponent {
1538
2228
  this.modalService.closeCurrentModal();
1539
2229
  event.stopPropagation();
1540
2230
  }
1541
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ModalHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1542
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ModalHeaderComponent, isStandalone: true, selector: "st-modal-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (title()) {\n <h3>{{ title() }}</h3>\n}\n@if (showCloseButton()) {\n <button stButton (click)=\"onCloseButtonClicked($event)\" variant=\"ghost\">\n <st-icon name=\"close\" size=\"sm\"></st-icon>\n </button>\n}\n", dependencies: [{ kind: "directive", type: ButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }, { kind: "component", type: IconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }] });
2231
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataModalHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2232
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataModalHeaderComponent, isStandalone: true, selector: "st-modal-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (title()) {\n<span class=\"st-body-l-bold\">{{ title() }}</span>\n}\n@if (showCloseButton()) {\n<button stButton (click)=\"onCloseButtonClicked($event)\" variant=\"ghost\">\n <st-icon name=\"close\" size=\"sm\"></st-icon>\n</button>\n}", dependencies: [{ kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }] });
1543
2233
  }
1544
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ModalHeaderComponent, decorators: [{
2234
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataModalHeaderComponent, decorators: [{
1545
2235
  type: Component,
1546
- args: [{ selector: 'st-modal-header', imports: [ButtonDirective, IconComponent, ButtonDirective], template: "@if (title()) {\n <h3>{{ title() }}</h3>\n}\n@if (showCloseButton()) {\n <button stButton (click)=\"onCloseButtonClicked($event)\" variant=\"ghost\">\n <st-icon name=\"close\" size=\"sm\"></st-icon>\n </button>\n}\n" }]
2236
+ args: [{ selector: 'st-modal-header', imports: [StrataButtonDirective, StrataIconComponent], template: "@if (title()) {\n<span class=\"st-body-l-bold\">{{ title() }}</span>\n}\n@if (showCloseButton()) {\n<button stButton (click)=\"onCloseButtonClicked($event)\" variant=\"ghost\">\n <st-icon name=\"close\" size=\"sm\"></st-icon>\n</button>\n}" }]
1547
2237
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], showCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCloseButton", required: false }] }] } });
1548
2238
 
1549
- class ModalComponent {
2239
+ class StrataModalComponent {
2240
+ modalService = inject(ModalService);
2241
+ injector = inject(Injector);
1550
2242
  modalContents = viewChild.required('modalBody', {
1551
2243
  read: ViewContainerRef,
1552
2244
  });
@@ -1559,7 +2251,16 @@ class ModalComponent {
1559
2251
  if (this.size() === undefined) {
1560
2252
  this.size.set('md');
1561
2253
  }
1562
- const injectedComponent = this.modalContents().createComponent(this.configuration().component);
2254
+ const modalRef = {
2255
+ close: (value) => this.modalService.close(this.configuration(), value),
2256
+ };
2257
+ const customInjector = Injector.create({
2258
+ providers: [{ provide: StrataModalRef, useValue: modalRef }],
2259
+ parent: this.injector,
2260
+ });
2261
+ const injectedComponent = this.modalContents().createComponent(this.configuration().component, {
2262
+ injector: customInjector,
2263
+ });
1563
2264
  if (this.configuration().inputs) {
1564
2265
  this.setInputsOnInjectedComponent(injectedComponent, this.configuration().inputs);
1565
2266
  }
@@ -1572,12 +2273,12 @@ class ModalComponent {
1572
2273
  onCardClick(event) {
1573
2274
  event.stopPropagation();
1574
2275
  }
1575
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1576
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ModalComponent, isStandalone: true, selector: "st-modal", inputs: { configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { size: "sizeChange" }, host: { properties: { "class": "this.sizeClass" } }, viewQueries: [{ propertyName: "modalContents", first: true, predicate: ["modalBody"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: "@if (configuration().title || !configuration().hideCloseButton) {\n <st-modal-header\n [title]=\"configuration().title\"\n [showCloseButton]=\"configuration().hideCloseButton === true ? false : true\"\n (click)=\"onCardClick($event)\"></st-modal-header>\n}\n\n<div class=\"modal-content\">\n <ng-template #modalBody></ng-template>\n</div>\n", dependencies: [{ kind: "component", type: ModalHeaderComponent, selector: "st-modal-header", inputs: ["title", "showCloseButton"] }] });
2276
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2277
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataModalComponent, isStandalone: true, selector: "st-modal", inputs: { configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { size: "sizeChange" }, host: { properties: { "class": "this.sizeClass" } }, viewQueries: [{ propertyName: "modalContents", first: true, predicate: ["modalBody"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: "@if (configuration().title || !configuration().hideCloseButton) {\n <st-modal-header\n [title]=\"configuration().title\"\n [showCloseButton]=\"configuration().hideCloseButton === true ? false : true\"\n (click)=\"onCardClick($event)\"></st-modal-header>\n}\n\n<div class=\"modal-content\">\n <ng-template #modalBody></ng-template>\n</div>\n", dependencies: [{ kind: "component", type: StrataModalHeaderComponent, selector: "st-modal-header", inputs: ["title", "showCloseButton"] }] });
1577
2278
  }
1578
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ModalComponent, decorators: [{
2279
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataModalComponent, decorators: [{
1579
2280
  type: Component,
1580
- args: [{ selector: 'st-modal', imports: [ModalHeaderComponent], template: "@if (configuration().title || !configuration().hideCloseButton) {\n <st-modal-header\n [title]=\"configuration().title\"\n [showCloseButton]=\"configuration().hideCloseButton === true ? false : true\"\n (click)=\"onCardClick($event)\"></st-modal-header>\n}\n\n<div class=\"modal-content\">\n <ng-template #modalBody></ng-template>\n</div>\n" }]
2281
+ args: [{ selector: 'st-modal', imports: [StrataModalHeaderComponent], template: "@if (configuration().title || !configuration().hideCloseButton) {\n <st-modal-header\n [title]=\"configuration().title\"\n [showCloseButton]=\"configuration().hideCloseButton === true ? false : true\"\n (click)=\"onCardClick($event)\"></st-modal-header>\n}\n\n<div class=\"modal-content\">\n <ng-template #modalBody></ng-template>\n</div>\n" }]
1581
2282
  }], propDecorators: { modalContents: [{ type: i0.ViewChild, args: ['modalBody', { ...{
1582
2283
  read: ViewContainerRef,
1583
2284
  }, isSignal: true }] }], configuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "configuration", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }, { type: i0.Output, args: ["sizeChange"] }], sizeClass: [{
@@ -1585,38 +2286,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1585
2286
  args: ['class']
1586
2287
  }] } });
1587
2288
 
1588
- class ModalContainerComponent {
2289
+ class StrataModalContainerComponent {
1589
2290
  modalService;
1590
- injectedComponent;
1591
- currentModal = null;
1592
- stack = new Stack();
1593
- subscription;
1594
2291
  constructor(modalService) {
1595
2292
  this.modalService = modalService;
1596
- this.subscription = this.modalService['currentModals'].asObservable().subscribe((modalStack) => {
1597
- this.stack = modalStack;
1598
- });
1599
- }
1600
- ngOnDestroy() {
1601
- this.subscription.unsubscribe();
1602
2293
  }
1603
2294
  onBackdropClick(event) {
1604
2295
  event.stopPropagation();
1605
- const currentModal = this.stack.peek();
1606
- if (currentModal.disableBackdropClosure) {
2296
+ const modals = this.modalService.modals();
2297
+ const currentModal = modals[modals.length - 1];
2298
+ if (!currentModal || currentModal.disableBackdropClosure) {
1607
2299
  return;
1608
2300
  }
1609
2301
  this.modalService.closeCurrentModal();
1610
2302
  }
1611
- stackTrack(index, item) {
1612
- return item.id;
1613
- }
1614
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ModalContainerComponent, deps: [{ token: ModalService }], target: i0.ɵɵFactoryTarget.Component });
1615
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ModalContainerComponent, isStandalone: true, selector: "st-modal-container", ngImport: i0, template: "<div class=\"modal-wrapper\">\n @for (modal of stack.items; track modal.id; let last = $last) {\n <st-modal [ngClass]=\"{ 'hidden-under-other-modal': !last }\" [configuration]=\"modal\" [size]=\"modal.size\"> </st-modal>\n }\n</div>\n@if (!stack.empty()) {\n <div class=\"st-internal-backdrop active\" (click)=\"onBackdropClick($event)\"></div>\n}\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "st-modal", inputs: ["configuration", "size"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
2303
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataModalContainerComponent, deps: [{ token: ModalService }], target: i0.ɵɵFactoryTarget.Component });
2304
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataModalContainerComponent, isStandalone: true, selector: "st-modal-container", ngImport: i0, template: "<div class=\"modal-wrapper\">\n @for (modal of modalService.modals(); track modal; let last = $last) {\n <st-modal [ngClass]=\"{ 'hidden-under-other-modal': !last }\" [configuration]=\"modal\" [size]=\"modal.size\"> </st-modal>\n }\n</div>\n@if (modalService.modals().length > 0) {\n <div class=\"st-internal-backdrop active\" (click)=\"onBackdropClick($event)\"></div>\n}\n", dependencies: [{ kind: "component", type: StrataModalComponent, selector: "st-modal", inputs: ["configuration", "size"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
1616
2305
  }
1617
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ModalContainerComponent, decorators: [{
2306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataModalContainerComponent, decorators: [{
1618
2307
  type: Component,
1619
- args: [{ selector: 'st-modal-container', imports: [ModalComponent, CommonModule], template: "<div class=\"modal-wrapper\">\n @for (modal of stack.items; track modal.id; let last = $last) {\n <st-modal [ngClass]=\"{ 'hidden-under-other-modal': !last }\" [configuration]=\"modal\" [size]=\"modal.size\"> </st-modal>\n }\n</div>\n@if (!stack.empty()) {\n <div class=\"st-internal-backdrop active\" (click)=\"onBackdropClick($event)\"></div>\n}\n" }]
2308
+ args: [{ selector: 'st-modal-container', imports: [StrataModalComponent, CommonModule], template: "<div class=\"modal-wrapper\">\n @for (modal of modalService.modals(); track modal; let last = $last) {\n <st-modal [ngClass]=\"{ 'hidden-under-other-modal': !last }\" [configuration]=\"modal\" [size]=\"modal.size\"> </st-modal>\n }\n</div>\n@if (modalService.modals().length > 0) {\n <div class=\"st-internal-backdrop active\" (click)=\"onBackdropClick($event)\"></div>\n}\n" }]
1620
2309
  }], ctorParameters: () => [{ type: ModalService }] });
1621
2310
 
1622
2311
  const DEFAULT_THEME = 'info';
@@ -1628,14 +2317,16 @@ class NotificationService {
1628
2317
  const newNotificationId = crypto.randomUUID();
1629
2318
  const duration = config.duration ?? DEFAULT_DURATION;
1630
2319
  const currentStack = this.notificationStack();
1631
- currentStack.push({
1632
- id: newNotificationId,
1633
- message: config.message,
1634
- duration: duration,
1635
- theme: config.theme ?? DEFAULT_THEME,
1636
- icon: config.icon,
1637
- });
1638
- this.notificationStack.set(currentStack);
2320
+ this.notificationStack.set([
2321
+ ...currentStack,
2322
+ {
2323
+ id: newNotificationId,
2324
+ message: config.message,
2325
+ duration: duration,
2326
+ theme: config.theme ?? DEFAULT_THEME,
2327
+ icon: config.icon,
2328
+ }
2329
+ ]);
1639
2330
  this.hideNotification(newNotificationId, duration);
1640
2331
  }
1641
2332
  hideNotification(notificationId, duration) {
@@ -1654,34 +2345,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1654
2345
  }]
1655
2346
  }] });
1656
2347
 
1657
- class NotificationComponent {
2348
+ class StrataNotificationComponent {
1658
2349
  icon;
1659
2350
  message;
1660
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NotificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1661
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: NotificationComponent, isStandalone: true, selector: "st-notification", inputs: { icon: "icon", message: "message" }, ngImport: i0, template: "@if (icon) {\n <st-icon [name]=\"icon\"></st-icon>\n}\n{{ message }}\n", dependencies: [{ kind: "component", type: IconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }] });
2351
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataNotificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2352
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataNotificationComponent, isStandalone: true, selector: "st-notification", inputs: { icon: "icon", message: "message" }, ngImport: i0, template: "@if (icon) {\n <st-icon [name]=\"icon\"></st-icon>\n}\n{{ message }}\n", dependencies: [{ kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size"], outputs: ["sizeChange"] }] });
1662
2353
  }
1663
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NotificationComponent, decorators: [{
2354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataNotificationComponent, decorators: [{
1664
2355
  type: Component,
1665
- args: [{ selector: 'st-notification', imports: [IconComponent], template: "@if (icon) {\n <st-icon [name]=\"icon\"></st-icon>\n}\n{{ message }}\n" }]
2356
+ args: [{ selector: 'st-notification', imports: [StrataIconComponent], template: "@if (icon) {\n <st-icon [name]=\"icon\"></st-icon>\n}\n{{ message }}\n" }]
1666
2357
  }], propDecorators: { icon: [{
1667
2358
  type: Input
1668
2359
  }], message: [{
1669
2360
  type: Input
1670
2361
  }] } });
1671
2362
 
1672
- class NotificationContainerComponent {
2363
+ class StrataNotificationContainerComponent {
1673
2364
  notificationService = inject(NotificationService);
1674
2365
  notifications = this.notificationService.notificationStack;
1675
- constructor() { }
1676
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NotificationContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1677
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: NotificationContainerComponent, isStandalone: true, selector: "st-notification-container", ngImport: i0, template: "@for (notification of notifications(); track notification.id) {\n <st-notification [icon]=\"notification.icon\" [message]=\"notification.message\" [stTheme]=\"notification.theme ?? 'info'\">\n </st-notification>\n}\n", dependencies: [{ kind: "component", type: NotificationComponent, selector: "st-notification", inputs: ["icon", "message"] }, { kind: "directive", type: ThemeDirective, selector: "[stTheme]", inputs: ["stTheme"] }] });
2366
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataNotificationContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2367
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataNotificationContainerComponent, isStandalone: true, selector: "st-notification-container", ngImport: i0, template: "@for (notification of notifications(); track notification.id) {\n <st-notification [icon]=\"notification.icon\" [message]=\"notification.message\" [stTheme]=\"notification.theme ?? 'info'\">\n </st-notification>\n}\n", dependencies: [{ kind: "component", type: StrataNotificationComponent, selector: "st-notification", inputs: ["icon", "message"] }, { kind: "directive", type: StrataThemeDirective, selector: "[stTheme]", inputs: ["stTheme"] }] });
1678
2368
  }
1679
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NotificationContainerComponent, decorators: [{
2369
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataNotificationContainerComponent, decorators: [{
1680
2370
  type: Component,
1681
- args: [{ selector: 'st-notification-container', imports: [NotificationComponent, ThemeDirective], template: "@for (notification of notifications(); track notification.id) {\n <st-notification [icon]=\"notification.icon\" [message]=\"notification.message\" [stTheme]=\"notification.theme ?? 'info'\">\n </st-notification>\n}\n" }]
1682
- }], ctorParameters: () => [] });
2371
+ args: [{ selector: 'st-notification-container', imports: [StrataNotificationComponent, StrataThemeDirective], template: "@for (notification of notifications(); track notification.id) {\n <st-notification [icon]=\"notification.icon\" [message]=\"notification.message\" [stTheme]=\"notification.theme ?? 'info'\">\n </st-notification>\n}\n" }]
2372
+ }] });
1683
2373
 
1684
- class NumberDisplayComponent {
2374
+ class StrataNumberDisplayComponent {
1685
2375
  locale = inject(LOCALE_ID);
1686
2376
  value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
1687
2377
  decimals = input(2, ...(ngDevMode ? [{ debugName: "decimals" }] : []));
@@ -1700,14 +2390,39 @@ class NumberDisplayComponent {
1700
2390
  showPlus = input(false, ...(ngDevMode ? [{ debugName: "showPlus" }] : []));
1701
2391
  deemphasizeDecimals = input(true, ...(ngDevMode ? [{ debugName: "deemphasizeDecimals" }] : []));
1702
2392
  decimalPoint = computed(() => getLocaleNumberSymbol(this.locale, NumberSymbol.Decimal), ...(ngDevMode ? [{ debugName: "decimalPoint" }] : []));
1703
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NumberDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1704
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: NumberDisplayComponent, isStandalone: true, selector: "st-number-display", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, decimals: { classPropertyName: "decimals", publicName: "decimals", isSignal: true, isRequired: false, transformFunction: null }, changedValue: { classPropertyName: "changedValue", publicName: "changedValue", isSignal: true, isRequired: false, transformFunction: null }, showPlus: { classPropertyName: "showPlus", publicName: "showPlus", isSignal: true, isRequired: false, transformFunction: null }, deemphasizeDecimals: { classPropertyName: "deemphasizeDecimals", publicName: "deemphasizeDecimals", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<p\n [ngClass]=\"{\n positive: changedValue() && value() > 0,\n negative: changedValue() && value() < 0,\n }\"\n>\n @if (showPlus() && this.value() > 0) {\n +\n }\n <span class=\"integer-value\">{{ separatedDigits().integer }}</span>\n @if (separatedDigits().decimals) {\n <span\n class=\"decimal-number\"\n [ngClass]=\"{ deemphasize: deemphasizeDecimals }\"\n >{{ decimalPoint() }}{{ separatedDigits().decimals }}</span\n >\n }\n</p>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
2393
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataNumberDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2394
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataNumberDisplayComponent, isStandalone: true, selector: "st-number-display", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, decimals: { classPropertyName: "decimals", publicName: "decimals", isSignal: true, isRequired: false, transformFunction: null }, changedValue: { classPropertyName: "changedValue", publicName: "changedValue", isSignal: true, isRequired: false, transformFunction: null }, showPlus: { classPropertyName: "showPlus", publicName: "showPlus", isSignal: true, isRequired: false, transformFunction: null }, deemphasizeDecimals: { classPropertyName: "deemphasizeDecimals", publicName: "deemphasizeDecimals", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<p\n [ngClass]=\"{\n positive: changedValue() && value() > 0,\n negative: changedValue() && value() < 0,\n }\"\n>\n @if (showPlus() && this.value() > 0) {\n +\n }\n <span class=\"integer-value\">{{ separatedDigits().integer }}</span>\n @if (separatedDigits().decimals) {\n <span\n class=\"decimal-number\"\n [ngClass]=\"{ deemphasize: deemphasizeDecimals }\"\n >{{ decimalPoint() }}{{ separatedDigits().decimals }}</span\n >\n }\n</p>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
1705
2395
  }
1706
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NumberDisplayComponent, decorators: [{
2396
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataNumberDisplayComponent, decorators: [{
1707
2397
  type: Component,
1708
2398
  args: [{ selector: 'st-number-display', imports: [CommonModule], template: "<p\n [ngClass]=\"{\n positive: changedValue() && value() > 0,\n negative: changedValue() && value() < 0,\n }\"\n>\n @if (showPlus() && this.value() > 0) {\n +\n }\n <span class=\"integer-value\">{{ separatedDigits().integer }}</span>\n @if (separatedDigits().decimals) {\n <span\n class=\"decimal-number\"\n [ngClass]=\"{ deemphasize: deemphasizeDecimals }\"\n >{{ decimalPoint() }}{{ separatedDigits().decimals }}</span\n >\n }\n</p>\n" }]
1709
2399
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], decimals: [{ type: i0.Input, args: [{ isSignal: true, alias: "decimals", required: false }] }], changedValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "changedValue", required: false }] }], showPlus: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPlus", required: false }] }], deemphasizeDecimals: [{ type: i0.Input, args: [{ isSignal: true, alias: "deemphasizeDecimals", required: false }] }] } });
1710
2400
 
2401
+ class StrataShellComponent {
2402
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2403
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", type: StrataShellComponent, isStandalone: true, selector: "st-shell", ngImport: i0, template: "<st-notification-container></st-notification-container>\n<st-modal-container></st-modal-container>\n<ng-content></ng-content>", dependencies: [{ kind: "component", type: StrataModalContainerComponent, selector: "st-modal-container" }, { kind: "component", type: StrataNotificationContainerComponent, selector: "st-notification-container" }] });
2404
+ }
2405
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataShellComponent, decorators: [{
2406
+ type: Component,
2407
+ args: [{ selector: 'st-shell', imports: [StrataModalContainerComponent, StrataNotificationContainerComponent], template: "<st-notification-container></st-notification-container>\n<st-modal-container></st-modal-container>\n<ng-content></ng-content>" }]
2408
+ }] });
2409
+
2410
+ class StrataMessageStateComponent {
2411
+ header = input.required(...(ngDevMode ? [{ debugName: "header" }] : []));
2412
+ subtitle = input(undefined, ...(ngDevMode ? [{ debugName: "subtitle" }] : []));
2413
+ primaryActionText = input(undefined, ...(ngDevMode ? [{ debugName: "primaryActionText" }] : []));
2414
+ primaryActionTheme = input(undefined, ...(ngDevMode ? [{ debugName: "primaryActionTheme" }] : []));
2415
+ secondaryActionText = input(undefined, ...(ngDevMode ? [{ debugName: "secondaryActionText" }] : []));
2416
+ primaryAction = output();
2417
+ secondaryAction = output();
2418
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataMessageStateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2419
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: StrataMessageStateComponent, isStandalone: true, selector: "st-message-state", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, primaryActionText: { classPropertyName: "primaryActionText", publicName: "primaryActionText", isSignal: true, isRequired: false, transformFunction: null }, primaryActionTheme: { classPropertyName: "primaryActionTheme", publicName: "primaryActionTheme", isSignal: true, isRequired: false, transformFunction: null }, secondaryActionText: { classPropertyName: "secondaryActionText", publicName: "secondaryActionText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { primaryAction: "primaryAction", secondaryAction: "secondaryAction" }, ngImport: i0, template: "<div class=\"st-message-state-graphic\">\n <ng-content></ng-content>\n</div>\n\n<st-text-stack>\n <h3 class=\"st-message-state-header\">{{ header() }}</h3>\n @if (subtitle()) {\n <p class=\"st-message-state-subtitle\">{{ subtitle() }}</p>\n }\n</st-text-stack>\n\n@if (primaryActionText() || secondaryActionText()) {\n <div class=\"st-message-state-actions\">\n @if (secondaryActionText()) {\n <button \n stButton \n variant=\"secondary\" \n (click)=\"secondaryAction.emit()\">\n {{ secondaryActionText() }}\n </button>\n }\n @if (primaryActionText()) {\n <button \n stButton \n variant=\"primary\" \n [stTheme]=\"primaryActionTheme() || 'default'\" \n (click)=\"primaryAction.emit()\">\n {{ primaryActionText() }}\n </button>\n }\n </div>\n}\n", styles: [":host{--st-message-state-align-items: center;--st-message-state-text-align: center;--st-message-state-gap: var(--st-size-lg, 32px);--st-message-state-content-gap: var(--st-size-xxs, 8px);--st-message-state-actions-gap: var(--st-size-sm, 16px);--st-message-state-padding: var(--st-size-lg, 32px);display:flex;flex-direction:column;align-items:var(--st-message-state-align-items);text-align:var(--st-message-state-text-align);gap:var(--st-message-state-gap);padding:var(--st-message-state-padding);width:100%;box-sizing:border-box}.st-message-state-graphic{display:flex;justify-content:center;align-items:center}.st-message-state-content{display:flex;flex-direction:column;align-items:var(--st-message-state-align-items);gap:var(--st-message-state-content-gap);width:100%}.st-message-state-header{color:var(--st-color-text-primary);margin:0}.st-message-state-subtitle{color:var(--st-color-text-secondary);margin:0}.st-message-state-actions{display:flex;justify-content:center;gap:var(--st-message-state-actions-gap)}\n"], dependencies: [{ kind: "component", type: StrataTextStackComponent, selector: "st-text-stack", inputs: ["overflow"] }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }, { kind: "directive", type: StrataThemeDirective, selector: "[stTheme]", inputs: ["stTheme"] }] });
2420
+ }
2421
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StrataMessageStateComponent, decorators: [{
2422
+ type: Component,
2423
+ args: [{ selector: 'st-message-state', imports: [StrataTextStackComponent, StrataButtonDirective, StrataThemeDirective], template: "<div class=\"st-message-state-graphic\">\n <ng-content></ng-content>\n</div>\n\n<st-text-stack>\n <h3 class=\"st-message-state-header\">{{ header() }}</h3>\n @if (subtitle()) {\n <p class=\"st-message-state-subtitle\">{{ subtitle() }}</p>\n }\n</st-text-stack>\n\n@if (primaryActionText() || secondaryActionText()) {\n <div class=\"st-message-state-actions\">\n @if (secondaryActionText()) {\n <button \n stButton \n variant=\"secondary\" \n (click)=\"secondaryAction.emit()\">\n {{ secondaryActionText() }}\n </button>\n }\n @if (primaryActionText()) {\n <button \n stButton \n variant=\"primary\" \n [stTheme]=\"primaryActionTheme() || 'default'\" \n (click)=\"primaryAction.emit()\">\n {{ primaryActionText() }}\n </button>\n }\n </div>\n}\n", styles: [":host{--st-message-state-align-items: center;--st-message-state-text-align: center;--st-message-state-gap: var(--st-size-lg, 32px);--st-message-state-content-gap: var(--st-size-xxs, 8px);--st-message-state-actions-gap: var(--st-size-sm, 16px);--st-message-state-padding: var(--st-size-lg, 32px);display:flex;flex-direction:column;align-items:var(--st-message-state-align-items);text-align:var(--st-message-state-text-align);gap:var(--st-message-state-gap);padding:var(--st-message-state-padding);width:100%;box-sizing:border-box}.st-message-state-graphic{display:flex;justify-content:center;align-items:center}.st-message-state-content{display:flex;flex-direction:column;align-items:var(--st-message-state-align-items);gap:var(--st-message-state-content-gap);width:100%}.st-message-state-header{color:var(--st-color-text-primary);margin:0}.st-message-state-subtitle{color:var(--st-color-text-secondary);margin:0}.st-message-state-actions{display:flex;justify-content:center;gap:var(--st-message-state-actions-gap)}\n"] }]
2424
+ }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], primaryActionText: [{ type: i0.Input, args: [{ isSignal: true, alias: "primaryActionText", required: false }] }], primaryActionTheme: [{ type: i0.Input, args: [{ isSignal: true, alias: "primaryActionTheme", required: false }] }], secondaryActionText: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondaryActionText", required: false }] }], primaryAction: [{ type: i0.Output, args: ["primaryAction"] }], secondaryAction: [{ type: i0.Output, args: ["secondaryAction"] }] } });
2425
+
1711
2426
  /*
1712
2427
  * Public API Surface of ngx-strata
1713
2428
  */
@@ -1716,5 +2431,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1716
2431
  * Generated bundle index. Do not edit.
1717
2432
  */
1718
2433
 
1719
- export { AccordionGroupComponent, AccordionItemComponent, ActionMenuComponent, ActionMenuItemComponent, AlertContentComponent, AutoResizeDirective, AvatarComponent, AvatarStackComponent, ButtonDirective, ButtonGroupComponent, CapitalizePipe, CardComponent, CheckboxComponent, DEFAULT_DURATION, DEFAULT_THEME, DarkmodeService, DividerComponent, DropdownComponent, HttpIconLoader, IconComponent, IconLoader, IconRegistry, IconRegistryService, InputFieldComponent, ItemComponent, ItemListComponent, ModalComponent, ModalContainerComponent, ModalHeaderComponent, ModalService, NativeInputRefDirective, NotificationComponent, NotificationContainerComponent, NotificationService, NumberDisplayComponent, OverlayDirective, PaginationComponent, ProgressComponent, STRATA_CONFIG, SegmentedControlComponent, SegmentedControlItemComponent, SliderComponent, SpinnerComponent, TagComponent, TextStackComponent, ThemeDirective, ToggleComponent, TooltipDirective, provideBaseIcons, provideIcons, provideStrata };
2434
+ export { CapitalizePipe, DEFAULT_DURATION, DEFAULT_THEME, DarkmodeService, HotkeyService, HttpIconLoader, IconLoader, IconRegistry, IconRegistryService, ModalService, NotificationService, STRATA_CONFIG, StrataAccordionGroupComponent, StrataAccordionItemComponent, StrataActionMenuComponent, StrataActionMenuItemComponent, StrataActivatableDirective, StrataAlertComponent, StrataAlertContentComponent, StrataAutoResizeDirective, StrataAvatarComponent, StrataAvatarStackComponent, StrataBreadcrumbComponent, StrataBreadcrumbItemComponent, StrataButtonDirective, StrataButtonGroupComponent, StrataCardComponent, StrataCheckboxComponent, StrataDividerComponent, StrataIconComponent, StrataInputFieldComponent, StrataItemComponent, StrataItemListComponent, StrataKbdComponent, StrataMessageStateComponent, StrataModalComponent, StrataModalContainerComponent, StrataModalHeaderComponent, StrataModalRef, StrataNativeInputRefDirective, StrataNotificationComponent, StrataNotificationContainerComponent, StrataNumberDisplayComponent, StrataOverlayDirective, StrataPaginationComponent, StrataProgressLinearComponent, StrataProgressRadialComponent, StrataRadioComponent, StrataRadioGroupComponent, StrataSegmentedControlComponent, StrataSegmentedControlItemComponent, StrataSelectItemComponent, StrataSelectTriggerDirective, StrataShellComponent, StrataSidemenuComponent, StrataSidemenuItemDirective, StrataSidemenuItemGroupComponent, StrataSidemenuSectionComponent, StrataSingleSelectComponent, StrataSliderComponent, StrataSpinnerComponent, StrataTabItemComponent, StrataTabsComponent, StrataTagComponent, StrataTextStackComponent, StrataThemeDirective, StrataToggleComponent, StrataTooltipDirective, provideBaseIcons, provideIcons, provideStrata };
1720
2435
  //# sourceMappingURL=ngx-strata.mjs.map