gitextract_lbehwmqa/ ├── .cspell.json ├── .editorconfig ├── .firebaserc ├── .github/ │ ├── CODEOWNERS │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── ISSUE_TEMPLATE/ │ │ ├── 1-bug-report.yml │ │ ├── 2-feature-request.yml │ │ └── 3-documentation.yml │ ├── renovate.json │ └── workflows/ │ ├── assign-author.yml │ ├── auto-merge.yml │ ├── build.yml │ ├── deploy-preview.yml │ ├── deploy.yml │ ├── e2e.yml │ ├── lint.yml │ ├── release.yml │ └── test.yml ├── .gitignore ├── .husky/ │ ├── commit-msg │ └── pre-commit ├── .npmrc ├── .release-it.js ├── .ws-context ├── CHANGELOG.md ├── LICENSE ├── README.md ├── codecov.yml ├── eslint.config.ts ├── firebase.json ├── jest.config.ts ├── jest.preset.js ├── nx.json ├── package.json ├── projects/ │ ├── angular/ │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── ng-package.json │ │ ├── package.json │ │ ├── project.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── lib/ │ │ │ │ ├── maskito.directive.ts │ │ │ │ ├── maskito.pipe.ts │ │ │ │ ├── pattern.directive.ts │ │ │ │ └── tests/ │ │ │ │ ├── maskito.directive.spec.ts │ │ │ │ └── maskito.spec.ts │ │ │ └── test-setup.ts │ │ └── tsconfig.lib.prod.json │ ├── core/ │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── package.json │ │ ├── project.json │ │ └── src/ │ │ ├── index.ts │ │ └── lib/ │ │ ├── classes/ │ │ │ ├── index.ts │ │ │ ├── mask-history.ts │ │ │ └── mask-model/ │ │ │ ├── mask-model.ts │ │ │ ├── tests/ │ │ │ │ ├── dynamic-mask.spec.ts │ │ │ │ └── mask-model-fixed-characters.spec.ts │ │ │ └── utils/ │ │ │ ├── apply-overwrite-mode.ts │ │ │ ├── calibrate-value-by-mask.ts │ │ │ ├── get-leading-fixed-characters.ts │ │ │ ├── guess-valid-value-by-pattern.ts │ │ │ ├── guess-valid-value-by-reg-exp.ts │ │ │ ├── is-fixed-character.ts │ │ │ ├── remove-fixed-mask-characters.ts │ │ │ └── validate-value-with-mask.ts │ │ ├── constants/ │ │ │ ├── default-element-predicate.ts │ │ │ ├── default-options.ts │ │ │ └── index.ts │ │ ├── mask.ts │ │ ├── plugins/ │ │ │ ├── broken-prevent-default.plugin.ts │ │ │ ├── change-event-plugin.ts │ │ │ ├── double-space.plugin.ts │ │ │ ├── index.ts │ │ │ ├── initial-calibration-plugin.ts │ │ │ └── strict-composition-plugin.ts │ │ ├── types/ │ │ │ ├── element-predicate.ts │ │ │ ├── element-state.ts │ │ │ ├── index.ts │ │ │ ├── mask-options.ts │ │ │ ├── mask-processors.ts │ │ │ ├── mask.ts │ │ │ ├── maskito-element.ts │ │ │ ├── plugin.ts │ │ │ ├── selection-range.ts │ │ │ └── typed-input-event.ts │ │ └── utils/ │ │ ├── content-editable.ts │ │ ├── dom/ │ │ │ ├── event-listener.ts │ │ │ ├── get-content-editable-selection.ts │ │ │ ├── history-events.ts │ │ │ ├── hotkey.ts │ │ │ ├── set-content-editable-selection.ts │ │ │ └── update-element.ts │ │ ├── element-states-equality.ts │ │ ├── get-line-selection.ts │ │ ├── get-not-empty-selection.ts │ │ ├── get-word-selection.ts │ │ ├── index.ts │ │ ├── pipe.ts │ │ ├── test/ │ │ │ ├── get-not-empty-selection.spec.ts │ │ │ ├── get-word-selection.spec.ts │ │ │ ├── pipe.spec.ts │ │ │ └── transform.spec.ts │ │ └── transform.ts │ ├── demo/ │ │ ├── .gitignore │ │ ├── esbuild-plugins/ │ │ │ ├── maskito-as-taiga-ui-dep.plugin.js │ │ │ └── vue-esm.plugin.js │ │ ├── jest.config.ts │ │ ├── package.json │ │ ├── project.json │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── app.component.html │ │ │ │ ├── app.component.spec.ts │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── app.routes.ts │ │ │ │ ├── app.style.less │ │ │ │ ├── constants/ │ │ │ │ │ ├── demo-path.ts │ │ │ │ │ ├── doc-example-primary-tab.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── modules/ │ │ │ │ │ ├── example-primary-tabs-icons/ │ │ │ │ │ │ ├── angular-logo.component.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── javascript-logo.component.ts │ │ │ │ │ │ ├── react-logo.component.ts │ │ │ │ │ │ └── vue-logo.component.ts │ │ │ │ │ └── logo/ │ │ │ │ │ ├── logo.component.ts │ │ │ │ │ ├── logo.style.less │ │ │ │ │ └── logo.template.html │ │ │ │ ├── server-error-handler.ts │ │ │ │ └── utils/ │ │ │ │ ├── add-default-tabs-processor/ │ │ │ │ │ ├── add-default-tabs-processor.ts │ │ │ │ │ └── default-tabs/ │ │ │ │ │ ├── angular-default-tab.ts │ │ │ │ │ ├── js-default-tab.ts │ │ │ │ │ ├── react-default-tab.ts │ │ │ │ │ └── vue-default-tab.ts │ │ │ │ └── index.ts │ │ │ ├── assets/ │ │ │ │ └── manifest.webmanifest │ │ │ ├── environments/ │ │ │ │ ├── environment.prod.ts │ │ │ │ └── environment.ts │ │ │ ├── index.html │ │ │ ├── main.server.ts │ │ │ ├── main.ts │ │ │ ├── pages/ │ │ │ │ ├── documentation/ │ │ │ │ │ ├── browser-support/ │ │ │ │ │ │ ├── browser-support.component.ts │ │ │ │ │ │ └── browser-support.template.html │ │ │ │ │ ├── core-concepts-overview/ │ │ │ │ │ │ ├── core-concepts-overview.component.ts │ │ │ │ │ │ ├── core-concepts-overview.styles.less │ │ │ │ │ │ ├── core-concepts-overview.template.html │ │ │ │ │ │ └── examples/ │ │ │ │ │ │ └── maskito-public-api-demo.md │ │ │ │ │ ├── element-state/ │ │ │ │ │ │ ├── element-state.component.ts │ │ │ │ │ │ ├── element-state.template.html │ │ │ │ │ │ └── examples/ │ │ │ │ │ │ └── element-state-demo.md │ │ │ │ │ ├── mask-expression/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── basic-time-example.md │ │ │ │ │ │ │ ├── dynamic-mask-expression-demo.md │ │ │ │ │ │ │ └── reg-exp-mask-expression-demo.md │ │ │ │ │ │ ├── mask-expression.component.ts │ │ │ │ │ │ └── mask-expression.template.html │ │ │ │ │ ├── maskito-libraries/ │ │ │ │ │ │ ├── maskito-libraries.component.ts │ │ │ │ │ │ └── maskito-libraries.template.html │ │ │ │ │ ├── next-steps/ │ │ │ │ │ │ ├── next-steps.component.ts │ │ │ │ │ │ └── next-steps.template.html │ │ │ │ │ ├── overwrite-mode/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── dynamic/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── replace/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── shift/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── overwrite-mode.component.ts │ │ │ │ │ │ └── overwrite-mode.template.html │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-initial-calibration/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 2-strict-composition/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 3-change-event/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── oversimplified-number-mask.md │ │ │ │ │ │ │ └── pads-zero-plugin.ts │ │ │ │ │ │ ├── plugins.component.ts │ │ │ │ │ │ ├── plugins.style.less │ │ │ │ │ │ └── plugins.template.html │ │ │ │ │ ├── processors/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── postprocessor-in-action.md │ │ │ │ │ │ │ ├── preprocessor-first-arg-demo.md │ │ │ │ │ │ │ ├── preprocessor-in-action-demo.md │ │ │ │ │ │ │ └── processor-second-arg-demo.md │ │ │ │ │ │ ├── processors.component.ts │ │ │ │ │ │ └── processors.template.html │ │ │ │ │ ├── real-world-form/ │ │ │ │ │ │ ├── index.html │ │ │ │ │ │ ├── index.less │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── supported-input-types/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── password/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── tel/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── text/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── url/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── supported-input-types.component.ts │ │ │ │ │ │ └── supported-input-types.template.html │ │ │ │ │ ├── transformer/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ └── utility-in-action-demo.md │ │ │ │ │ │ ├── transformer.component.ts │ │ │ │ │ │ └── transformer.template.html │ │ │ │ │ └── what-is-maskito/ │ │ │ │ │ ├── what-is-maskito.component.ts │ │ │ │ │ ├── what-is-maskito.style.less │ │ │ │ │ └── what-is-maskito.template.html │ │ │ │ ├── frameworks/ │ │ │ │ │ ├── angular/ │ │ │ │ │ │ ├── angular-doc.component.ts │ │ │ │ │ │ ├── angular-doc.template.html │ │ │ │ │ │ └── examples/ │ │ │ │ │ │ ├── 1-nested/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── template.html │ │ │ │ │ │ ├── 2-nested/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── template.html │ │ │ │ │ │ ├── 3-programmatically/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── template.html │ │ │ │ │ │ ├── 4-pipe/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── template.html │ │ │ │ │ │ ├── 5-custom-unmask-handler/ │ │ │ │ │ │ │ ├── index.html │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── unmask.directive.ts │ │ │ │ │ │ ├── 6-pattern/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── template.html │ │ │ │ │ │ ├── basic-directive-approach.md │ │ │ │ │ │ ├── custom-input-example.md │ │ │ │ │ │ └── import-maskito.md │ │ │ │ │ ├── react/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-use-maskito-basic-usage/ │ │ │ │ │ │ │ │ ├── example.component.tsx │ │ │ │ │ │ │ │ └── useMaskitoBasicUsage.tsx │ │ │ │ │ │ │ ├── 2-element-predicate/ │ │ │ │ │ │ │ │ ├── awesomeInput.tsx │ │ │ │ │ │ │ │ ├── example.component.tsx │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── 3-merge-ref/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── 3-react-hook-form/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── with-maskito-register.ts │ │ │ │ │ │ │ ├── best-bad-practice.md │ │ │ │ │ │ │ ├── controlled-input.md │ │ │ │ │ │ │ └── merge-ref.md │ │ │ │ │ │ ├── react-doc.component.ts │ │ │ │ │ │ ├── react-doc.style.less │ │ │ │ │ │ └── react-doc.template.html │ │ │ │ │ └── vue/ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── best-bad-practice.md │ │ │ │ │ │ ├── query-nested-input.md │ │ │ │ │ │ ├── use-maskito-basic-usage.md │ │ │ │ │ │ └── vue-1/ │ │ │ │ │ │ └── component.ts │ │ │ │ │ ├── vue-doc.component.ts │ │ │ │ │ └── vue-doc.template.html │ │ │ │ ├── kit/ │ │ │ │ │ ├── date/ │ │ │ │ │ │ ├── date-mask-doc.component.ts │ │ │ │ │ │ ├── date-mask-doc.style.less │ │ │ │ │ │ ├── date-mask-doc.template.html │ │ │ │ │ │ └── examples/ │ │ │ │ │ │ ├── 1-localization/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 2-min-max/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ └── maskito-parse-stringify-date-demo.md │ │ │ │ │ ├── date-range/ │ │ │ │ │ │ ├── date-range-mask-doc.component.ts │ │ │ │ │ │ ├── date-range-mask-doc.template.html │ │ │ │ │ │ └── examples/ │ │ │ │ │ │ ├── 1-date-localization/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 2-min-max/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 3-min-max-length/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ └── 4-range-separator/ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ └── mask.ts │ │ │ │ │ ├── date-time/ │ │ │ │ │ │ ├── date-time-mask-doc.component.ts │ │ │ │ │ │ ├── date-time-mask-doc.template.html │ │ │ │ │ │ └── examples/ │ │ │ │ │ │ ├── 1-date-time-localization/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 2-date-time-separator/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 3-min-max/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 4-time-step/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 5-am-pm/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ └── maskito-parse-stringify-date-time-demo.md │ │ │ │ │ ├── number/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-high-precision/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 2-separators/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 3-postfix/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 4-decimal-zero-padding/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 5-custom-minus-sign/ │ │ │ │ │ │ │ │ ├── components.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 6-minus-before-prefix/ │ │ │ │ │ │ │ │ ├── components.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 7-dynamic-decimal-zero-padding/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 8-thousand-separator-pattern/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── 9-thousand-separator-pattern-intl/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ │ ├── parse-number-as-bigint-type.md │ │ │ │ │ │ │ ├── parse-number-as-number-type.md │ │ │ │ │ │ │ ├── parse-number-invalid-usage.md │ │ │ │ │ │ │ └── stringify-number.md │ │ │ │ │ │ ├── number-mask-doc.component.ts │ │ │ │ │ │ └── number-mask-doc.template.html │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-selection-handler/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 2-caret-guard/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 3-event-handlers/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── 4-reject/ │ │ │ │ │ │ │ ├── animation.css │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── kit-plugins-doc.component.ts │ │ │ │ │ │ └── kit-plugins-doc.template.html │ │ │ │ │ └── time/ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── 1-modes/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 2-am-pm/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 3-step/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 4-affixes/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 5-time-segments-min-max/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ └── maskito-parse-stringify-time-demo.md │ │ │ │ │ ├── time-mask-doc.component.ts │ │ │ │ │ ├── time-mask-doc.style.less │ │ │ │ │ └── time-mask-doc.template.html │ │ │ │ ├── pages.ts │ │ │ │ ├── phone/ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── 1-basic/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 2-validation/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 3-non-strict/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 4-lazy-metadata/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── simple.md │ │ │ │ │ │ ├── 5-focus-blur-events/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ └── 6-national-format/ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ └── mask.ts │ │ │ │ │ ├── phone-doc.component.ts │ │ │ │ │ ├── phone-doc.style.less │ │ │ │ │ └── phone-doc.template.html │ │ │ │ ├── recipes/ │ │ │ │ │ ├── card/ │ │ │ │ │ │ ├── card-doc.component.ts │ │ │ │ │ │ ├── card-doc.template.html │ │ │ │ │ │ └── examples/ │ │ │ │ │ │ └── 1-basic/ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ ├── style.less │ │ │ │ │ │ └── template.html │ │ │ │ │ ├── content-editable/ │ │ │ │ │ │ ├── content-editable-doc.component.ts │ │ │ │ │ │ ├── content-editable-doc.template.html │ │ │ │ │ │ └── examples/ │ │ │ │ │ │ ├── 1-time/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── 2-multi-line/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── maskito-with-content-editable.md │ │ │ │ │ │ └── vanilla-js-tab.md │ │ │ │ │ ├── network-address/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-ipv6/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 2-ipv4/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── 3-mac/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── network-address-doc.component.ts │ │ │ │ │ │ └── network-address-doc.template.html │ │ │ │ │ ├── phone/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-us-phone/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── 2-kz-phone/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ ├── mask.ts │ │ │ │ │ │ │ └── template.html │ │ │ │ │ │ ├── phone-doc.component.ts │ │ │ │ │ │ └── phone-doc.template.html │ │ │ │ │ ├── placeholder/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-cvc-code/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ ├── 2-phone/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── 3-date/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── placeholder-doc.component.ts │ │ │ │ │ │ └── placeholder-doc.template.html │ │ │ │ │ ├── postfix/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-pattern-mask/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── 2-postprocessor/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── postfix-doc.component.ts │ │ │ │ │ │ └── postfix-doc.template.html │ │ │ │ │ ├── prefix/ │ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ │ ├── 1-pattern-mask/ │ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ │ └── 2-postprocessor/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ ├── prefix-doc.component.ts │ │ │ │ │ │ └── prefix-doc.template.html │ │ │ │ │ └── textarea/ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── 1-latin/ │ │ │ │ │ │ │ ├── component.ts │ │ │ │ │ │ │ └── mask.ts │ │ │ │ │ │ └── maskito-with-textarea.md │ │ │ │ │ ├── textarea-doc.component.ts │ │ │ │ │ └── textarea-doc.template.html │ │ │ │ └── stackblitz/ │ │ │ │ ├── components/ │ │ │ │ │ ├── stackblitz-edit-button/ │ │ │ │ │ │ ├── stackblitz-edit-button.component.ts │ │ │ │ │ │ └── stackblitz-edit-button.style.less │ │ │ │ │ └── stackblitz-starter/ │ │ │ │ │ ├── stackblitz-starter.component.ts │ │ │ │ │ └── stackblitz-starter.style.less │ │ │ │ ├── files/ │ │ │ │ │ ├── example.ts.md │ │ │ │ │ ├── starter.ts.md │ │ │ │ │ └── styles.css │ │ │ │ ├── index.ts │ │ │ │ └── stackblitz.service.ts │ │ │ ├── server.ts │ │ │ ├── styles.less │ │ │ ├── test-setup.ts │ │ │ └── typings.d.ts │ │ ├── tsconfig.app.json │ │ └── tsconfig.typecheck.json │ ├── demo-integrations/ │ │ ├── cypress-react.config.ts │ │ ├── cypress.config.ts │ │ ├── package.json │ │ ├── project.json │ │ ├── src/ │ │ │ ├── fixtures/ │ │ │ │ └── example.json │ │ │ ├── plugins/ │ │ │ │ └── index.js │ │ │ ├── support/ │ │ │ │ ├── assertions/ │ │ │ │ │ ├── have-ng-control-value.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── commands/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── paste.ts │ │ │ │ │ └── smart-tick.ts │ │ │ │ ├── component-index.html │ │ │ │ ├── component-react.ts │ │ │ │ ├── component.ts │ │ │ │ ├── constants/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── real-events-support.ts │ │ │ │ └── e2e.ts │ │ │ └── tests/ │ │ │ ├── addons/ │ │ │ │ └── phone/ │ │ │ │ ├── phone-basic.cy.ts │ │ │ │ ├── phone-national-trunk-prefix.cy.ts │ │ │ │ ├── phone-non-strict.cy.ts │ │ │ │ ├── phone-separator.cy.ts │ │ │ │ └── phone-strict.cy.ts │ │ │ ├── angular/ │ │ │ │ ├── form-control-changes.cy.ts │ │ │ │ └── unmask-handler.cy.ts │ │ │ ├── component-testing/ │ │ │ │ ├── angular/ │ │ │ │ │ ├── disable-mask-on-null.cy.ts │ │ │ │ │ └── pattern.cy.ts │ │ │ │ ├── angular-predicate/ │ │ │ │ │ ├── angular-predicate.cy.ts │ │ │ │ │ └── multi-test.component.ts │ │ │ │ ├── change-event-plugin/ │ │ │ │ │ └── change-event-plugin.cy.ts │ │ │ │ ├── initial-calibration-plugin/ │ │ │ │ │ └── dispatch-event.cy.ts │ │ │ │ ├── multi-character-date-segment-separator/ │ │ │ │ │ └── multi-character-date-segment-separator.cy.ts │ │ │ │ ├── native-max-length/ │ │ │ │ │ └── native-maxlength-attribute.cy.ts │ │ │ │ ├── native-select-method/ │ │ │ │ │ └── native-select-method.cy.ts │ │ │ │ ├── number/ │ │ │ │ │ ├── alone-decimal-separator.cy.ts │ │ │ │ │ ├── min-max-bigint.cy.ts │ │ │ │ │ ├── mirrored-prefix-postfix.cy.ts │ │ │ │ │ ├── mirrored-value-postfix.cy.ts │ │ │ │ │ ├── multi-character-prefix.cy.ts │ │ │ │ │ ├── overwrite-selection-range.cy.ts │ │ │ │ │ ├── postfix-multi-character.cy.ts │ │ │ │ │ ├── postfix-with-point.cy.ts │ │ │ │ │ ├── runtime-postfix-changes/ │ │ │ │ │ │ ├── runtime-postfix-changes.cy.ts │ │ │ │ │ │ └── sandbox.component.ts │ │ │ │ │ └── with-initial-value.cy.ts │ │ │ │ ├── overwrite-mode/ │ │ │ │ │ └── overwrite-mode-replace.cy.ts │ │ │ │ ├── paste/ │ │ │ │ │ └── cy-paste-utility.cy.ts │ │ │ │ ├── phone/ │ │ │ │ │ ├── phone-national-format.cy.ts │ │ │ │ │ └── phone-with-initial-value.cy.ts │ │ │ │ ├── placeholder/ │ │ │ │ │ ├── placeholder-dispatch-input-events.cy.ts │ │ │ │ │ ├── placeholder-has-same-characters-as-textfield.cy.ts │ │ │ │ │ └── placeholder-partial-removal-on-blur.cy.ts │ │ │ │ ├── react/ │ │ │ │ │ ├── async-predicate-options-race/ │ │ │ │ │ │ ├── reactApp.tsx │ │ │ │ │ │ └── reactAsyncPredicateOptionsRace.cy.tsx │ │ │ │ │ ├── async-predicates-race/ │ │ │ │ │ │ ├── reactApp.tsx │ │ │ │ │ │ └── reactAsyncPredicatesRace.cy.tsx │ │ │ │ │ ├── awesomeInput.tsx │ │ │ │ │ └── change-event/ │ │ │ │ │ └── changeEvent.cy.tsx │ │ │ │ └── utils.ts │ │ │ ├── kit/ │ │ │ │ ├── date/ │ │ │ │ │ ├── date-basic.cy.ts │ │ │ │ │ ├── date-fullwidth-to-halfwidth.cy.ts │ │ │ │ │ ├── date-min-max.cy.ts │ │ │ │ │ ├── date-mode.cy.ts │ │ │ │ │ ├── date-segments-zero-padding.cy.ts │ │ │ │ │ └── date-separator.cy.ts │ │ │ │ ├── date-range/ │ │ │ │ │ ├── date-range-basic.cy.ts │ │ │ │ │ ├── date-range-custom-range-separator.cy.ts │ │ │ │ │ ├── date-range-fullwidth-to-halfwidth.cy.ts │ │ │ │ │ ├── date-range-min-max-length.cy.ts │ │ │ │ │ ├── date-range-min-max.cy.ts │ │ │ │ │ ├── date-range-mode.cy.ts │ │ │ │ │ ├── date-range-segments-zero-padding.cy.ts │ │ │ │ │ └── date-range-separator.cy.ts │ │ │ │ ├── date-time/ │ │ │ │ │ ├── date-time-basic.cy.ts │ │ │ │ │ ├── date-time-date-time-separator.cy.ts │ │ │ │ │ ├── date-time-fullwidth-to-halfwidth.cy.ts │ │ │ │ │ ├── date-time-meridiem.cy.ts │ │ │ │ │ ├── date-time-min-max.cy.ts │ │ │ │ │ ├── date-time-mode.cy.ts │ │ │ │ │ ├── date-time-separator.cy.ts │ │ │ │ │ └── date-time-time-step.cy.ts │ │ │ │ ├── number/ │ │ │ │ │ ├── number-basic.cy.ts │ │ │ │ │ ├── number-bigint.cy.ts │ │ │ │ │ ├── number-decimal-separator.cy.ts │ │ │ │ │ ├── number-decimal-zero-padding.cy.ts │ │ │ │ │ ├── number-examples.cy.ts │ │ │ │ │ ├── number-fullwidth-to-halfwidth.cy.ts │ │ │ │ │ ├── number-max-validation.cy.ts │ │ │ │ │ ├── number-min-validation.cy.ts │ │ │ │ │ ├── number-minus-before-prefix.cy.ts │ │ │ │ │ ├── number-minus-sign.cy.ts │ │ │ │ │ ├── number-precision.cy.ts │ │ │ │ │ ├── number-prefix-postfix.cy.ts │ │ │ │ │ ├── number-thousand-separator.cy.ts │ │ │ │ │ ├── number-zero-integer-part.cy.ts │ │ │ │ │ └── utils.ts │ │ │ │ └── time/ │ │ │ │ ├── time-affixes.cy.ts │ │ │ │ ├── time-basic.cy.ts │ │ │ │ ├── time-fullwidth-to-halfwidth.cy.ts │ │ │ │ ├── time-meridiem.cy.ts │ │ │ │ ├── time-mode.cy.ts │ │ │ │ ├── time-segment-max-values.cy.ts │ │ │ │ └── time-step.cy.ts │ │ │ ├── react/ │ │ │ │ └── element-predicate.cy.ts │ │ │ ├── recipes/ │ │ │ │ ├── card/ │ │ │ │ │ └── card.cy.ts │ │ │ │ ├── content-editable/ │ │ │ │ │ ├── multi-line.cy.ts │ │ │ │ │ └── single-line-time-mask.cy.ts │ │ │ │ ├── network-address/ │ │ │ │ │ ├── ipv4.cy.ts │ │ │ │ │ ├── ipv6.cy.ts │ │ │ │ │ └── mac.cy.ts │ │ │ │ ├── phone/ │ │ │ │ │ └── phone.cy.ts │ │ │ │ ├── placeholder/ │ │ │ │ │ ├── date.cy.ts │ │ │ │ │ ├── us-phone.cy.ts │ │ │ │ │ └── сvc-code.cy.ts │ │ │ │ ├── plugins/ │ │ │ │ │ └── reject.cy.ts │ │ │ │ ├── postfix/ │ │ │ │ │ ├── percentage.cy.ts │ │ │ │ │ └── postprocessor.cy.ts │ │ │ │ ├── prefix/ │ │ │ │ │ ├── dynamic-pattern-mask-expression.cy.ts │ │ │ │ │ └── postprocessor.cy.ts │ │ │ │ └── textarea/ │ │ │ │ └── textarea-latin-letters-digits.cy.ts │ │ │ ├── ssr/ │ │ │ │ └── ssr.cy.ts │ │ │ ├── utils.ts │ │ │ └── vue/ │ │ │ └── vue.cy.ts │ │ ├── tsconfig.json │ │ └── vite.config.ts │ ├── kit/ │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── package.json │ │ ├── project.json │ │ └── src/ │ │ ├── index.ts │ │ └── lib/ │ │ ├── constants/ │ │ │ ├── date-segment-max-values.ts │ │ │ ├── default-decimal-pseudo-separators.ts │ │ │ ├── default-min-max-dates.ts │ │ │ ├── default-pseudo-minuses.ts │ │ │ ├── default-time-segment-bounds.ts │ │ │ ├── index.ts │ │ │ ├── meridiem.ts │ │ │ ├── time-fixed-characters.ts │ │ │ ├── time-segment-value-lengths.ts │ │ │ └── unicode-characters.ts │ │ ├── masks/ │ │ │ ├── date/ │ │ │ │ ├── date-mask.ts │ │ │ │ ├── date-params.ts │ │ │ │ ├── index.ts │ │ │ │ ├── tests/ │ │ │ │ │ └── date-mask.spec.ts │ │ │ │ └── utils/ │ │ │ │ ├── index.ts │ │ │ │ ├── parse-date.ts │ │ │ │ ├── stringify-date.ts │ │ │ │ ├── tests/ │ │ │ │ │ ├── parse-date.spec.ts │ │ │ │ │ └── stringify-date.spec.ts │ │ │ │ └── to-date-segments.ts │ │ │ ├── date-range/ │ │ │ │ ├── constants.ts │ │ │ │ ├── date-range-mask.ts │ │ │ │ ├── index.ts │ │ │ │ ├── processors/ │ │ │ │ │ ├── min-max-range-length-postprocessor.ts │ │ │ │ │ └── swap-dates-postprocessor.ts │ │ │ │ └── tests/ │ │ │ │ ├── date-segments-zero-padding.spec.ts │ │ │ │ └── pseudo-range-separators.spec.ts │ │ │ ├── date-time/ │ │ │ │ ├── constants/ │ │ │ │ │ ├── date-time-separator.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── date-time-mask.ts │ │ │ │ ├── date-time-params.ts │ │ │ │ ├── index.ts │ │ │ │ ├── postprocessors/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── min-max-date-time-postprocessor.ts │ │ │ │ ├── preprocessors/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── valid-date-time-preprocessor.ts │ │ │ │ ├── tests/ │ │ │ │ │ ├── date-segments-zero-padding.spec.ts │ │ │ │ │ ├── date-time-separator.spec.ts │ │ │ │ │ └── pseudo-date-end-separator.spec.ts │ │ │ │ └── utils/ │ │ │ │ ├── index.ts │ │ │ │ ├── is-date-time-string-complete.ts │ │ │ │ ├── parse-date-time.ts │ │ │ │ ├── split-date-time-string.ts │ │ │ │ ├── stringify-date-time.ts │ │ │ │ └── tests/ │ │ │ │ ├── parse-date-time.spec.ts │ │ │ │ ├── split-date-time-string.spec.ts │ │ │ │ └── stringify-date-time.spec.ts │ │ │ ├── number/ │ │ │ │ ├── index.ts │ │ │ │ ├── number-mask.ts │ │ │ │ ├── number-params.ts │ │ │ │ ├── plugins/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── leading-zeroes-validation.plugin.ts │ │ │ │ │ ├── min-max.plugin.ts │ │ │ │ │ └── not-empty-integer.plugin.ts │ │ │ │ ├── processors/ │ │ │ │ │ ├── affixes-filter-preprocessor.ts │ │ │ │ │ ├── decimal-zero-padding-postprocessor.ts │ │ │ │ │ ├── empty-postprocessor.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── initialization-only-preprocessor.ts │ │ │ │ │ ├── leading-minus-deletion-preprocessor.ts │ │ │ │ │ ├── leading-zeroes-validation-postprocessor.ts │ │ │ │ │ ├── min-max-postprocessor.ts │ │ │ │ │ ├── non-removable-chars-deletion-preprocessor.ts │ │ │ │ │ ├── not-empty-integer-part-preprocessor.ts │ │ │ │ │ ├── number-prefix-postprocessor.ts │ │ │ │ │ ├── pseudo-character-preprocessor.ts │ │ │ │ │ ├── repeated-decimal-separator-preprocessor.ts │ │ │ │ │ ├── tests/ │ │ │ │ │ │ ├── leading-zeroes-validation-postprocessor.spec.ts │ │ │ │ │ │ └── not-empty-integer-part-preprocessor.spec.ts │ │ │ │ │ ├── thousand-separator-postprocessor.ts │ │ │ │ │ └── zero-precision-preprocessor.ts │ │ │ │ ├── tests/ │ │ │ │ │ └── number-mask.spec.ts │ │ │ │ └── utils/ │ │ │ │ ├── extract-affixes.ts │ │ │ │ ├── generate-mask-expression.ts │ │ │ │ ├── index.ts │ │ │ │ ├── number-parts.ts │ │ │ │ ├── parse-number.ts │ │ │ │ ├── stringify-number-without-exp.ts │ │ │ │ ├── stringify-number.ts │ │ │ │ ├── tests/ │ │ │ │ │ ├── parse-number.spec.ts │ │ │ │ │ ├── stringify-number-without-exp.spec.ts │ │ │ │ │ ├── stringify-number.spec.ts │ │ │ │ │ ├── to-number-parts.spec.ts │ │ │ │ │ └── validate-decimal-pseudo-separators.spec.ts │ │ │ │ ├── validate-decimal-pseudo-separators.ts │ │ │ │ └── with-number-defaults.ts │ │ │ └── time/ │ │ │ ├── index.ts │ │ │ ├── time-mask.ts │ │ │ ├── time-params.ts │ │ │ └── utils/ │ │ │ ├── index.ts │ │ │ ├── parse-time.ts │ │ │ ├── stringify-time.ts │ │ │ └── tests/ │ │ │ ├── parse-time.spec.ts │ │ │ └── stringify-time.spec.ts │ │ ├── plugins/ │ │ │ ├── add-on-focus.ts │ │ │ ├── caret-guard.ts │ │ │ ├── event-handler.ts │ │ │ ├── index.ts │ │ │ ├── reject-event.ts │ │ │ ├── remove-on-blur.ts │ │ │ ├── selection-change.ts │ │ │ └── time/ │ │ │ ├── meridiem-stepping.ts │ │ │ └── time-segments-stepping.ts │ │ ├── processors/ │ │ │ ├── colon-convert-preprocessor.ts │ │ │ ├── date-segments-zero-padding-postprocessor.ts │ │ │ ├── first-date-end-separator-preprocessor.ts │ │ │ ├── fullwidth-to-halfwidth-preprocessor.ts │ │ │ ├── index.ts │ │ │ ├── invalid-time-segment-insertion-preprocessor.ts │ │ │ ├── meridiem-processors.ts │ │ │ ├── min-max-date-postprocessor.ts │ │ │ ├── normalize-date-preprocessor.ts │ │ │ ├── postfix-postprocessor.ts │ │ │ ├── prefix-postprocessor.ts │ │ │ ├── tests/ │ │ │ │ ├── first-date-end-separator-preprocessor.spec.ts │ │ │ │ ├── normalize-date-preprocessor.spec.ts │ │ │ │ ├── postfix-postprocessor.spec.ts │ │ │ │ ├── prefix-postprocessor.spec.ts │ │ │ │ ├── valid-date-preprocessor.spec.ts │ │ │ │ └── with-placeholder.spec.ts │ │ │ ├── valid-date-preprocessor.ts │ │ │ ├── with-placeholder.ts │ │ │ └── zero-placeholders-preprocessor.ts │ │ ├── types/ │ │ │ ├── date-mode.ts │ │ │ ├── date-segments.ts │ │ │ ├── index.ts │ │ │ ├── time-mode.ts │ │ │ └── time-segments.ts │ │ └── utils/ │ │ ├── clamp.ts │ │ ├── count-digits.ts │ │ ├── date/ │ │ │ ├── append-date.ts │ │ │ ├── date-segment-value-length.ts │ │ │ ├── date-to-segments.ts │ │ │ ├── get-date-segments-order.ts │ │ │ ├── get-first-complete-date.ts │ │ │ ├── is-date-string-complete.ts │ │ │ ├── parse-date-range-string.ts │ │ │ ├── parse-date-string.ts │ │ │ ├── raise-segment-value-to-min.ts │ │ │ ├── segments-to-date.ts │ │ │ ├── tests/ │ │ │ │ ├── append-date.spec.ts │ │ │ │ ├── get-date-segment-value-length.spec.ts │ │ │ │ └── parse-date-range-string.spec.ts │ │ │ ├── to-date-string.ts │ │ │ └── validate-date-string.ts │ │ ├── dummy.ts │ │ ├── escape-reg-exp.ts │ │ ├── find-common-beginning-substr.ts │ │ ├── index.ts │ │ ├── is-empty.ts │ │ ├── pad-with-zeroes-until-valid.ts │ │ ├── tests/ │ │ │ ├── clamp.spec.ts │ │ │ ├── escape-reg-exp.spec.ts │ │ │ ├── find-common-beginning-substr.spec.ts │ │ │ ├── get-first-complete-date.spec.ts │ │ │ ├── is-empty.spec.ts │ │ │ ├── to-half-width-colon.spec.ts │ │ │ └── to-half-width-number.spec.ts │ │ ├── time/ │ │ │ ├── create-time-mask-expression.ts │ │ │ ├── enrich-time-segments-with-zeroes.ts │ │ │ ├── index.ts │ │ │ ├── pad-end-time-segments.ts │ │ │ ├── pad-start-time-segments.ts │ │ │ ├── pad-time-segments.ts │ │ │ ├── parse-time-string.ts │ │ │ ├── tests/ │ │ │ │ ├── enrich-time-segments-with-zeroes.spec.ts │ │ │ │ ├── parse-time-string.spec.ts │ │ │ │ └── to-time-string.spec.ts │ │ │ └── to-time-string.ts │ │ ├── to-half-width-colon.ts │ │ └── to-half-width-number.ts │ ├── phone/ │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── package.json │ │ ├── project.json │ │ └── src/ │ │ ├── index.ts │ │ └── lib/ │ │ └── masks/ │ │ ├── index.ts │ │ └── phone/ │ │ ├── constants/ │ │ │ ├── index.ts │ │ │ └── template-filler.ts │ │ ├── index.ts │ │ ├── phone-mask-non-strict.ts │ │ ├── phone-mask-strict.ts │ │ ├── phone-mask.ts │ │ ├── processors/ │ │ │ ├── browser-autofill-preprocessor.ts │ │ │ ├── cut-init-country-code-preprocessor.ts │ │ │ ├── index.ts │ │ │ ├── paste-non-strict-phone-preprocessor.ts │ │ │ ├── paste-strict-phone-preprocessor.ts │ │ │ ├── phone-length-postprocessor.ts │ │ │ └── sanitize-phone-preprocessor.ts │ │ ├── tests/ │ │ │ ├── get-phone-template.spec.ts │ │ │ └── phone-mask.spec.ts │ │ └── utils/ │ │ ├── cut-phone-by-valid-length.ts │ │ ├── generate-phone-mask.ts │ │ ├── get-country-from-number.ts │ │ ├── get-phone-template.ts │ │ ├── index.ts │ │ └── select-template.ts │ ├── react/ │ │ ├── .babelrc │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── package.json │ │ ├── project.json │ │ └── src/ │ │ ├── index.ts │ │ └── lib/ │ │ ├── adaptControlledElement.tsx │ │ ├── tests/ │ │ │ ├── controlledInput.spec.tsx │ │ │ ├── elementPredicate.spec.tsx │ │ │ └── useMaskito.spec.tsx │ │ ├── useIsomorphicLayoutEffect.tsx │ │ └── useMaskito.tsx │ └── vue/ │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ └── src/ │ ├── index.ts │ └── lib/ │ ├── maskito.spec.ts │ └── maskito.ts ├── tsconfig.build.json ├── tsconfig.json └── tsconfig.spec.json