@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
|
|
4152
|
-
|
|
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
|