yukit-web 0.0.15 → 0.0.17
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.
- package/.npm/_cacache/content-v2/sha512/{4d/45/448d7568a32a10e83c1b42f01a0dfdb37044257acc46d5df8e088fbc4d5cae370823d9414201e9097ab06a0fff272d00d05d8b7567fa35920ba629a745ce → b1/40/a1bbf075898439718420de93d6709e74bfa04bd90ee41061890f2302a62c00a9ab723801773702e5b8a773ff353b687874f5cd83890a5082f40316fcc0f9} +1 -1
- package/.npm/_cacache/index-v5/64/dc/73c7a26f2e6eb0c711133d96c247da5ecf0eba708cd37c450a7b3c7cb488 +1 -1
- package/.npm/_logs/{2026-09-08T13_19_17_944Z-debug-0.log → 2026-09-10T10_48_51_695Z-debug-0.log} +10 -10
- package/.npm/_logs/{2026-09-08T13_19_18_482Z-debug-0.log → 2026-09-10T10_48_52_079Z-debug-0.log} +2 -2
- package/fesm2022/yukit-web.mjs +332 -23
- package/fesm2022/yukit-web.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/theme/tokens/component-colors.css +16 -0
- package/types/yukit-web.d.ts +288 -6
package/fesm2022/yukit-web.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { clsx } from 'clsx';
|
|
2
2
|
import { twMerge } from 'tailwind-merge';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { forwardRef, signal,
|
|
4
|
+
import { input, Directive, forwardRef, signal, inject, ElementRef, booleanAttribute, output, computed, ChangeDetectionStrategy, Component, TemplateRef, contentChildren, model, viewChild, contentChild, Injector, afterNextRender, effect, numberAttribute, linkedSignal, Injectable, runInInjectionContext, DestroyRef } from '@angular/core';
|
|
5
|
+
import { classes, hlm } from 'yukit-web/helm/utils';
|
|
5
6
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
6
7
|
import { HlmButton, provideBrnButtonConfig } from 'yukit-web/helm/button';
|
|
7
8
|
import * as i2 from 'yukit-web/helm/dropdown-menu';
|
|
@@ -63,7 +64,6 @@ import { BrnPopoverTrigger } from '@spartan-ng/brain/popover';
|
|
|
63
64
|
import * as i1$j from '@spartan-ng/brain/tooltip';
|
|
64
65
|
import { provideBrnTooltipDefaultOptions, BrnTooltip } from '@spartan-ng/brain/tooltip';
|
|
65
66
|
import { tooltipPositionVariants, DEFAULT_TOOLTIP_CONTENT_CLASSES, DEFAULT_TOOLTIP_SVG_CLASS } from 'yukit-web/helm/tooltip';
|
|
66
|
-
import { hlm, classes } from 'yukit-web/helm/utils';
|
|
67
67
|
import { HlmSpinner } from 'yukit-web/helm/spinner';
|
|
68
68
|
import { HlmToaster } from 'yukit-web/helm/sonner';
|
|
69
69
|
export { toast as yuwToast } from '@spartan-ng/brain/sonner';
|
|
@@ -86,6 +86,8 @@ import { HlmSidebarService, provideHlmSidebarConfig, HlmSidebarWrapper, HlmSideb
|
|
|
86
86
|
export { HlmSidebarService as YuwSidebarService, provideHlmSidebarConfig as provideYuwSidebarConfig } from 'yukit-web/helm/sidebar';
|
|
87
87
|
import { Router, isActive, RouterLink, RouterLinkActive } from '@angular/router';
|
|
88
88
|
import { OverlayContainer } from '@angular/cdk/overlay';
|
|
89
|
+
import * as i1$r from 'yukit-web/helm/command';
|
|
90
|
+
import { HlmCommandImports, HlmCommandDialog } from 'yukit-web/helm/command';
|
|
89
91
|
|
|
90
92
|
/**
|
|
91
93
|
* Merges class lists the shadcn/Spartan way: `clsx` resolves conditionals/arrays, `twMerge`
|
|
@@ -99,6 +101,45 @@ function cn(...inputs) {
|
|
|
99
101
|
return twMerge(clsx(inputs));
|
|
100
102
|
}
|
|
101
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Applies dynamic classes to an element that is also styled by a helm directive.
|
|
106
|
+
*
|
|
107
|
+
* @remarks
|
|
108
|
+
* The helm layer owns the `class` attribute through its `classes()` utility, which keeps a
|
|
109
|
+
* registry of *sources* per element and rewrites the attribute whenever any of them changes. It
|
|
110
|
+
* also watches the attribute with a `MutationObserver` and treats every write it did not make
|
|
111
|
+
* itself as consumer-authored *base* classes, which it merges **last** so they win.
|
|
112
|
+
*
|
|
113
|
+
* An Angular `[class]` binding on the same element is exactly such a foreign write, so the first
|
|
114
|
+
* value it emits is captured as a base class and then beats every value the binding emits
|
|
115
|
+
* afterwards — the element is pinned to whatever it rendered with. Because `hlm()` merges through
|
|
116
|
+
* `twMerge`, only classes of the same Tailwind group are pinned, which is why a dynamic `size`
|
|
117
|
+
* (`h-10` vs `h-11`) freezes while an unrelated `class` input still appears to work.
|
|
118
|
+
*
|
|
119
|
+
* Binding `[yuwClass]` instead registers the value as a regular `classes()` source: it is
|
|
120
|
+
* replaceable on every change, and still merges after the helm directive's own variants, so it
|
|
121
|
+
* keeps the precedence a `[class]` binding had.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```html
|
|
125
|
+
* <button hlmBtn [size]="size()" [yuwClass]="_btnClass()">Save</button>
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
class YuwClassDirective {
|
|
129
|
+
constructor() {
|
|
130
|
+
this.yuwClass = input('', ...(ngDevMode ? [{ debugName: "yuwClass" }] : /* istanbul ignore next */ []));
|
|
131
|
+
classes(() => this.yuwClass());
|
|
132
|
+
}
|
|
133
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwClassDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
134
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.22", type: YuwClassDirective, isStandalone: true, selector: "[yuwClass]", inputs: { yuwClass: { classPropertyName: "yuwClass", publicName: "yuwClass", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
135
|
+
}
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwClassDirective, decorators: [{
|
|
137
|
+
type: Directive,
|
|
138
|
+
args: [{
|
|
139
|
+
selector: '[yuwClass]',
|
|
140
|
+
}]
|
|
141
|
+
}], ctorParameters: () => [], propDecorators: { yuwClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "yuwClass", required: false }] }] } });
|
|
142
|
+
|
|
102
143
|
/**
|
|
103
144
|
* Registers a component as a form control, so `formControlName`/`formControl`/`ngModel` bind to it.
|
|
104
145
|
*
|
|
@@ -233,7 +274,10 @@ const yuwButtonVariants = cva('', {
|
|
|
233
274
|
* Outputs:
|
|
234
275
|
* - `clicked`: Emits MouseEvent on click.
|
|
235
276
|
*
|
|
236
|
-
* `_btnClass` merges our variant layer with the consumer's `class`, which goes last so it wins.
|
|
277
|
+
* `_btnClass` merges our variant layer with the consumer's `class`, which goes last so it wins. It
|
|
278
|
+
* reaches the inner element through `[yuwClass]` rather than `[class]`: the helm layer owns the
|
|
279
|
+
* `class` attribute and treats a foreign write as consumer-authored base classes that it merges
|
|
280
|
+
* last, which would pin the first rendered value and stop `size` from ever changing again.
|
|
237
281
|
*
|
|
238
282
|
* The host carries `inline-flex` so it is a real box rather than an inline one: an overlay trigger
|
|
239
283
|
* directive composed onto `<yuw-button>` (see `YuwPopoverTriggerDirective`) anchors its panel to the
|
|
@@ -278,16 +322,16 @@ class YuwButtonComponent {
|
|
|
278
322
|
this.clicked.emit(event);
|
|
279
323
|
}
|
|
280
324
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
281
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwButtonComponent, isStandalone: true, selector: "yuw-button", inputs: { animationDisabled: { classPropertyName: "animationDisabled", publicName: "animationDisabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, yuwDropdownMenuTrigger: { classPropertyName: "yuwDropdownMenuTrigger", publicName: "yuwDropdownMenuTrigger", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, host: { properties: { "class.cursor-not-allowed": "disabled()", "attr.data-yuw-color": "color()", "attr.data-yuw-variant": "_effectiveVariant()" }, classAttribute: "inline-flex" }, ngImport: i0, template: "@if (href(); as hrefValue) {\n <a\n hlmBtn\n [variant]=\"_effectiveVariant()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [href]=\"disabled() ? null : hrefValue\"\n [target]=\"target()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n [hlmDropdownMenuTrigger]=\"yuwDropdownMenuTrigger()\"\n [
|
|
325
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwButtonComponent, isStandalone: true, selector: "yuw-button", inputs: { animationDisabled: { classPropertyName: "animationDisabled", publicName: "animationDisabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, yuwDropdownMenuTrigger: { classPropertyName: "yuwDropdownMenuTrigger", publicName: "yuwDropdownMenuTrigger", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, host: { properties: { "class.cursor-not-allowed": "disabled()", "attr.data-yuw-color": "color()", "attr.data-yuw-variant": "_effectiveVariant()" }, classAttribute: "inline-flex" }, ngImport: i0, template: "@if (href(); as hrefValue) {\n <a\n hlmBtn\n [variant]=\"_effectiveVariant()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [href]=\"disabled() ? null : hrefValue\"\n [target]=\"target()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n [hlmDropdownMenuTrigger]=\"yuwDropdownMenuTrigger()\"\n [yuwClass]=\"_btnClass()\"\n >\n <ng-content select=\"[yuwButtonIcon]\" />\n <ng-content />\n </a>\n} @else {\n <button\n hlmBtn\n [variant]=\"_effectiveVariant()\"\n [size]=\"size()\"\n [type]=\"type()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n [hlmDropdownMenuTrigger]=\"yuwDropdownMenuTrigger()\"\n [yuwClass]=\"_btnClass()\"\n >\n <ng-content select=\"[yuwButtonIcon]\" />\n <ng-content />\n </button>\n}\n", dependencies: [{ kind: "directive", type: HlmButton, selector: "button[hlmBtn], a[hlmBtn]", inputs: ["variant", "size"], exportAs: ["hlmBtn"] }, { kind: "directive", type: HlmDropdownMenuTrigger, selector: "[hlmDropdownMenuTrigger]", inputs: ["align", "side"] }, { kind: "directive", type: YuwClassDirective, selector: "[yuwClass]", inputs: ["yuwClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
282
326
|
}
|
|
283
327
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwButtonComponent, decorators: [{
|
|
284
328
|
type: Component,
|
|
285
|
-
args: [{ selector: 'yuw-button', imports: [HlmButton, HlmDropdownMenuTrigger], host: {
|
|
329
|
+
args: [{ selector: 'yuw-button', imports: [HlmButton, HlmDropdownMenuTrigger, YuwClassDirective], host: {
|
|
286
330
|
class: 'inline-flex',
|
|
287
331
|
'[class.cursor-not-allowed]': 'disabled()',
|
|
288
332
|
'[attr.data-yuw-color]': 'color()',
|
|
289
333
|
'[attr.data-yuw-variant]': '_effectiveVariant()',
|
|
290
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (href(); as hrefValue) {\n <a\n hlmBtn\n [variant]=\"_effectiveVariant()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [href]=\"disabled() ? null : hrefValue\"\n [target]=\"target()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n [hlmDropdownMenuTrigger]=\"yuwDropdownMenuTrigger()\"\n [
|
|
334
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (href(); as hrefValue) {\n <a\n hlmBtn\n [variant]=\"_effectiveVariant()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [href]=\"disabled() ? null : hrefValue\"\n [target]=\"target()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n [hlmDropdownMenuTrigger]=\"yuwDropdownMenuTrigger()\"\n [yuwClass]=\"_btnClass()\"\n >\n <ng-content select=\"[yuwButtonIcon]\" />\n <ng-content />\n </a>\n} @else {\n <button\n hlmBtn\n [variant]=\"_effectiveVariant()\"\n [size]=\"size()\"\n [type]=\"type()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n [hlmDropdownMenuTrigger]=\"yuwDropdownMenuTrigger()\"\n [yuwClass]=\"_btnClass()\"\n >\n <ng-content select=\"[yuwButtonIcon]\" />\n <ng-content />\n </button>\n}\n" }]
|
|
291
335
|
}], propDecorators: { animationDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "animationDisabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], target: [{ type: i0.Input, args: [{ isSignal: true, alias: "target", required: false }] }], transparent: [{ type: i0.Input, args: [{ isSignal: true, alias: "transparent", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], yuwDropdownMenuTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "yuwDropdownMenuTrigger", required: false }] }], clicked: [{ type: i0.Output, args: ["clicked"] }] } });
|
|
292
336
|
|
|
293
337
|
/**
|
|
@@ -1303,22 +1347,22 @@ class YuwSearchInputComponent extends YuwValueAccessorBase {
|
|
|
1303
1347
|
this._collapsible = computed(() => this.collapseFrom() !== undefined, ...(ngDevMode ? [{ debugName: "_collapsible" }] : /* istanbul ignore next */ []));
|
|
1304
1348
|
this._disabled = computed(() => this._isDisabled(this.disabled()), ...(ngDevMode ? [{ debugName: "_disabled" }] : /* istanbul ignore next */ []));
|
|
1305
1349
|
this._expandButtonClasses = computed(() => searchInputExpandButtonVariants({ size: this.size() }), ...(ngDevMode ? [{ debugName: "_expandButtonClasses" }] : /* istanbul ignore next */ []));
|
|
1306
|
-
this._expanded = computed(() => !this._collapsible() || this._open(), ...(ngDevMode ? [{ debugName: "_expanded" }] : /* istanbul ignore next */ []));
|
|
1307
1350
|
this._fieldClasses = computed(() => searchInputFieldVariants({ collapsible: this._collapsible() }), ...(ngDevMode ? [{ debugName: "_fieldClasses" }] : /* istanbul ignore next */ []));
|
|
1308
1351
|
this._iconClasses = computed(() => searchInputIconVariants({ collapsible: this._collapsible(), size: this.size() }), ...(ngDevMode ? [{ debugName: "_iconClasses" }] : /* istanbul ignore next */ []));
|
|
1309
1352
|
this._inputId = computed(() => this.inputId() ?? this._autoId, ...(ngDevMode ? [{ debugName: "_inputId" }] : /* istanbul ignore next */ []));
|
|
1353
|
+
this.expanded = computed(() => !this._collapsible() || this._open(), ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
|
|
1310
1354
|
this._showClear = computed(() => this.clearAriaLabel() !== undefined &&
|
|
1311
1355
|
this.value().length > 0 &&
|
|
1312
|
-
this.
|
|
1356
|
+
this.expanded() &&
|
|
1313
1357
|
!this._disabled() &&
|
|
1314
1358
|
!this.readonly(), ...(ngDevMode ? [{ debugName: "_showClear" }] : /* istanbul ignore next */ []));
|
|
1315
|
-
this._showExpandButton = computed(() => !this.
|
|
1359
|
+
this._showExpandButton = computed(() => !this.expanded() && !this._disabled(), ...(ngDevMode ? [{ debugName: "_showExpandButton" }] : /* istanbul ignore next */ []));
|
|
1316
1360
|
this._wrapperClasses = computed(() => searchInputCollapsibleVariants({
|
|
1317
1361
|
collapseFrom: this.collapseFrom(),
|
|
1318
|
-
expanded: this.
|
|
1362
|
+
expanded: this.expanded(),
|
|
1319
1363
|
size: this.size(),
|
|
1320
1364
|
}), ...(ngDevMode ? [{ debugName: "_wrapperClasses" }] : /* istanbul ignore next */ []));
|
|
1321
|
-
this._wrapperMaxWidth = computed(() => (this.
|
|
1365
|
+
this._wrapperMaxWidth = computed(() => (this.expanded() ? this.expandedWidth() : null), ...(ngDevMode ? [{ debugName: "_wrapperMaxWidth" }] : /* istanbul ignore next */ []));
|
|
1322
1366
|
}
|
|
1323
1367
|
_emptyValue() {
|
|
1324
1368
|
return '';
|
|
@@ -1372,13 +1416,13 @@ class YuwSearchInputComponent extends YuwValueAccessorBase {
|
|
|
1372
1416
|
this.searched.emit(next);
|
|
1373
1417
|
}
|
|
1374
1418
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwSearchInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
1375
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwSearchInputComponent, isStandalone: true, selector: "yuw-search-input", inputs: { autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, clearAriaLabel: { classPropertyName: "clearAriaLabel", publicName: "clearAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, collapseFrom: { classPropertyName: "collapseFrom", publicName: "collapseFrom", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, expandAriaLabel: { classPropertyName: "expandAriaLabel", publicName: "expandAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, expandedWidth: { classPropertyName: "expandedWidth", publicName: "expandedWidth", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", committed: "committed", searched: "searched" }, host: { classAttribute: "contents" }, providers: [provideValueAccessor(YuwSearchInputComponent), provideIcons({ lucideSearch, lucideX })], viewQueries: [{ propertyName: "_input", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div [class]=\"_wrapperClasses()\" [style.max-width]=\"_wrapperMaxWidth()\">\n <hlm-input-group [class]=\"_classes()\">\n <hlm-input-group-addon align=\"inline-start\" [class]=\"_iconClasses()\">\n @if (_showExpandButton()) {\n <button\n hlmInputGroupButton\n size=\"icon-sm\"\n [class]=\"_expandButtonClasses()\"\n [attr.aria-label]=\"expandAriaLabel()\"\n [attr.aria-expanded]=\"false\"\n (focus)=\"onExpandFocus($event)\"\n (click)=\"onExpand()\"\n >\n <ng-icon name=\"lucideSearch\" />\n </button>\n } @else {\n <ng-icon name=\"lucideSearch\" />\n }\n </hlm-input-group-addon>\n\n <input\n #searchInput\n hlmInputGroupInput\n [class]=\"_fieldClasses()\"\n [id]=\"_inputId()\"\n type=\"text\"\n inputmode=\"search\"\n [value]=\"value()\"\n [disabled]=\"_disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [forceInvalid]=\"invalid()\"\n [attr.name]=\"name()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.tabindex]=\"
|
|
1419
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwSearchInputComponent, isStandalone: true, selector: "yuw-search-input", inputs: { autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, clearAriaLabel: { classPropertyName: "clearAriaLabel", publicName: "clearAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, collapseFrom: { classPropertyName: "collapseFrom", publicName: "collapseFrom", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, expandAriaLabel: { classPropertyName: "expandAriaLabel", publicName: "expandAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, expandedWidth: { classPropertyName: "expandedWidth", publicName: "expandedWidth", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", committed: "committed", searched: "searched" }, host: { classAttribute: "contents" }, providers: [provideValueAccessor(YuwSearchInputComponent), provideIcons({ lucideSearch, lucideX })], viewQueries: [{ propertyName: "_input", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div [class]=\"_wrapperClasses()\" [style.max-width]=\"_wrapperMaxWidth()\">\n <hlm-input-group [class]=\"_classes()\">\n <hlm-input-group-addon align=\"inline-start\" [class]=\"_iconClasses()\">\n @if (_showExpandButton()) {\n <button\n hlmInputGroupButton\n size=\"icon-sm\"\n [class]=\"_expandButtonClasses()\"\n [attr.aria-label]=\"expandAriaLabel()\"\n [attr.aria-expanded]=\"false\"\n (focus)=\"onExpandFocus($event)\"\n (click)=\"onExpand()\"\n >\n <ng-icon name=\"lucideSearch\" />\n </button>\n } @else {\n <ng-icon name=\"lucideSearch\" />\n }\n </hlm-input-group-addon>\n\n <input\n #searchInput\n hlmInputGroupInput\n [class]=\"_fieldClasses()\"\n [id]=\"_inputId()\"\n type=\"text\"\n inputmode=\"search\"\n [value]=\"value()\"\n [disabled]=\"_disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [forceInvalid]=\"invalid()\"\n [attr.name]=\"name()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.tabindex]=\"expanded() ? null : -1\"\n [attr.aria-hidden]=\"expanded() ? null : true\"\n (input)=\"onInput($event)\"\n (keydown.enter)=\"onEnter()\"\n (keydown.escape)=\"onEscape()\"\n (blur)=\"onBlur()\"\n />\n\n @if (_showClear()) {\n <hlm-input-group-addon align=\"inline-end\">\n <button hlmInputGroupButton size=\"icon-xs\" [attr.aria-label]=\"clearAriaLabel()\" (click)=\"onClear()\">\n <ng-icon name=\"lucideX\" />\n </button>\n </hlm-input-group-addon>\n }\n </hlm-input-group>\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.HlmInputGroup, selector: "[hlmInputGroup],hlm-input-group" }, { kind: "directive", type: i1$3.HlmInputGroupAddon, selector: "[hlmInputGroupAddon],hlm-input-group-addon", inputs: ["align"] }, { kind: "directive", type: i1$3.HlmInputGroupButton, selector: "button[hlmInputGroupButton]", inputs: ["size", "type"] }, { kind: "directive", type: i1$3.HlmInputGroupInput, selector: "input[hlmInputGroupInput]" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1376
1420
|
}
|
|
1377
1421
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwSearchInputComponent, decorators: [{
|
|
1378
1422
|
type: Component,
|
|
1379
1423
|
args: [{ selector: 'yuw-search-input', imports: [...HlmInputGroupImports, NgIcon], providers: [provideValueAccessor(YuwSearchInputComponent), provideIcons({ lucideSearch, lucideX })], host: {
|
|
1380
1424
|
class: 'contents',
|
|
1381
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"_wrapperClasses()\" [style.max-width]=\"_wrapperMaxWidth()\">\n <hlm-input-group [class]=\"_classes()\">\n <hlm-input-group-addon align=\"inline-start\" [class]=\"_iconClasses()\">\n @if (_showExpandButton()) {\n <button\n hlmInputGroupButton\n size=\"icon-sm\"\n [class]=\"_expandButtonClasses()\"\n [attr.aria-label]=\"expandAriaLabel()\"\n [attr.aria-expanded]=\"false\"\n (focus)=\"onExpandFocus($event)\"\n (click)=\"onExpand()\"\n >\n <ng-icon name=\"lucideSearch\" />\n </button>\n } @else {\n <ng-icon name=\"lucideSearch\" />\n }\n </hlm-input-group-addon>\n\n <input\n #searchInput\n hlmInputGroupInput\n [class]=\"_fieldClasses()\"\n [id]=\"_inputId()\"\n type=\"text\"\n inputmode=\"search\"\n [value]=\"value()\"\n [disabled]=\"_disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [forceInvalid]=\"invalid()\"\n [attr.name]=\"name()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.tabindex]=\"
|
|
1425
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"_wrapperClasses()\" [style.max-width]=\"_wrapperMaxWidth()\">\n <hlm-input-group [class]=\"_classes()\">\n <hlm-input-group-addon align=\"inline-start\" [class]=\"_iconClasses()\">\n @if (_showExpandButton()) {\n <button\n hlmInputGroupButton\n size=\"icon-sm\"\n [class]=\"_expandButtonClasses()\"\n [attr.aria-label]=\"expandAriaLabel()\"\n [attr.aria-expanded]=\"false\"\n (focus)=\"onExpandFocus($event)\"\n (click)=\"onExpand()\"\n >\n <ng-icon name=\"lucideSearch\" />\n </button>\n } @else {\n <ng-icon name=\"lucideSearch\" />\n }\n </hlm-input-group-addon>\n\n <input\n #searchInput\n hlmInputGroupInput\n [class]=\"_fieldClasses()\"\n [id]=\"_inputId()\"\n type=\"text\"\n inputmode=\"search\"\n [value]=\"value()\"\n [disabled]=\"_disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [forceInvalid]=\"invalid()\"\n [attr.name]=\"name()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.tabindex]=\"expanded() ? null : -1\"\n [attr.aria-hidden]=\"expanded() ? null : true\"\n (input)=\"onInput($event)\"\n (keydown.enter)=\"onEnter()\"\n (keydown.escape)=\"onEscape()\"\n (blur)=\"onBlur()\"\n />\n\n @if (_showClear()) {\n <hlm-input-group-addon align=\"inline-end\">\n <button hlmInputGroupButton size=\"icon-xs\" [attr.aria-label]=\"clearAriaLabel()\" (click)=\"onClear()\">\n <ng-icon name=\"lucideX\" />\n </button>\n </hlm-input-group-addon>\n }\n </hlm-input-group>\n</div>\n" }]
|
|
1382
1426
|
}], propDecorators: { _input: [{ type: i0.ViewChild, args: ['searchInput', { isSignal: true }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], clearAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearAriaLabel", required: false }] }], collapseFrom: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseFrom", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], expandAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandAriaLabel", required: false }] }], expandedWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedWidth", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], transparent: [{ type: i0.Input, args: [{ isSignal: true, alias: "transparent", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], committed: [{ type: i0.Output, args: ["committed"] }], searched: [{ type: i0.Output, args: ["searched"] }] } });
|
|
1383
1427
|
|
|
1384
1428
|
/** Lookup replacing the branch, keyed by `` `${boolean}` `` so a boolean signal indexes it
|
|
@@ -3392,6 +3436,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
3392
3436
|
* - `panelClass`: Extra classes merged onto the popover panel (e.g. `w-80` to widen it). They win
|
|
3393
3437
|
* over the library defaults via `twMerge`.
|
|
3394
3438
|
* - `triggerVariant`: Button style variant for the trigger button.
|
|
3439
|
+
* - `triggerColor`: Brand color theme for the trigger button (any `YuwColorDto` value). Default is
|
|
3440
|
+
* `'secondary'`.
|
|
3395
3441
|
* - `triggerSize`: Button size for the trigger button.
|
|
3396
3442
|
* - `triggerTransparent`: Strips the trigger's background and border in every state (rest, hover,
|
|
3397
3443
|
* open), for triggers whose projected content is the whole control — an avatar, a name, a chevron.
|
|
@@ -3420,6 +3466,7 @@ class YuwPopoverComponent {
|
|
|
3420
3466
|
this.sideOffset = input(4, ...(ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []));
|
|
3421
3467
|
this.title = input(undefined, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
|
|
3422
3468
|
this.triggerClass = input('', ...(ngDevMode ? [{ debugName: "triggerClass" }] : /* istanbul ignore next */ []));
|
|
3469
|
+
this.triggerColor = input('secondary', ...(ngDevMode ? [{ debugName: "triggerColor" }] : /* istanbul ignore next */ []));
|
|
3423
3470
|
this.triggerSize = input('default', ...(ngDevMode ? [{ debugName: "triggerSize" }] : /* istanbul ignore next */ []));
|
|
3424
3471
|
this.triggerTransparent = input(false, { ...(ngDevMode ? { debugName: "triggerTransparent" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
3425
3472
|
this.triggerVariant = input('outline', ...(ngDevMode ? [{ debugName: "triggerVariant" }] : /* istanbul ignore next */ []));
|
|
@@ -3429,14 +3476,14 @@ class YuwPopoverComponent {
|
|
|
3429
3476
|
this.open.set(state === 'open');
|
|
3430
3477
|
}
|
|
3431
3478
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3432
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwPopoverComponent, isStandalone: true, selector: "yuw-popover", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, showTrigger: { classPropertyName: "showTrigger", publicName: "showTrigger", isSignal: true, isRequired: false, transformFunction: null }, sideOffset: { classPropertyName: "sideOffset", publicName: "sideOffset", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, triggerClass: { classPropertyName: "triggerClass", publicName: "triggerClass", isSignal: true, isRequired: false, transformFunction: null }, triggerSize: { classPropertyName: "triggerSize", publicName: "triggerSize", isSignal: true, isRequired: false, transformFunction: null }, triggerTransparent: { classPropertyName: "triggerTransparent", publicName: "triggerTransparent", isSignal: true, isRequired: false, transformFunction: null }, triggerVariant: { classPropertyName: "triggerVariant", publicName: "triggerVariant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: "<div\n hlmPopover\n [state]=\"_popoverState()\"\n [align]=\"align()\"\n [sideOffset]=\"sideOffset()\"\n (stateChanged)=\"onOpenChange($event)\"\n>\n @if (showTrigger()) {\n <yuw-button\n yuwPopoverTriggerButton\n [variant]=\"triggerVariant()\"\n [size]=\"triggerSize()\"\n [transparent]=\"triggerTransparent()\"\n [class]=\"triggerClass()\"\n >\n <ng-content select=\"[yuwPopoverTrigger]\" />\n </yuw-button>\n }\n\n <hlm-popover-content *hlmPopoverPortal [class]=\"panelClass()\">\n @if (title() || description()) {\n <div hlmPopoverHeader>\n @if (title()) {\n <p hlmPopoverTitle>{{ title() }}</p>\n }\n @if (description()) {\n <p hlmPopoverDescription>{{ description() }}</p>\n }\n </div>\n }\n\n <ng-content />\n </hlm-popover-content>\n</div>\n", dependencies: [{ kind: "directive", type: i1$i.HlmPopover, selector: "[hlmPopover],hlm-popover" }, { kind: "directive", type: i1$i.HlmPopoverContent, selector: "[hlmPopoverContent],hlm-popover-content" }, { kind: "directive", type: i1$i.HlmPopoverDescription, selector: "[hlmPopoverDescription]" }, { kind: "directive", type: i1$i.HlmPopoverHeader, selector: "[hlmPopoverHeader],hlm-popover-header" }, { kind: "directive", type: i1$i.HlmPopoverPortal, selector: "[hlmPopoverPortal]" }, { kind: "directive", type: i1$i.HlmPopoverTitle, selector: "[hlmPopoverTitle]" }, { kind: "component", type: YuwButtonComponent, selector: "yuw-button", inputs: ["animationDisabled", "ariaLabel", "color", "disabled", "href", "size", "target", "transparent", "type", "class", "variant", "yuwDropdownMenuTrigger"], outputs: ["clicked"] }, { kind: "directive", type: YuwPopoverTriggerDirective, selector: "yuw-button[yuwPopoverTriggerFor], yuw-button[yuwPopoverTriggerButton]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3479
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwPopoverComponent, isStandalone: true, selector: "yuw-popover", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, showTrigger: { classPropertyName: "showTrigger", publicName: "showTrigger", isSignal: true, isRequired: false, transformFunction: null }, sideOffset: { classPropertyName: "sideOffset", publicName: "sideOffset", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, triggerClass: { classPropertyName: "triggerClass", publicName: "triggerClass", isSignal: true, isRequired: false, transformFunction: null }, triggerColor: { classPropertyName: "triggerColor", publicName: "triggerColor", isSignal: true, isRequired: false, transformFunction: null }, triggerSize: { classPropertyName: "triggerSize", publicName: "triggerSize", isSignal: true, isRequired: false, transformFunction: null }, triggerTransparent: { classPropertyName: "triggerTransparent", publicName: "triggerTransparent", isSignal: true, isRequired: false, transformFunction: null }, triggerVariant: { classPropertyName: "triggerVariant", publicName: "triggerVariant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: "<div\n hlmPopover\n [state]=\"_popoverState()\"\n [align]=\"align()\"\n [sideOffset]=\"sideOffset()\"\n (stateChanged)=\"onOpenChange($event)\"\n>\n @if (showTrigger()) {\n <yuw-button\n yuwPopoverTriggerButton\n [color]=\"triggerColor()\"\n [variant]=\"triggerVariant()\"\n [size]=\"triggerSize()\"\n [transparent]=\"triggerTransparent()\"\n [class]=\"triggerClass()\"\n >\n <ng-content select=\"[yuwPopoverTrigger]\" />\n </yuw-button>\n }\n\n <hlm-popover-content *hlmPopoverPortal [class]=\"panelClass()\">\n @if (title() || description()) {\n <div hlmPopoverHeader>\n @if (title()) {\n <p hlmPopoverTitle>{{ title() }}</p>\n }\n @if (description()) {\n <p hlmPopoverDescription>{{ description() }}</p>\n }\n </div>\n }\n\n <ng-content />\n </hlm-popover-content>\n</div>\n", dependencies: [{ kind: "directive", type: i1$i.HlmPopover, selector: "[hlmPopover],hlm-popover" }, { kind: "directive", type: i1$i.HlmPopoverContent, selector: "[hlmPopoverContent],hlm-popover-content" }, { kind: "directive", type: i1$i.HlmPopoverDescription, selector: "[hlmPopoverDescription]" }, { kind: "directive", type: i1$i.HlmPopoverHeader, selector: "[hlmPopoverHeader],hlm-popover-header" }, { kind: "directive", type: i1$i.HlmPopoverPortal, selector: "[hlmPopoverPortal]" }, { kind: "directive", type: i1$i.HlmPopoverTitle, selector: "[hlmPopoverTitle]" }, { kind: "component", type: YuwButtonComponent, selector: "yuw-button", inputs: ["animationDisabled", "ariaLabel", "color", "disabled", "href", "size", "target", "transparent", "type", "class", "variant", "yuwDropdownMenuTrigger"], outputs: ["clicked"] }, { kind: "directive", type: YuwPopoverTriggerDirective, selector: "yuw-button[yuwPopoverTriggerFor], yuw-button[yuwPopoverTriggerButton]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3433
3480
|
}
|
|
3434
3481
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwPopoverComponent, decorators: [{
|
|
3435
3482
|
type: Component,
|
|
3436
3483
|
args: [{ selector: 'yuw-popover', imports: [...HlmPopoverImports, YuwButtonComponent, YuwPopoverTriggerDirective], host: {
|
|
3437
3484
|
class: 'contents',
|
|
3438
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n hlmPopover\n [state]=\"_popoverState()\"\n [align]=\"align()\"\n [sideOffset]=\"sideOffset()\"\n (stateChanged)=\"onOpenChange($event)\"\n>\n @if (showTrigger()) {\n <yuw-button\n yuwPopoverTriggerButton\n [variant]=\"triggerVariant()\"\n [size]=\"triggerSize()\"\n [transparent]=\"triggerTransparent()\"\n [class]=\"triggerClass()\"\n >\n <ng-content select=\"[yuwPopoverTrigger]\" />\n </yuw-button>\n }\n\n <hlm-popover-content *hlmPopoverPortal [class]=\"panelClass()\">\n @if (title() || description()) {\n <div hlmPopoverHeader>\n @if (title()) {\n <p hlmPopoverTitle>{{ title() }}</p>\n }\n @if (description()) {\n <p hlmPopoverDescription>{{ description() }}</p>\n }\n </div>\n }\n\n <ng-content />\n </hlm-popover-content>\n</div>\n" }]
|
|
3439
|
-
}], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], showTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTrigger", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], triggerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerClass", required: false }] }], triggerSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerSize", required: false }] }], triggerTransparent: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerTransparent", required: false }] }], triggerVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerVariant", required: false }] }] } });
|
|
3485
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n hlmPopover\n [state]=\"_popoverState()\"\n [align]=\"align()\"\n [sideOffset]=\"sideOffset()\"\n (stateChanged)=\"onOpenChange($event)\"\n>\n @if (showTrigger()) {\n <yuw-button\n yuwPopoverTriggerButton\n [color]=\"triggerColor()\"\n [variant]=\"triggerVariant()\"\n [size]=\"triggerSize()\"\n [transparent]=\"triggerTransparent()\"\n [class]=\"triggerClass()\"\n >\n <ng-content select=\"[yuwPopoverTrigger]\" />\n </yuw-button>\n }\n\n <hlm-popover-content *hlmPopoverPortal [class]=\"panelClass()\">\n @if (title() || description()) {\n <div hlmPopoverHeader>\n @if (title()) {\n <p hlmPopoverTitle>{{ title() }}</p>\n }\n @if (description()) {\n <p hlmPopoverDescription>{{ description() }}</p>\n }\n </div>\n }\n\n <ng-content />\n </hlm-popover-content>\n</div>\n" }]
|
|
3486
|
+
}], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], showTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTrigger", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], triggerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerClass", required: false }] }], triggerColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerColor", required: false }] }], triggerSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerSize", required: false }] }], triggerTransparent: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerTransparent", required: false }] }], triggerVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerVariant", required: false }] }] } });
|
|
3440
3487
|
|
|
3441
3488
|
/**
|
|
3442
3489
|
* Tooltip directive applied directly to the element that should show a hint on hover/focus.
|
|
@@ -4163,6 +4210,35 @@ const yuwSidebarMenuButtonClass = `
|
|
|
4163
4210
|
group-data-[yuw-rail=on]:[&>span]:hidden
|
|
4164
4211
|
group-data-[yuw-rail=on]:[&_ng-icon]:scale-125
|
|
4165
4212
|
`;
|
|
4213
|
+
/**
|
|
4214
|
+
* Geometry of an entry whose leading slot is a 40px avatar rather than a 16px icon. Appended to
|
|
4215
|
+
* {@link yuwSidebarMenuButtonClass}, and every declaration here exists because that class and the
|
|
4216
|
+
* helm beneath it are both dimensioned for the icon.
|
|
4217
|
+
*
|
|
4218
|
+
* `h-auto` is the load-bearing one. The helm pins a menu button to `h-8`, and the button is
|
|
4219
|
+
* `overflow-hidden`, so a 40px avatar inside a 32px box is clipped top and bottom rather than
|
|
4220
|
+
* enlarging the row — which is the whole point of an avatar entry. Releasing the height lets the
|
|
4221
|
+
* avatar and the padding decide it, so the row is taller than an icon row by exactly the difference
|
|
4222
|
+
* between the two.
|
|
4223
|
+
*
|
|
4224
|
+
* The collapsed padding is re-stated for the mirror-image reason: `yuwSidebarMenuButtonClass` pads the
|
|
4225
|
+
* collapsed button to `py-[20px]` so a 16px icon lands on the rail's rhythm, and an avatar already
|
|
4226
|
+
* stands 40px tall, so inheriting that would make the row 80px. `px-0` lets the avatar use the full
|
|
4227
|
+
* width the item's own padding leaves it, centring it on the same axis as every icon above and below.
|
|
4228
|
+
*
|
|
4229
|
+
* The `!` on each is needed for the reason the class this extends documents — the helm's `size-8!` and
|
|
4230
|
+
* `p-2!` are themselves `!important`, which `twMerge` cannot outrank on order alone. The expanded
|
|
4231
|
+
* `h-auto` needs none: the helm's own `h-8` there is a plain variant class, so merge order settles it.
|
|
4232
|
+
*
|
|
4233
|
+
* Nothing here touches the icon rules of that class: an avatar entry renders no `ng-icon` in the
|
|
4234
|
+
* leading slot, so `scale-125` has nothing to scale, and the trailing chevron is the one element it
|
|
4235
|
+
* would otherwise reach — which is why the chevron pins its own size with `text-[length:…]!`.
|
|
4236
|
+
*/
|
|
4237
|
+
const yuwSidebarMenuAvatarButtonClass = `
|
|
4238
|
+
h-auto
|
|
4239
|
+
group-data-[collapsible=icon]:py-2!
|
|
4240
|
+
group-data-[collapsible=icon]:px-0!
|
|
4241
|
+
`;
|
|
4166
4242
|
const yuwSidebarMenuChevronClass = `
|
|
4167
4243
|
ms-auto
|
|
4168
4244
|
shrink-0
|
|
@@ -4223,7 +4299,7 @@ const yuwSidebarContentClass = `
|
|
|
4223
4299
|
overflow-y-auto
|
|
4224
4300
|
group-data-[collapsible=icon]:overflow-y-auto!
|
|
4225
4301
|
group-data-[collapsible=icon]:overflow-x-hidden
|
|
4226
|
-
group-data-[yuw-rail=on]:gap-
|
|
4302
|
+
group-data-[yuw-rail=on]:gap-0!
|
|
4227
4303
|
`;
|
|
4228
4304
|
const yuwSidebarGroupLabelClass = `
|
|
4229
4305
|
group-data-[collapsible=icon]:mt-0!
|
|
@@ -4234,7 +4310,7 @@ const yuwSidebarGroupLabelClass = `
|
|
|
4234
4310
|
motion-reduce:transition-none
|
|
4235
4311
|
group-data-[yuw-rail=on]:hidden
|
|
4236
4312
|
`;
|
|
4237
|
-
const yuwSidebarGroupClass = 'group-data-[yuw-rail=on]:p-0';
|
|
4313
|
+
const yuwSidebarGroupClass = 'p-3 group-data-[yuw-rail=on]:p-0';
|
|
4238
4314
|
const yuwSidebarFooterClass = 'group-data-[yuw-rail=on]:p-0';
|
|
4239
4315
|
const yuwSidebarSubmenuWrapperClass = `
|
|
4240
4316
|
grid
|
|
@@ -4265,7 +4341,7 @@ const yuwSidebarMenuClass = `
|
|
|
4265
4341
|
gap-2
|
|
4266
4342
|
group-data-[yuw-rail=on]:gap-0
|
|
4267
4343
|
`;
|
|
4268
|
-
const yuwSidebarMenuItemClass = 'group-data-[yuw-rail=on]:p-
|
|
4344
|
+
const yuwSidebarMenuItemClass = 'group-data-[yuw-rail=on]:p-3';
|
|
4269
4345
|
const yuwSidebarMenuSubButtonClass = `
|
|
4270
4346
|
[&>span]:truncate
|
|
4271
4347
|
[&>span]:min-w-0
|
|
@@ -4636,6 +4712,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
4636
4712
|
],
|
|
4637
4713
|
}]
|
|
4638
4714
|
}], ctorParameters: () => [] });
|
|
4715
|
+
/**
|
|
4716
|
+
* Applied alongside `[yuwSidebarMenuButton]` on an entry whose leading slot is a 40px avatar rather
|
|
4717
|
+
* than a 16px icon, carrying {@link yuwSidebarMenuAvatarButtonClass}.
|
|
4718
|
+
*
|
|
4719
|
+
* A directive rather than a `[class]` binding on the button, because a binding cannot win this
|
|
4720
|
+
* merge. `classes()` (helm/utils) applies its registered *sources* in registration order and then
|
|
4721
|
+
* appends the element's `baseClasses` — captured from the static `class` host attribute — last. An
|
|
4722
|
+
* Angular `[class]` binding is neither: it writes the `class` attribute directly, races the
|
|
4723
|
+
* `className` assignment `classes()` makes for its own sources, and is reclassified by the library's
|
|
4724
|
+
* MutationObserver only after the fact. The observed result was the helm's `h-8` surviving and the
|
|
4725
|
+
* override being dropped, leaving the 40px avatar clipped inside a 32px `overflow-hidden` button.
|
|
4726
|
+
* Registering as another source puts this class after both the helm's and
|
|
4727
|
+
* `[yuwSidebarMenuButton]`'s, which is the ordering `twMerge` needs to displace them.
|
|
4728
|
+
*
|
|
4729
|
+
* Separate from `[yuwSidebarMenuButton]` rather than an input on it, because the two are not the same
|
|
4730
|
+
* role: this is the geometry of one kind of entry, and an entry either leads with an avatar or it does
|
|
4731
|
+
* not. Hand-written markup applies it bare (`<a yuwSidebarMenuButton yuwSidebarMenuAvatarButton>`)
|
|
4732
|
+
* next to its own `<yuw-avatar>`.
|
|
4733
|
+
*
|
|
4734
|
+
* It carries a value because `YuwSidebarNavComponent` renders every entry through the same three
|
|
4735
|
+
* branches and cannot attach a directive conditionally — an attribute selector matches on presence, so
|
|
4736
|
+
* the nav applies it to every entry and passes whether that entry actually has an avatar. Its default
|
|
4737
|
+
* is `true` so the bare, hand-written form needs no value.
|
|
4738
|
+
*/
|
|
4739
|
+
class YuwSidebarMenuAvatarButtonDirective {
|
|
4740
|
+
constructor() {
|
|
4741
|
+
this.enabled = input(true, { ...(ngDevMode ? { debugName: "enabled" } : /* istanbul ignore next */ {}), alias: 'yuwSidebarMenuAvatarButton', transform: booleanAttribute });
|
|
4742
|
+
classes(() => (this.enabled() ? yuwSidebarMenuAvatarButtonClass : ''));
|
|
4743
|
+
}
|
|
4744
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwSidebarMenuAvatarButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
4745
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.22", type: YuwSidebarMenuAvatarButtonDirective, isStandalone: true, selector: "[yuwSidebarMenuAvatarButton]", inputs: { enabled: { classPropertyName: "enabled", publicName: "yuwSidebarMenuAvatarButton", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
4746
|
+
}
|
|
4747
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwSidebarMenuAvatarButtonDirective, decorators: [{
|
|
4748
|
+
type: Directive,
|
|
4749
|
+
args: [{
|
|
4750
|
+
selector: '[yuwSidebarMenuAvatarButton]',
|
|
4751
|
+
}]
|
|
4752
|
+
}], ctorParameters: () => [], propDecorators: { enabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "yuwSidebarMenuAvatarButton", required: false }] }] } });
|
|
4639
4753
|
/** Trailing count or status badge of a sidebar menu item. */
|
|
4640
4754
|
class YuwSidebarMenuBadgeDirective {
|
|
4641
4755
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwSidebarMenuBadgeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
@@ -4840,6 +4954,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
4840
4954
|
* is all it does and it stays out of `itemClicked`, since opening a submenu is not an action for the
|
|
4841
4955
|
* consumer to handle.
|
|
4842
4956
|
*
|
|
4957
|
+
* An entry's leading slot — an `avatar` when it has one, otherwise its `icon` — is rendered from one
|
|
4958
|
+
* `#leading` template rather than repeated in each of the `route` / `href` / `<button>` branches, so
|
|
4959
|
+
* the avatar-over-icon precedence is stated once and the three branches cannot drift apart on it. The
|
|
4960
|
+
* avatar is fixed at `<yuw-avatar>`'s `lg` size: it is the rail's own geometry (a 78px width, 12px of
|
|
4961
|
+
* item padding) that decides how large an image fits there, so exposing the size per entry would let a
|
|
4962
|
+
* consumer produce a row that overflows the rail. That entry's geometry then comes from
|
|
4963
|
+
* `[yuwSidebarMenuAvatarButton]`, which every branch applies unconditionally and hands the entry's own
|
|
4964
|
+
* `hasAvatar` — an attribute selector matches on presence, so the choice has to travel as a value
|
|
4965
|
+
* rather than by attaching the directive only where it is wanted.
|
|
4966
|
+
*
|
|
4843
4967
|
* The chevron marking an expandable entry rotates off that same `aria-expanded`, read from the
|
|
4844
4968
|
* button through the `group/menu-button` the helm already declares on every menu button. Its
|
|
4845
4969
|
* `yuwSidebarMenuChevronClass` hides it with `hidden!` in the collapsed state, and that `!` is
|
|
@@ -4929,6 +5053,7 @@ class YuwSidebarNavComponent {
|
|
|
4929
5053
|
...item,
|
|
4930
5054
|
children,
|
|
4931
5055
|
hasChildren,
|
|
5056
|
+
hasAvatar: item.avatar !== undefined,
|
|
4932
5057
|
tooltipText: item.tooltip ?? item.label,
|
|
4933
5058
|
activeOptions: { exact: item.exact ?? false },
|
|
4934
5059
|
holdsActiveChild: hasChildren && this.holdsActiveRoute(item.children),
|
|
@@ -4974,13 +5099,14 @@ class YuwSidebarNavComponent {
|
|
|
4974
5099
|
return signal;
|
|
4975
5100
|
}
|
|
4976
5101
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwSidebarNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4977
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwSidebarNavComponent, isStandalone: true, selector: "yuw-sidebar-nav", inputs: { collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { itemClicked: "itemClicked" }, host: { classAttribute: "contents" }, providers: [provideIcons({ lucideChevronRight })], ngImport: i0, template: "<ng-template #submenu let-item>\n <ul yuwSidebarMenuSub>\n @for (child of item.children; track child.id) {\n <li yuwSidebarMenuSubItem>\n @if (child.route) {\n <a\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n [routerLink]=\"child.route\"\n routerLinkActive\n #childLink=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"child.activeOptions\"\n [isActive]=\"childLink.isActive\"\n [attr.aria-current]=\"childLink.isActive ? 'page' : null\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n [class.pointer-events-none]=\"childLink.isActive || child.disabled\"\n >\n <span>{{ child.label }}</span>\n </a>\n } @else if (child.href) {\n <a\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n [href]=\"child.href\"\n [attr.target]=\"child.target\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n [class.pointer-events-none]=\"child.disabled\"\n >\n <span>{{ child.label }}</span>\n </a>\n } @else {\n <button\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n type=\"button\"\n [disabled]=\"child.disabled ?? false\"\n (click)=\"onItemClick(child.id, $event)\"\n >\n <span>{{ child.label }}</span>\n </button>\n }\n </li>\n }\n </ul>\n</ng-template>\n\n@for (group of _groups(); track group.id) {\n <div yuwSidebarGroup>\n @if (group.label) {\n <div yuwSidebarGroupLabel>\n <span [class]=\"groupLabelTextClass\">{{ group.label }}</span>\n </div>\n }\n\n <div yuwSidebarGroupContent>\n <ul yuwSidebarMenu [class]=\"menuClass\">\n @for (item of group.items; track item.id) {\n <li yuwSidebarMenuItem>\n @if (item.route) {\n <a\n yuwSidebarMenuButton\n [closeMobileSidebarOnClick]=\"!item.hasChildren\"\n [routerLink]=\"item.route\"\n routerLinkActive\n #link=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"item.activeOptions\"\n [isActive]=\"link.isActive || item.holdsActiveChild\"\n [tooltip]=\"item.tooltipText\"\n [attr.aria-current]=\"link.isActive ? 'page' : null\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n [class.pointer-events-none]=\"(link.isActive && !item.hasChildren) || item.disabled\"\n (click)=\"onParentClick(item, item.expanded, $event)\"\n >\n
|
|
5102
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwSidebarNavComponent, isStandalone: true, selector: "yuw-sidebar-nav", inputs: { collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { itemClicked: "itemClicked" }, host: { classAttribute: "contents" }, providers: [provideIcons({ lucideChevronRight })], ngImport: i0, template: "<ng-template #submenu let-item>\n <ul yuwSidebarMenuSub>\n @for (child of item.children; track child.id) {\n <li yuwSidebarMenuSubItem>\n @if (child.route) {\n <a\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n [routerLink]=\"child.route\"\n routerLinkActive\n #childLink=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"child.activeOptions\"\n [isActive]=\"childLink.isActive\"\n [attr.aria-current]=\"childLink.isActive ? 'page' : null\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n [class.pointer-events-none]=\"childLink.isActive || child.disabled\"\n >\n <span>{{ child.label }}</span>\n </a>\n } @else if (child.href) {\n <a\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n [href]=\"child.href\"\n [attr.target]=\"child.target\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n [class.pointer-events-none]=\"child.disabled\"\n >\n <span>{{ child.label }}</span>\n </a>\n } @else {\n <button\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n type=\"button\"\n [disabled]=\"child.disabled ?? false\"\n (click)=\"onItemClick(child.id, $event)\"\n >\n <span>{{ child.label }}</span>\n </button>\n }\n </li>\n }\n </ul>\n</ng-template>\n\n<ng-template #leading let-item>\n @if (item.avatar; as avatar) {\n <yuw-avatar size=\"lg\" [src]=\"avatar.src\" [alt]=\"avatar.alt\" [fallback]=\"avatar.fallback\" />\n } @else if (item.icon) {\n <ng-icon [name]=\"item.icon\" />\n }\n</ng-template>\n\n@for (group of _groups(); track group.id) {\n <div yuwSidebarGroup>\n @if (group.label) {\n <div yuwSidebarGroupLabel>\n <span [class]=\"groupLabelTextClass\">{{ group.label }}</span>\n </div>\n }\n\n <div yuwSidebarGroupContent>\n <ul yuwSidebarMenu [class]=\"menuClass\">\n @for (item of group.items; track item.id) {\n <li yuwSidebarMenuItem>\n @if (item.route) {\n <a\n yuwSidebarMenuButton\n [closeMobileSidebarOnClick]=\"!item.hasChildren\"\n [routerLink]=\"item.route\"\n routerLinkActive\n #link=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"item.activeOptions\"\n [yuwSidebarMenuAvatarButton]=\"item.hasAvatar\"\n [isActive]=\"link.isActive || item.holdsActiveChild\"\n [tooltip]=\"item.tooltipText\"\n [attr.aria-current]=\"link.isActive ? 'page' : null\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n [class.pointer-events-none]=\"(link.isActive && !item.hasChildren) || item.disabled\"\n (click)=\"onParentClick(item, item.expanded, $event)\"\n >\n <ng-container [ngTemplateOutlet]=\"leading\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n <span>{{ item.label }}</span>\n @if (item.hasChildren) {\n <ng-icon name=\"lucideChevronRight\" [class]=\"chevronClass\" />\n }\n </a>\n } @else if (item.href) {\n <a\n yuwSidebarMenuButton\n [closeMobileSidebarOnClick]=\"!item.hasChildren\"\n [href]=\"item.href\"\n [attr.target]=\"item.target\"\n [yuwSidebarMenuAvatarButton]=\"item.hasAvatar\"\n [isActive]=\"item.holdsActiveChild\"\n [tooltip]=\"item.tooltipText\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n [class.pointer-events-none]=\"item.disabled\"\n (click)=\"onParentClick(item, item.expanded, $event)\"\n >\n <ng-container [ngTemplateOutlet]=\"leading\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n <span>{{ item.label }}</span>\n @if (item.hasChildren) {\n <ng-icon name=\"lucideChevronRight\" [class]=\"chevronClass\" />\n }\n </a>\n } @else {\n <button\n yuwSidebarMenuButton\n [closeMobileSidebarOnClick]=\"!item.hasChildren\"\n type=\"button\"\n [yuwSidebarMenuAvatarButton]=\"item.hasAvatar\"\n [isActive]=\"item.holdsActiveChild\"\n [tooltip]=\"item.tooltipText\"\n [disabled]=\"item.disabled ?? false\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n (click)=\"item.hasChildren ? onParentClick(item, item.expanded, $event) : onItemClick(item.id, $event)\"\n >\n <ng-container [ngTemplateOutlet]=\"leading\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n <span>{{ item.label }}</span>\n @if (item.hasChildren) {\n <ng-icon name=\"lucideChevronRight\" [class]=\"chevronClass\" />\n }\n </button>\n }\n\n @if (item.badge) {\n <span yuwSidebarMenuBadge [class]=\"badgeClass\">{{ item.badge }}</span>\n }\n\n @if (item.hasChildren && !isRail()) {\n <div\n [class]=\"item.submenuClass\"\n [attr.inert]=\"item.expanded ? null : ''\"\n [attr.aria-hidden]=\"!item.expanded\"\n >\n <div>\n <ng-container [ngTemplateOutlet]=\"submenu\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n </div>\n </div>\n }\n </li>\n }\n </ul>\n </div>\n </div>\n\n @if (group.separatorAfter) {\n <div yuwSidebarSeparator class=\"mx-auto w-4/5!\"></div>\n }\n}\n", dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: YuwAvatarComponent, selector: "yuw-avatar", inputs: ["alt", "badge", "fallback", "group", "groupCount", "size", "src", "class"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: YuwSidebarGroupDirective, selector: "[yuwSidebarGroup], yuw-sidebar-group" }, { kind: "directive", type: YuwSidebarGroupLabelDirective, selector: "div[yuwSidebarGroupLabel], button[yuwSidebarGroupLabel]" }, { kind: "directive", type: YuwSidebarGroupContentDirective, selector: "div[yuwSidebarGroupContent]" }, { kind: "directive", type: YuwSidebarMenuDirective, selector: "ul[yuwSidebarMenu]" }, { kind: "directive", type: YuwSidebarMenuItemDirective, selector: "li[yuwSidebarMenuItem]" }, { kind: "directive", type: YuwSidebarMenuButtonDirective, selector: "button[yuwSidebarMenuButton], a[yuwSidebarMenuButton]" }, { kind: "directive", type: YuwSidebarMenuAvatarButtonDirective, selector: "[yuwSidebarMenuAvatarButton]", inputs: ["yuwSidebarMenuAvatarButton"] }, { kind: "directive", type: YuwSidebarMenuBadgeDirective, selector: "[yuwSidebarMenuBadge], yuw-sidebar-menu-badge" }, { kind: "directive", type: YuwSidebarMenuSubDirective, selector: "ul[yuwSidebarMenuSub]" }, { kind: "directive", type: YuwSidebarMenuSubItemDirective, selector: "li[yuwSidebarMenuSubItem]" }, { kind: "directive", type: YuwSidebarMenuSubButtonDirective, selector: "a[yuwSidebarMenuSubButton], button[yuwSidebarMenuSubButton]" }, { kind: "directive", type: YuwSidebarSeparatorDirective, selector: "[yuwSidebarSeparator], yuw-sidebar-separator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4978
5103
|
}
|
|
4979
5104
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwSidebarNavComponent, decorators: [{
|
|
4980
5105
|
type: Component,
|
|
4981
5106
|
args: [{ selector: 'yuw-sidebar-nav', imports: [
|
|
4982
5107
|
NgIcon,
|
|
4983
5108
|
NgTemplateOutlet,
|
|
5109
|
+
YuwAvatarComponent,
|
|
4984
5110
|
RouterLink,
|
|
4985
5111
|
RouterLinkActive,
|
|
4986
5112
|
YuwSidebarGroupDirective,
|
|
@@ -4989,6 +5115,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
4989
5115
|
YuwSidebarMenuDirective,
|
|
4990
5116
|
YuwSidebarMenuItemDirective,
|
|
4991
5117
|
YuwSidebarMenuButtonDirective,
|
|
5118
|
+
YuwSidebarMenuAvatarButtonDirective,
|
|
4992
5119
|
HlmSidebarMenuButton,
|
|
4993
5120
|
YuwSidebarMenuBadgeDirective,
|
|
4994
5121
|
YuwSidebarMenuSubDirective,
|
|
@@ -4997,7 +5124,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
4997
5124
|
YuwSidebarSeparatorDirective,
|
|
4998
5125
|
], providers: [provideIcons({ lucideChevronRight })], host: {
|
|
4999
5126
|
class: 'contents',
|
|
5000
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #submenu let-item>\n <ul yuwSidebarMenuSub>\n @for (child of item.children; track child.id) {\n <li yuwSidebarMenuSubItem>\n @if (child.route) {\n <a\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n [routerLink]=\"child.route\"\n routerLinkActive\n #childLink=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"child.activeOptions\"\n [isActive]=\"childLink.isActive\"\n [attr.aria-current]=\"childLink.isActive ? 'page' : null\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n [class.pointer-events-none]=\"childLink.isActive || child.disabled\"\n >\n <span>{{ child.label }}</span>\n </a>\n } @else if (child.href) {\n <a\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n [href]=\"child.href\"\n [attr.target]=\"child.target\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n [class.pointer-events-none]=\"child.disabled\"\n >\n <span>{{ child.label }}</span>\n </a>\n } @else {\n <button\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n type=\"button\"\n [disabled]=\"child.disabled ?? false\"\n (click)=\"onItemClick(child.id, $event)\"\n >\n <span>{{ child.label }}</span>\n </button>\n }\n </li>\n }\n </ul>\n</ng-template>\n\n@for (group of _groups(); track group.id) {\n <div yuwSidebarGroup>\n @if (group.label) {\n <div yuwSidebarGroupLabel>\n <span [class]=\"groupLabelTextClass\">{{ group.label }}</span>\n </div>\n }\n\n <div yuwSidebarGroupContent>\n <ul yuwSidebarMenu [class]=\"menuClass\">\n @for (item of group.items; track item.id) {\n <li yuwSidebarMenuItem>\n @if (item.route) {\n <a\n yuwSidebarMenuButton\n [closeMobileSidebarOnClick]=\"!item.hasChildren\"\n [routerLink]=\"item.route\"\n routerLinkActive\n #link=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"item.activeOptions\"\n [isActive]=\"link.isActive || item.holdsActiveChild\"\n [tooltip]=\"item.tooltipText\"\n [attr.aria-current]=\"link.isActive ? 'page' : null\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n [class.pointer-events-none]=\"(link.isActive && !item.hasChildren) || item.disabled\"\n (click)=\"onParentClick(item, item.expanded, $event)\"\n >\n
|
|
5127
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #submenu let-item>\n <ul yuwSidebarMenuSub>\n @for (child of item.children; track child.id) {\n <li yuwSidebarMenuSubItem>\n @if (child.route) {\n <a\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n [routerLink]=\"child.route\"\n routerLinkActive\n #childLink=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"child.activeOptions\"\n [isActive]=\"childLink.isActive\"\n [attr.aria-current]=\"childLink.isActive ? 'page' : null\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n [class.pointer-events-none]=\"childLink.isActive || child.disabled\"\n >\n <span>{{ child.label }}</span>\n </a>\n } @else if (child.href) {\n <a\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n [href]=\"child.href\"\n [attr.target]=\"child.target\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n [class.pointer-events-none]=\"child.disabled\"\n >\n <span>{{ child.label }}</span>\n </a>\n } @else {\n <button\n yuwSidebarMenuSubButton\n closeMobileSidebarOnClick\n type=\"button\"\n [disabled]=\"child.disabled ?? false\"\n (click)=\"onItemClick(child.id, $event)\"\n >\n <span>{{ child.label }}</span>\n </button>\n }\n </li>\n }\n </ul>\n</ng-template>\n\n<ng-template #leading let-item>\n @if (item.avatar; as avatar) {\n <yuw-avatar size=\"lg\" [src]=\"avatar.src\" [alt]=\"avatar.alt\" [fallback]=\"avatar.fallback\" />\n } @else if (item.icon) {\n <ng-icon [name]=\"item.icon\" />\n }\n</ng-template>\n\n@for (group of _groups(); track group.id) {\n <div yuwSidebarGroup>\n @if (group.label) {\n <div yuwSidebarGroupLabel>\n <span [class]=\"groupLabelTextClass\">{{ group.label }}</span>\n </div>\n }\n\n <div yuwSidebarGroupContent>\n <ul yuwSidebarMenu [class]=\"menuClass\">\n @for (item of group.items; track item.id) {\n <li yuwSidebarMenuItem>\n @if (item.route) {\n <a\n yuwSidebarMenuButton\n [closeMobileSidebarOnClick]=\"!item.hasChildren\"\n [routerLink]=\"item.route\"\n routerLinkActive\n #link=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"item.activeOptions\"\n [yuwSidebarMenuAvatarButton]=\"item.hasAvatar\"\n [isActive]=\"link.isActive || item.holdsActiveChild\"\n [tooltip]=\"item.tooltipText\"\n [attr.aria-current]=\"link.isActive ? 'page' : null\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n [class.pointer-events-none]=\"(link.isActive && !item.hasChildren) || item.disabled\"\n (click)=\"onParentClick(item, item.expanded, $event)\"\n >\n <ng-container [ngTemplateOutlet]=\"leading\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n <span>{{ item.label }}</span>\n @if (item.hasChildren) {\n <ng-icon name=\"lucideChevronRight\" [class]=\"chevronClass\" />\n }\n </a>\n } @else if (item.href) {\n <a\n yuwSidebarMenuButton\n [closeMobileSidebarOnClick]=\"!item.hasChildren\"\n [href]=\"item.href\"\n [attr.target]=\"item.target\"\n [yuwSidebarMenuAvatarButton]=\"item.hasAvatar\"\n [isActive]=\"item.holdsActiveChild\"\n [tooltip]=\"item.tooltipText\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n [class.pointer-events-none]=\"item.disabled\"\n (click)=\"onParentClick(item, item.expanded, $event)\"\n >\n <ng-container [ngTemplateOutlet]=\"leading\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n <span>{{ item.label }}</span>\n @if (item.hasChildren) {\n <ng-icon name=\"lucideChevronRight\" [class]=\"chevronClass\" />\n }\n </a>\n } @else {\n <button\n yuwSidebarMenuButton\n [closeMobileSidebarOnClick]=\"!item.hasChildren\"\n type=\"button\"\n [yuwSidebarMenuAvatarButton]=\"item.hasAvatar\"\n [isActive]=\"item.holdsActiveChild\"\n [tooltip]=\"item.tooltipText\"\n [disabled]=\"item.disabled ?? false\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n (click)=\"item.hasChildren ? onParentClick(item, item.expanded, $event) : onItemClick(item.id, $event)\"\n >\n <ng-container [ngTemplateOutlet]=\"leading\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n <span>{{ item.label }}</span>\n @if (item.hasChildren) {\n <ng-icon name=\"lucideChevronRight\" [class]=\"chevronClass\" />\n }\n </button>\n }\n\n @if (item.badge) {\n <span yuwSidebarMenuBadge [class]=\"badgeClass\">{{ item.badge }}</span>\n }\n\n @if (item.hasChildren && !isRail()) {\n <div\n [class]=\"item.submenuClass\"\n [attr.inert]=\"item.expanded ? null : ''\"\n [attr.aria-hidden]=\"!item.expanded\"\n >\n <div>\n <ng-container [ngTemplateOutlet]=\"submenu\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n </div>\n </div>\n }\n </li>\n }\n </ul>\n </div>\n </div>\n\n @if (group.separatorAfter) {\n <div yuwSidebarSeparator class=\"mx-auto w-4/5!\"></div>\n }\n}\n" }]
|
|
5001
5128
|
}], propDecorators: { collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: true }] }], itemClicked: [{ type: i0.Output, args: ["itemClicked"] }] } });
|
|
5002
5129
|
|
|
5003
5130
|
/**
|
|
@@ -5110,7 +5237,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
5110
5237
|
* button that reports through `itemClicked`. An item with `children` gets a submenu that follows
|
|
5111
5238
|
* the sidebar's own state: an accordion while the panel is open, and a sheet sliding out beside the
|
|
5112
5239
|
* rail once it is collapsed to icons, so nested entries stay reachable there. Its `expanded`
|
|
5113
|
-
* field seeds the accordion; the item holding the active route opens on its own.
|
|
5240
|
+
* field seeds the accordion; the item holding the active route opens on its own. An item may lead
|
|
5241
|
+
* with an `avatar` instead of an `icon` — a user account or a venue — which renders at 40px and
|
|
5242
|
+
* makes that row taller than an icon row in both states, and combines with `children` like any
|
|
5243
|
+
* other entry.
|
|
5114
5244
|
* - `footer`: The same, rendered into the footer region.
|
|
5115
5245
|
*
|
|
5116
5246
|
* Outputs:
|
|
@@ -5240,6 +5370,185 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
5240
5370
|
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button hlmSidebarTrigger [srOnlyText]=\"label()\" class=\"cursor-pointer\"></button>\n" }]
|
|
5241
5371
|
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }] } });
|
|
5242
5372
|
|
|
5373
|
+
/** Default match used by both `<yuw-command>` and `<yuw-command-dialog>`, mirroring brain's own
|
|
5374
|
+
* case-insensitive substring filter. Exported so the dialog forwards one shared default rather
|
|
5375
|
+
* than declaring a second one that could drift. */
|
|
5376
|
+
const yuwCommandDefaultFilter = (value, search) => value.toLowerCase().includes(search.toLowerCase());
|
|
5377
|
+
/**
|
|
5378
|
+
* Searchable command palette rendering groups of runnable entries.
|
|
5379
|
+
*
|
|
5380
|
+
* Entries come from the `groups` input — no per-entry directives to declare — and are filtered as
|
|
5381
|
+
* the user types. Choosing one runs its own `action` when it has one and always emits
|
|
5382
|
+
* `commandSelected`, so an entry needing wider context than a bare callback is handled by the
|
|
5383
|
+
* parent instead.
|
|
5384
|
+
*
|
|
5385
|
+
* Inputs / Models:
|
|
5386
|
+
* - `groups`: Required entry definitions (`YuwCommandGroupDto[]`), rendered in order. A palette
|
|
5387
|
+
* with no headings is one group with no `label`.
|
|
5388
|
+
* - `search`: Two-way filter query. Emits `searchChange` as the user types; set it to filter
|
|
5389
|
+
* programmatically or to reset the palette after running something.
|
|
5390
|
+
* - `disabled`: Blocks the whole palette.
|
|
5391
|
+
* - `filter`: Match predicate `(searchText, query) => boolean`. Defaults to a case-insensitive
|
|
5392
|
+
* substring match; replace it for fuzzy or accent-insensitive matching. It receives an entry's
|
|
5393
|
+
* `searchText` (or its `label`), never its `id`.
|
|
5394
|
+
* - `color`: Token palette applied to the subtree via `data-yuw-color`.
|
|
5395
|
+
* - `emptyText`: Message shown when the query matches nothing. User-facing text — the consuming
|
|
5396
|
+
* app is responsible for providing it translated.
|
|
5397
|
+
* - `searchPlaceholder`: Placeholder of the search field. Same translation contract.
|
|
5398
|
+
* - `class`: Merged onto the palette surface, so a consumer can size it without forking.
|
|
5399
|
+
*
|
|
5400
|
+
* Outputs:
|
|
5401
|
+
* - `commandSelected`: Emits the chosen `YuwCommandItemDto` for every selection, whether or not it
|
|
5402
|
+
* carried an `action`.
|
|
5403
|
+
*
|
|
5404
|
+
* Usage:
|
|
5405
|
+
* ```html
|
|
5406
|
+
* <yuw-command
|
|
5407
|
+
* [groups]="groups"
|
|
5408
|
+
* [(search)]="query"
|
|
5409
|
+
* emptyText="No results found."
|
|
5410
|
+
* searchPlaceholder="Type a command…"
|
|
5411
|
+
* (commandSelected)="run($event)"
|
|
5412
|
+
* />
|
|
5413
|
+
* ```
|
|
5414
|
+
*/
|
|
5415
|
+
class YuwCommandComponent {
|
|
5416
|
+
constructor() {
|
|
5417
|
+
this.color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
5418
|
+
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
5419
|
+
this.emptyText = input(undefined, ...(ngDevMode ? [{ debugName: "emptyText" }] : /* istanbul ignore next */ []));
|
|
5420
|
+
this.filter = input(yuwCommandDefaultFilter, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
|
|
5421
|
+
this.groups = input.required(...(ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ []));
|
|
5422
|
+
this.search = model('', ...(ngDevMode ? [{ debugName: "search" }] : /* istanbul ignore next */ []));
|
|
5423
|
+
this.searchPlaceholder = input(undefined, ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
|
|
5424
|
+
this.userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
|
|
5425
|
+
this.commandSelected = output();
|
|
5426
|
+
/** Brain matches its filter against each item's `value`, so `value` carries the searchable text
|
|
5427
|
+
* while `id` stays the identity — precomputed here so the template neither calls a method nor
|
|
5428
|
+
* rebuilds the string on every change-detection pass. */
|
|
5429
|
+
this._groups = computed(() => this.groups().map((group) => ({
|
|
5430
|
+
...group,
|
|
5431
|
+
items: group.items.map((item) => ({ item, searchValue: item.searchText ?? item.label })),
|
|
5432
|
+
})), ...(ngDevMode ? [{ debugName: "_groups" }] : /* istanbul ignore next */ []));
|
|
5433
|
+
}
|
|
5434
|
+
onSelected(item) {
|
|
5435
|
+
item.action?.();
|
|
5436
|
+
this.commandSelected.emit(item);
|
|
5437
|
+
}
|
|
5438
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwCommandComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5439
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: YuwCommandComponent, isStandalone: true, selector: "yuw-command", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, groups: { classPropertyName: "groups", publicName: "groups", isSignal: true, isRequired: true, transformFunction: null }, search: { classPropertyName: "search", publicName: "search", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { search: "searchChange", commandSelected: "commandSelected" }, host: { properties: { "attr.data-yuw-color": "color()" }, classAttribute: "contents" }, ngImport: i0, template: "<div hlmCommand [class]=\"userClass()\" [disabled]=\"disabled()\" [filter]=\"filter()\" [(search)]=\"search\">\n <hlm-command-input [placeholder]=\"searchPlaceholder() ?? ''\" />\n\n <div hlmCommandList>\n @for (group of _groups(); track group.id; let first = $first) {\n @if (!first) {\n <div hlmCommandSeparator></div>\n }\n\n <div hlmCommandGroup>\n @if (group.label; as label) {\n <span hlmCommandGroupLabel>{{ label }}</span>\n }\n\n @for (entry of group.items; track entry.item.id) {\n <button\n hlmCommandItem\n [value]=\"entry.searchValue\"\n [disabled]=\"entry.item.disabled ?? false\"\n (selected)=\"onSelected(entry.item)\"\n >\n @if (entry.item.icon; as icon) {\n <ng-icon [name]=\"icon\" aria-hidden=\"true\" />\n }\n {{ entry.item.label }}\n @if (entry.item.shortcut; as shortcut) {\n <span hlmCommandShortcut>{{ shortcut }}</span>\n }\n </button>\n }\n </div>\n }\n\n <div hlmCommandEmpty *hlmCommandEmptyState>{{ emptyText() ?? '' }}</div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1$r.HlmCommand, selector: "[hlmCommand],hlm-command" }, { kind: "directive", type: i1$r.HlmCommandEmpty, selector: "[hlmCommandEmpty]" }, { kind: "directive", type: i1$r.HlmCommandEmptyState, selector: "[hlmCommandEmptyState]" }, { kind: "directive", type: i1$r.HlmCommandGroup, selector: "[hlmCommandGroup],hlm-command-group" }, { kind: "directive", type: i1$r.HlmCommandGroupLabel, selector: "[hlmCommandGroupLabel],hlm-command-group-label" }, { kind: "component", type: i1$r.HlmCommandInput, selector: "hlm-command-input", inputs: ["inputId", "placeholder"] }, { kind: "directive", type: i1$r.HlmCommandItem, selector: "button[hlmCommandItem],button[hlm-command-item]" }, { kind: "directive", type: i1$r.HlmCommandList, selector: "[hlmCommandList],hlm-command-list" }, { kind: "directive", type: i1$r.HlmCommandSeparator, selector: "[hlmCommandSeparator],hlm-command-separator" }, { kind: "directive", type: i1$r.HlmCommandShortcut, selector: "[hlmCommandShortcut],hlm-command-shortcut" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5440
|
+
}
|
|
5441
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwCommandComponent, decorators: [{
|
|
5442
|
+
type: Component,
|
|
5443
|
+
args: [{ selector: 'yuw-command', imports: [...HlmCommandImports, NgIcon], host: {
|
|
5444
|
+
class: 'contents',
|
|
5445
|
+
'[attr.data-yuw-color]': 'color()',
|
|
5446
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div hlmCommand [class]=\"userClass()\" [disabled]=\"disabled()\" [filter]=\"filter()\" [(search)]=\"search\">\n <hlm-command-input [placeholder]=\"searchPlaceholder() ?? ''\" />\n\n <div hlmCommandList>\n @for (group of _groups(); track group.id; let first = $first) {\n @if (!first) {\n <div hlmCommandSeparator></div>\n }\n\n <div hlmCommandGroup>\n @if (group.label; as label) {\n <span hlmCommandGroupLabel>{{ label }}</span>\n }\n\n @for (entry of group.items; track entry.item.id) {\n <button\n hlmCommandItem\n [value]=\"entry.searchValue\"\n [disabled]=\"entry.item.disabled ?? false\"\n (selected)=\"onSelected(entry.item)\"\n >\n @if (entry.item.icon; as icon) {\n <ng-icon [name]=\"icon\" aria-hidden=\"true\" />\n }\n {{ entry.item.label }}\n @if (entry.item.shortcut; as shortcut) {\n <span hlmCommandShortcut>{{ shortcut }}</span>\n }\n </button>\n }\n </div>\n }\n\n <div hlmCommandEmpty *hlmCommandEmptyState>{{ emptyText() ?? '' }}</div>\n </div>\n</div>\n" }]
|
|
5447
|
+
}], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], groups: [{ type: i0.Input, args: [{ isSignal: true, alias: "groups", required: true }] }], search: [{ type: i0.Input, args: [{ isSignal: true, alias: "search", required: false }] }, { type: i0.Output, args: ["searchChange"] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], commandSelected: [{ type: i0.Output, args: ["commandSelected"] }] } });
|
|
5448
|
+
|
|
5449
|
+
const panelWidthClasses = 'w-[650px] max-w-[calc(100vw-2rem)] sm:max-w-[calc(100vw-2rem)] mb-[24vh]';
|
|
5450
|
+
/**
|
|
5451
|
+
* `<yuw-command>` hosted in a centred modal — the ⌘K palette shape.
|
|
5452
|
+
*
|
|
5453
|
+
* Wraps the palette rather than re-projecting it, so filtering, grouping and selection behave
|
|
5454
|
+
* identically to the inline component. Two behaviours belong to the modal and are handled here:
|
|
5455
|
+
* the query is cleared whenever the palette closes, so it never reopens still filtered by the last
|
|
5456
|
+
* search; and choosing an entry closes it, since picking *is* the confirmation.
|
|
5457
|
+
*
|
|
5458
|
+
* The opening accelerator is deliberately not bound here. A global hotkey is application policy —
|
|
5459
|
+
* it has to coexist with whatever else the app binds — so the consumer drives `open` from its own
|
|
5460
|
+
* listener. `shortcut` text on the entries is likewise the consumer's, and platform-dependent
|
|
5461
|
+
* (`⌘K` on Apple platforms, `Ctrl+K` elsewhere).
|
|
5462
|
+
*
|
|
5463
|
+
* Inputs / Models:
|
|
5464
|
+
* - `groups`: Required entry definitions (`YuwCommandGroupDto[]`), as `<yuw-command>` takes them.
|
|
5465
|
+
* - `open`: Two-way open/closed state. Drive via `[(open)]` from the trigger or hotkey.
|
|
5466
|
+
* - `search`: Two-way filter query. Reset to `''` on close.
|
|
5467
|
+
* - `closeOnSelect`: Whether choosing an entry closes the palette. Default `true`; set it `false`
|
|
5468
|
+
* for a palette whose entries toggle state and are expected to be used several times in a row.
|
|
5469
|
+
* - `title`: Accessible name of the modal, rendered visually hidden — a palette shows no heading
|
|
5470
|
+
* above its search field, but the dialog still needs a name. Required, user-facing text the
|
|
5471
|
+
* consuming app is responsible for translating.
|
|
5472
|
+
* - `description`: Visually hidden description of the modal, announced after `title`. Same
|
|
5473
|
+
* translation contract.
|
|
5474
|
+
* - `emptyText`, `searchPlaceholder`, `filter`, `color`: Forwarded to `<yuw-command>` unchanged;
|
|
5475
|
+
* `filter` shares its default, so the two components always match on the same rule.
|
|
5476
|
+
* - `panelClass`: Extra classes merged onto the modal panel. Use it to widen the palette or lift it
|
|
5477
|
+
* above centre (`mb-[24vh]`), where palettes are conventionally placed. Prefer a margin over
|
|
5478
|
+
* `-translate-y`: the panel animates with `zoom-*`, whose keyframes drive `transform`.
|
|
5479
|
+
* Resizing it needs a **definite width** plus an **`sm:`-prefixed** cap, e.g.
|
|
5480
|
+
* `w-[650px] max-w-[calc(100vw-2rem)] sm:max-w-[calc(100vw-2rem)]`. Both parts are load-bearing,
|
|
5481
|
+
* verified by measuring the rendered panel in Chrome:
|
|
5482
|
+
* - `.cdk-overlay-pane` is `position: absolute` with no width, so it shrink-wraps its content.
|
|
5483
|
+
* A percentage width (`w-full`) therefore resolves against the *content* width — about 80px —
|
|
5484
|
+
* not the viewport, and no `max-w-*` can widen it because nothing ever requests more. Only a
|
|
5485
|
+
* definite `w-[…]` makes the pane size itself.
|
|
5486
|
+
* - the cap must repeat under the `sm:` variant, because the helm's own cap is `sm:max-w-sm`
|
|
5487
|
+
* (384px) emitted late in the stylesheet. `twMerge` only collapses classes of the same
|
|
5488
|
+
* variant, so an unprefixed `max-w-*` leaves `sm:max-w-sm` in place and loses to it above
|
|
5489
|
+
* 640px — the class list looks right while the panel stays 384px wide.
|
|
5490
|
+
* Use `100vw` rather than `100%` in the cap: a percentage is relative to the shrink-wrapped pane
|
|
5491
|
+
* again. `min-w-*` is rarely needed, since the `vw` cap already tracks the viewport.
|
|
5492
|
+
*
|
|
5493
|
+
* Outputs:
|
|
5494
|
+
* - `commandSelected`: Emits the chosen entry, after running its own `action`.
|
|
5495
|
+
*
|
|
5496
|
+
* Usage:
|
|
5497
|
+
* ```html
|
|
5498
|
+
* <yuw-command-dialog
|
|
5499
|
+
* [groups]="groups"
|
|
5500
|
+
* [(open)]="paletteOpen"
|
|
5501
|
+
* title="Command palette"
|
|
5502
|
+
* emptyText="No results found."
|
|
5503
|
+
* searchPlaceholder="Type a command or search…"
|
|
5504
|
+
* panelClass="sm:max-w-lg mb-[24vh]"
|
|
5505
|
+
* (commandSelected)="run($event)"
|
|
5506
|
+
* />
|
|
5507
|
+
* ```
|
|
5508
|
+
*/
|
|
5509
|
+
class YuwCommandDialogComponent {
|
|
5510
|
+
constructor() {
|
|
5511
|
+
this.closeOnSelect = input(true, { ...(ngDevMode ? { debugName: "closeOnSelect" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
5512
|
+
this.color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
5513
|
+
this.description = input(undefined, ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
|
|
5514
|
+
this.emptyText = input(undefined, ...(ngDevMode ? [{ debugName: "emptyText" }] : /* istanbul ignore next */ []));
|
|
5515
|
+
this.filter = input(yuwCommandDefaultFilter, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
|
|
5516
|
+
this.groups = input.required(...(ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ []));
|
|
5517
|
+
this.open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
5518
|
+
this.panelClass = input(undefined, ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
|
|
5519
|
+
this.search = model('', ...(ngDevMode ? [{ debugName: "search" }] : /* istanbul ignore next */ []));
|
|
5520
|
+
this.searchPlaceholder = input(undefined, ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
|
|
5521
|
+
this.title = input.required(...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
|
|
5522
|
+
this.commandSelected = output();
|
|
5523
|
+
this._panelClasses = computed(() => {
|
|
5524
|
+
const panelClass = this.panelClass() ?? '';
|
|
5525
|
+
return twMerge(panelWidthClasses, panelClass);
|
|
5526
|
+
}, ...(ngDevMode ? [{ debugName: "_panelClasses" }] : /* istanbul ignore next */ []));
|
|
5527
|
+
this._state = computed(() => (this.open() ? 'open' : 'closed'), ...(ngDevMode ? [{ debugName: "_state" }] : /* istanbul ignore next */ []));
|
|
5528
|
+
}
|
|
5529
|
+
onSelected(item) {
|
|
5530
|
+
this.commandSelected.emit(item);
|
|
5531
|
+
if (this.closeOnSelect()) {
|
|
5532
|
+
this.onStateChanged('closed');
|
|
5533
|
+
}
|
|
5534
|
+
}
|
|
5535
|
+
onStateChanged(state) {
|
|
5536
|
+
const isOpen = state === 'open';
|
|
5537
|
+
if (!isOpen) {
|
|
5538
|
+
this.search.set('');
|
|
5539
|
+
}
|
|
5540
|
+
this.open.set(isOpen);
|
|
5541
|
+
}
|
|
5542
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwCommandDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5543
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.22", type: YuwCommandDialogComponent, isStandalone: true, selector: "yuw-command-dialog", inputs: { closeOnSelect: { classPropertyName: "closeOnSelect", publicName: "closeOnSelect", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, groups: { classPropertyName: "groups", publicName: "groups", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, search: { classPropertyName: "search", publicName: "search", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { open: "openChange", search: "searchChange", commandSelected: "commandSelected" }, host: { classAttribute: "contents" }, ngImport: i0, template: "<hlm-command-dialog\n [state]=\"_state()\"\n [title]=\"title()\"\n [description]=\"description() ?? ''\"\n [dialogContentClass]=\"panelClass() ?? ''\"\n (stateChange)=\"onStateChanged($event)\"\n>\n <yuw-command\n [groups]=\"groups()\"\n [(search)]=\"search\"\n [color]=\"color()\"\n [filter]=\"filter()\"\n [emptyText]=\"emptyText()\"\n [searchPlaceholder]=\"searchPlaceholder()\"\n (commandSelected)=\"onSelected($event)\"\n />\n</hlm-command-dialog>\n", dependencies: [{ kind: "component", type: HlmCommandDialog, selector: "hlm-command-dialog", inputs: ["title", "description", "state", "showCloseButton", "dialogContentClass"], outputs: ["stateChange"] }, { kind: "component", type: YuwCommandComponent, selector: "yuw-command", inputs: ["color", "disabled", "emptyText", "filter", "groups", "search", "searchPlaceholder", "class"], outputs: ["searchChange", "commandSelected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5544
|
+
}
|
|
5545
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: YuwCommandDialogComponent, decorators: [{
|
|
5546
|
+
type: Component,
|
|
5547
|
+
args: [{ selector: 'yuw-command-dialog', imports: [HlmCommandDialog, YuwCommandComponent], host: {
|
|
5548
|
+
class: 'contents',
|
|
5549
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<hlm-command-dialog\n [state]=\"_state()\"\n [title]=\"title()\"\n [description]=\"description() ?? ''\"\n [dialogContentClass]=\"panelClass() ?? ''\"\n (stateChange)=\"onStateChanged($event)\"\n>\n <yuw-command\n [groups]=\"groups()\"\n [(search)]=\"search\"\n [color]=\"color()\"\n [filter]=\"filter()\"\n [emptyText]=\"emptyText()\"\n [searchPlaceholder]=\"searchPlaceholder()\"\n (commandSelected)=\"onSelected($event)\"\n />\n</hlm-command-dialog>\n" }]
|
|
5550
|
+
}], propDecorators: { closeOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnSelect", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], groups: [{ type: i0.Input, args: [{ isSignal: true, alias: "groups", required: true }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], search: [{ type: i0.Input, args: [{ isSignal: true, alias: "search", required: false }] }, { type: i0.Output, args: ["searchChange"] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], commandSelected: [{ type: i0.Output, args: ["commandSelected"] }] } });
|
|
5551
|
+
|
|
5243
5552
|
/*
|
|
5244
5553
|
* Public API Surface of yukit-web
|
|
5245
5554
|
*/
|
|
@@ -5248,5 +5557,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
5248
5557
|
* Generated bundle index. Do not edit.
|
|
5249
5558
|
*/
|
|
5250
5559
|
|
|
5251
|
-
export { DATATABLE_ALIGN_CLASS, YUW_PASSWORD_REVEAL_STATES, YUW_SIDEBAR_RAIL_ICON_SIZE, YUW_SIDEBAR_RAIL_PADDING, YUW_SIDEBAR_RAIL_WIDTH, YuwAccordion, YuwAccordionContentComponent, YuwAccordionImports, YuwAccordionItem, YuwAccordionTriggerComponent, YuwAlertActionDirective, YuwAlertComponent, YuwAlertDescriptionDirective, YuwAlertDialogComponent, YuwAlertDialogMediaDirective, YuwAlertDialogTriggerDirective, YuwAlertImports, YuwAlertTitleDirective, YuwAttachmentActionDirective, YuwAttachmentActionsDirective, YuwAttachmentContentDirective, YuwAttachmentDescriptionDirective, YuwAttachmentDirective, YuwAttachmentGroupDirective, YuwAttachmentMediaDirective, YuwAttachmentTitleDirective, YuwAttachmentTriggerDirective, YuwAvatarComponent, YuwBadgeComponent, YuwBreadcrumbComponent, YuwButtonComponent, YuwButtonGroupComponent, YuwButtonGroupContentDirective, YuwCaptionDirective, YuwCardActionDirective, YuwCardContentDirective, YuwCardDescriptionDirective, YuwCardDirective, YuwCardFooterDirective, YuwCardHeaderDirective, YuwCardImports, YuwCardTitleDirective, YuwCheckboxComponent, YuwComboboxComponent, YuwComboboxItemDirective, YuwContextMenuCheckboxDirective, YuwContextMenuCheckboxIndicatorComponent, YuwContextMenuDirective, YuwContextMenuGroupDirective, YuwContextMenuImports, YuwContextMenuItemDirective, YuwContextMenuLabelDirective, YuwContextMenuRadioDirective, YuwContextMenuRadioIndicatorComponent, YuwContextMenuSeparatorDirective, YuwContextMenuShortcutDirective, YuwContextMenuSubDirective, YuwContextMenuSubIndicatorComponent, YuwContextMenuSubTriggerDirective, YuwContextMenuTriggerDirective, YuwDatatableComponent, YuwDatatablePaginationDirective, YuwDatatableRowSelect, YuwDatepickerComponent, YuwDialogCloseDirective, YuwDialogComponent, YuwDialogFooterDirective, YuwDialogImports, YuwDialogTriggerDirective, YuwEmptyContentDirective, YuwEmptyDescriptionDirective, YuwEmptyDirective, YuwEmptyHeaderDirective, YuwEmptyImports, YuwEmptyMediaDirective, YuwEmptyTitleDirective, YuwInputAddonImports, YuwInputComponent, YuwInputOtpComponent, YuwItemActionsDirective, YuwItemContentDirective, YuwItemDescriptionDirective, YuwItemDirective, YuwItemFooterDirective, YuwItemGroupDirective, YuwItemHeaderDirective, YuwItemImports, YuwItemMediaDirective, YuwItemSeparatorDirective, YuwItemTitleDirective, YuwLabel, YuwLeftAddonDirective, YuwPaginationComponent, YuwPasswordInputComponent, YuwPopoverComponent, YuwPopoverTriggerDirective, YuwRadioGroupComponent, YuwRightAddonDirective, YuwSearchInputComponent, YuwSheetCloseDirective, YuwSheetComponent, YuwSheetFooterDirective, YuwSheetImports, YuwSheetTriggerDirective, YuwSidebarComponent, YuwSidebarContentDirective, YuwSidebarContentExtraDirective, YuwSidebarFooterDirective, YuwSidebarFooterExtraDirective, YuwSidebarGroupContentDirective, YuwSidebarGroupDirective, YuwSidebarGroupLabelDirective, YuwSidebarHeaderDirective, YuwSidebarInsetDirective, YuwSidebarMenuBadgeDirective, YuwSidebarMenuButtonDirective, YuwSidebarMenuDirective, YuwSidebarMenuItemDirective, YuwSidebarMenuSubButtonDirective, YuwSidebarMenuSubDirective, YuwSidebarMenuSubItemDirective, YuwSidebarRailDirective, YuwSidebarRailService, YuwSidebarSeparatorDirective, YuwSidebarSubmenuService, YuwSidebarTriggerComponent, YuwSidebarWrapperDirective, YuwSkeletonDirective, YuwSpinnerComponent, YuwSwitchComponent, YuwTBodyDirective, YuwTFootDirective, YuwTHeadDirective, YuwTabPanelDirective, YuwTableContainerDirective, YuwTableDirective, YuwTableImports, YuwTabsComponent, YuwTdDirective, YuwTextareaComponent, YuwThDirective, YuwToasterComponent, YuwTooltipDirective, YuwTrDirective, YuwValueAccessorBase, buildInputOtpGroups, cn, datatableCellVariants, datatableContainerVariants, datatableHeadVariants, datatableHeaderCellVariants, datatableRowVariants, getPaginationRange, provideValueAccessor, totalInputOtpLength };
|
|
5560
|
+
export { DATATABLE_ALIGN_CLASS, YUW_PASSWORD_REVEAL_STATES, YUW_SIDEBAR_RAIL_ICON_SIZE, YUW_SIDEBAR_RAIL_PADDING, YUW_SIDEBAR_RAIL_WIDTH, YuwAccordion, YuwAccordionContentComponent, YuwAccordionImports, YuwAccordionItem, YuwAccordionTriggerComponent, YuwAlertActionDirective, YuwAlertComponent, YuwAlertDescriptionDirective, YuwAlertDialogComponent, YuwAlertDialogMediaDirective, YuwAlertDialogTriggerDirective, YuwAlertImports, YuwAlertTitleDirective, YuwAttachmentActionDirective, YuwAttachmentActionsDirective, YuwAttachmentContentDirective, YuwAttachmentDescriptionDirective, YuwAttachmentDirective, YuwAttachmentGroupDirective, YuwAttachmentMediaDirective, YuwAttachmentTitleDirective, YuwAttachmentTriggerDirective, YuwAvatarComponent, YuwBadgeComponent, YuwBreadcrumbComponent, YuwButtonComponent, YuwButtonGroupComponent, YuwButtonGroupContentDirective, YuwCaptionDirective, YuwCardActionDirective, YuwCardContentDirective, YuwCardDescriptionDirective, YuwCardDirective, YuwCardFooterDirective, YuwCardHeaderDirective, YuwCardImports, YuwCardTitleDirective, YuwCheckboxComponent, YuwClassDirective, YuwComboboxComponent, YuwComboboxItemDirective, YuwCommandComponent, YuwCommandDialogComponent, YuwContextMenuCheckboxDirective, YuwContextMenuCheckboxIndicatorComponent, YuwContextMenuDirective, YuwContextMenuGroupDirective, YuwContextMenuImports, YuwContextMenuItemDirective, YuwContextMenuLabelDirective, YuwContextMenuRadioDirective, YuwContextMenuRadioIndicatorComponent, YuwContextMenuSeparatorDirective, YuwContextMenuShortcutDirective, YuwContextMenuSubDirective, YuwContextMenuSubIndicatorComponent, YuwContextMenuSubTriggerDirective, YuwContextMenuTriggerDirective, YuwDatatableComponent, YuwDatatablePaginationDirective, YuwDatatableRowSelect, YuwDatepickerComponent, YuwDialogCloseDirective, YuwDialogComponent, YuwDialogFooterDirective, YuwDialogImports, YuwDialogTriggerDirective, YuwEmptyContentDirective, YuwEmptyDescriptionDirective, YuwEmptyDirective, YuwEmptyHeaderDirective, YuwEmptyImports, YuwEmptyMediaDirective, YuwEmptyTitleDirective, YuwInputAddonImports, YuwInputComponent, YuwInputOtpComponent, YuwItemActionsDirective, YuwItemContentDirective, YuwItemDescriptionDirective, YuwItemDirective, YuwItemFooterDirective, YuwItemGroupDirective, YuwItemHeaderDirective, YuwItemImports, YuwItemMediaDirective, YuwItemSeparatorDirective, YuwItemTitleDirective, YuwLabel, YuwLeftAddonDirective, YuwPaginationComponent, YuwPasswordInputComponent, YuwPopoverComponent, YuwPopoverTriggerDirective, YuwRadioGroupComponent, YuwRightAddonDirective, YuwSearchInputComponent, YuwSheetCloseDirective, YuwSheetComponent, YuwSheetFooterDirective, YuwSheetImports, YuwSheetTriggerDirective, YuwSidebarComponent, YuwSidebarContentDirective, YuwSidebarContentExtraDirective, YuwSidebarFooterDirective, YuwSidebarFooterExtraDirective, YuwSidebarGroupContentDirective, YuwSidebarGroupDirective, YuwSidebarGroupLabelDirective, YuwSidebarHeaderDirective, YuwSidebarInsetDirective, YuwSidebarMenuAvatarButtonDirective, YuwSidebarMenuBadgeDirective, YuwSidebarMenuButtonDirective, YuwSidebarMenuDirective, YuwSidebarMenuItemDirective, YuwSidebarMenuSubButtonDirective, YuwSidebarMenuSubDirective, YuwSidebarMenuSubItemDirective, YuwSidebarRailDirective, YuwSidebarRailService, YuwSidebarSeparatorDirective, YuwSidebarSubmenuService, YuwSidebarTriggerComponent, YuwSidebarWrapperDirective, YuwSkeletonDirective, YuwSpinnerComponent, YuwSwitchComponent, YuwTBodyDirective, YuwTFootDirective, YuwTHeadDirective, YuwTabPanelDirective, YuwTableContainerDirective, YuwTableDirective, YuwTableImports, YuwTabsComponent, YuwTdDirective, YuwTextareaComponent, YuwThDirective, YuwToasterComponent, YuwTooltipDirective, YuwTrDirective, YuwValueAccessorBase, buildInputOtpGroups, cn, datatableCellVariants, datatableContainerVariants, datatableHeadVariants, datatableHeaderCellVariants, datatableRowVariants, getPaginationRange, provideValueAccessor, totalInputOtpLength, yuwCommandDefaultFilter };
|
|
5252
5561
|
//# sourceMappingURL=yukit-web.mjs.map
|