@everymatrix/general-input 1.10.2 → 1.15.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 (96) hide show
  1. package/dist/cjs/checkbox-group-input_10.cjs.entry.js +35539 -0
  2. package/dist/cjs/general-input.cjs.entry.js +34 -13
  3. package/dist/cjs/general-input.cjs.js +2 -2
  4. package/dist/cjs/{index-64a5cb7f.js → index-132a0774.js} +119 -6
  5. package/dist/cjs/loader.cjs.js +2 -2
  6. package/dist/cjs/locale.utils-7665b010.js +71 -0
  7. package/dist/cjs/toggle-checkbox-input.cjs.entry.js +85 -0
  8. package/dist/cjs/tooltipIcon-092a795f.js +5 -0
  9. package/dist/collection/collection-manifest.json +3 -1
  10. package/dist/collection/components/checkbox-group-input/checkbox-group-input.css +62 -0
  11. package/dist/collection/components/checkbox-group-input/checkbox-group-input.js +366 -0
  12. package/dist/collection/components/checkbox-input/checkbox-input.css +47 -1
  13. package/dist/collection/components/checkbox-input/checkbox-input.js +143 -16
  14. package/dist/collection/components/date-input/date-input.css +64 -30
  15. package/dist/collection/components/date-input/date-input.js +194 -13
  16. package/dist/collection/components/email-input/email-input.css +63 -28
  17. package/dist/collection/components/email-input/email-input.js +197 -21
  18. package/dist/collection/components/general-input/general-input.js +163 -21
  19. package/dist/collection/components/number-input/number-input.css +65 -30
  20. package/dist/collection/components/number-input/number-input.js +174 -19
  21. package/dist/collection/components/password-input/password-input.css +120 -29
  22. package/dist/collection/components/password-input/password-input.js +341 -25
  23. package/dist/collection/components/radio-input/radio-input.css +22 -1
  24. package/dist/collection/components/radio-input/radio-input.js +89 -10
  25. package/dist/collection/components/select-input/select-input.css +75 -22
  26. package/dist/collection/components/select-input/select-input.js +180 -37
  27. package/dist/collection/components/tel-input/tel-input.css +91 -33
  28. package/dist/collection/components/tel-input/tel-input.js +202 -24
  29. package/dist/collection/components/text-input/text-input.css +63 -28
  30. package/dist/collection/components/text-input/text-input.js +208 -39
  31. package/dist/collection/components/toggle-checkbox-input/toggle-checkbox-input.css +76 -0
  32. package/dist/collection/components/toggle-checkbox-input/toggle-checkbox-input.js +324 -0
  33. package/dist/collection/utils/locale.utils.js +52 -13
  34. package/dist/collection/utils/tooltipIcon.svg +5 -0
  35. package/dist/components/active-mixin.js +975 -0
  36. package/dist/components/checkbox-group-input.d.ts +11 -0
  37. package/dist/components/checkbox-group-input.js +6 -0
  38. package/dist/components/checkbox-group-input2.js +1125 -0
  39. package/dist/components/checkbox-input2.js +62 -12
  40. package/dist/components/date-input2.js +10247 -15
  41. package/dist/components/email-input2.js +98 -21
  42. package/dist/components/field-mixin.js +12712 -0
  43. package/dist/components/general-input.js +1 -118
  44. package/dist/components/general-input2.js +331 -0
  45. package/dist/components/input-field-shared-styles.js +1114 -0
  46. package/dist/components/number-input2.js +92 -16
  47. package/dist/components/password-input2.js +924 -24
  48. package/dist/components/pattern-mixin.js +85 -0
  49. package/dist/components/radio-input2.js +45 -11
  50. package/dist/components/select-input2.js +87 -27
  51. package/dist/components/tel-input2.js +122 -22
  52. package/dist/components/text-input2.js +120 -34
  53. package/dist/components/toggle-checkbox-input.d.ts +11 -0
  54. package/dist/components/toggle-checkbox-input.js +6 -0
  55. package/dist/components/tooltipIcon.js +70 -0
  56. package/dist/components/vaadin-button.js +461 -0
  57. package/dist/components/vaadin-combo-box.js +4329 -0
  58. package/dist/components/virtual-keyboard-controller.js +2658 -0
  59. package/dist/esm/checkbox-group-input_10.entry.js +35526 -0
  60. package/dist/esm/general-input.entry.js +34 -13
  61. package/dist/esm/general-input.js +2 -2
  62. package/dist/esm/{index-df80f936.js → index-db76d5b5.js} +118 -7
  63. package/dist/esm/loader.js +2 -2
  64. package/dist/esm/locale.utils-95ea2605.js +68 -0
  65. package/dist/esm/toggle-checkbox-input.entry.js +81 -0
  66. package/dist/esm/tooltipIcon-99c1c7b7.js +3 -0
  67. package/dist/general-input/general-input.esm.js +1 -1
  68. package/dist/general-input/p-0966f523.entry.js +3581 -0
  69. package/dist/general-input/p-916a1319.entry.js +1 -0
  70. package/dist/general-input/p-b408093e.js +1 -0
  71. package/dist/general-input/p-c2d4d6ac.entry.js +1 -0
  72. package/dist/general-input/p-f4f4ccda.js +1 -0
  73. package/dist/general-input/p-f6132f1d.js +1 -0
  74. package/dist/types/components/checkbox-group-input/checkbox-group-input.d.ts +74 -0
  75. package/dist/types/components/checkbox-input/checkbox-input.d.ts +28 -2
  76. package/dist/types/components/date-input/date-input.d.ts +43 -1
  77. package/dist/types/components/email-input/email-input.d.ts +37 -3
  78. package/dist/types/components/general-input/general-input.d.ts +30 -0
  79. package/dist/types/components/number-input/number-input.d.ts +34 -3
  80. package/dist/types/components/password-input/password-input.d.ts +56 -7
  81. package/dist/types/components/radio-input/radio-input.d.ts +17 -1
  82. package/dist/types/components/select-input/select-input.d.ts +36 -3
  83. package/dist/types/components/tel-input/tel-input.d.ts +40 -5
  84. package/dist/types/components/text-input/text-input.d.ts +84 -0
  85. package/dist/types/components/toggle-checkbox-input/toggle-checkbox-input.d.ts +67 -0
  86. package/dist/types/components.d.ts +568 -9
  87. package/dist/types/utils/locale.utils.d.ts +9 -0
  88. package/dist/types/utils/types.d.ts +41 -9
  89. package/package.json +8 -1
  90. package/dist/cjs/checkbox-input_9.cjs.entry.js +0 -623
  91. package/dist/components/locale.utils.js +0 -29
  92. package/dist/esm/checkbox-input_9.entry.js +0 -611
  93. package/dist/general-input/p-1703fce3.entry.js +0 -1
  94. package/dist/general-input/p-d9f7fa2e.js +0 -1
  95. package/dist/general-input/p-dea0a4ac.entry.js +0 -1
  96. /package/dist/types/Users/{user/workspace/everymatrix → adrian.pripon/Documents/Work}/widgets-stencil/packages/general-input/.stencil/packages/general-input/stencil.config.d.ts +0 -0
@@ -1,16 +1,799 @@
1
1
  import { proxyCustomElement, HTMLElement, createEvent, h } from '@stencil/core/internal/client';
2
- import { t as translate } from './locale.utils.js';
2
+ import { t as translate, a as tooltipIconSvg } from './tooltipIcon.js';
3
+ import { i as inputFieldShared, c as InputControlMixin, d as inputFieldShared$1 } from './input-field-shared-styles.js';
4
+ import { r as registerStyles, h as html, e as InputController, f as LabelledInputController, g as TooltipController, T as ThemableMixin, E as ElementMixin, P as PolymerElement, i, S as SlotController } from './field-mixin.js';
5
+ import { P as PatternMixin } from './pattern-mixin.js';
6
+ import { b as button, B as Button } from './vaadin-button.js';
3
7
 
4
- const passwordInputCss = "*,*::before,*::after{padding:0;margin:0;box-sizing:border-box}.password__wrapper{position:relative;display:flex;flex-direction:column-reverse;padding-top:10px}.password__label{color:#474747;font-size:16px;position:absolute;bottom:15px;left:5px;transform:translateY(-25px);transition:all 0.3s cubic-bezier(0.5, 0, 0.5, 1)}.password__label--required::after{content:\"*\";margin-left:5px;color:#666666}.password__input{width:inherit;padding:15px 6px;position:relative;border:none;border-bottom:3px solid #666666;background-color:transparent;color:#666666;font-size:16px;font-family:inherit}.password__input:focus{outline:none;box-shadow:0 5px 5px rgba(16, 15, 15, 0.1)}.password__input::placeholder{color:#666666}.password__input--invalid{border-bottom:3px solid #cc0000}.password__input:placeholder-shown+.password__label{opacity:0;visibility:hidden;transform:translateY(0)}.password__error-message{position:absolute;top:calc(100% + 5px);left:0;color:#cc0000}";
8
+ /**
9
+ * @license
10
+ * Copyright (c) 2017 - 2022 Vaadin Ltd.
11
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
12
+ */
13
+
14
+ registerStyles('vaadin-text-field', inputFieldShared, {
15
+ moduleId: 'lumo-text-field-styles',
16
+ });
17
+
18
+ /**
19
+ * @license
20
+ * Copyright (c) 2021 - 2022 Vaadin Ltd.
21
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
22
+ */
23
+
24
+ /**
25
+ * A mixin to provide logic for vaadin-text-field and related components.
26
+ *
27
+ * @polymerMixin
28
+ * @mixes InputControlMixin
29
+ */
30
+ const InputFieldMixin = (superclass) =>
31
+ class InputFieldMixinClass extends InputControlMixin(superclass) {
32
+ static get properties() {
33
+ return {
34
+ /**
35
+ * Whether the value of the control can be automatically completed by the browser.
36
+ * List of available options at:
37
+ * https://developer.mozilla.org/en/docs/Web/HTML/Element/input#attr-autocomplete
38
+ */
39
+ autocomplete: {
40
+ type: String,
41
+ },
42
+
43
+ /**
44
+ * This is a property supported by Safari that is used to control whether
45
+ * autocorrection should be enabled when the user is entering/editing the text.
46
+ * Possible values are:
47
+ * on: Enable autocorrection.
48
+ * off: Disable autocorrection.
49
+ */
50
+ autocorrect: {
51
+ type: String,
52
+ },
53
+
54
+ /**
55
+ * This is a property supported by Safari and Chrome that is used to control whether
56
+ * autocapitalization should be enabled when the user is entering/editing the text.
57
+ * Possible values are:
58
+ * characters: Characters capitalization.
59
+ * words: Words capitalization.
60
+ * sentences: Sentences capitalization.
61
+ * none: No capitalization.
62
+ */
63
+ autocapitalize: {
64
+ type: String,
65
+ reflectToAttribute: true,
66
+ },
67
+ };
68
+ }
69
+
70
+ static get delegateAttrs() {
71
+ return [...super.delegateAttrs, 'autocapitalize', 'autocomplete', 'autocorrect'];
72
+ }
73
+
74
+ /**
75
+ * @param {HTMLElement} input
76
+ * @protected
77
+ * @override
78
+ */
79
+ _inputElementChanged(input) {
80
+ super._inputElementChanged(input);
81
+
82
+ if (input) {
83
+ // Discard value set on the custom slotted input.
84
+ if (input.value && input.value !== this.value) {
85
+ console.warn(`Please define value on the <${this.localName}> component!`);
86
+ input.value = '';
87
+ }
88
+
89
+ if (this.value) {
90
+ input.value = this.value;
91
+ }
92
+ }
93
+ }
94
+
95
+ // Workaround for https://github.com/Polymer/polymer/issues/5259
96
+ get __data() {
97
+ return this.__dataValue || {};
98
+ }
99
+
100
+ set __data(value) {
101
+ this.__dataValue = value;
102
+ }
103
+
104
+ /**
105
+ * Override an event listener from `FocusMixin`.
106
+ * @param {boolean} focused
107
+ * @protected
108
+ * @override
109
+ */
110
+ _setFocused(focused) {
111
+ super._setFocused(focused);
112
+
113
+ if (!focused) {
114
+ this.validate();
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Override an event listener from `InputMixin`
120
+ * to mark as valid after user started typing.
121
+ * @param {Event} event
122
+ * @protected
123
+ * @override
124
+ */
125
+ _onInput(event) {
126
+ super._onInput(event);
127
+
128
+ if (this.invalid) {
129
+ this.validate();
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Override an observer from `InputMixin` to validate the field
135
+ * when a new value is set programmatically.
136
+ *
137
+ * @param {string | undefined} newValue
138
+ * @param {string | undefined} oldValue
139
+ * @protected
140
+ * @override
141
+ */
142
+ _valueChanged(newValue, oldValue) {
143
+ super._valueChanged(newValue, oldValue);
144
+
145
+ if (oldValue === undefined) {
146
+ return;
147
+ }
148
+
149
+ if (this.invalid) {
150
+ this.validate();
151
+ }
152
+ }
153
+ };
154
+
155
+ /**
156
+ * @license
157
+ * Copyright (c) 2017 - 2022 Vaadin Ltd.
158
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
159
+ */
160
+
161
+ registerStyles('vaadin-text-field', inputFieldShared$1, { moduleId: 'vaadin-text-field-styles' });
162
+
163
+ /**
164
+ * `<vaadin-text-field>` is a web component that allows the user to input and edit text.
165
+ *
166
+ * ```html
167
+ * <vaadin-text-field label="First Name"></vaadin-text-field>
168
+ * ```
169
+ *
170
+ * ### Prefixes and suffixes
171
+ *
172
+ * These are child elements of a `<vaadin-text-field>` that are displayed
173
+ * inline with the input, before or after.
174
+ * In order for an element to be considered as a prefix, it must have the slot
175
+ * attribute set to `prefix` (and similarly for `suffix`).
176
+ *
177
+ * ```html
178
+ * <vaadin-text-field label="Email address">
179
+ * <div slot="prefix">Sent to:</div>
180
+ * <div slot="suffix">@vaadin.com</div>
181
+ * </vaadin-text-field>
182
+ * ```
183
+ *
184
+ * ### Styling
185
+ *
186
+ * The following custom properties are available for styling:
187
+ *
188
+ * Custom property | Description | Default
189
+ * -------------------------------|----------------------------|---------
190
+ * `--vaadin-field-default-width` | Default width of the field | `12em`
191
+ *
192
+ * The following shadow DOM parts are available for styling:
193
+ *
194
+ * Part name | Description
195
+ * ---------------------|----------------
196
+ * `label` | The label element
197
+ * `input-field` | The element that wraps prefix, value and suffix
198
+ * `clear-button` | The clear button
199
+ * `error-message` | The error message element
200
+ * `helper-text` | The helper text element wrapper
201
+ * `required-indicator` | The `required` state indicator element
202
+ *
203
+ * The following state attributes are available for styling:
204
+ *
205
+ * Attribute | Description | Part name
206
+ * --------------------|-------------|------------
207
+ * `disabled` | Set to a disabled text field | :host
208
+ * `has-value` | Set when the element has a value | :host
209
+ * `has-label` | Set when the element has a label | :host
210
+ * `has-helper` | Set when the element has helper text or slot | :host
211
+ * `has-error-message` | Set when the element has an error message | :host
212
+ * `invalid` | Set when the element is invalid | :host
213
+ * `input-prevented` | Temporarily set when invalid input is prevented | :host
214
+ * `focused` | Set when the element is focused | :host
215
+ * `focus-ring` | Set when the element is keyboard focused | :host
216
+ * `readonly` | Set to a readonly text field | :host
217
+ *
218
+ * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.
219
+ *
220
+ * @fires {Event} input - Fired when the value is changed by the user: on every typing keystroke, and the value is cleared using the clear button.
221
+ * @fires {Event} change - Fired when the user commits a value change.
222
+ * @fires {CustomEvent} invalid-changed - Fired when the `invalid` property changes.
223
+ * @fires {CustomEvent} value-changed - Fired when the `value` property changes.
224
+ * @fires {CustomEvent} validated - Fired whenever the field is validated.
225
+ *
226
+ * @extends HTMLElement
227
+ * @mixes ElementMixin
228
+ * @mixes ThemableMixin
229
+ * @mixes PatternMixin
230
+ * @mixes InputFieldMixin
231
+ */
232
+ class TextField extends PatternMixin(InputFieldMixin(ThemableMixin(ElementMixin(PolymerElement)))) {
233
+ static get is() {
234
+ return 'vaadin-text-field';
235
+ }
236
+
237
+ static get template() {
238
+ return html`
239
+ <style>
240
+ [part='input-field'] {
241
+ flex-grow: 0;
242
+ }
243
+ </style>
244
+
245
+ <div class="vaadin-field-container">
246
+ <div part="label">
247
+ <slot name="label"></slot>
248
+ <span part="required-indicator" aria-hidden="true" on-click="focus"></span>
249
+ </div>
250
+
251
+ <vaadin-input-container
252
+ part="input-field"
253
+ readonly="[[readonly]]"
254
+ disabled="[[disabled]]"
255
+ invalid="[[invalid]]"
256
+ theme$="[[_theme]]"
257
+ >
258
+ <slot name="prefix" slot="prefix"></slot>
259
+ <slot name="input"></slot>
260
+ <slot name="suffix" slot="suffix"></slot>
261
+ <div id="clearButton" part="clear-button" slot="suffix" aria-hidden="true"></div>
262
+ </vaadin-input-container>
263
+
264
+ <div part="helper-text">
265
+ <slot name="helper"></slot>
266
+ </div>
267
+
268
+ <div part="error-message">
269
+ <slot name="error-message"></slot>
270
+ </div>
271
+ </div>
272
+ <slot name="tooltip"></slot>
273
+ `;
274
+ }
275
+
276
+ static get properties() {
277
+ return {
278
+ /**
279
+ * Maximum number of characters (in Unicode code points) that the user can enter.
280
+ */
281
+ maxlength: {
282
+ type: Number,
283
+ },
284
+
285
+ /**
286
+ * Minimum number of characters (in Unicode code points) that the user can enter.
287
+ */
288
+ minlength: {
289
+ type: Number,
290
+ },
291
+ };
292
+ }
293
+
294
+ static get delegateAttrs() {
295
+ return [...super.delegateAttrs, 'maxlength', 'minlength'];
296
+ }
297
+
298
+ static get constraints() {
299
+ return [...super.constraints, 'maxlength', 'minlength'];
300
+ }
301
+
302
+ constructor() {
303
+ super();
304
+ this._setType('text');
305
+ }
306
+
307
+ /** @protected */
308
+ get clearElement() {
309
+ return this.$.clearButton;
310
+ }
311
+
312
+ /** @protected */
313
+ ready() {
314
+ super.ready();
315
+
316
+ this.addController(
317
+ new InputController(this, (input) => {
318
+ this._setInputElement(input);
319
+ this._setFocusElement(input);
320
+ this.stateTarget = input;
321
+ this.ariaTarget = input;
322
+ }),
323
+ );
324
+ this.addController(new LabelledInputController(this.inputElement, this._labelController));
325
+
326
+ this._tooltipController = new TooltipController(this);
327
+ this._tooltipController.setPosition('top');
328
+ this.addController(this._tooltipController);
329
+ }
330
+ }
331
+
332
+ customElements.define(TextField.is, TextField);
333
+
334
+ /**
335
+ * @license
336
+ * Copyright (c) 2021 - 2022 Vaadin Ltd.
337
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
338
+ */
339
+
340
+ const passwordFieldButton = i`
341
+ :host {
342
+ position: absolute;
343
+ right: 0;
344
+ top: 0;
345
+ margin: 0;
346
+ padding: 0;
347
+ width: 100%;
348
+ height: 100%;
349
+ min-width: auto;
350
+ background: transparent;
351
+ outline: none;
352
+ }
353
+ `;
354
+
355
+ registerStyles('vaadin-password-field-button', [button, passwordFieldButton], {
356
+ moduleId: 'lumo-password-field-button',
357
+ });
358
+
359
+ /**
360
+ * @license
361
+ * Copyright (c) 2021 - 2022 Vaadin Ltd.
362
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
363
+ */
364
+
365
+ const passwordField = i`
366
+ [part='reveal-button']::before {
367
+ content: var(--lumo-icons-eye);
368
+ }
369
+
370
+ :host([password-visible]) [part='reveal-button']::before {
371
+ content: var(--lumo-icons-eye-disabled);
372
+ }
373
+
374
+ /* Make it easy to hide the button across the whole app */
375
+ [part='reveal-button'] {
376
+ position: relative;
377
+ display: var(--lumo-password-field-reveal-button-display, block);
378
+ }
379
+
380
+ [part='reveal-button'][hidden] {
381
+ display: none !important;
382
+ }
383
+ `;
384
+
385
+ registerStyles('vaadin-password-field', [inputFieldShared, passwordField], { moduleId: 'lumo-password-field' });
386
+
387
+ /**
388
+ * @license
389
+ * Copyright (c) 2021 - 2022 Vaadin Ltd.
390
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
391
+ */
392
+
393
+ /**
394
+ * An element used internally by `<vaadin-password-field>`. Not intended to be used separately.
395
+ *
396
+ * @extends Button
397
+ * @private
398
+ */
399
+ class PasswordFieldButton extends Button {
400
+ static get is() {
401
+ return 'vaadin-password-field-button';
402
+ }
403
+
404
+ static get template() {
405
+ return html`
406
+ <style>
407
+ :host {
408
+ display: block;
409
+ }
410
+
411
+ :host([hidden]) {
412
+ display: none !important;
413
+ }
414
+ </style>
415
+ <slot name="tooltip"></slot>
416
+ `;
417
+ }
418
+ }
419
+
420
+ customElements.define(PasswordFieldButton.is, PasswordFieldButton);
421
+
422
+ /**
423
+ * @license
424
+ * Copyright (c) 2021 - 2022 Vaadin Ltd.
425
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
426
+ */
427
+
428
+ const ownTemplate = html`
429
+ <div part="reveal-button" slot="suffix">
430
+ <slot name="reveal"></slot>
431
+ </div>
432
+ `;
433
+
434
+ let memoizedTemplate;
435
+
436
+ /**
437
+ * `<vaadin-password-field>` is an extension of `<vaadin-text-field>` component for entering passwords.
438
+ *
439
+ * ```html
440
+ * <vaadin-password-field label="Password"></vaadin-password-field>
441
+ * ```
442
+ *
443
+ * ### Styling
444
+ *
445
+ * `<vaadin-password-field>` provides the same set of shadow DOM parts and state attributes as `<vaadin-text-field>`.
446
+ * See [`<vaadin-text-field>`](#/elements/vaadin-text-field) for the styling documentation.
447
+ *
448
+ * In addition to `<vaadin-text-field>` parts, the following parts are available for theming:
449
+ *
450
+ * Part name | Description
451
+ * ----------------|----------------------------------------------------
452
+ * `reveal-button` | The eye icon which toggles the password visibility
453
+ *
454
+ * In addition to `<vaadin-text-field>` state attributes, the following state attributes are available for theming:
455
+ *
456
+ * Attribute | Description
457
+ * -------------------|---------------------------------
458
+ * `password-visible` | Set when the password is visible
459
+ *
460
+ * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.
461
+ *
462
+ * @fires {Event} input - Fired when the value is changed by the user: on every typing keystroke, and the value is cleared using the clear button.
463
+ * @fires {Event} change - Fired when the user commits a value change.
464
+ * @fires {CustomEvent} invalid-changed - Fired when the `invalid` property changes.
465
+ * @fires {CustomEvent} value-changed - Fired when the `value` property changes.
466
+ * @fires {CustomEvent} validated - Fired whenever the field is validated.
467
+ *
468
+ * @extends TextField
469
+ */
470
+ class PasswordField extends TextField {
471
+ static get is() {
472
+ return 'vaadin-password-field';
473
+ }
474
+
475
+ static get template() {
476
+ if (!memoizedTemplate) {
477
+ // Clone the superclass template
478
+ memoizedTemplate = super.template.cloneNode(true);
479
+
480
+ // Retrieve this element's dom-module template
481
+ const revealButton = ownTemplate.content.querySelector('[part="reveal-button"]');
482
+
483
+ // Append reveal-button and styles to the text-field template
484
+ const inputField = memoizedTemplate.content.querySelector('[part="input-field"]');
485
+ inputField.appendChild(revealButton);
486
+ }
487
+
488
+ return memoizedTemplate;
489
+ }
490
+
491
+ static get properties() {
492
+ return {
493
+ /**
494
+ * Set to true to hide the eye icon which toggles the password visibility.
495
+ * @attr {boolean} reveal-button-hidden
496
+ */
497
+ revealButtonHidden: {
498
+ type: Boolean,
499
+ observer: '_revealButtonHiddenChanged',
500
+ value: false,
501
+ },
502
+
503
+ /**
504
+ * True if the password is visible ([type=text]).
505
+ * @attr {boolean} password-visible
506
+ */
507
+ passwordVisible: {
508
+ type: Boolean,
509
+ value: false,
510
+ reflectToAttribute: true,
511
+ observer: '_passwordVisibleChanged',
512
+ readOnly: true,
513
+ },
514
+
515
+ /**
516
+ * An object with translated strings used for localization.
517
+ * It has the following structure and default values:
518
+ *
519
+ * ```
520
+ * {
521
+ * // Translation of the reveal icon button accessible label
522
+ * reveal: 'Show password'
523
+ * }
524
+ * ```
525
+ */
526
+ i18n: {
527
+ type: Object,
528
+ value: () => {
529
+ return {
530
+ reveal: 'Show password',
531
+ };
532
+ },
533
+ },
534
+ };
535
+ }
536
+
537
+ static get observers() {
538
+ return ['__i18nChanged(i18n.*)'];
539
+ }
540
+
541
+ /** @protected */
542
+ get slotStyles() {
543
+ const tag = this.localName;
544
+ return [
545
+ ...super.slotStyles,
546
+ `
547
+ ${tag} [slot="input"]::-ms-reveal {
548
+ display: none;
549
+ }
550
+ `,
551
+ ];
552
+ }
553
+
554
+ /** @protected */
555
+ get _revealNode() {
556
+ return this._revealButtonController && this._revealButtonController.node;
557
+ }
558
+
559
+ constructor() {
560
+ super();
561
+ this._setType('password');
562
+ this.__boundRevealButtonClick = this._onRevealButtonClick.bind(this);
563
+ this.__boundRevealButtonMouseDown = this._onRevealButtonMouseDown.bind(this);
564
+ this.__lastChange = '';
565
+ }
566
+
567
+ /** @protected */
568
+ ready() {
569
+ super.ready();
570
+
571
+ this._revealPart = this.shadowRoot.querySelector('[part="reveal-button"]');
572
+
573
+ this._revealButtonController = new SlotController(
574
+ this,
575
+ 'reveal',
576
+ () => document.createElement('vaadin-password-field-button'),
577
+ (host, btn) => {
578
+ btn.disabled = host.disabled;
579
+
580
+ btn.addEventListener('click', host.__boundRevealButtonClick);
581
+ btn.addEventListener('mousedown', host.__boundRevealButtonMouseDown);
582
+ },
583
+ );
584
+ this.addController(this._revealButtonController);
585
+
586
+ this.__updateAriaLabel(this.i18n);
587
+
588
+ this._updateToggleState(false);
589
+ this._toggleRevealHidden(this.revealButtonHidden);
590
+
591
+ if (this.inputElement) {
592
+ this.inputElement.autocapitalize = 'off';
593
+ }
594
+ }
595
+
596
+ /**
597
+ * Override an event listener inherited from `InputControlMixin`
598
+ * to store the value at the moment of the native `change` event.
599
+ * @param {Event} event
600
+ * @protected
601
+ * @override
602
+ */
603
+ _onChange(event) {
604
+ super._onChange(event);
605
+
606
+ this.__lastChange = this.inputElement.value;
607
+ }
608
+
609
+ /**
610
+ * Override method inherited from `FocusMixin` to mark field as focused
611
+ * when focus moves to the reveal button using Shift Tab.
612
+ * @param {Event} event
613
+ * @return {boolean}
614
+ * @protected
615
+ */
616
+ _shouldSetFocus(event) {
617
+ return event.target === this.inputElement || event.target === this._revealNode;
618
+ }
619
+
620
+ /**
621
+ * Override method inherited from `FocusMixin` to not hide password
622
+ * when focus moves to the reveal button or back to the input.
623
+ * @param {Event} event
624
+ * @return {boolean}
625
+ * @protected
626
+ */
627
+ _shouldRemoveFocus(event) {
628
+ return !(
629
+ event.relatedTarget === this._revealNode ||
630
+ (event.relatedTarget === this.inputElement && event.target === this._revealNode)
631
+ );
632
+ }
633
+
634
+ /**
635
+ * Override method inherited from `FocusMixin` to toggle password visibility.
636
+ * @param {boolean} focused
637
+ * @protected
638
+ * @override
639
+ */
640
+ _setFocused(focused) {
641
+ super._setFocused(focused);
642
+
643
+ if (!focused) {
644
+ this._setPasswordVisible(false);
645
+
646
+ // Detect if `focusout` was prevented and if so, dispatch `change` event manually.
647
+ if (this.__lastChange !== this.inputElement.value) {
648
+ this.__lastChange = this.inputElement.value;
649
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true }));
650
+ }
651
+ } else {
652
+ const isButtonFocused = this.getRootNode().activeElement === this._revealNode;
653
+ // Remove focus-ring from the field when the reveal button gets focused
654
+ this.toggleAttribute('focus-ring', this._keyboardActive && !isButtonFocused);
655
+ }
656
+ }
657
+
658
+ /** @private */
659
+ __updateAriaLabel(i18n) {
660
+ if (i18n.reveal && this._revealNode) {
661
+ this._revealNode.setAttribute('aria-label', i18n.reveal);
662
+ }
663
+ }
664
+
665
+ /** @private */
666
+ __i18nChanged(i18n) {
667
+ this.__updateAriaLabel(i18n.base);
668
+ }
669
+
670
+ /** @private */
671
+ _revealButtonHiddenChanged(hidden) {
672
+ this._toggleRevealHidden(hidden);
673
+ }
674
+
675
+ /** @private */
676
+ _togglePasswordVisibility() {
677
+ this._setPasswordVisible(!this.passwordVisible);
678
+ }
679
+
680
+ /** @private */
681
+ _onRevealButtonClick() {
682
+ this._togglePasswordVisibility();
683
+ }
684
+
685
+ /** @private */
686
+ _onRevealButtonMouseDown(e) {
687
+ // Cancel the following focusout event
688
+ e.preventDefault();
689
+
690
+ // Focus the input to avoid problem with password still visible
691
+ // when user clicks the reveal button and then clicks outside.
692
+ this.inputElement.focus();
693
+ }
694
+
695
+ /** @private */
696
+ _toggleRevealHidden(hidden) {
697
+ if (this._revealNode) {
698
+ if (hidden) {
699
+ this._revealPart.setAttribute('hidden', '');
700
+ this._revealNode.setAttribute('tabindex', '-1');
701
+ this._revealNode.setAttribute('aria-hidden', 'true');
702
+ } else {
703
+ this._revealPart.removeAttribute('hidden');
704
+ this._revealNode.setAttribute('tabindex', '0');
705
+ this._revealNode.removeAttribute('aria-hidden');
706
+ }
707
+ }
708
+ }
709
+
710
+ /** @private */
711
+ _updateToggleState(passwordVisible) {
712
+ if (this._revealNode) {
713
+ this._revealNode.setAttribute('aria-pressed', passwordVisible ? 'true' : 'false');
714
+ }
715
+ }
716
+
717
+ /** @private */
718
+ _passwordVisibleChanged(passwordVisible) {
719
+ this._setType(passwordVisible ? 'text' : 'password');
720
+
721
+ this._updateToggleState(passwordVisible);
722
+ }
723
+
724
+ /**
725
+ * Override method inherited from `DisabledMixin` to synchronize the reveal button
726
+ * disabled state with the password field disabled state.
727
+ * @param {boolean} disabled
728
+ * @param {boolean} oldDisabled
729
+ * @protected
730
+ */
731
+ _disabledChanged(disabled, oldDisabled) {
732
+ super._disabledChanged(disabled, oldDisabled);
733
+
734
+ if (this._revealNode) {
735
+ this._revealNode.disabled = disabled;
736
+ }
737
+ }
738
+ }
739
+
740
+ customElements.define(PasswordField.is, PasswordField);
741
+
742
+ const passwordInputCss = "*,*::before,*::after{padding:0;margin:0;box-sizing:border-box}.password{font-family:\"Roboto\";font-style:normal}.password__wrapper{position:relative;width:100%}.password__wrapper--autofilled{pointer-events:none}.password__wrapper--autofilled .password__label{color:#979797}.password__wrapper--autofilled .password__input::part(input-field){color:#979797}.password__wrapper--flex{display:flex;gap:5px}.password__wrapper--relative{position:relative}.password__label{font-family:inherit;font-style:normal;font-weight:500;font-size:16px;line-height:20px;color:#2A3841}.password__label--required::after{content:\"*\";font-family:inherit;color:#2A3841;margin-left:2px}.password__input{width:inherit;border:none;margin-bottom:5px}.password__input[focused]::part(input-field){border-color:#3E3E3E}.password__input[invalid]::part(input-field){border-color:#cc0000b3}.password__input::part(input-field){border-radius:4px;background-color:transparent;font-family:inherit;font-style:normal;font-weight:300;font-size:16px;line-height:19px;color:#2A2E3F;width:100%;position:relative;border:2px solid #DEE1EE}.password__input>input:placeholder-shown{color:#979797}.password__error-message{position:absolute;top:calc(100% + 5px);left:0;color:#cc0000b3}.password__complexity{position:relative;padding:10px;display:flex;flex-direction:column;gap:20px;justify-content:center;margin-top:20px;font-weight:300;background:#FFFFFF;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;height:150px;border:1px solid #B0B0B0}.password__complexity--strength{display:flex;justify-content:space-evenly}.password__complexity--strength meter::-webkit-meter-optimum-value{background:#1F1F1F}.password__complexity--strength meter::-moz-meter-bar{background:#B0B0B0}.password__complexity--hidden{display:none}.password__complexity--text-bold{font-weight:500}.password__complexity--checkbox{margin-right:5px}.password__complexity:after{content:\"\";position:absolute;width:25px;height:25px;border-top:1px solid #B0B0B0;border-right:0 solid #B0B0B0;border-left:1px solid #B0B0B0;border-bottom:0 solid #B0B0B0;bottom:92%;left:50%;margin-left:-25px;transform:rotate(45deg);margin-top:-25px;background-color:#FFFFFF}.password__tooltip-icon{width:16px;height:auto}.password__tooltip{position:absolute;top:0;left:20px;background-color:#FFFFFF;border:1px solid #B0B0B0;color:#2B2D3F;padding:10px;border-radius:5px;opacity:0;transition:opacity 0.3s ease-in-out;z-index:10}.password__tooltip.visible{opacity:1}";
5
743
 
6
744
  const PasswordInput = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
7
745
  constructor() {
8
746
  super();
9
747
  this.__registerHost();
10
748
  this.__attachShadow();
749
+ this.sendOriginalValidityState = createEvent(this, "sendOriginalValidityState", 7);
11
750
  this.sendValidityState = createEvent(this, "sendValidityState", 7);
12
751
  this.sendInputValue = createEvent(this, "sendInputValue", 7);
752
+ /**
753
+ * Default value for the input.
754
+ */
755
+ this.defaultValue = '';
756
+ /**
757
+ * Client custom styling via inline style
758
+ */
759
+ this.clientStyling = '';
760
+ this.limitStylingAppends = false;
761
+ this.showTooltip = false;
762
+ this.value = '';
763
+ this.touched = false;
764
+ this.originalValid = false;
13
765
  this.validationPattern = '';
766
+ this.duplicateInputValue = null;
767
+ this.handleInput = (event) => {
768
+ this.value = event.target.value;
769
+ this.calculateComplexity(this.value);
770
+ this.showPopup = true;
771
+ this.touched = true;
772
+ if (this.debounceTime) {
773
+ clearTimeout(this.debounceTime);
774
+ }
775
+ this.debounceTime = setTimeout(() => {
776
+ this.isValid = this.setValidity();
777
+ this.errorMessage = this.setErrorMessage();
778
+ this.emitValueHandler(true);
779
+ }, 500);
780
+ };
781
+ this.handleBlur = (event) => {
782
+ this.value = event.target.value;
783
+ this.showPopup = false;
784
+ this.touched = true;
785
+ this.isValid = this.setValidity();
786
+ this.errorMessage = this.setErrorMessage();
787
+ };
788
+ this.handleFocus = () => {
789
+ this.showPopup = true;
790
+ this.calculateComplexity(this.value);
791
+ };
792
+ this.setClientStyling = () => {
793
+ let sheet = document.createElement('style');
794
+ sheet.innerHTML = this.clientStyling;
795
+ this.stylingContainer.prepend(sheet);
796
+ };
14
797
  }
15
798
  validityChanged() {
16
799
  this.validityStateHandler({ valid: this.isValid, name: this.name });
@@ -18,39 +801,119 @@ const PasswordInput = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement
18
801
  this.valueHandler({ name: this.name, value: this.value });
19
802
  }
20
803
  }
21
- validityStateHandler(inputStateEvent) {
22
- this.sendValidityState.emit(inputStateEvent);
804
+ valueChanged() {
805
+ if (!this.isDuplicateInput) {
806
+ // recalculate complexity immediately in order to send the correct validity to the duplicate
807
+ this.calculateComplexity(this.value);
808
+ this.sendOriginalValidityState.emit({ name: this.name, valid: this.setValidity() });
809
+ }
23
810
  }
24
811
  emitValueHandler(newValue) {
25
812
  if (newValue == true && this.isValid) {
26
- this.valueHandler({ name: this.name, value: this.value });
813
+ this.valueHandler({ name: this.name, value: this.value, type: 'duplicate' });
27
814
  }
28
815
  }
816
+ validityStateHandler(inputStateEvent) {
817
+ this.sendValidityState.emit(inputStateEvent);
818
+ }
29
819
  valueHandler(inputValueEvent) {
30
820
  this.sendInputValue.emit(inputValueEvent);
31
821
  }
32
- connectedCallback() {
33
- this.validationPattern = this.setPattern();
822
+ originalValidityChangedHandler(event) {
823
+ if (this.isDuplicateInput) {
824
+ if (event.detail.valid) {
825
+ this.originalValid = true;
826
+ this.isValid = this.setValidity();
827
+ }
828
+ else {
829
+ this.originalValid = false;
830
+ this.isValid = false;
831
+ // only show error if the user has touched the input, in order to not show errors on empty inputs
832
+ this.value !== '' && (this.errorMessage = this.setErrorMessage());
833
+ }
834
+ }
835
+ }
836
+ valueChangedHandler(event) {
837
+ if (this.isDuplicateInput && this.name === event.detail.name + 'Duplicate') {
838
+ this.duplicateInputValue = event.detail.value;
839
+ if (this.touched) {
840
+ this.isValid = this.setValidity();
841
+ this.errorMessage = this.setErrorMessage();
842
+ }
843
+ }
844
+ if (this.name === event.detail.name + 'Duplicate'
845
+ && this.name.replace('Duplicate', '') === event.detail.name
846
+ && this.touched === true) {
847
+ this.isValid = this.setValidity();
848
+ this.errorMessage = this.setErrorMessage();
849
+ }
850
+ }
851
+ handleClickOutside(event) {
852
+ if (event.composedPath()[0] === this.tooltipIconReference)
853
+ return;
854
+ if (event.composedPath()[0] !== this.tooltipReference)
855
+ this.showTooltip = false;
856
+ }
857
+ componentDidRender() {
858
+ // start custom styling area
859
+ if (!this.limitStylingAppends && this.stylingContainer) {
860
+ if (this.clientStyling)
861
+ this.setClientStyling();
862
+ this.limitStylingAppends = true;
863
+ }
864
+ // end custom styling area
34
865
  }
35
- handleInput(event) {
36
- this.value = event.target.value;
37
- this.errorMessage = this.setErrorMessage();
866
+ componentDidLoad() {
867
+ this.inputReference = this.element.shadowRoot.querySelector('input');
868
+ this.passwordButton = this.element.shadowRoot.querySelector('vaadin-password-field-button');
869
+ this.passwordButton.tabIndex = -1;
870
+ if (this.defaultValue) {
871
+ this.value = this.defaultValue;
872
+ this.calculateComplexity(this.value);
873
+ this.valueHandler({ name: this.name, value: this.value });
874
+ if (this.isDuplicateInput) {
875
+ this.duplicateInputValue = this.defaultValue;
876
+ this.touched = true;
877
+ }
878
+ }
38
879
  this.isValid = this.setValidity();
39
- this.validityStateHandler({ valid: this.isValid, name: this.name });
40
- this.emitValueHandler(true);
880
+ }
881
+ calculateComplexity(password) {
882
+ this.passwordComplexity = this.validation.custom
883
+ .filter(rule => rule.rule === 'regex')
884
+ .map(rule => {
885
+ const ruleRegex = new RegExp(rule.pattern);
886
+ const passed = ruleRegex.test(password);
887
+ return { rule: rule.displayName, ruleKey: rule.errorKey, passed };
888
+ });
41
889
  }
42
890
  setValidity() {
43
- return this.inputReference.validity.valid;
891
+ var _a, _b;
892
+ if (this.isDuplicateInput && this.duplicateInputValue !== this.value) {
893
+ return false;
894
+ }
895
+ else if (!((_a = this.passwordComplexity) === null || _a === void 0 ? void 0 : _a.every(complexity => complexity.passed))) {
896
+ return false;
897
+ }
898
+ else {
899
+ return (_b = this.inputReference) === null || _b === void 0 ? void 0 : _b.validity.valid;
900
+ }
44
901
  }
45
902
  setPattern() {
46
- var _a;
903
+ var _a, _b;
47
904
  if (((_a = this.validation.custom) === null || _a === void 0 ? void 0 : _a.length) > 0) {
48
- return this.validation.custom.find(customValidation => customValidation.rule === 'regex').pattern;
905
+ return (_b = this.validation.custom.find(customValidation => customValidation.rule === 'regex')) === null || _b === void 0 ? void 0 : _b.pattern;
49
906
  }
50
907
  }
51
908
  setErrorMessage() {
909
+ var _a, _b, _c, _d;
910
+ if (this.isDuplicateInput && !this.originalValid) {
911
+ return translate('invalidOriginalPasswordError', this.language);
912
+ }
52
913
  if (this.inputReference.validity.patternMismatch) {
53
- return this.validation.custom.find(customValidation => customValidation.rule === 'regex').errorMessage;
914
+ const errorCode = (_a = this.validation.custom.find(customValidation => customValidation.rule === 'regex')) === null || _a === void 0 ? void 0 : _a.errorKey;
915
+ const errorMessage = (_b = this.validation.custom.find(customValidation => customValidation.rule === 'regex')) === null || _b === void 0 ? void 0 : _b.errorMessage;
916
+ return translate(`${errorCode}`, this.language) ? translate(`${errorCode}`, this.language) : errorMessage;
54
917
  }
55
918
  if (this.inputReference.validity.tooShort || this.inputReference.validity.tooLong) {
56
919
  return translate('lengthError', this.language, { values: { minLength: this.validation.minLength, maxLength: this.validation.maxLength } });
@@ -58,25 +921,62 @@ const PasswordInput = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement
58
921
  if (this.inputReference.validity.valueMissing) {
59
922
  return translate('requiredError', this.language);
60
923
  }
924
+ if (this.isDuplicateInput && this.duplicateInputValue !== this.value) {
925
+ const errorCode = (_c = this.validation.custom.find(customRule => customRule.rule === 'duplicate-input')) === null || _c === void 0 ? void 0 : _c.errorKey;
926
+ const errorMessage = (_d = this.validation.custom.find(customRule => customRule.rule === 'duplicate-input')) === null || _d === void 0 ? void 0 : _d.errorMessage;
927
+ return translate(`${errorCode}`, this.language) ? translate(`${errorCode}`, this.language) : errorMessage;
928
+ }
929
+ }
930
+ renderTooltip() {
931
+ if (this.showTooltip) {
932
+ return (h("div", { class: `password__tooltip ${this.showTooltip ? 'visible' : ''}`, ref: (el) => this.tooltipReference = el, innerHTML: this.tooltip }));
933
+ }
934
+ return null;
935
+ }
936
+ renderComplexityPopup() {
937
+ const totalRules = this.passwordComplexity.length;
938
+ const passedRules = this.passwordComplexity.filter(complexity => complexity.passed).length;
939
+ const meterValue = passedRules / totalRules;
940
+ const allRulesPassed = this.passwordComplexity.every(complexity => complexity.passed);
941
+ return (h("div", { class: `password__complexity ${!this.showPopup ? 'password__complexity--hidden' : ''}` }, h("div", { class: 'password__complexity--strength' }, h("p", { class: 'password__complexity--text' }, translate('passwordStrength', this.language), "\u00A0", h("span", { class: 'password__complexity--text-bold' }, translate(`${allRulesPassed ? 'passwordStrengthStrong' : 'passwordStrengthWeak'}`, this.language))), h("meter", { value: meterValue, min: "0", max: "1" })), h("div", null, this.passwordComplexity.map((complexity, index) => {
942
+ return (h("div", { key: index }, h("input", { class: 'password__complexity--checkbox', type: "checkbox", checked: complexity.passed, disabled: true }), h("span", null, translate(`${complexity.ruleKey}`, this.language) ? translate(`${complexity.ruleKey}`, this.language) : complexity.rule)));
943
+ }))));
61
944
  }
62
945
  render() {
63
- const invalidClass = this.isValid == true || this.isValid == undefined ? '' : 'password__input--invalid';
64
- return h("div", { class: 'password__wrapper' }, h("input", { type: "password", id: `${this.name}__input`, class: `password__input ${invalidClass}`, name: this.name, ref: (el) => this.inputReference = el, required: this.validation.mandatory, maxlength: this.validation.maxLength, minlength: this.validation.minLength, pattern: this.validationPattern, placeholder: `${this.displayName} ${this.validation.mandatory ? '*' : ''}`, onBlur: (e) => this.handleInput(e) }), h("label", { class: `password__label ${this.validation.mandatory ? 'password__label--required' : ''}`, htmlFor: `${this.name}__input` }, this.displayName), h("small", { class: 'password__error-message' }, this.errorMessage));
946
+ let invalidClass = '';
947
+ if (this.touched) {
948
+ invalidClass = this.isValid == true || this.isValid == undefined ? '' : 'text__input--invalid';
949
+ }
950
+ return h("div", { class: `password__wrapper ${this.autofilled ? 'password__wrapper--autofilled' : ''} ${this.name}__input`, ref: el => this.stylingContainer = el }, h("div", { class: 'password__wrapper--flex' }, h("label", { class: `password__label ${this.validation.mandatory ? 'password__label--required' : ''}`, htmlFor: `${this.name}__input` }, this.displayName), h("div", { class: 'password__wrapper--relative' }, this.tooltip &&
951
+ h("img", { class: 'password__tooltip-icon', src: tooltipIconSvg, alt: "", ref: (el) => this.tooltipIconReference = el, onClick: () => this.showTooltip = !this.showTooltip }), this.renderTooltip())), h("vaadin-password-field", { type: "password", id: `${this.name}__input`, class: `password__input ${invalidClass}`, name: this.name, readOnly: this.autofilled, value: this.defaultValue, required: this.validation.mandatory, maxlength: this.validation.maxLength, minlength: this.validation.minLength, pattern: this.validationPattern, placeholder: `${this.placeholder}`, onInput: this.handleInput, onBlur: this.handleBlur, onFocus: this.handleFocus }), h("small", { class: 'password__error-message' }, this.errorMessage), this.passwordComplexity && this.showPopup && !this.isDuplicateInput && this.renderComplexityPopup());
65
952
  }
953
+ get element() { return this; }
66
954
  static get watchers() { return {
67
955
  "isValid": ["validityChanged"],
956
+ "value": ["valueChanged"],
68
957
  "emitValue": ["emitValueHandler"]
69
958
  }; }
70
959
  static get style() { return passwordInputCss; }
71
960
  }, [1, "password-input", {
72
- "name": [1],
73
- "displayName": [1, "display-name"],
961
+ "name": [513],
962
+ "displayName": [513, "display-name"],
963
+ "placeholder": [513],
964
+ "defaultValue": [513, "default-value"],
965
+ "autofilled": [516],
966
+ "tooltip": [513],
74
967
  "validation": [16],
75
- "language": [1],
76
- "emitValue": [4, "emit-value"],
968
+ "language": [513],
969
+ "emitValue": [516, "emit-value"],
970
+ "isDuplicateInput": [516, "is-duplicate-input"],
971
+ "clientStyling": [513, "client-styling"],
77
972
  "isValid": [32],
78
- "errorMessage": [32]
79
- }]);
973
+ "errorMessage": [32],
974
+ "limitStylingAppends": [32],
975
+ "showTooltip": [32],
976
+ "passwordComplexity": [32],
977
+ "showPopup": [32],
978
+ "value": [32]
979
+ }, [[16, "sendOriginalValidityState", "originalValidityChangedHandler"], [16, "sendInputValue", "valueChangedHandler"], [4, "click", "handleClickOutside"]]]);
80
980
  function defineCustomElement() {
81
981
  if (typeof customElements === "undefined") {
82
982
  return;