ngx-com 0.1.16 → 0.1.18
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/fesm2022/ngx-com-components-alert-testing.mjs +80 -0
- package/fesm2022/ngx-com-components-alert-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-calendar-testing.mjs +157 -0
- package/fesm2022/ngx-com-components-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-carousel-testing.mjs +121 -0
- package/fesm2022/ngx-com-components-carousel-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-checkbox-testing.mjs +113 -0
- package/fesm2022/ngx-com-components-checkbox-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-checkbox.mjs +2 -2
- package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
- package/fesm2022/ngx-com-components-code-block-testing.mjs +88 -0
- package/fesm2022/ngx-com-components-code-block-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-collapsible-testing.mjs +104 -0
- package/fesm2022/ngx-com-components-collapsible-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-confirm-testing.mjs +150 -0
- package/fesm2022/ngx-com-components-confirm-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-datepicker-testing.mjs +137 -0
- package/fesm2022/ngx-com-components-datepicker-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dialog-testing.mjs +109 -0
- package/fesm2022/ngx-com-components-dialog-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dialog.mjs +18 -18
- package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
- package/fesm2022/ngx-com-components-dropdown.mjs +39 -0
- package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
- package/fesm2022/ngx-com-components-form-field-testing.mjs +140 -0
- package/fesm2022/ngx-com-components-form-field-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-form-field.mjs +5 -1
- package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
- package/fesm2022/ngx-com-components-menu-testing.mjs +298 -0
- package/fesm2022/ngx-com-components-menu-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-paginator-testing.mjs +128 -0
- package/fesm2022/ngx-com-components-paginator-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-popover-testing.mjs +115 -0
- package/fesm2022/ngx-com-components-popover-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-radio-testing.mjs +157 -0
- package/fesm2022/ngx-com-components-radio-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-radio.mjs +2 -2
- package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
- package/fesm2022/ngx-com-components-segmented-control-testing.mjs +122 -0
- package/fesm2022/ngx-com-components-segmented-control-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-sort-testing.mjs +108 -0
- package/fesm2022/ngx-com-components-sort-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-switch-testing.mjs +103 -0
- package/fesm2022/ngx-com-components-switch-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-switch.mjs +2 -2
- package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
- package/fesm2022/ngx-com-components-table-testing.mjs +198 -0
- package/fesm2022/ngx-com-components-table-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-tabs-testing.mjs +126 -0
- package/fesm2022/ngx-com-components-tabs-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-timepicker-testing.mjs +117 -0
- package/fesm2022/ngx-com-components-timepicker-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-toast-testing.mjs +172 -0
- package/fesm2022/ngx-com-components-toast-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-toast.mjs +4 -4
- package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
- package/fesm2022/ngx-com-components-tooltip-testing.mjs +117 -0
- package/fesm2022/ngx-com-components-tooltip-testing.mjs.map +1 -0
- package/package.json +89 -1
- package/types/ngx-com-components-alert-testing.d.ts +41 -0
- package/types/ngx-com-components-calendar-testing.d.ts +80 -0
- package/types/ngx-com-components-carousel-testing.d.ts +51 -0
- package/types/ngx-com-components-checkbox-testing.d.ts +56 -0
- package/types/ngx-com-components-code-block-testing.d.ts +45 -0
- package/types/ngx-com-components-collapsible-testing.d.ts +53 -0
- package/types/ngx-com-components-confirm-testing.d.ts +78 -0
- package/types/ngx-com-components-datepicker-testing.d.ts +61 -0
- package/types/ngx-com-components-dialog-testing.d.ts +57 -0
- package/types/ngx-com-components-dropdown.d.ts +12 -0
- package/types/ngx-com-components-form-field-testing.d.ts +61 -0
- package/types/ngx-com-components-menu-testing.d.ts +167 -0
- package/types/ngx-com-components-paginator-testing.d.ts +58 -0
- package/types/ngx-com-components-popover-testing.d.ts +63 -0
- package/types/ngx-com-components-radio-testing.d.ts +86 -0
- package/types/ngx-com-components-segmented-control-testing.d.ts +66 -0
- package/types/ngx-com-components-sort-testing.d.ts +62 -0
- package/types/ngx-com-components-switch-testing.d.ts +52 -0
- package/types/ngx-com-components-table-testing.d.ts +124 -0
- package/types/ngx-com-components-tabs-testing.d.ts +67 -0
- package/types/ngx-com-components-timepicker-testing.d.ts +53 -0
- package/types/ngx-com-components-toast-testing.d.ts +93 -0
- package/types/ngx-com-components-tooltip-testing.d.ts +57 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Harness for interacting with a ComFormField in tests.
|
|
5
|
+
*/
|
|
6
|
+
class ComFormFieldHarness extends ComponentHarness {
|
|
7
|
+
static hostSelector = 'com-form-field';
|
|
8
|
+
label = this.locatorForOptional('[comlabel]');
|
|
9
|
+
input = this.locatorForOptional('input[cominput], textarea[cominput]');
|
|
10
|
+
hints = this.locatorForAll('[comhint]');
|
|
11
|
+
errors = this.locatorForAll('[comerror]');
|
|
12
|
+
prefix = this.locatorForOptional('[comprefix]');
|
|
13
|
+
suffix = this.locatorForOptional('[comsuffix]');
|
|
14
|
+
/**
|
|
15
|
+
* Gets a HarnessPredicate for matching form fields.
|
|
16
|
+
* @param options Filter options.
|
|
17
|
+
*/
|
|
18
|
+
static with(options = {}) {
|
|
19
|
+
return new HarnessPredicate(ComFormFieldHarness, options)
|
|
20
|
+
.addOption('label', options.label, async (harness, label) => {
|
|
21
|
+
const labelText = await harness.getLabel();
|
|
22
|
+
if (labelText === null)
|
|
23
|
+
return false;
|
|
24
|
+
return HarnessPredicate.stringMatches(labelText, label);
|
|
25
|
+
})
|
|
26
|
+
.addOption('hasErrors', options.hasErrors, async (harness, hasErrors) => {
|
|
27
|
+
return (await harness.hasErrors()) === hasErrors;
|
|
28
|
+
})
|
|
29
|
+
.addOption('disabled', options.disabled, async (harness, disabled) => {
|
|
30
|
+
return (await harness.isDisabled()) === disabled;
|
|
31
|
+
})
|
|
32
|
+
.addOption('floatingLabel', options.floatingLabel, async (harness, floatingLabel) => {
|
|
33
|
+
return (await harness.isLabelFloating()) === floatingLabel;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** Gets the form field's label text, or null if no label is present. */
|
|
37
|
+
async getLabel() {
|
|
38
|
+
const labelEl = await this.label();
|
|
39
|
+
return labelEl ? labelEl.text() : null;
|
|
40
|
+
}
|
|
41
|
+
/** Whether the form field has a label. */
|
|
42
|
+
async hasLabel() {
|
|
43
|
+
const labelEl = await this.label();
|
|
44
|
+
return labelEl !== null;
|
|
45
|
+
}
|
|
46
|
+
/** Whether the form field is disabled. */
|
|
47
|
+
async isDisabled() {
|
|
48
|
+
const host = await this.host();
|
|
49
|
+
return (await host.getAttribute('data-disabled')) !== null;
|
|
50
|
+
}
|
|
51
|
+
/** Whether the form field is focused. */
|
|
52
|
+
async isFocused() {
|
|
53
|
+
const host = await this.host();
|
|
54
|
+
return (await host.getAttribute('data-focused')) !== null;
|
|
55
|
+
}
|
|
56
|
+
/** Whether the form field has errors. */
|
|
57
|
+
async hasErrors() {
|
|
58
|
+
const host = await this.host();
|
|
59
|
+
return (await host.getAttribute('data-error')) !== null;
|
|
60
|
+
}
|
|
61
|
+
/** Whether the label is currently floating. */
|
|
62
|
+
async isLabelFloating() {
|
|
63
|
+
const host = await this.host();
|
|
64
|
+
return (await host.getAttribute('data-floating')) !== null;
|
|
65
|
+
}
|
|
66
|
+
/** Gets the text content of all visible error elements. */
|
|
67
|
+
async getTextErrors() {
|
|
68
|
+
const errorEls = await this.errors();
|
|
69
|
+
const texts = [];
|
|
70
|
+
for (const error of errorEls) {
|
|
71
|
+
const text = await error.text();
|
|
72
|
+
if (text) {
|
|
73
|
+
texts.push(text);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return texts;
|
|
77
|
+
}
|
|
78
|
+
/** Gets the text content of all hint elements. */
|
|
79
|
+
async getTextHints() {
|
|
80
|
+
const hintEls = await this.hints();
|
|
81
|
+
const texts = [];
|
|
82
|
+
for (const hint of hintEls) {
|
|
83
|
+
const text = await hint.text();
|
|
84
|
+
if (text) {
|
|
85
|
+
texts.push(text);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return texts;
|
|
89
|
+
}
|
|
90
|
+
/** Whether the form field has a prefix element. */
|
|
91
|
+
async hasPrefix() {
|
|
92
|
+
const prefixEl = await this.prefix();
|
|
93
|
+
return prefixEl !== null;
|
|
94
|
+
}
|
|
95
|
+
/** Whether the form field has a suffix element. */
|
|
96
|
+
async hasSuffix() {
|
|
97
|
+
const suffixEl = await this.suffix();
|
|
98
|
+
return suffixEl !== null;
|
|
99
|
+
}
|
|
100
|
+
/** Whether the form field's control is required. */
|
|
101
|
+
async isRequired() {
|
|
102
|
+
const inputEl = await this.input();
|
|
103
|
+
if (inputEl) {
|
|
104
|
+
const ariaRequired = await inputEl.getAttribute('aria-required');
|
|
105
|
+
if (ariaRequired === 'true')
|
|
106
|
+
return true;
|
|
107
|
+
const required = await inputEl.getProperty('required');
|
|
108
|
+
if (required)
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
/** Gets the form field's inner control element (input or textarea). */
|
|
114
|
+
async getControl() {
|
|
115
|
+
return this.input();
|
|
116
|
+
}
|
|
117
|
+
/** Focuses the form field's inner control element. */
|
|
118
|
+
async focus() {
|
|
119
|
+
const inputEl = await this.input();
|
|
120
|
+
if (inputEl) {
|
|
121
|
+
return inputEl.focus();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Blurs the form field's inner control element. */
|
|
125
|
+
async blur() {
|
|
126
|
+
const inputEl = await this.input();
|
|
127
|
+
if (inputEl) {
|
|
128
|
+
return inputEl.blur();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Testing utilities for the form-field component
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Generated bundle index. Do not edit.
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
export { ComFormFieldHarness };
|
|
140
|
+
//# sourceMappingURL=ngx-com-components-form-field-testing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-com-components-form-field-testing.mjs","sources":["../../../projects/com/components/form-field/testing/form-field.harness.ts","../../../projects/com/components/form-field/testing/index.ts","../../../projects/com/components/form-field/testing/ngx-com-components-form-field-testing.ts"],"sourcesContent":["import {\n ComponentHarness,\n HarnessPredicate,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters, TestElement } from '@angular/cdk/testing';\n\n/** Harness filters for ComFormFieldHarness. */\nexport interface ComFormFieldHarnessFilters extends BaseHarnessFilters {\n /** Filter by the form field's label text. */\n label?: string | RegExp;\n /** Filter by whether the form field has errors. */\n hasErrors?: boolean;\n /** Filter by whether the form field is disabled. */\n disabled?: boolean;\n /** Filter by whether the label is floating. */\n floatingLabel?: boolean;\n}\n\n/**\n * Harness for interacting with a ComFormField in tests.\n */\nexport class ComFormFieldHarness extends ComponentHarness {\n static hostSelector = 'com-form-field';\n\n private readonly label = this.locatorForOptional('[comlabel]');\n private readonly input = this.locatorForOptional('input[cominput], textarea[cominput]');\n private readonly hints = this.locatorForAll('[comhint]');\n private readonly errors = this.locatorForAll('[comerror]');\n private readonly prefix = this.locatorForOptional('[comprefix]');\n private readonly suffix = this.locatorForOptional('[comsuffix]');\n\n /**\n * Gets a HarnessPredicate for matching form fields.\n * @param options Filter options.\n */\n static with(options: ComFormFieldHarnessFilters = {}): HarnessPredicate<ComFormFieldHarness> {\n return new HarnessPredicate(ComFormFieldHarness, options)\n .addOption('label', options.label, async (harness, label) => {\n const labelText = await harness.getLabel();\n if (labelText === null) return false;\n return HarnessPredicate.stringMatches(labelText, label);\n })\n .addOption('hasErrors', options.hasErrors, async (harness, hasErrors) => {\n return (await harness.hasErrors()) === hasErrors;\n })\n .addOption('disabled', options.disabled, async (harness, disabled) => {\n return (await harness.isDisabled()) === disabled;\n })\n .addOption('floatingLabel', options.floatingLabel, async (harness, floatingLabel) => {\n return (await harness.isLabelFloating()) === floatingLabel;\n });\n }\n\n /** Gets the form field's label text, or null if no label is present. */\n async getLabel(): Promise<string | null> {\n const labelEl = await this.label();\n return labelEl ? labelEl.text() : null;\n }\n\n /** Whether the form field has a label. */\n async hasLabel(): Promise<boolean> {\n const labelEl = await this.label();\n return labelEl !== null;\n }\n\n /** Whether the form field is disabled. */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('data-disabled')) !== null;\n }\n\n /** Whether the form field is focused. */\n async isFocused(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('data-focused')) !== null;\n }\n\n /** Whether the form field has errors. */\n async hasErrors(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('data-error')) !== null;\n }\n\n /** Whether the label is currently floating. */\n async isLabelFloating(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('data-floating')) !== null;\n }\n\n /** Gets the text content of all visible error elements. */\n async getTextErrors(): Promise<string[]> {\n const errorEls = await this.errors();\n const texts: string[] = [];\n for (const error of errorEls) {\n const text = await error.text();\n if (text) {\n texts.push(text);\n }\n }\n return texts;\n }\n\n /** Gets the text content of all hint elements. */\n async getTextHints(): Promise<string[]> {\n const hintEls = await this.hints();\n const texts: string[] = [];\n for (const hint of hintEls) {\n const text = await hint.text();\n if (text) {\n texts.push(text);\n }\n }\n return texts;\n }\n\n /** Whether the form field has a prefix element. */\n async hasPrefix(): Promise<boolean> {\n const prefixEl = await this.prefix();\n return prefixEl !== null;\n }\n\n /** Whether the form field has a suffix element. */\n async hasSuffix(): Promise<boolean> {\n const suffixEl = await this.suffix();\n return suffixEl !== null;\n }\n\n /** Whether the form field's control is required. */\n async isRequired(): Promise<boolean> {\n const inputEl = await this.input();\n if (inputEl) {\n const ariaRequired = await inputEl.getAttribute('aria-required');\n if (ariaRequired === 'true') return true;\n const required = await inputEl.getProperty<boolean>('required');\n if (required) return true;\n }\n return false;\n }\n\n /** Gets the form field's inner control element (input or textarea). */\n async getControl(): Promise<TestElement | null> {\n return this.input();\n }\n\n /** Focuses the form field's inner control element. */\n async focus(): Promise<void> {\n const inputEl = await this.input();\n if (inputEl) {\n return inputEl.focus();\n }\n }\n\n /** Blurs the form field's inner control element. */\n async blur(): Promise<void> {\n const inputEl = await this.input();\n if (inputEl) {\n return inputEl.blur();\n }\n }\n}\n","// Testing utilities for the form-field component\n\nexport { ComFormFieldHarness } from './form-field.harness';\n\nexport type { ComFormFieldHarnessFilters } from './form-field.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -924,7 +924,7 @@ class ComFormField {
|
|
|
924
924
|
this.control()?.onContainerClick(new MouseEvent('click'));
|
|
925
925
|
}
|
|
926
926
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComFormField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
927
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComFormField, isStandalone: true, selector: "com-form-field", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, floatLabel: { classPropertyName: "floatLabel", publicName: "floatLabel", isSignal: true, isRequired: false, transformFunction: null }, hideRequiredMarker: { classPropertyName: "hideRequiredMarker", publicName: "hideRequiredMarker", isSignal: true, isRequired: false, transformFunction: null }, subscriptSizing: { classPropertyName: "subscriptSizing", publicName: "subscriptSizing", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "class.com-form-field--focused": "isFocused()", "class.com-form-field--disabled": "isDisabled()", "class.com-form-field--error": "hasError()", "class.com-form-field--floating": "shouldLabelFloat()", "class.com-form-field--has-label": "!!labelChild()" } }, queries: [{ propertyName: "control", first: true, predicate: FormFieldControl, descendants: true, isSignal: true }, { propertyName: "inputDirective", first: true, predicate: ComInput, descendants: true, isSignal: true }, { propertyName: "labelChild", first: true, predicate: ComLabel, descendants: true, isSignal: true }, { propertyName: "hintChildren", predicate: ComHint, isSignal: true }, { propertyName: "errorChildren", predicate: ComError, isSignal: true }, { propertyName: "prefixChild", first: true, predicate: ComPrefix, descendants: true, isSignal: true }, { propertyName: "suffixChild", first: true, predicate: ComSuffix, descendants: true, isSignal: true }], exportAs: ["comFormField"], ngImport: i0, template: `
|
|
927
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComFormField, isStandalone: true, selector: "com-form-field", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, floatLabel: { classPropertyName: "floatLabel", publicName: "floatLabel", isSignal: true, isRequired: false, transformFunction: null }, hideRequiredMarker: { classPropertyName: "hideRequiredMarker", publicName: "hideRequiredMarker", isSignal: true, isRequired: false, transformFunction: null }, subscriptSizing: { classPropertyName: "subscriptSizing", publicName: "subscriptSizing", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "class.com-form-field--focused": "isFocused()", "class.com-form-field--disabled": "isDisabled()", "class.com-form-field--error": "hasError()", "class.com-form-field--floating": "shouldLabelFloat()", "class.com-form-field--has-label": "!!labelChild()", "attr.data-focused": "isFocused() || null", "attr.data-disabled": "isDisabled() || null", "attr.data-error": "hasError() || null", "attr.data-floating": "shouldLabelFloat() || null" } }, queries: [{ propertyName: "control", first: true, predicate: FormFieldControl, descendants: true, isSignal: true }, { propertyName: "inputDirective", first: true, predicate: ComInput, descendants: true, isSignal: true }, { propertyName: "labelChild", first: true, predicate: ComLabel, descendants: true, isSignal: true }, { propertyName: "hintChildren", predicate: ComHint, isSignal: true }, { propertyName: "errorChildren", predicate: ComError, isSignal: true }, { propertyName: "prefixChild", first: true, predicate: ComPrefix, descendants: true, isSignal: true }, { propertyName: "suffixChild", first: true, predicate: ComSuffix, descendants: true, isSignal: true }], exportAs: ["comFormField"], ngImport: i0, template: `
|
|
928
928
|
<div [class]="containerClasses()" role="group" tabindex="-1" (click)="onContainerClick($event)" (keydown.enter)="onContainerActivate()">
|
|
929
929
|
<div class="flex items-center w-full">
|
|
930
930
|
@if (hasPrefix()) {
|
|
@@ -999,6 +999,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
|
|
|
999
999
|
'[class.com-form-field--error]': 'hasError()',
|
|
1000
1000
|
'[class.com-form-field--floating]': 'shouldLabelFloat()',
|
|
1001
1001
|
'[class.com-form-field--has-label]': '!!labelChild()',
|
|
1002
|
+
'[attr.data-focused]': 'isFocused() || null',
|
|
1003
|
+
'[attr.data-disabled]': 'isDisabled() || null',
|
|
1004
|
+
'[attr.data-error]': 'hasError() || null',
|
|
1005
|
+
'[attr.data-floating]': 'shouldLabelFloat() || null',
|
|
1002
1006
|
}, styles: ["com-form-field.com-form-field--has-label:not(.com-form-field--floating) input::placeholder,com-form-field.com-form-field--has-label:not(.com-form-field--floating) textarea::placeholder{color:transparent}com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-dropdown .text-placeholder{display:none}com-form-field com-dropdown,com-form-field com-datepicker,com-form-field com-date-range-picker,com-form-field com-time-picker{display:block;width:100%}com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-datepicker input::placeholder,com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-date-range-picker input::placeholder{color:transparent}com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-time-picker span[aria-hidden],com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-time-picker button{visibility:hidden}com-form-field .com-form-field__label [comtooltip]{pointer-events:auto;cursor:help}com-form-field.com-form-field--floating .com-form-field__label com-icon{visibility:hidden;width:0;overflow:hidden}\n"] }]
|
|
1003
1007
|
}], ctorParameters: () => [], propDecorators: { control: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FormFieldControl), { isSignal: true }] }], inputDirective: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ComInput), { isSignal: true }] }], labelChild: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ComLabel), { isSignal: true }] }], hintChildren: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ComHint), { isSignal: true }] }], errorChildren: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ComError), { isSignal: true }] }], prefixChild: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ComPrefix), { isSignal: true }] }], suffixChild: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ComSuffix), { isSignal: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], floatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatLabel", required: false }] }], hideRequiredMarker: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideRequiredMarker", required: false }] }], subscriptSizing: [{ type: i0.Input, args: [{ isSignal: true, alias: "subscriptSizing", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
1004
1008
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-com-components-form-field.mjs","sources":["../../../projects/com/components/form-field/form-field-control.ts","../../../projects/com/components/form-field/label.directive.ts","../../../projects/com/components/form-field/form-field.variants.ts","../../../projects/com/components/form-field/hint.directive.ts","../../../projects/com/components/form-field/error.directive.ts","../../../projects/com/components/form-field/prefix.directive.ts","../../../projects/com/components/form-field/suffix.directive.ts","../../../projects/com/components/form-field/error-state-matcher.ts","../../../projects/com/components/form-field/input.directive.ts","../../../projects/com/components/form-field/form-field-defaults.ts","../../../projects/com/components/form-field/form-field.component.ts","../../../projects/com/components/form-field/index.ts","../../../projects/com/components/form-field/ngx-com-components-form-field.ts"],"sourcesContent":["import type { Signal } from '@angular/core';\nimport type { NgControl } from '@angular/forms';\n\n\n/**\n * Contract that any control inside a form field must implement.\n *\n * This allows the form field to read state from any inner control\n * (input, textarea, custom controls) without knowing implementation details.\n *\n * @example Implementing for a custom phone input\n * ```ts\n * @Directive({\n * selector: 'com-phone-input',\n * providers: [{ provide: FormFieldControl, useExisting: PhoneInputComponent }],\n * })\n * export class PhoneInputComponent extends FormFieldControl<string> {\n * // ... implement all abstract members\n * }\n * ```\n */\nexport abstract class FormFieldControl<_T = unknown> {\n /** The NgControl bound to this control (if any). */\n abstract readonly ngControl: NgControl | null;\n\n /** Whether the control is focused. */\n abstract readonly focused: Signal<boolean>;\n\n /** Whether the label should float (focused or non-empty). */\n abstract readonly shouldLabelFloat: Signal<boolean>;\n\n /** Whether the control is required. */\n abstract readonly required: Signal<boolean>;\n\n /** Whether the control is disabled. */\n abstract readonly disabled: Signal<boolean>;\n\n /** Whether the control is in an error state. */\n abstract readonly errorState: Signal<boolean>;\n\n /** Unique ID for the control element. */\n abstract readonly id: Signal<string>;\n\n /** Structured validation errors (Signal Forms path). */\n readonly errors?: Signal<readonly unknown[] | null>;\n\n /** Called when the form field container is clicked. */\n abstract onContainerClick(event: MouseEvent): void;\n}\n","import { Directive, signal } from '@angular/core';\nimport type { Signal } from '@angular/core';\n\n/** Auto-incrementing ID counter. */\nlet nextId = 0;\n\n/**\n * Directive to mark the label element inside a form field.\n *\n * The form field automatically associates this label with the inner control\n * and positions it appropriately based on appearance and float state.\n *\n * The label renders as `inline-flex` so it can contain inline content such as\n * icons with tooltips. Icons inside the label are visually hidden when the\n * label floats to keep the scaled-down state clean.\n *\n * @tokens none\n *\n * @example Plain label\n * ```html\n * <com-form-field>\n * <label comLabel>Email address</label>\n * <input comInput formControlName=\"email\" />\n * </com-form-field>\n * ```\n *\n * @example Label with help icon and tooltip\n * ```html\n * <com-form-field>\n * <label comLabel>\n * User Role\n * <button type=\"button\" aria-label=\"Help\" comTooltip=\"Admins have full access.\">\n * <com-icon [img]=\"CircleHelpIcon\" size=\"xs\" color=\"muted\" />\n * </button>\n * </label>\n * <input comInput />\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comLabel]',\n exportAs: 'comLabel',\n host: {\n 'class': 'inline-flex items-center gap-1',\n '[attr.for]': 'forId()',\n '[id]': 'labelId',\n },\n})\nexport class ComLabel {\n readonly labelId: string = `com-label-${nextId++}`;\n\n private readonly _forId = signal<string | null>(null);\n readonly forId: Signal<string | null> = this._forId.asReadonly();\n\n /** Sets the `for` attribute to link to the control. Called by form field. */\n setForId(id: string): void {\n this._forId.set(id);\n }\n}\n","import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\n\nexport type FormFieldAppearance = 'fill' | 'outline';\nexport type FormFieldColor = 'primary' | 'accent' | 'warn';\nexport type FormFieldFloatLabel = 'auto' | 'always';\nexport type FormFieldSubscriptSizing = 'fixed' | 'dynamic';\n\n/**\n * CVA variants for the form field wrapper.\n *\n * @tokens `--color-foreground`\n */\nexport const formFieldVariants: (props?: {\n disabled?: boolean | null | undefined;\n}) => string = cva(\n ['com-form-field', 'relative block w-full', 'text-foreground'],\n {\n variants: {\n disabled: {\n true: 'pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\nexport type FormFieldVariants = VariantProps<typeof formFieldVariants>;\n\n/**\n * CVA variants for the input container (the bordered/filled area).\n *\n * @tokens `--color-input-border`, `--color-input-background`, `--color-primary`,\n * `--color-accent`, `--color-warn`, `--color-ring`, `--color-muted`,\n * `--color-disabled`, `--radius-input`\n */\nexport const formFieldContainerVariants: (props?: {\n appearance?: FormFieldAppearance | null | undefined;\n color?: FormFieldColor | null | undefined;\n focused?: boolean | null | undefined;\n error?: boolean | null | undefined;\n disabled?: boolean | null | undefined;\n}) => string = cva(\n [\n 'com-form-field__container',\n 'relative flex items-center',\n 'w-full min-h-11',\n 'transition-all duration-normal',\n 'rounded-input',\n ],\n {\n variants: {\n appearance: {\n outline: [\n 'border border-input-border',\n 'bg-transparent',\n 'mt-2.5', // Reserve space for floating label to prevent height jump\n ],\n fill: [\n 'rounded-b-none',\n 'bg-muted',\n 'border-b-2 border-input-border',\n ],\n },\n color: {\n primary: '',\n accent: '',\n warn: '',\n },\n focused: {\n true: '',\n false: '',\n },\n error: {\n true: '',\n false: '',\n },\n disabled: {\n true: 'bg-disabled border-disabled',\n false: '',\n },\n },\n compoundVariants: [\n // Outline + focused (no error)\n { appearance: 'outline', focused: true, error: false, class: 'border-primary ring-1 ring-primary' },\n { appearance: 'outline', focused: true, error: false, color: 'accent', class: 'border-accent ring-accent' },\n { appearance: 'outline', focused: true, error: false, color: 'warn', class: 'border-warn ring-warn' },\n // Outline + error\n { appearance: 'outline', error: true, class: 'border-warn ring-1 ring-warn' },\n // Fill + focused (no error)\n { appearance: 'fill', focused: true, error: false, class: 'border-b-primary' },\n { appearance: 'fill', focused: true, error: false, color: 'accent', class: 'border-b-accent' },\n { appearance: 'fill', focused: true, error: false, color: 'warn', class: 'border-b-warn' },\n // Fill + error\n { appearance: 'fill', error: true, class: 'border-b-warn' },\n ],\n defaultVariants: {\n appearance: 'outline',\n color: 'primary',\n focused: false,\n error: false,\n disabled: false,\n },\n }\n);\n\nexport type FormFieldContainerVariants = VariantProps<typeof formFieldContainerVariants>;\n\n/**\n * CVA variants for the floating label.\n *\n * @tokens `--color-muted-foreground`, `--color-primary`, `--color-accent`,\n * `--color-warn`, `--color-background`\n */\nexport const formFieldLabelVariants: (props?: {\n appearance?: FormFieldAppearance | null | undefined;\n floating?: boolean | null | undefined;\n color?: FormFieldColor | null | undefined;\n error?: boolean | null | undefined;\n focused?: boolean | null | undefined;\n disabled?: boolean | null | undefined;\n}) => string = cva(\n [\n 'com-form-field__label',\n 'pointer-events-none',\n 'text-muted-foreground text-sm',\n 'origin-top-left',\n 'transition-all duration-slow ease-in-out',\n ],\n {\n variants: {\n appearance: {\n outline: '',\n fill: '',\n },\n floating: {\n // Floating: absolute positioning at container border\n true: 'absolute',\n // Not floating: relative positioning in flex flow (after prefix)\n false: 'relative flex-shrink-0 pl-3',\n },\n color: {\n primary: '',\n accent: '',\n warn: '',\n },\n error: {\n true: 'text-warn',\n false: '',\n },\n focused: {\n true: '',\n false: '',\n },\n disabled: {\n true: 'text-disabled-foreground',\n false: '',\n },\n },\n compoundVariants: [\n // Outline floating (label above border with notch effect)\n {\n appearance: 'outline',\n floating: true,\n class: 'left-2 -top-2.5 scale-75 bg-background px-1',\n },\n // Fill floating\n {\n appearance: 'fill',\n floating: true,\n class: 'left-3 top-1 scale-75 text-xs',\n },\n // Focused + floating colors (no error)\n { floating: true, focused: true, error: false, color: 'primary', class: 'text-primary' },\n { floating: true, focused: true, error: false, color: 'accent', class: 'text-accent' },\n { floating: true, focused: true, error: false, color: 'warn', class: 'text-warn' },\n // Error overrides\n { floating: true, error: true, class: 'text-warn' },\n ],\n defaultVariants: {\n appearance: 'outline',\n floating: false,\n color: 'primary',\n error: false,\n focused: false,\n disabled: false,\n },\n }\n);\n\nexport type FormFieldLabelVariants = VariantProps<typeof formFieldLabelVariants>;\n\n/**\n * CVA variants for the subscript area (hints/errors).\n *\n * @tokens (inherits from children)\n */\nexport const formFieldSubscriptVariants: (props?: {\n sizing?: FormFieldSubscriptSizing | null | undefined;\n}) => string = cva(\n ['com-form-field__subscript', 'text-xs mt-1 px-3'],\n {\n variants: {\n sizing: {\n fixed: 'min-h-5',\n dynamic: 'min-h-0',\n },\n },\n defaultVariants: {\n sizing: 'fixed',\n },\n }\n);\n\nexport type FormFieldSubscriptVariants = VariantProps<typeof formFieldSubscriptVariants>;\n\n/**\n * CVA variants for hint text.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const hintVariants: () => string = cva(['com-form-field__hint', 'text-muted-foreground text-xs']);\n\n/**\n * CVA variants for error messages.\n *\n * @tokens `--color-warn`\n */\nexport const errorVariants: () => string = cva(['com-form-field__error', 'text-warn text-xs']);\n\n/**\n * CVA variants for prefix slot.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const prefixVariants: () => string = cva([\n 'com-form-field__prefix',\n 'flex items-center text-muted-foreground pl-3',\n]);\n\n/**\n * CVA variants for suffix slot.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const suffixVariants: () => string = cva([\n 'com-form-field__suffix',\n 'flex items-center text-muted-foreground pr-3',\n]);\n","import { computed, Directive, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { hintVariants } from './form-field.variants';\nimport { mergeClasses } from 'ngx-com/utils';\n\n/** Alignment of hint text in the subscript area. */\nexport type HintAlign = 'start' | 'end';\n\n/** Auto-incrementing ID counter. */\nlet nextId = 0;\n\n/**\n * Directive for hint text displayed below the form field.\n *\n * The hint provides supplementary information to help users fill out the field.\n * It is automatically added to the control's `aria-describedby`.\n *\n * @tokens `--color-muted-foreground`\n *\n * @example Basic hint\n * ```html\n * <com-form-field>\n * <label comLabel>Password</label>\n * <input comInput formControlName=\"password\" />\n * <span comHint>At least 8 characters</span>\n * </com-form-field>\n * ```\n *\n * @example Right-aligned hint (e.g., character count)\n * ```html\n * <com-form-field>\n * <label comLabel>Bio</label>\n * <textarea comInput formControlName=\"bio\"></textarea>\n * <span comHint>Keep it brief</span>\n * <span comHint align=\"end\">{{ bioLength }}/150</span>\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comHint]',\n exportAs: 'comHint',\n host: {\n '[id]': 'id',\n '[class]': 'hostClasses()',\n },\n})\nexport class ComHint {\n readonly id: string = `com-hint-${nextId++}`;\n readonly align: InputSignal<HintAlign> = input<HintAlign>('start');\n\n protected readonly hostClasses: Signal<string> = computed(() =>\n mergeClasses(hintVariants(), this.align() === 'end' && 'ml-auto')\n );\n}\n","import { computed, Directive, input, signal } from '@angular/core';\nimport type { AbstractControl } from '@angular/forms';\nimport type { InputSignal, Signal, WritableSignal } from '@angular/core';\nimport { errorVariants } from './form-field.variants';\n\n/** Auto-incrementing ID counter. */\nlet nextId = 0;\n\n/**\n * Directive for error messages displayed below the form field.\n *\n * Errors replace hints when the control is in an error state.\n * Uses `role=\"alert\"` and `aria-live=\"polite\"` for screen reader announcement.\n *\n * The optional `match` input allows showing errors only for specific validation errors.\n *\n * @tokens `--color-warn`\n *\n * @example Basic error\n * ```html\n * <com-form-field>\n * <label comLabel>Email</label>\n * <input comInput formControlName=\"email\" />\n * <span comError>Please enter a valid email</span>\n * </com-form-field>\n * ```\n *\n * @example Matching specific errors\n * ```html\n * <com-form-field>\n * <label comLabel>Email</label>\n * <input comInput formControlName=\"email\" />\n * <span comError match=\"required\">Email is required.</span>\n * <span comError match=\"email\">Must be a valid email address.</span>\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comError]',\n exportAs: 'comError',\n host: {\n '[id]': 'id',\n '[class]': 'errorVariants()',\n '[class.hidden]': '!shouldShow()',\n 'role': 'alert',\n 'aria-live': 'polite',\n },\n})\nexport class ComError {\n readonly id: string = `com-error-${nextId++}`;\n\n /** Reference to the form control (Reactive Forms path). */\n private readonly _control: WritableSignal<AbstractControl | null> = signal(null);\n\n /** Structured errors from Signal Forms. */\n private readonly _signalErrors: WritableSignal<readonly unknown[]> = signal([]);\n\n /**\n * Show this error only when a specific validation error key is present.\n * If empty, the error is always shown when the control is in error state.\n */\n readonly match: InputSignal<string> = input<string>('');\n\n protected readonly errorVariants: () => string = errorVariants;\n\n /**\n * Whether this error should be displayed based on the match condition.\n * Used by the form field to filter which errors to show.\n */\n readonly shouldShow: Signal<boolean> = computed(() => {\n const matchKey = this.match();\n if (!matchKey) return true;\n\n // Signal Forms path: match on error.kind\n const signalErrors = this._signalErrors();\n if (signalErrors.length > 0) {\n return signalErrors.some((e) => (e as { kind?: string })?.kind === matchKey);\n }\n\n // Reactive Forms path: match on AbstractControl.errors keys\n const errors = this._control()?.errors;\n return errors ? matchKey in errors : false;\n });\n\n /**\n * Sets the form control reference (Reactive Forms).\n * Called by the parent form field component.\n */\n setControl(control: AbstractControl | null): void {\n this._control.set(control);\n }\n\n /**\n * Sets structured validation errors (Signal Forms).\n * Called by the parent form field component.\n */\n setSignalErrors(errors: readonly unknown[]): void {\n this._signalErrors.set(errors);\n }\n}\n","import { Directive } from '@angular/core';\nimport { prefixVariants } from './form-field.variants';\n\n/**\n * Directive to mark content as the prefix slot in a form field.\n *\n * Prefix content appears before the input (e.g., currency symbol, icon).\n *\n * @tokens `--color-muted-foreground`\n *\n * @example Currency prefix\n * ```html\n * <com-form-field>\n * <label comLabel>Amount</label>\n * <span comPrefix>$</span>\n * <input comInput type=\"number\" formControlName=\"amount\" />\n * </com-form-field>\n * ```\n *\n * @example Icon prefix\n * ```html\n * <com-form-field>\n * <label comLabel>Search</label>\n * <svg comPrefix class=\"size-4\">...</svg>\n * <input comInput formControlName=\"query\" />\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comPrefix]',\n exportAs: 'comPrefix',\n host: {\n '[class]': 'prefixVariants()',\n },\n})\nexport class ComPrefix {\n protected readonly prefixVariants: () => string = prefixVariants;\n}\n","import { Directive } from '@angular/core';\nimport { suffixVariants } from './form-field.variants';\n\n/**\n * Directive to mark content as the suffix slot in a form field.\n *\n * Suffix content appears after the input (e.g., unit, clear button, visibility toggle).\n *\n * @tokens `--color-muted-foreground`\n *\n * @example Unit suffix\n * ```html\n * <com-form-field>\n * <label comLabel>Weight</label>\n * <input comInput type=\"number\" formControlName=\"weight\" />\n * <span comSuffix>kg</span>\n * </com-form-field>\n * ```\n *\n * @example Clear button suffix\n * ```html\n * <com-form-field>\n * <label comLabel>Search</label>\n * <input comInput formControlName=\"query\" />\n * <button comSuffix type=\"button\" (click)=\"clearSearch()\">\n * <svg class=\"size-4\">...</svg>\n * </button>\n * </com-form-field>\n * ```\n *\n * @example Password visibility toggle\n * ```html\n * <com-form-field>\n * <label comLabel>Password</label>\n * <input comInput [type]=\"showPassword ? 'text' : 'password'\" formControlName=\"password\" />\n * <button comSuffix type=\"button\" (click)=\"showPassword = !showPassword\">\n * <svg class=\"size-4\">...</svg>\n * </button>\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comSuffix]',\n exportAs: 'comSuffix',\n host: {\n '[class]': 'suffixVariants()',\n },\n})\nexport class ComSuffix {\n protected readonly suffixVariants: () => string = suffixVariants;\n}\n","import { Injectable } from '@angular/core';\nimport type { AbstractControl, FormGroupDirective, NgForm } from '@angular/forms';\n\n/**\n * Strategy for determining when to display errors in a form field.\n *\n * The default behavior shows errors when the control is invalid AND\n * either touched OR the parent form has been submitted.\n *\n * @example Override globally with eager error display\n * ```ts\n * @Injectable()\n * export class EagerErrorStateMatcher extends ErrorStateMatcher {\n * override isErrorState(control: AbstractControl | null): boolean {\n * return !!(control?.invalid && control.dirty);\n * }\n * }\n *\n * // In app config\n * providers: [{ provide: ErrorStateMatcher, useClass: EagerErrorStateMatcher }]\n * ```\n *\n * @example Per-field override\n * ```html\n * <com-form-field>\n * <input comInput [errorStateMatcher]=\"eagerMatcher\" />\n * </com-form-field>\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ErrorStateMatcher {\n isErrorState(\n control: AbstractControl | null,\n form: FormGroupDirective | NgForm | null\n ): boolean {\n return !!(control?.invalid && (control.touched || form?.submitted));\n }\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport type { DoCheck, InputSignal, InputSignalWithTransform, OnInit, Signal, WritableSignal } from '@angular/core';\n\nimport { FormGroupDirective, NgControl, NgForm } from '@angular/forms';\nimport { AutofillMonitor } from '@angular/cdk/text-field';\nimport { FormFieldControl } from './form-field-control';\nimport { ErrorStateMatcher } from './error-state-matcher';\nimport type { FormFieldAppearance } from './form-field-defaults';\n\n/** Auto-incrementing ID counter. */\nlet nextId = 0;\n\n/**\n * Directive applied to native `<input>` and `<textarea>` elements to bridge\n * them to the form field wrapper. Implements the `FormFieldControl` contract.\n *\n * This directive does NOT implement `ControlValueAccessor` - it relies on\n * Angular's built-in value accessors (`DefaultValueAccessor`, `NumberValueAccessor`, etc.)\n * that are already applied to native elements with `formControlName` or `ngModel`.\n *\n * Instead, this directive reports state (focused, empty, disabled, error) to the\n * parent form field for proper visual presentation.\n *\n * @tokens (styling is controlled by the parent form field)\n *\n * @example Basic usage\n * ```html\n * <com-form-field>\n * <label comLabel>Email</label>\n * <input comInput formControlName=\"email\" placeholder=\"you@example.com\" />\n * </com-form-field>\n * ```\n *\n * @example Textarea\n * ```html\n * <com-form-field>\n * <label comLabel>Description</label>\n * <textarea comInput formControlName=\"description\"></textarea>\n * </com-form-field>\n * ```\n *\n * @example Custom error state matcher\n * ```html\n * <com-form-field>\n * <label comLabel>Code</label>\n * <input comInput formControlName=\"code\" [errorStateMatcher]=\"eagerMatcher\" />\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: 'input[comInput], textarea[comInput]',\n exportAs: 'comInput',\n providers: [{ provide: FormFieldControl, useExisting: forwardRef(() => ComInput) }],\n host: {\n '[id]': 'id()',\n '[disabled]': 'disabled()',\n '[required]': 'required()',\n '[attr.aria-invalid]': 'errorState() || null',\n '[attr.aria-required]': 'required() || null',\n '[attr.aria-describedby]': 'ariaDescribedBy() || null',\n '[class]': 'hostClasses()',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(input)': 'onInput()',\n },\n})\nexport class ComInput implements FormFieldControl<string>, OnInit, DoCheck {\n private readonly elementRef: ElementRef<HTMLInputElement | HTMLTextAreaElement> = inject(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly autofillMonitor = inject(AutofillMonitor);\n private readonly defaultErrorStateMatcher = inject(ErrorStateMatcher);\n private readonly parentForm = inject(NgForm, { optional: true });\n private readonly parentFormGroup = inject(FormGroupDirective, { optional: true });\n\n /** NgControl bound to this input (if using reactive forms). */\n readonly ngControl: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n // Inputs\n readonly inputId: InputSignal<string | undefined> = input<string>(undefined, { alias: 'id' });\n readonly inputDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n readonly inputRequired: InputSignalWithTransform<boolean, unknown> = input(false, {\n alias: 'required',\n transform: booleanAttribute,\n });\n readonly userAriaDescribedBy: InputSignal<string> = input<string>('', { alias: 'aria-describedby' });\n readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined> = input<ErrorStateMatcher>();\n\n // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives\n readonly sfInvalid: InputSignal<boolean> = input(false, { alias: 'invalid' });\n readonly sfTouched: InputSignalWithTransform<boolean, unknown> = input(false, {\n alias: 'touched',\n transform: booleanAttribute,\n });\n readonly sfErrors: InputSignal<readonly unknown[]> = input<readonly unknown[]>([], {\n alias: 'errors',\n });\n\n /** Whether the form system is Signal Forms (no NgControl present). */\n private readonly isSignalForms: boolean = !this.ngControl;\n\n // Internal state\n private readonly _focused = signal(false);\n private readonly _autofilled = signal(false);\n private readonly _empty = signal(true);\n private readonly _uniqueId: string = `com-input-${nextId++}`;\n private readonly _appearance: WritableSignal<FormFieldAppearance> = signal<FormFieldAppearance>('outline');\n private _previousNativeValue: string = '';\n\n // Public signals implementing FormFieldControl\n readonly focused: Signal<boolean> = this._focused.asReadonly();\n\n readonly id: Signal<string> = computed(() => this.inputId() ?? this._uniqueId);\n\n readonly shouldLabelFloat: Signal<boolean> = computed(() => {\n return this._focused() || !this._empty() || this._autofilled();\n });\n\n readonly disabled: Signal<boolean> = computed(() => {\n if (this.inputDisabled()) return true;\n return this.ngControl?.control?.disabled ?? false;\n });\n\n readonly required: Signal<boolean> = computed(() => {\n if (this.inputRequired()) return true;\n const control = this.ngControl?.control;\n if (control?.validator) {\n const result = control.validator({ value: '' } as never);\n return result?.['required'] !== undefined;\n }\n return false;\n });\n\n readonly errorState: Signal<boolean> = computed(() => {\n if (this.isSignalForms) {\n // Signal Forms: gate on both invalid AND touched — mirrors ErrorStateMatcher default.\n // Signal Forms' invalid is pure validation state (not gated by touched).\n return this.sfInvalid() && this.sfTouched();\n }\n // Reactive Forms: use ErrorStateMatcher (existing logic)\n this._focused();\n this._empty();\n const matcher = this.errorStateMatcher() ?? this.defaultErrorStateMatcher;\n const form = this.parentFormGroup ?? this.parentForm;\n return matcher.isErrorState(this.ngControl?.control ?? null, form);\n });\n\n /** Structured validation errors from Signal Forms, exposed for the parent form field. */\n readonly errors: Signal<readonly unknown[] | null> = computed(() =>\n this.isSignalForms ? this.sfErrors() : null\n );\n\n /** Combined aria-describedby including user-provided and form-field-generated IDs. */\n private readonly _describedByIds = signal('');\n\n readonly ariaDescribedBy: Signal<string> = computed(() => {\n const userIds = this.userAriaDescribedBy();\n const fieldIds = this._describedByIds();\n return [userIds, fieldIds].filter(Boolean).join(' ');\n });\n\n /** Computed host classes including appearance-based padding. */\n protected readonly hostClasses: Signal<string> = computed(() => {\n const base =\n 'peer w-full bg-transparent text-foreground placeholder:text-input-placeholder outline-none border-none disabled:cursor-not-allowed disabled:text-disabled-foreground px-3';\n const padding = this._appearance() === 'fill' ? 'pt-5 pb-1.5' : 'py-2.5';\n return `${base} ${padding}`;\n });\n\n ngOnInit(): void {\n this._previousNativeValue = this.elementRef.nativeElement.value;\n this.updateEmpty();\n\n const autofillSub = this.autofillMonitor.monitor(this.elementRef).subscribe((event) => {\n this._autofilled.set(event.isAutofilled);\n });\n\n this.destroyRef.onDestroy(() => {\n autofillSub.unsubscribe();\n this.autofillMonitor.stopMonitoring(this.elementRef);\n });\n }\n\n ngDoCheck(): void {\n this.dirtyCheckNativeValue();\n }\n\n private dirtyCheckNativeValue(): void {\n const newValue = this.elementRef.nativeElement.value;\n if (this._previousNativeValue !== newValue) {\n this._previousNativeValue = newValue;\n this.updateEmpty();\n }\n }\n\n protected onFocus(): void {\n this._focused.set(true);\n }\n\n protected onBlur(): void {\n this._focused.set(false);\n }\n\n protected onInput(): void {\n this.updateEmpty();\n }\n\n private updateEmpty(): void {\n this._empty.set(!this.elementRef.nativeElement.value);\n }\n\n // FormFieldControl methods\n onContainerClick(event: MouseEvent): void {\n if (!this.disabled() && event.target !== this.elementRef.nativeElement) {\n this.elementRef.nativeElement.focus();\n }\n }\n\n /**\n * Sets the describedBy IDs from the form field.\n * Called by the parent form field component.\n */\n setDescribedByIds(ids: string): void {\n this._describedByIds.set(ids);\n }\n\n /**\n * Sets the appearance for styling.\n * Called by the parent form field component.\n */\n setAppearance(appearance: FormFieldAppearance): void {\n this._appearance.set(appearance);\n }\n\n /** Focus the native element. */\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type {\n FormFieldAppearance,\n FormFieldColor,\n FormFieldFloatLabel,\n FormFieldSubscriptSizing,\n} from './form-field.variants';\n\n// Re-export types for convenience\nexport type { FormFieldAppearance, FormFieldColor, FormFieldFloatLabel, FormFieldSubscriptSizing };\n\n/**\n * Global configuration defaults for form fields.\n *\n * @example Set defaults in app config\n * ```ts\n * providers: [\n * {\n * provide: FORM_FIELD_DEFAULTS,\n * useValue: {\n * appearance: 'fill',\n * floatLabel: 'always',\n * color: 'primary',\n * }\n * }\n * ]\n * ```\n */\nexport interface FormFieldDefaults {\n appearance?: FormFieldAppearance;\n color?: FormFieldColor;\n floatLabel?: FormFieldFloatLabel;\n hideRequiredMarker?: boolean;\n subscriptSizing?: FormFieldSubscriptSizing;\n}\n\nexport const FORM_FIELD_DEFAULTS: InjectionToken<FormFieldDefaults> = new InjectionToken<FormFieldDefaults>(\n 'FORM_FIELD_DEFAULTS',\n {\n providedIn: 'root',\n factory: (): FormFieldDefaults => ({}),\n }\n);\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { FormFieldControl } from './form-field-control';\nimport { ComLabel } from './label.directive';\nimport { ComHint } from './hint.directive';\nimport { ComError } from './error.directive';\nimport { ComPrefix } from './prefix.directive';\nimport { ComSuffix } from './suffix.directive';\nimport { ComInput } from './input.directive';\nimport {\n FORM_FIELD_DEFAULTS,\n type FormFieldAppearance,\n type FormFieldColor,\n type FormFieldFloatLabel,\n type FormFieldSubscriptSizing,\n} from './form-field-defaults';\nimport {\n formFieldVariants,\n formFieldContainerVariants,\n formFieldLabelVariants,\n formFieldSubscriptVariants,\n} from './form-field.variants';\nimport { mergeClasses } from 'ngx-com/utils';\n\n/**\n * Form field wrapper providing visual structure for form inputs.\n *\n * Provides floating labels, borders (outline/fill appearance), hints, errors,\n * and prefix/suffix slots. Automatically wires ARIA attributes for accessibility.\n *\n * The form field reads state from its inner `FormFieldControl` child (typically\n * a `ComInput` directive) and renders UI accordingly.\n *\n * @tokens `--color-foreground`, `--color-input-border`, `--color-input-background`,\n * `--color-primary`, `--color-accent`, `--color-warn`, `--color-ring`,\n * `--color-muted`, `--color-muted-foreground`, `--color-disabled`,\n * `--color-disabled-foreground`, `--color-background`, `--radius-input`\n *\n * @example Basic outline field\n * ```html\n * <com-form-field>\n * <label comLabel>Email</label>\n * <input comInput formControlName=\"email\" />\n * <span comHint>We'll never share your email.</span>\n * <span comError match=\"required\">Email is required.</span>\n * </com-form-field>\n * ```\n *\n * @example Fill appearance\n * ```html\n * <com-form-field appearance=\"fill\">\n * <label comLabel>Username</label>\n * <input comInput formControlName=\"username\" />\n * </com-form-field>\n * ```\n *\n * @example With prefix and suffix\n * ```html\n * <com-form-field>\n * <label comLabel>Amount</label>\n * <span comPrefix>$</span>\n * <input comInput type=\"number\" formControlName=\"amount\" />\n * <span comSuffix>.00</span>\n * </com-form-field>\n * ```\n *\n * @example Label with icon and tooltip\n * ```html\n * <com-form-field>\n * <label comLabel>\n * User Role\n * <button type=\"button\" aria-label=\"Help\" comTooltip=\"Admins have full access.\">\n * <com-icon [img]=\"CircleHelpIcon\" size=\"xs\" color=\"muted\" />\n * </button>\n * </label>\n * <input comInput />\n * </com-form-field>\n * ```\n */\n@Component({\n selector: 'com-form-field',\n exportAs: 'comFormField',\n template: `\n <div [class]=\"containerClasses()\" role=\"group\" tabindex=\"-1\" (click)=\"onContainerClick($event)\" (keydown.enter)=\"onContainerActivate()\">\n <div class=\"flex items-center w-full\">\n @if (hasPrefix()) {\n <ng-content select=\"[comPrefix]\" />\n }\n @if (labelChild()) {\n <span [class]=\"labelClasses()\">\n <ng-content select=\"[comLabel]\" />\n @if (showRequiredMarker()) {\n <span class=\"text-warn\" aria-hidden=\"true\"> *</span>\n }\n </span>\n }\n <div class=\"flex-1 min-w-0\">\n <ng-content />\n </div>\n @if (hasSuffix()) {\n <ng-content select=\"[comSuffix]\" />\n }\n </div>\n </div>\n\n <div [class]=\"subscriptClasses()\">\n <div [class.hidden]=\"!showErrors()\">\n <ng-content select=\"[comError]\" />\n </div>\n <div [class.hidden]=\"showErrors()\" class=\"flex justify-between w-full gap-2\">\n <ng-content select=\"[comHint]:not([align='end'])\" />\n <ng-content select=\"[comHint][align='end']\" />\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styles: `\n /* Hide placeholder when label exists and is not floating (label acts as placeholder) */\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) input::placeholder,\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) textarea::placeholder {\n color: transparent;\n }\n\n /* Hide dropdown placeholder when label exists and is not floating */\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-dropdown .text-placeholder {\n display: none;\n }\n\n /* Make nested controls fill available space inside form-field */\n com-form-field com-dropdown,\n com-form-field com-datepicker,\n com-form-field com-date-range-picker,\n com-form-field com-time-picker {\n display: block;\n width: 100%;\n }\n\n /* Hide datepicker/date-range placeholder when label exists and is not floating */\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-datepicker input::placeholder,\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-date-range-picker input::placeholder {\n color: transparent;\n }\n\n /* Hide time picker separators and period button when label is not floating */\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-time-picker span[aria-hidden],\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-time-picker button {\n visibility: hidden;\n }\n\n /* Re-enable pointer events on tooltip icons inside the label */\n com-form-field .com-form-field__label [comtooltip] {\n pointer-events: auto;\n cursor: help;\n }\n\n /* Visually hide icons inside label when floating to keep the scaled label clean */\n com-form-field.com-form-field--floating .com-form-field__label com-icon {\n visibility: hidden;\n width: 0;\n overflow: hidden;\n }\n `,\n host: {\n '[class]': 'hostClasses()',\n '[class.com-form-field--focused]': 'isFocused()',\n '[class.com-form-field--disabled]': 'isDisabled()',\n '[class.com-form-field--error]': 'hasError()',\n '[class.com-form-field--floating]': 'shouldLabelFloat()',\n '[class.com-form-field--has-label]': '!!labelChild()',\n },\n})\nexport class ComFormField {\n private readonly defaults = inject(FORM_FIELD_DEFAULTS, { optional: true });\n\n // Content children\n readonly control: Signal<FormFieldControl | undefined> = contentChild<FormFieldControl>(FormFieldControl);\n readonly inputDirective: Signal<ComInput | undefined> = contentChild<ComInput>(ComInput);\n readonly labelChild: Signal<ComLabel | undefined> = contentChild<ComLabel>(ComLabel);\n readonly hintChildren: Signal<readonly ComHint[]> = contentChildren<ComHint>(ComHint);\n readonly errorChildren: Signal<readonly ComError[]> = contentChildren<ComError>(ComError);\n readonly prefixChild: Signal<ComPrefix | undefined> = contentChild<ComPrefix>(ComPrefix);\n readonly suffixChild: Signal<ComSuffix | undefined> = contentChild<ComSuffix>(ComSuffix);\n\n // Inputs with defaults fallback\n readonly appearance: InputSignal<FormFieldAppearance> = input<FormFieldAppearance>(\n this.defaults?.appearance ?? 'outline'\n );\n readonly color: InputSignal<FormFieldColor> = input<FormFieldColor>(this.defaults?.color ?? 'primary');\n readonly floatLabel: InputSignal<FormFieldFloatLabel> = input<FormFieldFloatLabel>(\n this.defaults?.floatLabel ?? 'auto'\n );\n readonly hideRequiredMarker: InputSignalWithTransform<boolean, unknown> = input(\n this.defaults?.hideRequiredMarker ?? false,\n { transform: booleanAttribute }\n );\n readonly subscriptSizing: InputSignal<FormFieldSubscriptSizing> = input<FormFieldSubscriptSizing>(\n this.defaults?.subscriptSizing ?? 'fixed'\n );\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n // Derived state from inner control\n readonly shouldLabelFloat: Signal<boolean> = computed(() => {\n if (this.floatLabel() === 'always') return true;\n return this.control()?.shouldLabelFloat() ?? false;\n });\n\n readonly isFocused: Signal<boolean> = computed(() => this.control()?.focused() ?? false);\n readonly isDisabled: Signal<boolean> = computed(() => this.control()?.disabled() ?? false);\n readonly hasError: Signal<boolean> = computed(() => this.control()?.errorState() ?? false);\n readonly hasPrefix: Signal<boolean> = computed(() => !!this.prefixChild());\n readonly hasSuffix: Signal<boolean> = computed(() => !!this.suffixChild());\n\n readonly showRequiredMarker: Signal<boolean> = computed(() => {\n if (this.hideRequiredMarker()) return false;\n return this.control()?.required() ?? false;\n });\n\n readonly showErrors: Signal<boolean> = computed(() => this.hasError() && this.errorChildren().length > 0);\n\n // Computed classes\n protected readonly hostClasses: Signal<string> = computed(() =>\n mergeClasses(formFieldVariants({ disabled: this.isDisabled() }), this.userClass())\n );\n\n protected readonly containerClasses: Signal<string> = computed(() =>\n formFieldContainerVariants({\n appearance: this.appearance(),\n color: this.color(),\n focused: this.isFocused(),\n error: this.hasError(),\n disabled: this.isDisabled(),\n })\n );\n\n protected readonly labelClasses: Signal<string> = computed(() =>\n formFieldLabelVariants({\n appearance: this.appearance(),\n floating: this.shouldLabelFloat(),\n color: this.color(),\n error: this.hasError(),\n focused: this.isFocused(),\n disabled: this.isDisabled(),\n })\n );\n\n protected readonly subscriptClasses: Signal<string> = computed(() =>\n formFieldSubscriptVariants({ sizing: this.subscriptSizing() })\n );\n\n constructor() {\n // Wire up label to control\n effect(() => {\n const label = this.labelChild();\n const ctrl = this.control();\n if (label && ctrl) {\n label.setForId(ctrl.id());\n }\n });\n\n // Wire up aria-describedby on the control\n effect(() => {\n const ctrl = this.control();\n if (!ctrl || !('setDescribedByIds' in ctrl)) return;\n\n const ids = this.showErrors()\n ? this.errorChildren().filter((e) => e.shouldShow()).map((e) => e.id)\n : this.hintChildren().map((h) => h.id);\n (ctrl as { setDescribedByIds: (ids: string) => void }).setDescribedByIds(ids.join(' '));\n });\n\n // Wire up appearance to control for proper styling\n effect(() => {\n const ctrl = this.control();\n if (ctrl && 'setAppearance' in ctrl) {\n (ctrl as { setAppearance: (appearance: FormFieldAppearance) => void }).setAppearance(this.appearance());\n }\n });\n\n // Wire up control reference to error directives (re-runs on error state change)\n effect(() => {\n // Read hasError to trigger re-evaluation when validation state changes\n this.hasError();\n const ctrl = this.control();\n if (!ctrl) return;\n\n const errors = ctrl.errors?.() ?? null;\n if (errors !== null) {\n // Signal Forms path: pass structured errors to each comError\n this.errorChildren().forEach((error) => error.setSignalErrors(errors as readonly unknown[]));\n } else {\n // Reactive Forms path: pass AbstractControl reference\n const ngControl = ctrl.ngControl?.control ?? null;\n this.errorChildren().forEach((error) => error.setControl(ngControl));\n }\n });\n }\n\n protected onContainerClick(event: MouseEvent): void {\n this.control()?.onContainerClick(event);\n }\n\n protected onContainerActivate(): void {\n this.control()?.onContainerClick(new MouseEvent('click'));\n }\n}\n","// Public API for the form-field component\n\n// Main component\nexport { ComFormField } from './form-field.component';\n\n// Directives\nexport { ComInput } from './input.directive';\nexport { ComLabel } from './label.directive';\nexport { ComHint, type HintAlign } from './hint.directive';\nexport { ComError } from './error.directive';\nexport { ComPrefix } from './prefix.directive';\nexport { ComSuffix } from './suffix.directive';\n\n// Abstract class for custom controls\nexport { FormFieldControl } from './form-field-control';\n\n// Error state matching\nexport { ErrorStateMatcher } from './error-state-matcher';\n\n// Configuration\nexport {\n FORM_FIELD_DEFAULTS,\n type FormFieldDefaults,\n type FormFieldAppearance,\n type FormFieldColor,\n type FormFieldFloatLabel,\n type FormFieldSubscriptSizing,\n} from './form-field-defaults';\n\n// Variants (for advanced customization)\nexport {\n formFieldVariants,\n formFieldContainerVariants,\n formFieldLabelVariants,\n formFieldSubscriptVariants,\n hintVariants,\n errorVariants,\n prefixVariants,\n suffixVariants,\n type FormFieldVariants,\n type FormFieldContainerVariants,\n type FormFieldLabelVariants,\n type FormFieldSubscriptVariants,\n} from './form-field.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["nextId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-com-components-form-field.mjs","sources":["../../../projects/com/components/form-field/form-field-control.ts","../../../projects/com/components/form-field/label.directive.ts","../../../projects/com/components/form-field/form-field.variants.ts","../../../projects/com/components/form-field/hint.directive.ts","../../../projects/com/components/form-field/error.directive.ts","../../../projects/com/components/form-field/prefix.directive.ts","../../../projects/com/components/form-field/suffix.directive.ts","../../../projects/com/components/form-field/error-state-matcher.ts","../../../projects/com/components/form-field/input.directive.ts","../../../projects/com/components/form-field/form-field-defaults.ts","../../../projects/com/components/form-field/form-field.component.ts","../../../projects/com/components/form-field/index.ts","../../../projects/com/components/form-field/ngx-com-components-form-field.ts"],"sourcesContent":["import type { Signal } from '@angular/core';\nimport type { NgControl } from '@angular/forms';\n\n\n/**\n * Contract that any control inside a form field must implement.\n *\n * This allows the form field to read state from any inner control\n * (input, textarea, custom controls) without knowing implementation details.\n *\n * @example Implementing for a custom phone input\n * ```ts\n * @Directive({\n * selector: 'com-phone-input',\n * providers: [{ provide: FormFieldControl, useExisting: PhoneInputComponent }],\n * })\n * export class PhoneInputComponent extends FormFieldControl<string> {\n * // ... implement all abstract members\n * }\n * ```\n */\nexport abstract class FormFieldControl<_T = unknown> {\n /** The NgControl bound to this control (if any). */\n abstract readonly ngControl: NgControl | null;\n\n /** Whether the control is focused. */\n abstract readonly focused: Signal<boolean>;\n\n /** Whether the label should float (focused or non-empty). */\n abstract readonly shouldLabelFloat: Signal<boolean>;\n\n /** Whether the control is required. */\n abstract readonly required: Signal<boolean>;\n\n /** Whether the control is disabled. */\n abstract readonly disabled: Signal<boolean>;\n\n /** Whether the control is in an error state. */\n abstract readonly errorState: Signal<boolean>;\n\n /** Unique ID for the control element. */\n abstract readonly id: Signal<string>;\n\n /** Structured validation errors (Signal Forms path). */\n readonly errors?: Signal<readonly unknown[] | null>;\n\n /** Called when the form field container is clicked. */\n abstract onContainerClick(event: MouseEvent): void;\n}\n","import { Directive, signal } from '@angular/core';\nimport type { Signal } from '@angular/core';\n\n/** Auto-incrementing ID counter. */\nlet nextId = 0;\n\n/**\n * Directive to mark the label element inside a form field.\n *\n * The form field automatically associates this label with the inner control\n * and positions it appropriately based on appearance and float state.\n *\n * The label renders as `inline-flex` so it can contain inline content such as\n * icons with tooltips. Icons inside the label are visually hidden when the\n * label floats to keep the scaled-down state clean.\n *\n * @tokens none\n *\n * @example Plain label\n * ```html\n * <com-form-field>\n * <label comLabel>Email address</label>\n * <input comInput formControlName=\"email\" />\n * </com-form-field>\n * ```\n *\n * @example Label with help icon and tooltip\n * ```html\n * <com-form-field>\n * <label comLabel>\n * User Role\n * <button type=\"button\" aria-label=\"Help\" comTooltip=\"Admins have full access.\">\n * <com-icon [img]=\"CircleHelpIcon\" size=\"xs\" color=\"muted\" />\n * </button>\n * </label>\n * <input comInput />\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comLabel]',\n exportAs: 'comLabel',\n host: {\n 'class': 'inline-flex items-center gap-1',\n '[attr.for]': 'forId()',\n '[id]': 'labelId',\n },\n})\nexport class ComLabel {\n readonly labelId: string = `com-label-${nextId++}`;\n\n private readonly _forId = signal<string | null>(null);\n readonly forId: Signal<string | null> = this._forId.asReadonly();\n\n /** Sets the `for` attribute to link to the control. Called by form field. */\n setForId(id: string): void {\n this._forId.set(id);\n }\n}\n","import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\n\nexport type FormFieldAppearance = 'fill' | 'outline';\nexport type FormFieldColor = 'primary' | 'accent' | 'warn';\nexport type FormFieldFloatLabel = 'auto' | 'always';\nexport type FormFieldSubscriptSizing = 'fixed' | 'dynamic';\n\n/**\n * CVA variants for the form field wrapper.\n *\n * @tokens `--color-foreground`\n */\nexport const formFieldVariants: (props?: {\n disabled?: boolean | null | undefined;\n}) => string = cva(\n ['com-form-field', 'relative block w-full', 'text-foreground'],\n {\n variants: {\n disabled: {\n true: 'pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\nexport type FormFieldVariants = VariantProps<typeof formFieldVariants>;\n\n/**\n * CVA variants for the input container (the bordered/filled area).\n *\n * @tokens `--color-input-border`, `--color-input-background`, `--color-primary`,\n * `--color-accent`, `--color-warn`, `--color-ring`, `--color-muted`,\n * `--color-disabled`, `--radius-input`\n */\nexport const formFieldContainerVariants: (props?: {\n appearance?: FormFieldAppearance | null | undefined;\n color?: FormFieldColor | null | undefined;\n focused?: boolean | null | undefined;\n error?: boolean | null | undefined;\n disabled?: boolean | null | undefined;\n}) => string = cva(\n [\n 'com-form-field__container',\n 'relative flex items-center',\n 'w-full min-h-11',\n 'transition-all duration-normal',\n 'rounded-input',\n ],\n {\n variants: {\n appearance: {\n outline: [\n 'border border-input-border',\n 'bg-transparent',\n 'mt-2.5', // Reserve space for floating label to prevent height jump\n ],\n fill: [\n 'rounded-b-none',\n 'bg-muted',\n 'border-b-2 border-input-border',\n ],\n },\n color: {\n primary: '',\n accent: '',\n warn: '',\n },\n focused: {\n true: '',\n false: '',\n },\n error: {\n true: '',\n false: '',\n },\n disabled: {\n true: 'bg-disabled border-disabled',\n false: '',\n },\n },\n compoundVariants: [\n // Outline + focused (no error)\n { appearance: 'outline', focused: true, error: false, class: 'border-primary ring-1 ring-primary' },\n { appearance: 'outline', focused: true, error: false, color: 'accent', class: 'border-accent ring-accent' },\n { appearance: 'outline', focused: true, error: false, color: 'warn', class: 'border-warn ring-warn' },\n // Outline + error\n { appearance: 'outline', error: true, class: 'border-warn ring-1 ring-warn' },\n // Fill + focused (no error)\n { appearance: 'fill', focused: true, error: false, class: 'border-b-primary' },\n { appearance: 'fill', focused: true, error: false, color: 'accent', class: 'border-b-accent' },\n { appearance: 'fill', focused: true, error: false, color: 'warn', class: 'border-b-warn' },\n // Fill + error\n { appearance: 'fill', error: true, class: 'border-b-warn' },\n ],\n defaultVariants: {\n appearance: 'outline',\n color: 'primary',\n focused: false,\n error: false,\n disabled: false,\n },\n }\n);\n\nexport type FormFieldContainerVariants = VariantProps<typeof formFieldContainerVariants>;\n\n/**\n * CVA variants for the floating label.\n *\n * @tokens `--color-muted-foreground`, `--color-primary`, `--color-accent`,\n * `--color-warn`, `--color-background`\n */\nexport const formFieldLabelVariants: (props?: {\n appearance?: FormFieldAppearance | null | undefined;\n floating?: boolean | null | undefined;\n color?: FormFieldColor | null | undefined;\n error?: boolean | null | undefined;\n focused?: boolean | null | undefined;\n disabled?: boolean | null | undefined;\n}) => string = cva(\n [\n 'com-form-field__label',\n 'pointer-events-none',\n 'text-muted-foreground text-sm',\n 'origin-top-left',\n 'transition-all duration-slow ease-in-out',\n ],\n {\n variants: {\n appearance: {\n outline: '',\n fill: '',\n },\n floating: {\n // Floating: absolute positioning at container border\n true: 'absolute',\n // Not floating: relative positioning in flex flow (after prefix)\n false: 'relative flex-shrink-0 pl-3',\n },\n color: {\n primary: '',\n accent: '',\n warn: '',\n },\n error: {\n true: 'text-warn',\n false: '',\n },\n focused: {\n true: '',\n false: '',\n },\n disabled: {\n true: 'text-disabled-foreground',\n false: '',\n },\n },\n compoundVariants: [\n // Outline floating (label above border with notch effect)\n {\n appearance: 'outline',\n floating: true,\n class: 'left-2 -top-2.5 scale-75 bg-background px-1',\n },\n // Fill floating\n {\n appearance: 'fill',\n floating: true,\n class: 'left-3 top-1 scale-75 text-xs',\n },\n // Focused + floating colors (no error)\n { floating: true, focused: true, error: false, color: 'primary', class: 'text-primary' },\n { floating: true, focused: true, error: false, color: 'accent', class: 'text-accent' },\n { floating: true, focused: true, error: false, color: 'warn', class: 'text-warn' },\n // Error overrides\n { floating: true, error: true, class: 'text-warn' },\n ],\n defaultVariants: {\n appearance: 'outline',\n floating: false,\n color: 'primary',\n error: false,\n focused: false,\n disabled: false,\n },\n }\n);\n\nexport type FormFieldLabelVariants = VariantProps<typeof formFieldLabelVariants>;\n\n/**\n * CVA variants for the subscript area (hints/errors).\n *\n * @tokens (inherits from children)\n */\nexport const formFieldSubscriptVariants: (props?: {\n sizing?: FormFieldSubscriptSizing | null | undefined;\n}) => string = cva(\n ['com-form-field__subscript', 'text-xs mt-1 px-3'],\n {\n variants: {\n sizing: {\n fixed: 'min-h-5',\n dynamic: 'min-h-0',\n },\n },\n defaultVariants: {\n sizing: 'fixed',\n },\n }\n);\n\nexport type FormFieldSubscriptVariants = VariantProps<typeof formFieldSubscriptVariants>;\n\n/**\n * CVA variants for hint text.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const hintVariants: () => string = cva(['com-form-field__hint', 'text-muted-foreground text-xs']);\n\n/**\n * CVA variants for error messages.\n *\n * @tokens `--color-warn`\n */\nexport const errorVariants: () => string = cva(['com-form-field__error', 'text-warn text-xs']);\n\n/**\n * CVA variants for prefix slot.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const prefixVariants: () => string = cva([\n 'com-form-field__prefix',\n 'flex items-center text-muted-foreground pl-3',\n]);\n\n/**\n * CVA variants for suffix slot.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const suffixVariants: () => string = cva([\n 'com-form-field__suffix',\n 'flex items-center text-muted-foreground pr-3',\n]);\n","import { computed, Directive, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { hintVariants } from './form-field.variants';\nimport { mergeClasses } from 'ngx-com/utils';\n\n/** Alignment of hint text in the subscript area. */\nexport type HintAlign = 'start' | 'end';\n\n/** Auto-incrementing ID counter. */\nlet nextId = 0;\n\n/**\n * Directive for hint text displayed below the form field.\n *\n * The hint provides supplementary information to help users fill out the field.\n * It is automatically added to the control's `aria-describedby`.\n *\n * @tokens `--color-muted-foreground`\n *\n * @example Basic hint\n * ```html\n * <com-form-field>\n * <label comLabel>Password</label>\n * <input comInput formControlName=\"password\" />\n * <span comHint>At least 8 characters</span>\n * </com-form-field>\n * ```\n *\n * @example Right-aligned hint (e.g., character count)\n * ```html\n * <com-form-field>\n * <label comLabel>Bio</label>\n * <textarea comInput formControlName=\"bio\"></textarea>\n * <span comHint>Keep it brief</span>\n * <span comHint align=\"end\">{{ bioLength }}/150</span>\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comHint]',\n exportAs: 'comHint',\n host: {\n '[id]': 'id',\n '[class]': 'hostClasses()',\n },\n})\nexport class ComHint {\n readonly id: string = `com-hint-${nextId++}`;\n readonly align: InputSignal<HintAlign> = input<HintAlign>('start');\n\n protected readonly hostClasses: Signal<string> = computed(() =>\n mergeClasses(hintVariants(), this.align() === 'end' && 'ml-auto')\n );\n}\n","import { computed, Directive, input, signal } from '@angular/core';\nimport type { AbstractControl } from '@angular/forms';\nimport type { InputSignal, Signal, WritableSignal } from '@angular/core';\nimport { errorVariants } from './form-field.variants';\n\n/** Auto-incrementing ID counter. */\nlet nextId = 0;\n\n/**\n * Directive for error messages displayed below the form field.\n *\n * Errors replace hints when the control is in an error state.\n * Uses `role=\"alert\"` and `aria-live=\"polite\"` for screen reader announcement.\n *\n * The optional `match` input allows showing errors only for specific validation errors.\n *\n * @tokens `--color-warn`\n *\n * @example Basic error\n * ```html\n * <com-form-field>\n * <label comLabel>Email</label>\n * <input comInput formControlName=\"email\" />\n * <span comError>Please enter a valid email</span>\n * </com-form-field>\n * ```\n *\n * @example Matching specific errors\n * ```html\n * <com-form-field>\n * <label comLabel>Email</label>\n * <input comInput formControlName=\"email\" />\n * <span comError match=\"required\">Email is required.</span>\n * <span comError match=\"email\">Must be a valid email address.</span>\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comError]',\n exportAs: 'comError',\n host: {\n '[id]': 'id',\n '[class]': 'errorVariants()',\n '[class.hidden]': '!shouldShow()',\n 'role': 'alert',\n 'aria-live': 'polite',\n },\n})\nexport class ComError {\n readonly id: string = `com-error-${nextId++}`;\n\n /** Reference to the form control (Reactive Forms path). */\n private readonly _control: WritableSignal<AbstractControl | null> = signal(null);\n\n /** Structured errors from Signal Forms. */\n private readonly _signalErrors: WritableSignal<readonly unknown[]> = signal([]);\n\n /**\n * Show this error only when a specific validation error key is present.\n * If empty, the error is always shown when the control is in error state.\n */\n readonly match: InputSignal<string> = input<string>('');\n\n protected readonly errorVariants: () => string = errorVariants;\n\n /**\n * Whether this error should be displayed based on the match condition.\n * Used by the form field to filter which errors to show.\n */\n readonly shouldShow: Signal<boolean> = computed(() => {\n const matchKey = this.match();\n if (!matchKey) return true;\n\n // Signal Forms path: match on error.kind\n const signalErrors = this._signalErrors();\n if (signalErrors.length > 0) {\n return signalErrors.some((e) => (e as { kind?: string })?.kind === matchKey);\n }\n\n // Reactive Forms path: match on AbstractControl.errors keys\n const errors = this._control()?.errors;\n return errors ? matchKey in errors : false;\n });\n\n /**\n * Sets the form control reference (Reactive Forms).\n * Called by the parent form field component.\n */\n setControl(control: AbstractControl | null): void {\n this._control.set(control);\n }\n\n /**\n * Sets structured validation errors (Signal Forms).\n * Called by the parent form field component.\n */\n setSignalErrors(errors: readonly unknown[]): void {\n this._signalErrors.set(errors);\n }\n}\n","import { Directive } from '@angular/core';\nimport { prefixVariants } from './form-field.variants';\n\n/**\n * Directive to mark content as the prefix slot in a form field.\n *\n * Prefix content appears before the input (e.g., currency symbol, icon).\n *\n * @tokens `--color-muted-foreground`\n *\n * @example Currency prefix\n * ```html\n * <com-form-field>\n * <label comLabel>Amount</label>\n * <span comPrefix>$</span>\n * <input comInput type=\"number\" formControlName=\"amount\" />\n * </com-form-field>\n * ```\n *\n * @example Icon prefix\n * ```html\n * <com-form-field>\n * <label comLabel>Search</label>\n * <svg comPrefix class=\"size-4\">...</svg>\n * <input comInput formControlName=\"query\" />\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comPrefix]',\n exportAs: 'comPrefix',\n host: {\n '[class]': 'prefixVariants()',\n },\n})\nexport class ComPrefix {\n protected readonly prefixVariants: () => string = prefixVariants;\n}\n","import { Directive } from '@angular/core';\nimport { suffixVariants } from './form-field.variants';\n\n/**\n * Directive to mark content as the suffix slot in a form field.\n *\n * Suffix content appears after the input (e.g., unit, clear button, visibility toggle).\n *\n * @tokens `--color-muted-foreground`\n *\n * @example Unit suffix\n * ```html\n * <com-form-field>\n * <label comLabel>Weight</label>\n * <input comInput type=\"number\" formControlName=\"weight\" />\n * <span comSuffix>kg</span>\n * </com-form-field>\n * ```\n *\n * @example Clear button suffix\n * ```html\n * <com-form-field>\n * <label comLabel>Search</label>\n * <input comInput formControlName=\"query\" />\n * <button comSuffix type=\"button\" (click)=\"clearSearch()\">\n * <svg class=\"size-4\">...</svg>\n * </button>\n * </com-form-field>\n * ```\n *\n * @example Password visibility toggle\n * ```html\n * <com-form-field>\n * <label comLabel>Password</label>\n * <input comInput [type]=\"showPassword ? 'text' : 'password'\" formControlName=\"password\" />\n * <button comSuffix type=\"button\" (click)=\"showPassword = !showPassword\">\n * <svg class=\"size-4\">...</svg>\n * </button>\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: '[comSuffix]',\n exportAs: 'comSuffix',\n host: {\n '[class]': 'suffixVariants()',\n },\n})\nexport class ComSuffix {\n protected readonly suffixVariants: () => string = suffixVariants;\n}\n","import { Injectable } from '@angular/core';\nimport type { AbstractControl, FormGroupDirective, NgForm } from '@angular/forms';\n\n/**\n * Strategy for determining when to display errors in a form field.\n *\n * The default behavior shows errors when the control is invalid AND\n * either touched OR the parent form has been submitted.\n *\n * @example Override globally with eager error display\n * ```ts\n * @Injectable()\n * export class EagerErrorStateMatcher extends ErrorStateMatcher {\n * override isErrorState(control: AbstractControl | null): boolean {\n * return !!(control?.invalid && control.dirty);\n * }\n * }\n *\n * // In app config\n * providers: [{ provide: ErrorStateMatcher, useClass: EagerErrorStateMatcher }]\n * ```\n *\n * @example Per-field override\n * ```html\n * <com-form-field>\n * <input comInput [errorStateMatcher]=\"eagerMatcher\" />\n * </com-form-field>\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ErrorStateMatcher {\n isErrorState(\n control: AbstractControl | null,\n form: FormGroupDirective | NgForm | null\n ): boolean {\n return !!(control?.invalid && (control.touched || form?.submitted));\n }\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport type { DoCheck, InputSignal, InputSignalWithTransform, OnInit, Signal, WritableSignal } from '@angular/core';\n\nimport { FormGroupDirective, NgControl, NgForm } from '@angular/forms';\nimport { AutofillMonitor } from '@angular/cdk/text-field';\nimport { FormFieldControl } from './form-field-control';\nimport { ErrorStateMatcher } from './error-state-matcher';\nimport type { FormFieldAppearance } from './form-field-defaults';\n\n/** Auto-incrementing ID counter. */\nlet nextId = 0;\n\n/**\n * Directive applied to native `<input>` and `<textarea>` elements to bridge\n * them to the form field wrapper. Implements the `FormFieldControl` contract.\n *\n * This directive does NOT implement `ControlValueAccessor` - it relies on\n * Angular's built-in value accessors (`DefaultValueAccessor`, `NumberValueAccessor`, etc.)\n * that are already applied to native elements with `formControlName` or `ngModel`.\n *\n * Instead, this directive reports state (focused, empty, disabled, error) to the\n * parent form field for proper visual presentation.\n *\n * @tokens (styling is controlled by the parent form field)\n *\n * @example Basic usage\n * ```html\n * <com-form-field>\n * <label comLabel>Email</label>\n * <input comInput formControlName=\"email\" placeholder=\"you@example.com\" />\n * </com-form-field>\n * ```\n *\n * @example Textarea\n * ```html\n * <com-form-field>\n * <label comLabel>Description</label>\n * <textarea comInput formControlName=\"description\"></textarea>\n * </com-form-field>\n * ```\n *\n * @example Custom error state matcher\n * ```html\n * <com-form-field>\n * <label comLabel>Code</label>\n * <input comInput formControlName=\"code\" [errorStateMatcher]=\"eagerMatcher\" />\n * </com-form-field>\n * ```\n */\n@Directive({\n selector: 'input[comInput], textarea[comInput]',\n exportAs: 'comInput',\n providers: [{ provide: FormFieldControl, useExisting: forwardRef(() => ComInput) }],\n host: {\n '[id]': 'id()',\n '[disabled]': 'disabled()',\n '[required]': 'required()',\n '[attr.aria-invalid]': 'errorState() || null',\n '[attr.aria-required]': 'required() || null',\n '[attr.aria-describedby]': 'ariaDescribedBy() || null',\n '[class]': 'hostClasses()',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(input)': 'onInput()',\n },\n})\nexport class ComInput implements FormFieldControl<string>, OnInit, DoCheck {\n private readonly elementRef: ElementRef<HTMLInputElement | HTMLTextAreaElement> = inject(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly autofillMonitor = inject(AutofillMonitor);\n private readonly defaultErrorStateMatcher = inject(ErrorStateMatcher);\n private readonly parentForm = inject(NgForm, { optional: true });\n private readonly parentFormGroup = inject(FormGroupDirective, { optional: true });\n\n /** NgControl bound to this input (if using reactive forms). */\n readonly ngControl: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n // Inputs\n readonly inputId: InputSignal<string | undefined> = input<string>(undefined, { alias: 'id' });\n readonly inputDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n readonly inputRequired: InputSignalWithTransform<boolean, unknown> = input(false, {\n alias: 'required',\n transform: booleanAttribute,\n });\n readonly userAriaDescribedBy: InputSignal<string> = input<string>('', { alias: 'aria-describedby' });\n readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined> = input<ErrorStateMatcher>();\n\n // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives\n readonly sfInvalid: InputSignal<boolean> = input(false, { alias: 'invalid' });\n readonly sfTouched: InputSignalWithTransform<boolean, unknown> = input(false, {\n alias: 'touched',\n transform: booleanAttribute,\n });\n readonly sfErrors: InputSignal<readonly unknown[]> = input<readonly unknown[]>([], {\n alias: 'errors',\n });\n\n /** Whether the form system is Signal Forms (no NgControl present). */\n private readonly isSignalForms: boolean = !this.ngControl;\n\n // Internal state\n private readonly _focused = signal(false);\n private readonly _autofilled = signal(false);\n private readonly _empty = signal(true);\n private readonly _uniqueId: string = `com-input-${nextId++}`;\n private readonly _appearance: WritableSignal<FormFieldAppearance> = signal<FormFieldAppearance>('outline');\n private _previousNativeValue: string = '';\n\n // Public signals implementing FormFieldControl\n readonly focused: Signal<boolean> = this._focused.asReadonly();\n\n readonly id: Signal<string> = computed(() => this.inputId() ?? this._uniqueId);\n\n readonly shouldLabelFloat: Signal<boolean> = computed(() => {\n return this._focused() || !this._empty() || this._autofilled();\n });\n\n readonly disabled: Signal<boolean> = computed(() => {\n if (this.inputDisabled()) return true;\n return this.ngControl?.control?.disabled ?? false;\n });\n\n readonly required: Signal<boolean> = computed(() => {\n if (this.inputRequired()) return true;\n const control = this.ngControl?.control;\n if (control?.validator) {\n const result = control.validator({ value: '' } as never);\n return result?.['required'] !== undefined;\n }\n return false;\n });\n\n readonly errorState: Signal<boolean> = computed(() => {\n if (this.isSignalForms) {\n // Signal Forms: gate on both invalid AND touched — mirrors ErrorStateMatcher default.\n // Signal Forms' invalid is pure validation state (not gated by touched).\n return this.sfInvalid() && this.sfTouched();\n }\n // Reactive Forms: use ErrorStateMatcher (existing logic)\n this._focused();\n this._empty();\n const matcher = this.errorStateMatcher() ?? this.defaultErrorStateMatcher;\n const form = this.parentFormGroup ?? this.parentForm;\n return matcher.isErrorState(this.ngControl?.control ?? null, form);\n });\n\n /** Structured validation errors from Signal Forms, exposed for the parent form field. */\n readonly errors: Signal<readonly unknown[] | null> = computed(() =>\n this.isSignalForms ? this.sfErrors() : null\n );\n\n /** Combined aria-describedby including user-provided and form-field-generated IDs. */\n private readonly _describedByIds = signal('');\n\n readonly ariaDescribedBy: Signal<string> = computed(() => {\n const userIds = this.userAriaDescribedBy();\n const fieldIds = this._describedByIds();\n return [userIds, fieldIds].filter(Boolean).join(' ');\n });\n\n /** Computed host classes including appearance-based padding. */\n protected readonly hostClasses: Signal<string> = computed(() => {\n const base =\n 'peer w-full bg-transparent text-foreground placeholder:text-input-placeholder outline-none border-none disabled:cursor-not-allowed disabled:text-disabled-foreground px-3';\n const padding = this._appearance() === 'fill' ? 'pt-5 pb-1.5' : 'py-2.5';\n return `${base} ${padding}`;\n });\n\n ngOnInit(): void {\n this._previousNativeValue = this.elementRef.nativeElement.value;\n this.updateEmpty();\n\n const autofillSub = this.autofillMonitor.monitor(this.elementRef).subscribe((event) => {\n this._autofilled.set(event.isAutofilled);\n });\n\n this.destroyRef.onDestroy(() => {\n autofillSub.unsubscribe();\n this.autofillMonitor.stopMonitoring(this.elementRef);\n });\n }\n\n ngDoCheck(): void {\n this.dirtyCheckNativeValue();\n }\n\n private dirtyCheckNativeValue(): void {\n const newValue = this.elementRef.nativeElement.value;\n if (this._previousNativeValue !== newValue) {\n this._previousNativeValue = newValue;\n this.updateEmpty();\n }\n }\n\n protected onFocus(): void {\n this._focused.set(true);\n }\n\n protected onBlur(): void {\n this._focused.set(false);\n }\n\n protected onInput(): void {\n this.updateEmpty();\n }\n\n private updateEmpty(): void {\n this._empty.set(!this.elementRef.nativeElement.value);\n }\n\n // FormFieldControl methods\n onContainerClick(event: MouseEvent): void {\n if (!this.disabled() && event.target !== this.elementRef.nativeElement) {\n this.elementRef.nativeElement.focus();\n }\n }\n\n /**\n * Sets the describedBy IDs from the form field.\n * Called by the parent form field component.\n */\n setDescribedByIds(ids: string): void {\n this._describedByIds.set(ids);\n }\n\n /**\n * Sets the appearance for styling.\n * Called by the parent form field component.\n */\n setAppearance(appearance: FormFieldAppearance): void {\n this._appearance.set(appearance);\n }\n\n /** Focus the native element. */\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type {\n FormFieldAppearance,\n FormFieldColor,\n FormFieldFloatLabel,\n FormFieldSubscriptSizing,\n} from './form-field.variants';\n\n// Re-export types for convenience\nexport type { FormFieldAppearance, FormFieldColor, FormFieldFloatLabel, FormFieldSubscriptSizing };\n\n/**\n * Global configuration defaults for form fields.\n *\n * @example Set defaults in app config\n * ```ts\n * providers: [\n * {\n * provide: FORM_FIELD_DEFAULTS,\n * useValue: {\n * appearance: 'fill',\n * floatLabel: 'always',\n * color: 'primary',\n * }\n * }\n * ]\n * ```\n */\nexport interface FormFieldDefaults {\n appearance?: FormFieldAppearance;\n color?: FormFieldColor;\n floatLabel?: FormFieldFloatLabel;\n hideRequiredMarker?: boolean;\n subscriptSizing?: FormFieldSubscriptSizing;\n}\n\nexport const FORM_FIELD_DEFAULTS: InjectionToken<FormFieldDefaults> = new InjectionToken<FormFieldDefaults>(\n 'FORM_FIELD_DEFAULTS',\n {\n providedIn: 'root',\n factory: (): FormFieldDefaults => ({}),\n }\n);\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { FormFieldControl } from './form-field-control';\nimport { ComLabel } from './label.directive';\nimport { ComHint } from './hint.directive';\nimport { ComError } from './error.directive';\nimport { ComPrefix } from './prefix.directive';\nimport { ComSuffix } from './suffix.directive';\nimport { ComInput } from './input.directive';\nimport {\n FORM_FIELD_DEFAULTS,\n type FormFieldAppearance,\n type FormFieldColor,\n type FormFieldFloatLabel,\n type FormFieldSubscriptSizing,\n} from './form-field-defaults';\nimport {\n formFieldVariants,\n formFieldContainerVariants,\n formFieldLabelVariants,\n formFieldSubscriptVariants,\n} from './form-field.variants';\nimport { mergeClasses } from 'ngx-com/utils';\n\n/**\n * Form field wrapper providing visual structure for form inputs.\n *\n * Provides floating labels, borders (outline/fill appearance), hints, errors,\n * and prefix/suffix slots. Automatically wires ARIA attributes for accessibility.\n *\n * The form field reads state from its inner `FormFieldControl` child (typically\n * a `ComInput` directive) and renders UI accordingly.\n *\n * @tokens `--color-foreground`, `--color-input-border`, `--color-input-background`,\n * `--color-primary`, `--color-accent`, `--color-warn`, `--color-ring`,\n * `--color-muted`, `--color-muted-foreground`, `--color-disabled`,\n * `--color-disabled-foreground`, `--color-background`, `--radius-input`\n *\n * @example Basic outline field\n * ```html\n * <com-form-field>\n * <label comLabel>Email</label>\n * <input comInput formControlName=\"email\" />\n * <span comHint>We'll never share your email.</span>\n * <span comError match=\"required\">Email is required.</span>\n * </com-form-field>\n * ```\n *\n * @example Fill appearance\n * ```html\n * <com-form-field appearance=\"fill\">\n * <label comLabel>Username</label>\n * <input comInput formControlName=\"username\" />\n * </com-form-field>\n * ```\n *\n * @example With prefix and suffix\n * ```html\n * <com-form-field>\n * <label comLabel>Amount</label>\n * <span comPrefix>$</span>\n * <input comInput type=\"number\" formControlName=\"amount\" />\n * <span comSuffix>.00</span>\n * </com-form-field>\n * ```\n *\n * @example Label with icon and tooltip\n * ```html\n * <com-form-field>\n * <label comLabel>\n * User Role\n * <button type=\"button\" aria-label=\"Help\" comTooltip=\"Admins have full access.\">\n * <com-icon [img]=\"CircleHelpIcon\" size=\"xs\" color=\"muted\" />\n * </button>\n * </label>\n * <input comInput />\n * </com-form-field>\n * ```\n */\n@Component({\n selector: 'com-form-field',\n exportAs: 'comFormField',\n template: `\n <div [class]=\"containerClasses()\" role=\"group\" tabindex=\"-1\" (click)=\"onContainerClick($event)\" (keydown.enter)=\"onContainerActivate()\">\n <div class=\"flex items-center w-full\">\n @if (hasPrefix()) {\n <ng-content select=\"[comPrefix]\" />\n }\n @if (labelChild()) {\n <span [class]=\"labelClasses()\">\n <ng-content select=\"[comLabel]\" />\n @if (showRequiredMarker()) {\n <span class=\"text-warn\" aria-hidden=\"true\"> *</span>\n }\n </span>\n }\n <div class=\"flex-1 min-w-0\">\n <ng-content />\n </div>\n @if (hasSuffix()) {\n <ng-content select=\"[comSuffix]\" />\n }\n </div>\n </div>\n\n <div [class]=\"subscriptClasses()\">\n <div [class.hidden]=\"!showErrors()\">\n <ng-content select=\"[comError]\" />\n </div>\n <div [class.hidden]=\"showErrors()\" class=\"flex justify-between w-full gap-2\">\n <ng-content select=\"[comHint]:not([align='end'])\" />\n <ng-content select=\"[comHint][align='end']\" />\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styles: `\n /* Hide placeholder when label exists and is not floating (label acts as placeholder) */\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) input::placeholder,\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) textarea::placeholder {\n color: transparent;\n }\n\n /* Hide dropdown placeholder when label exists and is not floating */\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-dropdown .text-placeholder {\n display: none;\n }\n\n /* Make nested controls fill available space inside form-field */\n com-form-field com-dropdown,\n com-form-field com-datepicker,\n com-form-field com-date-range-picker,\n com-form-field com-time-picker {\n display: block;\n width: 100%;\n }\n\n /* Hide datepicker/date-range placeholder when label exists and is not floating */\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-datepicker input::placeholder,\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-date-range-picker input::placeholder {\n color: transparent;\n }\n\n /* Hide time picker separators and period button when label is not floating */\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-time-picker span[aria-hidden],\n com-form-field.com-form-field--has-label:not(.com-form-field--floating) com-time-picker button {\n visibility: hidden;\n }\n\n /* Re-enable pointer events on tooltip icons inside the label */\n com-form-field .com-form-field__label [comtooltip] {\n pointer-events: auto;\n cursor: help;\n }\n\n /* Visually hide icons inside label when floating to keep the scaled label clean */\n com-form-field.com-form-field--floating .com-form-field__label com-icon {\n visibility: hidden;\n width: 0;\n overflow: hidden;\n }\n `,\n host: {\n '[class]': 'hostClasses()',\n '[class.com-form-field--focused]': 'isFocused()',\n '[class.com-form-field--disabled]': 'isDisabled()',\n '[class.com-form-field--error]': 'hasError()',\n '[class.com-form-field--floating]': 'shouldLabelFloat()',\n '[class.com-form-field--has-label]': '!!labelChild()',\n '[attr.data-focused]': 'isFocused() || null',\n '[attr.data-disabled]': 'isDisabled() || null',\n '[attr.data-error]': 'hasError() || null',\n '[attr.data-floating]': 'shouldLabelFloat() || null',\n },\n})\nexport class ComFormField {\n private readonly defaults = inject(FORM_FIELD_DEFAULTS, { optional: true });\n\n // Content children\n readonly control: Signal<FormFieldControl | undefined> = contentChild<FormFieldControl>(FormFieldControl);\n readonly inputDirective: Signal<ComInput | undefined> = contentChild<ComInput>(ComInput);\n readonly labelChild: Signal<ComLabel | undefined> = contentChild<ComLabel>(ComLabel);\n readonly hintChildren: Signal<readonly ComHint[]> = contentChildren<ComHint>(ComHint);\n readonly errorChildren: Signal<readonly ComError[]> = contentChildren<ComError>(ComError);\n readonly prefixChild: Signal<ComPrefix | undefined> = contentChild<ComPrefix>(ComPrefix);\n readonly suffixChild: Signal<ComSuffix | undefined> = contentChild<ComSuffix>(ComSuffix);\n\n // Inputs with defaults fallback\n readonly appearance: InputSignal<FormFieldAppearance> = input<FormFieldAppearance>(\n this.defaults?.appearance ?? 'outline'\n );\n readonly color: InputSignal<FormFieldColor> = input<FormFieldColor>(this.defaults?.color ?? 'primary');\n readonly floatLabel: InputSignal<FormFieldFloatLabel> = input<FormFieldFloatLabel>(\n this.defaults?.floatLabel ?? 'auto'\n );\n readonly hideRequiredMarker: InputSignalWithTransform<boolean, unknown> = input(\n this.defaults?.hideRequiredMarker ?? false,\n { transform: booleanAttribute }\n );\n readonly subscriptSizing: InputSignal<FormFieldSubscriptSizing> = input<FormFieldSubscriptSizing>(\n this.defaults?.subscriptSizing ?? 'fixed'\n );\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n // Derived state from inner control\n readonly shouldLabelFloat: Signal<boolean> = computed(() => {\n if (this.floatLabel() === 'always') return true;\n return this.control()?.shouldLabelFloat() ?? false;\n });\n\n readonly isFocused: Signal<boolean> = computed(() => this.control()?.focused() ?? false);\n readonly isDisabled: Signal<boolean> = computed(() => this.control()?.disabled() ?? false);\n readonly hasError: Signal<boolean> = computed(() => this.control()?.errorState() ?? false);\n readonly hasPrefix: Signal<boolean> = computed(() => !!this.prefixChild());\n readonly hasSuffix: Signal<boolean> = computed(() => !!this.suffixChild());\n\n readonly showRequiredMarker: Signal<boolean> = computed(() => {\n if (this.hideRequiredMarker()) return false;\n return this.control()?.required() ?? false;\n });\n\n readonly showErrors: Signal<boolean> = computed(() => this.hasError() && this.errorChildren().length > 0);\n\n // Computed classes\n protected readonly hostClasses: Signal<string> = computed(() =>\n mergeClasses(formFieldVariants({ disabled: this.isDisabled() }), this.userClass())\n );\n\n protected readonly containerClasses: Signal<string> = computed(() =>\n formFieldContainerVariants({\n appearance: this.appearance(),\n color: this.color(),\n focused: this.isFocused(),\n error: this.hasError(),\n disabled: this.isDisabled(),\n })\n );\n\n protected readonly labelClasses: Signal<string> = computed(() =>\n formFieldLabelVariants({\n appearance: this.appearance(),\n floating: this.shouldLabelFloat(),\n color: this.color(),\n error: this.hasError(),\n focused: this.isFocused(),\n disabled: this.isDisabled(),\n })\n );\n\n protected readonly subscriptClasses: Signal<string> = computed(() =>\n formFieldSubscriptVariants({ sizing: this.subscriptSizing() })\n );\n\n constructor() {\n // Wire up label to control\n effect(() => {\n const label = this.labelChild();\n const ctrl = this.control();\n if (label && ctrl) {\n label.setForId(ctrl.id());\n }\n });\n\n // Wire up aria-describedby on the control\n effect(() => {\n const ctrl = this.control();\n if (!ctrl || !('setDescribedByIds' in ctrl)) return;\n\n const ids = this.showErrors()\n ? this.errorChildren().filter((e) => e.shouldShow()).map((e) => e.id)\n : this.hintChildren().map((h) => h.id);\n (ctrl as { setDescribedByIds: (ids: string) => void }).setDescribedByIds(ids.join(' '));\n });\n\n // Wire up appearance to control for proper styling\n effect(() => {\n const ctrl = this.control();\n if (ctrl && 'setAppearance' in ctrl) {\n (ctrl as { setAppearance: (appearance: FormFieldAppearance) => void }).setAppearance(this.appearance());\n }\n });\n\n // Wire up control reference to error directives (re-runs on error state change)\n effect(() => {\n // Read hasError to trigger re-evaluation when validation state changes\n this.hasError();\n const ctrl = this.control();\n if (!ctrl) return;\n\n const errors = ctrl.errors?.() ?? null;\n if (errors !== null) {\n // Signal Forms path: pass structured errors to each comError\n this.errorChildren().forEach((error) => error.setSignalErrors(errors as readonly unknown[]));\n } else {\n // Reactive Forms path: pass AbstractControl reference\n const ngControl = ctrl.ngControl?.control ?? null;\n this.errorChildren().forEach((error) => error.setControl(ngControl));\n }\n });\n }\n\n protected onContainerClick(event: MouseEvent): void {\n this.control()?.onContainerClick(event);\n }\n\n protected onContainerActivate(): void {\n this.control()?.onContainerClick(new MouseEvent('click'));\n }\n}\n","// Public API for the form-field component\n\n// Main component\nexport { ComFormField } from './form-field.component';\n\n// Directives\nexport { ComInput } from './input.directive';\nexport { ComLabel } from './label.directive';\nexport { ComHint, type HintAlign } from './hint.directive';\nexport { ComError } from './error.directive';\nexport { ComPrefix } from './prefix.directive';\nexport { ComSuffix } from './suffix.directive';\n\n// Abstract class for custom controls\nexport { FormFieldControl } from './form-field-control';\n\n// Error state matching\nexport { ErrorStateMatcher } from './error-state-matcher';\n\n// Configuration\nexport {\n FORM_FIELD_DEFAULTS,\n type FormFieldDefaults,\n type FormFieldAppearance,\n type FormFieldColor,\n type FormFieldFloatLabel,\n type FormFieldSubscriptSizing,\n} from './form-field-defaults';\n\n// Variants (for advanced customization)\nexport {\n formFieldVariants,\n formFieldContainerVariants,\n formFieldLabelVariants,\n formFieldSubscriptVariants,\n hintVariants,\n errorVariants,\n prefixVariants,\n suffixVariants,\n type FormFieldVariants,\n type FormFieldContainerVariants,\n type FormFieldLabelVariants,\n type FormFieldSubscriptVariants,\n} from './form-field.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["nextId"],"mappings":"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"}
|