@ngx-smz/ui-kit 21.9.0-next.1 → 21.9.0-next.4

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 { signal, input, booleanAttribute, computed, Directive, inject, TemplateRef, HostAttributeToken, ChangeDetectionStrategy, Component, ElementRef, output, forwardRef, Injector, DestroyRef, afterNextRender, Renderer2, effect, InjectionToken, viewChild, ViewContainerRef, Injectable, model, contentChildren, contentChild } from '@angular/core';
2
+ import { signal, input, booleanAttribute, computed, Directive, inject, TemplateRef, HostAttributeToken, ChangeDetectionStrategy, Component, ElementRef, output, forwardRef, Injector, DestroyRef, afterNextRender, Renderer2, effect, InjectionToken, viewChild, ViewContainerRef, Injectable, model, contentChildren, contentChild, afterEveryRender } from '@angular/core';
3
3
  import { Overlay } from '@angular/cdk/overlay';
4
4
  import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
5
5
  import * as i1 from '@angular/forms';
@@ -7991,9 +7991,1065 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
7991
7991
  args: [{ providedIn: 'root' }]
7992
7992
  }] });
7993
7993
 
7994
+ /* eslint-disable max-len -- classes Tailwind nos templates */
7995
+ /**
7996
+ * Card. Substitui o `p-card` do PrimeNG.
7997
+ * O conteudo padrao vai no corpo; `header`, `title`, `subtitle` e `footer` podem ser strings ou templates.
7998
+ *
7999
+ * <ui-card header="Titulo" subheader="Sub">conteudo<ng-template smzTemplate="footer">...</ng-template></ui-card>
8000
+ */
8001
+ class SmzCardComponent {
8002
+ /** Titulo em texto (equivale ao slot `title`). */
8003
+ header = input('', ...(ngDevMode ? [{ debugName: "header" }] : []));
8004
+ /** Subtitulo em texto (equivale ao slot `subtitle`). */
8005
+ subheader = input('', ...(ngDevMode ? [{ debugName: "subheader" }] : []));
8006
+ templates = contentChildren(SmzTemplateDirective, ...(ngDevMode ? [{ debugName: "templates" }] : []));
8007
+ headerTemplate = computed(() => smzFindTemplate(this.templates(), 'header'), ...(ngDevMode ? [{ debugName: "headerTemplate" }] : []));
8008
+ titleTemplate = computed(() => smzFindTemplate(this.templates(), 'title'), ...(ngDevMode ? [{ debugName: "titleTemplate" }] : []));
8009
+ subtitleTemplate = computed(() => smzFindTemplate(this.templates(), 'subtitle'), ...(ngDevMode ? [{ debugName: "subtitleTemplate" }] : []));
8010
+ footerTemplate = computed(() => smzFindTemplate(this.templates(), 'footer'), ...(ngDevMode ? [{ debugName: "footerTemplate" }] : []));
8011
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8012
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SmzCardComponent, isStandalone: true, selector: "ui-card", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, subheader: { classPropertyName: "subheader", publicName: "subheader", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "flex flex-col overflow-hidden rounded-card border border-ui-line bg-ui-surface-1 font-ui text-ui-md text-ui-fg shadow-card" }, queries: [{ propertyName: "templates", predicate: SmzTemplateDirective, isSignal: true }], ngImport: i0, template: `
8013
+ @if (headerTemplate(); as tpl) {
8014
+ <div><ng-container [ngTemplateOutlet]="tpl" /></div>
8015
+ }
8016
+ <div class="flex flex-1 flex-col gap-2 p-5">
8017
+ @if (titleTemplate() || header()) {
8018
+ <div class="text-ui-xl font-semibold">
8019
+ @if (titleTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" /> } @else { {{ header() }} }
8020
+ </div>
8021
+ }
8022
+ @if (subtitleTemplate() || subheader()) {
8023
+ <div class="text-ui-fg-muted">
8024
+ @if (subtitleTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" /> } @else { {{ subheader() }} }
8025
+ </div>
8026
+ }
8027
+ <div class="flex-1"><ng-content /></div>
8028
+ @if (footerTemplate(); as tpl) {
8029
+ <div><ng-container [ngTemplateOutlet]="tpl" /></div>
8030
+ }
8031
+ </div>
8032
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8033
+ }
8034
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzCardComponent, decorators: [{
8035
+ type: Component,
8036
+ args: [{
8037
+ selector: 'ui-card',
8038
+ changeDetection: ChangeDetectionStrategy.OnPush,
8039
+ imports: [NgTemplateOutlet],
8040
+ host: { class: 'flex flex-col overflow-hidden rounded-card border border-ui-line bg-ui-surface-1 font-ui text-ui-md text-ui-fg shadow-card' },
8041
+ template: `
8042
+ @if (headerTemplate(); as tpl) {
8043
+ <div><ng-container [ngTemplateOutlet]="tpl" /></div>
8044
+ }
8045
+ <div class="flex flex-1 flex-col gap-2 p-5">
8046
+ @if (titleTemplate() || header()) {
8047
+ <div class="text-ui-xl font-semibold">
8048
+ @if (titleTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" /> } @else { {{ header() }} }
8049
+ </div>
8050
+ }
8051
+ @if (subtitleTemplate() || subheader()) {
8052
+ <div class="text-ui-fg-muted">
8053
+ @if (subtitleTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" /> } @else { {{ subheader() }} }
8054
+ </div>
8055
+ }
8056
+ <div class="flex-1"><ng-content /></div>
8057
+ @if (footerTemplate(); as tpl) {
8058
+ <div><ng-container [ngTemplateOutlet]="tpl" /></div>
8059
+ }
8060
+ </div>
8061
+ `,
8062
+ }]
8063
+ }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], subheader: [{ type: i0.Input, args: [{ isSignal: true, alias: "subheader", required: false }] }], templates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SmzTemplateDirective), { isSignal: true }] }] } });
8064
+
8065
+ /* eslint-disable max-len -- classes Tailwind nos templates */
8066
+ /**
8067
+ * Painel com cabecalho, recolhimento opcional e rodape. Substitui o `p-panel` do PrimeNG.
8068
+ *
8069
+ * <ui-panel header="Filtros" [toggleable]="true" [(collapsed)]="fechado">conteudo</ui-panel>
8070
+ */
8071
+ class SmzPanelComponent {
8072
+ header = input('', ...(ngDevMode ? [{ debugName: "header" }] : []));
8073
+ toggleable = input(false, { ...(ngDevMode ? { debugName: "toggleable" } : {}), transform: booleanAttribute });
8074
+ collapsed = model(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : []));
8075
+ /** Antes de alternar (cancelavel nao: apenas notifica). */
8076
+ beforeToggle = output();
8077
+ afterToggle = output();
8078
+ templates = contentChildren(SmzTemplateDirective, ...(ngDevMode ? [{ debugName: "templates" }] : []));
8079
+ headerTemplate = computed(() => smzFindTemplate(this.templates(), 'header'), ...(ngDevMode ? [{ debugName: "headerTemplate" }] : []));
8080
+ iconsTemplate = computed(() => smzFindTemplate(this.templates(), 'icons'), ...(ngDevMode ? [{ debugName: "iconsTemplate" }] : []));
8081
+ footerTemplate = computed(() => smzFindTemplate(this.templates(), 'footer'), ...(ngDevMode ? [{ debugName: "footerTemplate" }] : []));
8082
+ hasHeader = computed(() => !!this.header() || !!this.headerTemplate() || this.toggleable(), ...(ngDevMode ? [{ debugName: "hasHeader" }] : []));
8083
+ toggle(event) {
8084
+ const next = !this.collapsed();
8085
+ this.beforeToggle.emit({ originalEvent: event, collapsed: next });
8086
+ this.collapsed.set(next);
8087
+ this.afterToggle.emit({ originalEvent: event, collapsed: next });
8088
+ }
8089
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8090
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SmzPanelComponent, isStandalone: true, selector: "ui-panel", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, toggleable: { classPropertyName: "toggleable", publicName: "toggleable", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange", beforeToggle: "beforeToggle", afterToggle: "afterToggle" }, host: { classAttribute: "block overflow-hidden rounded-card border border-ui-line bg-ui-surface-1 font-ui text-ui-md text-ui-fg" }, queries: [{ propertyName: "templates", predicate: SmzTemplateDirective, isSignal: true }], ngImport: i0, template: `
8091
+ @if (hasHeader()) {
8092
+ <div class="flex items-center justify-between gap-2 border-b border-ui-line bg-ui-surface-1 px-4 py-3">
8093
+ <div class="min-w-0 flex-1 font-semibold">
8094
+ @if (headerTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" /> } @else { {{ header() }} }
8095
+ </div>
8096
+ <div class="flex items-center gap-1">
8097
+ @if (iconsTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" /> }
8098
+ @if (toggleable()) {
8099
+ <button type="button" class="inline-flex h-8 w-8 items-center justify-center rounded-full text-ui-fg-muted transition-colors duration-ui hover:bg-ui-surface-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus" [attr.aria-expanded]="!collapsed()" [attr.aria-label]="collapsed() ? 'Expandir' : 'Recolher'" (click)="toggle($event)">
8100
+ <svg viewBox="0 0 16 16" class="h-4 w-4 transition-transform duration-ui" [class.rotate-180]="!collapsed()" fill="none" aria-hidden="true"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" /></svg>
8101
+ </button>
8102
+ }
8103
+ </div>
8104
+ </div>
8105
+ }
8106
+ @if (!collapsed()) {
8107
+ <div class="p-4"><ng-content /></div>
8108
+ @if (footerTemplate(); as tpl) {
8109
+ <div class="border-t border-ui-line px-4 py-3"><ng-container [ngTemplateOutlet]="tpl" /></div>
8110
+ }
8111
+ }
8112
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8113
+ }
8114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzPanelComponent, decorators: [{
8115
+ type: Component,
8116
+ args: [{
8117
+ selector: 'ui-panel',
8118
+ changeDetection: ChangeDetectionStrategy.OnPush,
8119
+ imports: [NgTemplateOutlet],
8120
+ host: { class: 'block overflow-hidden rounded-card border border-ui-line bg-ui-surface-1 font-ui text-ui-md text-ui-fg' },
8121
+ template: `
8122
+ @if (hasHeader()) {
8123
+ <div class="flex items-center justify-between gap-2 border-b border-ui-line bg-ui-surface-1 px-4 py-3">
8124
+ <div class="min-w-0 flex-1 font-semibold">
8125
+ @if (headerTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" /> } @else { {{ header() }} }
8126
+ </div>
8127
+ <div class="flex items-center gap-1">
8128
+ @if (iconsTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" /> }
8129
+ @if (toggleable()) {
8130
+ <button type="button" class="inline-flex h-8 w-8 items-center justify-center rounded-full text-ui-fg-muted transition-colors duration-ui hover:bg-ui-surface-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus" [attr.aria-expanded]="!collapsed()" [attr.aria-label]="collapsed() ? 'Expandir' : 'Recolher'" (click)="toggle($event)">
8131
+ <svg viewBox="0 0 16 16" class="h-4 w-4 transition-transform duration-ui" [class.rotate-180]="!collapsed()" fill="none" aria-hidden="true"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" /></svg>
8132
+ </button>
8133
+ }
8134
+ </div>
8135
+ </div>
8136
+ }
8137
+ @if (!collapsed()) {
8138
+ <div class="p-4"><ng-content /></div>
8139
+ @if (footerTemplate(); as tpl) {
8140
+ <div class="border-t border-ui-line px-4 py-3"><ng-container [ngTemplateOutlet]="tpl" /></div>
8141
+ }
8142
+ }
8143
+ `,
8144
+ }]
8145
+ }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], toggleable: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggleable", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }, { type: i0.Output, args: ["collapsedChange"] }], beforeToggle: [{ type: i0.Output, args: ["beforeToggle"] }], afterToggle: [{ type: i0.Output, args: ["afterToggle"] }], templates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SmzTemplateDirective), { isSignal: true }] }] } });
8146
+
8147
+ /* eslint-disable max-len -- classes Tailwind nos templates */
8148
+ /**
8149
+ * Indicador de carregamento circular. Substitui o `p-progressspinner` do PrimeNG.
8150
+ * O tamanho vem das classes do host (ex.: `class="h-12 w-12"`); a cor, de `text-ui-primary` (herdavel).
8151
+ *
8152
+ * <ui-progress-spinner class="h-12 w-12" strokeWidth="4" />
8153
+ */
8154
+ class SmzProgressSpinnerComponent {
8155
+ strokeWidth = input(4, ...(ngDevMode ? [{ debugName: "strokeWidth" }] : []));
8156
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzProgressSpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8157
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.1", type: SmzProgressSpinnerComponent, isStandalone: true, selector: "ui-progress-spinner", inputs: { strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "progressbar", "aria-busy": "true" }, classAttribute: "inline-block h-10 w-10 text-ui-primary" }, ngImport: i0, template: `
8158
+ <svg viewBox="0 0 50 50" class="h-full w-full animate-spin" fill="none" aria-hidden="true">
8159
+ <circle cx="25" cy="25" r="20" stroke="currentColor" [attr.stroke-width]="strokeWidth()" stroke-linecap="round" stroke-dasharray="90 150" />
8160
+ </svg>
8161
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8162
+ }
8163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzProgressSpinnerComponent, decorators: [{
8164
+ type: Component,
8165
+ args: [{
8166
+ selector: 'ui-progress-spinner',
8167
+ changeDetection: ChangeDetectionStrategy.OnPush,
8168
+ host: { class: 'inline-block h-10 w-10 text-ui-primary', role: 'progressbar', 'aria-busy': 'true' },
8169
+ template: `
8170
+ <svg viewBox="0 0 50 50" class="h-full w-full animate-spin" fill="none" aria-hidden="true">
8171
+ <circle cx="25" cy="25" r="20" stroke="currentColor" [attr.stroke-width]="strokeWidth()" stroke-linecap="round" stroke-dasharray="90 150" />
8172
+ </svg>
8173
+ `,
8174
+ }]
8175
+ }], propDecorators: { strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }] } });
8176
+
8177
+ /* eslint-disable max-len -- classes Tailwind nos templates */
8178
+ const BASE = 'relative block [&_label]:pointer-events-none [&_label]:absolute [&_label]:left-3 [&_label]:z-10 [&_label]:text-ui-fg-subtle [&_label]:transition-all [&_label]:duration-ui';
8179
+ const RESTING = '[&_label]:top-1/2 [&_label]:-translate-y-1/2 [&_label]:text-ui-md';
8180
+ const FLOATED = {
8181
+ over: '[&_label]:-top-5 [&_label]:left-0 [&_label]:translate-y-0 [&_label]:text-ui-xs [&_label]:text-ui-fg-muted',
8182
+ on: '[&_label]:top-0 [&_label]:left-2 [&_label]:-translate-y-1/2 [&_label]:bg-ui-surface-1 [&_label]:px-1 [&_label]:text-ui-xs [&_label]:text-ui-fg-muted',
8183
+ in: '[&_label]:top-1.5 [&_label]:translate-y-0 [&_label]:text-ui-xs [&_label]:text-ui-fg-muted',
8184
+ };
8185
+ const IN_PADDING = '[&_input]:pt-4 [&_textarea]:pt-5 [&_[role=combobox]]:pt-4';
8186
+ /**
8187
+ * Rotulo flutuante. Substitui o `p-floatlabel` do PrimeNG.
8188
+ * O `<label>` projetado flutua quando o controle recebe foco ou tem valor
8189
+ * (detectado em `input`/`textarea` e em selects do kit; use `[filled]` para forcar).
8190
+ *
8191
+ * <ui-float-label variant="on"><input smzInputText id="n" /><label for="n">Nome</label></ui-float-label>
8192
+ */
8193
+ class SmzFloatLabelComponent {
8194
+ variant = input('over', ...(ngDevMode ? [{ debugName: "variant" }] : []));
8195
+ /** Forca o estado "preenchido" quando a deteccao automatica nao se aplica. */
8196
+ filled = input(null, ...(ngDevMode ? [{ debugName: "filled" }] : []));
8197
+ focused = signal(false, ...(ngDevMode ? [{ debugName: "focused" }] : []));
8198
+ detected = signal(false, ...(ngDevMode ? [{ debugName: "detected" }] : []));
8199
+ host = inject(ElementRef);
8200
+ floated = computed(() => this.focused() || (this.filled() ?? this.detected()), ...(ngDevMode ? [{ debugName: "floated" }] : []));
8201
+ classes = computed(() => {
8202
+ const variant = this.variant();
8203
+ return [BASE, this.floated() ? FLOATED[variant] : RESTING, variant === 'in' ? IN_PADDING : ''].join(' ');
8204
+ }, ...(ngDevMode ? [{ debugName: "classes" }] : []));
8205
+ constructor() {
8206
+ afterEveryRender(() => this.check());
8207
+ }
8208
+ check() {
8209
+ {
8210
+ const root = this.host.nativeElement;
8211
+ const field = root.querySelector('input:not([type=checkbox]):not([type=radio]), textarea');
8212
+ const combo = root.querySelector('[role=combobox]');
8213
+ let filled = false;
8214
+ if (field && field.value !== '')
8215
+ filled = true;
8216
+ else if (combo && !field)
8217
+ filled = !combo.querySelector('.text-ui-fg-subtle') && (combo.textContent ?? '').trim() !== '';
8218
+ if (filled !== this.detected())
8219
+ this.detected.set(filled);
8220
+ }
8221
+ }
8222
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzFloatLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8223
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.1", type: SmzFloatLabelComponent, isStandalone: true, selector: "ui-float-label", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, filled: { classPropertyName: "filled", publicName: "filled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focusin": "focused.set(true)", "focusout": "focused.set(false); check()", "input": "check()", "change": "check()" }, properties: { "class": "classes()" } }, ngImport: i0, template: '<ng-content />', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8224
+ }
8225
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzFloatLabelComponent, decorators: [{
8226
+ type: Component,
8227
+ args: [{
8228
+ selector: 'ui-float-label',
8229
+ changeDetection: ChangeDetectionStrategy.OnPush,
8230
+ host: {
8231
+ '[class]': 'classes()',
8232
+ '(focusin)': 'focused.set(true)',
8233
+ '(focusout)': 'focused.set(false); check()',
8234
+ '(input)': 'check()',
8235
+ '(change)': 'check()',
8236
+ },
8237
+ template: '<ng-content />',
8238
+ }]
8239
+ }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], filled: [{ type: i0.Input, args: [{ isSignal: true, alias: "filled", required: false }] }] } });
8240
+
8241
+ /* eslint-disable max-len -- classes Tailwind nos templates */
8242
+ /** Painel de um `ui-splitter`. O conteudo e projetado dentro da area do painel. */
8243
+ class SmzSplitterPanelComponent {
8244
+ content = viewChild.required(TemplateRef);
8245
+ /** Tamanho inicial em % (sobrescreve `panelSizes` do splitter). */
8246
+ size = input(null, ...(ngDevMode ? [{ debugName: "size" }] : []));
8247
+ minSize = input(null, ...(ngDevMode ? [{ debugName: "minSize" }] : []));
8248
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzSplitterPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8249
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.1", type: SmzSplitterPanelComponent, isStandalone: true, selector: "ui-splitter-panel", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "content", first: true, predicate: TemplateRef, descendants: true, isSignal: true }], ngImport: i0, template: '<ng-template><ng-content /></ng-template>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8250
+ }
8251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzSplitterPanelComponent, decorators: [{
8252
+ type: Component,
8253
+ args: [{
8254
+ selector: 'ui-splitter-panel',
8255
+ changeDetection: ChangeDetectionStrategy.OnPush,
8256
+ template: '<ng-template><ng-content /></ng-template>',
8257
+ }]
8258
+ }], propDecorators: { content: [{ type: i0.ViewChild, args: [i0.forwardRef(() => TemplateRef), { isSignal: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }] } });
8259
+ /**
8260
+ * Divisor redimensionavel. Substitui o `p-splitter` / `p-splitterPanel` do PrimeNG.
8261
+ *
8262
+ * <ui-splitter layout="horizontal" [panelSizes]="[30, 70]" [minSizes]="[10, 20]">
8263
+ * <ui-splitter-panel>A</ui-splitter-panel><ui-splitter-panel>B</ui-splitter-panel>
8264
+ * </ui-splitter>
8265
+ */
8266
+ class SmzSplitterComponent {
8267
+ layout = input('horizontal', ...(ngDevMode ? [{ debugName: "layout" }] : []));
8268
+ panelSizes = input(null, ...(ngDevMode ? [{ debugName: "panelSizes" }] : []));
8269
+ minSizes = input(null, ...(ngDevMode ? [{ debugName: "minSizes" }] : []));
8270
+ resizeEnd = output();
8271
+ panels = contentChildren(SmzSplitterPanelComponent, ...(ngDevMode ? [{ debugName: "panels" }] : []));
8272
+ root = viewChild.required('root');
8273
+ overrides = signal(null, ...(ngDevMode ? [{ debugName: "overrides" }] : []));
8274
+ sizes = computed(() => {
8275
+ const override = this.overrides();
8276
+ if (override && override.length === this.panels().length)
8277
+ return override;
8278
+ const panels = this.panels();
8279
+ const base = this.panelSizes() ?? [];
8280
+ const explicit = panels.map((panel, i) => panel.size() ?? base[i] ?? null);
8281
+ const known = explicit.reduce((sum, size) => sum + (size ?? 0), 0);
8282
+ const free = explicit.filter((size) => size === null).length;
8283
+ const share = free > 0 ? Math.max(0, 100 - known) / free : 0;
8284
+ return explicit.map((size) => size ?? share);
8285
+ }, ...(ngDevMode ? [{ debugName: "sizes" }] : []));
8286
+ min(index) {
8287
+ return this.panels()[index]?.minSize() ?? this.minSizes()?.[index] ?? 0;
8288
+ }
8289
+ startDrag(event, index) {
8290
+ event.preventDefault();
8291
+ const rect = this.root().nativeElement.getBoundingClientRect();
8292
+ const total = this.layout() === 'horizontal' ? rect.width : rect.height;
8293
+ const start = this.layout() === 'horizontal' ? event.clientX : event.clientY;
8294
+ const initial = [...this.sizes()];
8295
+ const move = (e) => {
8296
+ const delta = (((this.layout() === 'horizontal' ? e.clientX : e.clientY) - start) / total) * 100;
8297
+ this.resize(initial, index, delta);
8298
+ };
8299
+ const up = () => {
8300
+ document.removeEventListener('pointermove', move);
8301
+ document.removeEventListener('pointerup', up);
8302
+ this.resizeEnd.emit({ sizes: this.sizes() });
8303
+ };
8304
+ document.addEventListener('pointermove', move);
8305
+ document.addEventListener('pointerup', up);
8306
+ }
8307
+ onKey(event, index) {
8308
+ const keys = this.layout() === 'horizontal' ? { dec: 'ArrowLeft', inc: 'ArrowRight' } : { dec: 'ArrowUp', inc: 'ArrowDown' };
8309
+ if (event.key !== keys.dec && event.key !== keys.inc)
8310
+ return;
8311
+ event.preventDefault();
8312
+ this.resize([...this.sizes()], index, event.key === keys.inc ? 2 : -2);
8313
+ this.resizeEnd.emit({ sizes: this.sizes() });
8314
+ }
8315
+ resize(initial, index, delta) {
8316
+ const pair = initial[index] + initial[index + 1];
8317
+ const next = Math.min(Math.max(initial[index] + delta, this.min(index)), pair - this.min(index + 1));
8318
+ const sizes = [...initial];
8319
+ sizes[index] = next;
8320
+ sizes[index + 1] = pair - next;
8321
+ this.overrides.set(sizes);
8322
+ }
8323
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzSplitterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8324
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SmzSplitterComponent, isStandalone: true, selector: "ui-splitter", inputs: { layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null }, panelSizes: { classPropertyName: "panelSizes", publicName: "panelSizes", isSignal: true, isRequired: false, transformFunction: null }, minSizes: { classPropertyName: "minSizes", publicName: "minSizes", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resizeEnd: "resizeEnd" }, host: { classAttribute: "block h-full w-full overflow-hidden rounded-control border border-ui-line bg-ui-surface-1 font-ui text-ui-md text-ui-fg" }, queries: [{ propertyName: "panels", predicate: SmzSplitterPanelComponent, isSignal: true }], viewQueries: [{ propertyName: "root", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: `
8325
+ <div #root class="flex h-full w-full" [class.flex-col]="layout() === 'vertical'">
8326
+ @for (panel of panels(); track $index; let i = $index) {
8327
+ <div class="min-h-0 min-w-0 overflow-auto" [style.flex]="'0 0 ' + sizes()[i] + '%'" [style.width]="layout() === 'horizontal' ? sizes()[i] + '%' : null" [style.height]="layout() === 'vertical' ? sizes()[i] + '%' : null">
8328
+ <ng-container [ngTemplateOutlet]="panel.content()" />
8329
+ </div>
8330
+ @if (i < panels().length - 1) {
8331
+ <div
8332
+ role="separator"
8333
+ tabindex="0"
8334
+ class="shrink-0 bg-ui-line transition-colors duration-ui hover:bg-ui-primary focus-visible:bg-ui-primary focus-visible:outline-none"
8335
+ [class]="layout() === 'horizontal' ? 'w-1 cursor-col-resize' : 'h-1 cursor-row-resize'"
8336
+ [attr.aria-orientation]="layout() === 'horizontal' ? 'vertical' : 'horizontal'"
8337
+ (pointerdown)="startDrag($event, i)"
8338
+ (keydown)="onKey($event, i)"
8339
+ ></div>
8340
+ }
8341
+ }
8342
+ </div>
8343
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8344
+ }
8345
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzSplitterComponent, decorators: [{
8346
+ type: Component,
8347
+ args: [{
8348
+ selector: 'ui-splitter',
8349
+ changeDetection: ChangeDetectionStrategy.OnPush,
8350
+ imports: [NgTemplateOutlet],
8351
+ host: { class: 'block h-full w-full overflow-hidden rounded-control border border-ui-line bg-ui-surface-1 font-ui text-ui-md text-ui-fg' },
8352
+ template: `
8353
+ <div #root class="flex h-full w-full" [class.flex-col]="layout() === 'vertical'">
8354
+ @for (panel of panels(); track $index; let i = $index) {
8355
+ <div class="min-h-0 min-w-0 overflow-auto" [style.flex]="'0 0 ' + sizes()[i] + '%'" [style.width]="layout() === 'horizontal' ? sizes()[i] + '%' : null" [style.height]="layout() === 'vertical' ? sizes()[i] + '%' : null">
8356
+ <ng-container [ngTemplateOutlet]="panel.content()" />
8357
+ </div>
8358
+ @if (i < panels().length - 1) {
8359
+ <div
8360
+ role="separator"
8361
+ tabindex="0"
8362
+ class="shrink-0 bg-ui-line transition-colors duration-ui hover:bg-ui-primary focus-visible:bg-ui-primary focus-visible:outline-none"
8363
+ [class]="layout() === 'horizontal' ? 'w-1 cursor-col-resize' : 'h-1 cursor-row-resize'"
8364
+ [attr.aria-orientation]="layout() === 'horizontal' ? 'vertical' : 'horizontal'"
8365
+ (pointerdown)="startDrag($event, i)"
8366
+ (keydown)="onKey($event, i)"
8367
+ ></div>
8368
+ }
8369
+ }
8370
+ </div>
8371
+ `,
8372
+ }]
8373
+ }], propDecorators: { layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }], panelSizes: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelSizes", required: false }] }], minSizes: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSizes", required: false }] }], resizeEnd: [{ type: i0.Output, args: ["resizeEnd"] }], panels: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SmzSplitterPanelComponent), { isSignal: true }] }], root: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }] } });
8374
+
8375
+ /* eslint-disable max-len -- classes Tailwind nos templates */
8376
+ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument, @typescript-eslint/explicit-module-boundary-types */
8377
+ const ROW_BASE = 'border-b border-ui-line transition-colors duration-ui';
8378
+ /**
8379
+ * Tabela em arvore. Substitui o `p-treeTable` do PrimeNG.
8380
+ * Os templates `header`, `body`, `caption`, `footer`, `emptymessage` e `summary` usam `smzTemplate`;
8381
+ * o `body` recebe `let-rowNode let-rowData="rowData" let-columns="columns"`.
8382
+ *
8383
+ * <ui-tree-table [value]="nodes" [columns]="cols" selectionMode="checkbox" [(selection)]="sel">
8384
+ * <ng-template smzTemplate="header" let-columns><tr><th *ngFor="let c of columns">{{ c.header }}</th></tr></ng-template>
8385
+ * <ng-template smzTemplate="body" let-rowNode let-rowData="rowData" let-columns="columns">
8386
+ * <tr [smzTtRow]="rowNode"><td><ui-tree-table-toggler [rowNode]="rowNode" />{{ rowData.name }}</td></tr>
8387
+ * </ng-template>
8388
+ * </ui-tree-table>
8389
+ */
8390
+ class SmzTreeTableComponent {
8391
+ value = input([], ...(ngDevMode ? [{ debugName: "value" }] : []));
8392
+ columns = input([], ...(ngDevMode ? [{ debugName: "columns" }] : []));
8393
+ selectionMode = input(null, ...(ngDevMode ? [{ debugName: "selectionMode" }] : []));
8394
+ selection = model(null, ...(ngDevMode ? [{ debugName: "selection" }] : []));
8395
+ propagateSelectionUp = input(true, { ...(ngDevMode ? { debugName: "propagateSelectionUp" } : {}), transform: booleanAttribute });
8396
+ propagateSelectionDown = input(true, { ...(ngDevMode ? { debugName: "propagateSelectionDown" } : {}), transform: booleanAttribute });
8397
+ loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : {}), transform: booleanAttribute });
8398
+ scrollable = input(false, { ...(ngDevMode ? { debugName: "scrollable" } : {}), transform: booleanAttribute });
8399
+ scrollHeight = input(null, ...(ngDevMode ? [{ debugName: "scrollHeight" }] : []));
8400
+ emptyMessage = input('', ...(ngDevMode ? [{ debugName: "emptyMessage" }] : []));
8401
+ tableStyleClass = input('', ...(ngDevMode ? [{ debugName: "tableStyleClass" }] : []));
8402
+ paginator = input(false, { ...(ngDevMode ? { debugName: "paginator" } : {}), transform: booleanAttribute });
8403
+ rows = model(10, ...(ngDevMode ? [{ debugName: "rows" }] : []));
8404
+ first = model(0, ...(ngDevMode ? [{ debugName: "first" }] : []));
8405
+ rowsPerPageOptions = input(null, ...(ngDevMode ? [{ debugName: "rowsPerPageOptions" }] : []));
8406
+ sortField = model(null, ...(ngDevMode ? [{ debugName: "sortField" }] : []));
8407
+ sortOrder = model(1, ...(ngDevMode ? [{ debugName: "sortOrder" }] : []));
8408
+ nodeSelect = output();
8409
+ nodeUnselect = output();
8410
+ nodeExpand = output();
8411
+ nodeCollapse = output();
8412
+ sorted = output();
8413
+ page = output();
8414
+ templates = contentChildren(SmzTemplateDirective, ...(ngDevMode ? [{ debugName: "templates" }] : []));
8415
+ headerTemplate = computed(() => smzFindTemplate(this.templates(), 'header'), ...(ngDevMode ? [{ debugName: "headerTemplate" }] : []));
8416
+ bodyTemplate = computed(() => smzFindTemplate(this.templates(), 'body'), ...(ngDevMode ? [{ debugName: "bodyTemplate" }] : []));
8417
+ captionTemplate = computed(() => smzFindTemplate(this.templates(), 'caption'), ...(ngDevMode ? [{ debugName: "captionTemplate" }] : []));
8418
+ footerTemplate = computed(() => smzFindTemplate(this.templates(), 'footer'), ...(ngDevMode ? [{ debugName: "footerTemplate" }] : []));
8419
+ emptyTemplate = computed(() => smzFindTemplate(this.templates(), 'emptymessage'), ...(ngDevMode ? [{ debugName: "emptyTemplate" }] : []));
8420
+ summaryTemplate = computed(() => smzFindTemplate(this.templates(), 'summary'), ...(ngDevMode ? [{ debugName: "summaryTemplate" }] : []));
8421
+ /** Os nos sao mutaveis (`expanded`, `partialSelected`); este contador forca o recalculo das linhas. */
8422
+ version = signal(0, ...(ngDevMode ? [{ debugName: "version" }] : []));
8423
+ rootCount = computed(() => (this.value() ?? []).length, ...(ngDevMode ? [{ debugName: "rootCount" }] : []));
8424
+ flatRows = computed(() => {
8425
+ this.version();
8426
+ const field = this.sortField();
8427
+ const order = this.sortOrder();
8428
+ const out = [];
8429
+ const sort = (nodes) => field ? [...nodes].sort((a, b) => order * compareValues(SmzObjectUtils.resolveFieldData(a.data, field), SmzObjectUtils.resolveFieldData(b.data, field))) : nodes;
8430
+ const walk = (nodes, parent, level) => {
8431
+ for (const node of sort(nodes)) {
8432
+ out.push({ node, parent, level });
8433
+ if (node.expanded && node.children?.length)
8434
+ walk(node.children, node, level + 1);
8435
+ }
8436
+ };
8437
+ walk(this.value() ?? [], null, 0);
8438
+ return out;
8439
+ }, ...(ngDevMode ? [{ debugName: "flatRows" }] : []));
8440
+ /** Linhas visiveis; com paginador, a pagina atual e calculada sobre os nos raiz. */
8441
+ pageRows = computed(() => {
8442
+ const all = this.flatRows();
8443
+ if (!this.paginator())
8444
+ return all;
8445
+ const roots = all.filter((row) => row.level === 0);
8446
+ const pageRoots = new Set(roots.slice(this.first(), this.first() + this.rows()).map((row) => row.node));
8447
+ let include = false;
8448
+ return all.filter((row) => {
8449
+ if (row.level === 0)
8450
+ include = pageRoots.has(row.node);
8451
+ return include;
8452
+ });
8453
+ }, ...(ngDevMode ? [{ debugName: "pageRows" }] : []));
8454
+ refresh() {
8455
+ this.version.update((v) => v + 1);
8456
+ }
8457
+ toggleNode(rowNode, event) {
8458
+ const node = rowNode.node;
8459
+ node.expanded = !node.expanded;
8460
+ (node.expanded ? this.nodeExpand : this.nodeCollapse).emit({ node, originalEvent: event });
8461
+ this.refresh();
8462
+ }
8463
+ sortBy(field) {
8464
+ const order = this.sortField() === field && this.sortOrder() === 1 ? -1 : 1;
8465
+ this.sortField.set(field);
8466
+ this.sortOrder.set(order);
8467
+ this.sorted.emit({ field, order });
8468
+ }
8469
+ isSelected(node) {
8470
+ const selection = this.selection();
8471
+ return Array.isArray(selection) ? selection.includes(node) : selection === node;
8472
+ }
8473
+ selectionState(node) {
8474
+ if (this.isSelected(node))
8475
+ return 'checked';
8476
+ return node.partialSelected ? 'partial' : 'unchecked';
8477
+ }
8478
+ onRowClick(rowNode, event) {
8479
+ const mode = this.selectionMode();
8480
+ const node = rowNode.node;
8481
+ if (!mode || node.selectable === false)
8482
+ return;
8483
+ if (mode === 'checkbox')
8484
+ return; // selecao so pelo checkbox
8485
+ const selected = this.isSelected(node);
8486
+ if (mode === 'single') {
8487
+ this.selection.set(selected ? null : node);
8488
+ }
8489
+ else {
8490
+ const current = Array.isArray(this.selection()) ? this.selection() : [];
8491
+ this.selection.set(selected ? current.filter((entry) => entry !== node) : [...current, node]);
8492
+ }
8493
+ (selected ? this.nodeUnselect : this.nodeSelect).emit({ node, originalEvent: event });
8494
+ }
8495
+ toggleCheckbox(rowNode, event) {
8496
+ const node = rowNode.node;
8497
+ const selected = this.isSelected(node);
8498
+ const set = new Set(Array.isArray(this.selection()) ? this.selection() : []);
8499
+ const apply = (target, value) => {
8500
+ if (value)
8501
+ set.add(target);
8502
+ else
8503
+ set.delete(target);
8504
+ target.partialSelected = false;
8505
+ if (this.propagateSelectionDown())
8506
+ target.children?.forEach((child) => apply(child, value));
8507
+ };
8508
+ apply(node, !selected);
8509
+ if (this.propagateSelectionUp()) {
8510
+ for (let parent = rowNode.parent; parent; parent = this.findParent(parent)) {
8511
+ const children = parent.children ?? [];
8512
+ const all = children.every((child) => set.has(child));
8513
+ const some = children.some((child) => set.has(child) || child.partialSelected);
8514
+ if (all)
8515
+ set.add(parent);
8516
+ else
8517
+ set.delete(parent);
8518
+ parent.partialSelected = !all && some;
8519
+ }
8520
+ }
8521
+ this.selection.set([...set]);
8522
+ (selected ? this.nodeUnselect : this.nodeSelect).emit({ node, originalEvent: event });
8523
+ this.refresh();
8524
+ }
8525
+ /** Marca/desmarca todos os nos (checkbox do cabecalho). */
8526
+ toggleAll(checked) {
8527
+ const set = new Set();
8528
+ const walk = (nodes) => {
8529
+ for (const node of nodes) {
8530
+ node.partialSelected = false;
8531
+ if (checked && node.selectable !== false)
8532
+ set.add(node);
8533
+ walk(node.children ?? []);
8534
+ }
8535
+ };
8536
+ walk(this.value() ?? []);
8537
+ this.selection.set([...set]);
8538
+ this.refresh();
8539
+ }
8540
+ allSelected() {
8541
+ const total = this.countNodes(this.value() ?? []);
8542
+ const selection = this.selection();
8543
+ return total > 0 && Array.isArray(selection) && selection.length >= total;
8544
+ }
8545
+ countNodes(nodes) {
8546
+ return nodes.reduce((sum, node) => sum + 1 + this.countNodes(node.children ?? []), 0);
8547
+ }
8548
+ findParent(node) {
8549
+ const search = (nodes, parent) => {
8550
+ for (const candidate of nodes) {
8551
+ if (candidate === node)
8552
+ return parent;
8553
+ const found = search(candidate.children ?? [], candidate);
8554
+ if (found !== undefined)
8555
+ return found;
8556
+ }
8557
+ return undefined;
8558
+ };
8559
+ return search(this.value() ?? [], null) ?? null;
8560
+ }
8561
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8562
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SmzTreeTableComponent, isStandalone: true, selector: "ui-tree-table", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, selection: { classPropertyName: "selection", publicName: "selection", isSignal: true, isRequired: false, transformFunction: null }, propagateSelectionUp: { classPropertyName: "propagateSelectionUp", publicName: "propagateSelectionUp", isSignal: true, isRequired: false, transformFunction: null }, propagateSelectionDown: { classPropertyName: "propagateSelectionDown", publicName: "propagateSelectionDown", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, scrollable: { classPropertyName: "scrollable", publicName: "scrollable", isSignal: true, isRequired: false, transformFunction: null }, scrollHeight: { classPropertyName: "scrollHeight", publicName: "scrollHeight", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, tableStyleClass: { classPropertyName: "tableStyleClass", publicName: "tableStyleClass", isSignal: true, isRequired: false, transformFunction: null }, paginator: { classPropertyName: "paginator", publicName: "paginator", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, first: { classPropertyName: "first", publicName: "first", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPageOptions: { classPropertyName: "rowsPerPageOptions", publicName: "rowsPerPageOptions", isSignal: true, isRequired: false, transformFunction: null }, sortField: { classPropertyName: "sortField", publicName: "sortField", isSignal: true, isRequired: false, transformFunction: null }, sortOrder: { classPropertyName: "sortOrder", publicName: "sortOrder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection: "selectionChange", rows: "rowsChange", first: "firstChange", sortField: "sortFieldChange", sortOrder: "sortOrderChange", nodeSelect: "nodeSelect", nodeUnselect: "nodeUnselect", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse", sorted: "sorted", page: "page" }, host: { classAttribute: "block overflow-hidden rounded-control border border-ui-line bg-ui-surface-1 font-ui text-ui-md text-ui-fg" }, queries: [{ propertyName: "templates", predicate: SmzTemplateDirective, isSignal: true }], ngImport: i0, template: `
8563
+ @if (captionTemplate(); as tpl) {
8564
+ <div class="border-b border-ui-line px-4 py-3"><ng-container [ngTemplateOutlet]="tpl" /></div>
8565
+ }
8566
+ <div class="relative overflow-auto" [style.max-height]="scrollable() ? scrollHeight() : null">
8567
+ <table class="w-full border-separate border-spacing-0 text-left [&_td]:border-b [&_td]:border-ui-line [&_td]:px-4 [&_td]:py-3 [&_th]:sticky [&_th]:top-0 [&_th]:border-b [&_th]:border-ui-line [&_th]:bg-ui-surface-1 [&_th]:px-4 [&_th]:py-3 [&_th]:font-semibold" [class]="tableStyleClass() ?? ''">
8568
+ <thead>
8569
+ @if (headerTemplate(); as tpl) {
8570
+ <ng-container [ngTemplateOutlet]="tpl" [ngTemplateOutletContext]="{ $implicit: columns() }" />
8571
+ }
8572
+ </thead>
8573
+ <tbody>
8574
+ @for (row of pageRows(); track row.node.key ?? row.node) {
8575
+ <ng-container [ngTemplateOutlet]="bodyTemplate() ?? null" [ngTemplateOutletContext]="{ $implicit: row, rowNode: row, node: row.node, rowData: row.node.data, columns: columns() }" />
8576
+ } @empty {
8577
+ @if (!loading()) {
8578
+ <tr>
8579
+ <td [attr.colspan]="columns().length || 1" class="px-4 py-6 text-center text-ui-fg-muted">
8580
+ @if (emptyTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" [ngTemplateOutletContext]="{ $implicit: columns() }" /> } @else { {{ emptyMessage() }} }
8581
+ </td>
8582
+ </tr>
8583
+ }
8584
+ }
8585
+ </tbody>
8586
+ @if (footerTemplate(); as tpl) {
8587
+ <tfoot><ng-container [ngTemplateOutlet]="tpl" [ngTemplateOutletContext]="{ $implicit: columns() }" /></tfoot>
8588
+ }
8589
+ </table>
8590
+ @if (loading()) {
8591
+ <div class="absolute inset-0 flex items-center justify-center bg-ui-surface-1/60 text-ui-primary" role="status">
8592
+ <svg viewBox="0 0 50 50" class="h-8 w-8 animate-spin" fill="none" aria-hidden="true"><circle cx="25" cy="25" r="20" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-dasharray="90 150" /></svg>
8593
+ </div>
8594
+ }
8595
+ </div>
8596
+ @if (paginator()) {
8597
+ <ui-paginator class="border-t border-ui-line" [first]="first()" [rows]="rows()" [totalRecords]="rootCount()" [rowsPerPageOptions]="rowsPerPageOptions()" (firstChange)="first.set($event)" (rowsChange)="rows.set($event)" (pageChanged)="page.emit($event)" />
8598
+ }
8599
+ @if (summaryTemplate(); as tpl) {
8600
+ <div class="border-t border-ui-line px-4 py-3"><ng-container [ngTemplateOutlet]="tpl" /></div>
8601
+ }
8602
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SmzPaginatorComponent, selector: "ui-paginator", inputs: ["first", "rows", "totalRecords", "pageLinkSize", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "alwaysShow", "showPageLinks", "styleClass", "dropdownAppendTo", "showFirstLastIcon"], outputs: ["firstChange", "rowsChange", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8603
+ }
8604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableComponent, decorators: [{
8605
+ type: Component,
8606
+ args: [{
8607
+ selector: 'ui-tree-table',
8608
+ changeDetection: ChangeDetectionStrategy.OnPush,
8609
+ imports: [NgTemplateOutlet, SmzPaginatorComponent],
8610
+ host: { class: 'block overflow-hidden rounded-control border border-ui-line bg-ui-surface-1 font-ui text-ui-md text-ui-fg' },
8611
+ template: `
8612
+ @if (captionTemplate(); as tpl) {
8613
+ <div class="border-b border-ui-line px-4 py-3"><ng-container [ngTemplateOutlet]="tpl" /></div>
8614
+ }
8615
+ <div class="relative overflow-auto" [style.max-height]="scrollable() ? scrollHeight() : null">
8616
+ <table class="w-full border-separate border-spacing-0 text-left [&_td]:border-b [&_td]:border-ui-line [&_td]:px-4 [&_td]:py-3 [&_th]:sticky [&_th]:top-0 [&_th]:border-b [&_th]:border-ui-line [&_th]:bg-ui-surface-1 [&_th]:px-4 [&_th]:py-3 [&_th]:font-semibold" [class]="tableStyleClass() ?? ''">
8617
+ <thead>
8618
+ @if (headerTemplate(); as tpl) {
8619
+ <ng-container [ngTemplateOutlet]="tpl" [ngTemplateOutletContext]="{ $implicit: columns() }" />
8620
+ }
8621
+ </thead>
8622
+ <tbody>
8623
+ @for (row of pageRows(); track row.node.key ?? row.node) {
8624
+ <ng-container [ngTemplateOutlet]="bodyTemplate() ?? null" [ngTemplateOutletContext]="{ $implicit: row, rowNode: row, node: row.node, rowData: row.node.data, columns: columns() }" />
8625
+ } @empty {
8626
+ @if (!loading()) {
8627
+ <tr>
8628
+ <td [attr.colspan]="columns().length || 1" class="px-4 py-6 text-center text-ui-fg-muted">
8629
+ @if (emptyTemplate(); as tpl) { <ng-container [ngTemplateOutlet]="tpl" [ngTemplateOutletContext]="{ $implicit: columns() }" /> } @else { {{ emptyMessage() }} }
8630
+ </td>
8631
+ </tr>
8632
+ }
8633
+ }
8634
+ </tbody>
8635
+ @if (footerTemplate(); as tpl) {
8636
+ <tfoot><ng-container [ngTemplateOutlet]="tpl" [ngTemplateOutletContext]="{ $implicit: columns() }" /></tfoot>
8637
+ }
8638
+ </table>
8639
+ @if (loading()) {
8640
+ <div class="absolute inset-0 flex items-center justify-center bg-ui-surface-1/60 text-ui-primary" role="status">
8641
+ <svg viewBox="0 0 50 50" class="h-8 w-8 animate-spin" fill="none" aria-hidden="true"><circle cx="25" cy="25" r="20" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-dasharray="90 150" /></svg>
8642
+ </div>
8643
+ }
8644
+ </div>
8645
+ @if (paginator()) {
8646
+ <ui-paginator class="border-t border-ui-line" [first]="first()" [rows]="rows()" [totalRecords]="rootCount()" [rowsPerPageOptions]="rowsPerPageOptions()" (firstChange)="first.set($event)" (rowsChange)="rows.set($event)" (pageChanged)="page.emit($event)" />
8647
+ }
8648
+ @if (summaryTemplate(); as tpl) {
8649
+ <div class="border-t border-ui-line px-4 py-3"><ng-container [ngTemplateOutlet]="tpl" /></div>
8650
+ }
8651
+ `,
8652
+ }]
8653
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], selection: [{ type: i0.Input, args: [{ isSignal: true, alias: "selection", required: false }] }, { type: i0.Output, args: ["selectionChange"] }], propagateSelectionUp: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateSelectionUp", required: false }] }], propagateSelectionDown: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateSelectionDown", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], scrollable: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollable", required: false }] }], scrollHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollHeight", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], tableStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableStyleClass", required: false }] }], paginator: [{ type: i0.Input, args: [{ isSignal: true, alias: "paginator", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }, { type: i0.Output, args: ["rowsChange"] }], first: [{ type: i0.Input, args: [{ isSignal: true, alias: "first", required: false }] }, { type: i0.Output, args: ["firstChange"] }], rowsPerPageOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsPerPageOptions", required: false }] }], sortField: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortField", required: false }] }, { type: i0.Output, args: ["sortFieldChange"] }], sortOrder: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortOrder", required: false }] }, { type: i0.Output, args: ["sortOrderChange"] }], nodeSelect: [{ type: i0.Output, args: ["nodeSelect"] }], nodeUnselect: [{ type: i0.Output, args: ["nodeUnselect"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }], nodeCollapse: [{ type: i0.Output, args: ["nodeCollapse"] }], sorted: [{ type: i0.Output, args: ["sorted"] }], page: [{ type: i0.Output, args: ["page"] }], templates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SmzTemplateDirective), { isSignal: true }] }] } });
8654
+ function compareValues(a, b) {
8655
+ if (a == null && b == null)
8656
+ return 0;
8657
+ if (a == null)
8658
+ return -1;
8659
+ if (b == null)
8660
+ return 1;
8661
+ if (typeof a === 'string' && typeof b === 'string')
8662
+ return a.localeCompare(b);
8663
+ return a < b ? -1 : a > b ? 1 : 0;
8664
+ }
8665
+ /** Linha do corpo: `<tr [smzTtRow]="rowNode">`. Cuida de estilo, aria e selecao por clique. */
8666
+ class SmzTreeTableRowDirective {
8667
+ table = inject(SmzTreeTableComponent);
8668
+ rowNode = input.required({ ...(ngDevMode ? { debugName: "rowNode" } : {}), alias: 'smzTtRow' });
8669
+ classes = computed(() => {
8670
+ const mode = this.table.selectionMode();
8671
+ const selected = this.table.isSelected(this.rowNode().node);
8672
+ const interactive = mode && mode !== 'checkbox' ? 'cursor-pointer hover:bg-ui-surface-3' : 'hover:bg-ui-surface-3';
8673
+ return `${ROW_BASE} ${interactive} ${selected && mode !== 'checkbox' ? 'bg-ui-primary/10' : ''}`;
8674
+ }, ...(ngDevMode ? [{ debugName: "classes" }] : []));
8675
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableRowDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8676
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: SmzTreeTableRowDirective, isStandalone: true, selector: "tr[smzTtRow]", inputs: { rowNode: { classPropertyName: "rowNode", publicName: "smzTtRow", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "click": "table.onRowClick(rowNode(), $event)" }, properties: { "class": "classes()", "attr.aria-level": "rowNode().level + 1", "attr.aria-expanded": "rowNode().node.children?.length ? !!rowNode().node.expanded : null", "attr.aria-selected": "table.selectionMode() ? table.isSelected(rowNode().node) : null" } }, ngImport: i0 });
8677
+ }
8678
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableRowDirective, decorators: [{
8679
+ type: Directive,
8680
+ args: [{
8681
+ selector: 'tr[smzTtRow]',
8682
+ host: {
8683
+ '[class]': 'classes()',
8684
+ '[attr.aria-level]': 'rowNode().level + 1',
8685
+ '[attr.aria-expanded]': 'rowNode().node.children?.length ? !!rowNode().node.expanded : null',
8686
+ '[attr.aria-selected]': 'table.selectionMode() ? table.isSelected(rowNode().node) : null',
8687
+ '(click)': 'table.onRowClick(rowNode(), $event)',
8688
+ },
8689
+ }]
8690
+ }], propDecorators: { rowNode: [{ type: i0.Input, args: [{ isSignal: true, alias: "smzTtRow", required: true }] }] } });
8691
+ /** Seta de expandir/recolher com recuo por nivel: `<ui-tree-table-toggler [rowNode]="rowNode" />`. */
8692
+ class SmzTreeTableTogglerComponent {
8693
+ table = inject(SmzTreeTableComponent);
8694
+ rowNode = input.required(...(ngDevMode ? [{ debugName: "rowNode" }] : []));
8695
+ hasChildren() {
8696
+ const node = this.rowNode().node;
8697
+ return !node.leaf && (node.children?.length ?? 0) > 0;
8698
+ }
8699
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableTogglerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8700
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.1", type: SmzTreeTableTogglerComponent, isStandalone: true, selector: "ui-tree-table-toggler", inputs: { rowNode: { classPropertyName: "rowNode", publicName: "rowNode", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "style.padding-left.rem": "rowNode().level * 1.5" }, classAttribute: "inline-flex items-center align-middle" }, ngImport: i0, template: `
8701
+ <button type="button" class="inline-flex h-6 w-6 items-center justify-center rounded-full text-ui-fg-muted transition-colors duration-ui hover:bg-ui-surface-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus" [class.invisible]="!hasChildren()" [attr.aria-label]="rowNode().node.expanded ? 'Recolher' : 'Expandir'" (click)="$event.stopPropagation(); table.toggleNode(rowNode(), $event)">
8702
+ <svg viewBox="0 0 16 16" class="h-4 w-4 transition-transform duration-ui" [class.rotate-90]="rowNode().node.expanded" fill="none" aria-hidden="true"><path d="M6 4l4 4-4 4" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" /></svg>
8703
+ </button>
8704
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8705
+ }
8706
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableTogglerComponent, decorators: [{
8707
+ type: Component,
8708
+ args: [{
8709
+ selector: 'ui-tree-table-toggler',
8710
+ changeDetection: ChangeDetectionStrategy.OnPush,
8711
+ host: { class: 'inline-flex items-center align-middle', '[style.padding-left.rem]': 'rowNode().level * 1.5' },
8712
+ template: `
8713
+ <button type="button" class="inline-flex h-6 w-6 items-center justify-center rounded-full text-ui-fg-muted transition-colors duration-ui hover:bg-ui-surface-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus" [class.invisible]="!hasChildren()" [attr.aria-label]="rowNode().node.expanded ? 'Recolher' : 'Expandir'" (click)="$event.stopPropagation(); table.toggleNode(rowNode(), $event)">
8714
+ <svg viewBox="0 0 16 16" class="h-4 w-4 transition-transform duration-ui" [class.rotate-90]="rowNode().node.expanded" fill="none" aria-hidden="true"><path d="M6 4l4 4-4 4" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" /></svg>
8715
+ </button>
8716
+ `,
8717
+ }]
8718
+ }], propDecorators: { rowNode: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowNode", required: true }] }] } });
8719
+ /** Checkbox de selecao da linha (modo `checkbox`): `<ui-tree-table-checkbox [value]="rowNode" />`. */
8720
+ class SmzTreeTableCheckboxComponent {
8721
+ table = inject(SmzTreeTableComponent);
8722
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
8723
+ state() {
8724
+ return this.table.selectionState(this.value().node);
8725
+ }
8726
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8727
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SmzTreeTableCheckboxComponent, isStandalone: true, selector: "ui-tree-table-checkbox", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "inline-flex align-middle" }, ngImport: i0, template: `
8728
+ <button type="button" role="checkbox" [attr.aria-checked]="state() === 'partial' ? 'mixed' : state() === 'checked'" class="inline-flex h-5 w-5 items-center justify-center rounded border transition-colors duration-ui focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus" [class]="state() === 'unchecked' ? 'border-ui-line-strong bg-ui-surface-1' : 'border-ui-primary bg-ui-primary text-ui-on-primary'" (click)="$event.stopPropagation(); table.toggleCheckbox(value(), $event)">
8729
+ @if (state() === 'checked') { <svg viewBox="0 0 16 16" class="h-3 w-3" fill="none" aria-hidden="true"><path d="M3.5 8.5l3 3 6-6.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /></svg> }
8730
+ @else if (state() === 'partial') { <svg viewBox="0 0 16 16" class="h-3 w-3" fill="none" aria-hidden="true"><path d="M4 8h8" stroke="currentColor" stroke-width="2" stroke-linecap="round" /></svg> }
8731
+ </button>
8732
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8733
+ }
8734
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableCheckboxComponent, decorators: [{
8735
+ type: Component,
8736
+ args: [{
8737
+ selector: 'ui-tree-table-checkbox',
8738
+ changeDetection: ChangeDetectionStrategy.OnPush,
8739
+ host: { class: 'inline-flex align-middle' },
8740
+ template: `
8741
+ <button type="button" role="checkbox" [attr.aria-checked]="state() === 'partial' ? 'mixed' : state() === 'checked'" class="inline-flex h-5 w-5 items-center justify-center rounded border transition-colors duration-ui focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus" [class]="state() === 'unchecked' ? 'border-ui-line-strong bg-ui-surface-1' : 'border-ui-primary bg-ui-primary text-ui-on-primary'" (click)="$event.stopPropagation(); table.toggleCheckbox(value(), $event)">
8742
+ @if (state() === 'checked') { <svg viewBox="0 0 16 16" class="h-3 w-3" fill="none" aria-hidden="true"><path d="M3.5 8.5l3 3 6-6.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /></svg> }
8743
+ @else if (state() === 'partial') { <svg viewBox="0 0 16 16" class="h-3 w-3" fill="none" aria-hidden="true"><path d="M4 8h8" stroke="currentColor" stroke-width="2" stroke-linecap="round" /></svg> }
8744
+ </button>
8745
+ `,
8746
+ }]
8747
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }] } });
8748
+ /** Checkbox do cabecalho: seleciona/limpa todos os nos. */
8749
+ class SmzTreeTableHeaderCheckboxComponent {
8750
+ table = inject(SmzTreeTableComponent);
8751
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableHeaderCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8752
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SmzTreeTableHeaderCheckboxComponent, isStandalone: true, selector: "ui-tree-table-header-checkbox", host: { classAttribute: "inline-flex align-middle" }, ngImport: i0, template: `
8753
+ <button type="button" role="checkbox" [attr.aria-checked]="table.allSelected()" class="inline-flex h-5 w-5 items-center justify-center rounded border transition-colors duration-ui focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus" [class]="table.allSelected() ? 'border-ui-primary bg-ui-primary text-ui-on-primary' : 'border-ui-line-strong bg-ui-surface-1'" (click)="table.toggleAll(!table.allSelected())">
8754
+ @if (table.allSelected()) { <svg viewBox="0 0 16 16" class="h-3 w-3" fill="none" aria-hidden="true"><path d="M3.5 8.5l3 3 6-6.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /></svg> }
8755
+ </button>
8756
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8757
+ }
8758
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableHeaderCheckboxComponent, decorators: [{
8759
+ type: Component,
8760
+ args: [{
8761
+ selector: 'ui-tree-table-header-checkbox',
8762
+ changeDetection: ChangeDetectionStrategy.OnPush,
8763
+ host: { class: 'inline-flex align-middle' },
8764
+ template: `
8765
+ <button type="button" role="checkbox" [attr.aria-checked]="table.allSelected()" class="inline-flex h-5 w-5 items-center justify-center rounded border transition-colors duration-ui focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus" [class]="table.allSelected() ? 'border-ui-primary bg-ui-primary text-ui-on-primary' : 'border-ui-line-strong bg-ui-surface-1'" (click)="table.toggleAll(!table.allSelected())">
8766
+ @if (table.allSelected()) { <svg viewBox="0 0 16 16" class="h-3 w-3" fill="none" aria-hidden="true"><path d="M3.5 8.5l3 3 6-6.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /></svg> }
8767
+ </button>
8768
+ `,
8769
+ }]
8770
+ }] });
8771
+ /** Cabecalho ordenavel: `<th [smzTtSortableColumn]="'nome'">Nome <ui-tree-table-sort-icon field="nome" /></th>`. */
8772
+ class SmzTreeTableSortableColumnDirective {
8773
+ table = inject(SmzTreeTableComponent);
8774
+ field = input.required({ ...(ngDevMode ? { debugName: "field" } : {}), alias: 'smzTtSortableColumn' });
8775
+ ariaSort() {
8776
+ return this.table.sortField() === this.field() ? (this.table.sortOrder() === 1 ? 'ascending' : 'descending') : 'none';
8777
+ }
8778
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableSortableColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8779
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: SmzTreeTableSortableColumnDirective, isStandalone: true, selector: "th[smzTtSortableColumn]", inputs: { field: { classPropertyName: "field", publicName: "smzTtSortableColumn", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "click": "table.sortBy(field())" }, properties: { "attr.aria-sort": "ariaSort()" }, classAttribute: "cursor-pointer select-none" }, ngImport: i0 });
8780
+ }
8781
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableSortableColumnDirective, decorators: [{
8782
+ type: Directive,
8783
+ args: [{
8784
+ selector: 'th[smzTtSortableColumn]',
8785
+ host: { class: 'cursor-pointer select-none', '(click)': 'table.sortBy(field())', '[attr.aria-sort]': 'ariaSort()' },
8786
+ }]
8787
+ }], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "smzTtSortableColumn", required: true }] }] } });
8788
+ class SmzTreeTableSortIconComponent {
8789
+ table = inject(SmzTreeTableComponent);
8790
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
8791
+ dir() {
8792
+ return this.table.sortField() === this.field() ? this.table.sortOrder() : 0;
8793
+ }
8794
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableSortIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8795
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.1", type: SmzTreeTableSortIconComponent, isStandalone: true, selector: "ui-tree-table-sort-icon", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "ml-1 inline-flex align-middle text-ui-fg-muted" }, ngImport: i0, template: `
8796
+ <svg viewBox="0 0 16 16" class="h-3.5 w-3.5" fill="none" aria-hidden="true">
8797
+ <path d="M5 6l3-3 3 3" [attr.stroke]="dir() === 1 ? 'rgb(var(--smz-color-primary))' : 'currentColor'" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
8798
+ <path d="M5 10l3 3 3-3" [attr.stroke]="dir() === -1 ? 'rgb(var(--smz-color-primary))' : 'currentColor'" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
8799
+ </svg>
8800
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8801
+ }
8802
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzTreeTableSortIconComponent, decorators: [{
8803
+ type: Component,
8804
+ args: [{
8805
+ selector: 'ui-tree-table-sort-icon',
8806
+ changeDetection: ChangeDetectionStrategy.OnPush,
8807
+ host: { class: 'ml-1 inline-flex align-middle text-ui-fg-muted' },
8808
+ template: `
8809
+ <svg viewBox="0 0 16 16" class="h-3.5 w-3.5" fill="none" aria-hidden="true">
8810
+ <path d="M5 6l3-3 3 3" [attr.stroke]="dir() === 1 ? 'rgb(var(--smz-color-primary))' : 'currentColor'" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
8811
+ <path d="M5 10l3 3 3-3" [attr.stroke]="dir() === -1 ? 'rgb(var(--smz-color-primary))' : 'currentColor'" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
8812
+ </svg>
8813
+ `,
8814
+ }]
8815
+ }], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }] } });
8816
+ const SMZ_TREE_TABLE = [
8817
+ SmzTreeTableComponent,
8818
+ SmzTreeTableRowDirective,
8819
+ SmzTreeTableTogglerComponent,
8820
+ SmzTreeTableCheckboxComponent,
8821
+ SmzTreeTableHeaderCheckboxComponent,
8822
+ SmzTreeTableSortableColumnDirective,
8823
+ SmzTreeTableSortIconComponent,
8824
+ SmzTemplateDirective,
8825
+ ];
8826
+
8827
+ /* eslint-disable max-len -- classes Tailwind nos templates */
8828
+ class SmzConfirmContentComponent {
8829
+ options = inject(SmzDialogConfig).data;
8830
+ ref = inject((SmzDialogRef));
8831
+ close(accepted) {
8832
+ this.ref.close(accepted);
8833
+ }
8834
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzConfirmContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8835
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SmzConfirmContentComponent, isStandalone: true, selector: "ui-confirm-content", ngImport: i0, template: `
8836
+ <div class="flex items-start gap-3 font-ui text-ui-md text-ui-fg">
8837
+ @if (options.icon) {
8838
+ <i [class]="options.icon + ' mt-0.5 text-ui-xl text-ui-warning'" aria-hidden="true"></i>
8839
+ }
8840
+ <p class="m-0 flex-1">{{ options.message }}</p>
8841
+ </div>
8842
+ <div class="mt-5 flex justify-end gap-2">
8843
+ @if (options.rejectVisible !== false) {
8844
+ <button smzButton type="button" severity="secondary" variant="outlined" [label]="options.rejectLabel ?? 'Não'" (click)="close(false)"></button>
8845
+ }
8846
+ @if (options.acceptVisible !== false) {
8847
+ <button smzButton type="button" [severity]="options.acceptSeverity ?? 'primary'" [label]="options.acceptLabel ?? 'Sim'" (click)="close(true)"></button>
8848
+ }
8849
+ </div>
8850
+ `, isInline: true, dependencies: [{ kind: "component", type: SmzButtonComponent, selector: "button[smzButton], a[smzButton]", inputs: ["label", "icon", "iconPosition", "severity", "variant", "size", "text", "outlined", "rounded", "loading", "styleClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8851
+ }
8852
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzConfirmContentComponent, decorators: [{
8853
+ type: Component,
8854
+ args: [{
8855
+ selector: 'ui-confirm-content',
8856
+ changeDetection: ChangeDetectionStrategy.OnPush,
8857
+ imports: [SmzButtonComponent],
8858
+ template: `
8859
+ <div class="flex items-start gap-3 font-ui text-ui-md text-ui-fg">
8860
+ @if (options.icon) {
8861
+ <i [class]="options.icon + ' mt-0.5 text-ui-xl text-ui-warning'" aria-hidden="true"></i>
8862
+ }
8863
+ <p class="m-0 flex-1">{{ options.message }}</p>
8864
+ </div>
8865
+ <div class="mt-5 flex justify-end gap-2">
8866
+ @if (options.rejectVisible !== false) {
8867
+ <button smzButton type="button" severity="secondary" variant="outlined" [label]="options.rejectLabel ?? 'Não'" (click)="close(false)"></button>
8868
+ }
8869
+ @if (options.acceptVisible !== false) {
8870
+ <button smzButton type="button" [severity]="options.acceptSeverity ?? 'primary'" [label]="options.acceptLabel ?? 'Sim'" (click)="close(true)"></button>
8871
+ }
8872
+ </div>
8873
+ `,
8874
+ }]
8875
+ }] });
8876
+ /**
8877
+ * Confirmacao modal. Substitui o `ConfirmationService` + `<p-confirmdialog>` do PrimeNG
8878
+ * (nao ha componente a declarar no template).
8879
+ *
8880
+ * confirm.confirm({ message: 'Excluir?', header: 'Confirmacao', icon: 'fa-solid fa-triangle-exclamation', accept: () => ..., reject: () => ... });
8881
+ */
8882
+ class SmzConfirmationService {
8883
+ dialogs = inject(SmzDialogService);
8884
+ confirm(confirmation) {
8885
+ const ref = this.dialogs.open(SmzConfirmContentComponent, {
8886
+ header: confirmation.header ?? 'Confirmação',
8887
+ width: confirmation.width ?? '28rem',
8888
+ closeOnEscape: confirmation.closeOnEscape ?? true,
8889
+ data: confirmation,
8890
+ });
8891
+ ref.onClose.subscribe((accepted) => {
8892
+ if (accepted === true)
8893
+ confirmation.accept?.();
8894
+ else
8895
+ confirmation.reject?.();
8896
+ });
8897
+ return ref;
8898
+ }
8899
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzConfirmationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8900
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzConfirmationService, providedIn: 'root' });
8901
+ }
8902
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzConfirmationService, decorators: [{
8903
+ type: Injectable,
8904
+ args: [{ providedIn: 'root' }]
8905
+ }] });
8906
+
8907
+ /* eslint-disable max-len -- classes Tailwind nos templates */
8908
+ /**
8909
+ * Selecao de arquivos com area de arrastar e soltar e lista de escolhidos.
8910
+ * Substitui o `p-fileupload` (modo `basic`/`advanced` sem envio automatico): o envio ao servidor
8911
+ * fica a cargo do app (ex.: `HttpClient` no handler de `(selected)`).
8912
+ *
8913
+ * <ui-file-upload accept="image/*" [multiple]="true" [maxFileSize]="1000000" (selected)="enviar($event.files)" />
8914
+ */
8915
+ class SmzFileUploadComponent {
8916
+ accept = input('', ...(ngDevMode ? [{ debugName: "accept" }] : []));
8917
+ multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : {}), transform: booleanAttribute });
8918
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : {}), transform: booleanAttribute });
8919
+ /** Tamanho maximo por arquivo, em bytes. */
8920
+ maxFileSize = input(null, ...(ngDevMode ? [{ debugName: "maxFileSize" }] : []));
8921
+ chooseLabel = input('Escolher arquivo', ...(ngDevMode ? [{ debugName: "chooseLabel" }] : []));
8922
+ dropLabel = input('ou arraste aqui', ...(ngDevMode ? [{ debugName: "dropLabel" }] : []));
8923
+ selected = output();
8924
+ removed = output();
8925
+ rejected = output();
8926
+ files = signal([], ...(ngDevMode ? [{ debugName: "files" }] : []));
8927
+ dragging = signal(false, ...(ngDevMode ? [{ debugName: "dragging" }] : []));
8928
+ fileInput = viewChild.required('picker');
8929
+ /** Limpa a lista (equivale a `clear()` do `p-fileupload`). */
8930
+ clear() {
8931
+ this.files.set([]);
8932
+ this.fileInput().nativeElement.value = '';
8933
+ }
8934
+ onPick(event) {
8935
+ const target = event.target;
8936
+ this.add(Array.from(target.files ?? []), event);
8937
+ target.value = '';
8938
+ }
8939
+ onDragOver(event) {
8940
+ if (this.disabled())
8941
+ return;
8942
+ event.preventDefault();
8943
+ this.dragging.set(true);
8944
+ }
8945
+ onDrop(event) {
8946
+ event.preventDefault();
8947
+ this.dragging.set(false);
8948
+ if (this.disabled())
8949
+ return;
8950
+ this.add(Array.from(event.dataTransfer?.files ?? []), event);
8951
+ }
8952
+ remove(file) {
8953
+ this.files.update((list) => list.filter((entry) => entry !== file));
8954
+ this.removed.emit({ file });
8955
+ }
8956
+ size(file) {
8957
+ return file.size < 1024 * 1024 ? `${Math.max(1, Math.round(file.size / 1024))} KB` : `${(file.size / 1024 / 1024).toFixed(1)} MB`;
8958
+ }
8959
+ add(incoming, event) {
8960
+ const accepted = [];
8961
+ for (const file of incoming) {
8962
+ if (!this.matchesAccept(file))
8963
+ this.rejected.emit({ file, reason: 'type' });
8964
+ else if (this.maxFileSize() != null && file.size > this.maxFileSize())
8965
+ this.rejected.emit({ file, reason: 'size' });
8966
+ else
8967
+ accepted.push(file);
8968
+ }
8969
+ if (accepted.length === 0)
8970
+ return;
8971
+ const next = this.multiple() ? [...this.files(), ...accepted] : [accepted[0]];
8972
+ this.files.set(next);
8973
+ this.selected.emit({ files: next, originalEvent: event });
8974
+ }
8975
+ matchesAccept(file) {
8976
+ const accept = (this.accept() ?? '').trim();
8977
+ if (!accept)
8978
+ return true;
8979
+ return accept.split(',').map((rule) => rule.trim().toLowerCase()).some((rule) => {
8980
+ if (rule.startsWith('.'))
8981
+ return file.name.toLowerCase().endsWith(rule);
8982
+ if (rule.endsWith('/*'))
8983
+ return file.type.toLowerCase().startsWith(rule.slice(0, -1));
8984
+ return file.type.toLowerCase() === rule;
8985
+ });
8986
+ }
8987
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzFileUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8988
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SmzFileUploadComponent, isStandalone: true, selector: "ui-file-upload", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, chooseLabel: { classPropertyName: "chooseLabel", publicName: "chooseLabel", isSignal: true, isRequired: false, transformFunction: null }, dropLabel: { classPropertyName: "dropLabel", publicName: "dropLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected", removed: "removed", rejected: "rejected" }, host: { classAttribute: "block font-ui text-ui-md text-ui-fg" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["picker"], descendants: true, isSignal: true }], ngImport: i0, template: `
8989
+ <input #picker type="file" class="sr-only" [accept]="accept() ?? ''" [multiple]="multiple()" [disabled]="disabled()" (change)="onPick($event)" />
8990
+ <div
8991
+ class="flex flex-col items-center justify-center gap-2 rounded-card border-2 border-dashed p-6 text-center transition-colors duration-ui"
8992
+ [class]="dragging() ? 'border-ui-primary bg-ui-primary/10' : 'border-ui-line-strong bg-ui-surface-1'"
8993
+ [class.opacity-50]="disabled()"
8994
+ (dragover)="onDragOver($event)"
8995
+ (dragleave)="dragging.set(false)"
8996
+ (drop)="onDrop($event)"
8997
+ >
8998
+ <button type="button" class="rounded-control border border-ui-line-strong px-control-x py-2 font-medium transition-colors duration-ui hover:bg-ui-surface-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus disabled:pointer-events-none" [disabled]="disabled()" (click)="picker.click()">{{ chooseLabel() }}</button>
8999
+ <span class="text-ui-sm text-ui-fg-muted">{{ dropLabel() }}</span>
9000
+ </div>
9001
+ @if (files().length > 0) {
9002
+ <ul class="m-0 mt-3 flex list-none flex-col gap-2 p-0">
9003
+ @for (file of files(); track file) {
9004
+ <li class="flex items-center justify-between gap-2 rounded-control border border-ui-line px-3 py-2">
9005
+ <span class="min-w-0 flex-1 truncate">{{ file.name }} <span class="text-ui-sm text-ui-fg-muted">({{ size(file) }})</span></span>
9006
+ <button type="button" class="inline-flex h-6 w-6 items-center justify-center rounded-full text-ui-fg-muted hover:bg-ui-surface-3" aria-label="Remover" (click)="remove(file)">
9007
+ <svg viewBox="0 0 16 16" class="h-3 w-3" fill="none" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" /></svg>
9008
+ </button>
9009
+ </li>
9010
+ }
9011
+ </ul>
9012
+ }
9013
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
9014
+ }
9015
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SmzFileUploadComponent, decorators: [{
9016
+ type: Component,
9017
+ args: [{
9018
+ selector: 'ui-file-upload',
9019
+ changeDetection: ChangeDetectionStrategy.OnPush,
9020
+ host: { class: 'block font-ui text-ui-md text-ui-fg' },
9021
+ template: `
9022
+ <input #picker type="file" class="sr-only" [accept]="accept() ?? ''" [multiple]="multiple()" [disabled]="disabled()" (change)="onPick($event)" />
9023
+ <div
9024
+ class="flex flex-col items-center justify-center gap-2 rounded-card border-2 border-dashed p-6 text-center transition-colors duration-ui"
9025
+ [class]="dragging() ? 'border-ui-primary bg-ui-primary/10' : 'border-ui-line-strong bg-ui-surface-1'"
9026
+ [class.opacity-50]="disabled()"
9027
+ (dragover)="onDragOver($event)"
9028
+ (dragleave)="dragging.set(false)"
9029
+ (drop)="onDrop($event)"
9030
+ >
9031
+ <button type="button" class="rounded-control border border-ui-line-strong px-control-x py-2 font-medium transition-colors duration-ui hover:bg-ui-surface-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-focus disabled:pointer-events-none" [disabled]="disabled()" (click)="picker.click()">{{ chooseLabel() }}</button>
9032
+ <span class="text-ui-sm text-ui-fg-muted">{{ dropLabel() }}</span>
9033
+ </div>
9034
+ @if (files().length > 0) {
9035
+ <ul class="m-0 mt-3 flex list-none flex-col gap-2 p-0">
9036
+ @for (file of files(); track file) {
9037
+ <li class="flex items-center justify-between gap-2 rounded-control border border-ui-line px-3 py-2">
9038
+ <span class="min-w-0 flex-1 truncate">{{ file.name }} <span class="text-ui-sm text-ui-fg-muted">({{ size(file) }})</span></span>
9039
+ <button type="button" class="inline-flex h-6 w-6 items-center justify-center rounded-full text-ui-fg-muted hover:bg-ui-surface-3" aria-label="Remover" (click)="remove(file)">
9040
+ <svg viewBox="0 0 16 16" class="h-3 w-3" fill="none" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" /></svg>
9041
+ </button>
9042
+ </li>
9043
+ }
9044
+ </ul>
9045
+ }
9046
+ `,
9047
+ }]
9048
+ }], propDecorators: { accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }], chooseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "chooseLabel", required: false }] }], dropLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropLabel", required: false }] }], selected: [{ type: i0.Output, args: ["selected"] }], removed: [{ type: i0.Output, args: ["removed"] }], rejected: [{ type: i0.Output, args: ["rejected"] }], fileInput: [{ type: i0.ViewChild, args: ['picker', { isSignal: true }] }] } });
9049
+
7994
9050
  /**
7995
9051
  * Generated bundle index. Do not edit.
7996
9052
  */
7997
9053
 
7998
- export { SMZ_DIALOG_CONTENT, SMZ_SOFT_TONE, SMZ_SOLID_TONE, SmzAccordionComponent, SmzAccordionContentComponent, SmzAccordionHeaderComponent, SmzAccordionPanelComponent, SmzAnchoredPanel, SmzAutoCompleteComponent, SmzAutoFocusDirective, SmzBadgeComponent, SmzBadgeDirective, SmzBlockUiComponent, SmzButtonComponent, SmzCheckboxComponent, SmzColorPickerComponent, SmzConnectedOverlayScrollHandler, SmzDataViewComponent, SmzDatePickerComponent, SmzDialogComponent, SmzDialogConfig, SmzDialogFrameComponent, SmzDialogRef, SmzDialogService, SmzDividerComponent, SmzDomHandler, SmzDrawerComponent, SmzFilterMatchMode, SmzFilterOperator, SmzFilterService, SmzIconComponent, SmzIconFieldComponent, SmzInputGroupAddonComponent, SmzInputGroupComponent, SmzInputIconComponent, SmzInputMaskComponent, SmzInputNumberComponent, SmzInputTextDirective, SmzListboxComponent, SmzLocaleService, SmzMenuListComponent, SmzMessageComponent, SmzMessageService, SmzMultiSelectComponent, SmzObjectUtils, SmzPaginatorComponent, SmzPasswordComponent, SmzPickListComponent, SmzPopoverComponent, SmzProgressBarComponent, SmzRadioButtonComponent, SmzRippleDirective, SmzSelectButtonComponent, SmzSelectComponent, SmzSkeletonComponent, SmzStyleClassDirective, SmzTabComponent, SmzTabListComponent, SmzTabPanelComponent, SmzTabPanelsComponent, SmzTabsComponent, SmzTagComponent, SmzTemplateDirective, SmzTextareaDirective, SmzThemeService, SmzToastContainerComponent, SmzToggleSwitchComponent, SmzToolbarComponent, SmzTooltipComponent, SmzTooltipDirective, SmzTranslationKeys, SmzTreeSelectComponent, SmzUiTimelineComponent, SmzUiTreeComponent, SmzValueAccessor, SmzZIndex, filterOptions, optionDisabled, optionLabel, optionValue, sameValue, smzCalendarStart, smzCx, smzFindTemplate, smzFormatDate, smzMergeClasses, smzNormalizeSeverity, smzNormalizeStyleClass, smzParseButtonStyleClass, smzParseDate, smzSameDay, smzStartOfDay, smzStaticHostClass, smzTwoDigits, smzUniqueId, smzVariants };
9054
+ export { SMZ_DIALOG_CONTENT, SMZ_SOFT_TONE, SMZ_SOLID_TONE, SMZ_TREE_TABLE, SmzAccordionComponent, SmzAccordionContentComponent, SmzAccordionHeaderComponent, SmzAccordionPanelComponent, SmzAnchoredPanel, SmzAutoCompleteComponent, SmzAutoFocusDirective, SmzBadgeComponent, SmzBadgeDirective, SmzBlockUiComponent, SmzButtonComponent, SmzCardComponent, SmzCheckboxComponent, SmzColorPickerComponent, SmzConfirmContentComponent, SmzConfirmationService, SmzConnectedOverlayScrollHandler, SmzDataViewComponent, SmzDatePickerComponent, SmzDialogComponent, SmzDialogConfig, SmzDialogFrameComponent, SmzDialogRef, SmzDialogService, SmzDividerComponent, SmzDomHandler, SmzDrawerComponent, SmzFileUploadComponent, SmzFilterMatchMode, SmzFilterOperator, SmzFilterService, SmzFloatLabelComponent, SmzIconComponent, SmzIconFieldComponent, SmzInputGroupAddonComponent, SmzInputGroupComponent, SmzInputIconComponent, SmzInputMaskComponent, SmzInputNumberComponent, SmzInputTextDirective, SmzListboxComponent, SmzLocaleService, SmzMenuListComponent, SmzMessageComponent, SmzMessageService, SmzMultiSelectComponent, SmzObjectUtils, SmzPaginatorComponent, SmzPanelComponent, SmzPasswordComponent, SmzPickListComponent, SmzPopoverComponent, SmzProgressBarComponent, SmzProgressSpinnerComponent, SmzRadioButtonComponent, SmzRippleDirective, SmzSelectButtonComponent, SmzSelectComponent, SmzSkeletonComponent, SmzSplitterComponent, SmzSplitterPanelComponent, SmzStyleClassDirective, SmzTabComponent, SmzTabListComponent, SmzTabPanelComponent, SmzTabPanelsComponent, SmzTabsComponent, SmzTagComponent, SmzTemplateDirective, SmzTextareaDirective, SmzThemeService, SmzToastContainerComponent, SmzToggleSwitchComponent, SmzToolbarComponent, SmzTooltipComponent, SmzTooltipDirective, SmzTranslationKeys, SmzTreeSelectComponent, SmzTreeTableCheckboxComponent, SmzTreeTableComponent, SmzTreeTableHeaderCheckboxComponent, SmzTreeTableRowDirective, SmzTreeTableSortIconComponent, SmzTreeTableSortableColumnDirective, SmzTreeTableTogglerComponent, SmzUiTimelineComponent, SmzUiTreeComponent, SmzValueAccessor, SmzZIndex, filterOptions, optionDisabled, optionLabel, optionValue, sameValue, smzCalendarStart, smzCx, smzFindTemplate, smzFormatDate, smzMergeClasses, smzNormalizeSeverity, smzNormalizeStyleClass, smzParseButtonStyleClass, smzParseDate, smzSameDay, smzStartOfDay, smzStaticHostClass, smzTwoDigits, smzUniqueId, smzVariants };
7999
9055
  //# sourceMappingURL=ngx-smz-ui-kit.mjs.map