@yamato-daiwa/frontend-vue 0.1.0 → 0.3.0-alpha.1

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.

Potentially problematic release.


This version of @yamato-daiwa/frontend-vue might be problematic. Click here for more details.

Files changed (70) hide show
  1. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  2. package/.idea/inspectionProfiles/Project_Default.xml +0 -1
  3. package/README.md +13 -2
  4. package/Source/Functions/getElementByVueReference.ts +105 -8
  5. package/Source/GUI_Components/AdmonitionBlock/AdmonitionBlock.vue +67 -0
  6. package/Source/GUI_Components/AdmonitionBlock/AdmonitionBlock.vue.d.ts +48 -0
  7. package/Source/GUI_Components/AdmonitionBlock/{AdmonitionBlock.vue.ts → AdmonitionBlockLogic.vue.ts} +88 -64
  8. package/Source/GUI_Components/Badge/Badge.vue.ts +103 -68
  9. package/Source/GUI_Components/Badge/LoadingPlaceholder/Badge-LoadingPlaceholder.vue.ts +52 -33
  10. package/Source/GUI_Components/Controls/Buttons/Closing/ClosingButton.vue.pug +1 -0
  11. package/Source/GUI_Components/Controls/Buttons/Closing/ClosingButton.vue.ts +224 -0
  12. package/Source/GUI_Components/Controls/Buttons/HamburgerMenu/HamburgerMenuButton-ForInheritance.vue.ts +253 -0
  13. package/Source/GUI_Components/Controls/Buttons/HamburgerMenu/HamburgerMenuButton.vue +24 -0
  14. package/Source/GUI_Components/Controls/Buttons/HamburgerMenu/HamburgerMenuButton.vue.d.ts +45 -0
  15. package/Source/GUI_Components/Controls/Buttons/HamburgerMenu/HamburgerMenuButton.vue.pug +0 -0
  16. package/Source/GUI_Components/Controls/Buttons/Plain/Button.vue.pug +5 -7
  17. package/Source/GUI_Components/Controls/Buttons/Plain/Button.vue.ts +257 -116
  18. package/Source/GUI_Components/Controls/Buttons/Plain/LoadingPlaceholder/Button-LoadingPlaceholder.vue.pug +1 -1
  19. package/Source/GUI_Components/Controls/Buttons/Plain/LoadingPlaceholder/Button-LoadingPlaceholder.vue.ts +42 -33
  20. package/Source/GUI_Components/Controls/ValidatableControlShell/ValidatableControlShell.vue.pug +64 -0
  21. package/Source/GUI_Components/Controls/ValidatableControlShell/ValidatableControlShell.vue.ts +478 -0
  22. package/Source/GUI_Components/Controls/Validatables/InputtableControl.vue.ts +233 -0
  23. package/Source/GUI_Components/Controls/Validatables/TextBox/TextBox.vue.pug +67 -0
  24. package/Source/GUI_Components/Controls/Validatables/TextBox/TextBox.vue.ts +702 -0
  25. package/Source/GUI_Components/Controls/{ValidatableControl.ts → Validatables/ValidatableControl.ts} +64 -55
  26. package/Source/GUI_Components/Controls/Validatables/ValidatableControlsGroup.ts +176 -0
  27. package/Source/GUI_Components/OverflowSafeSingleLineLabel.vue +9 -2
  28. package/Source/GUI_Components/ThemesShowcase.vue +10 -5
  29. package/Source/GUI_Components/YDF_ComponentsCoordinator.ts +317 -0
  30. package/Source/GUI_Components/_Decorators/AccessibleFromTemplateAsNonReactive.ts +67 -0
  31. package/Source/GUI_Components/_Decorators/NonReactiveVueData.ts +26 -0
  32. package/Source/GUI_Components/_Decorators/preventNullForOptionalVueProperty.ts +64 -0
  33. package/Source/GUI_Components/_Errors/ForbiddenNullValueOfOptionalVueProperty/ForbiddenNullValueOfOptionalVuePropertyError.ts +47 -0
  34. package/Source/GUI_Components/_Errors/ForbiddenNullValueOfOptionalVueProperty/ForbiddenNullValueOfOptionalVuePropertyErrorLocalization.english.ts +24 -0
  35. package/Source/GUI_Components/_Errors/InvalidVueProperty/InvalidVuePropertyError.ts +43 -0
  36. package/Source/GUI_Components/_Errors/InvalidVueProperty/InvalidVuePropertyErrorLocalization.english.ts +16 -0
  37. package/Source/GUI_Components/_VuePropertiesValidators/BooleanVuePropertyValidator.ts +25 -0
  38. package/Source/GUI_Components/_VuePropertiesValidators/DecorativeModifiersVuePropertyValidator.ts +22 -0
  39. package/Source/GUI_Components/_VuePropertiesValidators/DecorativeVariationVuePropertyValidator.ts +23 -0
  40. package/Source/GUI_Components/_VuePropertiesValidators/ElementOfEnumerationVuePropertyValidator.ts +29 -0
  41. package/Source/GUI_Components/_VuePropertiesValidators/GeometricModifiersVuePropertyValidator.ts +22 -0
  42. package/Source/GUI_Components/_VuePropertiesValidators/GeometricVariationVuePropertyValidator.ts +23 -0
  43. package/Source/GUI_Components/_VuePropertiesValidators/NaturalNumberOrZeroVuePropertyValidator.ts +25 -0
  44. package/Source/GUI_Components/_VuePropertiesValidators/NonEmptyStringVuePropertyValidator.ts +25 -0
  45. package/Source/GUI_Components/_VuePropertiesValidators/ThemeVuePropertyValidator.ts +23 -0
  46. package/Source/GUI_Components/_VuePropertiesValidators/VuePropertyValidator.ts +51 -0
  47. package/Source/index.ts +28 -5
  48. package/Workbenches/Source/Decorators/Decorators.workbench.pug +20 -0
  49. package/Workbenches/Source/Decorators/Decorators.workbench.ts +5 -0
  50. package/Workbenches/Source/Decorators/DecoratorsWorkbench.vue +69 -0
  51. package/Workbenches/Source/GUI_Components/AdmonitionBlock/AdmonitionBlockComponentTestSite.vue +24 -2
  52. package/Workbenches/Source/GUI_Components/Badge/BadgeBlockComponentTestSite.vue +24 -2
  53. package/Workbenches/Source/GUI_Components/Controls/Buttons/Plain/Button.workbench.pug +20 -0
  54. package/Workbenches/Source/GUI_Components/Controls/Buttons/Plain/Button.workbench.ts +5 -0
  55. package/Workbenches/Source/GUI_Components/Controls/Buttons/Plain/ButtonComponentTestSite.vue +60 -0
  56. package/Workbenches/Source/GUI_Components/Controls/Validatable/TextBox/TextBox.workbench.pug +20 -0
  57. package/Workbenches/Source/GUI_Components/Controls/Validatable/TextBox/TextBox.workbench.ts +5 -0
  58. package/Workbenches/Source/GUI_Components/Controls/Validatable/TextBox/TextBoxWorkbench.vue +86 -0
  59. package/Workbenches/Source/GUI_Components/Controls/ValidatableControlShell/ValidatableControlShell.workbench.pug +20 -0
  60. package/Workbenches/Source/GUI_Components/Controls/ValidatableControlShell/ValidatableControlShell.workbench.ts +5 -0
  61. package/Workbenches/Source/GUI_Components/Controls/ValidatableControlShell/ValidatableControlShellTestSite.vue +68 -0
  62. package/Workbenches/Source/GUI_Components/OverflowSafeSingleLineLabel/OverflowSafeSingleLineLabelComponentTestSite.vue +9 -2
  63. package/Workbenches/Source/Workbenches.pug +62 -0
  64. package/eslint.config.js +15 -0
  65. package/package.json +40 -48
  66. package/tsconfig.json +0 -3
  67. package/yda.config.yaml +65 -65
  68. package/Source/GUI_Components/AdmonitionBlock/AdmonitionBlock.vue.pug +0 -43
  69. package/Source/GUI_Components/ComponentsAuxiliaries.ts +0 -124
  70. package/Source/GUI_Components/Controls/InputtableControl.ts +0 -97
@@ -0,0 +1,233 @@
1
+ /* ─── Validations ─────────────────────────────────────────────────────────────────────────────────────── */
2
+ import type VuePropertyValidator from "../../_VuePropertiesValidators/VuePropertyValidator";
3
+ import BooleanVuePropertyValidator from "../../_VuePropertiesValidators/BooleanVuePropertyValidator";
4
+ import NonEmptyStringVuePropertyValidator from "../../_VuePropertiesValidators/NonEmptyStringVuePropertyValidator";
5
+ import InvalidVuePropertiesCombinationError from
6
+ "../../_Errors/InvalidVuePropertiesCombination/InvalidVuePropertiesCombinationError";
7
+ import preventNullForOptionalVueProperty from "../../_Decorators/preventNullForOptionalVueProperty";
8
+ import { type ValidatableControl } from "@yamato-daiwa/frontend";
9
+
10
+ /* ─── Framework ──────────────────────────────────────────────────────────────────────────────────────────────────── */
11
+ import {
12
+ ComponentBase as VueComponentConfiguration,
13
+ Vue as VueComponent,
14
+ Prop as VueProperty
15
+ } from "vue-facing-decorator";
16
+
17
+ /* ─── Utils ──────────────────────────────────────────────────────────────────────────────────────────────────────── */
18
+ import { Logger, isEitherUndefinedOrNull } from "@yamato-daiwa/es-extensions";
19
+
20
+
21
+ @VueComponentConfiguration({})
22
+ export default abstract class InputtableControl extends VueComponent {
23
+
24
+ /* ━━━ Component Common Properties ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
25
+ /* ┅┅┅ Textings ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ */
26
+ @VueProperty({
27
+ required: false,
28
+ get validator(): VuePropertyValidator {
29
+ return NonEmptyStringVuePropertyValidator({
30
+ isPropertyRequired: this.required === true,
31
+ propertyName: "label",
32
+ componentName: "(Inheritor of InputtableControl)"
33
+ });
34
+ }
35
+ })
36
+ @preventNullForOptionalVueProperty
37
+ protected readonly label?: string;
38
+
39
+ @VueProperty({
40
+ required: false,
41
+ get validator(): VuePropertyValidator {
42
+ return NonEmptyStringVuePropertyValidator({
43
+ isPropertyRequired: this.required === true,
44
+ propertyName: "accessibilityGuidance",
45
+ componentName: "(Inheritor of InputtableControl)"
46
+ });
47
+ }
48
+ })
49
+ @preventNullForOptionalVueProperty
50
+ protected readonly accessibilityGuidance?: string;
51
+
52
+ @VueProperty({
53
+ required: false,
54
+ get validator(): VuePropertyValidator {
55
+ return NonEmptyStringVuePropertyValidator({
56
+ isPropertyRequired: this.required === true,
57
+ propertyName: "externalLabelHTML_ID",
58
+ componentName: "(Inheritor of InputtableControl)"
59
+ });
60
+ }
61
+ })
62
+ @preventNullForOptionalVueProperty
63
+ protected readonly externalLabelHTML_ID?: string;
64
+
65
+ @VueProperty({
66
+ required: false,
67
+ get validator(): VuePropertyValidator {
68
+ return NonEmptyStringVuePropertyValidator({
69
+ isPropertyRequired: this.required === true,
70
+ propertyName: "guidance",
71
+ componentName: "(Inheritor of InputtableControl)"
72
+ });
73
+ }
74
+ })
75
+ @preventNullForOptionalVueProperty
76
+ protected readonly guidance?: string;
77
+
78
+
79
+ /* ┅┅┅ Requirement ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ */
80
+ @VueProperty({
81
+ default: false,
82
+ get validator(): VuePropertyValidator {
83
+ return BooleanVuePropertyValidator({
84
+ propertyName: "required",
85
+ componentName: "(Inheritor of InputtableControl)",
86
+ isPropertyRequired: this.required === true
87
+ });
88
+ }
89
+ })
90
+ @preventNullForOptionalVueProperty
91
+ protected readonly required!: boolean;
92
+
93
+ @VueProperty({
94
+ default: false,
95
+ get validator(): VuePropertyValidator {
96
+ return BooleanVuePropertyValidator({
97
+ propertyName: "mustDisplayAppropriateBadgeIfInputIsRequired",
98
+ componentName: "(Inheritor of InputtableControl)",
99
+ isPropertyRequired: this.required === true
100
+ });
101
+ }
102
+ })
103
+ @preventNullForOptionalVueProperty
104
+ protected readonly mustDisplayAppropriateBadgeIfInputIsRequired!: boolean;
105
+
106
+ @VueProperty({
107
+ default: false,
108
+ get validator(): VuePropertyValidator {
109
+ return BooleanVuePropertyValidator({
110
+ propertyName: "mustDisplayAppropriateBadgeIfInputIsOptional",
111
+ componentName: "(Inheritor of InputtableControl)",
112
+ isPropertyRequired: this.required === true
113
+ });
114
+ }
115
+ })
116
+ @preventNullForOptionalVueProperty
117
+ protected readonly mustDisplayAppropriateBadgeIfInputIsOptional!: boolean;
118
+
119
+ @VueProperty({
120
+ default: false,
121
+ get validator(): VuePropertyValidator {
122
+ return BooleanVuePropertyValidator({
123
+ propertyName: "mustAddInvisibleBadgeForHeightEqualizingWhenNoBadge",
124
+ componentName: "(Inheritor of InputtableControl)",
125
+ isPropertyRequired: this.required === true
126
+ });
127
+ }
128
+ })
129
+ @preventNullForOptionalVueProperty
130
+ protected readonly mustAddInvisibleBadgeForHeightEqualizingWhenNoBadge!: boolean;
131
+
132
+
133
+ /* ┅┅┅ State Limitations ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ */
134
+ @VueProperty({
135
+ default: false,
136
+ get validator(): VuePropertyValidator {
137
+ return BooleanVuePropertyValidator({
138
+ propertyName: "disabled",
139
+ componentName: "(Inheritor of InputtableControl)",
140
+ isPropertyRequired: this.required === true
141
+ });
142
+ }
143
+ })
144
+ @preventNullForOptionalVueProperty
145
+ protected readonly disabled!: boolean;
146
+
147
+ @VueProperty({
148
+ default: false,
149
+ get validator(): VuePropertyValidator {
150
+ return BooleanVuePropertyValidator({
151
+ propertyName: "readonly",
152
+ componentName: "(Inheritor of InputtableControl)",
153
+ isPropertyRequired: this.required === true
154
+ });
155
+ }
156
+ })
157
+ @preventNullForOptionalVueProperty
158
+ protected readonly readonly!: boolean;
159
+
160
+
161
+ /* ━━━ State ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
162
+ protected abstract invalidInputHighlightingIfAnyValidationErrorsMessages: boolean;
163
+ protected abstract validInputHighlightingIfNoErrorsMessages: boolean;
164
+
165
+
166
+ /* ━━━ Methods ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
167
+ /* ┅┅┅ Public ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ */
168
+ /* ╍╍╍ Partial Implementations of ValidatableControl Interface ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍ */
169
+ public highlightInvalidInput(): this {
170
+ this.invalidInputHighlightingIfAnyValidationErrorsMessages = true;
171
+ return this;
172
+ }
173
+
174
+ public getRootElementOffsetCoordinates(): ValidatableControl.RootElementOffsetCoordinates {
175
+
176
+ /* [ Specification ]
177
+ * The inputtable control must have a single root element.
178
+ * For YDF components, it is basically ValidatableControlShell. */
179
+ const rootElement: HTMLElement = this.$el;
180
+
181
+ return {
182
+ top: rootElement.offsetTop,
183
+ left: rootElement.offsetLeft
184
+ };
185
+
186
+ }
187
+
188
+ public resetStateToInitial(): void {
189
+ Object.assign(this.$data, this.$options.data?.({}));
190
+ }
191
+
192
+
193
+ /* ╍╍╍ Lifecycle Hooks ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍ */
194
+ protected beforeCreate(): void {
195
+ InputtableControl.validateProperties(this);
196
+ }
197
+
198
+ protected beforeUpdate(): void {
199
+ InputtableControl.validateProperties(this);
200
+ }
201
+
202
+
203
+ /* ┅┅┅ Protected ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ */
204
+ /** @descriptioin
205
+ * Validation with referencing of multiple properties is possible only via lifecycle hooks.
206
+ * This method is static because non-static methods are not accessible from the viewpoint of "vue-facing-decorator" */
207
+ protected static validateProperties(instance: InputtableControl): void {
208
+
209
+ const inheritedComponentNameForLogging: string = instance.$options.name ?? "(Unnamed component)";
210
+
211
+ if (
212
+ isEitherUndefinedOrNull(instance.label) &&
213
+ isEitherUndefinedOrNull(instance.accessibilityGuidance) &&
214
+ isEitherUndefinedOrNull(instance.externalLabelHTML_ID)
215
+ ) {
216
+ Logger.logError({
217
+ errorType: InvalidVuePropertiesCombinationError.NAME,
218
+ title: InvalidVuePropertiesCombinationError.localization.defaultTitle,
219
+ description: InvalidVuePropertiesCombinationError.localization.generateMessage({
220
+ vueComponentName: inheritedComponentNameForLogging,
221
+ messageSpecificPart:
222
+ "From the accessibility requirements, one of next properties must be specified:\n" +
223
+ "● label\n" +
224
+ "● accessibilityGuidance\n" +
225
+ "● externalLabelHTML_ID"
226
+ }),
227
+ occurrenceLocation: `${ inheritedComponentNameForLogging }.beforeCreate()`
228
+ });
229
+ }
230
+
231
+ }
232
+
233
+ }
@@ -0,0 +1,67 @@
1
+ ValidatableControlShell.TextBox--YDF(
2
+
3
+ :label="label"
4
+ :guidance="guidance"
5
+
6
+ :required="required"
7
+ :mustDisplayAppropriateBadgeIfInputIsRequired="mustDisplayAppropriateBadgeIfInputIsRequired"
8
+ :mustDisplayAppropriateBadgeIfInputIsOptional="mustDisplayAppropriateBadgeIfInputIsOptional"
9
+ :mustAddInvisibleBadgeForHeightEqualizingWhenNoBadge="mustAddInvisibleBadgeForHeightEqualizingWhenNoBadge"
10
+
11
+ :validationErrorsMessages="validatablePayload.validationErrorsMessages"
12
+ :invalidInputHighlightingIfAnyValidationErrorsMessages="invalidInputHighlightingIfAnyValidationErrorsMessages"
13
+ :validValueHighlightingIfNoValidationErrorsMessages="validInputHighlightingIfNoErrorsMessages"
14
+
15
+ :coreElementHTML_ID="HTML_IDs.inputOrTextarea"
16
+ :labelElementHTML_ID="HTML_IDs.label"
17
+
18
+ :theme="validatableControlShellTheme"
19
+ :areThemesCSS_ClassesCommon="areThemesCSS_ClassesCommon"
20
+ :geometricVariation="validatableControlGeometricVariation"
21
+ :decorativeVariation="validatableControlDecorativeVariation"
22
+
23
+ :class="rootElementModifierCSS_Classes"
24
+
25
+ )
26
+
27
+ textarea.TextBox--YDF-InputOrTextAreaElement(
28
+ v-if="multiline"
29
+ v-model="rawInput"
30
+ :placeholder="placeholder"
31
+ :autocomplete="autocomplete"
32
+ :readonly="readonly"
33
+ :disabled="disabled"
34
+ :required="required"
35
+ :minlength="minimalCharactersCount"
36
+ :maxlength="maximalCharactersCount"
37
+ :id="HTML_IDs.inputOrTextarea"
38
+ :aria-label="accessibilityGuidance"
39
+ :aria-labelledby="externalLabelHTML_ID"
40
+ :ref="INPUT_OR_TEXT_AREA_ELEMENT_VUE_REFERENCE_ID"
41
+ @keydown="onKeyDown"
42
+ @input="$event => { onInput($event.target.value) }"
43
+ @blur="onFocusOut"
44
+ )
45
+
46
+ //- [ Bundler bug ] The `v-else` is being compiled to `v-else="v-else"`
47
+ input.TextBox--YDF-InputOrTextAreaElement(
48
+ v-else-if="!multiline"
49
+ v-model="rawInput"
50
+ :type="HTML_Type"
51
+ :placeholder="placeholder"
52
+ :autocomplete="autocomplete"
53
+ :readonly="readonly"
54
+ :disabled="disabled"
55
+ :required="required"
56
+ :minlength="minimalCharactersCount"
57
+ :maxlength="maximalCharactersCount"
58
+ :min="minimalNumericValue"
59
+ :max="maximalNumericValue"
60
+ :id="HTML_IDs.inputOrTextarea"
61
+ :aria-label="accessibilityGuidance"
62
+ :aria-labelledby="externalLabelHTML_ID"
63
+ :ref="INPUT_OR_TEXT_AREA_ELEMENT_VUE_REFERENCE_ID"
64
+ @keydown="onKeyDown"
65
+ @input="$event => { onInput($event.target.value) }"
66
+ @blur="onFocusOut"
67
+ )