@truenas/ui-components 0.1.29 → 0.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, output, viewChild, signal, computed, effect, forwardRef, Component, model, afterNextRender, ChangeDetectionStrategy, Injectable, ViewEncapsulation, Directive, contentChildren, ViewContainerRef, contentChild, ChangeDetectorRef, HostListener, TemplateRef, IterableDiffers, Pipe, PLATFORM_ID, DestroyRef } from '@angular/core';
2
+ import { inject, ElementRef, input, output, viewChild, signal, computed, effect, forwardRef, Component, model, afterNextRender, ChangeDetectionStrategy, Injectable, ViewEncapsulation, Directive, contentChildren, ViewContainerRef, contentChild, ChangeDetectorRef, HostListener, TemplateRef, IterableDiffers, Pipe, ApplicationRef, EnvironmentInjector, createComponent, PLATFORM_ID, DestroyRef } from '@angular/core';
3
3
  import * as i1$4 from '@angular/forms';
4
4
  import { NG_VALUE_ACCESSOR, FormsModule, NgControl } from '@angular/forms';
5
5
  import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
@@ -4148,8 +4148,13 @@ class TnFormFieldComponent {
4148
4148
  if (errors['max']) {
4149
4149
  return `Maximum value is ${errors['max'].max}`;
4150
4150
  }
4151
- // Return custom error message if available
4152
- return Object.keys(errors)[0] || 'Invalid input';
4151
+ // Return custom error message if the value is a string, otherwise use the key
4152
+ const firstKey = Object.keys(errors)[0];
4153
+ if (firstKey) {
4154
+ const value = errors[firstKey];
4155
+ return typeof value === 'string' ? value : firstKey;
4156
+ }
4157
+ return 'Invalid input';
4153
4158
  }
4154
4159
  showError = computed(() => {
4155
4160
  return this.hasError() && !!this.errorMessage();
@@ -10446,6 +10451,257 @@ class TnEmptyHarness extends ComponentHarness {
10446
10451
  }
10447
10452
  }
10448
10453
 
10454
+ var TnToastType;
10455
+ (function (TnToastType) {
10456
+ TnToastType["Info"] = "info";
10457
+ TnToastType["Success"] = "success";
10458
+ TnToastType["Warning"] = "warning";
10459
+ TnToastType["Error"] = "error";
10460
+ })(TnToastType || (TnToastType = {}));
10461
+ var TnToastPosition;
10462
+ (function (TnToastPosition) {
10463
+ TnToastPosition["Top"] = "top";
10464
+ TnToastPosition["Bottom"] = "bottom";
10465
+ })(TnToastPosition || (TnToastPosition = {}));
10466
+
10467
+ // Mark icons for sprite inclusion (dynamic names aren't detected by the scanner)
10468
+ const TOAST_ICONS = {
10469
+ [TnToastType.Info]: tnIconMarker('info', 'material'),
10470
+ [TnToastType.Success]: tnIconMarker('check_circle', 'material'),
10471
+ [TnToastType.Warning]: tnIconMarker('warning', 'material'),
10472
+ [TnToastType.Error]: tnIconMarker('error', 'material'),
10473
+ };
10474
+ class TnToastComponent {
10475
+ message = signal('', ...(ngDevMode ? [{ debugName: "message" }] : []));
10476
+ action = signal(null, ...(ngDevMode ? [{ debugName: "action" }] : []));
10477
+ type = signal(TnToastType.Info, ...(ngDevMode ? [{ debugName: "type" }] : []));
10478
+ position = signal(TnToastPosition.Bottom, ...(ngDevMode ? [{ debugName: "position" }] : []));
10479
+ visible = signal(false, ...(ngDevMode ? [{ debugName: "visible" }] : []));
10480
+ icon = computed(() => TOAST_ICONS[this.type()], ...(ngDevMode ? [{ debugName: "icon" }] : []));
10481
+ onAction = () => { };
10482
+ onDismiss = () => { };
10483
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TnToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10484
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: TnToastComponent, isStandalone: true, selector: "tn-toast", host: { properties: { "class.tn-toast--top": "position() === \"top\"", "class.tn-toast--bottom": "position() === \"bottom\"" } }, ngImport: i0, template: "<div\n class=\"tn-toast\"\n role=\"alert\"\n aria-live=\"polite\"\n [class.tn-toast--visible]=\"visible()\"\n [class.tn-toast--info]=\"type() === 'info'\"\n [class.tn-toast--success]=\"type() === 'success'\"\n [class.tn-toast--warning]=\"type() === 'warning'\"\n [class.tn-toast--error]=\"type() === 'error'\">\n <tn-icon class=\"tn-toast__icon\" size=\"sm\" [name]=\"icon()\" />\n <span class=\"tn-toast__message\">{{ message() }}</span>\n @if (action()) {\n <button\n class=\"tn-toast__action\"\n type=\"button\"\n (click)=\"onAction()\">\n {{ action() }}\n </button>\n }\n</div>\n", styles: ["tn-toast{position:fixed;left:50%;transform:translate(-50%);z-index:10000;pointer-events:none}tn-toast.tn-toast--bottom{bottom:1.5rem}tn-toast.tn-toast--top{top:1.5rem}.tn-toast{display:flex;align-items:center;gap:.75rem;padding:.75rem 1.25rem;border-radius:.5rem;font-family:var(--tn-font-family-body, \"Inter\"),sans-serif;font-size:.875rem;line-height:1.4;pointer-events:auto;background-color:var(--tn-bg2, #333);color:var(--tn-fg1, #fff);border-left:3px solid transparent;box-shadow:0 8px 24px #0000004d;opacity:0;transform:translateY(1rem);transition:opacity .2s ease-out,transform .2s ease-out;max-width:560px}.tn-toast.tn-toast--visible{opacity:1;transform:translateY(0)}.tn-toast.tn-toast--info{border-left-color:var(--tn-info, #3b82f6)}.tn-toast.tn-toast--success{border-left-color:var(--tn-success, #10b981)}.tn-toast.tn-toast--warning{border-left-color:var(--tn-warning, #f59e0b)}.tn-toast.tn-toast--error{border-left-color:var(--tn-error, #ef4444)}.tn-toast__icon{flex-shrink:0}.tn-toast--info .tn-toast__icon{color:var(--tn-info, #3b82f6)}.tn-toast--success .tn-toast__icon{color:var(--tn-success, #10b981)}.tn-toast--warning .tn-toast__icon{color:var(--tn-warning, #f59e0b)}.tn-toast--error .tn-toast__icon{color:var(--tn-error, #ef4444)}.tn-toast__message{flex:1}.tn-toast__action{background:none;border:none;color:var(--tn-primary, #3b82f6);font-family:inherit;font-size:.875rem;font-weight:600;cursor:pointer;padding:.25rem .5rem;border-radius:.25rem;white-space:nowrap;transition:background-color .15s ease}.tn-toast__action:hover{background-color:#ffffff1a}@media(prefers-reduced-motion:reduce){.tn-toast{transition:none}}\n"], dependencies: [{ kind: "component", type: TnIconComponent, selector: "tn-icon", inputs: ["name", "size", "color", "tooltip", "ariaLabel", "library", "fullSize", "customSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
10485
+ }
10486
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TnToastComponent, decorators: [{
10487
+ type: Component,
10488
+ args: [{ selector: 'tn-toast', standalone: true, imports: [TnIconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
10489
+ '[class.tn-toast--top]': 'position() === "top"',
10490
+ '[class.tn-toast--bottom]': 'position() === "bottom"',
10491
+ }, template: "<div\n class=\"tn-toast\"\n role=\"alert\"\n aria-live=\"polite\"\n [class.tn-toast--visible]=\"visible()\"\n [class.tn-toast--info]=\"type() === 'info'\"\n [class.tn-toast--success]=\"type() === 'success'\"\n [class.tn-toast--warning]=\"type() === 'warning'\"\n [class.tn-toast--error]=\"type() === 'error'\">\n <tn-icon class=\"tn-toast__icon\" size=\"sm\" [name]=\"icon()\" />\n <span class=\"tn-toast__message\">{{ message() }}</span>\n @if (action()) {\n <button\n class=\"tn-toast__action\"\n type=\"button\"\n (click)=\"onAction()\">\n {{ action() }}\n </button>\n }\n</div>\n", styles: ["tn-toast{position:fixed;left:50%;transform:translate(-50%);z-index:10000;pointer-events:none}tn-toast.tn-toast--bottom{bottom:1.5rem}tn-toast.tn-toast--top{top:1.5rem}.tn-toast{display:flex;align-items:center;gap:.75rem;padding:.75rem 1.25rem;border-radius:.5rem;font-family:var(--tn-font-family-body, \"Inter\"),sans-serif;font-size:.875rem;line-height:1.4;pointer-events:auto;background-color:var(--tn-bg2, #333);color:var(--tn-fg1, #fff);border-left:3px solid transparent;box-shadow:0 8px 24px #0000004d;opacity:0;transform:translateY(1rem);transition:opacity .2s ease-out,transform .2s ease-out;max-width:560px}.tn-toast.tn-toast--visible{opacity:1;transform:translateY(0)}.tn-toast.tn-toast--info{border-left-color:var(--tn-info, #3b82f6)}.tn-toast.tn-toast--success{border-left-color:var(--tn-success, #10b981)}.tn-toast.tn-toast--warning{border-left-color:var(--tn-warning, #f59e0b)}.tn-toast.tn-toast--error{border-left-color:var(--tn-error, #ef4444)}.tn-toast__icon{flex-shrink:0}.tn-toast--info .tn-toast__icon{color:var(--tn-info, #3b82f6)}.tn-toast--success .tn-toast__icon{color:var(--tn-success, #10b981)}.tn-toast--warning .tn-toast__icon{color:var(--tn-warning, #f59e0b)}.tn-toast--error .tn-toast__icon{color:var(--tn-error, #ef4444)}.tn-toast__message{flex:1}.tn-toast__action{background:none;border:none;color:var(--tn-primary, #3b82f6);font-family:inherit;font-size:.875rem;font-weight:600;cursor:pointer;padding:.25rem .5rem;border-radius:.25rem;white-space:nowrap;transition:background-color .15s ease}.tn-toast__action:hover{background-color:#ffffff1a}@media(prefers-reduced-motion:reduce){.tn-toast{transition:none}}\n"] }]
10492
+ }] });
10493
+
10494
+ class TnToastRef {
10495
+ _onAction = new Subject();
10496
+ _afterDismissed = new Subject();
10497
+ _dismissed = false;
10498
+ /** @internal */
10499
+ _componentRef;
10500
+ /** Observable that emits when the action button is clicked. */
10501
+ onAction() {
10502
+ return this._onAction.asObservable();
10503
+ }
10504
+ /** Observable that emits when the toast is dismissed (by action, duration, or programmatically). */
10505
+ afterDismissed() {
10506
+ return this._afterDismissed.asObservable();
10507
+ }
10508
+ /** Programmatically dismiss the toast. */
10509
+ dismiss() {
10510
+ if (this._dismissed) {
10511
+ return;
10512
+ }
10513
+ this._dismissed = true;
10514
+ this._afterDismissed.next();
10515
+ this._afterDismissed.complete();
10516
+ this._onAction.complete();
10517
+ }
10518
+ /** @internal */
10519
+ _triggerAction() {
10520
+ this._onAction.next();
10521
+ this.dismiss();
10522
+ }
10523
+ }
10524
+ class TnToastService {
10525
+ appRef = inject(ApplicationRef);
10526
+ injector = inject(EnvironmentInjector);
10527
+ activeRef = null;
10528
+ /**
10529
+ * Opens a toast notification.
10530
+ *
10531
+ * @param message The message to display.
10532
+ * @param actionOrConfig Optional action button text, or config object.
10533
+ * @param config Optional config when action is provided as second arg.
10534
+ * @returns A TnToastRef that can be used to dismiss the toast or listen for events.
10535
+ *
10536
+ * @example
10537
+ * ```typescript
10538
+ * // Simple notification
10539
+ * this.toast.open('Changes saved');
10540
+ *
10541
+ * // With action button
10542
+ * const ref = this.toast.open('Item deleted', 'Undo');
10543
+ * ref.onAction().subscribe(() => this.undoDelete());
10544
+ *
10545
+ * // With config
10546
+ * this.toast.open('Error occurred', { type: 'error', duration: 6000 });
10547
+ *
10548
+ * // Action + config
10549
+ * this.toast.open('Failed to save', 'Retry', { type: 'error' });
10550
+ * ```
10551
+ */
10552
+ open(message, actionOrConfig, config) {
10553
+ // Dismiss any existing toast
10554
+ if (this.activeRef) {
10555
+ this.activeRef.dismiss();
10556
+ }
10557
+ // Parse overloaded args
10558
+ let action;
10559
+ let resolvedConfig = {};
10560
+ if (typeof actionOrConfig === 'string') {
10561
+ action = actionOrConfig;
10562
+ resolvedConfig = config ?? {};
10563
+ }
10564
+ else if (actionOrConfig) {
10565
+ resolvedConfig = actionOrConfig;
10566
+ }
10567
+ const duration = resolvedConfig.duration ?? 4000;
10568
+ const type = resolvedConfig.type ?? TnToastType.Info;
10569
+ const position = resolvedConfig.position ?? TnToastPosition.Bottom;
10570
+ // Create ref
10571
+ const ref = new TnToastRef();
10572
+ this.activeRef = ref;
10573
+ // Create component
10574
+ const componentRef = createComponent(TnToastComponent, {
10575
+ environmentInjector: this.injector,
10576
+ });
10577
+ ref._componentRef = componentRef;
10578
+ const instance = componentRef.instance;
10579
+ instance.message.set(message);
10580
+ instance.action.set(action ?? null);
10581
+ instance.type.set(type);
10582
+ instance.position.set(position);
10583
+ instance.onAction = () => ref._triggerAction();
10584
+ instance.onDismiss = () => ref.dismiss();
10585
+ // Attach to DOM
10586
+ this.appRef.attachView(componentRef.hostView);
10587
+ document.body.appendChild(componentRef.location.nativeElement);
10588
+ // Animate in
10589
+ requestAnimationFrame(() => {
10590
+ instance.visible.set(true);
10591
+ });
10592
+ // Auto-dismiss
10593
+ let timeout = null;
10594
+ if (duration > 0) {
10595
+ timeout = setTimeout(() => ref.dismiss(), duration);
10596
+ }
10597
+ // Cleanup on dismiss
10598
+ ref.afterDismissed().subscribe(() => {
10599
+ if (timeout) {
10600
+ clearTimeout(timeout);
10601
+ }
10602
+ instance.visible.set(false);
10603
+ // Wait for animation to complete before removing
10604
+ setTimeout(() => {
10605
+ this.appRef.detachView(componentRef.hostView);
10606
+ componentRef.destroy();
10607
+ if (this.activeRef === ref) {
10608
+ this.activeRef = null;
10609
+ }
10610
+ }, 200);
10611
+ });
10612
+ return ref;
10613
+ }
10614
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TnToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10615
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TnToastService, providedIn: 'root' });
10616
+ }
10617
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TnToastService, decorators: [{
10618
+ type: Injectable,
10619
+ args: [{ providedIn: 'root' }]
10620
+ }] });
10621
+
10622
+ /**
10623
+ * A mock implementation of TnToastService for unit testing.
10624
+ *
10625
+ * Records all `open()` calls so tests can assert on toast messages,
10626
+ * types, and actions without rendering actual toast components.
10627
+ *
10628
+ * @example
10629
+ * ```typescript
10630
+ * import { TnToastTesting } from '@truenas/ui-components';
10631
+ *
10632
+ * let toastMock: TnToastMock;
10633
+ *
10634
+ * beforeEach(() => {
10635
+ * toastMock = new TnToastMock();
10636
+ * TestBed.configureTestingModule({
10637
+ * providers: [TnToastTesting.providers(toastMock)],
10638
+ * });
10639
+ * });
10640
+ *
10641
+ * it('should show success toast', () => {
10642
+ * // ... trigger action that opens a toast
10643
+ * expect(toastMock.calls.length).toBe(1);
10644
+ * expect(toastMock.lastCall?.message).toBe('Saved successfully');
10645
+ * expect(toastMock.lastCall?.config.type).toBe(TnToastType.Success);
10646
+ * });
10647
+ *
10648
+ * it('should handle action click', () => {
10649
+ * // ... trigger action that opens a toast with action
10650
+ * toastMock.lastCall?.ref._triggerAction();
10651
+ * // ... assert retry behavior
10652
+ * });
10653
+ * ```
10654
+ */
10655
+ class TnToastMock {
10656
+ /** All recorded toast open() calls. */
10657
+ calls = [];
10658
+ /** The most recent toast call, or undefined if none. */
10659
+ get lastCall() {
10660
+ return this.calls[this.calls.length - 1];
10661
+ }
10662
+ /** Clears all recorded calls. */
10663
+ reset() {
10664
+ this.calls = [];
10665
+ }
10666
+ open(message, actionOrConfig, config) {
10667
+ let action;
10668
+ let resolvedConfig = {};
10669
+ if (typeof actionOrConfig === 'string') {
10670
+ action = actionOrConfig;
10671
+ resolvedConfig = config ?? {};
10672
+ }
10673
+ else if (actionOrConfig) {
10674
+ resolvedConfig = actionOrConfig;
10675
+ }
10676
+ const ref = new TnToastRef();
10677
+ this.calls.push({ message, action, config: resolvedConfig, ref });
10678
+ return ref;
10679
+ }
10680
+ }
10681
+ /**
10682
+ * Test utilities for TnToastService.
10683
+ *
10684
+ * Provides a mock that records toast calls without rendering components,
10685
+ * making tests fast and deterministic.
10686
+ *
10687
+ * @example
10688
+ * ```typescript
10689
+ * const toastMock = new TnToastMock();
10690
+ *
10691
+ * TestBed.configureTestingModule({
10692
+ * providers: [TnToastTesting.providers(toastMock)],
10693
+ * });
10694
+ * ```
10695
+ */
10696
+ class TnToastTesting {
10697
+ /**
10698
+ * Returns providers that replace TnToastService with the given mock.
10699
+ */
10700
+ static providers(mock) {
10701
+ return [{ provide: TnToastService, useValue: mock }];
10702
+ }
10703
+ }
10704
+
10449
10705
  class TnKeyboardShortcutService {
10450
10706
  shortcuts = new Map();
10451
10707
  globalEnabled = true;
@@ -11049,5 +11305,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
11049
11305
  * Generated bundle index. Do not edit.
11050
11306
  */
11051
11307
 
11052
- export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, TN_THEME_DEFINITIONS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnConfirmDialogComponent, TnDateInputComponent, TnDateRangeInputComponent, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuActivateHoverDirective, TnMenuComponent, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTabsComponent, TnTabsHarness, TnTheme, TnThemeService, TnTimeInputComponent, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, libIconMarker, registerLucideIcons, setupLucideIntegration, tnIconMarker };
11308
+ export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, TN_THEME_DEFINITIONS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnConfirmDialogComponent, TnDateInputComponent, TnDateRangeInputComponent, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuActivateHoverDirective, TnMenuComponent, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTabsComponent, TnTabsHarness, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, libIconMarker, registerLucideIcons, setupLucideIntegration, tnIconMarker };
11053
11309
  //# sourceMappingURL=truenas-ui-components.mjs.map