@m1z23r/ngx-ui 1.1.46 → 1.1.48

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.
@@ -3946,6 +3946,311 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
3946
3946
  args: [{ selector: 'ui-slider', standalone: true, imports: [FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ui-slider-wrapper\" [class]=\"sliderClasses()\" [class.ui-slider-wrapper--disabled]=\"disabled()\">\n @if (label()) {\n <label class=\"ui-slider__label\" [attr.for]=\"inputId()\">\n {{ label() }}\n </label>\n }\n <div class=\"ui-slider__container\" [style.--fill]=\"fillPercent()\">\n <input\n class=\"ui-slider\"\n type=\"range\"\n [id]=\"inputId()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"value\"\n (change)=\"valueCommit.emit(value())\"\n />\n </div>\n @if (showValue()) {\n <span class=\"ui-slider__value\">{{ value() }}</span>\n }\n</div>\n", styles: [":host{display:block}.ui-slider-wrapper{display:flex;flex-direction:column;gap:var(--ui-spacing-xs)}.ui-slider__label{font-size:var(--ui-font-sm);font-weight:500;color:var(--ui-text)}.ui-slider__value{font-size:var(--ui-font-sm);color:var(--ui-text-muted);font-variant-numeric:tabular-nums}.ui-slider__container{display:flex;align-items:center}.ui-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;background:transparent;cursor:pointer;margin:0;padding:0}.ui-slider::-webkit-slider-runnable-track{width:100%;border-radius:var(--ui-radius-xl);background:linear-gradient(to right,var(--ui-primary) 0%,var(--ui-primary) var(--fill, 0%),var(--ui-bg-tertiary) var(--fill, 0%),var(--ui-bg-tertiary) 100%);border:none}.ui-slider::-moz-range-track{width:100%;border-radius:var(--ui-radius-xl);background:var(--ui-bg-tertiary);border:none}.ui-slider::-moz-range-progress{border-radius:var(--ui-radius-xl);background:var(--ui-primary)}.ui-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;border-radius:50%;background:var(--ui-primary);border:2px solid var(--ui-bg);box-shadow:var(--ui-shadow-sm);transition:box-shadow var(--ui-transition-fast),transform var(--ui-transition-fast)}.ui-slider::-moz-range-thumb{border-radius:50%;background:var(--ui-primary);border:2px solid var(--ui-bg);box-shadow:var(--ui-shadow-sm);transition:box-shadow var(--ui-transition-fast),transform var(--ui-transition-fast)}.ui-slider:focus{outline:none}.ui-slider:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 20%,transparent)}.ui-slider:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 20%,transparent)}.ui-slider:not(:disabled):hover::-webkit-slider-thumb{transform:scale(1.1)}.ui-slider:not(:disabled):hover::-moz-range-thumb{transform:scale(1.1)}.ui-slider:not(:disabled):active::-webkit-slider-thumb{transform:scale(1.15);box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 20%,transparent)}.ui-slider:not(:disabled):active::-moz-range-thumb{transform:scale(1.15);box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 20%,transparent)}.ui-slider--sm .ui-slider{height:20px}.ui-slider--sm .ui-slider::-webkit-slider-runnable-track{height:4px}.ui-slider--sm .ui-slider::-moz-range-track{height:4px}.ui-slider--sm .ui-slider::-moz-range-progress{height:4px}.ui-slider--sm .ui-slider::-webkit-slider-thumb{width:14px;height:14px;margin-top:-5px}.ui-slider--sm .ui-slider::-moz-range-thumb{width:14px;height:14px}.ui-slider--md .ui-slider{height:24px}.ui-slider--md .ui-slider::-webkit-slider-runnable-track{height:6px}.ui-slider--md .ui-slider::-moz-range-track{height:6px}.ui-slider--md .ui-slider::-moz-range-progress{height:6px}.ui-slider--md .ui-slider::-webkit-slider-thumb{width:18px;height:18px;margin-top:-6px}.ui-slider--md .ui-slider::-moz-range-thumb{width:18px;height:18px}.ui-slider--lg .ui-slider{height:32px}.ui-slider--lg .ui-slider::-webkit-slider-runnable-track{height:8px}.ui-slider--lg .ui-slider::-moz-range-track{height:8px}.ui-slider--lg .ui-slider::-moz-range-progress{height:8px}.ui-slider--lg .ui-slider::-webkit-slider-thumb{width:24px;height:24px;margin-top:-8px}.ui-slider--lg .ui-slider::-moz-range-thumb{width:24px;height:24px}.ui-slider-wrapper--disabled{opacity:.5}.ui-slider-wrapper--disabled .ui-slider{cursor:not-allowed}\n"] }]
3947
3947
  }], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], valueCommit: [{ type: i0.Output, args: ["valueCommit"] }] } });
3948
3948
 
3949
+ const MS_PER_MINUTE = 60_000;
3950
+ const MS_PER_DAY = 86_400_000;
3951
+ const DEFAULT_STEP = {
3952
+ time: 15 * MS_PER_MINUTE,
3953
+ date: MS_PER_DAY,
3954
+ datetime: 30 * MS_PER_MINUTE,
3955
+ };
3956
+ class RangeSliderComponent {
3957
+ min = input.required(...(ngDevMode ? [{ debugName: "min" }] : []));
3958
+ max = input.required(...(ngDevMode ? [{ debugName: "max" }] : []));
3959
+ mode = input('datetime', ...(ngDevMode ? [{ debugName: "mode" }] : []));
3960
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
3961
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
3962
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
3963
+ step = input(null, ...(ngDevMode ? [{ debugName: "step" }] : []));
3964
+ bubbles = input('always', ...(ngDevMode ? [{ debugName: "bubbles" }] : []));
3965
+ showRange = input(false, ...(ngDevMode ? [{ debugName: "showRange" }] : []));
3966
+ format = input(null, ...(ngDevMode ? [{ debugName: "format" }] : []));
3967
+ value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
3968
+ valueCommit = output();
3969
+ trackEl = viewChild('track', ...(ngDevMode ? [{ debugName: "trackEl" }] : []));
3970
+ startMs = signal(0, ...(ngDevMode ? [{ debugName: "startMs" }] : []));
3971
+ endMs = signal(0, ...(ngDevMode ? [{ debugName: "endMs" }] : []));
3972
+ dragging = signal(null, ...(ngDevMode ? [{ debugName: "dragging" }] : []));
3973
+ focusedThumb = signal(null, ...(ngDevMode ? [{ debugName: "focusedThumb" }] : []));
3974
+ hoveredThumb = signal(null, ...(ngDevMode ? [{ debugName: "hoveredThumb" }] : []));
3975
+ lastEmitted = null;
3976
+ minMs = computed(() => this.min().getTime(), ...(ngDevMode ? [{ debugName: "minMs" }] : []));
3977
+ maxMs = computed(() => this.max().getTime(), ...(ngDevMode ? [{ debugName: "maxMs" }] : []));
3978
+ range = computed(() => Math.max(0, this.maxMs() - this.minMs()), ...(ngDevMode ? [{ debugName: "range" }] : []));
3979
+ effectiveStep = computed(() => {
3980
+ const explicit = this.step();
3981
+ return explicit && explicit > 0 ? explicit : DEFAULT_STEP[this.mode()];
3982
+ }, ...(ngDevMode ? [{ debugName: "effectiveStep" }] : []));
3983
+ startPercent = computed(() => this.toPercent(this.startMs()), ...(ngDevMode ? [{ debugName: "startPercent" }] : []));
3984
+ endPercent = computed(() => this.toPercent(this.endMs()), ...(ngDevMode ? [{ debugName: "endPercent" }] : []));
3985
+ fillStyle = computed(() => {
3986
+ const start = this.startPercent();
3987
+ const end = this.endPercent();
3988
+ return { left: `${start}%`, width: `${Math.max(0, end - start)}%` };
3989
+ }, ...(ngDevMode ? [{ debugName: "fillStyle" }] : []));
3990
+ startLabel = computed(() => this.formatMs(this.startMs()), ...(ngDevMode ? [{ debugName: "startLabel" }] : []));
3991
+ endLabel = computed(() => this.formatMs(this.endMs()), ...(ngDevMode ? [{ debugName: "endLabel" }] : []));
3992
+ bubbleVisible = computed(() => {
3993
+ const mode = this.bubbles();
3994
+ if (mode === 'never')
3995
+ return { start: false, end: false };
3996
+ if (mode === 'always')
3997
+ return { start: true, end: true };
3998
+ // 'active' — visible when dragged, hovered, or focused
3999
+ const active = (t) => this.dragging() === t || this.focusedThumb() === t || this.hoveredThumb() === t;
4000
+ return { start: active('start'), end: active('end') };
4001
+ }, ...(ngDevMode ? [{ debugName: "bubbleVisible" }] : []));
4002
+ rootClasses = computed(() => {
4003
+ const classes = ['ui-range-slider', `ui-range-slider--${this.size()}`];
4004
+ if (this.disabled())
4005
+ classes.push('ui-range-slider--disabled');
4006
+ return classes.join(' ');
4007
+ }, ...(ngDevMode ? [{ debugName: "rootClasses" }] : []));
4008
+ constructor() {
4009
+ // Sync external value → internal thumb positions. Falls back to [min, max] when null.
4010
+ effect(() => {
4011
+ const min = this.minMs();
4012
+ const max = this.maxMs();
4013
+ const v = this.value();
4014
+ if (v) {
4015
+ this.startMs.set(this.snap(this.clamp(v.start.getTime())));
4016
+ this.endMs.set(this.snap(this.clamp(v.end.getTime())));
4017
+ this.lastEmitted = v;
4018
+ }
4019
+ else {
4020
+ this.startMs.set(min);
4021
+ this.endMs.set(max);
4022
+ this.lastEmitted = null;
4023
+ }
4024
+ });
4025
+ }
4026
+ /** Push current thumb state into the value model (live, during interaction). */
4027
+ writeValue() {
4028
+ const next = {
4029
+ start: this.materialize(this.startMs()),
4030
+ end: this.materialize(this.endMs()),
4031
+ };
4032
+ const prev = this.lastEmitted;
4033
+ if (prev &&
4034
+ prev.start.getTime() === next.start.getTime() &&
4035
+ prev.end.getTime() === next.end.getTime()) {
4036
+ return;
4037
+ }
4038
+ this.lastEmitted = next;
4039
+ this.value.set(next);
4040
+ }
4041
+ // -- Pointer handling -------------------------------------------------
4042
+ onThumbPointerDown(event, thumb) {
4043
+ if (this.disabled())
4044
+ return;
4045
+ event.preventDefault();
4046
+ const target = event.target;
4047
+ target.setPointerCapture(event.pointerId);
4048
+ this.dragging.set(thumb);
4049
+ this.focusedThumb.set(thumb);
4050
+ target.focus();
4051
+ }
4052
+ onThumbPointerMove(event, thumb) {
4053
+ if (this.dragging() !== thumb)
4054
+ return;
4055
+ event.preventDefault();
4056
+ const ms = this.pixelToMs(event.clientX);
4057
+ this.setThumb(thumb, ms);
4058
+ }
4059
+ onThumbPointerUp(event, thumb) {
4060
+ if (this.dragging() !== thumb)
4061
+ return;
4062
+ const target = event.target;
4063
+ if (target.hasPointerCapture(event.pointerId)) {
4064
+ target.releasePointerCapture(event.pointerId);
4065
+ }
4066
+ this.dragging.set(null);
4067
+ this.commit();
4068
+ }
4069
+ onTrackPointerDown(event) {
4070
+ if (this.disabled())
4071
+ return;
4072
+ if (event.target.dataset['thumb'])
4073
+ return; // ignore thumb hits
4074
+ const ms = this.pixelToMs(event.clientX);
4075
+ const thumb = Math.abs(ms - this.startMs()) <= Math.abs(ms - this.endMs()) ? 'start' : 'end';
4076
+ this.setThumb(thumb, ms);
4077
+ this.commit();
4078
+ }
4079
+ // -- Keyboard ---------------------------------------------------------
4080
+ onThumbKeyDown(event, thumb) {
4081
+ if (this.disabled())
4082
+ return;
4083
+ const step = this.effectiveStep();
4084
+ const big = step * 10;
4085
+ let delta = 0;
4086
+ let target = null;
4087
+ switch (event.key) {
4088
+ case 'ArrowLeft':
4089
+ case 'ArrowDown':
4090
+ delta = event.shiftKey ? -big : -step;
4091
+ break;
4092
+ case 'ArrowRight':
4093
+ case 'ArrowUp':
4094
+ delta = event.shiftKey ? big : step;
4095
+ break;
4096
+ case 'Home':
4097
+ target = thumb === 'start' ? this.minMs() : this.startMs();
4098
+ break;
4099
+ case 'End':
4100
+ target = thumb === 'end' ? this.maxMs() : this.endMs();
4101
+ break;
4102
+ default:
4103
+ return;
4104
+ }
4105
+ event.preventDefault();
4106
+ if (target !== null) {
4107
+ this.setThumb(thumb, target);
4108
+ }
4109
+ else {
4110
+ const current = thumb === 'start' ? this.startMs() : this.endMs();
4111
+ this.setThumb(thumb, current + delta);
4112
+ }
4113
+ }
4114
+ onThumbKeyUp(event) {
4115
+ const keys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'];
4116
+ if (keys.includes(event.key)) {
4117
+ this.commit();
4118
+ }
4119
+ }
4120
+ onThumbFocus(thumb) {
4121
+ this.focusedThumb.set(thumb);
4122
+ }
4123
+ onThumbBlur() {
4124
+ this.focusedThumb.set(null);
4125
+ }
4126
+ onThumbEnter(thumb) {
4127
+ this.hoveredThumb.set(thumb);
4128
+ }
4129
+ onThumbLeave() {
4130
+ this.hoveredThumb.set(null);
4131
+ }
4132
+ // -- Internal helpers -------------------------------------------------
4133
+ setThumb(thumb, msRaw) {
4134
+ const snapped = this.snap(this.clamp(msRaw));
4135
+ let changed = false;
4136
+ if (thumb === 'start') {
4137
+ const next = Math.min(snapped, this.endMs());
4138
+ if (next !== this.startMs()) {
4139
+ this.startMs.set(next);
4140
+ changed = true;
4141
+ }
4142
+ }
4143
+ else {
4144
+ const next = Math.max(snapped, this.startMs());
4145
+ if (next !== this.endMs()) {
4146
+ this.endMs.set(next);
4147
+ changed = true;
4148
+ }
4149
+ }
4150
+ if (changed)
4151
+ this.writeValue();
4152
+ }
4153
+ commit() {
4154
+ if (this.lastEmitted) {
4155
+ this.valueCommit.emit(this.lastEmitted);
4156
+ }
4157
+ }
4158
+ clamp(ms) {
4159
+ return Math.min(this.maxMs(), Math.max(this.minMs(), ms));
4160
+ }
4161
+ snap(ms) {
4162
+ const min = this.minMs();
4163
+ const max = this.maxMs();
4164
+ const step = this.effectiveStep();
4165
+ if (step <= 0 || min >= max)
4166
+ return ms;
4167
+ const offset = ms - min;
4168
+ const snapped = min + Math.round(offset / step) * step;
4169
+ if (snapped > max)
4170
+ return max;
4171
+ if (snapped < min)
4172
+ return min;
4173
+ return snapped;
4174
+ }
4175
+ toPercent(ms) {
4176
+ const range = this.range();
4177
+ if (range <= 0)
4178
+ return 0;
4179
+ return ((ms - this.minMs()) / range) * 100;
4180
+ }
4181
+ pixelToMs(clientX) {
4182
+ const el = this.trackEl()?.nativeElement;
4183
+ if (!el)
4184
+ return this.minMs();
4185
+ const rect = el.getBoundingClientRect();
4186
+ if (rect.width <= 0)
4187
+ return this.minMs();
4188
+ const ratio = (clientX - rect.left) / rect.width;
4189
+ const clamped = Math.min(1, Math.max(0, ratio));
4190
+ return this.minMs() + clamped * this.range();
4191
+ }
4192
+ /**
4193
+ * Convert internal ms to a Date appropriate for the current mode.
4194
+ * date mode normalizes time-of-day to that of `min`.
4195
+ */
4196
+ materialize(ms) {
4197
+ if (this.mode() === 'date') {
4198
+ const minDate = this.min();
4199
+ const d = new Date(ms);
4200
+ d.setHours(minDate.getHours(), minDate.getMinutes(), minDate.getSeconds(), minDate.getMilliseconds());
4201
+ return d;
4202
+ }
4203
+ return new Date(ms);
4204
+ }
4205
+ // -- Formatting -------------------------------------------------------
4206
+ formatMs(ms) {
4207
+ const date = new Date(ms);
4208
+ const override = this.format();
4209
+ if (override)
4210
+ return this.applyFormat(date, override);
4211
+ switch (this.mode()) {
4212
+ case 'time':
4213
+ return this.effectiveStep() < MS_PER_MINUTE
4214
+ ? `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`
4215
+ : `${pad(date.getHours())}:${pad(date.getMinutes())}`;
4216
+ case 'date':
4217
+ return new Intl.DateTimeFormat(undefined, {
4218
+ month: 'short',
4219
+ day: 'numeric',
4220
+ year: 'numeric',
4221
+ }).format(date);
4222
+ case 'datetime':
4223
+ return `${new Intl.DateTimeFormat(undefined, {
4224
+ month: 'short',
4225
+ day: 'numeric',
4226
+ }).format(date)}, ${pad(date.getHours())}:${pad(date.getMinutes())}`;
4227
+ }
4228
+ }
4229
+ /** Tiny formatter for common tokens: yyyy MM dd HH mm ss MMM d. */
4230
+ applyFormat(date, fmt) {
4231
+ const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
4232
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
4233
+ return fmt
4234
+ .replace(/yyyy/g, String(date.getFullYear()))
4235
+ .replace(/MMM/g, months[date.getMonth()])
4236
+ .replace(/MM/g, pad(date.getMonth() + 1))
4237
+ .replace(/dd/g, pad(date.getDate()))
4238
+ .replace(/d/g, String(date.getDate()))
4239
+ .replace(/HH/g, pad(date.getHours()))
4240
+ .replace(/mm/g, pad(date.getMinutes()))
4241
+ .replace(/ss/g, pad(date.getSeconds()));
4242
+ }
4243
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: RangeSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4244
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: RangeSliderComponent, isStandalone: true, selector: "ui-range-slider", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: true, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, bubbles: { classPropertyName: "bubbles", publicName: "bubbles", isSignal: true, isRequired: false, transformFunction: null }, showRange: { classPropertyName: "showRange", publicName: "showRange", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", valueCommit: "valueCommit" }, viewQueries: [{ propertyName: "trackEl", first: true, predicate: ["track"], descendants: true, isSignal: true }], ngImport: i0, template: "@let isDisabled = disabled();\n@let bubbleVis = bubbleVisible();\n@let rangeOn = showRange();\n@let startPct = startPercent();\n@let endPct = endPercent();\n@let fill = fillStyle();\n\n<div [class]=\"rootClasses()\">\n @if (label()) {\n <label class=\"ui-range-slider__label\">{{ label() }}</label>\n }\n\n <div\n #track\n class=\"ui-range-slider__track\"\n (pointerdown)=\"onTrackPointerDown($event)\"\n >\n <div class=\"ui-range-slider__fill\" [style.left]=\"fill.left\" [style.width]=\"fill.width\"></div>\n\n <div\n class=\"ui-range-slider__thumb ui-range-slider__thumb--start\"\n role=\"slider\"\n tabindex=\"0\"\n data-thumb=\"start\"\n [attr.aria-valuemin]=\"minMs()\"\n [attr.aria-valuemax]=\"endMs()\"\n [attr.aria-valuenow]=\"startMs()\"\n [attr.aria-valuetext]=\"startLabel()\"\n [attr.aria-disabled]=\"isDisabled\"\n aria-label=\"Start\"\n aria-orientation=\"horizontal\"\n [style.left.%]=\"startPct\"\n (pointerdown)=\"onThumbPointerDown($event, 'start')\"\n (pointermove)=\"onThumbPointerMove($event, 'start')\"\n (pointerup)=\"onThumbPointerUp($event, 'start')\"\n (pointercancel)=\"onThumbPointerUp($event, 'start')\"\n (pointerenter)=\"onThumbEnter('start')\"\n (pointerleave)=\"onThumbLeave()\"\n (keydown)=\"onThumbKeyDown($event, 'start')\"\n (keyup)=\"onThumbKeyUp($event)\"\n (focus)=\"onThumbFocus('start')\"\n (blur)=\"onThumbBlur()\"\n >\n @if (bubbleVis.start) {\n <span class=\"ui-range-slider__bubble\">{{ startLabel() }}</span>\n }\n </div>\n\n <div\n class=\"ui-range-slider__thumb ui-range-slider__thumb--end\"\n role=\"slider\"\n tabindex=\"0\"\n data-thumb=\"end\"\n [attr.aria-valuemin]=\"startMs()\"\n [attr.aria-valuemax]=\"maxMs()\"\n [attr.aria-valuenow]=\"endMs()\"\n [attr.aria-valuetext]=\"endLabel()\"\n [attr.aria-disabled]=\"isDisabled\"\n aria-label=\"End\"\n aria-orientation=\"horizontal\"\n [style.left.%]=\"endPct\"\n (pointerdown)=\"onThumbPointerDown($event, 'end')\"\n (pointermove)=\"onThumbPointerMove($event, 'end')\"\n (pointerup)=\"onThumbPointerUp($event, 'end')\"\n (pointercancel)=\"onThumbPointerUp($event, 'end')\"\n (pointerenter)=\"onThumbEnter('end')\"\n (pointerleave)=\"onThumbLeave()\"\n (keydown)=\"onThumbKeyDown($event, 'end')\"\n (keyup)=\"onThumbKeyUp($event)\"\n (focus)=\"onThumbFocus('end')\"\n (blur)=\"onThumbBlur()\"\n >\n @if (bubbleVis.end) {\n <span class=\"ui-range-slider__bubble\">{{ endLabel() }}</span>\n }\n </div>\n </div>\n\n @if (rangeOn) {\n <div class=\"ui-range-slider__range\">\n <span>{{ startLabel() }}</span>\n <span class=\"ui-range-slider__range-arrow\" aria-hidden=\"true\">\u2192</span>\n <span>{{ endLabel() }}</span>\n </div>\n }\n</div>\n", styles: [":host{display:block}.ui-range-slider{display:flex;flex-direction:column;gap:var(--ui-spacing-sm);user-select:none;-webkit-user-select:none}.ui-range-slider__label{font-size:var(--ui-font-sm);font-weight:500;color:var(--ui-text)}.ui-range-slider__track{position:relative;width:100%;background:var(--ui-bg-tertiary);border-radius:var(--ui-radius-xl);cursor:pointer;touch-action:none}.ui-range-slider__fill{position:absolute;top:0;bottom:0;background:var(--ui-primary);border-radius:var(--ui-radius-xl);pointer-events:none}.ui-range-slider__thumb{position:absolute;top:50%;border-radius:50%;background:var(--ui-primary);border:2px solid var(--ui-bg);box-shadow:var(--ui-shadow-sm);cursor:grab;outline:none;transition:box-shadow var(--ui-transition-fast),transform var(--ui-transition-fast);touch-action:none}.ui-range-slider__thumb:hover:not([aria-disabled=true]){transform:translate(-50%,-50%) scale(1.1)}.ui-range-slider__thumb:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 20%,transparent)}.ui-range-slider__thumb:active:not([aria-disabled=true]){cursor:grabbing;transform:translate(-50%,-50%) scale(1.15);box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 20%,transparent);z-index:3}.ui-range-slider__thumb{transform:translate(-50%,-50%)}.ui-range-slider__bubble{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);background:var(--ui-bg);border:1px solid var(--ui-border);color:var(--ui-text);font-size:var(--ui-font-xs);font-weight:500;padding:2px var(--ui-spacing-sm);border-radius:var(--ui-radius-sm);box-shadow:var(--ui-shadow-sm);white-space:nowrap;pointer-events:none;font-variant-numeric:tabular-nums;animation:ui-range-slider-bubble-in var(--ui-transition-fast) ease-out}.ui-range-slider__bubble:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:4px solid transparent;border-top-color:var(--ui-border)}.ui-range-slider__bubble:before{content:\"\";position:absolute;top:calc(100% - 1px);left:50%;transform:translate(-50%);border:4px solid transparent;border-top-color:var(--ui-bg);z-index:1}.ui-range-slider__range{display:flex;align-items:center;gap:var(--ui-spacing-xs);font-size:var(--ui-font-sm);color:var(--ui-text-muted);font-variant-numeric:tabular-nums}.ui-range-slider__range-arrow{color:var(--ui-text-disabled)}.ui-range-slider--sm .ui-range-slider__track{height:4px}.ui-range-slider--sm .ui-range-slider__thumb{width:14px;height:14px}.ui-range-slider--md .ui-range-slider__track{height:6px}.ui-range-slider--md .ui-range-slider__thumb{width:18px;height:18px}.ui-range-slider--lg .ui-range-slider__track{height:8px}.ui-range-slider--lg .ui-range-slider__thumb{width:24px;height:24px}.ui-range-slider__track{margin-top:var(--ui-spacing-lg)}.ui-range-slider--disabled{opacity:.5}.ui-range-slider--disabled .ui-range-slider__track,.ui-range-slider--disabled .ui-range-slider__thumb{cursor:not-allowed}.ui-range-slider--disabled .ui-range-slider__thumb:hover,.ui-range-slider--disabled .ui-range-slider__thumb:active{transform:translate(-50%,-50%);box-shadow:var(--ui-shadow-sm)}@keyframes ui-range-slider-bubble-in{0%{opacity:0;transform:translate(-50%) translateY(4px)}to{opacity:1;transform:translate(-50%) translateY(0)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4245
+ }
4246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: RangeSliderComponent, decorators: [{
4247
+ type: Component,
4248
+ args: [{ selector: 'ui-range-slider', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@let isDisabled = disabled();\n@let bubbleVis = bubbleVisible();\n@let rangeOn = showRange();\n@let startPct = startPercent();\n@let endPct = endPercent();\n@let fill = fillStyle();\n\n<div [class]=\"rootClasses()\">\n @if (label()) {\n <label class=\"ui-range-slider__label\">{{ label() }}</label>\n }\n\n <div\n #track\n class=\"ui-range-slider__track\"\n (pointerdown)=\"onTrackPointerDown($event)\"\n >\n <div class=\"ui-range-slider__fill\" [style.left]=\"fill.left\" [style.width]=\"fill.width\"></div>\n\n <div\n class=\"ui-range-slider__thumb ui-range-slider__thumb--start\"\n role=\"slider\"\n tabindex=\"0\"\n data-thumb=\"start\"\n [attr.aria-valuemin]=\"minMs()\"\n [attr.aria-valuemax]=\"endMs()\"\n [attr.aria-valuenow]=\"startMs()\"\n [attr.aria-valuetext]=\"startLabel()\"\n [attr.aria-disabled]=\"isDisabled\"\n aria-label=\"Start\"\n aria-orientation=\"horizontal\"\n [style.left.%]=\"startPct\"\n (pointerdown)=\"onThumbPointerDown($event, 'start')\"\n (pointermove)=\"onThumbPointerMove($event, 'start')\"\n (pointerup)=\"onThumbPointerUp($event, 'start')\"\n (pointercancel)=\"onThumbPointerUp($event, 'start')\"\n (pointerenter)=\"onThumbEnter('start')\"\n (pointerleave)=\"onThumbLeave()\"\n (keydown)=\"onThumbKeyDown($event, 'start')\"\n (keyup)=\"onThumbKeyUp($event)\"\n (focus)=\"onThumbFocus('start')\"\n (blur)=\"onThumbBlur()\"\n >\n @if (bubbleVis.start) {\n <span class=\"ui-range-slider__bubble\">{{ startLabel() }}</span>\n }\n </div>\n\n <div\n class=\"ui-range-slider__thumb ui-range-slider__thumb--end\"\n role=\"slider\"\n tabindex=\"0\"\n data-thumb=\"end\"\n [attr.aria-valuemin]=\"startMs()\"\n [attr.aria-valuemax]=\"maxMs()\"\n [attr.aria-valuenow]=\"endMs()\"\n [attr.aria-valuetext]=\"endLabel()\"\n [attr.aria-disabled]=\"isDisabled\"\n aria-label=\"End\"\n aria-orientation=\"horizontal\"\n [style.left.%]=\"endPct\"\n (pointerdown)=\"onThumbPointerDown($event, 'end')\"\n (pointermove)=\"onThumbPointerMove($event, 'end')\"\n (pointerup)=\"onThumbPointerUp($event, 'end')\"\n (pointercancel)=\"onThumbPointerUp($event, 'end')\"\n (pointerenter)=\"onThumbEnter('end')\"\n (pointerleave)=\"onThumbLeave()\"\n (keydown)=\"onThumbKeyDown($event, 'end')\"\n (keyup)=\"onThumbKeyUp($event)\"\n (focus)=\"onThumbFocus('end')\"\n (blur)=\"onThumbBlur()\"\n >\n @if (bubbleVis.end) {\n <span class=\"ui-range-slider__bubble\">{{ endLabel() }}</span>\n }\n </div>\n </div>\n\n @if (rangeOn) {\n <div class=\"ui-range-slider__range\">\n <span>{{ startLabel() }}</span>\n <span class=\"ui-range-slider__range-arrow\" aria-hidden=\"true\">\u2192</span>\n <span>{{ endLabel() }}</span>\n </div>\n }\n</div>\n", styles: [":host{display:block}.ui-range-slider{display:flex;flex-direction:column;gap:var(--ui-spacing-sm);user-select:none;-webkit-user-select:none}.ui-range-slider__label{font-size:var(--ui-font-sm);font-weight:500;color:var(--ui-text)}.ui-range-slider__track{position:relative;width:100%;background:var(--ui-bg-tertiary);border-radius:var(--ui-radius-xl);cursor:pointer;touch-action:none}.ui-range-slider__fill{position:absolute;top:0;bottom:0;background:var(--ui-primary);border-radius:var(--ui-radius-xl);pointer-events:none}.ui-range-slider__thumb{position:absolute;top:50%;border-radius:50%;background:var(--ui-primary);border:2px solid var(--ui-bg);box-shadow:var(--ui-shadow-sm);cursor:grab;outline:none;transition:box-shadow var(--ui-transition-fast),transform var(--ui-transition-fast);touch-action:none}.ui-range-slider__thumb:hover:not([aria-disabled=true]){transform:translate(-50%,-50%) scale(1.1)}.ui-range-slider__thumb:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 20%,transparent)}.ui-range-slider__thumb:active:not([aria-disabled=true]){cursor:grabbing;transform:translate(-50%,-50%) scale(1.15);box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 20%,transparent);z-index:3}.ui-range-slider__thumb{transform:translate(-50%,-50%)}.ui-range-slider__bubble{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);background:var(--ui-bg);border:1px solid var(--ui-border);color:var(--ui-text);font-size:var(--ui-font-xs);font-weight:500;padding:2px var(--ui-spacing-sm);border-radius:var(--ui-radius-sm);box-shadow:var(--ui-shadow-sm);white-space:nowrap;pointer-events:none;font-variant-numeric:tabular-nums;animation:ui-range-slider-bubble-in var(--ui-transition-fast) ease-out}.ui-range-slider__bubble:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:4px solid transparent;border-top-color:var(--ui-border)}.ui-range-slider__bubble:before{content:\"\";position:absolute;top:calc(100% - 1px);left:50%;transform:translate(-50%);border:4px solid transparent;border-top-color:var(--ui-bg);z-index:1}.ui-range-slider__range{display:flex;align-items:center;gap:var(--ui-spacing-xs);font-size:var(--ui-font-sm);color:var(--ui-text-muted);font-variant-numeric:tabular-nums}.ui-range-slider__range-arrow{color:var(--ui-text-disabled)}.ui-range-slider--sm .ui-range-slider__track{height:4px}.ui-range-slider--sm .ui-range-slider__thumb{width:14px;height:14px}.ui-range-slider--md .ui-range-slider__track{height:6px}.ui-range-slider--md .ui-range-slider__thumb{width:18px;height:18px}.ui-range-slider--lg .ui-range-slider__track{height:8px}.ui-range-slider--lg .ui-range-slider__thumb{width:24px;height:24px}.ui-range-slider__track{margin-top:var(--ui-spacing-lg)}.ui-range-slider--disabled{opacity:.5}.ui-range-slider--disabled .ui-range-slider__track,.ui-range-slider--disabled .ui-range-slider__thumb{cursor:not-allowed}.ui-range-slider--disabled .ui-range-slider__thumb:hover,.ui-range-slider--disabled .ui-range-slider__thumb:active{transform:translate(-50%,-50%);box-shadow:var(--ui-shadow-sm)}@keyframes ui-range-slider-bubble-in{0%{opacity:0;transform:translate(-50%) translateY(4px)}to{opacity:1;transform:translate(-50%) translateY(0)}}\n"] }]
4249
+ }], ctorParameters: () => [], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: true }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: true }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], bubbles: [{ type: i0.Input, args: [{ isSignal: true, alias: "bubbles", required: false }] }], showRange: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRange", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], valueCommit: [{ type: i0.Output, args: ["valueCommit"] }], trackEl: [{ type: i0.ViewChild, args: ['track', { isSignal: true }] }] } });
4250
+ function pad(n) {
4251
+ return n < 10 ? `0${n}` : String(n);
4252
+ }
4253
+
3949
4254
  /** Directive to mark a custom chip template */
3950
4255
  class ChipTemplateDirective {
3951
4256
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ChipTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -3969,6 +4274,11 @@ class ChipInputComponent {
3969
4274
  allowDuplicates = input(false, ...(ngDevMode ? [{ debugName: "allowDuplicates" }] : []));
3970
4275
  /** When false, only emits the `added` event without adding to the array (useful for custom object chips) */
3971
4276
  autoAdd = input(true, ...(ngDevMode ? [{ debugName: "autoAdd" }] : []));
4277
+ suggestions = input([], ...(ngDevMode ? [{ debugName: "suggestions" }] : []));
4278
+ asyncSearch = input(null, ...(ngDevMode ? [{ debugName: "asyncSearch" }] : []));
4279
+ strict = input(false, ...(ngDevMode ? [{ debugName: "strict" }] : []));
4280
+ minSearchLength = input(0, ...(ngDevMode ? [{ debugName: "minSearchLength" }] : []));
4281
+ debounceTime = input(300, ...(ngDevMode ? [{ debugName: "debounceTime" }] : []));
3972
4282
  /** The array of chip values */
3973
4283
  value = model([], ...(ngDevMode ? [{ debugName: "value" }] : []));
3974
4284
  /** Emitted when a chip is added */
@@ -3977,9 +4287,24 @@ class ChipInputComponent {
3977
4287
  removed = output();
3978
4288
  /** Custom chip template */
3979
4289
  chipTemplate = contentChild(ChipTemplateDirective, { ...(ngDevMode ? { debugName: "chipTemplate" } : {}), read: TemplateRef });
4290
+ optionTemplate = contentChild(OptionTemplateDirective, ...(ngDevMode ? [{ debugName: "optionTemplate" }] : []));
3980
4291
  inputRef;
4292
+ triggerRef;
4293
+ dropdownRef;
3981
4294
  inputValue = signal('', ...(ngDevMode ? [{ debugName: "inputValue" }] : []));
3982
4295
  isFocused = signal(false, ...(ngDevMode ? [{ debugName: "isFocused" }] : []));
4296
+ isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
4297
+ focusedIndex = signal(-1, ...(ngDevMode ? [{ debugName: "focusedIndex" }] : []));
4298
+ asyncOptions = signal([], ...(ngDevMode ? [{ debugName: "asyncOptions" }] : []));
4299
+ asyncLoading = signal(false, ...(ngDevMode ? [{ debugName: "asyncLoading" }] : []));
4300
+ asyncError = signal(null, ...(ngDevMode ? [{ debugName: "asyncError" }] : []));
4301
+ labelCache = new Map();
4302
+ elementRef = inject(ElementRef);
4303
+ document = inject(DOCUMENT);
4304
+ asyncSearchAbortController = null;
4305
+ debounceTimer = null;
4306
+ blurCloseTimer = null;
4307
+ positionCleanup = null;
3983
4308
  containerClasses = computed(() => {
3984
4309
  const classes = [
3985
4310
  `ui-chip-input--${this.variant()}`,
@@ -3993,27 +4318,115 @@ class ChipInputComponent {
3993
4318
  classes.push('ui-chip-input--error');
3994
4319
  return classes.join(' ');
3995
4320
  }, ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
4321
+ isAsyncMode = computed(() => this.asyncSearch() !== null, ...(ngDevMode ? [{ debugName: "isAsyncMode" }] : []));
4322
+ normalizedSuggestions = computed(() => {
4323
+ return this.suggestions().map((s) => typeof s === 'string' ? { label: s, value: s } : s);
4324
+ }, ...(ngDevMode ? [{ debugName: "normalizedSuggestions" }] : []));
4325
+ visibleSuggestions = computed(() => {
4326
+ const source = this.isAsyncMode() ? this.asyncOptions() : this.normalizedSuggestions();
4327
+ const selected = this.value();
4328
+ const query = this.inputValue().toLowerCase().trim();
4329
+ const notPicked = source.filter((opt) => !selected.includes(opt.value));
4330
+ if (this.isAsyncMode())
4331
+ return notPicked;
4332
+ if (!query)
4333
+ return notPicked;
4334
+ return notPicked.filter((opt) => opt.label.toLowerCase().includes(query));
4335
+ }, ...(ngDevMode ? [{ debugName: "visibleSuggestions" }] : []));
4336
+ exactMatchExists = computed(() => {
4337
+ const query = this.inputValue().toLowerCase().trim();
4338
+ if (!query)
4339
+ return true;
4340
+ const source = this.isAsyncMode() ? this.asyncOptions() : this.normalizedSuggestions();
4341
+ return source.some((opt) => opt.label.toLowerCase() === query);
4342
+ }, ...(ngDevMode ? [{ debugName: "exactMatchExists" }] : []));
4343
+ showCreateRow = computed(() => {
4344
+ return (!this.strict() &&
4345
+ this.inputValue().trim().length > 0 &&
4346
+ !this.exactMatchExists());
4347
+ }, ...(ngDevMode ? [{ debugName: "showCreateRow" }] : []));
4348
+ ngOnDestroy() {
4349
+ const dropdown = this.dropdownRef?.nativeElement;
4350
+ if (dropdown?.parentElement === this.document.body) {
4351
+ this.document.body.removeChild(dropdown);
4352
+ }
4353
+ this.removePositionListeners();
4354
+ this.cancelAsyncSearch();
4355
+ if (this.blurCloseTimer) {
4356
+ clearTimeout(this.blurCloseTimer);
4357
+ this.blurCloseTimer = null;
4358
+ }
4359
+ }
3996
4360
  onContainerClick() {
3997
4361
  if (!this.disabled()) {
3998
4362
  this.inputRef?.nativeElement?.focus();
3999
4363
  }
4000
4364
  }
4001
4365
  onInputKeydown(event) {
4002
- const value = this.inputValue().trim();
4366
+ const trimmed = this.inputValue().trim();
4003
4367
  switch (event.key) {
4004
- case 'Enter':
4368
+ case 'Enter': {
4005
4369
  event.preventDefault();
4006
- if (value) {
4007
- this.addChip(value);
4370
+ const focused = this.focusedIndex();
4371
+ const visible = this.visibleSuggestions();
4372
+ if (focused >= 0 && focused < visible.length) {
4373
+ this.addSuggestion(visible[focused]);
4374
+ }
4375
+ else if (!this.strict() && trimmed) {
4376
+ this.addChip(trimmed);
4377
+ setTimeout(() => this.updateDropdownPosition());
4378
+ }
4379
+ break;
4380
+ }
4381
+ case 'ArrowDown': {
4382
+ if (!this.isOpen()) {
4383
+ this.open();
4384
+ return;
4008
4385
  }
4386
+ event.preventDefault();
4387
+ const visible = this.visibleSuggestions();
4388
+ let next = this.focusedIndex() + 1;
4389
+ while (next < visible.length && visible[next].disabled)
4390
+ next++;
4391
+ if (next < visible.length)
4392
+ this.focusedIndex.set(next);
4393
+ break;
4394
+ }
4395
+ case 'ArrowUp': {
4396
+ if (!this.isOpen())
4397
+ return;
4398
+ event.preventDefault();
4399
+ const visible = this.visibleSuggestions();
4400
+ let prev = this.focusedIndex() - 1;
4401
+ while (prev >= 0 && visible[prev].disabled)
4402
+ prev--;
4403
+ if (prev >= 0)
4404
+ this.focusedIndex.set(prev);
4405
+ break;
4406
+ }
4407
+ case 'Escape':
4408
+ event.preventDefault();
4409
+ this.close();
4009
4410
  break;
4010
4411
  case 'Backspace':
4011
- if (!value && this.value().length > 0) {
4412
+ if (!trimmed && this.value().length > 0) {
4012
4413
  this.removeChip(this.value()[this.value().length - 1]);
4013
4414
  }
4014
4415
  break;
4015
4416
  }
4016
4417
  }
4418
+ onInputChange(value) {
4419
+ this.inputValue.set(value);
4420
+ this.focusedIndex.set(-1);
4421
+ if (!this.isOpen())
4422
+ this.open();
4423
+ if (this.isAsyncMode()) {
4424
+ this.triggerAsyncSearch(value);
4425
+ }
4426
+ else {
4427
+ setTimeout(() => this.updateDropdownPosition());
4428
+ }
4429
+ }
4017
4430
  addChip(chipValue) {
4018
4431
  const current = this.value();
4019
4432
  // For string chips, check duplicates
@@ -4026,8 +4439,29 @@ class ChipInputComponent {
4026
4439
  this.inputValue.set('');
4027
4440
  this.added.emit(chipValue);
4028
4441
  }
4442
+ addSuggestion(option) {
4443
+ if (option.disabled)
4444
+ return;
4445
+ const current = this.value();
4446
+ if (!this.allowDuplicates() && current.includes(option.value))
4447
+ return;
4448
+ if (option.label !== String(option.value)) {
4449
+ this.labelCache.set(option.value, option.label);
4450
+ }
4451
+ if (this.autoAdd()) {
4452
+ this.value.set([...current, option.value]);
4453
+ }
4454
+ this.inputValue.set('');
4455
+ this.added.emit(option.label);
4456
+ this.focusedIndex.set(-1);
4457
+ setTimeout(() => {
4458
+ this.updateDropdownPosition();
4459
+ this.inputRef?.nativeElement?.focus();
4460
+ });
4461
+ }
4029
4462
  removeChip(chipValue) {
4030
4463
  this.value.set(this.value().filter((v) => v !== chipValue));
4464
+ this.labelCache.delete(chipValue);
4031
4465
  this.removed.emit(chipValue);
4032
4466
  // Refocus input after removal
4033
4467
  setTimeout(() => this.inputRef?.nativeElement?.focus());
@@ -4041,23 +4475,202 @@ class ChipInputComponent {
4041
4475
  }
4042
4476
  /** Get display text for a chip (for default template) */
4043
4477
  getChipDisplay(chip) {
4044
- return String(chip);
4478
+ return this.labelCache.get(chip) ?? String(chip);
4045
4479
  }
4046
4480
  onFocus() {
4047
4481
  this.isFocused.set(true);
4482
+ if (this.blurCloseTimer) {
4483
+ clearTimeout(this.blurCloseTimer);
4484
+ this.blurCloseTimer = null;
4485
+ }
4486
+ this.open();
4048
4487
  }
4049
4488
  onBlur() {
4050
4489
  this.isFocused.set(false);
4490
+ this.blurCloseTimer = setTimeout(() => {
4491
+ this.close();
4492
+ this.blurCloseTimer = null;
4493
+ }, 150);
4494
+ }
4495
+ onDropdownMousedown(event) {
4496
+ event.preventDefault();
4497
+ if (this.blurCloseTimer) {
4498
+ clearTimeout(this.blurCloseTimer);
4499
+ this.blurCloseTimer = null;
4500
+ }
4501
+ }
4502
+ open() {
4503
+ if (this.disabled() || this.isOpen())
4504
+ return;
4505
+ this.isOpen.set(true);
4506
+ this.focusedIndex.set(-1);
4507
+ this.portalDropdown();
4508
+ if (this.isAsyncMode()) {
4509
+ this.triggerAsyncSearch(this.inputValue());
4510
+ }
4511
+ }
4512
+ close() {
4513
+ if (!this.isOpen())
4514
+ return;
4515
+ this.unportalDropdown();
4516
+ this.isOpen.set(false);
4517
+ this.focusedIndex.set(-1);
4518
+ this.cancelAsyncSearch();
4519
+ this.asyncLoading.set(false);
4520
+ this.asyncError.set(null);
4521
+ }
4522
+ onDocumentClick(event) {
4523
+ const target = event.target;
4524
+ if (!this.elementRef.nativeElement.contains(target) &&
4525
+ !this.dropdownRef?.nativeElement?.contains(target)) {
4526
+ this.close();
4527
+ }
4528
+ }
4529
+ portalDropdown() {
4530
+ const dropdown = this.dropdownRef?.nativeElement;
4531
+ if (!dropdown)
4532
+ return;
4533
+ dropdown.style.display = 'block';
4534
+ this.document.body.appendChild(dropdown);
4535
+ this.updateDropdownPosition();
4536
+ this.addPositionListeners();
4537
+ }
4538
+ unportalDropdown() {
4539
+ const dropdown = this.dropdownRef?.nativeElement;
4540
+ if (!dropdown)
4541
+ return;
4542
+ if (dropdown.parentElement === this.document.body) {
4543
+ const wrapper = this.elementRef.nativeElement.querySelector('.ui-chip-input-wrapper');
4544
+ if (wrapper)
4545
+ wrapper.appendChild(dropdown);
4546
+ }
4547
+ dropdown.style.display = '';
4548
+ dropdown.style.position = '';
4549
+ dropdown.style.top = '';
4550
+ dropdown.style.left = '';
4551
+ dropdown.style.bottom = '';
4552
+ dropdown.style.width = '';
4553
+ dropdown.style.zIndex = '';
4554
+ dropdown.style.margin = '';
4555
+ this.removePositionListeners();
4556
+ }
4557
+ updateDropdownPosition() {
4558
+ const trigger = this.triggerRef?.nativeElement;
4559
+ const dropdown = this.dropdownRef?.nativeElement;
4560
+ if (!trigger || !dropdown)
4561
+ return;
4562
+ const triggerRect = trigger.getBoundingClientRect();
4563
+ const dropdownHeight = dropdown.scrollHeight;
4564
+ const gap = 4;
4565
+ const spaceBelow = window.innerHeight - triggerRect.bottom;
4566
+ const spaceAbove = triggerRect.top;
4567
+ const openAbove = spaceBelow < dropdownHeight + gap && spaceAbove > spaceBelow;
4568
+ dropdown.style.position = 'fixed';
4569
+ dropdown.style.width = `${triggerRect.width}px`;
4570
+ dropdown.style.left = `${triggerRect.left}px`;
4571
+ dropdown.style.zIndex = '99999';
4572
+ dropdown.style.margin = '0';
4573
+ if (openAbove) {
4574
+ dropdown.style.top = 'auto';
4575
+ dropdown.style.bottom = `${window.innerHeight - triggerRect.top + gap}px`;
4576
+ }
4577
+ else {
4578
+ dropdown.style.top = `${triggerRect.bottom + gap}px`;
4579
+ dropdown.style.bottom = 'auto';
4580
+ }
4581
+ }
4582
+ addPositionListeners() {
4583
+ const update = () => {
4584
+ if (this.isOpen())
4585
+ this.updateDropdownPosition();
4586
+ };
4587
+ window.addEventListener('scroll', update, true);
4588
+ window.addEventListener('resize', update);
4589
+ this.positionCleanup = () => {
4590
+ window.removeEventListener('scroll', update, true);
4591
+ window.removeEventListener('resize', update);
4592
+ };
4593
+ }
4594
+ removePositionListeners() {
4595
+ this.positionCleanup?.();
4596
+ this.positionCleanup = null;
4597
+ }
4598
+ triggerAsyncSearch(query) {
4599
+ if (this.debounceTimer) {
4600
+ clearTimeout(this.debounceTimer);
4601
+ this.debounceTimer = null;
4602
+ }
4603
+ if (this.asyncSearchAbortController) {
4604
+ this.asyncSearchAbortController.abort();
4605
+ this.asyncSearchAbortController = null;
4606
+ }
4607
+ const trimmed = query.trim();
4608
+ if (trimmed.length < this.minSearchLength()) {
4609
+ this.asyncOptions.set([]);
4610
+ this.asyncLoading.set(false);
4611
+ this.asyncError.set(null);
4612
+ this.focusedIndex.set(-1);
4613
+ return;
4614
+ }
4615
+ this.asyncLoading.set(true);
4616
+ this.asyncError.set(null);
4617
+ this.debounceTimer = setTimeout(() => {
4618
+ this.executeAsyncSearch(trimmed);
4619
+ }, this.debounceTime());
4620
+ }
4621
+ async executeAsyncSearch(query) {
4622
+ const searchFn = this.asyncSearch();
4623
+ if (!searchFn)
4624
+ return;
4625
+ this.asyncSearchAbortController = new AbortController();
4626
+ const signal = this.asyncSearchAbortController.signal;
4627
+ try {
4628
+ const results = await searchFn(query);
4629
+ if (signal.aborted)
4630
+ return;
4631
+ this.asyncOptions.set(results);
4632
+ this.asyncLoading.set(false);
4633
+ this.asyncError.set(null);
4634
+ this.focusedIndex.set(-1);
4635
+ setTimeout(() => this.updateDropdownPosition());
4636
+ }
4637
+ catch (error) {
4638
+ if (signal.aborted)
4639
+ return;
4640
+ this.asyncOptions.set([]);
4641
+ this.asyncLoading.set(false);
4642
+ this.asyncError.set(error instanceof Error ? error.message : 'Search failed');
4643
+ this.focusedIndex.set(-1);
4644
+ }
4645
+ }
4646
+ cancelAsyncSearch() {
4647
+ if (this.debounceTimer) {
4648
+ clearTimeout(this.debounceTimer);
4649
+ this.debounceTimer = null;
4650
+ }
4651
+ if (this.asyncSearchAbortController) {
4652
+ this.asyncSearchAbortController.abort();
4653
+ this.asyncSearchAbortController = null;
4654
+ }
4051
4655
  }
4052
4656
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ChipInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4053
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: ChipInputComponent, isStandalone: true, selector: "ui-chip-input", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, allowDuplicates: { classPropertyName: "allowDuplicates", publicName: "allowDuplicates", isSignal: true, isRequired: false, transformFunction: null }, autoAdd: { classPropertyName: "autoAdd", publicName: "autoAdd", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", added: "added", removed: "removed" }, queries: [{ propertyName: "chipTemplate", first: true, predicate: ChipTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }], ngImport: i0, template: "<div class=\"ui-chip-input-wrapper\">\n @if (label()) {\n <label class=\"ui-chip-input__label\">{{ label() }}</label>\n }\n\n <div\n class=\"ui-chip-input\"\n [class]=\"containerClasses()\"\n (click)=\"onContainerClick()\"\n >\n @for (chip of value(); track chip) {\n @if (chipTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"chipTemplate()!\"\n [ngTemplateOutletContext]=\"getChipContext(chip)\"\n />\n } @else {\n <span class=\"ui-chip-input__chip\">\n <span class=\"ui-chip-input__chip-text\">{{ getChipDisplay(chip) }}</span>\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-chip-input__chip-remove\"\n (click)=\"removeChip(chip); $event.stopPropagation()\"\n aria-label=\"Remove\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n }\n </span>\n }\n }\n <input\n #inputRef\n type=\"text\"\n class=\"ui-chip-input__input\"\n [placeholder]=\"value().length === 0 ? placeholder() : ''\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"inputValue\"\n (keydown)=\"onInputKeydown($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n </div>\n\n @if (error()) {\n <span class=\"ui-chip-input__error\">{{ error() }}</span>\n }\n @if (hint() && !error()) {\n <span class=\"ui-chip-input__hint\">{{ hint() }}</span>\n }\n</div>\n", styles: [".ui-chip-input-wrapper{display:flex;flex-direction:column;gap:var(--ui-spacing-xs)}.ui-chip-input__label{font-size:.875rem;font-weight:500;color:var(--ui-text)}.ui-chip-input{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-spacing-xs);padding:var(--ui-spacing-xs) var(--ui-spacing-sm);min-height:42px;background:var(--ui-bg);border:1px solid var(--ui-border);border-radius:var(--ui-radius-md);cursor:text;transition:border-color var(--ui-transition-fast),box-shadow var(--ui-transition-fast)}.ui-chip-input--focused{border-color:var(--ui-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 15%,transparent)}.ui-chip-input--error{border-color:var(--ui-danger)}.ui-chip-input--error.ui-chip-input--focused{box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-danger) 15%,transparent)}.ui-chip-input--disabled{background:var(--ui-bg-secondary);cursor:not-allowed;opacity:.6}.ui-chip-input--outlined{background:transparent}.ui-chip-input--filled{background:var(--ui-bg-secondary);border-color:transparent}.ui-chip-input--filled.ui-chip-input--focused{border-color:var(--ui-primary)}.ui-chip-input--sm{min-height:34px;padding:var(--ui-spacing-xs);font-size:.8125rem}.ui-chip-input--lg{min-height:50px;padding:var(--ui-spacing-sm);font-size:1rem}.ui-chip-input__chip{display:inline-flex;align-items:center;gap:var(--ui-spacing-xs);padding:.125rem .5rem;background:var(--ui-bg-secondary);border-radius:var(--ui-radius-sm);font-size:.875rem;color:var(--ui-text);white-space:nowrap}.ui-chip-input--sm .ui-chip-input__chip{padding:.0625rem .375rem;font-size:.75rem}.ui-chip-input--lg .ui-chip-input__chip{padding:.25rem .625rem;font-size:.9375rem}.ui-chip-input__chip-text{line-height:1.4}.ui-chip-input__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;margin-left:.125rem;border:none;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-muted);cursor:pointer;transition:background-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-chip-input__chip-remove:hover{background:var(--ui-danger);color:#fff}.ui-chip-input__input{flex:1;min-width:80px;padding:.25rem 0;border:none;background:transparent;font:inherit;color:var(--ui-text);outline:none}.ui-chip-input__input::placeholder{color:var(--ui-text-muted)}.ui-chip-input__input:disabled{cursor:not-allowed}.ui-chip-input__hint{font-size:.75rem;color:var(--ui-text-muted)}.ui-chip-input__error{font-size:.75rem;color:var(--ui-danger)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4657
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: ChipInputComponent, isStandalone: true, selector: "ui-chip-input", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, allowDuplicates: { classPropertyName: "allowDuplicates", publicName: "allowDuplicates", isSignal: true, isRequired: false, transformFunction: null }, autoAdd: { classPropertyName: "autoAdd", publicName: "autoAdd", isSignal: true, isRequired: false, transformFunction: null }, suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, asyncSearch: { classPropertyName: "asyncSearch", publicName: "asyncSearch", isSignal: true, isRequired: false, transformFunction: null }, strict: { classPropertyName: "strict", publicName: "strict", isSignal: true, isRequired: false, transformFunction: null }, minSearchLength: { classPropertyName: "minSearchLength", publicName: "minSearchLength", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", added: "added", removed: "removed" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, queries: [{ propertyName: "chipTemplate", first: true, predicate: ChipTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "optionTemplate", first: true, predicate: OptionTemplateDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerRef"], descendants: true, static: true }, { propertyName: "dropdownRef", first: true, predicate: ["dropdownRef"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"ui-chip-input-wrapper\">\n @if (label()) {\n <label class=\"ui-chip-input__label\">{{ label() }}</label>\n }\n\n <div\n #triggerRef\n class=\"ui-chip-input\"\n [class]=\"containerClasses()\"\n (click)=\"onContainerClick()\"\n >\n @for (chip of value(); track chip) {\n @if (chipTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"chipTemplate()!\"\n [ngTemplateOutletContext]=\"getChipContext(chip)\"\n />\n } @else {\n <span class=\"ui-chip-input__chip\">\n <span class=\"ui-chip-input__chip-text\">{{ getChipDisplay(chip) }}</span>\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-chip-input__chip-remove\"\n (click)=\"removeChip(chip); $event.stopPropagation()\"\n aria-label=\"Remove\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n }\n </span>\n }\n }\n <input\n #inputRef\n type=\"text\"\n class=\"ui-chip-input__input\"\n [placeholder]=\"value().length === 0 ? placeholder() : ''\"\n [disabled]=\"disabled()\"\n [value]=\"inputValue()\"\n (input)=\"onInputChange($any($event.target).value)\"\n (keydown)=\"onInputKeydown($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n autocomplete=\"off\"\n />\n </div>\n\n <div\n #dropdownRef\n class=\"ui-chip-input__dropdown\"\n [class.ui-chip-input__dropdown--open]=\"isOpen()\"\n [attr.role]=\"'listbox'\"\n (mousedown)=\"onDropdownMousedown($event)\"\n >\n <div class=\"ui-chip-input__options\">\n @if (isAsyncMode() && asyncLoading()) {\n <div class=\"ui-chip-input__loading\">\n <svg class=\"ui-chip-input__spinner\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke-opacity=\"0.25\"></circle>\n <path d=\"M12 2a10 10 0 0 1 10 10\" stroke-linecap=\"round\"></path>\n </svg>\n <span>Searching...</span>\n </div>\n } @else if (isAsyncMode() && asyncError()) {\n <div class=\"ui-chip-input__error-message\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n </svg>\n <span>{{ asyncError() }}</span>\n </div>\n } @else {\n @for (option of visibleSuggestions(); track option.value; let i = $index) {\n <div\n class=\"ui-chip-input__suggestion\"\n [class.ui-chip-input__suggestion--focused]=\"focusedIndex() === i\"\n [class.ui-chip-input__suggestion--disabled]=\"option.disabled\"\n [attr.role]=\"'option'\"\n [attr.aria-disabled]=\"option.disabled\"\n (click)=\"addSuggestion(option)\"\n >\n @if (optionTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option.value, option: option.value, selected: false, disabled: !!option.disabled }\"\n />\n } @else {\n <span class=\"ui-chip-input__suggestion-label\">{{ option.label }}</span>\n }\n </div>\n }\n @if (visibleSuggestions().length === 0 && !showCreateRow()) {\n @if (isAsyncMode() && inputValue().trim().length < minSearchLength() && minSearchLength() > 0) {\n <div class=\"ui-chip-input__empty\">Type at least {{ minSearchLength() }} characters to search</div>\n } @else {\n <div class=\"ui-chip-input__empty\">No suggestions</div>\n }\n }\n }\n </div>\n @if (showCreateRow()) {\n <div\n class=\"ui-chip-input__create\"\n (click)=\"addChip(inputValue().trim())\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Create \"{{ inputValue().trim() }}\"\n </div>\n }\n </div>\n\n @if (error()) {\n <span class=\"ui-chip-input__error\">{{ error() }}</span>\n }\n @if (hint() && !error()) {\n <span class=\"ui-chip-input__hint\">{{ hint() }}</span>\n }\n</div>\n", styles: [".ui-chip-input-wrapper{display:flex;flex-direction:column;gap:var(--ui-spacing-xs)}.ui-chip-input__label{font-size:.875rem;font-weight:500;color:var(--ui-text)}.ui-chip-input{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-spacing-xs);padding:var(--ui-spacing-xs) var(--ui-spacing-sm);min-height:42px;background:var(--ui-bg);border:1px solid var(--ui-border);border-radius:var(--ui-radius-md);cursor:text;transition:border-color var(--ui-transition-fast),box-shadow var(--ui-transition-fast)}.ui-chip-input--focused{border-color:var(--ui-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 15%,transparent)}.ui-chip-input--error{border-color:var(--ui-danger)}.ui-chip-input--error.ui-chip-input--focused{box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-danger) 15%,transparent)}.ui-chip-input--disabled{background:var(--ui-bg-secondary);cursor:not-allowed;opacity:.6}.ui-chip-input--outlined{background:transparent}.ui-chip-input--filled{background:var(--ui-bg-secondary);border-color:transparent}.ui-chip-input--filled.ui-chip-input--focused{border-color:var(--ui-primary)}.ui-chip-input--sm{min-height:34px;padding:var(--ui-spacing-xs);font-size:.8125rem}.ui-chip-input--lg{min-height:50px;padding:var(--ui-spacing-sm);font-size:1rem}.ui-chip-input__chip{display:inline-flex;align-items:center;gap:var(--ui-spacing-xs);padding:.125rem .5rem;background:var(--ui-bg-secondary);border-radius:var(--ui-radius-sm);font-size:.875rem;color:var(--ui-text);white-space:nowrap}.ui-chip-input--sm .ui-chip-input__chip{padding:.0625rem .375rem;font-size:.75rem}.ui-chip-input--lg .ui-chip-input__chip{padding:.25rem .625rem;font-size:.9375rem}.ui-chip-input__chip-text{line-height:1.4}.ui-chip-input__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;margin-left:.125rem;border:none;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-muted);cursor:pointer;transition:background-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-chip-input__chip-remove:hover{background:var(--ui-danger);color:#fff}.ui-chip-input__input{flex:1;min-width:80px;padding:.25rem 0;border:none;background:transparent;font:inherit;color:var(--ui-text);outline:none}.ui-chip-input__input::placeholder{color:var(--ui-text-muted)}.ui-chip-input__input:disabled{cursor:not-allowed}.ui-chip-input__hint{font-size:.75rem;color:var(--ui-text-muted)}.ui-chip-input__error{font-size:.75rem;color:var(--ui-danger)}.ui-chip-input__dropdown{position:absolute;top:100%;left:0;right:0;z-index:1000;margin-top:var(--ui-spacing-xs);background-color:var(--ui-dropdown-bg, var(--ui-bg));border:1px solid var(--ui-dropdown-border, var(--ui-border));border-radius:var(--ui-dropdown-radius, var(--ui-radius-md));box-shadow:var(--ui-dropdown-shadow, var(--ui-shadow-lg));overflow:hidden;display:none;opacity:0;transform:translateY(-8px);transition:opacity var(--ui-transition-fast),transform var(--ui-transition-fast);box-sizing:border-box}.ui-chip-input__dropdown--open{display:block;opacity:1;transform:translateY(0)}.ui-chip-input__options{max-height:var(--ui-dropdown-max-height, 300px);overflow-y:auto}.ui-chip-input__suggestion{display:flex;align-items:center;gap:var(--ui-spacing-sm);padding:var(--ui-spacing-sm) var(--ui-spacing-md);cursor:pointer;transition:background-color var(--ui-transition-fast)}.ui-chip-input__suggestion:hover:not(.ui-chip-input__suggestion--disabled){background-color:var(--ui-bg-hover)}.ui-chip-input__suggestion--focused{background-color:var(--ui-bg-hover);outline:none}.ui-chip-input__suggestion--disabled{opacity:.5;cursor:not-allowed}.ui-chip-input__suggestion-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-chip-input__create{display:flex;align-items:center;gap:var(--ui-spacing-sm);padding:var(--ui-spacing-sm) var(--ui-spacing-md);font-size:.875rem;color:var(--ui-primary);cursor:pointer;border-top:1px solid var(--ui-border);transition:background-color var(--ui-transition-fast)}.ui-chip-input__create:hover{background-color:var(--ui-bg-hover)}.ui-chip-input__empty{padding:var(--ui-spacing-md);text-align:center;color:var(--ui-text-muted);font-size:.875rem}.ui-chip-input__loading{display:flex;align-items:center;justify-content:center;gap:var(--ui-spacing-sm);padding:var(--ui-spacing-lg) var(--ui-spacing-md);color:var(--ui-text-muted);font-size:.875rem}.ui-chip-input__spinner{animation:ui-chip-input-spin 1s linear infinite}@keyframes ui-chip-input-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ui-chip-input__error-message{display:flex;align-items:center;justify-content:center;gap:var(--ui-spacing-sm);padding:var(--ui-spacing-md);color:var(--ui-danger);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4054
4658
  }
4055
4659
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ChipInputComponent, decorators: [{
4056
4660
  type: Component,
4057
- args: [{ selector: 'ui-chip-input', standalone: true, imports: [FormsModule, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ui-chip-input-wrapper\">\n @if (label()) {\n <label class=\"ui-chip-input__label\">{{ label() }}</label>\n }\n\n <div\n class=\"ui-chip-input\"\n [class]=\"containerClasses()\"\n (click)=\"onContainerClick()\"\n >\n @for (chip of value(); track chip) {\n @if (chipTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"chipTemplate()!\"\n [ngTemplateOutletContext]=\"getChipContext(chip)\"\n />\n } @else {\n <span class=\"ui-chip-input__chip\">\n <span class=\"ui-chip-input__chip-text\">{{ getChipDisplay(chip) }}</span>\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-chip-input__chip-remove\"\n (click)=\"removeChip(chip); $event.stopPropagation()\"\n aria-label=\"Remove\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n }\n </span>\n }\n }\n <input\n #inputRef\n type=\"text\"\n class=\"ui-chip-input__input\"\n [placeholder]=\"value().length === 0 ? placeholder() : ''\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"inputValue\"\n (keydown)=\"onInputKeydown($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n </div>\n\n @if (error()) {\n <span class=\"ui-chip-input__error\">{{ error() }}</span>\n }\n @if (hint() && !error()) {\n <span class=\"ui-chip-input__hint\">{{ hint() }}</span>\n }\n</div>\n", styles: [".ui-chip-input-wrapper{display:flex;flex-direction:column;gap:var(--ui-spacing-xs)}.ui-chip-input__label{font-size:.875rem;font-weight:500;color:var(--ui-text)}.ui-chip-input{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-spacing-xs);padding:var(--ui-spacing-xs) var(--ui-spacing-sm);min-height:42px;background:var(--ui-bg);border:1px solid var(--ui-border);border-radius:var(--ui-radius-md);cursor:text;transition:border-color var(--ui-transition-fast),box-shadow var(--ui-transition-fast)}.ui-chip-input--focused{border-color:var(--ui-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 15%,transparent)}.ui-chip-input--error{border-color:var(--ui-danger)}.ui-chip-input--error.ui-chip-input--focused{box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-danger) 15%,transparent)}.ui-chip-input--disabled{background:var(--ui-bg-secondary);cursor:not-allowed;opacity:.6}.ui-chip-input--outlined{background:transparent}.ui-chip-input--filled{background:var(--ui-bg-secondary);border-color:transparent}.ui-chip-input--filled.ui-chip-input--focused{border-color:var(--ui-primary)}.ui-chip-input--sm{min-height:34px;padding:var(--ui-spacing-xs);font-size:.8125rem}.ui-chip-input--lg{min-height:50px;padding:var(--ui-spacing-sm);font-size:1rem}.ui-chip-input__chip{display:inline-flex;align-items:center;gap:var(--ui-spacing-xs);padding:.125rem .5rem;background:var(--ui-bg-secondary);border-radius:var(--ui-radius-sm);font-size:.875rem;color:var(--ui-text);white-space:nowrap}.ui-chip-input--sm .ui-chip-input__chip{padding:.0625rem .375rem;font-size:.75rem}.ui-chip-input--lg .ui-chip-input__chip{padding:.25rem .625rem;font-size:.9375rem}.ui-chip-input__chip-text{line-height:1.4}.ui-chip-input__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;margin-left:.125rem;border:none;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-muted);cursor:pointer;transition:background-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-chip-input__chip-remove:hover{background:var(--ui-danger);color:#fff}.ui-chip-input__input{flex:1;min-width:80px;padding:.25rem 0;border:none;background:transparent;font:inherit;color:var(--ui-text);outline:none}.ui-chip-input__input::placeholder{color:var(--ui-text-muted)}.ui-chip-input__input:disabled{cursor:not-allowed}.ui-chip-input__hint{font-size:.75rem;color:var(--ui-text-muted)}.ui-chip-input__error{font-size:.75rem;color:var(--ui-danger)}\n"] }]
4058
- }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], allowDuplicates: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowDuplicates", required: false }] }], autoAdd: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoAdd", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], added: [{ type: i0.Output, args: ["added"] }], removed: [{ type: i0.Output, args: ["removed"] }], chipTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ChipTemplateDirective), { ...{ read: TemplateRef }, isSignal: true }] }], inputRef: [{
4661
+ args: [{ selector: 'ui-chip-input', standalone: true, imports: [FormsModule, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ui-chip-input-wrapper\">\n @if (label()) {\n <label class=\"ui-chip-input__label\">{{ label() }}</label>\n }\n\n <div\n #triggerRef\n class=\"ui-chip-input\"\n [class]=\"containerClasses()\"\n (click)=\"onContainerClick()\"\n >\n @for (chip of value(); track chip) {\n @if (chipTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"chipTemplate()!\"\n [ngTemplateOutletContext]=\"getChipContext(chip)\"\n />\n } @else {\n <span class=\"ui-chip-input__chip\">\n <span class=\"ui-chip-input__chip-text\">{{ getChipDisplay(chip) }}</span>\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-chip-input__chip-remove\"\n (click)=\"removeChip(chip); $event.stopPropagation()\"\n aria-label=\"Remove\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n }\n </span>\n }\n }\n <input\n #inputRef\n type=\"text\"\n class=\"ui-chip-input__input\"\n [placeholder]=\"value().length === 0 ? placeholder() : ''\"\n [disabled]=\"disabled()\"\n [value]=\"inputValue()\"\n (input)=\"onInputChange($any($event.target).value)\"\n (keydown)=\"onInputKeydown($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n autocomplete=\"off\"\n />\n </div>\n\n <div\n #dropdownRef\n class=\"ui-chip-input__dropdown\"\n [class.ui-chip-input__dropdown--open]=\"isOpen()\"\n [attr.role]=\"'listbox'\"\n (mousedown)=\"onDropdownMousedown($event)\"\n >\n <div class=\"ui-chip-input__options\">\n @if (isAsyncMode() && asyncLoading()) {\n <div class=\"ui-chip-input__loading\">\n <svg class=\"ui-chip-input__spinner\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke-opacity=\"0.25\"></circle>\n <path d=\"M12 2a10 10 0 0 1 10 10\" stroke-linecap=\"round\"></path>\n </svg>\n <span>Searching...</span>\n </div>\n } @else if (isAsyncMode() && asyncError()) {\n <div class=\"ui-chip-input__error-message\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n </svg>\n <span>{{ asyncError() }}</span>\n </div>\n } @else {\n @for (option of visibleSuggestions(); track option.value; let i = $index) {\n <div\n class=\"ui-chip-input__suggestion\"\n [class.ui-chip-input__suggestion--focused]=\"focusedIndex() === i\"\n [class.ui-chip-input__suggestion--disabled]=\"option.disabled\"\n [attr.role]=\"'option'\"\n [attr.aria-disabled]=\"option.disabled\"\n (click)=\"addSuggestion(option)\"\n >\n @if (optionTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option.value, option: option.value, selected: false, disabled: !!option.disabled }\"\n />\n } @else {\n <span class=\"ui-chip-input__suggestion-label\">{{ option.label }}</span>\n }\n </div>\n }\n @if (visibleSuggestions().length === 0 && !showCreateRow()) {\n @if (isAsyncMode() && inputValue().trim().length < minSearchLength() && minSearchLength() > 0) {\n <div class=\"ui-chip-input__empty\">Type at least {{ minSearchLength() }} characters to search</div>\n } @else {\n <div class=\"ui-chip-input__empty\">No suggestions</div>\n }\n }\n }\n </div>\n @if (showCreateRow()) {\n <div\n class=\"ui-chip-input__create\"\n (click)=\"addChip(inputValue().trim())\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Create \"{{ inputValue().trim() }}\"\n </div>\n }\n </div>\n\n @if (error()) {\n <span class=\"ui-chip-input__error\">{{ error() }}</span>\n }\n @if (hint() && !error()) {\n <span class=\"ui-chip-input__hint\">{{ hint() }}</span>\n }\n</div>\n", styles: [".ui-chip-input-wrapper{display:flex;flex-direction:column;gap:var(--ui-spacing-xs)}.ui-chip-input__label{font-size:.875rem;font-weight:500;color:var(--ui-text)}.ui-chip-input{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-spacing-xs);padding:var(--ui-spacing-xs) var(--ui-spacing-sm);min-height:42px;background:var(--ui-bg);border:1px solid var(--ui-border);border-radius:var(--ui-radius-md);cursor:text;transition:border-color var(--ui-transition-fast),box-shadow var(--ui-transition-fast)}.ui-chip-input--focused{border-color:var(--ui-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-primary) 15%,transparent)}.ui-chip-input--error{border-color:var(--ui-danger)}.ui-chip-input--error.ui-chip-input--focused{box-shadow:0 0 0 3px color-mix(in srgb,var(--ui-danger) 15%,transparent)}.ui-chip-input--disabled{background:var(--ui-bg-secondary);cursor:not-allowed;opacity:.6}.ui-chip-input--outlined{background:transparent}.ui-chip-input--filled{background:var(--ui-bg-secondary);border-color:transparent}.ui-chip-input--filled.ui-chip-input--focused{border-color:var(--ui-primary)}.ui-chip-input--sm{min-height:34px;padding:var(--ui-spacing-xs);font-size:.8125rem}.ui-chip-input--lg{min-height:50px;padding:var(--ui-spacing-sm);font-size:1rem}.ui-chip-input__chip{display:inline-flex;align-items:center;gap:var(--ui-spacing-xs);padding:.125rem .5rem;background:var(--ui-bg-secondary);border-radius:var(--ui-radius-sm);font-size:.875rem;color:var(--ui-text);white-space:nowrap}.ui-chip-input--sm .ui-chip-input__chip{padding:.0625rem .375rem;font-size:.75rem}.ui-chip-input--lg .ui-chip-input__chip{padding:.25rem .625rem;font-size:.9375rem}.ui-chip-input__chip-text{line-height:1.4}.ui-chip-input__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;margin-left:.125rem;border:none;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-muted);cursor:pointer;transition:background-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-chip-input__chip-remove:hover{background:var(--ui-danger);color:#fff}.ui-chip-input__input{flex:1;min-width:80px;padding:.25rem 0;border:none;background:transparent;font:inherit;color:var(--ui-text);outline:none}.ui-chip-input__input::placeholder{color:var(--ui-text-muted)}.ui-chip-input__input:disabled{cursor:not-allowed}.ui-chip-input__hint{font-size:.75rem;color:var(--ui-text-muted)}.ui-chip-input__error{font-size:.75rem;color:var(--ui-danger)}.ui-chip-input__dropdown{position:absolute;top:100%;left:0;right:0;z-index:1000;margin-top:var(--ui-spacing-xs);background-color:var(--ui-dropdown-bg, var(--ui-bg));border:1px solid var(--ui-dropdown-border, var(--ui-border));border-radius:var(--ui-dropdown-radius, var(--ui-radius-md));box-shadow:var(--ui-dropdown-shadow, var(--ui-shadow-lg));overflow:hidden;display:none;opacity:0;transform:translateY(-8px);transition:opacity var(--ui-transition-fast),transform var(--ui-transition-fast);box-sizing:border-box}.ui-chip-input__dropdown--open{display:block;opacity:1;transform:translateY(0)}.ui-chip-input__options{max-height:var(--ui-dropdown-max-height, 300px);overflow-y:auto}.ui-chip-input__suggestion{display:flex;align-items:center;gap:var(--ui-spacing-sm);padding:var(--ui-spacing-sm) var(--ui-spacing-md);cursor:pointer;transition:background-color var(--ui-transition-fast)}.ui-chip-input__suggestion:hover:not(.ui-chip-input__suggestion--disabled){background-color:var(--ui-bg-hover)}.ui-chip-input__suggestion--focused{background-color:var(--ui-bg-hover);outline:none}.ui-chip-input__suggestion--disabled{opacity:.5;cursor:not-allowed}.ui-chip-input__suggestion-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-chip-input__create{display:flex;align-items:center;gap:var(--ui-spacing-sm);padding:var(--ui-spacing-sm) var(--ui-spacing-md);font-size:.875rem;color:var(--ui-primary);cursor:pointer;border-top:1px solid var(--ui-border);transition:background-color var(--ui-transition-fast)}.ui-chip-input__create:hover{background-color:var(--ui-bg-hover)}.ui-chip-input__empty{padding:var(--ui-spacing-md);text-align:center;color:var(--ui-text-muted);font-size:.875rem}.ui-chip-input__loading{display:flex;align-items:center;justify-content:center;gap:var(--ui-spacing-sm);padding:var(--ui-spacing-lg) var(--ui-spacing-md);color:var(--ui-text-muted);font-size:.875rem}.ui-chip-input__spinner{animation:ui-chip-input-spin 1s linear infinite}@keyframes ui-chip-input-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ui-chip-input__error-message{display:flex;align-items:center;justify-content:center;gap:var(--ui-spacing-sm);padding:var(--ui-spacing-md);color:var(--ui-danger);font-size:.875rem}\n"] }]
4662
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], allowDuplicates: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowDuplicates", required: false }] }], autoAdd: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoAdd", required: false }] }], suggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "suggestions", required: false }] }], asyncSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "asyncSearch", required: false }] }], strict: [{ type: i0.Input, args: [{ isSignal: true, alias: "strict", required: false }] }], minSearchLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSearchLength", required: false }] }], debounceTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceTime", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], added: [{ type: i0.Output, args: ["added"] }], removed: [{ type: i0.Output, args: ["removed"] }], chipTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ChipTemplateDirective), { ...{ read: TemplateRef }, isSignal: true }] }], optionTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => OptionTemplateDirective), { isSignal: true }] }], inputRef: [{
4059
4663
  type: ViewChild,
4060
4664
  args: ['inputRef']
4665
+ }], triggerRef: [{
4666
+ type: ViewChild,
4667
+ args: ['triggerRef', { static: true }]
4668
+ }], dropdownRef: [{
4669
+ type: ViewChild,
4670
+ args: ['dropdownRef', { static: true }]
4671
+ }], onDocumentClick: [{
4672
+ type: HostListener,
4673
+ args: ['document:click', ['$event']]
4061
4674
  }] } });
4062
4675
 
4063
4676
  class DatepickerComponent {
@@ -6677,5 +7290,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
6677
7290
  * Generated bundle index. Do not edit.
6678
7291
  */
6679
7292
 
6680
- export { AccordionComponent, AccordionHeaderDirective, AccordionItemComponent, AlertComponent, BadgeComponent, ButtonComponent, CardComponent, CellTemplateDirective, CellValuePipe, CheckboxComponent, ChipInputComponent, ChipTemplateDirective, CircularProgressComponent, ContentComponent, ContextMenuDirective, DIALOG_DATA, DIALOG_REF, DatepickerComponent, DatetimepickerComponent, DialogRef, DialogService, DropdownComponent, DropdownDividerComponent, DropdownItemComponent, DropdownTriggerDirective, DynamicTabsComponent, FileChooserComponent, FilePreviewPipe, FileSizePipe, FooterComponent, InputComponent, LOADABLE, LoadingDirective, LoadingService, ModalComponent, NavbarComponent, OptionComponent, OptionTemplateDirective, PaginationComponent, ProgressComponent, RadioComponent, RadioGroupComponent, SelectComponent, ShellComponent, SidebarComponent, SidebarService, SidebarToggleComponent, SliderComponent, SpinnerComponent, SplitComponent, SplitPaneComponent, SwitchComponent, TAB_DATA, TAB_REF, TREE_HOST, TabActivePipe, TabComponent, TabIconDirective, TabRef, TableComponent, TabsComponent, TabsService, TemplateInputComponent, TemplateInputSuffixDirective, TextareaComponent, TimepickerComponent, ToastRef, ToastService, TooltipDirective, TreeComponent, TreeNodeComponent, Validators, VariablePopoverDirective };
7293
+ export { AccordionComponent, AccordionHeaderDirective, AccordionItemComponent, AlertComponent, BadgeComponent, ButtonComponent, CardComponent, CellTemplateDirective, CellValuePipe, CheckboxComponent, ChipInputComponent, ChipTemplateDirective, CircularProgressComponent, ContentComponent, ContextMenuDirective, DIALOG_DATA, DIALOG_REF, DatepickerComponent, DatetimepickerComponent, DialogRef, DialogService, DropdownComponent, DropdownDividerComponent, DropdownItemComponent, DropdownTriggerDirective, DynamicTabsComponent, FileChooserComponent, FilePreviewPipe, FileSizePipe, FooterComponent, InputComponent, LOADABLE, LoadingDirective, LoadingService, ModalComponent, NavbarComponent, OptionComponent, OptionTemplateDirective, PaginationComponent, ProgressComponent, RadioComponent, RadioGroupComponent, RangeSliderComponent, SelectComponent, ShellComponent, SidebarComponent, SidebarService, SidebarToggleComponent, SliderComponent, SpinnerComponent, SplitComponent, SplitPaneComponent, SwitchComponent, TAB_DATA, TAB_REF, TREE_HOST, TabActivePipe, TabComponent, TabIconDirective, TabRef, TableComponent, TabsComponent, TabsService, TemplateInputComponent, TemplateInputSuffixDirective, TextareaComponent, TimepickerComponent, ToastRef, ToastService, TooltipDirective, TreeComponent, TreeNodeComponent, Validators, VariablePopoverDirective };
6681
7294
  //# sourceMappingURL=m1z23r-ngx-ui.mjs.map