@tailng-ui/primitives 0.15.0 → 0.16.0
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tailng-ui/primitives",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@tailng-ui/cdk": "^0.
|
|
19
|
+
"@tailng-ui/cdk": "^0.15.0"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"@angular/core": "^21.1.0",
|
|
@@ -46,18 +46,19 @@ export declare class TngInput {
|
|
|
46
46
|
static ɵfac: i0.ɵɵFactoryDeclaration<TngInput, never>;
|
|
47
47
|
static ɵdir: i0.ɵɵDirectiveDeclaration<TngInput, "input[tngInput], textarea[tngInput]", ["tngInput"], { "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "ariaInvalid": { "alias": "ariaInvalid"; "required": false; "isSignal": true; }; "ariaRequired": { "alias": "ariaRequired"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
48
48
|
}
|
|
49
|
-
export declare class
|
|
49
|
+
export declare class TngPrefix {
|
|
50
50
|
readonly hostElement: any;
|
|
51
51
|
protected readonly dataSlot: "input-leading";
|
|
52
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
|
53
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<
|
|
52
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPrefix, never>;
|
|
53
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPrefix, "[tngPrefix], [tngInputLeading]", ["tngPrefix"], {}, {}, never, never, true, never>;
|
|
54
54
|
}
|
|
55
|
-
export declare class
|
|
55
|
+
export declare class TngSuffix {
|
|
56
56
|
readonly hostElement: any;
|
|
57
57
|
protected readonly dataSlot: "input-trailing";
|
|
58
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
|
59
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<
|
|
58
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngSuffix, never>;
|
|
59
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngSuffix, "[tngSuffix], [tngInputTrailing]", ["tngSuffix"], {}, {}, never, never, true, never>;
|
|
60
60
|
}
|
|
61
|
+
export { TngPrefix as TngInputLeading, TngSuffix as TngInputTrailing };
|
|
61
62
|
export declare class TngInputGroup implements AfterContentInit, OnDestroy {
|
|
62
63
|
readonly hasLeading: import("@angular/core").InputSignal<boolean | null>;
|
|
63
64
|
readonly hasTrailing: import("@angular/core").InputSignal<boolean | null>;
|
|
@@ -66,8 +67,8 @@ export declare class TngInputGroup implements AfterContentInit, OnDestroy {
|
|
|
66
67
|
readonly readonly: import("@angular/core").InputSignal<boolean | null>;
|
|
67
68
|
readonly controlCount: import("@angular/core").InputSignal<number | null>;
|
|
68
69
|
protected controls: QueryList<TngInput>;
|
|
69
|
-
protected
|
|
70
|
-
protected
|
|
70
|
+
protected prefixSlots: QueryList<TngPrefix>;
|
|
71
|
+
protected suffixSlots: QueryList<TngSuffix>;
|
|
71
72
|
private readonly hostElement;
|
|
72
73
|
private focused;
|
|
73
74
|
private readonly destroyed$;
|
|
@@ -90,7 +91,6 @@ export declare class TngInputGroup implements AfterContentInit, OnDestroy {
|
|
|
90
91
|
protected primaryControl(): TngInput | null;
|
|
91
92
|
protected primaryControlElement(): HTMLInputElement | HTMLTextAreaElement | null;
|
|
92
93
|
static ɵfac: i0.ɵɵFactoryDeclaration<TngInputGroup, never>;
|
|
93
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TngInputGroup, "tng-input-group, [tngInputGroup]", ["tngInputGroup"], { "hasLeading": { "alias": "hasLeading"; "required": false; "isSignal": true; }; "hasTrailing": { "alias": "hasTrailing"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "controlCount": { "alias": "controlCount"; "required": false; "isSignal": true; }; }, {}, ["controls", "
|
|
94
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TngInputGroup, "tng-input-group, [tngInputGroup]", ["tngInputGroup"], { "hasLeading": { "alias": "hasLeading"; "required": false; "isSignal": true; }; "hasTrailing": { "alias": "hasTrailing"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "controlCount": { "alias": "controlCount"; "required": false; "isSignal": true; }; }, {}, ["controls", "prefixSlots", "suffixSlots"], ["[tngPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]", "input[tngInput], textarea[tngInput], [data-tng-input-control-proxy]", "[tngSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]"], true, never>;
|
|
94
95
|
}
|
|
95
|
-
export {};
|
|
96
96
|
//# sourceMappingURL=tng-input.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-input.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-input.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAOhB,SAAS,EACT,SAAS,EAKV,MAAM,eAAe,CAAC;;AAMvB,KAAK,oBAAoB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAE/F,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,GAAG,IAAI,CAQzF;AA4BD,qBAIa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8D;IACzF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD,SAAgB,WAAW,MAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqE;IACtG,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA0E;IAChH,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAErC;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAElE,kEAAkE;IAClE,SAAgB,eAAe,qDAA8B;IAE7D,SAAgB,SAAS,qDAA8B;IACvD,SAAgB,cAAc,qDAA8B;IAE5D,0EAA0E;IAC1E,SAAgB,WAAW,yFAExB;IAEH,SAAgB,YAAY,yFAEzB;IAEH,SAAgB,QAAQ,8EAA4E;IACpG,SAAgB,QAAQ,8EAA4E;IACpG,SAAgB,QAAQ,8EAA4E;IAGpG,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;IAG/C,SAAS,KAAK,MAAM,IAAI,MAAM,CAG7B;IAGD,SAAS,KAAK,aAAa,IAAI,MAAM,GAAG,IAAI,CAK3C;IAGD,SAAS,KAAK,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAKhD;IAED;;;OAGG;IAEH,SAAS,KAAK,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAKjD;IAED;;;OAGG;IAEH,SAAS,KAAK,eAAe,IAAI,MAAM,GAAG,IAAI,CAE7C;IAGD,SAAS,KAAK,gBAAgB,IAAI,OAAO,GAAG,MAAM,GAAG,IAAI,CAGxD;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,eAAe,IAAI,EAAE,GAAG,IAAI,CAEzC;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAEtC;IAGD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAEtC;IAGD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAEtC;IAEM,SAAS,IAAI,OAAO;yCAlHhB,QAAQ;2CAAR,QAAQ;CAyHpB;AAED,qBAIa,
|
|
1
|
+
{"version":3,"file":"tng-input.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -165,38 +165,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
|
|
|
165
165
|
type: HostBinding,
|
|
166
166
|
args: ['attr.required']
|
|
167
167
|
}] } });
|
|
168
|
-
export class
|
|
168
|
+
export class TngPrefix {
|
|
169
169
|
hostElement = inject((ElementRef)).nativeElement;
|
|
170
170
|
dataSlot = 'input-leading';
|
|
171
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type:
|
|
172
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type:
|
|
171
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngPrefix, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
172
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type: TngPrefix, isStandalone: true, selector: "[tngPrefix], [tngInputLeading]", host: { properties: { "attr.data-slot": "this.dataSlot" } }, exportAs: ["tngPrefix"], ngImport: i0 });
|
|
173
173
|
}
|
|
174
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type:
|
|
174
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngPrefix, decorators: [{
|
|
175
175
|
type: Directive,
|
|
176
176
|
args: [{
|
|
177
|
-
selector: '[tngInputLeading]',
|
|
178
|
-
exportAs: '
|
|
177
|
+
selector: '[tngPrefix], [tngInputLeading]',
|
|
178
|
+
exportAs: 'tngPrefix',
|
|
179
179
|
}]
|
|
180
180
|
}], propDecorators: { dataSlot: [{
|
|
181
181
|
type: HostBinding,
|
|
182
182
|
args: ['attr.data-slot']
|
|
183
183
|
}] } });
|
|
184
|
-
export class
|
|
184
|
+
export class TngSuffix {
|
|
185
185
|
hostElement = inject((ElementRef)).nativeElement;
|
|
186
186
|
dataSlot = 'input-trailing';
|
|
187
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type:
|
|
188
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type:
|
|
187
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngSuffix, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
188
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type: TngSuffix, isStandalone: true, selector: "[tngSuffix], [tngInputTrailing]", host: { properties: { "attr.data-slot": "this.dataSlot" } }, exportAs: ["tngSuffix"], ngImport: i0 });
|
|
189
189
|
}
|
|
190
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type:
|
|
190
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngSuffix, decorators: [{
|
|
191
191
|
type: Directive,
|
|
192
192
|
args: [{
|
|
193
|
-
selector: '[tngInputTrailing]',
|
|
194
|
-
exportAs: '
|
|
193
|
+
selector: '[tngSuffix], [tngInputTrailing]',
|
|
194
|
+
exportAs: 'tngSuffix',
|
|
195
195
|
}]
|
|
196
196
|
}], propDecorators: { dataSlot: [{
|
|
197
197
|
type: HostBinding,
|
|
198
198
|
args: ['attr.data-slot']
|
|
199
199
|
}] } });
|
|
200
|
+
export { TngPrefix as TngInputLeading, TngSuffix as TngInputTrailing };
|
|
200
201
|
export class TngInputGroup {
|
|
201
202
|
hasLeading = input(null, ...(ngDevMode ? [{ debugName: "hasLeading" }] : []));
|
|
202
203
|
hasTrailing = input(null, ...(ngDevMode ? [{ debugName: "hasTrailing" }] : []));
|
|
@@ -205,8 +206,8 @@ export class TngInputGroup {
|
|
|
205
206
|
readonly = input(null, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
|
|
206
207
|
controlCount = input(null, ...(ngDevMode ? [{ debugName: "controlCount" }] : []));
|
|
207
208
|
controls;
|
|
208
|
-
|
|
209
|
-
|
|
209
|
+
prefixSlots;
|
|
210
|
+
suffixSlots;
|
|
210
211
|
hostElement = inject((ElementRef)).nativeElement;
|
|
211
212
|
focused = false;
|
|
212
213
|
destroyed$ = new Subject();
|
|
@@ -290,17 +291,17 @@ export class TngInputGroup {
|
|
|
290
291
|
this.focused = false;
|
|
291
292
|
}
|
|
292
293
|
hasLeadingSlot() {
|
|
293
|
-
const proxy = this.hostElement.querySelector('[data-tng-input-
|
|
294
|
+
const proxy = this.hostElement.querySelector('[data-tng-input-prefix-proxy]');
|
|
294
295
|
if (proxy instanceof HTMLElement)
|
|
295
296
|
return hasProjectedContent(proxy);
|
|
296
|
-
const slots = this.
|
|
297
|
+
const slots = this.prefixSlots?.toArray() ?? [];
|
|
297
298
|
return slots.some((slot) => hasProjectedContent(slot.hostElement));
|
|
298
299
|
}
|
|
299
300
|
hasTrailingSlot() {
|
|
300
|
-
const proxy = this.hostElement.querySelector('[data-tng-input-
|
|
301
|
+
const proxy = this.hostElement.querySelector('[data-tng-input-suffix-proxy]');
|
|
301
302
|
if (proxy instanceof HTMLElement)
|
|
302
303
|
return hasProjectedContent(proxy);
|
|
303
|
-
const slots = this.
|
|
304
|
+
const slots = this.suffixSlots?.toArray() ?? [];
|
|
304
305
|
return slots.some((slot) => hasProjectedContent(slot.hostElement));
|
|
305
306
|
}
|
|
306
307
|
effectiveHasLeading() {
|
|
@@ -328,10 +329,10 @@ export class TngInputGroup {
|
|
|
328
329
|
return null;
|
|
329
330
|
}
|
|
330
331
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngInputGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
331
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TngInputGroup, isStandalone: true, selector: "tng-input-group, [tngInputGroup]", inputs: { hasLeading: { classPropertyName: "hasLeading", publicName: "hasLeading", isSignal: true, isRequired: false, transformFunction: null }, hasTrailing: { classPropertyName: "hasTrailing", publicName: "hasTrailing", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, controlCount: { classPropertyName: "controlCount", publicName: "controlCount", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focusin": "onFocusIn()", "focusout": "onFocusOut($event)" }, properties: { "attr.data-slot": "this.dataSlot", "attr.data-has-leading": "this.dataHasLeading", "attr.data-has-trailing": "this.dataHasTrailing", "attr.data-disabled": "this.dataDisabled", "attr.data-invalid": "this.dataInvalid", "attr.data-readonly": "this.dataReadonly", "attr.data-focused": "this.dataFocused" } }, queries: [{ propertyName: "controls", predicate: TngInput, descendants: true }, { propertyName: "
|
|
332
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TngInputGroup, isStandalone: true, selector: "tng-input-group, [tngInputGroup]", inputs: { hasLeading: { classPropertyName: "hasLeading", publicName: "hasLeading", isSignal: true, isRequired: false, transformFunction: null }, hasTrailing: { classPropertyName: "hasTrailing", publicName: "hasTrailing", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, controlCount: { classPropertyName: "controlCount", publicName: "controlCount", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focusin": "onFocusIn()", "focusout": "onFocusOut($event)" }, properties: { "attr.data-slot": "this.dataSlot", "attr.data-has-leading": "this.dataHasLeading", "attr.data-has-trailing": "this.dataHasTrailing", "attr.data-disabled": "this.dataDisabled", "attr.data-invalid": "this.dataInvalid", "attr.data-readonly": "this.dataReadonly", "attr.data-focused": "this.dataFocused" } }, queries: [{ propertyName: "controls", predicate: TngInput, descendants: true }, { propertyName: "prefixSlots", predicate: TngPrefix, descendants: true }, { propertyName: "suffixSlots", predicate: TngSuffix, descendants: true }], exportAs: ["tngInputGroup"], ngImport: i0, template: `
|
|
332
333
|
@if (hasLeadingSlot()) {
|
|
333
334
|
<span class="tng-input-group-leading" data-slot="input-group-leading">
|
|
334
|
-
<ng-content select="[tngInputLeading], [data-tng-input-
|
|
335
|
+
<ng-content select="[tngPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]"></ng-content>
|
|
335
336
|
</span>
|
|
336
337
|
}
|
|
337
338
|
|
|
@@ -341,7 +342,7 @@ export class TngInputGroup {
|
|
|
341
342
|
|
|
342
343
|
@if (hasTrailingSlot()) {
|
|
343
344
|
<span class="tng-input-group-trailing" data-slot="input-group-trailing">
|
|
344
|
-
<ng-content select="[tngInputTrailing], [data-tng-input-
|
|
345
|
+
<ng-content select="[tngSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]"></ng-content>
|
|
345
346
|
</span>
|
|
346
347
|
}
|
|
347
348
|
`, isInline: true });
|
|
@@ -354,7 +355,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
|
|
|
354
355
|
template: `
|
|
355
356
|
@if (hasLeadingSlot()) {
|
|
356
357
|
<span class="tng-input-group-leading" data-slot="input-group-leading">
|
|
357
|
-
<ng-content select="[tngInputLeading], [data-tng-input-
|
|
358
|
+
<ng-content select="[tngPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]"></ng-content>
|
|
358
359
|
</span>
|
|
359
360
|
}
|
|
360
361
|
|
|
@@ -364,7 +365,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
|
|
|
364
365
|
|
|
365
366
|
@if (hasTrailingSlot()) {
|
|
366
367
|
<span class="tng-input-group-trailing" data-slot="input-group-trailing">
|
|
367
|
-
<ng-content select="[tngInputTrailing], [data-tng-input-
|
|
368
|
+
<ng-content select="[tngSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]"></ng-content>
|
|
368
369
|
</span>
|
|
369
370
|
}
|
|
370
371
|
`,
|
|
@@ -372,12 +373,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
|
|
|
372
373
|
}], propDecorators: { hasLeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasLeading", required: false }] }], hasTrailing: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasTrailing", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], controlCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "controlCount", required: false }] }], controls: [{
|
|
373
374
|
type: ContentChildren,
|
|
374
375
|
args: [TngInput, { descendants: true }]
|
|
375
|
-
}],
|
|
376
|
+
}], prefixSlots: [{
|
|
376
377
|
type: ContentChildren,
|
|
377
|
-
args: [
|
|
378
|
-
}],
|
|
378
|
+
args: [TngPrefix, { descendants: true }]
|
|
379
|
+
}], suffixSlots: [{
|
|
379
380
|
type: ContentChildren,
|
|
380
|
-
args: [
|
|
381
|
+
args: [TngSuffix, { descendants: true }]
|
|
381
382
|
}], dataSlot: [{
|
|
382
383
|
type: HostBinding,
|
|
383
384
|
args: ['attr.data-slot']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-input.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-input.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterContentInit,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n OnDestroy,\n QueryList,\n booleanAttribute,\n inject,\n input,\n isDevMode,\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { TngUniqueIdService } from '../_shared/id';\n\ntype NullableBooleanInput = boolean | null | string | undefined;\n\nexport type TngInputType = 'email' | 'number' | 'password' | 'search' | 'tel' | 'text' | 'url';\n\nexport function coerceTngInputNullableBoolean(value: NullableBooleanInput): boolean | null {\n if (value === undefined || value === null) return null;\n\n if (value === '' || value === true || value === 'true') return true;\n\n if (value === false || value === 'false') return false;\n\n return null;\n}\n\nfunction normalizeStringValue(value: string | null | undefined): string | null {\n if (value === undefined || value === null) return null;\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toAriaBoolean(value: boolean | null): 'false' | 'true' | null {\n if (value === null) return null;\n return value ? 'true' : 'false';\n}\n\nfunction hasProjectedContent(element: HTMLElement): boolean {\n return Array.from(element.childNodes).some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return true;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n return (node.textContent ?? '').trim().length > 0;\n }\n\n return false;\n });\n}\n\n@Directive({\n selector: 'input[tngInput], textarea[tngInput]',\n exportAs: 'tngInput',\n})\nexport class TngInput {\n private readonly elementRef = inject(ElementRef<HTMLInputElement | HTMLTextAreaElement>);\n private readonly idService = inject(TngUniqueIdService);\n\n public readonly hostElement = this.elementRef.nativeElement;\n private readonly initialAriaLabel = normalizeStringValue(this.hostElement.getAttribute('aria-label'));\n private readonly initialAriaLabelledby = normalizeStringValue(this.hostElement.getAttribute('aria-labelledby'));\n private readonly initialAriaDescribedBy = normalizeStringValue(\n this.hostElement.getAttribute('aria-describedby'),\n );\n\n private readonly generatedId = this.idService.nextId('tng-input');\n\n /** Canonical API for aria-describedby (whitespace normalized). */\n public readonly ariaDescribedBy = input<string | null>(null);\n\n public readonly ariaLabel = input<string | null>(null);\n public readonly ariaLabelledby = input<string | null>(null);\n\n /** If non-null, this value overrides native validity in `isInvalid()`. */\n public readonly ariaInvalid = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngInputNullableBoolean,\n });\n\n public readonly ariaRequired = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngInputNullableBoolean,\n });\n\n public readonly disabled = input<boolean, boolean | string>(false, { transform: booleanAttribute });\n public readonly readonly = input<boolean, boolean | string>(false, { transform: booleanAttribute });\n public readonly required = input<boolean, boolean | string>(false, { transform: booleanAttribute });\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input' as const;\n\n @HostBinding('attr.id')\n protected get idAttr(): string {\n const nativeId = normalizeStringValue(this.hostElement.getAttribute('id'));\n return nativeId ?? this.generatedId;\n }\n\n @HostBinding('attr.aria-label')\n protected get ariaLabelAttr(): string | null {\n const provided = normalizeStringValue(this.ariaLabel());\n if (provided !== null) return provided;\n\n return this.initialAriaLabel;\n }\n\n @HostBinding('attr.aria-labelledby')\n protected get ariaLabelledbyAttr(): string | null {\n const provided = normalizeStringValue(this.ariaLabelledby());\n if (provided !== null) return provided;\n\n return this.initialAriaLabelledby;\n }\n\n /**\n * If the consumer provided a native `aria-describedby` and the input is not set,\n * preserve it (do not clobber).\n */\n @HostBinding('attr.aria-describedby')\n protected get ariaDescribedByAttr(): string | null {\n const provided = normalizeStringValue(this.ariaDescribedBy());\n if (provided !== null) return provided;\n\n return this.initialAriaDescribedBy;\n }\n\n /**\n * Omit `aria-invalid` unless invalid. (Avoids noisy aria-invalid=\"false\" and\n * makes unit tests + bindings more stable.)\n */\n @HostBinding('attr.aria-invalid')\n protected get ariaInvalidAttr(): 'true' | null {\n return this.isInvalid() ? 'true' : null;\n }\n\n @HostBinding('attr.aria-required')\n protected get ariaRequiredAttr(): 'false' | 'true' | null {\n if (this.required()) return 'true';\n return toAriaBoolean(this.ariaRequired());\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.data-invalid')\n protected get dataInvalidAttr(): '' | null {\n return this.isInvalid() ? '' : null;\n }\n\n @HostBinding('attr.data-readonly')\n protected get dataReadonlyAttr(): '' | null {\n return this.readonly() ? '' : null;\n }\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.readonly')\n protected get readonlyAttr(): '' | null {\n return this.readonly() ? '' : null;\n }\n\n @HostBinding('attr.required')\n protected get requiredAttr(): '' | null {\n return this.required() ? '' : null;\n }\n\n public isInvalid(): boolean {\n const override = this.ariaInvalid();\n if (override !== null) return override;\n\n // jsdom may not fully implement validity; this is still correct for browsers.\n return this.hostElement.matches(':invalid');\n }\n}\n\n@Directive({\n selector: '[tngInputLeading]',\n exportAs: 'tngInputLeading',\n})\nexport class TngInputLeading {\n readonly hostElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-leading' as const;\n}\n\n@Directive({\n selector: '[tngInputTrailing]',\n exportAs: 'tngInputTrailing',\n})\nexport class TngInputTrailing {\n readonly hostElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-trailing' as const;\n}\n\n@Component({\n selector: 'tng-input-group, [tngInputGroup]',\n exportAs: 'tngInputGroup',\n template: `\n @if (hasLeadingSlot()) {\n <span class=\"tng-input-group-leading\" data-slot=\"input-group-leading\">\n <ng-content select=\"[tngInputLeading], [data-tng-input-leading-proxy]\"></ng-content>\n </span>\n }\n\n <span class=\"tng-input-group-control\" data-slot=\"input-group-control\">\n <ng-content select=\"input[tngInput], textarea[tngInput], [data-tng-input-control-proxy]\"></ng-content>\n </span>\n\n @if (hasTrailingSlot()) {\n <span class=\"tng-input-group-trailing\" data-slot=\"input-group-trailing\">\n <ng-content select=\"[tngInputTrailing], [data-tng-input-trailing-proxy]\"></ng-content>\n </span>\n }\n `,\n})\nexport class TngInputGroup implements AfterContentInit, OnDestroy {\n public readonly hasLeading = input<boolean | null>(null);\n public readonly hasTrailing = input<boolean | null>(null);\n public readonly disabled = input<boolean | null>(null);\n public readonly invalid = input<boolean | null>(null);\n public readonly readonly = input<boolean | null>(null);\n public readonly controlCount = input<number | null>(null);\n\n @ContentChildren(TngInput, { descendants: true })\n protected controls!: QueryList<TngInput>;\n\n @ContentChildren(TngInputLeading, { descendants: true })\n protected leadingSlots!: QueryList<TngInputLeading>;\n\n @ContentChildren(TngInputTrailing, { descendants: true })\n protected trailingSlots!: QueryList<TngInputTrailing>;\n\n private readonly hostElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n private focused = false;\n\n private readonly destroyed$ = new Subject<void>();\n\n private validateSingleControl(): void {\n if (!isDevMode()) return;\n if (!this.controls) return;\n\n const queriedCount = this.controls.length;\n const domCount = this.hostElement.querySelectorAll(\n '[data-tng-input-control-proxy] input, [data-tng-input-control-proxy] textarea, input[tngInput], textarea[tngInput]',\n ).length;\n const count = this.controlCount() ?? (queriedCount > 0 ? queriedCount : domCount);\n if (count !== 1) {\n console.warn(\n `[tngInputGroup] Expected exactly 1 control (input/textarea with tngInput), but found ${count}.`,\n this.hostElement,\n );\n }\n }\n\n public ngAfterContentInit(): void {\n queueMicrotask(() => this.validateSingleControl());\n\n this.controls.changes\n .pipe(takeUntil(this.destroyed$))\n .subscribe(() => this.validateSingleControl());\n }\n\n public ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-group' as const;\n\n @HostBinding('attr.data-has-leading')\n protected get dataHasLeading(): '' | null {\n return this.effectiveHasLeading() ? '' : null;\n }\n\n @HostBinding('attr.data-has-trailing')\n protected get dataHasTrailing(): '' | null {\n return this.effectiveHasTrailing() ? '' : null;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabled(): '' | null {\n const override = this.disabled();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.disabled() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n return element.hasAttribute('disabled') ? '' : null;\n }\n\n @HostBinding('attr.data-invalid')\n protected get dataInvalid(): '' | null {\n const override = this.invalid();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.isInvalid() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n if (element.getAttribute('aria-invalid') === 'true') return '';\n return element.matches(':invalid') ? '' : null;\n }\n\n @HostBinding('attr.data-readonly')\n protected get dataReadonly(): '' | null {\n const override = this.readonly();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.readonly() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n return element.hasAttribute('readonly') ? '' : null;\n }\n\n @HostBinding('attr.data-focused')\n protected get dataFocused(): '' | null {\n return this.focused ? '' : null;\n }\n\n @HostListener('focusin')\n protected onFocusIn(): void {\n this.focused = true;\n }\n\n @HostListener('focusout', ['$event'])\n protected onFocusOut(event: FocusEvent): void {\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && this.hostElement.contains(nextTarget)) return;\n\n this.focused = false;\n }\n\n protected hasLeadingSlot(): boolean {\n const proxy = this.hostElement.querySelector('[data-tng-input-leading-proxy]');\n if (proxy instanceof HTMLElement) return hasProjectedContent(proxy);\n\n const slots = this.leadingSlots?.toArray() ?? [];\n return slots.some((slot) => hasProjectedContent(slot.hostElement));\n }\n\n protected hasTrailingSlot(): boolean {\n const proxy = this.hostElement.querySelector('[data-tng-input-trailing-proxy]');\n if (proxy instanceof HTMLElement) return hasProjectedContent(proxy);\n\n const slots = this.trailingSlots?.toArray() ?? [];\n return slots.some((slot) => hasProjectedContent(slot.hostElement));\n }\n\n protected effectiveHasLeading(): boolean {\n const override = this.hasLeading();\n if (override !== null) return override;\n return this.hasLeadingSlot();\n }\n\n protected effectiveHasTrailing(): boolean {\n const override = this.hasTrailing();\n if (override !== null) return override;\n return this.hasTrailingSlot();\n }\n\n protected primaryControl(): TngInput | null {\n const controls = this.controls?.toArray() ?? [];\n return controls[0] ?? null;\n }\n\n protected primaryControlElement(): HTMLInputElement | HTMLTextAreaElement | null {\n const element = this.hostElement.querySelector(\n '[data-tng-input-control-proxy] input, [data-tng-input-control-proxy] textarea, input[tngInput], textarea[tngInput]',\n );\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement\n ) {\n return element;\n }\n\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-input.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-input.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterContentInit,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n OnDestroy,\n QueryList,\n booleanAttribute,\n inject,\n input,\n isDevMode,\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { TngUniqueIdService } from '../_shared/id';\n\ntype NullableBooleanInput = boolean | null | string | undefined;\n\nexport type TngInputType = 'email' | 'number' | 'password' | 'search' | 'tel' | 'text' | 'url';\n\nexport function coerceTngInputNullableBoolean(value: NullableBooleanInput): boolean | null {\n if (value === undefined || value === null) return null;\n\n if (value === '' || value === true || value === 'true') return true;\n\n if (value === false || value === 'false') return false;\n\n return null;\n}\n\nfunction normalizeStringValue(value: string | null | undefined): string | null {\n if (value === undefined || value === null) return null;\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toAriaBoolean(value: boolean | null): 'false' | 'true' | null {\n if (value === null) return null;\n return value ? 'true' : 'false';\n}\n\nfunction hasProjectedContent(element: HTMLElement): boolean {\n return Array.from(element.childNodes).some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return true;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n return (node.textContent ?? '').trim().length > 0;\n }\n\n return false;\n });\n}\n\n@Directive({\n selector: 'input[tngInput], textarea[tngInput]',\n exportAs: 'tngInput',\n})\nexport class TngInput {\n private readonly elementRef = inject(ElementRef<HTMLInputElement | HTMLTextAreaElement>);\n private readonly idService = inject(TngUniqueIdService);\n\n public readonly hostElement = this.elementRef.nativeElement;\n private readonly initialAriaLabel = normalizeStringValue(this.hostElement.getAttribute('aria-label'));\n private readonly initialAriaLabelledby = normalizeStringValue(this.hostElement.getAttribute('aria-labelledby'));\n private readonly initialAriaDescribedBy = normalizeStringValue(\n this.hostElement.getAttribute('aria-describedby'),\n );\n\n private readonly generatedId = this.idService.nextId('tng-input');\n\n /** Canonical API for aria-describedby (whitespace normalized). */\n public readonly ariaDescribedBy = input<string | null>(null);\n\n public readonly ariaLabel = input<string | null>(null);\n public readonly ariaLabelledby = input<string | null>(null);\n\n /** If non-null, this value overrides native validity in `isInvalid()`. */\n public readonly ariaInvalid = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngInputNullableBoolean,\n });\n\n public readonly ariaRequired = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngInputNullableBoolean,\n });\n\n public readonly disabled = input<boolean, boolean | string>(false, { transform: booleanAttribute });\n public readonly readonly = input<boolean, boolean | string>(false, { transform: booleanAttribute });\n public readonly required = input<boolean, boolean | string>(false, { transform: booleanAttribute });\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input' as const;\n\n @HostBinding('attr.id')\n protected get idAttr(): string {\n const nativeId = normalizeStringValue(this.hostElement.getAttribute('id'));\n return nativeId ?? this.generatedId;\n }\n\n @HostBinding('attr.aria-label')\n protected get ariaLabelAttr(): string | null {\n const provided = normalizeStringValue(this.ariaLabel());\n if (provided !== null) return provided;\n\n return this.initialAriaLabel;\n }\n\n @HostBinding('attr.aria-labelledby')\n protected get ariaLabelledbyAttr(): string | null {\n const provided = normalizeStringValue(this.ariaLabelledby());\n if (provided !== null) return provided;\n\n return this.initialAriaLabelledby;\n }\n\n /**\n * If the consumer provided a native `aria-describedby` and the input is not set,\n * preserve it (do not clobber).\n */\n @HostBinding('attr.aria-describedby')\n protected get ariaDescribedByAttr(): string | null {\n const provided = normalizeStringValue(this.ariaDescribedBy());\n if (provided !== null) return provided;\n\n return this.initialAriaDescribedBy;\n }\n\n /**\n * Omit `aria-invalid` unless invalid. (Avoids noisy aria-invalid=\"false\" and\n * makes unit tests + bindings more stable.)\n */\n @HostBinding('attr.aria-invalid')\n protected get ariaInvalidAttr(): 'true' | null {\n return this.isInvalid() ? 'true' : null;\n }\n\n @HostBinding('attr.aria-required')\n protected get ariaRequiredAttr(): 'false' | 'true' | null {\n if (this.required()) return 'true';\n return toAriaBoolean(this.ariaRequired());\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.data-invalid')\n protected get dataInvalidAttr(): '' | null {\n return this.isInvalid() ? '' : null;\n }\n\n @HostBinding('attr.data-readonly')\n protected get dataReadonlyAttr(): '' | null {\n return this.readonly() ? '' : null;\n }\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.readonly')\n protected get readonlyAttr(): '' | null {\n return this.readonly() ? '' : null;\n }\n\n @HostBinding('attr.required')\n protected get requiredAttr(): '' | null {\n return this.required() ? '' : null;\n }\n\n public isInvalid(): boolean {\n const override = this.ariaInvalid();\n if (override !== null) return override;\n\n // jsdom may not fully implement validity; this is still correct for browsers.\n return this.hostElement.matches(':invalid');\n }\n}\n\n@Directive({\n selector: '[tngPrefix], [tngInputLeading]',\n exportAs: 'tngPrefix',\n})\nexport class TngPrefix {\n readonly hostElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-leading' as const;\n}\n\n@Directive({\n selector: '[tngSuffix], [tngInputTrailing]',\n exportAs: 'tngSuffix',\n})\nexport class TngSuffix {\n readonly hostElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-trailing' as const;\n}\n\nexport { TngPrefix as TngInputLeading, TngSuffix as TngInputTrailing };\n\n@Component({\n selector: 'tng-input-group, [tngInputGroup]',\n exportAs: 'tngInputGroup',\n template: `\n @if (hasLeadingSlot()) {\n <span class=\"tng-input-group-leading\" data-slot=\"input-group-leading\">\n <ng-content select=\"[tngPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]\"></ng-content>\n </span>\n }\n\n <span class=\"tng-input-group-control\" data-slot=\"input-group-control\">\n <ng-content select=\"input[tngInput], textarea[tngInput], [data-tng-input-control-proxy]\"></ng-content>\n </span>\n\n @if (hasTrailingSlot()) {\n <span class=\"tng-input-group-trailing\" data-slot=\"input-group-trailing\">\n <ng-content select=\"[tngSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]\"></ng-content>\n </span>\n }\n `,\n})\nexport class TngInputGroup implements AfterContentInit, OnDestroy {\n public readonly hasLeading = input<boolean | null>(null);\n public readonly hasTrailing = input<boolean | null>(null);\n public readonly disabled = input<boolean | null>(null);\n public readonly invalid = input<boolean | null>(null);\n public readonly readonly = input<boolean | null>(null);\n public readonly controlCount = input<number | null>(null);\n\n @ContentChildren(TngInput, { descendants: true })\n protected controls!: QueryList<TngInput>;\n\n @ContentChildren(TngPrefix, { descendants: true })\n protected prefixSlots!: QueryList<TngPrefix>;\n\n @ContentChildren(TngSuffix, { descendants: true })\n protected suffixSlots!: QueryList<TngSuffix>;\n\n private readonly hostElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n private focused = false;\n\n private readonly destroyed$ = new Subject<void>();\n\n private validateSingleControl(): void {\n if (!isDevMode()) return;\n if (!this.controls) return;\n\n const queriedCount = this.controls.length;\n const domCount = this.hostElement.querySelectorAll(\n '[data-tng-input-control-proxy] input, [data-tng-input-control-proxy] textarea, input[tngInput], textarea[tngInput]',\n ).length;\n const count = this.controlCount() ?? (queriedCount > 0 ? queriedCount : domCount);\n if (count !== 1) {\n console.warn(\n `[tngInputGroup] Expected exactly 1 control (input/textarea with tngInput), but found ${count}.`,\n this.hostElement,\n );\n }\n }\n\n public ngAfterContentInit(): void {\n queueMicrotask(() => this.validateSingleControl());\n\n this.controls.changes\n .pipe(takeUntil(this.destroyed$))\n .subscribe(() => this.validateSingleControl());\n }\n\n public ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-group' as const;\n\n @HostBinding('attr.data-has-leading')\n protected get dataHasLeading(): '' | null {\n return this.effectiveHasLeading() ? '' : null;\n }\n\n @HostBinding('attr.data-has-trailing')\n protected get dataHasTrailing(): '' | null {\n return this.effectiveHasTrailing() ? '' : null;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabled(): '' | null {\n const override = this.disabled();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.disabled() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n return element.hasAttribute('disabled') ? '' : null;\n }\n\n @HostBinding('attr.data-invalid')\n protected get dataInvalid(): '' | null {\n const override = this.invalid();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.isInvalid() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n if (element.getAttribute('aria-invalid') === 'true') return '';\n return element.matches(':invalid') ? '' : null;\n }\n\n @HostBinding('attr.data-readonly')\n protected get dataReadonly(): '' | null {\n const override = this.readonly();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.readonly() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n return element.hasAttribute('readonly') ? '' : null;\n }\n\n @HostBinding('attr.data-focused')\n protected get dataFocused(): '' | null {\n return this.focused ? '' : null;\n }\n\n @HostListener('focusin')\n protected onFocusIn(): void {\n this.focused = true;\n }\n\n @HostListener('focusout', ['$event'])\n protected onFocusOut(event: FocusEvent): void {\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && this.hostElement.contains(nextTarget)) return;\n\n this.focused = false;\n }\n\n protected hasLeadingSlot(): boolean {\n const proxy = this.hostElement.querySelector('[data-tng-input-prefix-proxy]');\n if (proxy instanceof HTMLElement) return hasProjectedContent(proxy);\n\n const slots = this.prefixSlots?.toArray() ?? [];\n return slots.some((slot) => hasProjectedContent(slot.hostElement));\n }\n\n protected hasTrailingSlot(): boolean {\n const proxy = this.hostElement.querySelector('[data-tng-input-suffix-proxy]');\n if (proxy instanceof HTMLElement) return hasProjectedContent(proxy);\n\n const slots = this.suffixSlots?.toArray() ?? [];\n return slots.some((slot) => hasProjectedContent(slot.hostElement));\n }\n\n protected effectiveHasLeading(): boolean {\n const override = this.hasLeading();\n if (override !== null) return override;\n return this.hasLeadingSlot();\n }\n\n protected effectiveHasTrailing(): boolean {\n const override = this.hasTrailing();\n if (override !== null) return override;\n return this.hasTrailingSlot();\n }\n\n protected primaryControl(): TngInput | null {\n const controls = this.controls?.toArray() ?? [];\n return controls[0] ?? null;\n }\n\n protected primaryControlElement(): HTMLInputElement | HTMLTextAreaElement | null {\n const element = this.hostElement.querySelector(\n '[data-tng-input-control-proxy] input, [data-tng-input-control-proxy] textarea, input[tngInput], textarea[tngInput]',\n );\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement\n ) {\n return element;\n }\n\n return null;\n }\n}\n"]}
|