igniteui-webcomponents 6.3.0 → 6.3.2

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 (66) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/components/card/card.actions.d.ts +1 -1
  3. package/components/card/card.actions.js +2 -1
  4. package/components/card/card.actions.js.map +1 -1
  5. package/components/card/themes/card.actions.base.css.js +1 -1
  6. package/components/card/themes/card.actions.base.css.js.map +1 -1
  7. package/components/card/themes/card.content.base.css.js +1 -1
  8. package/components/card/themes/card.content.base.css.js.map +1 -1
  9. package/components/card/themes/card.header.base.css.js +1 -1
  10. package/components/card/themes/card.header.base.css.js.map +1 -1
  11. package/components/card/themes/content.js +0 -7
  12. package/components/card/themes/content.js.map +1 -1
  13. package/components/card/themes/shared/actions/card.actions.common.css.js +3 -0
  14. package/components/card/themes/shared/actions/card.actions.common.css.js.map +1 -0
  15. package/components/card/themes/shared/header/card.header.indigo.css.js +1 -1
  16. package/components/card/themes/shared/header/card.header.indigo.css.js.map +1 -1
  17. package/components/chat/themes/dark/chat.bootstrap.css.js +1 -1
  18. package/components/chat/themes/dark/chat.bootstrap.css.js.map +1 -1
  19. package/components/chat/themes/dark/chat.fluent.css.js +1 -1
  20. package/components/chat/themes/dark/chat.fluent.css.js.map +1 -1
  21. package/components/chat/themes/dark/chat.indigo.css.js +1 -1
  22. package/components/chat/themes/dark/chat.indigo.css.js.map +1 -1
  23. package/components/chat/themes/dark/chat.material.css.js +1 -1
  24. package/components/chat/themes/dark/chat.material.css.js.map +1 -1
  25. package/components/chat/themes/dark/chat.shared.css.d.ts +1 -0
  26. package/components/chat/themes/dark/chat.shared.css.js +3 -0
  27. package/components/chat/themes/dark/chat.shared.css.js.map +1 -0
  28. package/components/chat/themes/light/chat.shared.css.js +1 -1
  29. package/components/chat/themes/light/chat.shared.css.js.map +1 -1
  30. package/components/chat/themes/message.base.css.js +1 -1
  31. package/components/chat/themes/message.base.css.js.map +1 -1
  32. package/components/chat/themes/shared/chat-message/chat-message.common.css.js +1 -1
  33. package/components/chat/themes/shared/chat-message/chat-message.common.css.js.map +1 -1
  34. package/components/chat/themes/themes.js +4 -3
  35. package/components/chat/themes/themes.js.map +1 -1
  36. package/components/date-time-input/date-time-input.d.ts +3 -4
  37. package/components/date-time-input/date-time-input.js +51 -66
  38. package/components/date-time-input/date-time-input.js.map +1 -1
  39. package/components/date-time-input/date-util.d.ts +1 -1
  40. package/components/date-time-input/date-util.js +18 -41
  41. package/components/date-time-input/date-util.js.map +1 -1
  42. package/components/mask-input/mask-input-base.d.ts +29 -20
  43. package/components/mask-input/mask-input-base.js +48 -54
  44. package/components/mask-input/mask-input-base.js.map +1 -1
  45. package/components/mask-input/mask-input.d.ts +24 -13
  46. package/components/mask-input/mask-input.js +66 -65
  47. package/components/mask-input/mask-input.js.map +1 -1
  48. package/components/mask-input/mask-parser.d.ts +4 -0
  49. package/components/mask-input/mask-parser.js +3 -0
  50. package/components/mask-input/mask-parser.js.map +1 -1
  51. package/components/mask-input/validators.js +1 -1
  52. package/components/mask-input/validators.js.map +1 -1
  53. package/custom-elements.json +440 -328
  54. package/{components/chat/extras/markdown-renderer.d.ts → extras/chat-markdown-renderer.d.ts} +1 -1
  55. package/{components/chat/extras/markdown-renderer.js → extras/chat-markdown-renderer.js} +27 -2
  56. package/extras/chat-markdown-renderer.js.map +1 -0
  57. package/extras/index.d.ts +1 -1
  58. package/extras/index.js +1 -1
  59. package/extras/index.js.map +1 -1
  60. package/igniteui-webcomponents.html-data.json +1 -1
  61. package/package.json +2 -2
  62. package/web-types.json +1 -1
  63. package/components/card/themes/shared/content/card.content.indigo.css.js +0 -3
  64. package/components/card/themes/shared/content/card.content.indigo.css.js.map +0 -1
  65. package/components/chat/extras/markdown-renderer.js.map +0 -1
  66. /package/components/card/themes/shared/{content/card.content.indigo.css.d.ts → actions/card.actions.common.css.d.ts} +0 -0
@@ -8,7 +8,6 @@ import { html, nothing } from 'lit';
8
8
  import { property } from 'lit/decorators.js';
9
9
  import { ifDefined } from 'lit/directives/if-defined.js';
10
10
  import { live } from 'lit/directives/live.js';
11
- import { watch } from '../common/decorators/watch.js';
12
11
  import { registerComponent } from '../common/definitions/register.js';
13
12
  import { createFormValueState } from '../common/mixins/forms/form-value.js';
14
13
  import { partMap } from '../common/part-map.js';
@@ -22,7 +21,7 @@ export default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
22
21
  this._formValue = createFormValueState(this, {
23
22
  initialValue: '',
24
23
  transformers: {
25
- setFormValue: (value) => this._isRawMode ? value || null : this.maskedValue || null,
24
+ setFormValue: (value) => this._isRawMode ? value || null : this._maskedValue || null,
26
25
  },
27
26
  });
28
27
  this.valueMode = 'raw';
@@ -37,89 +36,91 @@ export default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
37
36
  get _isRawMode() {
38
37
  return this.valueMode === 'raw';
39
38
  }
39
+ set value(string) {
40
+ const value = string ?? '';
41
+ this._maskedValue = this._parser.apply(value);
42
+ this._updateMaskedValue();
43
+ this._formValue.setValueAndFormState(value);
44
+ }
40
45
  get value() {
41
46
  const value = this._formValue.value;
42
47
  if (this._isRawMode) {
43
48
  return value;
44
49
  }
45
- return value ? this.maskedValue : value;
46
- }
47
- set value(string) {
48
- const value = string ?? '';
49
- this.maskedValue = this.parser.apply(value);
50
- this.updateMaskedValue();
51
- this._formValue.setValueAndFormState(value);
52
- }
53
- get mask() {
54
- return this._mask;
50
+ return value ? this._maskedValue : value;
55
51
  }
56
52
  set mask(value) {
57
- this._mask = value;
58
- this.parser.mask = value;
53
+ super.mask = value;
59
54
  if (this.value) {
60
- this.maskedValue = this.parser.apply(this._formValue.value);
55
+ this._maskedValue = this._parser.apply(this._formValue.value);
61
56
  }
62
57
  }
63
- promptChange() {
64
- this.parser.prompt = this.prompt;
58
+ get mask() {
59
+ return super.mask;
60
+ }
61
+ set prompt(value) {
62
+ super.prompt = value;
65
63
  if (this.value) {
66
- this.maskedValue = this.parser.apply(this._formValue.value);
64
+ this._maskedValue = this._parser.apply(this._formValue.value);
67
65
  }
68
66
  }
69
- _restoreDefaultValue() {
70
- const value = this.defaultValue;
71
- this.maskedValue = this.parser.apply(value);
72
- this.updateMaskedValue();
73
- this._formValue.setValueAndFormState(value);
74
- }
75
- async updateInput(string, range) {
76
- const { value, end } = this.parser.replace(this.maskedValue, string, range.start, range.end);
77
- this.maskedValue = value;
78
- this._formValue.setValueAndFormState(this.parser.parse(value));
79
- this.requestUpdate();
80
- if (range.start !== this.mask.length) {
81
- this.emitEvent('igcInput', { detail: this.value });
82
- }
83
- await this.updateComplete;
84
- this.input.setSelectionRange(end, end);
67
+ get prompt() {
68
+ return super.prompt;
85
69
  }
86
- handleDragEnter() {
87
- if (!this.focused && !this._formValue.value) {
88
- this.maskedValue = this.emptyMask;
70
+ _handleDragEnter() {
71
+ if (!this._focused && !this._formValue.value) {
72
+ this._maskedValue = this._parser.emptyMask;
89
73
  }
90
74
  }
91
- handleDragLeave() {
92
- if (!this.focused) {
93
- this.updateMaskedValue();
75
+ _handleDragLeave() {
76
+ if (!this._focused) {
77
+ this._updateMaskedValue();
94
78
  }
95
79
  }
96
- async handleFocus() {
97
- this.focused = true;
80
+ async _handleFocus() {
81
+ this._focused = true;
98
82
  if (this.readOnly) {
99
83
  return;
100
84
  }
101
85
  if (!this._formValue.value) {
102
- this.maskedValue = this.emptyMask;
86
+ this._maskedValue = this._parser.emptyMask;
103
87
  await this.updateComplete;
104
88
  this.select();
105
89
  }
106
90
  }
107
91
  _handleBlur() {
108
- this.focused = false;
109
- this.updateMaskedValue();
92
+ this._focused = false;
93
+ this._updateMaskedValue();
110
94
  super._handleBlur();
111
95
  }
112
- handleChange() {
96
+ _handleChange() {
113
97
  this._setTouchedState();
114
98
  this.emitEvent('igcChange', { detail: this.value });
115
99
  }
116
- updateMaskedValue() {
117
- if (this.maskedValue === this.emptyMask) {
118
- this.maskedValue = '';
100
+ _restoreDefaultValue() {
101
+ const value = this.defaultValue;
102
+ this._maskedValue = this._parser.apply(value);
103
+ this._updateMaskedValue();
104
+ this._formValue.setValueAndFormState(value);
105
+ }
106
+ async _updateInput(text, { start, end }) {
107
+ const result = this._parser.replace(this._maskedValue, text, start, end);
108
+ this._maskedValue = result.value;
109
+ this._formValue.setValueAndFormState(this._parser.parse(this._maskedValue));
110
+ this.requestUpdate();
111
+ if (start !== this.mask.length) {
112
+ this.emitEvent('igcInput', { detail: this.value });
119
113
  }
114
+ await this.updateComplete;
115
+ this.input.setSelectionRange(result.end, result.end);
120
116
  }
121
117
  _updateSetRangeTextValue() {
122
- this.value = this.parser.parse(this.maskedValue);
118
+ this.value = this._parser.parse(this._maskedValue);
119
+ }
120
+ _updateMaskedValue() {
121
+ if (this._maskedValue === this._parser.emptyMask) {
122
+ this._maskedValue = '';
123
+ }
123
124
  }
124
125
  renderInput() {
125
126
  return html `
@@ -127,23 +128,23 @@ export default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
127
128
  type="text"
128
129
  part=${partMap(this.resolvePartNames('input'))}
129
130
  name=${ifDefined(this.name)}
130
- .value=${live(this.maskedValue)}
131
- .placeholder=${live(this.placeholder ?? this.parser.escapedMask)}
131
+ .value=${live(this._maskedValue)}
132
+ .placeholder=${this.placeholder ?? this._parser.escapedMask}
132
133
  ?readonly=${this.readOnly}
133
134
  ?disabled=${this.disabled}
134
- @dragenter=${this.handleDragEnter}
135
- @dragleave=${this.handleDragLeave}
136
- @dragstart=${this.handleDragStart}
135
+ @dragenter=${this._handleDragEnter}
136
+ @dragleave=${this._handleDragLeave}
137
+ @dragstart=${this._setMaskSelection}
137
138
  @blur=${this._handleBlur}
138
- @focus=${this.handleFocus}
139
- @cut=${this.handleCut}
140
- @change=${this.handleChange}
141
- @click=${this.handleClick}
142
- @compositionstart=${this.handleCompositionStart}
143
- @compositionend=${this.handleCompositionEnd}
144
- @input=${this.handleInput}
139
+ @focus=${this._handleFocus}
140
+ @cut=${this._setMaskSelection}
141
+ @change=${this._handleChange}
142
+ @click=${this._handleClick}
143
+ @compositionstart=${this._handleCompositionStart}
144
+ @compositionend=${this._handleCompositionEnd}
145
+ @input=${this._handleInput}
145
146
  aria-describedby=${ifDefined(isEmpty(this._helperText) ? nothing : 'helper-text')}
146
- @keydown=${this.handleKeydown}
147
+ @keydown=${this._setMaskSelection}
147
148
  />
148
149
  `;
149
150
  }
@@ -158,6 +159,6 @@ __decorate([
158
159
  property()
159
160
  ], IgcMaskInputComponent.prototype, "mask", null);
160
161
  __decorate([
161
- watch('prompt')
162
- ], IgcMaskInputComponent.prototype, "promptChange", null);
162
+ property()
163
+ ], IgcMaskInputComponent.prototype, "prompt", null);
163
164
  //# sourceMappingURL=mask-input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mask-input.js","sourceRoot":"","sources":["../../../src/components/mask-input/mask-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { watch } from '../common/decorators/watch.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport { createFormValueState } from '../common/mixins/forms/form-value.js';\nimport { partMap } from '../common/part-map.js';\nimport { isEmpty } from '../common/util.js';\nimport type { MaskInputValueMode } from '../types.js';\nimport IgcValidationContainerComponent from '../validation-container/validation-container.js';\nimport {\n IgcMaskInputBaseComponent,\n type MaskRange,\n} from './mask-input-base.js';\nimport { maskValidators } from './validators.js';\n\n/**\n * A masked input is an input field where a developer can control user input and format the visible value,\n * based on configurable rules\n *\n * @element igc-mask-input\n *\n * @slot prefix - Renders content before the input\n * @slot suffix - Renders content after the input\n * @slot helper-text - Renders content below the input\n * @slot value-missing - Renders content when the required validation fails.\n * @slot bad-input - Renders content when a required mask pattern validation fails.\n * @slot custom-error - Renders content when setCustomValidity(message) is set.\n * @slot invalid - Renders content when the component is in invalid state (validity.valid = false).\n *\n * @fires igcInput - Emitted when the control receives user input\n * @fires igcChange - Emitted when an alteration of the control's value is committed by the user\n *\n * @csspart container - The main wrapper that holds all main input elements\n * @csspart input - The native input element\n * @csspart label - The native label element\n * @csspart prefix - The prefix wrapper\n * @csspart suffix - The suffix wrapper\n * @csspart helper-text - The helper text wrapper\n */\nexport default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {\n public static readonly tagName = 'igc-mask-input';\n\n /* blazorSuppress */\n public static register() {\n registerComponent(IgcMaskInputComponent, IgcValidationContainerComponent);\n }\n\n protected override get __validators() {\n return maskValidators;\n }\n\n protected override readonly _formValue = createFormValueState(this, {\n initialValue: '',\n transformers: {\n setFormValue: (value) =>\n this._isRawMode ? value || null : this.maskedValue || null,\n },\n });\n\n protected get _isRawMode() {\n return this.valueMode === 'raw';\n }\n\n /**\n * Dictates the behavior when retrieving the value of the control:\n *\n * - `raw` will return the clean user input.\n * - `withFormatting` will return the value with all literals and prompts.\n * @attr value-mode\n */\n @property({ attribute: 'value-mode' })\n public valueMode: MaskInputValueMode = 'raw';\n\n /**\n * The value of the input.\n *\n * Regardless of the currently set `value-mode`, an empty value will return an empty string.\n * @attr\n */\n public get value(): string {\n const value = this._formValue.value;\n\n if (this._isRawMode) {\n return value;\n }\n return value ? this.maskedValue : value;\n }\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n @property()\n public set value(string: string) {\n const value = string ?? '';\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n }\n\n /**\n * The mask pattern to apply on the input.\n * @attr\n */\n @property()\n public get mask(): string {\n return this._mask;\n }\n\n /** The mask pattern to apply on the input. */\n public set mask(value: string) {\n this._mask = value;\n this.parser.mask = value;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n @watch('prompt')\n protected promptChange() {\n this.parser.prompt = this.prompt;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n protected override _restoreDefaultValue(): void {\n const value = this.defaultValue as string;\n\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n }\n\n protected async updateInput(string: string, range: MaskRange) {\n const { value, end } = this.parser.replace(\n this.maskedValue,\n string,\n range.start,\n range.end\n );\n\n this.maskedValue = value;\n this._formValue.setValueAndFormState(this.parser.parse(value));\n this.requestUpdate();\n\n if (range.start !== this.mask.length) {\n this.emitEvent('igcInput', { detail: this.value });\n }\n await this.updateComplete;\n\n this.input.setSelectionRange(end, end);\n }\n\n protected handleDragEnter() {\n if (!this.focused && !this._formValue.value) {\n this.maskedValue = this.emptyMask;\n }\n }\n\n protected handleDragLeave() {\n if (!this.focused) {\n this.updateMaskedValue();\n }\n }\n\n protected async handleFocus() {\n this.focused = true;\n\n if (this.readOnly) {\n return;\n }\n\n if (!this._formValue.value) {\n // In case of empty value, select the whole mask\n this.maskedValue = this.emptyMask;\n\n await this.updateComplete;\n this.select();\n }\n }\n\n protected override _handleBlur() {\n this.focused = false;\n this.updateMaskedValue();\n super._handleBlur();\n }\n\n protected handleChange() {\n this._setTouchedState();\n this.emitEvent('igcChange', { detail: this.value });\n }\n\n protected updateMaskedValue() {\n if (this.maskedValue === this.emptyMask) {\n this.maskedValue = '';\n }\n }\n\n protected override _updateSetRangeTextValue() {\n this.value = this.parser.parse(this.maskedValue);\n }\n\n protected override renderInput() {\n return html`\n <input\n type=\"text\"\n part=${partMap(this.resolvePartNames('input'))}\n name=${ifDefined(this.name)}\n .value=${live(this.maskedValue)}\n .placeholder=${live(this.placeholder ?? this.parser.escapedMask)}\n ?readonly=${this.readOnly}\n ?disabled=${this.disabled}\n @dragenter=${this.handleDragEnter}\n @dragleave=${this.handleDragLeave}\n @dragstart=${this.handleDragStart}\n @blur=${this._handleBlur}\n @focus=${this.handleFocus}\n @cut=${this.handleCut}\n @change=${this.handleChange}\n @click=${this.handleClick}\n @compositionstart=${this.handleCompositionStart}\n @compositionend=${this.handleCompositionEnd}\n @input=${this.handleInput}\n aria-describedby=${ifDefined(\n isEmpty(this._helperText) ? nothing : 'helper-text'\n )}\n @keydown=${this.handleKeydown}\n />\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-mask-input': IgcMaskInputComponent;\n }\n}\n"]}
1
+ {"version":3,"file":"mask-input.js","sourceRoot":"","sources":["../../../src/components/mask-input/mask-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport { createFormValueState } from '../common/mixins/forms/form-value.js';\nimport { partMap } from '../common/part-map.js';\nimport { isEmpty } from '../common/util.js';\nimport type { MaskInputValueMode } from '../types.js';\nimport IgcValidationContainerComponent from '../validation-container/validation-container.js';\nimport {\n IgcMaskInputBaseComponent,\n type MaskSelection,\n} from './mask-input-base.js';\nimport { maskValidators } from './validators.js';\n\n/**\n * A masked input is an input field where a developer can control user input and format the visible value,\n * based on configurable rules\n *\n * @element igc-mask-input\n *\n * @slot prefix - Renders content before the input\n * @slot suffix - Renders content after the input\n * @slot helper-text - Renders content below the input\n * @slot value-missing - Renders content when the required validation fails.\n * @slot bad-input - Renders content when a required mask pattern validation fails.\n * @slot custom-error - Renders content when setCustomValidity(message) is set.\n * @slot invalid - Renders content when the component is in invalid state (validity.valid = false).\n *\n * @fires igcInput - Emitted when the control receives user input\n * @fires igcChange - Emitted when an alteration of the control's value is committed by the user\n *\n * @csspart container - The main wrapper that holds all main input elements\n * @csspart input - The native input element\n * @csspart label - The native label element\n * @csspart prefix - The prefix wrapper\n * @csspart suffix - The suffix wrapper\n * @csspart helper-text - The helper text wrapper\n */\nexport default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {\n public static readonly tagName = 'igc-mask-input';\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcMaskInputComponent, IgcValidationContainerComponent);\n }\n\n //#region Internal attributes and properties\n\n protected override get __validators() {\n return maskValidators;\n }\n\n protected override readonly _formValue = createFormValueState(this, {\n initialValue: '',\n transformers: {\n setFormValue: (value) =>\n this._isRawMode ? value || null : this._maskedValue || null,\n },\n });\n\n protected get _isRawMode(): boolean {\n return this.valueMode === 'raw';\n }\n\n //#endregion\n\n //#region Public attributes and properties\n\n /**\n * Dictates the behavior when retrieving the value of the control:\n *\n * - `raw` will return the clean user input.\n * - `withFormatting` will return the value with all literals and prompts.\n *\n * @attr value-mode\n * @default 'raw'\n */\n @property({ attribute: 'value-mode' })\n public valueMode: MaskInputValueMode = 'raw';\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n /**\n * The value of the input.\n *\n * Regardless of the currently set `value-mode`, an empty value will return an empty string.\n *\n * @attr\n */\n @property()\n public set value(string: string) {\n const value = string ?? '';\n this._maskedValue = this._parser.apply(value);\n this._updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n }\n\n public get value(): string {\n const value = this._formValue.value;\n\n if (this._isRawMode) {\n return value;\n }\n return value ? this._maskedValue : value;\n }\n\n /**\n * The masked pattern of the component.\n *\n * @attr\n * @default 'CCCCCCCCCC'\n */\n @property()\n public override set mask(value: string) {\n super.mask = value;\n if (this.value) {\n this._maskedValue = this._parser.apply(this._formValue.value);\n }\n }\n\n public override get mask(): string {\n return super.mask;\n }\n\n /**\n * The prompt symbol to use for unfilled parts of the mask pattern.\n *\n * @attr\n * @default '_'\n */\n @property()\n public override set prompt(value: string) {\n super.prompt = value;\n if (this.value) {\n this._maskedValue = this._parser.apply(this._formValue.value);\n }\n }\n\n public override get prompt(): string {\n return super.prompt;\n }\n\n //#endregion\n\n //#region Event handlers\n\n protected _handleDragEnter(): void {\n if (!this._focused && !this._formValue.value) {\n this._maskedValue = this._parser.emptyMask;\n }\n }\n\n protected _handleDragLeave(): void {\n if (!this._focused) {\n this._updateMaskedValue();\n }\n }\n\n protected async _handleFocus(): Promise<void> {\n this._focused = true;\n\n if (this.readOnly) {\n return;\n }\n\n if (!this._formValue.value) {\n // In case of empty value, select the whole mask\n this._maskedValue = this._parser.emptyMask;\n\n await this.updateComplete;\n this.select();\n }\n }\n\n protected override _handleBlur(): void {\n this._focused = false;\n this._updateMaskedValue();\n super._handleBlur();\n }\n\n protected _handleChange(): void {\n this._setTouchedState();\n this.emitEvent('igcChange', { detail: this.value });\n }\n\n //#endregion\n\n //#region Internal methods\n\n protected override _restoreDefaultValue(): void {\n const value = this.defaultValue as string;\n\n this._maskedValue = this._parser.apply(value);\n this._updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n }\n\n protected async _updateInput(\n text: string,\n { start, end }: MaskSelection\n ): Promise<void> {\n const result = this._parser.replace(this._maskedValue, text, start, end);\n\n this._maskedValue = result.value;\n this._formValue.setValueAndFormState(this._parser.parse(this._maskedValue));\n this.requestUpdate();\n\n if (start !== this.mask.length) {\n this.emitEvent('igcInput', { detail: this.value });\n }\n\n await this.updateComplete;\n this.input.setSelectionRange(result.end, result.end);\n }\n\n protected override _updateSetRangeTextValue(): void {\n this.value = this._parser.parse(this._maskedValue);\n }\n\n private _updateMaskedValue(): void {\n if (this._maskedValue === this._parser.emptyMask) {\n this._maskedValue = '';\n }\n }\n\n //#endregion\n\n protected override renderInput() {\n return html`\n <input\n type=\"text\"\n part=${partMap(this.resolvePartNames('input'))}\n name=${ifDefined(this.name)}\n .value=${live(this._maskedValue)}\n .placeholder=${this.placeholder ?? this._parser.escapedMask}\n ?readonly=${this.readOnly}\n ?disabled=${this.disabled}\n @dragenter=${this._handleDragEnter}\n @dragleave=${this._handleDragLeave}\n @dragstart=${this._setMaskSelection}\n @blur=${this._handleBlur}\n @focus=${this._handleFocus}\n @cut=${this._setMaskSelection}\n @change=${this._handleChange}\n @click=${this._handleClick}\n @compositionstart=${this._handleCompositionStart}\n @compositionend=${this._handleCompositionEnd}\n @input=${this._handleInput}\n aria-describedby=${ifDefined(\n isEmpty(this._helperText) ? nothing : 'helper-text'\n )}\n @keydown=${this._setMaskSelection}\n />\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-mask-input': IgcMaskInputComponent;\n }\n}\n"]}
@@ -46,6 +46,10 @@ export declare class MaskParser {
46
46
  * This is the mask after processing any escape sequences.
47
47
  */
48
48
  get escapedMask(): string;
49
+ /**
50
+ * Returns the result of applying an empty string over the mask pattern.
51
+ */
52
+ get emptyMask(): string;
49
53
  /**
50
54
  * Gets the unescaped mask string (the original format string).
51
55
  * If the mask has no escape sequences, then `mask === escapedMask`.
@@ -39,6 +39,9 @@ export class MaskParser {
39
39
  get escapedMask() {
40
40
  return this._escapedMask;
41
41
  }
42
+ get emptyMask() {
43
+ return this.apply();
44
+ }
42
45
  get mask() {
43
46
  return this._options.format;
44
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mask-parser.js","sourceRoot":"","sources":["../../../src/components/mask-input/mask-parser.ts"],"names":[],"mappings":"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","sourcesContent":["/** Options for the {@link MaskParser} */\ninterface MaskOptions {\n /**\n * The mask format string (e.g., '00/00/0000' for dates, 'AAA-000' for custom IDs).\n *\n * Supported flags: a, A, C, L, 0, 9, #, &, ?.\n *\n * Use `'\\'` to escape a flag character if it should be treated as a literal.\n * @default 'CCCCCCCCCC'\n */\n format: string;\n\n /**\n * The character used to prompt for input in unfilled mask positions.\n * Must be a single character.\n * @default '_'\n */\n promptCharacter: string;\n}\n\n/**\n * Result type for the replace operation, containing the new masked value and the\n * ideal cursor position.\n */\ntype MaskReplaceResult = {\n value: string;\n end: number;\n};\n\nconst MASK_FLAGS = new Set('aACL09#&?');\nconst MASK_REQUIRED_FLAGS = new Set('0#LA&');\n\nconst MASK_PATTERNS = new Map([\n ['C', /(?!^$)/u], // Non-empty (any character that is not an empty string)\n ['&', /[^\\p{Separator}]/u], // Any non-whitespace character (Unicode-aware)\n ['a', /[\\p{Letter}\\p{Number}\\p{Separator}]/u], // Alphanumeric and whitespace (Unicode-aware)\n ['A', /[\\p{Letter}\\p{Number}]/u], // Alphanumeric (Unicode-aware)\n ['?', /[\\p{Letter}\\p{Separator}]/u], // Alpha and whitespace (Unicode-aware)\n ['L', /\\p{Letter}/u], // Alphabetic (Unicode-aware)\n ['0', /\\p{Number}/u], // Numeric (0-9) (Unicode-aware)\n ['9', /[\\p{Number}\\p{Separator}]/u], // Numeric and whitespace (Unicode-aware)\n ['#', /[\\p{Number}\\-+]/u], // Numeric and sign characters (+, -)\n]);\n\nfunction replaceIMENumbers(string: string): string {\n return string.replace(\n /[0123456789]/g,\n (num) =>\n ({\n '1': '1',\n '2': '2',\n '3': '3',\n '4': '4',\n '5': '5',\n '6': '6',\n '7': '7',\n '8': '8',\n '9': '9',\n '0': '0',\n })[num] as string\n );\n}\n\nfunction validate(char: string, flag: string): boolean {\n return MASK_PATTERNS.get(flag)?.test(char) ?? false;\n}\n\n/** Default mask parser options */\nconst MaskDefaultOptions: MaskOptions = {\n format: 'CCCCCCCCCC',\n promptCharacter: '_',\n};\n\n/**\n * A class for parsing and applying masks to strings, typically for input fields.\n * It handles mask definitions, literals, character validation, and cursor positioning.\n */\nexport class MaskParser {\n protected readonly _options: MaskOptions;\n\n /** Stores literal characters and their original positions in the mask (e.g., '(', ')', '-'). */\n protected readonly _literals = new Map<number, string>();\n\n /** A Set of positions where literals occur in the `_escapedMask`. */\n protected _literalPositions = new Set<number>();\n\n /** The mask format after processing escape characters */\n protected _escapedMask = '';\n\n /**\n * Returns a set of the all the literal positions in the mask.\n * These positions are fixed characters that are not part of the input.\n */\n public get literalPositions(): Set<number> {\n return this._literalPositions;\n }\n\n /**\n * Returns the escaped mask string.\n * This is the mask after processing any escape sequences.\n */\n public get escapedMask(): string {\n return this._escapedMask;\n }\n\n /**\n * Gets the unescaped mask string (the original format string).\n * If the mask has no escape sequences, then `mask === escapedMask`.\n */\n public get mask(): string {\n return this._options.format;\n }\n\n /**\n * Sets the mask of the parser.\n * When the mask is set, it triggers a re-parsing of the mask literals and escaped mask.\n */\n public set mask(value: string) {\n this._options.format = value || this._options.format;\n this._parseMaskLiterals();\n }\n\n /**\n * Gets the prompt character used for unfilled mask positions.\n */\n public get prompt(): string {\n return this._options.promptCharacter;\n }\n\n /**\n * Sets the prompt character. Only the first character of the provided string is used.\n */\n public set prompt(value: string) {\n this._options.promptCharacter = value\n ? value.substring(0, 1)\n : this._options.promptCharacter;\n }\n\n constructor(options?: MaskOptions) {\n this._options = { ...MaskDefaultOptions, ...options };\n this._parseMaskLiterals();\n }\n\n /**\n * Parses the mask format string to identify literal characters and\n * create the escaped mask. This method is called whenever the mask format changes.\n */\n protected _parseMaskLiterals(): void {\n const mask = this.mask;\n const length = mask.length;\n const escapedMaskChars: string[] = [];\n\n let currentPos = 0;\n\n this._literals.clear();\n\n for (let i = 0; i < length; i++) {\n const [current, next] = [mask.charAt(i), mask.charAt(i + 1)];\n\n if (current === '\\\\' && MASK_FLAGS.has(next)) {\n // Escaped character - push next as a literal character and skip processing it\n this._literals.set(currentPos, next);\n escapedMaskChars.push(next);\n i++;\n } else if (MASK_FLAGS.has(current)) {\n // Regular flag character\n escapedMaskChars.push(current);\n } else {\n // Literal character\n this._literals.set(currentPos, current);\n escapedMaskChars.push(current);\n }\n\n currentPos++;\n }\n\n this._escapedMask = escapedMaskChars.join('');\n this._literalPositions = new Set(this._literals.keys());\n }\n\n /**\n * Gets an array of positions in the escaped mask that correspond to\n * required input flags (e.g., '0', 'L') and are not literal characters.\n *\n * These positions must be filled for the masked string to be valid.\n */\n protected _getRequiredNonLiteralPositions(): number[] {\n const literalPositions = this.literalPositions;\n const escapedMask = this._escapedMask;\n const length = escapedMask.length;\n const result: number[] = [];\n\n for (let i = 0; i < length; i++) {\n const char = escapedMask[i];\n if (MASK_REQUIRED_FLAGS.has(char) && !literalPositions.has(i)) {\n result.push(i);\n }\n }\n\n return result;\n }\n\n /**\n * Finds the closest non-literal position in the mask *before* the given start position.\n * Useful for backward navigation (e.g., backspace).\n *\n * @remarks\n * If no non-literal is found before `start`, return `start`.\n */\n public getPreviousNonLiteralPosition(start: number): number {\n const literalPositions = this.literalPositions;\n\n for (let i = start; i > 0; i--) {\n if (!literalPositions.has(i)) {\n return i;\n }\n }\n\n return start;\n }\n\n /**\n * Finds the closest non-literal position in the mask *after* the given start position.\n * Useful for forward navigation (e.g., arrow keys, delete key or initial cursor placement).\n *\n * @remarks\n * If no non-literal is found after `start`, return `start`.\n */\n public getNextNonLiteralPosition(start: number): number {\n const literalPositions = this.literalPositions;\n const length = this._escapedMask.length;\n\n for (let i = start; i < length; i++) {\n if (!literalPositions.has(i)) {\n return i;\n }\n }\n\n return start;\n }\n\n /**\n * Replaces a segment of the masked string with new input, simulating typing or pasting.\n * It handles clearing the selected range and inserting new characters according to the mask.\n */\n public replace(\n maskString: string,\n value: string,\n start: number,\n end: number\n ): MaskReplaceResult {\n const literalPositions = this.literalPositions;\n const escapedMask = this._escapedMask;\n const length = this._escapedMask.length;\n const prompt = this.prompt;\n const endBoundary = Math.min(end, length);\n\n // Initialize the array for the masked string or get a fresh mask with prompts and/or literals\n const maskedChars = Array.from(maskString || this.apply(''));\n\n const inputChars = Array.from(replaceIMENumbers(value));\n const inputLength = inputChars.length;\n\n // Clear any non-literal positions from `start` to `endBoundary`\n for (let i = start; i < endBoundary; i++) {\n if (!literalPositions.has(i)) {\n maskedChars[i] = prompt;\n }\n }\n\n let cursor = start;\n let inputIndex = 0;\n let maskPosition = start;\n\n // Iterate through the mask starting at `start` as long as there are input characters and mask positions available\n // and start placing characters or skipping literals and invalid characters\n for (; maskPosition < length && inputIndex < inputLength; maskPosition++) {\n if (literalPositions.has(maskPosition)) {\n cursor = maskPosition + 1;\n continue;\n }\n\n const char = inputChars[inputIndex];\n\n if (validate(char, escapedMask[maskPosition]) && char !== prompt) {\n maskedChars[maskPosition] = char;\n cursor = maskPosition + 1;\n inputIndex++;\n } else {\n inputIndex++;\n maskPosition--;\n }\n }\n\n // Move the cursor to the next non-literal position or the end of the mask\n while (cursor < length && literalPositions.has(cursor)) {\n cursor++;\n }\n\n return {\n value: maskedChars.join(''),\n end: cursor,\n };\n }\n\n /**\n * Parses the masked string, extracting only the valid input characters.\n * This effectively \"unmasks\" the string, removing prompts and literals.\n */\n public parse(masked = ''): string {\n const literalPositions = this.literalPositions;\n const prompt = this.prompt;\n const length = masked.length;\n\n let result = '';\n\n for (let i = 0; i < length; i++) {\n const char = masked[i];\n if (!literalPositions.has(i) && char !== prompt) {\n result += char;\n }\n }\n\n return result;\n }\n\n /**\n * Checks if the masked string is valid, specifically if all required mask positions are filled\n * with valid, non-prompt characters.\n */\n public isValidString(input = ''): boolean {\n const prompt = this.prompt;\n\n return this._getRequiredNonLiteralPositions().every((position) => {\n const char = input.charAt(position);\n return (\n validate(char, this._escapedMask.charAt(position)) && char !== prompt\n );\n });\n }\n\n /**\n * Applies the mask format to an input string. This attempts to fit the input\n * into the mask from left to right, filling valid positions and skipping invalid\n * input characters.\n */\n public apply(input = ''): string {\n const literals = this._literals;\n const prompt = this.prompt;\n const escapedMask = this._escapedMask;\n const length = escapedMask.length;\n const inputLength = input.length;\n\n // Initialize the result array with prompt characters\n const result = new Array(escapedMask.length).fill(prompt);\n\n // Place all literal characters into the result array\n for (const [position, literal] of literals.entries()) {\n result[position] = literal;\n }\n\n if (!input) {\n return result.join('');\n }\n\n let inputIndex = 0;\n\n // Iterate through the mask placing input characters skipping literals and invalid ones\n for (let i = 0; i < length; i++) {\n if (inputIndex >= inputLength) {\n break;\n }\n\n if (literals.has(i)) {\n continue;\n }\n\n if (validate(input.charAt(inputIndex), escapedMask.charAt(i))) {\n result[i] = input.charAt(inputIndex);\n }\n\n inputIndex++;\n }\n\n return result.join('');\n }\n}\n"]}
1
+ {"version":3,"file":"mask-parser.js","sourceRoot":"","sources":["../../../src/components/mask-input/mask-parser.ts"],"names":[],"mappings":"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","sourcesContent":["/** Options for the {@link MaskParser} */\ninterface MaskOptions {\n /**\n * The mask format string (e.g., '00/00/0000' for dates, 'AAA-000' for custom IDs).\n *\n * Supported flags: a, A, C, L, 0, 9, #, &, ?.\n *\n * Use `'\\'` to escape a flag character if it should be treated as a literal.\n * @default 'CCCCCCCCCC'\n */\n format: string;\n\n /**\n * The character used to prompt for input in unfilled mask positions.\n * Must be a single character.\n * @default '_'\n */\n promptCharacter: string;\n}\n\n/**\n * Result type for the replace operation, containing the new masked value and the\n * ideal cursor position.\n */\ntype MaskReplaceResult = {\n value: string;\n end: number;\n};\n\nconst MASK_FLAGS = new Set('aACL09#&?');\nconst MASK_REQUIRED_FLAGS = new Set('0#LA&');\n\nconst MASK_PATTERNS = new Map([\n ['C', /(?!^$)/u], // Non-empty (any character that is not an empty string)\n ['&', /[^\\p{Separator}]/u], // Any non-whitespace character (Unicode-aware)\n ['a', /[\\p{Letter}\\p{Number}\\p{Separator}]/u], // Alphanumeric and whitespace (Unicode-aware)\n ['A', /[\\p{Letter}\\p{Number}]/u], // Alphanumeric (Unicode-aware)\n ['?', /[\\p{Letter}\\p{Separator}]/u], // Alpha and whitespace (Unicode-aware)\n ['L', /\\p{Letter}/u], // Alphabetic (Unicode-aware)\n ['0', /\\p{Number}/u], // Numeric (0-9) (Unicode-aware)\n ['9', /[\\p{Number}\\p{Separator}]/u], // Numeric and whitespace (Unicode-aware)\n ['#', /[\\p{Number}\\-+]/u], // Numeric and sign characters (+, -)\n]);\n\nfunction replaceIMENumbers(string: string): string {\n return string.replace(\n /[0123456789]/g,\n (num) =>\n ({\n '1': '1',\n '2': '2',\n '3': '3',\n '4': '4',\n '5': '5',\n '6': '6',\n '7': '7',\n '8': '8',\n '9': '9',\n '0': '0',\n })[num] as string\n );\n}\n\nfunction validate(char: string, flag: string): boolean {\n return MASK_PATTERNS.get(flag)?.test(char) ?? false;\n}\n\n/** Default mask parser options */\nconst MaskDefaultOptions: MaskOptions = {\n format: 'CCCCCCCCCC',\n promptCharacter: '_',\n};\n\n/**\n * A class for parsing and applying masks to strings, typically for input fields.\n * It handles mask definitions, literals, character validation, and cursor positioning.\n */\nexport class MaskParser {\n protected readonly _options: MaskOptions;\n\n /** Stores literal characters and their original positions in the mask (e.g., '(', ')', '-'). */\n protected readonly _literals = new Map<number, string>();\n\n /** A Set of positions where literals occur in the `_escapedMask`. */\n protected _literalPositions = new Set<number>();\n\n /** The mask format after processing escape characters */\n protected _escapedMask = '';\n\n /**\n * Returns a set of the all the literal positions in the mask.\n * These positions are fixed characters that are not part of the input.\n */\n public get literalPositions(): Set<number> {\n return this._literalPositions;\n }\n\n /**\n * Returns the escaped mask string.\n * This is the mask after processing any escape sequences.\n */\n public get escapedMask(): string {\n return this._escapedMask;\n }\n\n /**\n * Returns the result of applying an empty string over the mask pattern.\n */\n public get emptyMask(): string {\n return this.apply();\n }\n\n /**\n * Gets the unescaped mask string (the original format string).\n * If the mask has no escape sequences, then `mask === escapedMask`.\n */\n public get mask(): string {\n return this._options.format;\n }\n\n /**\n * Sets the mask of the parser.\n * When the mask is set, it triggers a re-parsing of the mask literals and escaped mask.\n */\n public set mask(value: string) {\n this._options.format = value || this._options.format;\n this._parseMaskLiterals();\n }\n\n /**\n * Gets the prompt character used for unfilled mask positions.\n */\n public get prompt(): string {\n return this._options.promptCharacter;\n }\n\n /**\n * Sets the prompt character. Only the first character of the provided string is used.\n */\n public set prompt(value: string) {\n this._options.promptCharacter = value\n ? value.substring(0, 1)\n : this._options.promptCharacter;\n }\n\n constructor(options?: MaskOptions) {\n this._options = { ...MaskDefaultOptions, ...options };\n this._parseMaskLiterals();\n }\n\n /**\n * Parses the mask format string to identify literal characters and\n * create the escaped mask. This method is called whenever the mask format changes.\n */\n protected _parseMaskLiterals(): void {\n const mask = this.mask;\n const length = mask.length;\n const escapedMaskChars: string[] = [];\n\n let currentPos = 0;\n\n this._literals.clear();\n\n for (let i = 0; i < length; i++) {\n const [current, next] = [mask.charAt(i), mask.charAt(i + 1)];\n\n if (current === '\\\\' && MASK_FLAGS.has(next)) {\n // Escaped character - push next as a literal character and skip processing it\n this._literals.set(currentPos, next);\n escapedMaskChars.push(next);\n i++;\n } else if (MASK_FLAGS.has(current)) {\n // Regular flag character\n escapedMaskChars.push(current);\n } else {\n // Literal character\n this._literals.set(currentPos, current);\n escapedMaskChars.push(current);\n }\n\n currentPos++;\n }\n\n this._escapedMask = escapedMaskChars.join('');\n this._literalPositions = new Set(this._literals.keys());\n }\n\n /**\n * Gets an array of positions in the escaped mask that correspond to\n * required input flags (e.g., '0', 'L') and are not literal characters.\n *\n * These positions must be filled for the masked string to be valid.\n */\n protected _getRequiredNonLiteralPositions(): number[] {\n const literalPositions = this.literalPositions;\n const escapedMask = this._escapedMask;\n const length = escapedMask.length;\n const result: number[] = [];\n\n for (let i = 0; i < length; i++) {\n const char = escapedMask[i];\n if (MASK_REQUIRED_FLAGS.has(char) && !literalPositions.has(i)) {\n result.push(i);\n }\n }\n\n return result;\n }\n\n /**\n * Finds the closest non-literal position in the mask *before* the given start position.\n * Useful for backward navigation (e.g., backspace).\n *\n * @remarks\n * If no non-literal is found before `start`, return `start`.\n */\n public getPreviousNonLiteralPosition(start: number): number {\n const literalPositions = this.literalPositions;\n\n for (let i = start; i > 0; i--) {\n if (!literalPositions.has(i)) {\n return i;\n }\n }\n\n return start;\n }\n\n /**\n * Finds the closest non-literal position in the mask *after* the given start position.\n * Useful for forward navigation (e.g., arrow keys, delete key or initial cursor placement).\n *\n * @remarks\n * If no non-literal is found after `start`, return `start`.\n */\n public getNextNonLiteralPosition(start: number): number {\n const literalPositions = this.literalPositions;\n const length = this._escapedMask.length;\n\n for (let i = start; i < length; i++) {\n if (!literalPositions.has(i)) {\n return i;\n }\n }\n\n return start;\n }\n\n /**\n * Replaces a segment of the masked string with new input, simulating typing or pasting.\n * It handles clearing the selected range and inserting new characters according to the mask.\n */\n public replace(\n maskString: string,\n value: string,\n start: number,\n end: number\n ): MaskReplaceResult {\n const literalPositions = this.literalPositions;\n const escapedMask = this._escapedMask;\n const length = this._escapedMask.length;\n const prompt = this.prompt;\n const endBoundary = Math.min(end, length);\n\n // Initialize the array for the masked string or get a fresh mask with prompts and/or literals\n const maskedChars = Array.from(maskString || this.apply(''));\n\n const inputChars = Array.from(replaceIMENumbers(value));\n const inputLength = inputChars.length;\n\n // Clear any non-literal positions from `start` to `endBoundary`\n for (let i = start; i < endBoundary; i++) {\n if (!literalPositions.has(i)) {\n maskedChars[i] = prompt;\n }\n }\n\n let cursor = start;\n let inputIndex = 0;\n let maskPosition = start;\n\n // Iterate through the mask starting at `start` as long as there are input characters and mask positions available\n // and start placing characters or skipping literals and invalid characters\n for (; maskPosition < length && inputIndex < inputLength; maskPosition++) {\n if (literalPositions.has(maskPosition)) {\n cursor = maskPosition + 1;\n continue;\n }\n\n const char = inputChars[inputIndex];\n\n if (validate(char, escapedMask[maskPosition]) && char !== prompt) {\n maskedChars[maskPosition] = char;\n cursor = maskPosition + 1;\n inputIndex++;\n } else {\n inputIndex++;\n maskPosition--;\n }\n }\n\n // Move the cursor to the next non-literal position or the end of the mask\n while (cursor < length && literalPositions.has(cursor)) {\n cursor++;\n }\n\n return {\n value: maskedChars.join(''),\n end: cursor,\n };\n }\n\n /**\n * Parses the masked string, extracting only the valid input characters.\n * This effectively \"unmasks\" the string, removing prompts and literals.\n */\n public parse(masked = ''): string {\n const literalPositions = this.literalPositions;\n const prompt = this.prompt;\n const length = masked.length;\n\n let result = '';\n\n for (let i = 0; i < length; i++) {\n const char = masked[i];\n if (!literalPositions.has(i) && char !== prompt) {\n result += char;\n }\n }\n\n return result;\n }\n\n /**\n * Checks if the masked string is valid, specifically if all required mask positions are filled\n * with valid, non-prompt characters.\n */\n public isValidString(input = ''): boolean {\n const prompt = this.prompt;\n\n return this._getRequiredNonLiteralPositions().every((position) => {\n const char = input.charAt(position);\n return (\n validate(char, this._escapedMask.charAt(position)) && char !== prompt\n );\n });\n }\n\n /**\n * Applies the mask format to an input string. This attempts to fit the input\n * into the mask from left to right, filling valid positions and skipping invalid\n * input characters.\n */\n public apply(input = ''): string {\n const literals = this._literals;\n const prompt = this.prompt;\n const escapedMask = this._escapedMask;\n const length = escapedMask.length;\n const inputLength = input.length;\n\n // Initialize the result array with prompt characters\n const result = new Array(escapedMask.length).fill(prompt);\n\n // Place all literal characters into the result array\n for (const [position, literal] of literals.entries()) {\n result[position] = literal;\n }\n\n if (!input) {\n return result.join('');\n }\n\n let inputIndex = 0;\n\n // Iterate through the mask placing input characters skipping literals and invalid ones\n for (let i = 0; i < length; i++) {\n if (inputIndex >= inputLength) {\n break;\n }\n\n if (literals.has(i)) {\n continue;\n }\n\n if (validate(input.charAt(inputIndex), escapedMask.charAt(i))) {\n result[i] = input.charAt(inputIndex);\n }\n\n inputIndex++;\n }\n\n return result.join('');\n }\n}\n"]}
@@ -5,7 +5,7 @@ export const maskValidators = [
5
5
  {
6
6
  key: 'badInput',
7
7
  message: messages.mask,
8
- isValid: ({ parser, maskedValue }) => parser.isValidString(maskedValue),
8
+ isValid: ({ _parser, _maskedValue }) => _parser.isValidString(_maskedValue),
9
9
  },
10
10
  ];
11
11
  //# sourceMappingURL=validators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/components/mask-input/validators.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,yCAAyC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAkB,MAAM,yBAAyB,CAAC;AAG5E,MAAM,CAAC,MAAM,cAAc,GAAuC;IAChE,iBAAiB;IACjB;QACE,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,QAAQ,CAAC,IAAI;QAEtB,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;KACxE;CACF,CAAC","sourcesContent":["import messages from '../common/localization/validation-en.js';\nimport { requiredValidator, type Validator } from '../common/validators.js';\nimport type IgcMaskInputComponent from './mask-input.js';\n\nexport const maskValidators: Validator<IgcMaskInputComponent>[] = [\n requiredValidator,\n {\n key: 'badInput',\n message: messages.mask,\n // @ts-expect-error - protected access\n isValid: ({ parser, maskedValue }) => parser.isValidString(maskedValue),\n },\n];\n"]}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/components/mask-input/validators.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,yCAAyC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAkB,MAAM,yBAAyB,CAAC;AAG5E,MAAM,CAAC,MAAM,cAAc,GAAuC;IAChE,iBAAiB;IACjB;QACE,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,QAAQ,CAAC,IAAI;QAEtB,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC;KAC5E;CACF,CAAC","sourcesContent":["import messages from '../common/localization/validation-en.js';\nimport { requiredValidator, type Validator } from '../common/validators.js';\nimport type IgcMaskInputComponent from './mask-input.js';\n\nexport const maskValidators: Validator<IgcMaskInputComponent>[] = [\n requiredValidator,\n {\n key: 'badInput',\n message: messages.mask,\n // @ts-expect-error - protected access\n isValid: ({ _parser, _maskedValue }) => _parser.isValidString(_maskedValue),\n },\n];\n"]}