ng-hub-ui-forms 22.28.0 → 22.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-hub-ui-forms",
3
- "version": "22.28.0",
3
+ "version": "22.30.0",
4
4
  "license": "MIT",
5
5
  "description": "Accessible, signal-based form fields for Angular (input, textarea, slider, segmented, select, datepicker, file input with drag & drop and upload progress) with automatic error display for controls, FormGroups and FormArrays. Reactive Forms today, Signal Forms ready. Part of the ng-hub-ui family.",
6
6
  "author": "Carlos Morcillo <carlos.morcillo@me.com> (https://www.carlosmorcillo.com)",
@@ -8,7 +8,7 @@
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/carlos-morcillo/ng-hub-ui-forms.git"
10
10
  },
11
- "homepage": "https://hubui.dev/",
11
+ "homepage": "https://hubui.dev/en/forms/overview/",
12
12
  "keywords": [
13
13
  "angular",
14
14
  "forms",
@@ -236,3 +236,72 @@ hub-timepicker {
236
236
  border-color: var(--hub-form-invalid-border-color);
237
237
  }
238
238
  }
239
+
240
+ /**
241
+ * Plain-text fields: the value with no field around it.
242
+ *
243
+ * The other half of read-only, and the difference is who the field is for.
244
+ * `--readonly` still belongs to somebody filling a form in — it keeps the box so the
245
+ * field holds its place in the row and looks like the editable ones beside it, only
246
+ * shut. `--plaintext` is for the value that is simply being *shown*: a record open for
247
+ * consultation, a figure the server settled, a field a plan has locked. There the box
248
+ * is noise, and a screen full of them reads as a form that refuses to work.
249
+ *
250
+ * Modelled on Bootstrap's `.form-control-plaintext`, deliberately: it is the shape
251
+ * every reader already knows, and it solves the hard part — the control stays a real
252
+ * `<input>`/`<textarea>`, so the `<label for>` still points at something labelable and
253
+ * the text stays selectable. A `<span>` would have broken both.
254
+ *
255
+ * The horizontal padding goes and the border turns transparent **without losing its
256
+ * width**. That is the whole trick: the text lands on the same baseline as an editable
257
+ * neighbour in the same grid, so a form mixing the two does not stagger.
258
+ */
259
+ .hub-field--plaintext {
260
+ .hub-field__control,
261
+ .hub-input__control,
262
+ .hub-textarea__control,
263
+ .hub-select__control {
264
+ padding-inline: 0;
265
+ padding-block: var(--hub-input-plaintext-padding-block);
266
+ font-weight: var(--hub-input-plaintext-font-weight);
267
+ color: var(--hub-input-plaintext-color);
268
+ background-color: transparent;
269
+ border-color: transparent;
270
+ border-width: var(--hub-input-border-width) 0;
271
+ box-shadow: none;
272
+ cursor: text;
273
+ }
274
+
275
+ // Nothing here answers to being focused, but the control still takes focus — it is
276
+ // still an input, and taking it away would strand keyboard users mid-form.
277
+ .hub-field__control:focus,
278
+ .hub-field__control:focus-visible,
279
+ .hub-input__control:focus,
280
+ .hub-textarea__control:focus,
281
+ .hub-select__control.ng-select-focused {
282
+ border-color: transparent;
283
+ box-shadow: none;
284
+ outline: none;
285
+ }
286
+
287
+ // A textarea shown as plain text is a paragraph, not a box you can drag open.
288
+ .hub-textarea__control {
289
+ resize: none;
290
+ }
291
+
292
+ // Every affordance promises a choice that is not on offer here.
293
+ .hub-select__control {
294
+ .ng-arrow-wrapper,
295
+ .ng-clear-wrapper {
296
+ display: none;
297
+ }
298
+ }
299
+
300
+ .hub-datepicker__icon {
301
+ display: none;
302
+ }
303
+
304
+ // Unlike read-only, no exception for the invalid border: a field with no box is not
305
+ // being filled in, so there is no input to reject. If the value is wrong, that is
306
+ // the record's problem and not this screen's.
307
+ }
@@ -106,6 +106,26 @@
106
106
  --hub-input-readonly-border-color: transparent;
107
107
  --hub-input-readonly-color: var(--hub-input-color);
108
108
  --hub-input-readonly-cursor: default;
109
+
110
+ // Plain-text fields. The label is left exactly as every other field's - same tokens, same
111
+ // weight - because a form's labels have to keep one rhythm whatever state each field is
112
+ // in. It is the value that steps back a shade: measured, label and value came out the
113
+ // same colour, and inside a box that is fine because the box separates them. With no box
114
+ // the value carries the signal on its own, and a touch lighter says "this is not being
115
+ // edited" without breaking the column.
116
+ --hub-input-plaintext-color: var(--hub-ref-color-gray-700, #495057);
117
+
118
+ // The block padding a plain-text control keeps: none above, the field's whole vertical
119
+ // padding below. Two things at once, and neither is negotiable on its own. Nothing above
120
+ // puts the value right under its label, because a label and its value are one thing and
121
+ // should read as a pair. Twice the padding below keeps the total height exactly an
122
+ // editable field's, so a grid mixing the two still lines up - by construction rather than
123
+ // by a number that would drift the moment `--hub-input-padding-y` moved.
124
+ --hub-input-plaintext-padding-block: 0 calc(var(--hub-input-padding-y) * 2);
125
+
126
+ // A shade lighter than an editable value, and a step lighter in weight. A value nobody is
127
+ // typing is being read, not filled, and it should not shout over its own label.
128
+ --hub-input-plaintext-font-weight: 300;
109
129
  --hub-input-transition: var(--hub-form-transition);
110
130
  --hub-input-wrapper-gap: var(--hub-ref-space-2, 0.5rem);
111
131
 
@@ -796,6 +796,19 @@ declare class HubInputComponent extends HubFieldControl {
796
796
  readonly step: _angular_core.InputSignalWithTransform<number, unknown>;
797
797
  /** Whether the input is read-only. */
798
798
  readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
799
+ /**
800
+ * Render the value as plain text, with no field styling around it.
801
+ *
802
+ * For the value that belongs in a form but is not the reader's to change: a figure
803
+ * the server settled, a field a plan has locked, the whole of a record shown for
804
+ * consultation. It stays a real `<input>` — so the label keeps pointing at a control
805
+ * and the text stays selectable — and only loses the box, which on something that
806
+ * refuses input was a promise it could not keep.
807
+ *
808
+ * Implies `readonly`: a field with no box that still accepted typing would be an
809
+ * invisible input.
810
+ */
811
+ readonly plaintext: _angular_core.InputSignalWithTransform<boolean, unknown>;
799
812
  /** Helper text shown below the control. */
800
813
  readonly formText: _angular_core.InputSignal<string>;
801
814
  /** Helper text placement. Only `bottom` is supported. */
@@ -834,6 +847,13 @@ declare class HubInputComponent extends HubFieldControl {
834
847
  readonly indeterminate: _angular_core.ModelSignal<boolean>;
835
848
  /** Mixed state as the native checkbox should actually receive it. */
836
849
  protected readonly isIndeterminate: _angular_core.Signal<boolean>;
850
+ /**
851
+ * Read-only as the control actually behaves, which is what the template binds to.
852
+ *
853
+ * `plaintext` implies it, so the two never have to be passed together and cannot be
854
+ * passed in disagreement.
855
+ */
856
+ protected readonly _isReadonly: _angular_core.Signal<boolean>;
837
857
  /** Whether the internal clear button should be shown right now. */
838
858
  protected readonly showClear: _angular_core.Signal<boolean>;
839
859
  /** Whether an inline-start affix (projected prefix) is present. */
@@ -943,7 +963,7 @@ declare class HubInputComponent extends HubFieldControl {
943
963
  /** Clears the selected file(s). */
944
964
  protected clearFile(): void;
945
965
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HubInputComponent, never>;
946
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HubInputComponent, "hub-input", never, { "passwordRevealed": { "alias": "passwordRevealed"; "required": false; "isSignal": true; }; "passwordToggle": { "alias": "passwordToggle"; "required": false; "isSignal": true; }; "hideOnBlur": { "alias": "hideOnBlur"; "required": false; "isSignal": true; }; "capsLockWarning": { "alias": "capsLockWarning"; "required": false; "isSignal": true; }; "passwordStrength": { "alias": "passwordStrength"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelType": { "alias": "labelType"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "formText": { "alias": "formText"; "required": false; "isSignal": true; }; "formTextType": { "alias": "formTextType"; "required": false; "isSignal": true; }; "prepend": { "alias": "prepend"; "required": false; "isSignal": true; }; "append": { "alias": "append"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "classlist": { "alias": "classlist"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "unmaskValue": { "alias": "unmaskValue"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "buttonLabel": { "alias": "buttonLabel"; "required": false; "isSignal": true; }; }, { "passwordRevealed": "passwordRevealedChange"; "labelType": "labelTypeChange"; "placeholder": "placeholderChange"; "min": "minChange"; "max": "maxChange"; "indeterminate": "indeterminateChange"; "valueChange": "valueChange"; "enter": "enter"; "search": "search"; }, ["prefixDir", "suffixDir", "_prependTpl", "_appendTpl"], ["[hubInputPrefix]", "[hubInputSuffix]"], true, never>;
966
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HubInputComponent, "hub-input", never, { "passwordRevealed": { "alias": "passwordRevealed"; "required": false; "isSignal": true; }; "passwordToggle": { "alias": "passwordToggle"; "required": false; "isSignal": true; }; "hideOnBlur": { "alias": "hideOnBlur"; "required": false; "isSignal": true; }; "capsLockWarning": { "alias": "capsLockWarning"; "required": false; "isSignal": true; }; "passwordStrength": { "alias": "passwordStrength"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelType": { "alias": "labelType"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "plaintext": { "alias": "plaintext"; "required": false; "isSignal": true; }; "formText": { "alias": "formText"; "required": false; "isSignal": true; }; "formTextType": { "alias": "formTextType"; "required": false; "isSignal": true; }; "prepend": { "alias": "prepend"; "required": false; "isSignal": true; }; "append": { "alias": "append"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "classlist": { "alias": "classlist"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "unmaskValue": { "alias": "unmaskValue"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "buttonLabel": { "alias": "buttonLabel"; "required": false; "isSignal": true; }; }, { "passwordRevealed": "passwordRevealedChange"; "labelType": "labelTypeChange"; "placeholder": "placeholderChange"; "min": "minChange"; "max": "maxChange"; "indeterminate": "indeterminateChange"; "valueChange": "valueChange"; "enter": "enter"; "search": "search"; }, ["prefixDir", "suffixDir", "_prependTpl", "_appendTpl"], ["[hubInputPrefix]", "[hubInputSuffix]"], true, never>;
947
967
  }
948
968
 
949
969
  /** Character set accepted by the OTP field. */
@@ -1061,6 +1081,15 @@ declare class HubTextareaComponent extends HubFieldControl {
1061
1081
  readonly counter: _angular_core.InputSignalWithTransform<boolean, unknown>;
1062
1082
  /** Whether the textarea is read-only. */
1063
1083
  readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1084
+ /**
1085
+ * Render the value as plain text, with no field styling around it.
1086
+ *
1087
+ * The multi-line half of the same idea `HubInputComponent.plaintext` carries: a value
1088
+ * that belongs in the form but is not the reader's to change. It stays a real
1089
+ * `<textarea>`, so the label keeps pointing at a control and the text stays
1090
+ * selectable, and it only loses the box. Implies `readonly`.
1091
+ */
1092
+ readonly plaintext: _angular_core.InputSignalWithTransform<boolean, unknown>;
1064
1093
  /** Helper text shown below the control. */
1065
1094
  readonly formText: _angular_core.InputSignal<string>;
1066
1095
  /** Helper text placement. Only `bottom` is supported in the MVP. */
@@ -1079,7 +1108,7 @@ declare class HubTextareaComponent extends HubFieldControl {
1079
1108
  */
1080
1109
  setValue(value: string): void;
1081
1110
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HubTextareaComponent, never>;
1082
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HubTextareaComponent, "hub-textarea", never, { "prepend": { "alias": "prepend"; "required": false; "isSignal": true; }; "append": { "alias": "append"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelType": { "alias": "labelType"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "cols": { "alias": "cols"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "autoresize": { "alias": "autoresize"; "required": false; "isSignal": true; }; "counter": { "alias": "counter"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "formText": { "alias": "formText"; "required": false; "isSignal": true; }; "formTextType": { "alias": "formTextType"; "required": false; "isSignal": true; }; "classlist": { "alias": "classlist"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, ["_prependTpl", "_appendTpl"], never, true, never>;
1111
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HubTextareaComponent, "hub-textarea", never, { "prepend": { "alias": "prepend"; "required": false; "isSignal": true; }; "append": { "alias": "append"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelType": { "alias": "labelType"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "cols": { "alias": "cols"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "autoresize": { "alias": "autoresize"; "required": false; "isSignal": true; }; "counter": { "alias": "counter"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "plaintext": { "alias": "plaintext"; "required": false; "isSignal": true; }; "formText": { "alias": "formText"; "required": false; "isSignal": true; }; "formTextType": { "alias": "formTextType"; "required": false; "isSignal": true; }; "classlist": { "alias": "classlist"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, ["_prependTpl", "_appendTpl"], never, true, never>;
1083
1112
  }
1084
1113
 
1085
1114
  /** Value of `<hub-slider>`: a number in single mode, a `[lower, upper]` tuple in range mode. */
@@ -1845,6 +1874,18 @@ declare class HubDatepickerComponent extends HubFieldControl {
1845
1874
  readonly firstDayOfWeek: _angular_core.InputSignalWithTransform<number | undefined, unknown>;
1846
1875
  /** Weekday header width. Falls back to the global config. */
1847
1876
  readonly weekdayFormat: _angular_core.InputSignal<"short" | "narrow" | "long" | undefined>;
1877
+ /**
1878
+ * How the month is written in the panel's header.
1879
+ *
1880
+ * `short` by default, and that default is what keeps the panel still: the panel is as
1881
+ * wide as its widest child, and with the month spelled out that child was the header —
1882
+ * so the calendar grew and shrank as you paged through the year while the day grid it
1883
+ * frames never moved. Measured in Spanish at 1rem: «Septiembre de 2026» needs 152px
1884
+ * against the 104px the header has left over once the two nav groups have taken theirs,
1885
+ * so nothing but an abbreviation fits. Ask for `long` where the panel has room and the
1886
+ * spelled-out month is worth the movement.
1887
+ */
1888
+ readonly monthFormat: _angular_core.InputSignal<"short" | "long">;
1848
1889
  /**
1849
1890
  * How the selected value is displayed in the input. Accepts `Intl` options (the original
1850
1891
  * contract), an Angular date pattern such as `'dd/MM/yyyy HH:mm'`, or a formatting function.
@@ -2054,7 +2095,7 @@ declare class HubDatepickerComponent extends HubFieldControl {
2054
2095
  /** Moves the period grid's focus without selecting. */
2055
2096
  protected onPeriodFocusMove(date: Date): void;
2056
2097
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HubDatepickerComponent, never>;
2057
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HubDatepickerComponent, "hub-datepicker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "granularity": { "alias": "granularity"; "required": false; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelType": { "alias": "labelType"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "weekdayFormat": { "alias": "weekdayFormat"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "timeDisplayFormat": { "alias": "timeDisplayFormat"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "secondStep": { "alias": "secondStep"; "required": false; "isSignal": true; }; "hourFormat": { "alias": "hourFormat"; "required": false; "isSignal": true; }; "rangeSeparator": { "alias": "rangeSeparator"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabledDates": { "alias": "disabledDates"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "showToday": { "alias": "showToday"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "formText": { "alias": "formText"; "required": false; "isSignal": true; }; "formTextType": { "alias": "formTextType"; "required": false; "isSignal": true; }; "classlist": { "alias": "classlist"; "required": false; "isSignal": true; }; "prepend": { "alias": "prepend"; "required": false; "isSignal": true; }; "append": { "alias": "append"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "opened": "opened"; "closed": "closed"; "viewChange": "viewChange"; "cleared": "cleared"; }, ["_prependTpl", "_appendTpl"], never, true, never>;
2098
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HubDatepickerComponent, "hub-datepicker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "granularity": { "alias": "granularity"; "required": false; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelType": { "alias": "labelType"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "weekdayFormat": { "alias": "weekdayFormat"; "required": false; "isSignal": true; }; "monthFormat": { "alias": "monthFormat"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "timeDisplayFormat": { "alias": "timeDisplayFormat"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "secondStep": { "alias": "secondStep"; "required": false; "isSignal": true; }; "hourFormat": { "alias": "hourFormat"; "required": false; "isSignal": true; }; "rangeSeparator": { "alias": "rangeSeparator"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabledDates": { "alias": "disabledDates"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "showToday": { "alias": "showToday"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "formText": { "alias": "formText"; "required": false; "isSignal": true; }; "formTextType": { "alias": "formTextType"; "required": false; "isSignal": true; }; "classlist": { "alias": "classlist"; "required": false; "isSignal": true; }; "prepend": { "alias": "prepend"; "required": false; "isSignal": true; }; "append": { "alias": "append"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "opened": "opened"; "closed": "closed"; "viewChange": "viewChange"; "cleared": "cleared"; }, ["_prependTpl", "_appendTpl"], never, true, never>;
2058
2099
  }
2059
2100
 
2060
2101
  /**