@kirbydesign/designsystem 10.3.1 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +7 -0
  2. package/calendar/calendar.component.d.ts.map +1 -1
  3. package/checkbox/checkbox.component.d.ts +5 -3
  4. package/checkbox/checkbox.component.d.ts.map +1 -1
  5. package/config/index.d.ts +6 -0
  6. package/config/kirbydesign-designsystem-config.d.ts.map +1 -0
  7. package/config/provide-kirby.d.ts +27 -0
  8. package/config/provide-kirby.d.ts.map +1 -0
  9. package/config/public_api.d.ts +2 -0
  10. package/config/public_api.d.ts.map +1 -0
  11. package/dropdown/dropdown.module.d.ts +2 -1
  12. package/dropdown/dropdown.module.d.ts.map +1 -1
  13. package/fesm2022/kirbydesign-designsystem-accordion.mjs +12 -12
  14. package/fesm2022/kirbydesign-designsystem-action-group.mjs +4 -4
  15. package/fesm2022/kirbydesign-designsystem-avatar.mjs +4 -4
  16. package/fesm2022/kirbydesign-designsystem-badge.mjs +4 -4
  17. package/fesm2022/kirbydesign-designsystem-button.mjs +4 -4
  18. package/fesm2022/kirbydesign-designsystem-calendar.mjs +8 -7
  19. package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
  20. package/fesm2022/kirbydesign-designsystem-card.mjs +18 -18
  21. package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
  22. package/fesm2022/kirbydesign-designsystem-chart.mjs +23 -23
  23. package/fesm2022/kirbydesign-designsystem-checkbox.mjs +13 -8
  24. package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
  25. package/fesm2022/kirbydesign-designsystem-config.mjs +37 -0
  26. package/fesm2022/kirbydesign-designsystem-config.mjs.map +1 -0
  27. package/fesm2022/kirbydesign-designsystem-data-table.mjs +8 -8
  28. package/fesm2022/kirbydesign-designsystem-divider.mjs +4 -4
  29. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +18 -15
  30. package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
  31. package/fesm2022/kirbydesign-designsystem-empty-state.mjs +9 -9
  32. package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
  33. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +5 -5
  34. package/fesm2022/kirbydesign-designsystem-flag.mjs +4 -4
  35. package/fesm2022/kirbydesign-designsystem-form-field.mjs +143 -70
  36. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  37. package/fesm2022/kirbydesign-designsystem-header.mjs +21 -21
  38. package/fesm2022/kirbydesign-designsystem-header.mjs.map +1 -1
  39. package/fesm2022/kirbydesign-designsystem-helpers.mjs +9 -9
  40. package/fesm2022/kirbydesign-designsystem-icon.mjs +11 -12
  41. package/fesm2022/kirbydesign-designsystem-icon.mjs.map +1 -1
  42. package/fesm2022/kirbydesign-designsystem-item-group.mjs +4 -4
  43. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +4 -4
  44. package/fesm2022/kirbydesign-designsystem-item.mjs +11 -11
  45. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs +8 -8
  46. package/fesm2022/kirbydesign-designsystem-list.mjs +41 -41
  47. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +7 -7
  48. package/fesm2022/kirbydesign-designsystem-menu.mjs +5 -5
  49. package/fesm2022/kirbydesign-designsystem-modal.mjs +45 -47
  50. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  51. package/fesm2022/kirbydesign-designsystem-page.mjs +86 -47
  52. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  53. package/fesm2022/kirbydesign-designsystem-popover.mjs +4 -4
  54. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +7 -7
  55. package/fesm2022/kirbydesign-designsystem-radio.mjs +36 -18
  56. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  57. package/fesm2022/kirbydesign-designsystem-range.mjs +4 -4
  58. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +4 -4
  59. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +8 -8
  60. package/fesm2022/kirbydesign-designsystem-section-header.mjs +4 -4
  61. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs +4 -4
  62. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs +4 -4
  63. package/fesm2022/kirbydesign-designsystem-shared.mjs +65 -23
  64. package/fesm2022/kirbydesign-designsystem-shared.mjs.map +1 -1
  65. package/fesm2022/kirbydesign-designsystem-slide-button.mjs +4 -4
  66. package/fesm2022/kirbydesign-designsystem-slide.mjs +14 -14
  67. package/fesm2022/kirbydesign-designsystem-spinner.mjs +8 -8
  68. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +11 -11
  69. package/fesm2022/kirbydesign-designsystem-tabs.mjs +14 -14
  70. package/fesm2022/kirbydesign-designsystem-testing-base.mjs +287 -287
  71. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs +4 -4
  72. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs +4 -4
  73. package/fesm2022/kirbydesign-designsystem-testing.mjs +4 -4
  74. package/fesm2022/kirbydesign-designsystem-toast.mjs +6 -6
  75. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs +77 -9
  76. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs.map +1 -1
  77. package/fesm2022/kirbydesign-designsystem-toggle.mjs +50 -19
  78. package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
  79. package/fesm2022/kirbydesign-designsystem-types.mjs +3 -3
  80. package/fesm2022/kirbydesign-designsystem.mjs +84 -26
  81. package/fesm2022/kirbydesign-designsystem.mjs.map +1 -1
  82. package/form-field/form-field.component.d.ts +21 -6
  83. package/form-field/form-field.component.d.ts.map +1 -1
  84. package/form-field/input/input.component.d.ts +11 -7
  85. package/form-field/input/input.component.d.ts.map +1 -1
  86. package/form-field/textarea/textarea.component.d.ts +8 -4
  87. package/form-field/textarea/textarea.component.d.ts.map +1 -1
  88. package/icon/kirby-icon-settings.d.ts.map +1 -1
  89. package/lib/components/segmented-control/segmented-control.component.d.ts +35 -1
  90. package/lib/components/segmented-control/segmented-control.component.d.ts.map +1 -1
  91. package/lib/index.d.ts +1 -1
  92. package/lib/index.d.ts.map +1 -1
  93. package/lib/kirby.module.d.ts +45 -48
  94. package/lib/kirby.module.d.ts.map +1 -1
  95. package/modal/modal/modal-component/modal.component.d.ts.map +1 -1
  96. package/package.json +40 -40
  97. package/page/page.component.d.ts +9 -2
  98. package/page/page.component.d.ts.map +1 -1
  99. package/radio/radio-group/radio-group.component.d.ts +13 -5
  100. package/radio/radio-group/radio-group.component.d.ts.map +1 -1
  101. package/readme.md +1 -1
  102. package/shared/controls/label-helpers.d.ts +13 -0
  103. package/shared/controls/label-helpers.d.ts.map +1 -1
  104. package/shared/fit-heading/fit-heading.directive.d.ts +1 -1
  105. package/shared/fit-heading/fit-heading.directive.d.ts.map +1 -1
  106. package/shared/translation/translation.interface.d.ts +1 -0
  107. package/shared/translation/translation.interface.d.ts.map +1 -1
  108. package/shared/translation/translation.service.d.ts.map +1 -1
  109. package/shared/translation/translations/da.d.ts.map +1 -1
  110. package/shared/translation/translations/de.d.ts +3 -0
  111. package/shared/translation/translations/de.d.ts.map +1 -0
  112. package/shared/translation/translations/en.d.ts.map +1 -1
  113. package/toggle/toggle.component.d.ts +13 -6
  114. package/toggle/toggle.component.d.ts.map +1 -1
  115. package/toggle-button/toggle-button.component.d.ts +35 -1
  116. package/toggle-button/toggle-button.component.d.ts.map +1 -1
  117. package/types/form-field-control.d.ts +6 -0
  118. package/types/form-field-control.d.ts.map +1 -0
  119. package/types/public_api.d.ts +1 -0
  120. package/types/public_api.d.ts.map +1 -1
  121. package/fesm2022/kirbydesign-designsystem-kirby-ionic-module.mjs +0 -30
  122. package/fesm2022/kirbydesign-designsystem-kirby-ionic-module.mjs.map +0 -1
  123. package/kirby-ionic-module/index.d.ts +0 -6
  124. package/kirby-ionic-module/kirby-ionic.module.d.ts +0 -7
  125. package/kirby-ionic-module/kirby-ionic.module.d.ts.map +0 -1
  126. package/kirby-ionic-module/kirbydesign-designsystem-kirby-ionic-module.d.ts.map +0 -1
  127. package/kirby-ionic-module/public_api.d.ts +0 -2
  128. package/kirby-ionic-module/public_api.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, Input, LOCALE_ID, Inject, HostListener, Component, ChangeDetectionStrategy, EventEmitter, HostBinding, ElementRef, ContentChildren, ContentChild, NgModule } from '@angular/core';
2
+ import { Input, Directive, LOCALE_ID, HostListener, Inject, ChangeDetectionStrategy, Component, EventEmitter, Output, HostBinding, ElementRef, ContentChild, ContentChildren, NgModule } from '@angular/core';
3
3
  import * as i1 from '@kirbydesign/designsystem/helpers';
4
4
  import { UniqueIdGenerator, DesignTokenHelper } from '@kirbydesign/designsystem/helpers';
5
5
  import { RadioGroupComponent } from '@kirbydesign/designsystem/radio';
@@ -18,10 +18,10 @@ class AffixDirective {
18
18
  constructor(el) {
19
19
  this.el = el;
20
20
  }
21
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: AffixDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
22
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.1.4", type: AffixDirective, isStandalone: true, selector: "[kirby-affix]", inputs: { type: ["kirby-affix", "type"] }, ngImport: i0 }); }
21
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: AffixDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
22
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.5", type: AffixDirective, isStandalone: true, selector: "[kirby-affix]", inputs: { type: ["kirby-affix", "type"] }, ngImport: i0 }); }
23
23
  }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: AffixDirective, decorators: [{
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: AffixDirective, decorators: [{
25
25
  type: Directive,
26
26
  args: [{
27
27
  standalone: true,
@@ -137,10 +137,10 @@ class DateInputDirective {
137
137
  ? value.slice(0, value.lastIndexOf(lastNumber[1]) + 1)
138
138
  : '';
139
139
  }
140
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: DateInputDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Directive }); }
141
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.1.4", type: DateInputDirective, isStandalone: true, inputs: { prefillYear: "prefillYear", useNativeDatePicker: "useNativeDatePicker" }, host: { listeners: { "input": "onInput()" } }, ngImport: i0 }); }
140
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DateInputDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Directive }); }
141
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.5", type: DateInputDirective, isStandalone: true, inputs: { prefillYear: "prefillYear", useNativeDatePicker: "useNativeDatePicker" }, host: { listeners: { "input": "onInput()" } }, ngImport: i0 }); }
142
142
  }
143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: DateInputDirective, decorators: [{
143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DateInputDirective, decorators: [{
144
144
  type: Directive,
145
145
  args: [{
146
146
  standalone: true,
@@ -161,10 +161,10 @@ class FormFieldMessageComponent {
161
161
  constructor() {
162
162
  this.position = 'left';
163
163
  }
164
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FormFieldMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
165
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.4", type: FormFieldMessageComponent, isStandalone: false, selector: "kirby-form-field-message", inputs: { text: "text", position: "position" }, ngImport: i0, template: "{{ text }}\n<ng-content></ng-content>\n", styles: [":host{font-style:italic;font-size:12px;font-weight:400;font-stretch:normal;line-height:16px;min-height:16px;letter-spacing:normal;color:var(--kirby-text-color-black)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
164
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: FormFieldMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
165
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: FormFieldMessageComponent, isStandalone: false, selector: "kirby-form-field-message", inputs: { text: "text", position: "position" }, ngImport: i0, template: "{{ text }}\n<ng-content></ng-content>\n", styles: [":host{font-style:italic;font-size:12px;font-weight:400;font-stretch:normal;line-height:16px;min-height:16px;letter-spacing:normal;color:var(--kirby-text-color-black)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
166
166
  }
167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FormFieldMessageComponent, decorators: [{
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: FormFieldMessageComponent, decorators: [{
168
168
  type: Component,
169
169
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'kirby-form-field-message', standalone: false, template: "{{ text }}\n<ng-content></ng-content>\n", styles: [":host{font-style:italic;font-size:12px;font-weight:400;font-stretch:normal;line-height:16px;min-height:16px;letter-spacing:normal;color:var(--kirby-text-color-black)}\n"] }]
170
170
  }], propDecorators: { text: [{
@@ -195,10 +195,10 @@ class InputCounterComponent {
195
195
  this._inputChangeSubscription.unsubscribe();
196
196
  }
197
197
  }
198
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: InputCounterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
199
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.4", type: InputCounterComponent, isStandalone: false, selector: "kirby-input-counter", inputs: { listenTo: "listenTo" }, ngImport: i0, template: "<kirby-form-field-message [text]=\"text\"></kirby-form-field-message>\n", dependencies: [{ kind: "component", type: FormFieldMessageComponent, selector: "kirby-form-field-message", inputs: ["text", "position"] }] }); }
198
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: InputCounterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
199
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: InputCounterComponent, isStandalone: false, selector: "kirby-input-counter", inputs: { listenTo: "listenTo" }, ngImport: i0, template: "<kirby-form-field-message [text]=\"text\"></kirby-form-field-message>\n", dependencies: [{ kind: "component", type: FormFieldMessageComponent, selector: "kirby-form-field-message", inputs: ["text", "position"] }] }); }
200
200
  }
201
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: InputCounterComponent, decorators: [{
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: InputCounterComponent, decorators: [{
202
202
  type: Component,
203
203
  args: [{ selector: 'kirby-input-counter', standalone: false, template: "<kirby-form-field-message [text]=\"text\"></kirby-form-field-message>\n" }]
204
204
  }], propDecorators: { listenTo: [{
@@ -211,12 +211,29 @@ var InputSize;
211
211
  InputSize["large"] = "lg";
212
212
  })(InputSize || (InputSize = {}));
213
213
  class InputComponent {
214
+ set type(value) {
215
+ const mappedValue = InputComponent.typeToInputmodeMap[value];
216
+ if (mappedValue && !this.inputmode) {
217
+ this.inputmode = mappedValue;
218
+ }
219
+ }
220
+ get hasError() {
221
+ return this._hasError;
222
+ }
223
+ set hasError(value) {
224
+ if (this._hasError !== value) {
225
+ this._hasError = value;
226
+ this.hasErrorChange.emit(this._hasError);
227
+ }
228
+ }
214
229
  constructor(elementRef) {
215
230
  this.elementRef = elementRef;
216
231
  this.kirbyChange = new EventEmitter();
232
+ this._hasError = false;
217
233
  this.size = InputSize.large;
218
234
  this.autocomplete = 'off';
219
235
  this.autocorrect = 'off';
236
+ this.hasErrorChange = new EventEmitter();
220
237
  }
221
238
  ngOnInit() {
222
239
  // The native input value is emitted here to make sure that
@@ -229,16 +246,15 @@ class InputComponent {
229
246
  }
230
247
  });
231
248
  }
249
+ ngOnChanges(changes) {
250
+ if (changes.value) {
251
+ this.kirbyChange.emit(changes.value.currentValue);
252
+ }
253
+ }
232
254
  static { this.typeToInputmodeMap = {
233
255
  number: 'decimal',
234
256
  search: 'search',
235
257
  }; }
236
- set type(value) {
237
- const mappedValue = InputComponent.typeToInputmodeMap[value];
238
- if (mappedValue && !this.inputmode) {
239
- this.inputmode = mappedValue;
240
- }
241
- }
242
258
  _onKeyUp(value) {
243
259
  this.kirbyChange.emit(value);
244
260
  }
@@ -246,23 +262,17 @@ class InputComponent {
246
262
  //Value of input element is updated after cut/paste:
247
263
  setTimeout(() => this.kirbyChange.emit(target.value));
248
264
  }
249
- ngOnChanges(changes) {
250
- if (changes.value) {
251
- this.kirbyChange.emit(changes.value.currentValue);
252
- }
253
- }
254
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: InputComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
255
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.4", type: InputComponent, isStandalone: true, selector: "input[kirby-input]", inputs: { type: "type", size: "size", borderless: "borderless", hasError: "hasError", autocomplete: "autocomplete", autocorrect: "autocorrect", value: "value", maxlength: "maxlength", inputmode: "inputmode" }, host: { listeners: { "keyup": "_onKeyUp($event.target.value)", "paste": "_onCutPaste($event.target)", "cut": "_onCutPaste($event.target)" }, properties: { "class": "this.size", "class.borderless": "this.borderless", "class.error": "this.hasError", "attr.autocomplete": "this.autocomplete", "attr.autocorrect": "this.autocorrect", "attr.value": "this.value", "attr.maxlength": "this.maxlength", "attr.inputmode": "this.inputmode" } }, usesOnChanges: true, hostDirectives: [{ directive: DateInputDirective, inputs: ["prefillYear", "prefillYear", "useNativeDatePicker", "useNativeDatePicker"] }], ngImport: i0, template: '', isInline: true, styles: [":host(.error){border:1px solid var(--kirby-danger);padding:calc(1em - 1px)}:host(.cloned-input){pointer-events:none;position:absolute;top:0;left:0}:host-context(label).cloned-input{top:24px}@media (hover: hover) and (pointer: fine){:host:focus{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 1px 24px #1c1c1c0a,0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{background-color:var(--kirby-inputs-background-color);color:var(--kirby-inputs-color);border:none;box-sizing:border-box;font-family:var(--kirby-font-family);font-size:1rem;line-height:1.5;outline:none;margin:0;-webkit-appearance:none;appearance:none;border-radius:16px;box-shadow:var(--kirby-inputs-elevation);padding:1em;width:100%}:host:host-context(kirby-item),:host.borderless{border-radius:0;box-shadow:none;padding-inline:0;width:auto}:host:disabled{background-color:var(--kirby-light-tint);color:var(--kirby-text-color-semi-dark);box-shadow:none}:host::placeholder{color:var(--kirby-inputs-placeholder-color)}@supports not (selector(::-webkit-date-and-time-value)){:host(input[type=date]::-webkit-date-and-time-value){min-height:1.5em;text-align:start}}@media (hover: hover){:host:not(:disabled):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:var(--kirby-inputs-background-color-hover);cursor:text}}:host:not(:disabled):active,:host:not(:disabled).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:var(--kirby-inputs-background-color-active)}:host:not(:disabled){transition:all 80ms linear 0ms;transition-property:background-color}:host[type=date]{background-color:var(--date-input-background-color)}:host[type=number]{-webkit-appearance:textfield;appearance:textfield}:host::-webkit-outer-spin-button,:host::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}:host(.md){border-radius:24px;padding-block:.5em}:host(.md).error{padding-block:calc(.5em - 1px)}:host-context(kirby-item kirby-form-field[slot=end])[type=number]{font-weight:700}.date-mask-wrapper{position:relative}:host-context(.date-mask-wrapper){color:var(--kirby-text-color-semi-dark)}.date-mask{font-family:var(--kirby-font-family);line-height:1.5;color:var(--kirby-white-contrast);position:absolute;top:0;left:0;padding:1em}:host(.md)+.date-mask{padding-block:.5em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
265
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: InputComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
266
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: InputComponent, isStandalone: true, selector: "input[kirby-input]", inputs: { type: "type", size: "size", borderless: "borderless", hasError: "hasError", autocomplete: "autocomplete", autocorrect: "autocorrect", value: "value", maxlength: "maxlength", inputmode: "inputmode" }, outputs: { hasErrorChange: "hasErrorChange" }, host: { listeners: { "keyup": "_onKeyUp($event.target.value)", "paste": "_onCutPaste($event.target)", "cut": "_onCutPaste($event.target)" }, properties: { "class": "this.size", "class.borderless": "this.borderless", "attr.aria-invalid": "this.hasError", "class.error": "this.hasError", "attr.autocomplete": "this.autocomplete", "attr.autocorrect": "this.autocorrect", "attr.value": "this.value", "attr.maxlength": "this.maxlength", "attr.inputmode": "this.inputmode" } }, usesOnChanges: true, hostDirectives: [{ directive: DateInputDirective, inputs: ["prefillYear", "prefillYear", "useNativeDatePicker", "useNativeDatePicker"] }], ngImport: i0, template: '', isInline: true, styles: [":host(.error){border:1px solid var(--kirby-danger);padding:calc(1em - 1px)}:host(.cloned-input){pointer-events:none;position:absolute;top:0;left:0}:host-context(label).cloned-input{top:24px}@media (hover: hover) and (pointer: fine){:host:focus{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 1px 24px #1c1c1c0a,0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{background-color:var(--kirby-inputs-background-color);color:var(--kirby-inputs-color);border:none;box-sizing:border-box;font-family:var(--kirby-font-family);font-size:1rem;line-height:1.5;outline:none;margin:0;-webkit-appearance:none;appearance:none;border-radius:16px;box-shadow:var(--kirby-inputs-elevation);padding:1em;width:100%}:host:host-context(kirby-item),:host.borderless{border-radius:0;box-shadow:none;padding-inline:0;width:auto}:host:disabled{background-color:var(--kirby-light-tint);color:var(--kirby-text-color-semi-dark);box-shadow:none}:host::placeholder{color:var(--kirby-inputs-placeholder-color)}@supports not (selector(::-webkit-date-and-time-value)){:host(input[type=date]::-webkit-date-and-time-value){min-height:1.5em;text-align:start}}@media (hover: hover){:host:not(:disabled):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:var(--kirby-inputs-background-color-hover);cursor:text}}:host:not(:disabled):active,:host:not(:disabled).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:var(--kirby-inputs-background-color-active)}:host:not(:disabled){transition:all 80ms linear 0ms;transition-property:background-color}:host[type=date]{background-color:var(--date-input-background-color)}:host[type=number]{-webkit-appearance:textfield;appearance:textfield}:host::-webkit-outer-spin-button,:host::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}:host(.md){border-radius:24px;padding-block:.5em}:host(.md).error{padding-block:calc(.5em - 1px)}:host-context(kirby-item kirby-form-field[slot=end])[type=number]{font-weight:700}.date-mask-wrapper{position:relative}:host-context(.date-mask-wrapper){color:var(--kirby-text-color-semi-dark)}.date-mask{font-family:var(--kirby-font-family);line-height:1.5;font-size:var(--kirby-font-size-n);color:var(--kirby-white-contrast);position:absolute;top:0;left:0;padding:1em}:host(.md)+.date-mask{padding-block:.5em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
256
267
  }
257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: InputComponent, decorators: [{
268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: InputComponent, decorators: [{
258
269
  type: Component,
259
270
  args: [{ imports: [CommonModule], hostDirectives: [
260
271
  {
261
272
  directive: DateInputDirective,
262
- // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
263
273
  inputs: ['prefillYear', 'useNativeDatePicker'],
264
274
  },
265
- ], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'input[kirby-input]', template: '', styles: [":host(.error){border:1px solid var(--kirby-danger);padding:calc(1em - 1px)}:host(.cloned-input){pointer-events:none;position:absolute;top:0;left:0}:host-context(label).cloned-input{top:24px}@media (hover: hover) and (pointer: fine){:host:focus{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 1px 24px #1c1c1c0a,0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{background-color:var(--kirby-inputs-background-color);color:var(--kirby-inputs-color);border:none;box-sizing:border-box;font-family:var(--kirby-font-family);font-size:1rem;line-height:1.5;outline:none;margin:0;-webkit-appearance:none;appearance:none;border-radius:16px;box-shadow:var(--kirby-inputs-elevation);padding:1em;width:100%}:host:host-context(kirby-item),:host.borderless{border-radius:0;box-shadow:none;padding-inline:0;width:auto}:host:disabled{background-color:var(--kirby-light-tint);color:var(--kirby-text-color-semi-dark);box-shadow:none}:host::placeholder{color:var(--kirby-inputs-placeholder-color)}@supports not (selector(::-webkit-date-and-time-value)){:host(input[type=date]::-webkit-date-and-time-value){min-height:1.5em;text-align:start}}@media (hover: hover){:host:not(:disabled):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:var(--kirby-inputs-background-color-hover);cursor:text}}:host:not(:disabled):active,:host:not(:disabled).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:var(--kirby-inputs-background-color-active)}:host:not(:disabled){transition:all 80ms linear 0ms;transition-property:background-color}:host[type=date]{background-color:var(--date-input-background-color)}:host[type=number]{-webkit-appearance:textfield;appearance:textfield}:host::-webkit-outer-spin-button,:host::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}:host(.md){border-radius:24px;padding-block:.5em}:host(.md).error{padding-block:calc(.5em - 1px)}:host-context(kirby-item kirby-form-field[slot=end])[type=number]{font-weight:700}.date-mask-wrapper{position:relative}:host-context(.date-mask-wrapper){color:var(--kirby-text-color-semi-dark)}.date-mask{font-family:var(--kirby-font-family);line-height:1.5;color:var(--kirby-white-contrast);position:absolute;top:0;left:0;padding:1em}:host(.md)+.date-mask{padding-block:.5em}\n"] }]
275
+ ], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'input[kirby-input]', template: '', styles: [":host(.error){border:1px solid var(--kirby-danger);padding:calc(1em - 1px)}:host(.cloned-input){pointer-events:none;position:absolute;top:0;left:0}:host-context(label).cloned-input{top:24px}@media (hover: hover) and (pointer: fine){:host:focus{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 1px 24px #1c1c1c0a,0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{background-color:var(--kirby-inputs-background-color);color:var(--kirby-inputs-color);border:none;box-sizing:border-box;font-family:var(--kirby-font-family);font-size:1rem;line-height:1.5;outline:none;margin:0;-webkit-appearance:none;appearance:none;border-radius:16px;box-shadow:var(--kirby-inputs-elevation);padding:1em;width:100%}:host:host-context(kirby-item),:host.borderless{border-radius:0;box-shadow:none;padding-inline:0;width:auto}:host:disabled{background-color:var(--kirby-light-tint);color:var(--kirby-text-color-semi-dark);box-shadow:none}:host::placeholder{color:var(--kirby-inputs-placeholder-color)}@supports not (selector(::-webkit-date-and-time-value)){:host(input[type=date]::-webkit-date-and-time-value){min-height:1.5em;text-align:start}}@media (hover: hover){:host:not(:disabled):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:var(--kirby-inputs-background-color-hover);cursor:text}}:host:not(:disabled):active,:host:not(:disabled).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:var(--kirby-inputs-background-color-active)}:host:not(:disabled){transition:all 80ms linear 0ms;transition-property:background-color}:host[type=date]{background-color:var(--date-input-background-color)}:host[type=number]{-webkit-appearance:textfield;appearance:textfield}:host::-webkit-outer-spin-button,:host::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}:host(.md){border-radius:24px;padding-block:.5em}:host(.md).error{padding-block:calc(.5em - 1px)}:host-context(kirby-item kirby-form-field[slot=end])[type=number]{font-weight:700}.date-mask-wrapper{position:relative}:host-context(.date-mask-wrapper){color:var(--kirby-text-color-semi-dark)}.date-mask{font-family:var(--kirby-font-family);line-height:1.5;font-size:var(--kirby-font-size-n);color:var(--kirby-white-contrast);position:absolute;top:0;left:0;padding:1em}:host(.md)+.date-mask{padding-block:.5em}\n"] }]
266
276
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { type: [{
267
277
  type: Input
268
278
  }], size: [{
@@ -276,6 +286,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
276
286
  }, {
277
287
  type: Input
278
288
  }], hasError: [{
289
+ type: HostBinding,
290
+ args: ['attr.aria-invalid']
291
+ }, {
279
292
  type: HostBinding,
280
293
  args: ['class.error']
281
294
  }, {
@@ -305,6 +318,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
305
318
  args: ['attr.inputmode']
306
319
  }, {
307
320
  type: Input
321
+ }], hasErrorChange: [{
322
+ type: Output
308
323
  }], _onKeyUp: [{
309
324
  type: HostListener,
310
325
  args: ['keyup', ['$event.target.value']]
@@ -319,25 +334,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
319
334
  class TextareaComponent {
320
335
  constructor() {
321
336
  this.kirbyChange = new EventEmitter();
337
+ this._hasError = false;
322
338
  this.autocomplete = 'off';
323
339
  this.autocorrect = 'off';
340
+ this.hasErrorChange = new EventEmitter();
324
341
  }
325
- _onKeyUp(value) {
326
- this.kirbyChange.emit(value);
342
+ get hasError() {
343
+ return this._hasError;
327
344
  }
328
- _onCutPaste(target) {
329
- //Value of textarea element is updated after cut/paste:
330
- setTimeout(() => this.kirbyChange.emit(target.value));
345
+ set hasError(value) {
346
+ if (this._hasError !== value) {
347
+ this._hasError = value;
348
+ this.hasErrorChange.emit(this._hasError);
349
+ }
331
350
  }
332
351
  ngOnChanges(changes) {
333
352
  if (changes.value) {
334
353
  this.kirbyChange.emit(changes.value.currentValue);
335
354
  }
336
355
  }
337
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: TextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
338
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.4", type: TextareaComponent, isStandalone: true, selector: "textarea[kirby-textarea]", inputs: { value: "value", borderless: "borderless", hasError: "hasError", autocomplete: "autocomplete", autocorrect: "autocorrect", maxlength: "maxlength" }, host: { listeners: { "keyup": "_onKeyUp($event.target.value)", "paste": "_onCutPaste($event.target)", "cut": "_onCutPaste($event.target)" }, properties: { "class.borderless": "this.borderless", "class.error": "this.hasError", "attr.autocomplete": "this.autocomplete", "attr.autocorrect": "this.autocorrect", "attr.maxlength": "this.maxlength" } }, usesOnChanges: true, ngImport: i0, template: "<ng-content *ngIf=\"!value\"></ng-content>\n<ng-container *ngIf=\"value\">{{ value }}</ng-container>\n", styles: [":host(.error){border:1px solid var(--kirby-danger);padding:calc(1em - 1px)}:host(.cloned-input){pointer-events:none;position:absolute;top:0;left:0}:host-context(label).cloned-input{top:24px}@media (hover: hover) and (pointer: fine){:host:focus{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 1px 24px #1c1c1c0a,0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{background-color:var(--kirby-inputs-background-color);color:var(--kirby-inputs-color);border:none;box-sizing:border-box;font-family:var(--kirby-font-family);font-size:1rem;line-height:1.5;outline:none;margin:0;-webkit-appearance:none;appearance:none;border-radius:16px;box-shadow:var(--kirby-inputs-elevation);padding:1em;width:100%}:host:host-context(kirby-item),:host.borderless{border-radius:0;box-shadow:none;padding-inline:0;width:auto}:host:disabled{background-color:var(--kirby-light-tint);color:var(--kirby-text-color-semi-dark);box-shadow:none}:host::placeholder{color:var(--kirby-inputs-placeholder-color)}@supports not (selector(::-webkit-date-and-time-value)){:host(input[type=date]::-webkit-date-and-time-value){min-height:1.5em;text-align:start}}@media (hover: hover){:host:not(:disabled):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#f5f5f5;cursor:text}}:host:not(:disabled):active,:host:not(:disabled).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#ebebeb}:host:not(:disabled){transition:all 80ms linear 0ms;transition-property:background-color}:host{position:relative;font-family:var(--kirby-font-family);resize:none}@media (min-width: 768px){:host{resize:vertical}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
356
+ _onKeyUp(value) {
357
+ this.kirbyChange.emit(value);
358
+ }
359
+ _onCutPaste(target) {
360
+ //Value of textarea element is updated after cut/paste:
361
+ setTimeout(() => this.kirbyChange.emit(target.value));
362
+ }
363
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: TextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
364
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: TextareaComponent, isStandalone: true, selector: "textarea[kirby-textarea]", inputs: { value: "value", borderless: "borderless", hasError: "hasError", autocomplete: "autocomplete", autocorrect: "autocorrect", maxlength: "maxlength" }, outputs: { hasErrorChange: "hasErrorChange" }, host: { listeners: { "keyup": "_onKeyUp($event.target.value)", "paste": "_onCutPaste($event.target)", "cut": "_onCutPaste($event.target)" }, properties: { "class.borderless": "this.borderless", "attr.aria-invalid": "this.hasError", "class.error": "this.hasError", "attr.autocomplete": "this.autocomplete", "attr.autocorrect": "this.autocorrect", "attr.maxlength": "this.maxlength" } }, usesOnChanges: true, ngImport: i0, template: "<ng-content *ngIf=\"!value\"></ng-content>\n<ng-container *ngIf=\"value\">{{ value }}</ng-container>\n", styles: [":host(.error){border:1px solid var(--kirby-danger);padding:calc(1em - 1px)}:host(.cloned-input){pointer-events:none;position:absolute;top:0;left:0}:host-context(label).cloned-input{top:24px}@media (hover: hover) and (pointer: fine){:host:focus{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 1px 24px #1c1c1c0a,0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{background-color:var(--kirby-inputs-background-color);color:var(--kirby-inputs-color);border:none;box-sizing:border-box;font-family:var(--kirby-font-family);font-size:1rem;line-height:1.5;outline:none;margin:0;-webkit-appearance:none;appearance:none;border-radius:16px;box-shadow:var(--kirby-inputs-elevation);padding:1em;width:100%}:host:host-context(kirby-item),:host.borderless{border-radius:0;box-shadow:none;padding-inline:0;width:auto}:host:disabled{background-color:var(--kirby-light-tint);color:var(--kirby-text-color-semi-dark);box-shadow:none}:host::placeholder{color:var(--kirby-inputs-placeholder-color)}@supports not (selector(::-webkit-date-and-time-value)){:host(input[type=date]::-webkit-date-and-time-value){min-height:1.5em;text-align:start}}@media (hover: hover){:host:not(:disabled):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#f5f5f5;cursor:text}}:host:not(:disabled):active,:host:not(:disabled).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#ebebeb}:host:not(:disabled){transition:all 80ms linear 0ms;transition-property:background-color}:host{position:relative;font-family:var(--kirby-font-family);resize:none}@media (min-width: 768px){:host{resize:vertical}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
339
365
  }
340
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: TextareaComponent, decorators: [{
366
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: TextareaComponent, decorators: [{
341
367
  type: Component,
342
368
  args: [{ imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'textarea[kirby-textarea]', template: "<ng-content *ngIf=\"!value\"></ng-content>\n<ng-container *ngIf=\"value\">{{ value }}</ng-container>\n", styles: [":host(.error){border:1px solid var(--kirby-danger);padding:calc(1em - 1px)}:host(.cloned-input){pointer-events:none;position:absolute;top:0;left:0}:host-context(label).cloned-input{top:24px}@media (hover: hover) and (pointer: fine){:host:focus{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 1px 24px #1c1c1c0a,0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 1px 24px #1c1c1c0a,0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{background-color:var(--kirby-inputs-background-color);color:var(--kirby-inputs-color);border:none;box-sizing:border-box;font-family:var(--kirby-font-family);font-size:1rem;line-height:1.5;outline:none;margin:0;-webkit-appearance:none;appearance:none;border-radius:16px;box-shadow:var(--kirby-inputs-elevation);padding:1em;width:100%}:host:host-context(kirby-item),:host.borderless{border-radius:0;box-shadow:none;padding-inline:0;width:auto}:host:disabled{background-color:var(--kirby-light-tint);color:var(--kirby-text-color-semi-dark);box-shadow:none}:host::placeholder{color:var(--kirby-inputs-placeholder-color)}@supports not (selector(::-webkit-date-and-time-value)){:host(input[type=date]::-webkit-date-and-time-value){min-height:1.5em;text-align:start}}@media (hover: hover){:host:not(:disabled):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#f5f5f5;cursor:text}}:host:not(:disabled):active,:host:not(:disabled).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#ebebeb}:host:not(:disabled){transition:all 80ms linear 0ms;transition-property:background-color}:host{position:relative;font-family:var(--kirby-font-family);resize:none}@media (min-width: 768px){:host{resize:vertical}}\n"] }]
343
369
  }], propDecorators: { value: [{
@@ -348,6 +374,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
348
374
  }, {
349
375
  type: Input
350
376
  }], hasError: [{
377
+ type: HostBinding,
378
+ args: ['attr.aria-invalid']
379
+ }, {
351
380
  type: HostBinding,
352
381
  args: ['class.error']
353
382
  }, {
@@ -367,6 +396,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
367
396
  args: ['attr.maxlength']
368
397
  }, {
369
398
  type: Input
399
+ }], hasErrorChange: [{
400
+ type: Output
370
401
  }], _onKeyUp: [{
371
402
  type: HostListener,
372
403
  args: ['keyup', ['$event.target.value']]
@@ -379,14 +410,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
379
410
  }] } });
380
411
 
381
412
  class FormFieldComponent {
382
- constructor(elementRef, platform, renderer, windowRef, resizeObserverService) {
413
+ get message() {
414
+ return this._message;
415
+ }
416
+ set message(value) {
417
+ this._message = value;
418
+ this.setNestedInteractiveElementAttributes();
419
+ }
420
+ constructor(elementRef, platform, renderer, windowRef, resizeObserverService, cdr) {
383
421
  this.platform = platform;
384
422
  this.renderer = renderer;
385
423
  this.windowRef = windowRef;
386
424
  this.resizeObserverService = resizeObserverService;
425
+ this.cdr = cdr;
387
426
  this.isRegistered = false;
388
427
  this.showDefaultCalendarIcon = false;
389
428
  this._labelId = UniqueIdGenerator.scopedTo('kirby-form-field-label').next();
429
+ this._errorMessageId = UniqueIdGenerator.scopedTo('kirby-form-field-message').next();
430
+ this._messageId = UniqueIdGenerator.scopedTo('kirby-form-field-message').next();
390
431
  this.element = elementRef.nativeElement;
391
432
  }
392
433
  get _wrapContentInLabel() {
@@ -407,7 +448,9 @@ class FormFieldComponent {
407
448
  this.radioGroupComponent?.focus();
408
449
  }
409
450
  focus() {
410
- if (!this.inputElement)
451
+ if (!this.nestedInteractiveElement)
452
+ return;
453
+ if (!(this.input || this.textarea))
411
454
  return;
412
455
  /*
413
456
  * This timeout ensures that any previous manipulation of inputElement
@@ -419,11 +462,11 @@ class FormFieldComponent {
419
462
  // See: https://github.com/ionic-team/ionic-framework/blob/master/core/src/utils/input-shims/hacks/scroll-assist.ts
420
463
  const touchStart = new TouchEvent('touchstart');
421
464
  const touchEnd = new TouchEvent('touchend');
422
- this.inputElement.dispatchEvent(touchStart);
423
- this.inputElement.dispatchEvent(touchEnd);
465
+ this.nestedInteractiveElement.dispatchEvent(touchStart);
466
+ this.nestedInteractiveElement.dispatchEvent(touchEnd);
424
467
  }
425
468
  else {
426
- this.inputElement.focus();
469
+ this.nestedInteractiveElement.focus();
427
470
  }
428
471
  });
429
472
  }
@@ -431,9 +474,6 @@ class FormFieldComponent {
431
474
  this.isTouch = this.platform.isTouch();
432
475
  }
433
476
  ngAfterContentInit() {
434
- if (this.label && this.radioGroupElement) {
435
- this.renderer.setAttribute(this.radioGroupElement.nativeElement, 'aria-labelledby', this._labelId);
436
- }
437
477
  // Measure the width of all slotted affix elements,
438
478
  // and apply their width + standard padding to the input elements
439
479
  // padding, so the start/end of the input is correctly indented.
@@ -449,15 +489,10 @@ class FormFieldComponent {
449
489
  }
450
490
  }
451
491
  ngAfterContentChecked() {
452
- if (!this.inputElement) {
453
- this.inputElement = this.element.querySelector('input, textarea');
492
+ if (!this.nestedInteractiveElement) {
493
+ this.registerNestedInteractive();
454
494
  }
455
- // TODO: remove "!this.inputElement.readOnly" when ionic has fixed input click issue
456
- // https://github.com/ionic-team/ionic-framework/issues/22740
457
- if (!this.isRegistered &&
458
- this.element.isConnected &&
459
- !!this.inputElement &&
460
- !this.inputElement.readOnly) {
495
+ if (!this.isRegistered && this.element.isConnected && (this.input || this.textarea)) {
461
496
  // Host is connected to dom and slotted input/textarea is present:
462
497
  this.isRegistered = true;
463
498
  this.dispatchLoadEvent();
@@ -465,11 +500,6 @@ class FormFieldComponent {
465
500
  // Decide if default calendar icon for date input should be shown
466
501
  this.showDefaultCalendarIcon = this.shouldShowDefaultCalendarIcon();
467
502
  }
468
- shouldShowDefaultCalendarIcon() {
469
- return (this.dateInput?.useNativeDatePicker &&
470
- !this.affixElements.some((affix) => affix.type === 'suffix') // there are no suffix elements
471
- );
472
- }
473
503
  ngOnDestroy() {
474
504
  // Dispatch an `ionInputDidUnload` event to unregister
475
505
  // form field + input/textarea from Ionic input shims
@@ -480,14 +510,51 @@ class FormFieldComponent {
480
510
  this.affixElements.forEach((affix) => {
481
511
  this.resizeObserverService.unobserve(affix.el);
482
512
  });
513
+ this.nestedInteractiveErrorSubscription.unsubscribe();
514
+ }
515
+ registerNestedInteractive() {
516
+ this.getNestedInteractiveElement();
517
+ this.setNestedInteractiveElementAttributes();
518
+ this.subscribeToNestedInteractiveError();
519
+ }
520
+ getNestedInteractiveElement() {
521
+ this.nestedInteractiveElement =
522
+ this.input?.nativeElement ||
523
+ this.textarea?.nativeElement ||
524
+ this.radioGroupElement?.nativeElement.querySelector('ion-radio-group');
483
525
  }
484
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FormFieldComponent, deps: [{ token: i0.ElementRef }, { token: i1.PlatformService }, { token: i0.Renderer2 }, { token: i2.WindowRef }, { token: i3.ResizeObserverService }], target: i0.ɵɵFactoryTarget.Component }); }
485
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.4", type: FormFieldComponent, isStandalone: false, selector: "kirby-form-field", inputs: { label: "label", message: "message" }, host: { listeners: { "kirbyRegisterFormField": "_onRegisterFormField()" } }, queries: [{ propertyName: "counter", first: true, predicate: InputCounterComponent, descendants: true }, { propertyName: "radioGroupComponent", first: true, predicate: RadioGroupComponent, descendants: true }, { propertyName: "radioGroupElement", first: true, predicate: RadioGroupComponent, descendants: true, read: ElementRef }, { propertyName: "input", first: true, predicate: InputComponent, descendants: true, read: ElementRef }, { propertyName: "textarea", first: true, predicate: TextareaComponent, descendants: true, read: ElementRef }, { propertyName: "dateInput", first: true, predicate: DateInputDirective, descendants: true }, { propertyName: "affixElements", predicate: AffixDirective }], ngImport: i0, template: "<label *ngIf=\"_wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"labelTextTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"slottedInputTemplate\"></ng-container>\n</label>\n\n<ng-container *ngIf=\"!_wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"labelTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"slottedInputTemplate\"></ng-container>\n</ng-container>\n\n<div *ngIf=\"message !== undefined || counter\" class=\"texts\">\n <kirby-form-field-message\n *ngIf=\"message !== undefined\"\n class=\"message\"\n [text]=\"message\"\n ></kirby-form-field-message>\n\n <div *ngIf=\"counter\" class=\"counter\">\n <ng-content select=\"kirby-input-counter\"></ng-content>\n </div>\n</div>\n\n<ng-template #slottedInputTemplate>\n <div class=\"affix-container\">\n <div class=\"prefix vertical-align semi-dark-text\">\n <ng-content select=\"[kirby-affix='prefix']\"></ng-content>\n </div>\n <ng-content select=\"input[kirby-input]\"></ng-content>\n <ng-content select=\"textarea[kirby-textarea]\"></ng-content>\n <ng-content select=\"kirby-radio-group\"></ng-content>\n <div class=\"suffix vertical-align semi-dark-text\">\n <ng-content select=\"[kirby-affix='suffix']\"></ng-content>\n <ng-container *ngIf=\"showDefaultCalendarIcon\">\n <kirby-icon name=\"calendar\"></kirby-icon>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #labelTextTemplate>\n <ng-container *ngIf=\"label\">\n <span class=\"text\">{{ label }}</span>\n </ng-container>\n</ng-template>\n\n<ng-template #labelTemplate>\n <ng-container *ngIf=\"label\">\n <label class=\"text\" [id]=\"_labelId\" (click)=\"onLabelClick()\">{{ label }}</label>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block;position:relative;margin-bottom:16px}:host-context(kirby-item){margin-bottom:0}.texts{display:flex;justify-content:space-between;padding:2px 16px 0}.texts .message{flex:75%}.texts .message:only-child{flex-basis:auto}.texts .counter{flex:25%;text-align:right}label{display:block}.text{display:block;font-size:14px;font-weight:300;line-height:20px;margin-bottom:8px;padding:0 16px}.affix-container{position:relative}.affix-container .vertical-align{display:flex;align-items:center;position:absolute;top:0;bottom:0}.affix-container .prefix{left:12px}.affix-container .suffix{right:12px}.affix-container .semi-dark-text ::ng-deep>span,.affix-container .semi-dark-text ::ng-deep>h1,.affix-container .semi-dark-text ::ng-deep>h2,.affix-container .semi-dark-text ::ng-deep>h3,.affix-container .semi-dark-text ::ng-deep>h4,.affix-container .semi-dark-text ::ng-deep>h5,.affix-container .semi-dark-text ::ng-deep>h6,.affix-container .semi-dark-text ::ng-deep>p,.affix-container .semi-dark-text ::ng-deep>data{color:var(--kirby-text-color-semi-dark)}.affix-container:has(input[type=date]){--date-input-background-color: var(--kirby-inputs-background-color)}@media (hover: hover){.affix-container:has(input[type=date]):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;--date-input-background-color: #e0e0e0}}.affix-container:has(input[type=date]):active,.affix-container:has(input[type=date]).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);--date-input-background-color: #cbcbcb}.affix-container:has(input[type=date]) .suffix:not(:empty){top:8px;bottom:8px;padding-inline-start:12px;pointer-events:none;background-color:var(--date-input-background-color);transition:all 80ms linear 0ms;transition-property:background-color}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }, { kind: "component", type: FormFieldMessageComponent, selector: "kirby-form-field-message", inputs: ["text", "position"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
526
+ setNestedInteractiveElementAttributes() {
527
+ if (!this.nestedInteractiveElement)
528
+ return;
529
+ if (this.message) {
530
+ this.renderer.setAttribute(this.nestedInteractiveElement, 'aria-describedby', this._messageId);
531
+ this.renderer.setAttribute(this.nestedInteractiveElement, 'aria-errormessage', this._errorMessageId);
532
+ }
533
+ if (this.label && this.radioGroupElement) {
534
+ this.renderer.setAttribute(this.nestedInteractiveElement, 'aria-labelledby', this._labelId);
535
+ }
536
+ }
537
+ subscribeToNestedInteractiveError() {
538
+ const nestedInteractiveComponent = this.inputComponent || this.textareaComponent || this.radioGroupComponent;
539
+ // set current value, then listen for changes
540
+ this._nestedInteractiveHasError = !!nestedInteractiveComponent?.hasError;
541
+ this.nestedInteractiveErrorSubscription = nestedInteractiveComponent?.hasErrorChange.subscribe((hasError) => {
542
+ this._nestedInteractiveHasError = hasError;
543
+ this.cdr.markForCheck();
544
+ });
545
+ }
546
+ shouldShowDefaultCalendarIcon() {
547
+ return (this.dateInput?.useNativeDatePicker &&
548
+ !this.affixElements.some((affix) => affix.type === 'suffix') // there are no suffix elements
549
+ );
550
+ }
551
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: FormFieldComponent, deps: [{ token: i0.ElementRef }, { token: i1.PlatformService }, { token: i0.Renderer2 }, { token: i2.WindowRef }, { token: i3.ResizeObserverService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
552
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: FormFieldComponent, isStandalone: false, selector: "kirby-form-field", inputs: { label: "label", message: "message" }, host: { listeners: { "kirbyRegisterFormField": "_onRegisterFormField()" } }, queries: [{ propertyName: "counter", first: true, predicate: InputCounterComponent, descendants: true }, { propertyName: "radioGroupComponent", first: true, predicate: RadioGroupComponent, descendants: true }, { propertyName: "inputComponent", first: true, predicate: InputComponent, descendants: true }, { propertyName: "textareaComponent", first: true, predicate: TextareaComponent, descendants: true }, { propertyName: "radioGroupElement", first: true, predicate: RadioGroupComponent, descendants: true, read: ElementRef }, { propertyName: "input", first: true, predicate: InputComponent, descendants: true, read: ElementRef }, { propertyName: "textarea", first: true, predicate: TextareaComponent, descendants: true, read: ElementRef }, { propertyName: "dateInput", first: true, predicate: DateInputDirective, descendants: true }, { propertyName: "affixElements", predicate: AffixDirective }], ngImport: i0, template: "<label *ngIf=\"_wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"labelTextTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"slottedInputTemplate\"></ng-container>\n\n <!-- add error message inside label if nested interative is in error state -->\n <ng-container *ngIf=\"_nestedInteractiveHasError\">\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n </ng-container>\n</label>\n\n<!-- add message outside label if nested interative is in valid state -->\n<ng-container *ngIf=\"!_nestedInteractiveHasError && _wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!_wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"labelTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"slottedInputTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n</ng-container>\n\n<ng-template #messageTemplate>\n <div *ngIf=\"message !== undefined || counter\" class=\"texts\">\n <kirby-form-field-message\n *ngIf=\"message !== undefined\"\n class=\"message\"\n [text]=\"message\"\n [attr.aria-live]=\"_nestedInteractiveHasError ? 'polite' : null\"\n [attr.id]=\"_nestedInteractiveHasError ? _errorMessageId : _messageId\"\n ></kirby-form-field-message>\n\n <div *ngIf=\"counter\" class=\"counter\" aria-hidden=\"true\">\n <ng-content select=\"kirby-input-counter\"></ng-content>\n </div>\n </div>\n</ng-template>\n\n<ng-template #slottedInputTemplate>\n <div class=\"affix-container\">\n <div class=\"prefix vertical-align semi-dark-text\">\n <ng-content select=\"[kirby-affix='prefix']\"></ng-content>\n </div>\n <ng-content select=\"input[kirby-input]\"></ng-content>\n <ng-content select=\"textarea[kirby-textarea]\"></ng-content>\n <ng-content select=\"kirby-radio-group\"></ng-content>\n <div class=\"suffix vertical-align semi-dark-text\">\n <ng-content select=\"[kirby-affix='suffix']\"></ng-content>\n <ng-container *ngIf=\"showDefaultCalendarIcon\">\n <kirby-icon name=\"calendar\"></kirby-icon>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #labelTextTemplate>\n <ng-container *ngIf=\"label\">\n <span class=\"text\">{{ label }}</span>\n </ng-container>\n</ng-template>\n\n<ng-template #labelTemplate>\n <ng-container *ngIf=\"label\">\n <label class=\"text\" [id]=\"_labelId\" (click)=\"onLabelClick()\">{{ label }}</label>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block;position:relative;margin-bottom:16px}:host-context(kirby-item){margin-bottom:0}.texts{display:flex;justify-content:space-between;padding:2px 16px 0}.texts .message{flex:75%}.texts .message:only-child{flex-basis:auto}.texts .counter{flex:25%;text-align:right}label{display:block}.text{display:block;font-size:14px;font-weight:300;line-height:20px;margin-bottom:8px;padding:0 16px}.affix-container{position:relative}.affix-container .vertical-align{display:flex;align-items:center;position:absolute;top:0;bottom:0}.affix-container .prefix{left:12px}.affix-container .suffix{right:12px}.affix-container .semi-dark-text ::ng-deep>span,.affix-container .semi-dark-text ::ng-deep>h1,.affix-container .semi-dark-text ::ng-deep>h2,.affix-container .semi-dark-text ::ng-deep>h3,.affix-container .semi-dark-text ::ng-deep>h4,.affix-container .semi-dark-text ::ng-deep>h5,.affix-container .semi-dark-text ::ng-deep>h6,.affix-container .semi-dark-text ::ng-deep>p,.affix-container .semi-dark-text ::ng-deep>data{color:var(--kirby-text-color-semi-dark)}.affix-container:has(input[type=date]){--date-input-background-color: var(--kirby-inputs-background-color)}@media (hover: hover){.affix-container:has(input[type=date]):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;--date-input-background-color: #e0e0e0}}.affix-container:has(input[type=date]):active,.affix-container:has(input[type=date]).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);--date-input-background-color: #cbcbcb}.affix-container:has(input[type=date]) .suffix:not(:empty){top:8px;bottom:8px;padding-inline-start:12px;pointer-events:none;background-color:var(--date-input-background-color);transition:all 80ms linear 0ms;transition-property:background-color}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }, { kind: "component", type: FormFieldMessageComponent, selector: "kirby-form-field-message", inputs: ["text", "position"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
486
553
  }
487
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FormFieldComponent, decorators: [{
554
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: FormFieldComponent, decorators: [{
488
555
  type: Component,
489
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'kirby-form-field', standalone: false, template: "<label *ngIf=\"_wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"labelTextTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"slottedInputTemplate\"></ng-container>\n</label>\n\n<ng-container *ngIf=\"!_wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"labelTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"slottedInputTemplate\"></ng-container>\n</ng-container>\n\n<div *ngIf=\"message !== undefined || counter\" class=\"texts\">\n <kirby-form-field-message\n *ngIf=\"message !== undefined\"\n class=\"message\"\n [text]=\"message\"\n ></kirby-form-field-message>\n\n <div *ngIf=\"counter\" class=\"counter\">\n <ng-content select=\"kirby-input-counter\"></ng-content>\n </div>\n</div>\n\n<ng-template #slottedInputTemplate>\n <div class=\"affix-container\">\n <div class=\"prefix vertical-align semi-dark-text\">\n <ng-content select=\"[kirby-affix='prefix']\"></ng-content>\n </div>\n <ng-content select=\"input[kirby-input]\"></ng-content>\n <ng-content select=\"textarea[kirby-textarea]\"></ng-content>\n <ng-content select=\"kirby-radio-group\"></ng-content>\n <div class=\"suffix vertical-align semi-dark-text\">\n <ng-content select=\"[kirby-affix='suffix']\"></ng-content>\n <ng-container *ngIf=\"showDefaultCalendarIcon\">\n <kirby-icon name=\"calendar\"></kirby-icon>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #labelTextTemplate>\n <ng-container *ngIf=\"label\">\n <span class=\"text\">{{ label }}</span>\n </ng-container>\n</ng-template>\n\n<ng-template #labelTemplate>\n <ng-container *ngIf=\"label\">\n <label class=\"text\" [id]=\"_labelId\" (click)=\"onLabelClick()\">{{ label }}</label>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block;position:relative;margin-bottom:16px}:host-context(kirby-item){margin-bottom:0}.texts{display:flex;justify-content:space-between;padding:2px 16px 0}.texts .message{flex:75%}.texts .message:only-child{flex-basis:auto}.texts .counter{flex:25%;text-align:right}label{display:block}.text{display:block;font-size:14px;font-weight:300;line-height:20px;margin-bottom:8px;padding:0 16px}.affix-container{position:relative}.affix-container .vertical-align{display:flex;align-items:center;position:absolute;top:0;bottom:0}.affix-container .prefix{left:12px}.affix-container .suffix{right:12px}.affix-container .semi-dark-text ::ng-deep>span,.affix-container .semi-dark-text ::ng-deep>h1,.affix-container .semi-dark-text ::ng-deep>h2,.affix-container .semi-dark-text ::ng-deep>h3,.affix-container .semi-dark-text ::ng-deep>h4,.affix-container .semi-dark-text ::ng-deep>h5,.affix-container .semi-dark-text ::ng-deep>h6,.affix-container .semi-dark-text ::ng-deep>p,.affix-container .semi-dark-text ::ng-deep>data{color:var(--kirby-text-color-semi-dark)}.affix-container:has(input[type=date]){--date-input-background-color: var(--kirby-inputs-background-color)}@media (hover: hover){.affix-container:has(input[type=date]):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;--date-input-background-color: #e0e0e0}}.affix-container:has(input[type=date]):active,.affix-container:has(input[type=date]).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);--date-input-background-color: #cbcbcb}.affix-container:has(input[type=date]) .suffix:not(:empty){top:8px;bottom:8px;padding-inline-start:12px;pointer-events:none;background-color:var(--date-input-background-color);transition:all 80ms linear 0ms;transition-property:background-color}\n"] }]
490
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.PlatformService }, { type: i0.Renderer2 }, { type: i2.WindowRef }, { type: i3.ResizeObserverService }], propDecorators: { label: [{
556
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'kirby-form-field', standalone: false, template: "<label *ngIf=\"_wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"labelTextTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"slottedInputTemplate\"></ng-container>\n\n <!-- add error message inside label if nested interative is in error state -->\n <ng-container *ngIf=\"_nestedInteractiveHasError\">\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n </ng-container>\n</label>\n\n<!-- add message outside label if nested interative is in valid state -->\n<ng-container *ngIf=\"!_nestedInteractiveHasError && _wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!_wrapContentInLabel\">\n <ng-container *ngTemplateOutlet=\"labelTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"slottedInputTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n</ng-container>\n\n<ng-template #messageTemplate>\n <div *ngIf=\"message !== undefined || counter\" class=\"texts\">\n <kirby-form-field-message\n *ngIf=\"message !== undefined\"\n class=\"message\"\n [text]=\"message\"\n [attr.aria-live]=\"_nestedInteractiveHasError ? 'polite' : null\"\n [attr.id]=\"_nestedInteractiveHasError ? _errorMessageId : _messageId\"\n ></kirby-form-field-message>\n\n <div *ngIf=\"counter\" class=\"counter\" aria-hidden=\"true\">\n <ng-content select=\"kirby-input-counter\"></ng-content>\n </div>\n </div>\n</ng-template>\n\n<ng-template #slottedInputTemplate>\n <div class=\"affix-container\">\n <div class=\"prefix vertical-align semi-dark-text\">\n <ng-content select=\"[kirby-affix='prefix']\"></ng-content>\n </div>\n <ng-content select=\"input[kirby-input]\"></ng-content>\n <ng-content select=\"textarea[kirby-textarea]\"></ng-content>\n <ng-content select=\"kirby-radio-group\"></ng-content>\n <div class=\"suffix vertical-align semi-dark-text\">\n <ng-content select=\"[kirby-affix='suffix']\"></ng-content>\n <ng-container *ngIf=\"showDefaultCalendarIcon\">\n <kirby-icon name=\"calendar\"></kirby-icon>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #labelTextTemplate>\n <ng-container *ngIf=\"label\">\n <span class=\"text\">{{ label }}</span>\n </ng-container>\n</ng-template>\n\n<ng-template #labelTemplate>\n <ng-container *ngIf=\"label\">\n <label class=\"text\" [id]=\"_labelId\" (click)=\"onLabelClick()\">{{ label }}</label>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block;position:relative;margin-bottom:16px}:host-context(kirby-item){margin-bottom:0}.texts{display:flex;justify-content:space-between;padding:2px 16px 0}.texts .message{flex:75%}.texts .message:only-child{flex-basis:auto}.texts .counter{flex:25%;text-align:right}label{display:block}.text{display:block;font-size:14px;font-weight:300;line-height:20px;margin-bottom:8px;padding:0 16px}.affix-container{position:relative}.affix-container .vertical-align{display:flex;align-items:center;position:absolute;top:0;bottom:0}.affix-container .prefix{left:12px}.affix-container .suffix{right:12px}.affix-container .semi-dark-text ::ng-deep>span,.affix-container .semi-dark-text ::ng-deep>h1,.affix-container .semi-dark-text ::ng-deep>h2,.affix-container .semi-dark-text ::ng-deep>h3,.affix-container .semi-dark-text ::ng-deep>h4,.affix-container .semi-dark-text ::ng-deep>h5,.affix-container .semi-dark-text ::ng-deep>h6,.affix-container .semi-dark-text ::ng-deep>p,.affix-container .semi-dark-text ::ng-deep>data{color:var(--kirby-text-color-semi-dark)}.affix-container:has(input[type=date]){--date-input-background-color: var(--kirby-inputs-background-color)}@media (hover: hover){.affix-container:has(input[type=date]):hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;--date-input-background-color: #e0e0e0}}.affix-container:has(input[type=date]):active,.affix-container:has(input[type=date]).interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);--date-input-background-color: #cbcbcb}.affix-container:has(input[type=date]) .suffix:not(:empty){top:8px;bottom:8px;padding-inline-start:12px;pointer-events:none;background-color:var(--date-input-background-color);transition:all 80ms linear 0ms;transition-property:background-color}\n"] }]
557
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.PlatformService }, { type: i0.Renderer2 }, { type: i2.WindowRef }, { type: i3.ResizeObserverService }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
491
558
  type: Input
492
559
  }], message: [{
493
560
  type: Input
@@ -500,6 +567,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
500
567
  }], radioGroupComponent: [{
501
568
  type: ContentChild,
502
569
  args: [RadioGroupComponent]
570
+ }], inputComponent: [{
571
+ type: ContentChild,
572
+ args: [InputComponent]
573
+ }], textareaComponent: [{
574
+ type: ContentChild,
575
+ args: [TextareaComponent]
503
576
  }], radioGroupElement: [{
504
577
  type: ContentChild,
505
578
  args: [RadioGroupComponent, { read: ElementRef }]
@@ -598,8 +671,8 @@ class DecimalMaskDirective {
598
671
  maxlengthValue = -Math.abs(maxlengthValue);
599
672
  return this.min === undefined ? maxlengthValue : -Math.abs(Math.max(this.min, maxlengthValue));
600
673
  }
601
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: DecimalMaskDirective, deps: [{ token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Directive }); }
602
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.1.4", type: DecimalMaskDirective, isStandalone: true, selector: "[kirby-decimal-mask]", inputs: { min: "min", max: "max", precision: "precision", setMaxOnOverflow: "setMaxOnOverflow", alignment: "alignment", allowMinus: "allowMinus", disableGroupSeperator: "disableGroupSeperator", maxlength: "maxlength" }, providers: [
674
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DecimalMaskDirective, deps: [{ token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Directive }); }
675
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.5", type: DecimalMaskDirective, isStandalone: true, selector: "[kirby-decimal-mask]", inputs: { min: "min", max: "max", precision: "precision", setMaxOnOverflow: "setMaxOnOverflow", alignment: "alignment", allowMinus: "allowMinus", disableGroupSeperator: "disableGroupSeperator", maxlength: "maxlength" }, providers: [
603
676
  {
604
677
  provide: NG_VALUE_ACCESSOR,
605
678
  multi: true,
@@ -607,7 +680,7 @@ class DecimalMaskDirective {
607
680
  },
608
681
  ], ngImport: i0 }); }
609
682
  }
610
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: DecimalMaskDirective, decorators: [{
683
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DecimalMaskDirective, decorators: [{
611
684
  type: Directive,
612
685
  args: [{
613
686
  standalone: true,
@@ -644,11 +717,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
644
717
 
645
718
  const declarations = [FormFieldComponent, FormFieldMessageComponent, InputCounterComponent];
646
719
  class FormFieldModule {
647
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FormFieldModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
648
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.4", ngImport: i0, type: FormFieldModule, declarations: [FormFieldComponent, FormFieldMessageComponent, InputCounterComponent], imports: [CommonModule, DecimalMaskDirective, IconModule, AffixDirective], exports: [FormFieldComponent, FormFieldMessageComponent, InputCounterComponent, DecimalMaskDirective, AffixDirective] }); }
649
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FormFieldModule, imports: [CommonModule, IconModule] }); }
720
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: FormFieldModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
721
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.5", ngImport: i0, type: FormFieldModule, declarations: [FormFieldComponent, FormFieldMessageComponent, InputCounterComponent], imports: [CommonModule, DecimalMaskDirective, IconModule, AffixDirective], exports: [FormFieldComponent, FormFieldMessageComponent, InputCounterComponent, DecimalMaskDirective, AffixDirective] }); }
722
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: FormFieldModule, imports: [CommonModule, IconModule] }); }
650
723
  }
651
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FormFieldModule, decorators: [{
724
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: FormFieldModule, decorators: [{
652
725
  type: NgModule,
653
726
  args: [{
654
727
  imports: [CommonModule, DecimalMaskDirective, IconModule, AffixDirective],