@raintonic/formaui 0.9.2 → 0.9.3
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/raintonic-formaui-components-alert.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-avatar.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-card.mjs +78 -8
- package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-chip.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-data-table.mjs +80 -11
- package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-drawer.mjs +37 -6
- package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +1 -1
- package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-form-field.mjs +21 -2
- package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-input.mjs +14 -0
- package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-select.mjs +13 -5
- package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-side-panel.mjs +40 -6
- package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs +16 -5
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toolbar.mjs +10 -4
- package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tooltip.mjs +102 -8
- package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-dialog.mjs +8 -4
- package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
- package/fesm2022/raintonic-formaui.mjs +1 -1
- package/fesm2022/raintonic-formaui.mjs.map +1 -1
- package/llms-full.txt +64 -19
- package/package.json +1 -1
- package/styles/generated/_tokens.scss +1 -1
- package/styles/partials/components/_dialog.scss +24 -0
- package/styles/styles.css +16 -1
- package/types/raintonic-formaui-components-card.d.ts +46 -2
- package/types/raintonic-formaui-components-card.d.ts.map +1 -1
- package/types/raintonic-formaui-components-data-table.d.ts +50 -3
- package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
- package/types/raintonic-formaui-components-drawer.d.ts +20 -2
- package/types/raintonic-formaui-components-drawer.d.ts.map +1 -1
- package/types/raintonic-formaui-components-form-field.d.ts +10 -0
- package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
- package/types/raintonic-formaui-components-input.d.ts +9 -0
- package/types/raintonic-formaui-components-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-select.d.ts +8 -1
- package/types/raintonic-formaui-components-select.d.ts.map +1 -1
- package/types/raintonic-formaui-components-side-panel.d.ts +24 -2
- package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -1
- package/types/raintonic-formaui-components-toggle-group.d.ts +1 -1
- package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -1
- package/types/raintonic-formaui-components-toolbar.d.ts +5 -1
- package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-tooltip.d.ts +55 -4
- package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
- package/types/raintonic-formaui-services-dialog.d.ts +12 -1
- package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
- package/types/raintonic-formaui.d.ts +1 -1
|
@@ -64,6 +64,7 @@ class FuiFormFieldIntl extends FuiIntlBase {
|
|
|
64
64
|
copiedAriaLabel = 'Copied';
|
|
65
65
|
copyTooltip = 'Copy';
|
|
66
66
|
copiedTooltip = 'Copied';
|
|
67
|
+
clearAriaLabel = 'Clear';
|
|
67
68
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiFormFieldIntl, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
68
69
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiFormFieldIntl, providedIn: 'root' });
|
|
69
70
|
}
|
|
@@ -221,6 +222,16 @@ class FuiFormFieldComponent {
|
|
|
221
222
|
isNumberInput = computed(() => {
|
|
222
223
|
return this.control()?.controlType === 'fui-number-input';
|
|
223
224
|
}, ...(ngDevMode ? [{ debugName: "isNumberInput" }] : /* istanbul ignore next */ []));
|
|
225
|
+
/** Whether the projected control is a plain `fuiInput` with `type="search"`. */
|
|
226
|
+
isSearchInput = computed(() => {
|
|
227
|
+
const ctrl = this.control();
|
|
228
|
+
return this.control()?.controlType === 'fui-input' && typeof ctrl?.type === 'function' && ctrl.type() === 'search';
|
|
229
|
+
}, ...(ngDevMode ? [{ debugName: "isSearchInput" }] : /* istanbul ignore next */ []));
|
|
230
|
+
/** Whether the search clear (X) button should be shown. Visible only when the
|
|
231
|
+
* search input holds a value and is interactive. */
|
|
232
|
+
showClearButton = computed(() => {
|
|
233
|
+
return this.isSearchInput() && !this.isEmpty() && !this.isDisabled() && !this.isReadonly();
|
|
234
|
+
}, ...(ngDevMode ? [{ debugName: "showClearButton" }] : /* istanbul ignore next */ []));
|
|
224
235
|
/** Whether control-specific icons (dropdown caret, calendar) should be hidden in readOnly mode */
|
|
225
236
|
hideControlIcons = computed(() => {
|
|
226
237
|
if (!this.isReadonly())
|
|
@@ -304,6 +315,14 @@ class FuiFormFieldComponent {
|
|
|
304
315
|
}, 1500);
|
|
305
316
|
});
|
|
306
317
|
}
|
|
318
|
+
/**
|
|
319
|
+
* Clears the projected search input's value and refocuses it.
|
|
320
|
+
*/
|
|
321
|
+
clearControl(event) {
|
|
322
|
+
event.stopPropagation();
|
|
323
|
+
const ctrl = this.control();
|
|
324
|
+
ctrl?.clear?.();
|
|
325
|
+
}
|
|
307
326
|
/**
|
|
308
327
|
* Gets the current error messages
|
|
309
328
|
*/
|
|
@@ -359,7 +378,7 @@ class FuiFormFieldComponent {
|
|
|
359
378
|
provide: FUI_FORM_FIELD,
|
|
360
379
|
useExisting: forwardRef(() => FuiFormFieldComponent),
|
|
361
380
|
},
|
|
362
|
-
], queries: [{ propertyName: "control", first: true, predicate: FUI_FORM_FIELD_CONTROL, descendants: true, isSignal: true }, { propertyName: "strengthMeter", first: true, predicate: FUI_STRENGTH_METER, descendants: true, isSignal: true }, { propertyName: "_prefixes", predicate: FuiPrefixDirective, descendants: true }, { propertyName: "_suffixes", predicate: FuiSuffixDirective, descendants: true }], viewQueries: [{ propertyName: "_connectionContainerRef", first: true, predicate: ["connectionContainer"], descendants: true, static: true }, { propertyName: "_wrapperRef", first: true, predicate: ["wrapper"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !isReadonly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper \u2014 always visible, styled as read-only when applicable -->\r\n <div\r\n #wrapper\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"isReadonly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || showCopyButton()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n <!-- Copy button \u2014 visible only in readOnly on hover -->\r\n @if (showCopyButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? intl.copiedAriaLabel : intl.copyAriaLabel\"\r\n [fuiTooltip]=\"copied() ? intl.copiedTooltip : intl.copyTooltip\"\r\n fuiTooltipPosition=\"top\"\r\n fuiTooltipSize=\"sm\"\r\n [fuiTooltipShowDelay]=\"copied() ? 0 : 300\"\r\n fuiTooltipTrigger=\"manual\"\r\n [fuiTooltipShow]=\"copied()\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n <!-- The strength meter and the error are exclusive -->\r\n @if (hasError() && !showStrengthMeter()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (showStrengthMeter()) {\r\n <ng-content select=\"fui-strength-meter\"></ng-content>\r\n }\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-form-field{--fui-form-field-height: var(--fui-input-height);--fui-form-field-font-size: var(--fui-text-base);--fui-form-field-border-radius: var(--fui-radius-sm);--fui-form-field-padding-x: var(--fui-spacing-6);--fui-form-field-bg: var(--fui-bg-subtle);--fui-form-field-border-color: var(--fui-border-default);--fui-form-field-label-color: var(--fui-text-primary);--fui-form-field-label-font-size: var(--fui-text-sm);--fui-form-field-label-spacing: var(--fui-spacing-2);--fui-form-field-hint-color: var(--fui-text-secondary);--fui-form-field-error-color: var(--fui-field-border-error);display:block;position:relative;font-family:var(--fui-font-sans);font-size:var(--fui-form-field-font-size)}.fui-form-field__container{display:block;width:100%}.fui-form-field__wrapper{position:relative;display:flex;align-items:center;width:100%;min-height:var(--fui-form-field-height);cursor:text;transition-property:background-color,border-color,box-shadow;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;background-color:var(--fui-form-field-bg);border:var(--fui-border-width-sm) solid var(--fui-form-field-border-color);border-radius:var(--fui-form-field-border-radius);padding:0 var(--fui-form-field-padding-x);box-shadow:var(--fui-shadow-xs);overflow:hidden}.fui-form-field:hover:not(.fui-form-field--disabled):not(.fui-form-field--readonly):not(.fui-form-field--error) .fui-form-field__wrapper{background-color:var(--fui-bg-default);border-color:var(--fui-border-primary)}.fui-form-field.fui-form-field--error .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-error);outline:2px solid var(--fui-error-20)}.fui-form-field.fui-form-field--error.fui-form-field--focused .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-error)}.fui-form-field:has(input:focus) .fui-form-field__wrapper,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-primary)!important;background-color:var(--fui-bg-default);position:relative;outline:2px solid var(--fui-primary-10)}.fui-form-field:has(input:focus) .fui-form-field__prefix,.fui-form-field:has(input:focus) .fui-form-field__suffix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__prefix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__suffix{color:var(--fui-primary-fg)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__label{color:var(--fui-text-disabled)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__wrapper{box-shadow:none;cursor:not-allowed;color:var(--fui-text-disabled);background-color:var(--fui-bg-muted)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__prefix,.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__suffix{color:var(--fui-text-disabled)}.fui-form-field--disabled:not(.fui-form-field--readonly) input,.fui-form-field--disabled:not(.fui-form-field--readonly) textarea,.fui-form-field--disabled:not(.fui-form-field--readonly) select{cursor:not-allowed}.fui-form-field--readonly .fui-form-field__wrapper{box-shadow:none;cursor:default;color:var(--fui-text-primary);background-color:var(--fui-bg-subtle)}.fui-form-field--readonly:has(input:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-default)!important;box-shadow:none;background-color:var(--fui-bg-default)}.fui-form-field--readonly:has(input:focus) .fui-form-field__prefix,.fui-form-field--readonly:has(input:focus) .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--readonly .fui-form-field__input input,.fui-form-field--readonly .fui-form-field__input textarea,.fui-form-field--readonly .fui-form-field__input select{color:var(--fui-text-primary)!important;-webkit-text-fill-color:var(--fui-text-primary)!important;cursor:default;opacity:1}.fui-form-field--readonly .fui-form-field__input input::placeholder,.fui-form-field--readonly .fui-form-field__input textarea::placeholder,.fui-form-field--readonly .fui-form-field__input select::placeholder{color:var(--fui-text-disabled);-webkit-text-fill-color:var(--fui-text-disabled)}.fui-form-field--readonly .fui-form-field__wrapper:hover .fui-form-field__copy-btn{opacity:1;pointer-events:auto}.fui-form-field__prefix,.fui-form-field__suffix{display:flex;align-items:center;white-space:nowrap;flex:0 0 auto;position:relative;z-index:2;padding:0 var(--fui-spacing-2);color:var(--fui-text-secondary);font-size:var(--fui-text-base);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field--focused .fui-form-field__prefix,.fui-form-field--focused .fui-form-field__suffix{color:var(--fui-field-border-focus)}.fui-form-field--error .fui-form-field__prefix,.fui-form-field--error .fui-form-field__suffix{color:var(--fui-field-border-error)}.fui-form-field--disabled .fui-form-field__prefix,.fui-form-field--disabled .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--number-input .fui-form-field__wrapper{padding:0}.fui-form-field__infix{position:relative;flex:1 1 auto;min-width:0;padding:0;z-index:2}.fui-form-field__label{display:block;margin-bottom:var(--fui-form-field-label-spacing);font-size:var(--fui-form-field-label-font-size);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide);color:var(--fui-form-field-label-color);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__required-marker{color:var(--fui-text-error);margin-left:var(--fui-spacing-2);font-weight:var(--fui-weight-regular)}.fui-form-field__input{position:relative;width:100%}.fui-form-field__input input,.fui-form-field__input textarea,.fui-form-field__input select{width:100%;height:100%;border:none;outline:none;background:transparent;font-family:var(--fui-font-sans);font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-normal);color:var(--fui-text-primary);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__input input::placeholder,.fui-form-field__input textarea::placeholder,.fui-form-field__input select::placeholder{color:var(--fui-text-disabled);opacity:1;transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__input input:focus,.fui-form-field__input textarea:focus,.fui-form-field__input select:focus{outline:none}.fui-form-field__input input:focus-visible,.fui-form-field__input textarea:focus-visible,.fui-form-field__input select:focus-visible{outline:none}.fui-form-field__input input:disabled,.fui-form-field__input textarea:disabled,.fui-form-field__input select:disabled{color:var(--fui-text-disabled);-webkit-text-fill-color:var(--fui-text-disabled)}.fui-form-field__input input:-webkit-autofill,.fui-form-field__input input:-webkit-autofill:hover,.fui-form-field__input input:-webkit-autofill:focus,.fui-form-field__input input:-webkit-autofill:active,.fui-form-field__input textarea:-webkit-autofill,.fui-form-field__input textarea:-webkit-autofill:hover,.fui-form-field__input textarea:-webkit-autofill:focus,.fui-form-field__input textarea:-webkit-autofill:active,.fui-form-field__input select:-webkit-autofill,.fui-form-field__input select:-webkit-autofill:hover,.fui-form-field__input select:-webkit-autofill:focus,.fui-form-field__input select:-webkit-autofill:active{-webkit-box-shadow:0 0 0 100px var(--fui-form-field-bg) inset;-webkit-text-fill-color:var(--fui-text-primary);caret-color:var(--fui-text-primary);transition:background-color 5000s ease-in-out 0s,color 5000s ease-in-out 0s}.fui-form-field__input:has(input[type=color]){height:20px}.fui-form-field__copy-btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-form-field__copy-btn:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-form-field__copy-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5rem;height:1.5rem;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);opacity:0;pointer-events:none;transition-property:opacity,color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__copy-btn:hover{color:var(--fui-primary-fg)}.fui-form-field__subscript-wrapper{position:relative;min-height:1.25rem;padding:var(--fui-spacing-2) 0 0;font-size:var(--fui-text-sm);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide)}.fui-form-field__error-wrapper{color:var(--fui-form-field-error-color)}.fui-form-field__error{transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;font-weight:var(--fui-weight-regular)}.fui-form-field__hint-wrapper{color:var(--fui-form-field-hint-color)}.fui-form-field__hint{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;font-weight:var(--fui-weight-regular)}.fui-form-field--fill .fui-form-field__wrapper{background-color:var(--fui-bg-muted);border-bottom:var(--fui-border-width-md) solid var(--fui-form-field-border-color);border-top:none;border-left:none;border-right:none;border-radius:var(--fui-radius-sm) var(--fui-radius-sm) 0 0}.fui-form-field--fill:hover:not(.fui-form-field--disabled) .fui-form-field__wrapper{background-color:var(--fui-bg-muted);border-top:none;border-left:none;border-right:none}.fui-form-field--fill.fui-form-field--focused .fui-form-field__wrapper,.fui-form-field--fill:has(input:focus) .fui-form-field__wrapper,.fui-form-field--fill:has(select:focus) .fui-form-field__wrapper{border-bottom-color:var(--fui-border-primary);border-top:none!important;border-left:none!important;border-right:none!important}.fui-form-field--fill.fui-form-field--error .fui-form-field__wrapper{border-bottom-color:var(--fui-border-error);border-top:none;border-left:none;border-right:none}.fui-form-field__input textarea{min-height:5rem;resize:vertical;padding:var(--fui-spacing-4) 0;line-height:1.4}.fui-form-field__input select{cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:var(--fui-spacing-9)}.fui-form-field__input select::-ms-expand{display:none}.fui-form-field__input select:disabled{cursor:not-allowed}.fui-form-field__input select option{padding:var(--fui-spacing-2);background-color:var(--fui-bg-default);color:var(--fui-text-primary)}.fui-form-field:has(select:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-primary)!important;background-color:var(--fui-bg-default);position:relative;box-shadow:0 0 0 4px var(--fui-primary-20)}.fui-form-field:has(select:focus) .fui-form-field__prefix,.fui-form-field:has(select:focus) .fui-form-field__suffix{color:var(--fui-primary-fg)}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "directive", type: FuiTooltipDirective, selector: "[fuiTooltip]", inputs: ["fuiTooltip", "fuiTooltipPosition", "fuiTooltipSize", "fuiTooltipTrigger", "fuiTooltipShowDelay", "fuiTooltipHideDelay", "fuiTooltipDisabled", "fuiTooltipMaxWidth", "fuiTooltipOffset", "fuiTooltipArrow", "fuiTooltipShow"], exportAs: ["fuiTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
381
|
+
], queries: [{ propertyName: "control", first: true, predicate: FUI_FORM_FIELD_CONTROL, descendants: true, isSignal: true }, { propertyName: "strengthMeter", first: true, predicate: FUI_STRENGTH_METER, descendants: true, isSignal: true }, { propertyName: "_prefixes", predicate: FuiPrefixDirective, descendants: true }, { propertyName: "_suffixes", predicate: FuiSuffixDirective, descendants: true }], viewQueries: [{ propertyName: "_connectionContainerRef", first: true, predicate: ["connectionContainer"], descendants: true, static: true }, { propertyName: "_wrapperRef", first: true, predicate: ["wrapper"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !isReadonly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper \u2014 always visible, styled as read-only when applicable -->\r\n <div\r\n #wrapper\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"isReadonly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || showCopyButton() || isSearchInput()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n <!-- Clear button \u2014 always reserves its slot for search inputs (so the\r\n field width stays stable), hidden until a value is present. -->\r\n @if (isSearchInput()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__clear-btn\"\r\n [class.fui-form-field__clear-btn--hidden]=\"!showClearButton()\"\r\n tabindex=\"-1\"\r\n [attr.aria-hidden]=\"!showClearButton()\"\r\n [disabled]=\"!showClearButton()\"\r\n (click)=\"clearControl($event)\"\r\n [attr.aria-label]=\"intl.clearAriaLabel\"\r\n >\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n <!-- Copy button \u2014 visible only in readOnly on hover -->\r\n @if (showCopyButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? intl.copiedAriaLabel : intl.copyAriaLabel\"\r\n [fuiTooltip]=\"copied() ? intl.copiedTooltip : intl.copyTooltip\"\r\n fuiTooltipPosition=\"top\"\r\n fuiTooltipSize=\"sm\"\r\n [fuiTooltipShowDelay]=\"copied() ? 0 : 300\"\r\n fuiTooltipTrigger=\"manual\"\r\n [fuiTooltipShow]=\"copied()\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n <!-- The strength meter and the error are exclusive -->\r\n @if (hasError() && !showStrengthMeter()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (showStrengthMeter()) {\r\n <ng-content select=\"fui-strength-meter\"></ng-content>\r\n }\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-form-field{--fui-form-field-height: var(--fui-input-height);--fui-form-field-font-size: var(--fui-text-base);--fui-form-field-border-radius: var(--fui-radius-sm);--fui-form-field-padding-x: var(--fui-spacing-6);--fui-form-field-bg: var(--fui-bg-subtle);--fui-form-field-border-color: var(--fui-border-default);--fui-form-field-label-color: var(--fui-text-primary);--fui-form-field-label-font-size: var(--fui-text-sm);--fui-form-field-label-spacing: var(--fui-spacing-2);--fui-form-field-hint-color: var(--fui-text-secondary);--fui-form-field-error-color: var(--fui-field-border-error);display:block;position:relative;font-family:var(--fui-font-sans);font-size:var(--fui-form-field-font-size)}.fui-form-field__container{display:block;width:100%}.fui-form-field__wrapper{position:relative;display:flex;align-items:center;width:100%;min-height:var(--fui-form-field-height);cursor:text;transition-property:background-color,border-color,box-shadow;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;background-color:var(--fui-form-field-bg);border:var(--fui-border-width-sm) solid var(--fui-form-field-border-color);border-radius:var(--fui-form-field-border-radius);padding:0 var(--fui-form-field-padding-x);box-shadow:var(--fui-shadow-xs);overflow:hidden}.fui-form-field:hover:not(.fui-form-field--disabled):not(.fui-form-field--readonly):not(.fui-form-field--error) .fui-form-field__wrapper{background-color:var(--fui-bg-default);border-color:var(--fui-border-primary)}.fui-form-field.fui-form-field--error .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-error);outline:2px solid var(--fui-error-20)}.fui-form-field.fui-form-field--error.fui-form-field--focused .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-error)}.fui-form-field:has(input:focus) .fui-form-field__wrapper,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-primary)!important;background-color:var(--fui-bg-default);position:relative;outline:2px solid var(--fui-primary-10)}.fui-form-field:has(input:focus) .fui-form-field__prefix,.fui-form-field:has(input:focus) .fui-form-field__suffix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__prefix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__suffix{color:var(--fui-primary-fg)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__label{color:var(--fui-text-disabled)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__wrapper{box-shadow:none;cursor:not-allowed;color:var(--fui-text-disabled);background-color:var(--fui-bg-muted)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__prefix,.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__suffix{color:var(--fui-text-disabled)}.fui-form-field--disabled:not(.fui-form-field--readonly) input,.fui-form-field--disabled:not(.fui-form-field--readonly) textarea,.fui-form-field--disabled:not(.fui-form-field--readonly) select{cursor:not-allowed}.fui-form-field--readonly .fui-form-field__wrapper{box-shadow:none;cursor:default;color:var(--fui-text-primary);background-color:var(--fui-bg-subtle)}.fui-form-field--readonly:has(input:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-default)!important;box-shadow:none;background-color:var(--fui-bg-default)}.fui-form-field--readonly:has(input:focus) .fui-form-field__prefix,.fui-form-field--readonly:has(input:focus) .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--readonly .fui-form-field__input input,.fui-form-field--readonly .fui-form-field__input textarea,.fui-form-field--readonly .fui-form-field__input select{color:var(--fui-text-primary)!important;-webkit-text-fill-color:var(--fui-text-primary)!important;cursor:default;opacity:1}.fui-form-field--readonly .fui-form-field__input input::placeholder,.fui-form-field--readonly .fui-form-field__input textarea::placeholder,.fui-form-field--readonly .fui-form-field__input select::placeholder{color:var(--fui-text-disabled);-webkit-text-fill-color:var(--fui-text-disabled)}.fui-form-field--readonly .fui-form-field__wrapper:hover .fui-form-field__copy-btn{opacity:1;pointer-events:auto}.fui-form-field__prefix,.fui-form-field__suffix{display:flex;align-items:center;white-space:nowrap;flex:0 0 auto;position:relative;z-index:2;padding:0 var(--fui-spacing-2);color:var(--fui-text-secondary);font-size:var(--fui-text-base);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field--focused .fui-form-field__prefix,.fui-form-field--focused .fui-form-field__suffix{color:var(--fui-field-border-focus)}.fui-form-field--error .fui-form-field__prefix,.fui-form-field--error .fui-form-field__suffix{color:var(--fui-field-border-error)}.fui-form-field--disabled .fui-form-field__prefix,.fui-form-field--disabled .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--number-input .fui-form-field__wrapper{padding:0}.fui-form-field__infix{position:relative;flex:1 1 auto;min-width:0;padding:0;z-index:2}.fui-form-field__label{display:block;margin-bottom:var(--fui-form-field-label-spacing);font-size:var(--fui-form-field-label-font-size);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide);color:var(--fui-form-field-label-color);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__required-marker{color:var(--fui-text-error);margin-left:var(--fui-spacing-2);font-weight:var(--fui-weight-regular)}.fui-form-field__input{position:relative;width:100%}.fui-form-field__input input,.fui-form-field__input textarea,.fui-form-field__input select{width:100%;height:100%;border:none;outline:none;background:transparent;font-family:var(--fui-font-sans);font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-normal);color:var(--fui-text-primary);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__input input::placeholder,.fui-form-field__input textarea::placeholder,.fui-form-field__input select::placeholder{color:var(--fui-text-disabled);opacity:1;transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__input input:focus,.fui-form-field__input textarea:focus,.fui-form-field__input select:focus{outline:none}.fui-form-field__input input:focus-visible,.fui-form-field__input textarea:focus-visible,.fui-form-field__input select:focus-visible{outline:none}.fui-form-field__input input:disabled,.fui-form-field__input textarea:disabled,.fui-form-field__input select:disabled{color:var(--fui-text-disabled);-webkit-text-fill-color:var(--fui-text-disabled)}.fui-form-field__input input:-webkit-autofill,.fui-form-field__input input:-webkit-autofill:hover,.fui-form-field__input input:-webkit-autofill:focus,.fui-form-field__input input:-webkit-autofill:active,.fui-form-field__input textarea:-webkit-autofill,.fui-form-field__input textarea:-webkit-autofill:hover,.fui-form-field__input textarea:-webkit-autofill:focus,.fui-form-field__input textarea:-webkit-autofill:active,.fui-form-field__input select:-webkit-autofill,.fui-form-field__input select:-webkit-autofill:hover,.fui-form-field__input select:-webkit-autofill:focus,.fui-form-field__input select:-webkit-autofill:active{-webkit-box-shadow:0 0 0 100px var(--fui-form-field-bg) inset;-webkit-text-fill-color:var(--fui-text-primary);caret-color:var(--fui-text-primary);transition:background-color 5000s ease-in-out 0s,color 5000s ease-in-out 0s}.fui-form-field__input input[type=search]::-webkit-search-cancel-button,.fui-form-field__input input[type=search]::-webkit-search-decoration,.fui-form-field__input textarea[type=search]::-webkit-search-cancel-button,.fui-form-field__input textarea[type=search]::-webkit-search-decoration,.fui-form-field__input select[type=search]::-webkit-search-cancel-button,.fui-form-field__input select[type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none;display:none}.fui-form-field__input:has(input[type=color]){height:20px}.fui-form-field__copy-btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-form-field__copy-btn:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-form-field__copy-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5rem;height:1.5rem;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);opacity:0;pointer-events:none;transition-property:opacity,color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__copy-btn:hover{color:var(--fui-primary-fg)}.fui-form-field__clear-btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-form-field__clear-btn:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-form-field__clear-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5rem;height:1.5rem;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);cursor:pointer;transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__clear-btn:hover{color:var(--fui-text-primary)}.fui-form-field__clear-btn--hidden{visibility:hidden;pointer-events:none}.fui-form-field__subscript-wrapper{position:relative;min-height:1.25rem;padding:var(--fui-spacing-2) 0 0;font-size:var(--fui-text-sm);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide)}.fui-form-field__error-wrapper{color:var(--fui-form-field-error-color)}.fui-form-field__error{transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;font-weight:var(--fui-weight-regular)}.fui-form-field__hint-wrapper{color:var(--fui-form-field-hint-color)}.fui-form-field__hint{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;font-weight:var(--fui-weight-regular)}.fui-form-field--fill .fui-form-field__wrapper{background-color:var(--fui-bg-muted);border-bottom:var(--fui-border-width-md) solid var(--fui-form-field-border-color);border-top:none;border-left:none;border-right:none;border-radius:var(--fui-radius-sm) var(--fui-radius-sm) 0 0}.fui-form-field--fill:hover:not(.fui-form-field--disabled) .fui-form-field__wrapper{background-color:var(--fui-bg-muted);border-top:none;border-left:none;border-right:none}.fui-form-field--fill.fui-form-field--focused .fui-form-field__wrapper,.fui-form-field--fill:has(input:focus) .fui-form-field__wrapper,.fui-form-field--fill:has(select:focus) .fui-form-field__wrapper{border-bottom-color:var(--fui-border-primary);border-top:none!important;border-left:none!important;border-right:none!important}.fui-form-field--fill.fui-form-field--error .fui-form-field__wrapper{border-bottom-color:var(--fui-border-error);border-top:none;border-left:none;border-right:none}.fui-form-field__input textarea{min-height:5rem;resize:vertical;padding:var(--fui-spacing-4) 0;line-height:1.4}.fui-form-field__input select{cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:var(--fui-spacing-9)}.fui-form-field__input select::-ms-expand{display:none}.fui-form-field__input select:disabled{cursor:not-allowed}.fui-form-field__input select option{padding:var(--fui-spacing-2);background-color:var(--fui-bg-default);color:var(--fui-text-primary)}.fui-form-field:has(select:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-primary)!important;background-color:var(--fui-bg-default);position:relative;box-shadow:0 0 0 4px var(--fui-primary-20)}.fui-form-field:has(select:focus) .fui-form-field__prefix,.fui-form-field:has(select:focus) .fui-form-field__suffix{color:var(--fui-primary-fg)}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "directive", type: FuiTooltipDirective, selector: "[fuiTooltip]", inputs: ["fuiTooltip", "fuiTooltipPosition", "fuiTooltipSize", "fuiTooltipTextAlign", "fuiTooltipTrigger", "fuiTooltipShowDelay", "fuiTooltipHideDelay", "fuiTooltipDisabled", "fuiTooltipMaxWidth", "fuiTooltipOffset", "fuiTooltipArrow", "fuiTooltipShow"], exportAs: ["fuiTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
363
382
|
}
|
|
364
383
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiFormFieldComponent, decorators: [{
|
|
365
384
|
type: Component,
|
|
@@ -380,7 +399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
380
399
|
role: 'group',
|
|
381
400
|
'[attr.aria-labelledby]': 'labelId',
|
|
382
401
|
'[attr.aria-disabled]': 'isDisabled() || null',
|
|
383
|
-
}, template: "<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !isReadonly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper \u2014 always visible, styled as read-only when applicable -->\r\n <div\r\n #wrapper\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"isReadonly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || showCopyButton()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n <!-- Copy button \u2014 visible only in readOnly on hover -->\r\n @if (showCopyButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? intl.copiedAriaLabel : intl.copyAriaLabel\"\r\n [fuiTooltip]=\"copied() ? intl.copiedTooltip : intl.copyTooltip\"\r\n fuiTooltipPosition=\"top\"\r\n fuiTooltipSize=\"sm\"\r\n [fuiTooltipShowDelay]=\"copied() ? 0 : 300\"\r\n fuiTooltipTrigger=\"manual\"\r\n [fuiTooltipShow]=\"copied()\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n <!-- The strength meter and the error are exclusive -->\r\n @if (hasError() && !showStrengthMeter()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (showStrengthMeter()) {\r\n <ng-content select=\"fui-strength-meter\"></ng-content>\r\n }\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-form-field{--fui-form-field-height: var(--fui-input-height);--fui-form-field-font-size: var(--fui-text-base);--fui-form-field-border-radius: var(--fui-radius-sm);--fui-form-field-padding-x: var(--fui-spacing-6);--fui-form-field-bg: var(--fui-bg-subtle);--fui-form-field-border-color: var(--fui-border-default);--fui-form-field-label-color: var(--fui-text-primary);--fui-form-field-label-font-size: var(--fui-text-sm);--fui-form-field-label-spacing: var(--fui-spacing-2);--fui-form-field-hint-color: var(--fui-text-secondary);--fui-form-field-error-color: var(--fui-field-border-error);display:block;position:relative;font-family:var(--fui-font-sans);font-size:var(--fui-form-field-font-size)}.fui-form-field__container{display:block;width:100%}.fui-form-field__wrapper{position:relative;display:flex;align-items:center;width:100%;min-height:var(--fui-form-field-height);cursor:text;transition-property:background-color,border-color,box-shadow;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;background-color:var(--fui-form-field-bg);border:var(--fui-border-width-sm) solid var(--fui-form-field-border-color);border-radius:var(--fui-form-field-border-radius);padding:0 var(--fui-form-field-padding-x);box-shadow:var(--fui-shadow-xs);overflow:hidden}.fui-form-field:hover:not(.fui-form-field--disabled):not(.fui-form-field--readonly):not(.fui-form-field--error) .fui-form-field__wrapper{background-color:var(--fui-bg-default);border-color:var(--fui-border-primary)}.fui-form-field.fui-form-field--error .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-error);outline:2px solid var(--fui-error-20)}.fui-form-field.fui-form-field--error.fui-form-field--focused .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-error)}.fui-form-field:has(input:focus) .fui-form-field__wrapper,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-primary)!important;background-color:var(--fui-bg-default);position:relative;outline:2px solid var(--fui-primary-10)}.fui-form-field:has(input:focus) .fui-form-field__prefix,.fui-form-field:has(input:focus) .fui-form-field__suffix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__prefix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__suffix{color:var(--fui-primary-fg)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__label{color:var(--fui-text-disabled)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__wrapper{box-shadow:none;cursor:not-allowed;color:var(--fui-text-disabled);background-color:var(--fui-bg-muted)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__prefix,.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__suffix{color:var(--fui-text-disabled)}.fui-form-field--disabled:not(.fui-form-field--readonly) input,.fui-form-field--disabled:not(.fui-form-field--readonly) textarea,.fui-form-field--disabled:not(.fui-form-field--readonly) select{cursor:not-allowed}.fui-form-field--readonly .fui-form-field__wrapper{box-shadow:none;cursor:default;color:var(--fui-text-primary);background-color:var(--fui-bg-subtle)}.fui-form-field--readonly:has(input:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-default)!important;box-shadow:none;background-color:var(--fui-bg-default)}.fui-form-field--readonly:has(input:focus) .fui-form-field__prefix,.fui-form-field--readonly:has(input:focus) .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--readonly .fui-form-field__input input,.fui-form-field--readonly .fui-form-field__input textarea,.fui-form-field--readonly .fui-form-field__input select{color:var(--fui-text-primary)!important;-webkit-text-fill-color:var(--fui-text-primary)!important;cursor:default;opacity:1}.fui-form-field--readonly .fui-form-field__input input::placeholder,.fui-form-field--readonly .fui-form-field__input textarea::placeholder,.fui-form-field--readonly .fui-form-field__input select::placeholder{color:var(--fui-text-disabled);-webkit-text-fill-color:var(--fui-text-disabled)}.fui-form-field--readonly .fui-form-field__wrapper:hover .fui-form-field__copy-btn{opacity:1;pointer-events:auto}.fui-form-field__prefix,.fui-form-field__suffix{display:flex;align-items:center;white-space:nowrap;flex:0 0 auto;position:relative;z-index:2;padding:0 var(--fui-spacing-2);color:var(--fui-text-secondary);font-size:var(--fui-text-base);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field--focused .fui-form-field__prefix,.fui-form-field--focused .fui-form-field__suffix{color:var(--fui-field-border-focus)}.fui-form-field--error .fui-form-field__prefix,.fui-form-field--error .fui-form-field__suffix{color:var(--fui-field-border-error)}.fui-form-field--disabled .fui-form-field__prefix,.fui-form-field--disabled .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--number-input .fui-form-field__wrapper{padding:0}.fui-form-field__infix{position:relative;flex:1 1 auto;min-width:0;padding:0;z-index:2}.fui-form-field__label{display:block;margin-bottom:var(--fui-form-field-label-spacing);font-size:var(--fui-form-field-label-font-size);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide);color:var(--fui-form-field-label-color);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__required-marker{color:var(--fui-text-error);margin-left:var(--fui-spacing-2);font-weight:var(--fui-weight-regular)}.fui-form-field__input{position:relative;width:100%}.fui-form-field__input input,.fui-form-field__input textarea,.fui-form-field__input select{width:100%;height:100%;border:none;outline:none;background:transparent;font-family:var(--fui-font-sans);font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-normal);color:var(--fui-text-primary);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__input input::placeholder,.fui-form-field__input textarea::placeholder,.fui-form-field__input select::placeholder{color:var(--fui-text-disabled);opacity:1;transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__input input:focus,.fui-form-field__input textarea:focus,.fui-form-field__input select:focus{outline:none}.fui-form-field__input input:focus-visible,.fui-form-field__input textarea:focus-visible,.fui-form-field__input select:focus-visible{outline:none}.fui-form-field__input input:disabled,.fui-form-field__input textarea:disabled,.fui-form-field__input select:disabled{color:var(--fui-text-disabled);-webkit-text-fill-color:var(--fui-text-disabled)}.fui-form-field__input input:-webkit-autofill,.fui-form-field__input input:-webkit-autofill:hover,.fui-form-field__input input:-webkit-autofill:focus,.fui-form-field__input input:-webkit-autofill:active,.fui-form-field__input textarea:-webkit-autofill,.fui-form-field__input textarea:-webkit-autofill:hover,.fui-form-field__input textarea:-webkit-autofill:focus,.fui-form-field__input textarea:-webkit-autofill:active,.fui-form-field__input select:-webkit-autofill,.fui-form-field__input select:-webkit-autofill:hover,.fui-form-field__input select:-webkit-autofill:focus,.fui-form-field__input select:-webkit-autofill:active{-webkit-box-shadow:0 0 0 100px var(--fui-form-field-bg) inset;-webkit-text-fill-color:var(--fui-text-primary);caret-color:var(--fui-text-primary);transition:background-color 5000s ease-in-out 0s,color 5000s ease-in-out 0s}.fui-form-field__input:has(input[type=color]){height:20px}.fui-form-field__copy-btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-form-field__copy-btn:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-form-field__copy-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5rem;height:1.5rem;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);opacity:0;pointer-events:none;transition-property:opacity,color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__copy-btn:hover{color:var(--fui-primary-fg)}.fui-form-field__subscript-wrapper{position:relative;min-height:1.25rem;padding:var(--fui-spacing-2) 0 0;font-size:var(--fui-text-sm);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide)}.fui-form-field__error-wrapper{color:var(--fui-form-field-error-color)}.fui-form-field__error{transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;font-weight:var(--fui-weight-regular)}.fui-form-field__hint-wrapper{color:var(--fui-form-field-hint-color)}.fui-form-field__hint{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;font-weight:var(--fui-weight-regular)}.fui-form-field--fill .fui-form-field__wrapper{background-color:var(--fui-bg-muted);border-bottom:var(--fui-border-width-md) solid var(--fui-form-field-border-color);border-top:none;border-left:none;border-right:none;border-radius:var(--fui-radius-sm) var(--fui-radius-sm) 0 0}.fui-form-field--fill:hover:not(.fui-form-field--disabled) .fui-form-field__wrapper{background-color:var(--fui-bg-muted);border-top:none;border-left:none;border-right:none}.fui-form-field--fill.fui-form-field--focused .fui-form-field__wrapper,.fui-form-field--fill:has(input:focus) .fui-form-field__wrapper,.fui-form-field--fill:has(select:focus) .fui-form-field__wrapper{border-bottom-color:var(--fui-border-primary);border-top:none!important;border-left:none!important;border-right:none!important}.fui-form-field--fill.fui-form-field--error .fui-form-field__wrapper{border-bottom-color:var(--fui-border-error);border-top:none;border-left:none;border-right:none}.fui-form-field__input textarea{min-height:5rem;resize:vertical;padding:var(--fui-spacing-4) 0;line-height:1.4}.fui-form-field__input select{cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:var(--fui-spacing-9)}.fui-form-field__input select::-ms-expand{display:none}.fui-form-field__input select:disabled{cursor:not-allowed}.fui-form-field__input select option{padding:var(--fui-spacing-2);background-color:var(--fui-bg-default);color:var(--fui-text-primary)}.fui-form-field:has(select:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-primary)!important;background-color:var(--fui-bg-default);position:relative;box-shadow:0 0 0 4px var(--fui-primary-20)}.fui-form-field:has(select:focus) .fui-form-field__prefix,.fui-form-field:has(select:focus) .fui-form-field__suffix{color:var(--fui-primary-fg)}\n"] }]
|
|
402
|
+
}, template: "<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !isReadonly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper \u2014 always visible, styled as read-only when applicable -->\r\n <div\r\n #wrapper\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"isReadonly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || showCopyButton() || isSearchInput()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n <!-- Clear button \u2014 always reserves its slot for search inputs (so the\r\n field width stays stable), hidden until a value is present. -->\r\n @if (isSearchInput()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__clear-btn\"\r\n [class.fui-form-field__clear-btn--hidden]=\"!showClearButton()\"\r\n tabindex=\"-1\"\r\n [attr.aria-hidden]=\"!showClearButton()\"\r\n [disabled]=\"!showClearButton()\"\r\n (click)=\"clearControl($event)\"\r\n [attr.aria-label]=\"intl.clearAriaLabel\"\r\n >\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n <!-- Copy button \u2014 visible only in readOnly on hover -->\r\n @if (showCopyButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? intl.copiedAriaLabel : intl.copyAriaLabel\"\r\n [fuiTooltip]=\"copied() ? intl.copiedTooltip : intl.copyTooltip\"\r\n fuiTooltipPosition=\"top\"\r\n fuiTooltipSize=\"sm\"\r\n [fuiTooltipShowDelay]=\"copied() ? 0 : 300\"\r\n fuiTooltipTrigger=\"manual\"\r\n [fuiTooltipShow]=\"copied()\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n <!-- The strength meter and the error are exclusive -->\r\n @if (hasError() && !showStrengthMeter()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (showStrengthMeter()) {\r\n <ng-content select=\"fui-strength-meter\"></ng-content>\r\n }\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-form-field{--fui-form-field-height: var(--fui-input-height);--fui-form-field-font-size: var(--fui-text-base);--fui-form-field-border-radius: var(--fui-radius-sm);--fui-form-field-padding-x: var(--fui-spacing-6);--fui-form-field-bg: var(--fui-bg-subtle);--fui-form-field-border-color: var(--fui-border-default);--fui-form-field-label-color: var(--fui-text-primary);--fui-form-field-label-font-size: var(--fui-text-sm);--fui-form-field-label-spacing: var(--fui-spacing-2);--fui-form-field-hint-color: var(--fui-text-secondary);--fui-form-field-error-color: var(--fui-field-border-error);display:block;position:relative;font-family:var(--fui-font-sans);font-size:var(--fui-form-field-font-size)}.fui-form-field__container{display:block;width:100%}.fui-form-field__wrapper{position:relative;display:flex;align-items:center;width:100%;min-height:var(--fui-form-field-height);cursor:text;transition-property:background-color,border-color,box-shadow;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;background-color:var(--fui-form-field-bg);border:var(--fui-border-width-sm) solid var(--fui-form-field-border-color);border-radius:var(--fui-form-field-border-radius);padding:0 var(--fui-form-field-padding-x);box-shadow:var(--fui-shadow-xs);overflow:hidden}.fui-form-field:hover:not(.fui-form-field--disabled):not(.fui-form-field--readonly):not(.fui-form-field--error) .fui-form-field__wrapper{background-color:var(--fui-bg-default);border-color:var(--fui-border-primary)}.fui-form-field.fui-form-field--error .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-error);outline:2px solid var(--fui-error-20)}.fui-form-field.fui-form-field--error.fui-form-field--focused .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-error)}.fui-form-field:has(input:focus) .fui-form-field__wrapper,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-primary)!important;background-color:var(--fui-bg-default);position:relative;outline:2px solid var(--fui-primary-10)}.fui-form-field:has(input:focus) .fui-form-field__prefix,.fui-form-field:has(input:focus) .fui-form-field__suffix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__prefix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__suffix{color:var(--fui-primary-fg)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__label{color:var(--fui-text-disabled)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__wrapper{box-shadow:none;cursor:not-allowed;color:var(--fui-text-disabled);background-color:var(--fui-bg-muted)}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__prefix,.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__suffix{color:var(--fui-text-disabled)}.fui-form-field--disabled:not(.fui-form-field--readonly) input,.fui-form-field--disabled:not(.fui-form-field--readonly) textarea,.fui-form-field--disabled:not(.fui-form-field--readonly) select{cursor:not-allowed}.fui-form-field--readonly .fui-form-field__wrapper{box-shadow:none;cursor:default;color:var(--fui-text-primary);background-color:var(--fui-bg-subtle)}.fui-form-field--readonly:has(input:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-default)!important;box-shadow:none;background-color:var(--fui-bg-default)}.fui-form-field--readonly:has(input:focus) .fui-form-field__prefix,.fui-form-field--readonly:has(input:focus) .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--readonly .fui-form-field__input input,.fui-form-field--readonly .fui-form-field__input textarea,.fui-form-field--readonly .fui-form-field__input select{color:var(--fui-text-primary)!important;-webkit-text-fill-color:var(--fui-text-primary)!important;cursor:default;opacity:1}.fui-form-field--readonly .fui-form-field__input input::placeholder,.fui-form-field--readonly .fui-form-field__input textarea::placeholder,.fui-form-field--readonly .fui-form-field__input select::placeholder{color:var(--fui-text-disabled);-webkit-text-fill-color:var(--fui-text-disabled)}.fui-form-field--readonly .fui-form-field__wrapper:hover .fui-form-field__copy-btn{opacity:1;pointer-events:auto}.fui-form-field__prefix,.fui-form-field__suffix{display:flex;align-items:center;white-space:nowrap;flex:0 0 auto;position:relative;z-index:2;padding:0 var(--fui-spacing-2);color:var(--fui-text-secondary);font-size:var(--fui-text-base);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field--focused .fui-form-field__prefix,.fui-form-field--focused .fui-form-field__suffix{color:var(--fui-field-border-focus)}.fui-form-field--error .fui-form-field__prefix,.fui-form-field--error .fui-form-field__suffix{color:var(--fui-field-border-error)}.fui-form-field--disabled .fui-form-field__prefix,.fui-form-field--disabled .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--number-input .fui-form-field__wrapper{padding:0}.fui-form-field__infix{position:relative;flex:1 1 auto;min-width:0;padding:0;z-index:2}.fui-form-field__label{display:block;margin-bottom:var(--fui-form-field-label-spacing);font-size:var(--fui-form-field-label-font-size);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide);color:var(--fui-form-field-label-color);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__required-marker{color:var(--fui-text-error);margin-left:var(--fui-spacing-2);font-weight:var(--fui-weight-regular)}.fui-form-field__input{position:relative;width:100%}.fui-form-field__input input,.fui-form-field__input textarea,.fui-form-field__input select{width:100%;height:100%;border:none;outline:none;background:transparent;font-family:var(--fui-font-sans);font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-normal);color:var(--fui-text-primary);transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__input input::placeholder,.fui-form-field__input textarea::placeholder,.fui-form-field__input select::placeholder{color:var(--fui-text-disabled);opacity:1;transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__input input:focus,.fui-form-field__input textarea:focus,.fui-form-field__input select:focus{outline:none}.fui-form-field__input input:focus-visible,.fui-form-field__input textarea:focus-visible,.fui-form-field__input select:focus-visible{outline:none}.fui-form-field__input input:disabled,.fui-form-field__input textarea:disabled,.fui-form-field__input select:disabled{color:var(--fui-text-disabled);-webkit-text-fill-color:var(--fui-text-disabled)}.fui-form-field__input input:-webkit-autofill,.fui-form-field__input input:-webkit-autofill:hover,.fui-form-field__input input:-webkit-autofill:focus,.fui-form-field__input input:-webkit-autofill:active,.fui-form-field__input textarea:-webkit-autofill,.fui-form-field__input textarea:-webkit-autofill:hover,.fui-form-field__input textarea:-webkit-autofill:focus,.fui-form-field__input textarea:-webkit-autofill:active,.fui-form-field__input select:-webkit-autofill,.fui-form-field__input select:-webkit-autofill:hover,.fui-form-field__input select:-webkit-autofill:focus,.fui-form-field__input select:-webkit-autofill:active{-webkit-box-shadow:0 0 0 100px var(--fui-form-field-bg) inset;-webkit-text-fill-color:var(--fui-text-primary);caret-color:var(--fui-text-primary);transition:background-color 5000s ease-in-out 0s,color 5000s ease-in-out 0s}.fui-form-field__input input[type=search]::-webkit-search-cancel-button,.fui-form-field__input input[type=search]::-webkit-search-decoration,.fui-form-field__input textarea[type=search]::-webkit-search-cancel-button,.fui-form-field__input textarea[type=search]::-webkit-search-decoration,.fui-form-field__input select[type=search]::-webkit-search-cancel-button,.fui-form-field__input select[type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none;display:none}.fui-form-field__input:has(input[type=color]){height:20px}.fui-form-field__copy-btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-form-field__copy-btn:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-form-field__copy-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5rem;height:1.5rem;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);opacity:0;pointer-events:none;transition-property:opacity,color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__copy-btn:hover{color:var(--fui-primary-fg)}.fui-form-field__clear-btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-form-field__clear-btn:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-form-field__clear-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5rem;height:1.5rem;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);cursor:pointer;transition-property:color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-form-field__clear-btn:hover{color:var(--fui-text-primary)}.fui-form-field__clear-btn--hidden{visibility:hidden;pointer-events:none}.fui-form-field__subscript-wrapper{position:relative;min-height:1.25rem;padding:var(--fui-spacing-2) 0 0;font-size:var(--fui-text-sm);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide)}.fui-form-field__error-wrapper{color:var(--fui-form-field-error-color)}.fui-form-field__error{transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;font-weight:var(--fui-weight-regular)}.fui-form-field__hint-wrapper{color:var(--fui-form-field-hint-color)}.fui-form-field__hint{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;font-weight:var(--fui-weight-regular)}.fui-form-field--fill .fui-form-field__wrapper{background-color:var(--fui-bg-muted);border-bottom:var(--fui-border-width-md) solid var(--fui-form-field-border-color);border-top:none;border-left:none;border-right:none;border-radius:var(--fui-radius-sm) var(--fui-radius-sm) 0 0}.fui-form-field--fill:hover:not(.fui-form-field--disabled) .fui-form-field__wrapper{background-color:var(--fui-bg-muted);border-top:none;border-left:none;border-right:none}.fui-form-field--fill.fui-form-field--focused .fui-form-field__wrapper,.fui-form-field--fill:has(input:focus) .fui-form-field__wrapper,.fui-form-field--fill:has(select:focus) .fui-form-field__wrapper{border-bottom-color:var(--fui-border-primary);border-top:none!important;border-left:none!important;border-right:none!important}.fui-form-field--fill.fui-form-field--error .fui-form-field__wrapper{border-bottom-color:var(--fui-border-error);border-top:none;border-left:none;border-right:none}.fui-form-field__input textarea{min-height:5rem;resize:vertical;padding:var(--fui-spacing-4) 0;line-height:1.4}.fui-form-field__input select{cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:var(--fui-spacing-9)}.fui-form-field__input select::-ms-expand{display:none}.fui-form-field__input select:disabled{cursor:not-allowed}.fui-form-field__input select option{padding:var(--fui-spacing-2);background-color:var(--fui-bg-default);color:var(--fui-text-primary)}.fui-form-field:has(select:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-primary)!important;background-color:var(--fui-bg-default);position:relative;box-shadow:0 0 0 4px var(--fui-primary-20)}.fui-form-field:has(select:focus) .fui-form-field__prefix,.fui-form-field:has(select:focus) .fui-form-field__suffix{color:var(--fui-primary-fg)}\n"] }]
|
|
384
403
|
}], ctorParameters: () => [], propDecorators: { appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], hideRequiredMarker: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideRequiredMarker", required: false }] }], control: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FUI_FORM_FIELD_CONTROL), { isSignal: true }] }], _prefixes: [{
|
|
385
404
|
type: ContentChildren,
|
|
386
405
|
args: [FuiPrefixDirective, { descendants: true }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-form-field.mjs","sources":["../../../lib/components/form-field/prefix.directive.ts","../../../lib/components/form-field/suffix.directive.ts","../../../lib/components/form-field/form-field.intl.ts","../../../lib/components/form-field/form-field-tokens.ts","../../../lib/components/form-field/form-field.component.ts","../../../lib/components/form-field/form-field.component.html","../../../lib/components/form-field/error.component.ts","../../../lib/components/form-field/hint.component.ts","../../../lib/components/form-field/label.component.ts","../../../lib/components/form-field/raintonic-formaui-components-form-field.ts"],"sourcesContent":["import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Prefix directive for content to be placed before the input in fui-form-field\r\n *\r\n * @example\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Price</fui-label>\r\n * <span fuiPrefix>$</span>\r\n * <input fuiInput type=\"number\">\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiPrefix]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-prefix',\r\n },\r\n})\r\nexport class FuiPrefixDirective {}\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Suffix directive for content to be placed after the input in fui-form-field\r\n *\r\n * @example\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Weight</fui-label>\r\n * <input fuiInput type=\"number\">\r\n * <span fuiSuffix>kg</span>\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiSuffix]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-suffix',\r\n },\r\n})\r\nexport class FuiSuffixDirective {}\r\n","import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiFormFieldIntl extends FuiIntlBase {\r\n copyAriaLabel = 'Copy value';\r\n copiedAriaLabel = 'Copied';\r\n copyTooltip = 'Copy';\r\n copiedTooltip = 'Copied';\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { ElementRef } from '@angular/core';\r\n\r\n/**\r\n * Interface exposed by FuiFormFieldComponent for child controls.\r\n *\r\n * Child controls (select, autocomplete, date-picker) inject this token to\r\n * access the form-field's overlay origin element — typically the wrapper\r\n * container whose width the overlay panel should match.\r\n */\r\nexport interface FuiFormFieldParent {\r\n /**\r\n * Returns the element that should be used as the width reference for\r\n * overlay panels (e.g. select dropdown, autocomplete panel).\r\n * This is typically the form-field wrapper element so the overlay\r\n * correctly spans prefix/suffix areas.\r\n */\r\n getConnectedOverlayOrigin(): ElementRef<HTMLElement>;\r\n}\r\n\r\n/**\r\n * Injection token for the parent form-field component.\r\n * Child controls inject this (via @Optional()) to coordinate with the\r\n * containing form-field without coupling to the component class directly.\r\n */\r\nexport const FUI_FORM_FIELD = new InjectionToken<FuiFormFieldParent>('FuiFormField');\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n contentChild,\r\n ContentChildren,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n input,\r\n InputSignal,\r\n QueryList,\r\n Signal,\r\n signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { FuiPrefixDirective } from './prefix.directive';\r\nimport { FuiSuffixDirective } from './suffix.directive';\r\nimport { FUI_FORM_FIELD_CONTROL } from '@raintonic/formaui/core';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\r\nimport { FuiFormFieldIntl } from './form-field.intl';\r\nimport { FUI_STRENGTH_METER } from '@raintonic/formaui/core';\r\nimport { FUI_FORM_FIELD, FuiFormFieldParent } from './form-field-tokens';\r\n\r\n/**\r\n * Available form field appearance modes.\r\n * - `'outline'` — default bordered appearance (Carbon Design System style)\r\n * - `'fill'` — filled background with bottom-border only\r\n */\r\nexport type FormFieldAppearance = 'outline' | 'fill';\r\n\r\n/**\r\n * # FormField Component\r\n *\r\n * A form field wrapper component that provides consistent styling and behavior\r\n * for form controls. Follows Angular Material patterns with Carbon Design System styling.\r\n *\r\n * ## Features\r\n * - Floating labels with configurable behavior\r\n * - Error message display with animations\r\n * - Helper text support\r\n * - Prefix and suffix support\r\n * - Outline appearance with Carbon Design System styling\r\n * - Full accessibility support\r\n * - Automatic integration with form controls\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Form Field\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\" placeholder=\"Enter your email\">\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Error Messages\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Username</fui-label>\r\n * <input fuiInput formControlName=\"username\">\r\n * <fui-error key=\"required\">Username is required</fui-error>\r\n * <fui-error key=\"minlength\">Username must be at least 3 characters</fui-error>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Helper Text and Icons\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Password</fui-label>\r\n * <fui-icon fuiPrefix name=\"lock\"></fui-icon>\r\n * <input fuiInput type=\"password\">\r\n * <button fuiSuffix fuiButton variant=\"tertiary\" (click)=\"togglePasswordVisibility()\">\r\n * <fui-icon [name]=\"showPassword ? 'eye-slash' : 'eye'\"></fui-icon>\r\n * </button>\r\n * <fui-hint>Must be at least 8 characters</fui-hint>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\r\n * import { FuiInputDirective } from '@raintonic/formaui/components/input';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiFormFieldComponent, FuiInputDirective, ReactiveFormsModule],\r\n * template: `\r\n * <form [formGroup]=\"form\">\r\n * <fui-form-field>\r\n * <fui-label>Email Address</fui-label>\r\n * <input fuiInput type=\"email\" formControlName=\"email\">\r\n * <fui-error key=\"required\">Email is required</fui-error>\r\n * <fui-error key=\"email\">Please enter a valid email</fui-error>\r\n * </fui-form-field>\r\n * </form>\r\n * `\r\n * })\r\n * export class MyFormComponent {\r\n * form = this.fb.group({\r\n * email: ['', [Validators.required, Validators.email]]\r\n * });\r\n *\r\n * get emailControl() {\r\n * return this.form.get('email');\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-form-field',\r\n standalone: true,\r\n imports: [FuiIconComponent, FuiTooltipDirective],\r\n templateUrl: './form-field.component.html',\r\n styleUrls: ['./form-field.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: FUI_FORM_FIELD,\r\n useExisting: forwardRef(() => FuiFormFieldComponent),\r\n },\r\n ],\r\n host: {\r\n class: 'fui-form-field',\r\n '[class.fui-form-field--disabled]': 'isDisabled()',\r\n '[class.fui-form-field--focused]': 'isFocused()',\r\n '[class.fui-form-field--error]': 'hasError()',\r\n '[class.fui-form-field--empty]': 'isEmpty()',\r\n '[class.fui-form-field--readonly]': 'isReadonly()',\r\n '[class.fui-form-field--fill]': 'appearance() === \"fill\"',\r\n '[class.fui-form-field--number-input]': 'isNumberInput()',\r\n role: 'group',\r\n '[attr.aria-labelledby]': 'labelId',\r\n '[attr.aria-disabled]': 'isDisabled() || null',\r\n },\r\n})\r\nexport class FuiFormFieldComponent implements FuiFormFieldParent {\r\n readonly intl = inject(FuiFormFieldIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n /**\r\n * Visual appearance variant.\r\n * - `'outline'` (default): bordered input with label above\r\n * - `'fill'`: filled background with bottom-border accent\r\n */\r\n readonly appearance = input<FormFieldAppearance>('outline');\r\n\r\n /**\r\n * Whether to hide the required marker\r\n * @default false\r\n */\r\n readonly hideRequiredMarker: InputSignal<boolean> = input(false);\r\n\r\n // Content children\r\n control = contentChild(FUI_FORM_FIELD_CONTROL);\r\n\r\n @ContentChildren(FuiPrefixDirective, { descendants: true }) _prefixes?: QueryList<FuiPrefixDirective>;\r\n @ContentChildren(FuiSuffixDirective, { descendants: true }) _suffixes?: QueryList<FuiSuffixDirective>;\r\n @ViewChild('connectionContainer', { static: true }) _connectionContainerRef?: ElementRef<HTMLElement>;\r\n @ViewChild('wrapper', { static: true }) private readonly _wrapperRef?: ElementRef<HTMLElement>;\r\n\r\n hideSubscript = input(false, { transform: booleanAttribute });\r\n\r\n // Strength meter content child — used to determine whether hints should be suppressed\r\n readonly strengthMeter = contentChild(FUI_STRENGTH_METER);\r\n\r\n // Read-only display value derived from the control's value\r\n // For select/autocomplete controls, uses their displayValue signal to show the label\r\n readonly displayValue: Signal<string> = computed(() => {\r\n const control = this.control();\r\n if (!control) return '\\u2014';\r\n\r\n // Select and autocomplete controls expose a displayValue signal with the option label\r\n if (\r\n 'displayValue' in control &&\r\n typeof (control as unknown as Record<string, unknown>)['displayValue'] === 'function'\r\n ) {\r\n const label = ((control as unknown as Record<string, unknown>)['displayValue'] as () => string)();\r\n return label || '\\u2014';\r\n }\r\n\r\n const val = control.value();\r\n if (val == null || val === '') return '\\u2014';\r\n return String(val);\r\n });\r\n\r\n // State signals\r\n readonly isFocused: Signal<boolean> = computed(() => {\r\n return this.control()?.focused() ?? false;\r\n });\r\n readonly hasError: Signal<boolean> = computed(() => {\r\n return this.control()?.errorState() ?? false;\r\n });\r\n readonly isDisabled: Signal<boolean> = computed(() => {\r\n return this.control()?.disabled() ?? false;\r\n });\r\n readonly isReadonly: Signal<boolean> = computed(() => {\r\n return this.control()?.readonly() ?? false;\r\n });\r\n readonly isEmpty: Signal<boolean> = computed(() => {\r\n return this.control()?.empty() ?? false;\r\n });\r\n readonly isRequired: Signal<boolean> = computed(() => {\r\n return this.control()?.required() ?? false;\r\n });\r\n\r\n /** Whether the projected control is a fui-number-input (needs zero horizontal padding) */\r\n readonly isNumberInput: Signal<boolean> = computed(() => {\r\n return this.control()?.controlType === 'fui-number-input';\r\n });\r\n\r\n /** Whether control-specific icons (dropdown caret, calendar) should be hidden in readOnly mode */\r\n readonly hideControlIcons: Signal<boolean> = computed(() => {\r\n if (!this.isReadonly()) return false;\r\n const ct = this.control()?.controlType;\r\n return ct === 'fui-select' || ct === 'fui-autocomplete' || ct === 'fui-date-picker';\r\n });\r\n\r\n /** Whether the copy button should appear in read-only mode.\r\n * Delegates to the control's `readonlyCopyEnabled()` method.\r\n * Only plain inputs (`fuiInput`) opt in — defaults to `false`. */\r\n readonly showCopyButton: Signal<boolean> = computed(() => {\r\n const control = this.control();\r\n return this.isReadonly() && (control?.readonlyCopyEnabled?.() ?? false);\r\n });\r\n\r\n /** Whether the \"copied\" feedback indicator is active */\r\n readonly copied: WritableSignal<boolean> = signal(false);\r\n private _copiedTimeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n // Generate unique IDs\r\n readonly labelId = `fui-form-field-label-${Math.random().toString(36).substring(2, 11)}`;\r\n readonly hintId = `fui-form-field-hint-${Math.random().toString(36).substring(2, 11)}`;\r\n\r\n /** Whether the strength meter should be shown. Visible only when the control\r\n * has a non-empty value (i.e. the user has typed something). */\r\n readonly showStrengthMeter: Signal<boolean> = computed(() => {\r\n const ctrl = this.control();\r\n if (!ctrl) return false;\r\n return !ctrl.empty() && !!this.strengthMeter();\r\n });\r\n\r\n readonly errorId = `fui-form-field-error-${Math.random().toString(36).substring(2, 11)}`;\r\n\r\n constructor() {\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this._cdr.markForCheck();\r\n });\r\n\r\n // Effect to update aria-describedby when state changes\r\n effect(() => {\r\n const control = this.control();\r\n if (!control) {\r\n return;\r\n }\r\n const ids: string[] = [];\r\n if (this.hasError()) {\r\n ids.push(this.errorId);\r\n } else {\r\n ids.push(this.hintId);\r\n }\r\n\r\n control.setDescribedByIds(ids);\r\n });\r\n }\r\n\r\n /**\r\n * Returns the element that overlay panels (select, autocomplete, date-picker)\r\n * should use as their width reference. This is the form-field wrapper which\r\n * spans the full width including prefix/suffix areas.\r\n */\r\n getConnectedOverlayOrigin(): ElementRef<HTMLElement> {\r\n return this._wrapperRef ?? this._connectionContainerRef ?? this._elementRef;\r\n }\r\n\r\n /**\r\n * Handles click on the form field container\r\n */\r\n onContainerClick(event: MouseEvent): void {\r\n const control = this.control();\r\n if (control && !this.isDisabled() && !this.isReadonly()) {\r\n control.onContainerClick(event);\r\n }\r\n }\r\n\r\n /**\r\n * Copies the display value to the clipboard\r\n */\r\n copyValue(): void {\r\n const text = this.displayValue();\r\n if (!text || text === '\\u2014') return;\r\n\r\n void navigator.clipboard.writeText(text).then(() => {\r\n this.copied.set(true);\r\n if (this._copiedTimeout) clearTimeout(this._copiedTimeout);\r\n this._copiedTimeout = setTimeout(() => {\r\n this.copied.set(false);\r\n this._copiedTimeout = null;\r\n }, 1500);\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current error messages\r\n */\r\n getErrorMessages(): string[] {\r\n // This would be populated by projected fui-error components\r\n // Implementation would query ContentChildren for error components\r\n return [];\r\n }\r\n\r\n /**\r\n * Checks if the form field contains a select control\r\n */\r\n hasSelectControl(): boolean {\r\n const control = this.control();\r\n if (!control) return false;\r\n\r\n // Check if it's the full fui-select component\r\n if (control.controlType === 'fui-select') {\r\n return true;\r\n }\r\n\r\n // Check if it's fuiInput directive on a select element\r\n if (\r\n control.controlType === 'fui-input' &&\r\n typeof (control as unknown as Record<string, unknown>)['isSelect'] === 'function'\r\n ) {\r\n return ((control as unknown as Record<string, unknown>)['isSelect'] as () => boolean)();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the select control is a multiple select\r\n */\r\n isMultipleSelect(): boolean {\r\n if (!this.hasSelectControl()) {\r\n return false;\r\n }\r\n // Check if the control has a multiple property and it's true\r\n const ctrl = this.control() as unknown as Record<string, unknown> | undefined;\r\n return typeof ctrl?.['multiple'] === 'function' ? (ctrl['multiple'] as () => boolean)() : false;\r\n }\r\n\r\n /**\r\n * Whether there is projected prefix content\r\n */\r\n hasPrefix(): boolean {\r\n return (this._prefixes?.length ?? 0) > 0;\r\n }\r\n\r\n /**\r\n * Whether there is projected suffix content\r\n */\r\n hasSuffix(): boolean {\r\n return (this._suffixes?.length ?? 0) > 0;\r\n }\r\n}\r\n","<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !isReadonly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper — always visible, styled as read-only when applicable -->\r\n <div\r\n #wrapper\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"isReadonly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || showCopyButton()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n <!-- Copy button — visible only in readOnly on hover -->\r\n @if (showCopyButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? intl.copiedAriaLabel : intl.copyAriaLabel\"\r\n [fuiTooltip]=\"copied() ? intl.copiedTooltip : intl.copyTooltip\"\r\n fuiTooltipPosition=\"top\"\r\n fuiTooltipSize=\"sm\"\r\n [fuiTooltipShowDelay]=\"copied() ? 0 : 300\"\r\n fuiTooltipTrigger=\"manual\"\r\n [fuiTooltipShow]=\"copied()\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n <!-- The strength meter and the error are exclusive -->\r\n @if (hasError() && !showStrengthMeter()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (showStrengthMeter()) {\r\n <ng-content select=\"fui-strength-meter\"></ng-content>\r\n }\r\n</div>\r\n","import { Component, computed, inject, input, Signal } from '@angular/core';\r\nimport { FuiFormFieldComponent } from './form-field.component';\r\n\r\n/**\r\n * FuiErrorComponent\r\n *\r\n * Validation error message shown under the form field. Can automatically show/hide\r\n * based on a specific error key, or use with *ngIf for custom control logic.\r\n * The component provides proper accessibility roles and live region behavior.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Automatic error key handling -->\r\n * <fui-error key=\"required\">This field is required</fui-error>\r\n * <fui-error key=\"email\">Please enter a valid email</fui-error>\r\n *\r\n * <!-- Manual control (backward compatible) -->\r\n * <fui-error *ngIf=\"control.hasError('custom')\">Custom error</fui-error>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-error',\r\n standalone: true,\r\n template: ` <ng-content></ng-content> `,\r\n host: {\r\n class: 'fui-error',\r\n role: 'alert',\r\n 'aria-live': 'assertive',\r\n '[style.display]': '_shouldHide() ? \"none\" : null',\r\n },\r\n})\r\nexport class FuiErrorComponent {\r\n /**\r\n * Optional error key to match against form control errors.\r\n * When provided, the error will only show if the control has this specific error.\r\n * When not provided, the error will always show (backward compatible behavior).\r\n */\r\n readonly key = input<string>();\r\n\r\n private readonly _parent = inject(FuiFormFieldComponent, { host: true });\r\n\r\n /**\r\n * Computed signal to determine if this error should be hidden\r\n */\r\n protected readonly _shouldHide: Signal<boolean> = computed(() => {\r\n if (!this._parent.control()?.errorState()) {\r\n return true;\r\n }\r\n const errorKey = this.key();\r\n // If no key is provided, always show (backward compatible)\r\n if (!errorKey) {\r\n return false;\r\n }\r\n\r\n // If no form field control is available, show the error\r\n const formFieldControl = this._parent.control();\r\n if (!formFieldControl) {\r\n return false;\r\n }\r\n\r\n // Get the ngControl from the form field control\r\n const ngControl = formFieldControl.ngControl;\r\n if (!ngControl?.control) {\r\n return false;\r\n }\r\n\r\n // Hide if the control doesn't have this specific error\r\n return !ngControl.control.hasError(errorKey);\r\n });\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n/**\r\n * @component FuiHintComponent\r\n * @selector fui-hint\r\n * @description Helper text displayed below the form field input when there is no error.\r\n * Automatically hidden when the parent form field is in an error state.\r\n *\r\n * @example\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\">\r\n * <fui-hint>We will never share your email</fui-hint>\r\n * </fui-form-field>\r\n */\r\n@Component({\r\n selector: 'fui-hint',\r\n standalone: true,\r\n template: ` <ng-content></ng-content> `,\r\n host: {\r\n class: 'fui-hint',\r\n },\r\n})\r\nexport class FuiHintComponent {}\r\n","import { Component } from '@angular/core';\r\n\r\n/**\r\n * @component FuiLabelComponent\r\n * @selector fui-label\r\n * @description Label element projected inside `fui-form-field` to provide an accessible\r\n * field label. Automatically linked to the form control via `aria-labelledby`.\r\n *\r\n * @example\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\">\r\n * </fui-form-field>\r\n */\r\n@Component({\r\n selector: 'fui-label',\r\n standalone: true,\r\n template: ` <ng-content></ng-content> `,\r\n host: {\r\n class: 'fui-label',\r\n },\r\n})\r\nexport class FuiLabelComponent {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-form-field.mjs","sources":["../../../lib/components/form-field/prefix.directive.ts","../../../lib/components/form-field/suffix.directive.ts","../../../lib/components/form-field/form-field.intl.ts","../../../lib/components/form-field/form-field-tokens.ts","../../../lib/components/form-field/form-field.component.ts","../../../lib/components/form-field/form-field.component.html","../../../lib/components/form-field/error.component.ts","../../../lib/components/form-field/hint.component.ts","../../../lib/components/form-field/label.component.ts","../../../lib/components/form-field/raintonic-formaui-components-form-field.ts"],"sourcesContent":["import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Prefix directive for content to be placed before the input in fui-form-field\r\n *\r\n * @example\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Price</fui-label>\r\n * <span fuiPrefix>$</span>\r\n * <input fuiInput type=\"number\">\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiPrefix]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-prefix',\r\n },\r\n})\r\nexport class FuiPrefixDirective {}\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Suffix directive for content to be placed after the input in fui-form-field\r\n *\r\n * @example\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Weight</fui-label>\r\n * <input fuiInput type=\"number\">\r\n * <span fuiSuffix>kg</span>\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiSuffix]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-suffix',\r\n },\r\n})\r\nexport class FuiSuffixDirective {}\r\n","import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiFormFieldIntl extends FuiIntlBase {\r\n copyAriaLabel = 'Copy value';\r\n copiedAriaLabel = 'Copied';\r\n copyTooltip = 'Copy';\r\n copiedTooltip = 'Copied';\r\n clearAriaLabel = 'Clear';\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { ElementRef } from '@angular/core';\r\n\r\n/**\r\n * Interface exposed by FuiFormFieldComponent for child controls.\r\n *\r\n * Child controls (select, autocomplete, date-picker) inject this token to\r\n * access the form-field's overlay origin element — typically the wrapper\r\n * container whose width the overlay panel should match.\r\n */\r\nexport interface FuiFormFieldParent {\r\n /**\r\n * Returns the element that should be used as the width reference for\r\n * overlay panels (e.g. select dropdown, autocomplete panel).\r\n * This is typically the form-field wrapper element so the overlay\r\n * correctly spans prefix/suffix areas.\r\n */\r\n getConnectedOverlayOrigin(): ElementRef<HTMLElement>;\r\n}\r\n\r\n/**\r\n * Injection token for the parent form-field component.\r\n * Child controls inject this (via @Optional()) to coordinate with the\r\n * containing form-field without coupling to the component class directly.\r\n */\r\nexport const FUI_FORM_FIELD = new InjectionToken<FuiFormFieldParent>('FuiFormField');\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n contentChild,\r\n ContentChildren,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n input,\r\n InputSignal,\r\n QueryList,\r\n Signal,\r\n signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { FuiPrefixDirective } from './prefix.directive';\r\nimport { FuiSuffixDirective } from './suffix.directive';\r\nimport { FUI_FORM_FIELD_CONTROL } from '@raintonic/formaui/core';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\r\nimport { FuiFormFieldIntl } from './form-field.intl';\r\nimport { FUI_STRENGTH_METER } from '@raintonic/formaui/core';\r\nimport { FUI_FORM_FIELD, FuiFormFieldParent } from './form-field-tokens';\r\n\r\n/**\r\n * Available form field appearance modes.\r\n * - `'outline'` — default bordered appearance (Carbon Design System style)\r\n * - `'fill'` — filled background with bottom-border only\r\n */\r\nexport type FormFieldAppearance = 'outline' | 'fill';\r\n\r\n/**\r\n * # FormField Component\r\n *\r\n * A form field wrapper component that provides consistent styling and behavior\r\n * for form controls. Follows Angular Material patterns with Carbon Design System styling.\r\n *\r\n * ## Features\r\n * - Floating labels with configurable behavior\r\n * - Error message display with animations\r\n * - Helper text support\r\n * - Prefix and suffix support\r\n * - Outline appearance with Carbon Design System styling\r\n * - Full accessibility support\r\n * - Automatic integration with form controls\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Form Field\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\" placeholder=\"Enter your email\">\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Error Messages\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Username</fui-label>\r\n * <input fuiInput formControlName=\"username\">\r\n * <fui-error key=\"required\">Username is required</fui-error>\r\n * <fui-error key=\"minlength\">Username must be at least 3 characters</fui-error>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Helper Text and Icons\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Password</fui-label>\r\n * <fui-icon fuiPrefix name=\"lock\"></fui-icon>\r\n * <input fuiInput type=\"password\">\r\n * <button fuiSuffix fuiButton variant=\"tertiary\" (click)=\"togglePasswordVisibility()\">\r\n * <fui-icon [name]=\"showPassword ? 'eye-slash' : 'eye'\"></fui-icon>\r\n * </button>\r\n * <fui-hint>Must be at least 8 characters</fui-hint>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\r\n * import { FuiInputDirective } from '@raintonic/formaui/components/input';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiFormFieldComponent, FuiInputDirective, ReactiveFormsModule],\r\n * template: `\r\n * <form [formGroup]=\"form\">\r\n * <fui-form-field>\r\n * <fui-label>Email Address</fui-label>\r\n * <input fuiInput type=\"email\" formControlName=\"email\">\r\n * <fui-error key=\"required\">Email is required</fui-error>\r\n * <fui-error key=\"email\">Please enter a valid email</fui-error>\r\n * </fui-form-field>\r\n * </form>\r\n * `\r\n * })\r\n * export class MyFormComponent {\r\n * form = this.fb.group({\r\n * email: ['', [Validators.required, Validators.email]]\r\n * });\r\n *\r\n * get emailControl() {\r\n * return this.form.get('email');\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-form-field',\r\n standalone: true,\r\n imports: [FuiIconComponent, FuiTooltipDirective],\r\n templateUrl: './form-field.component.html',\r\n styleUrls: ['./form-field.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: FUI_FORM_FIELD,\r\n useExisting: forwardRef(() => FuiFormFieldComponent),\r\n },\r\n ],\r\n host: {\r\n class: 'fui-form-field',\r\n '[class.fui-form-field--disabled]': 'isDisabled()',\r\n '[class.fui-form-field--focused]': 'isFocused()',\r\n '[class.fui-form-field--error]': 'hasError()',\r\n '[class.fui-form-field--empty]': 'isEmpty()',\r\n '[class.fui-form-field--readonly]': 'isReadonly()',\r\n '[class.fui-form-field--fill]': 'appearance() === \"fill\"',\r\n '[class.fui-form-field--number-input]': 'isNumberInput()',\r\n role: 'group',\r\n '[attr.aria-labelledby]': 'labelId',\r\n '[attr.aria-disabled]': 'isDisabled() || null',\r\n },\r\n})\r\nexport class FuiFormFieldComponent implements FuiFormFieldParent {\r\n readonly intl = inject(FuiFormFieldIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n /**\r\n * Visual appearance variant.\r\n * - `'outline'` (default): bordered input with label above\r\n * - `'fill'`: filled background with bottom-border accent\r\n */\r\n readonly appearance = input<FormFieldAppearance>('outline');\r\n\r\n /**\r\n * Whether to hide the required marker\r\n * @default false\r\n */\r\n readonly hideRequiredMarker: InputSignal<boolean> = input(false);\r\n\r\n // Content children\r\n control = contentChild(FUI_FORM_FIELD_CONTROL);\r\n\r\n @ContentChildren(FuiPrefixDirective, { descendants: true }) _prefixes?: QueryList<FuiPrefixDirective>;\r\n @ContentChildren(FuiSuffixDirective, { descendants: true }) _suffixes?: QueryList<FuiSuffixDirective>;\r\n @ViewChild('connectionContainer', { static: true }) _connectionContainerRef?: ElementRef<HTMLElement>;\r\n @ViewChild('wrapper', { static: true }) private readonly _wrapperRef?: ElementRef<HTMLElement>;\r\n\r\n hideSubscript = input(false, { transform: booleanAttribute });\r\n\r\n // Strength meter content child — used to determine whether hints should be suppressed\r\n readonly strengthMeter = contentChild(FUI_STRENGTH_METER);\r\n\r\n // Read-only display value derived from the control's value\r\n // For select/autocomplete controls, uses their displayValue signal to show the label\r\n readonly displayValue: Signal<string> = computed(() => {\r\n const control = this.control();\r\n if (!control) return '\\u2014';\r\n\r\n // Select and autocomplete controls expose a displayValue signal with the option label\r\n if (\r\n 'displayValue' in control &&\r\n typeof (control as unknown as Record<string, unknown>)['displayValue'] === 'function'\r\n ) {\r\n const label = ((control as unknown as Record<string, unknown>)['displayValue'] as () => string)();\r\n return label || '\\u2014';\r\n }\r\n\r\n const val = control.value();\r\n if (val == null || val === '') return '\\u2014';\r\n return String(val);\r\n });\r\n\r\n // State signals\r\n readonly isFocused: Signal<boolean> = computed(() => {\r\n return this.control()?.focused() ?? false;\r\n });\r\n readonly hasError: Signal<boolean> = computed(() => {\r\n return this.control()?.errorState() ?? false;\r\n });\r\n readonly isDisabled: Signal<boolean> = computed(() => {\r\n return this.control()?.disabled() ?? false;\r\n });\r\n readonly isReadonly: Signal<boolean> = computed(() => {\r\n return this.control()?.readonly() ?? false;\r\n });\r\n readonly isEmpty: Signal<boolean> = computed(() => {\r\n return this.control()?.empty() ?? false;\r\n });\r\n readonly isRequired: Signal<boolean> = computed(() => {\r\n return this.control()?.required() ?? false;\r\n });\r\n\r\n /** Whether the projected control is a fui-number-input (needs zero horizontal padding) */\r\n readonly isNumberInput: Signal<boolean> = computed(() => {\r\n return this.control()?.controlType === 'fui-number-input';\r\n });\r\n\r\n /** Whether the projected control is a plain `fuiInput` with `type=\"search\"`. */\r\n readonly isSearchInput: Signal<boolean> = computed(() => {\r\n const ctrl = this.control() as unknown as { type?: () => string } | undefined;\r\n return this.control()?.controlType === 'fui-input' && typeof ctrl?.type === 'function' && ctrl.type() === 'search';\r\n });\r\n\r\n /** Whether the search clear (X) button should be shown. Visible only when the\r\n * search input holds a value and is interactive. */\r\n readonly showClearButton: Signal<boolean> = computed(() => {\r\n return this.isSearchInput() && !this.isEmpty() && !this.isDisabled() && !this.isReadonly();\r\n });\r\n\r\n /** Whether control-specific icons (dropdown caret, calendar) should be hidden in readOnly mode */\r\n readonly hideControlIcons: Signal<boolean> = computed(() => {\r\n if (!this.isReadonly()) return false;\r\n const ct = this.control()?.controlType;\r\n return ct === 'fui-select' || ct === 'fui-autocomplete' || ct === 'fui-date-picker';\r\n });\r\n\r\n /** Whether the copy button should appear in read-only mode.\r\n * Delegates to the control's `readonlyCopyEnabled()` method.\r\n * Only plain inputs (`fuiInput`) opt in — defaults to `false`. */\r\n readonly showCopyButton: Signal<boolean> = computed(() => {\r\n const control = this.control();\r\n return this.isReadonly() && (control?.readonlyCopyEnabled?.() ?? false);\r\n });\r\n\r\n /** Whether the \"copied\" feedback indicator is active */\r\n readonly copied: WritableSignal<boolean> = signal(false);\r\n private _copiedTimeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n // Generate unique IDs\r\n readonly labelId = `fui-form-field-label-${Math.random().toString(36).substring(2, 11)}`;\r\n readonly hintId = `fui-form-field-hint-${Math.random().toString(36).substring(2, 11)}`;\r\n\r\n /** Whether the strength meter should be shown. Visible only when the control\r\n * has a non-empty value (i.e. the user has typed something). */\r\n readonly showStrengthMeter: Signal<boolean> = computed(() => {\r\n const ctrl = this.control();\r\n if (!ctrl) return false;\r\n return !ctrl.empty() && !!this.strengthMeter();\r\n });\r\n\r\n readonly errorId = `fui-form-field-error-${Math.random().toString(36).substring(2, 11)}`;\r\n\r\n constructor() {\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this._cdr.markForCheck();\r\n });\r\n\r\n // Effect to update aria-describedby when state changes\r\n effect(() => {\r\n const control = this.control();\r\n if (!control) {\r\n return;\r\n }\r\n const ids: string[] = [];\r\n if (this.hasError()) {\r\n ids.push(this.errorId);\r\n } else {\r\n ids.push(this.hintId);\r\n }\r\n\r\n control.setDescribedByIds(ids);\r\n });\r\n }\r\n\r\n /**\r\n * Returns the element that overlay panels (select, autocomplete, date-picker)\r\n * should use as their width reference. This is the form-field wrapper which\r\n * spans the full width including prefix/suffix areas.\r\n */\r\n getConnectedOverlayOrigin(): ElementRef<HTMLElement> {\r\n return this._wrapperRef ?? this._connectionContainerRef ?? this._elementRef;\r\n }\r\n\r\n /**\r\n * Handles click on the form field container\r\n */\r\n onContainerClick(event: MouseEvent): void {\r\n const control = this.control();\r\n if (control && !this.isDisabled() && !this.isReadonly()) {\r\n control.onContainerClick(event);\r\n }\r\n }\r\n\r\n /**\r\n * Copies the display value to the clipboard\r\n */\r\n copyValue(): void {\r\n const text = this.displayValue();\r\n if (!text || text === '\\u2014') return;\r\n\r\n void navigator.clipboard.writeText(text).then(() => {\r\n this.copied.set(true);\r\n if (this._copiedTimeout) clearTimeout(this._copiedTimeout);\r\n this._copiedTimeout = setTimeout(() => {\r\n this.copied.set(false);\r\n this._copiedTimeout = null;\r\n }, 1500);\r\n });\r\n }\r\n\r\n /**\r\n * Clears the projected search input's value and refocuses it.\r\n */\r\n clearControl(event: MouseEvent): void {\r\n event.stopPropagation();\r\n const ctrl = this.control() as unknown as { clear?: () => void } | undefined;\r\n ctrl?.clear?.();\r\n }\r\n\r\n /**\r\n * Gets the current error messages\r\n */\r\n getErrorMessages(): string[] {\r\n // This would be populated by projected fui-error components\r\n // Implementation would query ContentChildren for error components\r\n return [];\r\n }\r\n\r\n /**\r\n * Checks if the form field contains a select control\r\n */\r\n hasSelectControl(): boolean {\r\n const control = this.control();\r\n if (!control) return false;\r\n\r\n // Check if it's the full fui-select component\r\n if (control.controlType === 'fui-select') {\r\n return true;\r\n }\r\n\r\n // Check if it's fuiInput directive on a select element\r\n if (\r\n control.controlType === 'fui-input' &&\r\n typeof (control as unknown as Record<string, unknown>)['isSelect'] === 'function'\r\n ) {\r\n return ((control as unknown as Record<string, unknown>)['isSelect'] as () => boolean)();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the select control is a multiple select\r\n */\r\n isMultipleSelect(): boolean {\r\n if (!this.hasSelectControl()) {\r\n return false;\r\n }\r\n // Check if the control has a multiple property and it's true\r\n const ctrl = this.control() as unknown as Record<string, unknown> | undefined;\r\n return typeof ctrl?.['multiple'] === 'function' ? (ctrl['multiple'] as () => boolean)() : false;\r\n }\r\n\r\n /**\r\n * Whether there is projected prefix content\r\n */\r\n hasPrefix(): boolean {\r\n return (this._prefixes?.length ?? 0) > 0;\r\n }\r\n\r\n /**\r\n * Whether there is projected suffix content\r\n */\r\n hasSuffix(): boolean {\r\n return (this._suffixes?.length ?? 0) > 0;\r\n }\r\n}\r\n","<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !isReadonly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper — always visible, styled as read-only when applicable -->\r\n <div\r\n #wrapper\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"isReadonly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || showCopyButton() || isSearchInput()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n <!-- Clear button — always reserves its slot for search inputs (so the\r\n field width stays stable), hidden until a value is present. -->\r\n @if (isSearchInput()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__clear-btn\"\r\n [class.fui-form-field__clear-btn--hidden]=\"!showClearButton()\"\r\n tabindex=\"-1\"\r\n [attr.aria-hidden]=\"!showClearButton()\"\r\n [disabled]=\"!showClearButton()\"\r\n (click)=\"clearControl($event)\"\r\n [attr.aria-label]=\"intl.clearAriaLabel\"\r\n >\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n <!-- Copy button — visible only in readOnly on hover -->\r\n @if (showCopyButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? intl.copiedAriaLabel : intl.copyAriaLabel\"\r\n [fuiTooltip]=\"copied() ? intl.copiedTooltip : intl.copyTooltip\"\r\n fuiTooltipPosition=\"top\"\r\n fuiTooltipSize=\"sm\"\r\n [fuiTooltipShowDelay]=\"copied() ? 0 : 300\"\r\n fuiTooltipTrigger=\"manual\"\r\n [fuiTooltipShow]=\"copied()\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n <!-- The strength meter and the error are exclusive -->\r\n @if (hasError() && !showStrengthMeter()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (showStrengthMeter()) {\r\n <ng-content select=\"fui-strength-meter\"></ng-content>\r\n }\r\n</div>\r\n","import { Component, computed, inject, input, Signal } from '@angular/core';\r\nimport { FuiFormFieldComponent } from './form-field.component';\r\n\r\n/**\r\n * FuiErrorComponent\r\n *\r\n * Validation error message shown under the form field. Can automatically show/hide\r\n * based on a specific error key, or use with *ngIf for custom control logic.\r\n * The component provides proper accessibility roles and live region behavior.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Automatic error key handling -->\r\n * <fui-error key=\"required\">This field is required</fui-error>\r\n * <fui-error key=\"email\">Please enter a valid email</fui-error>\r\n *\r\n * <!-- Manual control (backward compatible) -->\r\n * <fui-error *ngIf=\"control.hasError('custom')\">Custom error</fui-error>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-error',\r\n standalone: true,\r\n template: ` <ng-content></ng-content> `,\r\n host: {\r\n class: 'fui-error',\r\n role: 'alert',\r\n 'aria-live': 'assertive',\r\n '[style.display]': '_shouldHide() ? \"none\" : null',\r\n },\r\n})\r\nexport class FuiErrorComponent {\r\n /**\r\n * Optional error key to match against form control errors.\r\n * When provided, the error will only show if the control has this specific error.\r\n * When not provided, the error will always show (backward compatible behavior).\r\n */\r\n readonly key = input<string>();\r\n\r\n private readonly _parent = inject(FuiFormFieldComponent, { host: true });\r\n\r\n /**\r\n * Computed signal to determine if this error should be hidden\r\n */\r\n protected readonly _shouldHide: Signal<boolean> = computed(() => {\r\n if (!this._parent.control()?.errorState()) {\r\n return true;\r\n }\r\n const errorKey = this.key();\r\n // If no key is provided, always show (backward compatible)\r\n if (!errorKey) {\r\n return false;\r\n }\r\n\r\n // If no form field control is available, show the error\r\n const formFieldControl = this._parent.control();\r\n if (!formFieldControl) {\r\n return false;\r\n }\r\n\r\n // Get the ngControl from the form field control\r\n const ngControl = formFieldControl.ngControl;\r\n if (!ngControl?.control) {\r\n return false;\r\n }\r\n\r\n // Hide if the control doesn't have this specific error\r\n return !ngControl.control.hasError(errorKey);\r\n });\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n/**\r\n * @component FuiHintComponent\r\n * @selector fui-hint\r\n * @description Helper text displayed below the form field input when there is no error.\r\n * Automatically hidden when the parent form field is in an error state.\r\n *\r\n * @example\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\">\r\n * <fui-hint>We will never share your email</fui-hint>\r\n * </fui-form-field>\r\n */\r\n@Component({\r\n selector: 'fui-hint',\r\n standalone: true,\r\n template: ` <ng-content></ng-content> `,\r\n host: {\r\n class: 'fui-hint',\r\n },\r\n})\r\nexport class FuiHintComponent {}\r\n","import { Component } from '@angular/core';\r\n\r\n/**\r\n * @component FuiLabelComponent\r\n * @selector fui-label\r\n * @description Label element projected inside `fui-form-field` to provide an accessible\r\n * field label. Automatically linked to the form control via `aria-labelledby`.\r\n *\r\n * @example\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\">\r\n * </fui-form-field>\r\n */\r\n@Component({\r\n selector: 'fui-label',\r\n standalone: true,\r\n template: ` <ng-content></ng-content> `,\r\n host: {\r\n class: 'fui-label',\r\n },\r\n})\r\nexport class FuiLabelComponent {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -264,6 +264,20 @@ class FuiInputDirective {
|
|
|
264
264
|
blur() {
|
|
265
265
|
this._elementRef.nativeElement.blur();
|
|
266
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* Clears the input's value and refocuses it.
|
|
269
|
+
*
|
|
270
|
+
* Dispatches a native `input` event so every binding style stays in sync —
|
|
271
|
+
* reactive/template forms (via the `onInput` handler) as well as plain
|
|
272
|
+
* `(input)` template listeners on the host element. Used by the form-field's
|
|
273
|
+
* search clear button.
|
|
274
|
+
*/
|
|
275
|
+
clear() {
|
|
276
|
+
const el = this._elementRef.nativeElement;
|
|
277
|
+
el.value = '';
|
|
278
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
279
|
+
el.focus();
|
|
280
|
+
}
|
|
267
281
|
/**
|
|
268
282
|
* Parse a number input's display value into a number or null.
|
|
269
283
|
* Returns null for empty/invalid input (e.g. empty string, just a minus sign, partial decimal).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-input.mjs","sources":["../../../lib/components/input/input.directive.ts","../../../lib/components/input/raintonic-formaui-components-input.ts"],"sourcesContent":["import {\r\n AfterViewInit,\r\n booleanAttribute,\r\n computed,\r\n Directive,\r\n DoCheck,\r\n effect,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n InputSignal,\r\n OnDestroy,\r\n output,\r\n Signal,\r\n signal,\r\n WritableSignal,\r\n} from '@angular/core';\r\n\r\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, NgControl, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl } from '@raintonic/formaui/core';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport {\r\n injectNgControl,\r\n updateErrorState,\r\n syncRequiredState,\r\n syncNgControlDisabled,\r\n} from '@raintonic/formaui/cdk/form-field';\r\n\r\n/**\r\n * Available input types\r\n */\r\nexport type FuiInputType =\r\n | 'text'\r\n | 'email'\r\n | 'password'\r\n | 'number'\r\n | 'tel'\r\n | 'url'\r\n | 'search'\r\n | 'date'\r\n | 'time'\r\n | 'datetime-local'\r\n | 'color';\r\n\r\n/**\r\n * # FuiInput Directive\r\n *\r\n * An input directive that integrates seamlessly with fui-form-field and Angular Forms.\r\n * Follows Angular Material patterns with Carbon Design System styling.\r\n *\r\n * ## Features\r\n * - Full integration with fui-form-field\r\n * - Reactive Forms and Template-driven Forms support\r\n * - Multiple input types support\r\n * - Error state handling with customizable error messages\r\n * - Accessibility features (ARIA attributes, labels)\r\n * - Smooth animations and transitions\r\n * - Theme-aware styling\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Input with Form Field\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\" placeholder=\"Enter your email\">\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Reactive Forms\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Username</fui-label>\r\n * <input fuiInput formControlName=\"username\">\r\n * <fui-error *ngIf=\"form.get('username')?.hasError('required')\">\r\n * Username is required\r\n * </fui-error>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### Password Input with Toggle\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Password</fui-label>\r\n * <input fuiInput [type]=\"showPassword ? 'text' : 'password'\">\r\n * <button fuiSuffix fuiButton variant=\"tertiary\" (click)=\"togglePassword()\">\r\n * <fui-icon [name]=\"showPassword ? 'eye-slash' : 'eye'\"></fui-icon>\r\n * </button>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiInputDirective } from '@raintonic/formaui/components/input';\r\n * import { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiInputDirective, FuiFormFieldComponent, ReactiveFormsModule],\r\n * template: `\r\n * <form [formGroup]=\"form\">\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\" formControlName=\"email\">\r\n * <fui-error *ngIf=\"emailControl?.invalid && emailControl?.touched\">\r\n * Please enter a valid email\r\n * </fui-error>\r\n * </fui-form-field>\r\n * </form>\r\n * `\r\n * })\r\n * export class MyFormComponent {\r\n * form = this.fb.group({\r\n * email: ['', [Validators.required, Validators.email]]\r\n * });\r\n *\r\n * get emailControl() {\r\n * return this.form.get('email');\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Directive({\r\n selector: 'input[fuiInput], textarea[fuiInput], select[fuiInput]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-input',\r\n '[class.fui-input--select]': 'isSelect()',\r\n '[class.fui-input--disabled]': 'disabled()',\r\n '[class.fui-input--readonly]': 'readonly()',\r\n '[class.fui-input--error]': 'errorState()',\r\n '[attr.id]': 'id',\r\n '[attr.type]': 'type()',\r\n '[attr.placeholder]': 'placeholder()',\r\n '[attr.disabled]': 'disabled() ? \"\" : null',\r\n '[attr.readonly]': 'readonly() ? \"\" : null',\r\n '[attr.required]': 'required() ? \"\" : null',\r\n // constraints\r\n '[attr.maxlength]': 'maxlength()',\r\n '[attr.minlength]': 'minlength()',\r\n '[attr.pattern]': 'pattern()',\r\n // ARIA\r\n '[attr.aria-invalid]': 'errorState() ? \"true\" : null',\r\n '[attr.aria-required]': 'required() ? \"true\" : null',\r\n '[attr.aria-describedby]': '_ariaDescribedby',\r\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiInputDirective,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiInputDirective,\r\n },\r\n ],\r\n})\r\nexport class FuiInputDirective\r\n implements ControlValueAccessor, FuiFormFieldControl<string>, AfterViewInit, DoCheck, OnDestroy\r\n{\r\n // Static properties\r\n static nextId = 0;\r\n readonly controlType = 'fui-input';\r\n\r\n // Inputs\r\n type: InputSignal<FuiInputType> = input<FuiInputType>('text');\r\n placeholder: InputSignal<string> = input('');\r\n\r\n readonly readOnlyInput = input(false, {\r\n alias: 'readonly',\r\n transform: booleanAttribute,\r\n });\r\n\r\n readonly readonly: Signal<boolean> = computed(() => this.readOnlyInput());\r\n\r\n // Validation/constraint inputs (pass-through to native attributes)\r\n maxlength: InputSignal<number | null> = input<number | null>(null);\r\n minlength: InputSignal<number | null> = input<number | null>(null);\r\n pattern: InputSignal<string | null> = input<string | null>(null);\r\n\r\n // Interface implementation\r\n required: WritableSignal<boolean> = signal(false);\r\n\r\n errorStateMatcher: InputSignal<ErrorStateMatcher | null> = input<ErrorStateMatcher | null>(null);\r\n readonly disabledInput = input(false, {\r\n alias: 'disabled',\r\n transform: booleanAttribute,\r\n });\r\n readonly disabled = computed(() => this._disabled() || this.disabledInput() || this._ngControlDisabled());\r\n\r\n // Outputs\r\n readonly valueChange = output<string | number | null>();\r\n\r\n // Internal state\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n readonly focused = this._focused;\r\n readonly stateChanges = new Subject<void>();\r\n\r\n private readonly _value: WritableSignal<string> = signal('');\r\n readonly value = this._value;\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n private _uid = `fui-input-${FuiInputDirective.nextId++}`;\r\n _ariaDescribedby: string | null = null;\r\n\r\n // Error state\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n readonly errorState = this._errorState;\r\n\r\n // Form control references\r\n private _parentForm = inject(NgForm, { optional: true });\r\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\r\n\r\n // Element reference\r\n private readonly _elementRef: ElementRef<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> =\r\n inject(ElementRef);\r\n\r\n // Computed properties\r\n readonly empty = computed(() => {\r\n const v = this._value();\r\n return !v || v.length === 0;\r\n });\r\n readonly id = this._uid;\r\n\r\n // ControlValueAccessor callbacks\r\n private _onChange: (value: string | number | null) => void = () => {\r\n /* noop */\r\n };\r\n private _onTouched: () => void = () => {\r\n /* noop */\r\n };\r\n\r\n private readonly _ngControlRef = injectNgControl();\r\n\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n constructor() {\r\n // Set valueAccessor after NgControl is resolved\r\n void Promise.resolve().then(() => {\r\n if (this._ngControlRef.ngControl) {\r\n this._ngControlRef.ngControl.valueAccessor = this;\r\n }\r\n });\r\n\r\n // Effect to emit state changes\r\n effect(() => {\r\n // Track all reactive inputs and internal signals\r\n this.type();\r\n this.placeholder();\r\n this.readOnlyInput();\r\n this.maxlength();\r\n this.minlength();\r\n this.pattern();\r\n this.disabledInput();\r\n this.errorStateMatcher();\r\n this._focused();\r\n this._value();\r\n this._disabled();\r\n this._ngControlDisabled();\r\n this.required();\r\n this._errorState();\r\n\r\n // Emit state change\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // When the input is used without ngModel/formControl, sync the initial DOM\r\n // value (e.g. <input fuiInput value=\"John Doe\">) into the internal signal\r\n // so consumers like fui-form-field readOnly / copy can read it.\r\n if (!this._ngControlRef.ngControl && !this._value()) {\r\n const initial = this._elementRef.nativeElement.value;\r\n if (initial) {\r\n this._value.set(initial);\r\n this.stateChanges.next();\r\n }\r\n }\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (this.ngControl) {\r\n updateErrorState(\r\n this.ngControl,\r\n this._errorState,\r\n this.errorStateMatcher(),\r\n this._defaultErrorStateMatcher,\r\n this._parentForm,\r\n this._parentFormGroup,\r\n this.stateChanges,\r\n );\r\n syncRequiredState(this.ngControl, this.required, this.stateChanges);\r\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: string | number | null): void {\r\n const v = value === null || value === undefined ? '' : String(value);\r\n this._value.set(v);\r\n // Update the DOM element's value to reflect the new value\r\n this._elementRef.nativeElement.value = v;\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: string | number | null) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n onContainerClick(_event: MouseEvent): void {\r\n if (!this._focused()) {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\r\n }\r\n\r\n // Event handlers\r\n @HostListener('input', ['$event'])\r\n onInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n const displayValue = target.value;\r\n if (displayValue !== this._value()) {\r\n this._value.set(displayValue);\r\n // For number inputs, emit the parsed number through ControlValueAccessor\r\n // so that FormControl values are numbers, not strings (matching Angular Material behavior)\r\n const emitValue: string | number | null =\r\n this.type() === 'number' ? this._parseNumberInputValue(displayValue) : displayValue;\r\n this._onChange(emitValue);\r\n this.valueChange.emit(emitValue);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @HostListener('change', ['$event'])\r\n onChange(event: Event): void {\r\n // Handle change event for select elements\r\n if (this.isSelect()) {\r\n const target = event.target as HTMLSelectElement;\r\n const newValue = target.value;\r\n if (newValue !== this._value()) {\r\n this._value.set(newValue);\r\n this._onChange(newValue);\r\n this.valueChange.emit(newValue);\r\n this.stateChanges.next();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n if (!this._focused()) {\r\n this._focused.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n if (this._focused()) {\r\n this._focused.set(false);\r\n this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n // Public API\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n blur(): void {\r\n this._elementRef.nativeElement.blur();\r\n }\r\n\r\n /**\r\n * Parse a number input's display value into a number or null.\r\n * Returns null for empty/invalid input (e.g. empty string, just a minus sign, partial decimal).\r\n */\r\n private _parseNumberInputValue(raw: string): number | null {\r\n if (raw === '' || raw.trim() === '') return null;\r\n // Allow trailing minus/decimal during typing — don't emit partial values\r\n if (raw === '-' || raw === '.' || raw === '-.') return null;\r\n const parsed = parseFloat(raw);\r\n return isNaN(parsed) ? null : parsed;\r\n }\r\n\r\n /**\r\n * Check if the element is a select element\r\n */\r\n isSelect(): boolean {\r\n return this._elementRef.nativeElement.tagName.toLowerCase() === 'select';\r\n }\r\n\r\n /** A plain input always supports the copy button in read-only mode. */\r\n readonlyCopyEnabled(): boolean {\r\n return true;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-input.mjs","sources":["../../../lib/components/input/input.directive.ts","../../../lib/components/input/raintonic-formaui-components-input.ts"],"sourcesContent":["import {\r\n AfterViewInit,\r\n booleanAttribute,\r\n computed,\r\n Directive,\r\n DoCheck,\r\n effect,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n InputSignal,\r\n OnDestroy,\r\n output,\r\n Signal,\r\n signal,\r\n WritableSignal,\r\n} from '@angular/core';\r\n\r\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, NgControl, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl } from '@raintonic/formaui/core';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport {\r\n injectNgControl,\r\n updateErrorState,\r\n syncRequiredState,\r\n syncNgControlDisabled,\r\n} from '@raintonic/formaui/cdk/form-field';\r\n\r\n/**\r\n * Available input types\r\n */\r\nexport type FuiInputType =\r\n | 'text'\r\n | 'email'\r\n | 'password'\r\n | 'number'\r\n | 'tel'\r\n | 'url'\r\n | 'search'\r\n | 'date'\r\n | 'time'\r\n | 'datetime-local'\r\n | 'color';\r\n\r\n/**\r\n * # FuiInput Directive\r\n *\r\n * An input directive that integrates seamlessly with fui-form-field and Angular Forms.\r\n * Follows Angular Material patterns with Carbon Design System styling.\r\n *\r\n * ## Features\r\n * - Full integration with fui-form-field\r\n * - Reactive Forms and Template-driven Forms support\r\n * - Multiple input types support\r\n * - Error state handling with customizable error messages\r\n * - Accessibility features (ARIA attributes, labels)\r\n * - Smooth animations and transitions\r\n * - Theme-aware styling\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Input with Form Field\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\" placeholder=\"Enter your email\">\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Reactive Forms\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Username</fui-label>\r\n * <input fuiInput formControlName=\"username\">\r\n * <fui-error *ngIf=\"form.get('username')?.hasError('required')\">\r\n * Username is required\r\n * </fui-error>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### Password Input with Toggle\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Password</fui-label>\r\n * <input fuiInput [type]=\"showPassword ? 'text' : 'password'\">\r\n * <button fuiSuffix fuiButton variant=\"tertiary\" (click)=\"togglePassword()\">\r\n * <fui-icon [name]=\"showPassword ? 'eye-slash' : 'eye'\"></fui-icon>\r\n * </button>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiInputDirective } from '@raintonic/formaui/components/input';\r\n * import { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiInputDirective, FuiFormFieldComponent, ReactiveFormsModule],\r\n * template: `\r\n * <form [formGroup]=\"form\">\r\n * <fui-form-field>\r\n * <fui-label>Email</fui-label>\r\n * <input fuiInput type=\"email\" formControlName=\"email\">\r\n * <fui-error *ngIf=\"emailControl?.invalid && emailControl?.touched\">\r\n * Please enter a valid email\r\n * </fui-error>\r\n * </fui-form-field>\r\n * </form>\r\n * `\r\n * })\r\n * export class MyFormComponent {\r\n * form = this.fb.group({\r\n * email: ['', [Validators.required, Validators.email]]\r\n * });\r\n *\r\n * get emailControl() {\r\n * return this.form.get('email');\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Directive({\r\n selector: 'input[fuiInput], textarea[fuiInput], select[fuiInput]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-input',\r\n '[class.fui-input--select]': 'isSelect()',\r\n '[class.fui-input--disabled]': 'disabled()',\r\n '[class.fui-input--readonly]': 'readonly()',\r\n '[class.fui-input--error]': 'errorState()',\r\n '[attr.id]': 'id',\r\n '[attr.type]': 'type()',\r\n '[attr.placeholder]': 'placeholder()',\r\n '[attr.disabled]': 'disabled() ? \"\" : null',\r\n '[attr.readonly]': 'readonly() ? \"\" : null',\r\n '[attr.required]': 'required() ? \"\" : null',\r\n // constraints\r\n '[attr.maxlength]': 'maxlength()',\r\n '[attr.minlength]': 'minlength()',\r\n '[attr.pattern]': 'pattern()',\r\n // ARIA\r\n '[attr.aria-invalid]': 'errorState() ? \"true\" : null',\r\n '[attr.aria-required]': 'required() ? \"true\" : null',\r\n '[attr.aria-describedby]': '_ariaDescribedby',\r\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiInputDirective,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiInputDirective,\r\n },\r\n ],\r\n})\r\nexport class FuiInputDirective\r\n implements ControlValueAccessor, FuiFormFieldControl<string>, AfterViewInit, DoCheck, OnDestroy\r\n{\r\n // Static properties\r\n static nextId = 0;\r\n readonly controlType = 'fui-input';\r\n\r\n // Inputs\r\n type: InputSignal<FuiInputType> = input<FuiInputType>('text');\r\n placeholder: InputSignal<string> = input('');\r\n\r\n readonly readOnlyInput = input(false, {\r\n alias: 'readonly',\r\n transform: booleanAttribute,\r\n });\r\n\r\n readonly readonly: Signal<boolean> = computed(() => this.readOnlyInput());\r\n\r\n // Validation/constraint inputs (pass-through to native attributes)\r\n maxlength: InputSignal<number | null> = input<number | null>(null);\r\n minlength: InputSignal<number | null> = input<number | null>(null);\r\n pattern: InputSignal<string | null> = input<string | null>(null);\r\n\r\n // Interface implementation\r\n required: WritableSignal<boolean> = signal(false);\r\n\r\n errorStateMatcher: InputSignal<ErrorStateMatcher | null> = input<ErrorStateMatcher | null>(null);\r\n readonly disabledInput = input(false, {\r\n alias: 'disabled',\r\n transform: booleanAttribute,\r\n });\r\n readonly disabled = computed(() => this._disabled() || this.disabledInput() || this._ngControlDisabled());\r\n\r\n // Outputs\r\n readonly valueChange = output<string | number | null>();\r\n\r\n // Internal state\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n readonly focused = this._focused;\r\n readonly stateChanges = new Subject<void>();\r\n\r\n private readonly _value: WritableSignal<string> = signal('');\r\n readonly value = this._value;\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n private _uid = `fui-input-${FuiInputDirective.nextId++}`;\r\n _ariaDescribedby: string | null = null;\r\n\r\n // Error state\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n readonly errorState = this._errorState;\r\n\r\n // Form control references\r\n private _parentForm = inject(NgForm, { optional: true });\r\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\r\n\r\n // Element reference\r\n private readonly _elementRef: ElementRef<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> =\r\n inject(ElementRef);\r\n\r\n // Computed properties\r\n readonly empty = computed(() => {\r\n const v = this._value();\r\n return !v || v.length === 0;\r\n });\r\n readonly id = this._uid;\r\n\r\n // ControlValueAccessor callbacks\r\n private _onChange: (value: string | number | null) => void = () => {\r\n /* noop */\r\n };\r\n private _onTouched: () => void = () => {\r\n /* noop */\r\n };\r\n\r\n private readonly _ngControlRef = injectNgControl();\r\n\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n constructor() {\r\n // Set valueAccessor after NgControl is resolved\r\n void Promise.resolve().then(() => {\r\n if (this._ngControlRef.ngControl) {\r\n this._ngControlRef.ngControl.valueAccessor = this;\r\n }\r\n });\r\n\r\n // Effect to emit state changes\r\n effect(() => {\r\n // Track all reactive inputs and internal signals\r\n this.type();\r\n this.placeholder();\r\n this.readOnlyInput();\r\n this.maxlength();\r\n this.minlength();\r\n this.pattern();\r\n this.disabledInput();\r\n this.errorStateMatcher();\r\n this._focused();\r\n this._value();\r\n this._disabled();\r\n this._ngControlDisabled();\r\n this.required();\r\n this._errorState();\r\n\r\n // Emit state change\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // When the input is used without ngModel/formControl, sync the initial DOM\r\n // value (e.g. <input fuiInput value=\"John Doe\">) into the internal signal\r\n // so consumers like fui-form-field readOnly / copy can read it.\r\n if (!this._ngControlRef.ngControl && !this._value()) {\r\n const initial = this._elementRef.nativeElement.value;\r\n if (initial) {\r\n this._value.set(initial);\r\n this.stateChanges.next();\r\n }\r\n }\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (this.ngControl) {\r\n updateErrorState(\r\n this.ngControl,\r\n this._errorState,\r\n this.errorStateMatcher(),\r\n this._defaultErrorStateMatcher,\r\n this._parentForm,\r\n this._parentFormGroup,\r\n this.stateChanges,\r\n );\r\n syncRequiredState(this.ngControl, this.required, this.stateChanges);\r\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: string | number | null): void {\r\n const v = value === null || value === undefined ? '' : String(value);\r\n this._value.set(v);\r\n // Update the DOM element's value to reflect the new value\r\n this._elementRef.nativeElement.value = v;\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: string | number | null) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n onContainerClick(_event: MouseEvent): void {\r\n if (!this._focused()) {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\r\n }\r\n\r\n // Event handlers\r\n @HostListener('input', ['$event'])\r\n onInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n const displayValue = target.value;\r\n if (displayValue !== this._value()) {\r\n this._value.set(displayValue);\r\n // For number inputs, emit the parsed number through ControlValueAccessor\r\n // so that FormControl values are numbers, not strings (matching Angular Material behavior)\r\n const emitValue: string | number | null =\r\n this.type() === 'number' ? this._parseNumberInputValue(displayValue) : displayValue;\r\n this._onChange(emitValue);\r\n this.valueChange.emit(emitValue);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @HostListener('change', ['$event'])\r\n onChange(event: Event): void {\r\n // Handle change event for select elements\r\n if (this.isSelect()) {\r\n const target = event.target as HTMLSelectElement;\r\n const newValue = target.value;\r\n if (newValue !== this._value()) {\r\n this._value.set(newValue);\r\n this._onChange(newValue);\r\n this.valueChange.emit(newValue);\r\n this.stateChanges.next();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n if (!this._focused()) {\r\n this._focused.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n if (this._focused()) {\r\n this._focused.set(false);\r\n this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n // Public API\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n blur(): void {\r\n this._elementRef.nativeElement.blur();\r\n }\r\n\r\n /**\r\n * Clears the input's value and refocuses it.\r\n *\r\n * Dispatches a native `input` event so every binding style stays in sync —\r\n * reactive/template forms (via the `onInput` handler) as well as plain\r\n * `(input)` template listeners on the host element. Used by the form-field's\r\n * search clear button.\r\n */\r\n clear(): void {\r\n const el = this._elementRef.nativeElement;\r\n el.value = '';\r\n el.dispatchEvent(new Event('input', { bubbles: true }));\r\n el.focus();\r\n }\r\n\r\n /**\r\n * Parse a number input's display value into a number or null.\r\n * Returns null for empty/invalid input (e.g. empty string, just a minus sign, partial decimal).\r\n */\r\n private _parseNumberInputValue(raw: string): number | null {\r\n if (raw === '' || raw.trim() === '') return null;\r\n // Allow trailing minus/decimal during typing — don't emit partial values\r\n if (raw === '-' || raw === '.' || raw === '-.') return null;\r\n const parsed = parseFloat(raw);\r\n return isNaN(parsed) ? null : parsed;\r\n }\r\n\r\n /**\r\n * Check if the element is a select element\r\n */\r\n isSelect(): boolean {\r\n return this._elementRef.nativeElement.tagName.toLowerCase() === 'select';\r\n }\r\n\r\n /** A plain input always supports the copy button in read-only mode. */\r\n readonlyCopyEnabled(): boolean {\r\n return true;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|