@skbkontur/react-ui 4.25.0 → 4.25.1-MaskedInput-fix.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -21
- package/cjs/components/Gapped/Gapped.md +43 -43
- package/cjs/components/Input/Input.d.ts +3 -2
- package/cjs/components/Input/Input.js +7 -4
- package/cjs/components/Input/Input.js.map +1 -1
- package/cjs/components/MaskedInput/MaskedInput.d.ts +22 -4
- package/cjs/components/MaskedInput/MaskedInput.helpers.d.ts +10 -0
- package/cjs/components/MaskedInput/MaskedInput.helpers.js +30 -0
- package/cjs/components/MaskedInput/MaskedInput.helpers.js.map +1 -0
- package/cjs/components/MaskedInput/MaskedInput.js +190 -20
- package/cjs/components/MaskedInput/MaskedInput.js.map +1 -1
- package/cjs/components/MaskedInput/MaskedInput.md +173 -9
- package/cjs/components/MaskedInput/MaskedInput.styles.d.ts +3 -0
- package/cjs/components/MaskedInput/MaskedInput.styles.js +4 -0
- package/cjs/components/MaskedInput/MaskedInput.styles.js.map +1 -0
- package/cjs/components/RadioGroup/RadioGroup.md +43 -43
- package/cjs/index.d.ts +3 -0
- package/cjs/index.js +3 -0
- package/cjs/index.js.map +1 -1
- package/cjs/internal/MaskedInputElement/MaskedInputElement.d.ts +6 -9
- package/cjs/internal/MaskedInputElement/MaskedInputElement.js +99 -129
- package/cjs/internal/MaskedInputElement/MaskedInputElement.js.map +1 -1
- package/cjs/internal/MaskedInputElement/MaskedInputElement.styles.d.ts +2 -3
- package/cjs/internal/MaskedInputElement/MaskedInputElement.styles.js +7 -17
- package/cjs/internal/MaskedInputElement/MaskedInputElement.styles.js.map +1 -1
- package/cjs/internal/ThemeShowcase/ThemeShowcase.md +13 -13
- package/cjs/lib/styles/HoldSelectionColor.js +1 -1
- package/cjs/lib/styles/HoldSelectionColor.js.map +1 -1
- package/cjs/lib/styles/UiFont.d.ts +4 -0
- package/cjs/lib/styles/UiFont.js +39 -0
- package/cjs/lib/styles/UiFont.js.map +1 -0
- package/components/Gapped/Gapped.md +43 -43
- package/components/Input/Input/Input.js +8 -4
- package/components/Input/Input/Input.js.map +1 -1
- package/components/Input/Input.d.ts +3 -2
- package/components/MaskedInput/MaskedInput/MaskedInput.js +171 -22
- package/components/MaskedInput/MaskedInput/MaskedInput.js.map +1 -1
- package/components/MaskedInput/MaskedInput.d.ts +22 -4
- package/components/MaskedInput/MaskedInput.helpers/MaskedInput.helpers.js +27 -0
- package/components/MaskedInput/MaskedInput.helpers/MaskedInput.helpers.js.map +1 -0
- package/components/MaskedInput/MaskedInput.helpers/package.json +6 -0
- package/components/MaskedInput/MaskedInput.helpers.d.ts +10 -0
- package/components/MaskedInput/MaskedInput.md +173 -9
- package/components/MaskedInput/MaskedInput.styles/MaskedInput.styles.js +4 -0
- package/components/MaskedInput/MaskedInput.styles/MaskedInput.styles.js.map +1 -0
- package/components/MaskedInput/MaskedInput.styles/package.json +6 -0
- package/components/MaskedInput/MaskedInput.styles.d.ts +3 -0
- package/components/RadioGroup/RadioGroup.md +43 -43
- package/index.d.ts +3 -0
- package/index.js +3 -0
- package/index.js.map +1 -1
- package/internal/MaskedInputElement/MaskedInputElement/MaskedInputElement.js +105 -161
- package/internal/MaskedInputElement/MaskedInputElement/MaskedInputElement.js.map +1 -1
- package/internal/MaskedInputElement/MaskedInputElement.d.ts +6 -9
- package/internal/MaskedInputElement/MaskedInputElement.styles/MaskedInputElement.styles.js +5 -8
- package/internal/MaskedInputElement/MaskedInputElement.styles/MaskedInputElement.styles.js.map +1 -1
- package/internal/MaskedInputElement/MaskedInputElement.styles.d.ts +2 -3
- package/internal/ThemeShowcase/ThemeShowcase.md +13 -13
- package/lib/styles/HoldSelectionColor/HoldSelectionColor.js +1 -1
- package/lib/styles/HoldSelectionColor/HoldSelectionColor.js.map +1 -1
- package/lib/styles/UiFont/UiFont.js +30 -0
- package/lib/styles/UiFont/UiFont.js.map +1 -0
- package/lib/styles/UiFont/package.json +6 -0
- package/lib/styles/UiFont.d.ts +4 -0
- package/package.json +2 -5
- package/cjs/internal/MaskedInputElement/MaskedInputElement.helpers.d.ts +0 -16
- package/cjs/internal/MaskedInputElement/MaskedInputElement.helpers.js +0 -52
- package/cjs/internal/MaskedInputElement/MaskedInputElement.helpers.js.map +0 -1
- package/internal/MaskedInputElement/MaskedInputElement.helpers/MaskedInputElement.helpers.js +0 -43
- package/internal/MaskedInputElement/MaskedInputElement.helpers/MaskedInputElement.helpers.js.map +0 -1
- package/internal/MaskedInputElement/MaskedInputElement.helpers/package.json +0 -6
- package/internal/MaskedInputElement/MaskedInputElement.helpers.d.ts +0 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["MaskedInput.tsx"],"names":["React","useImperativeHandle","useRef","useState","Input","MaskedInputElement","forwardRefAndName","MaskedInput","props","ref","mask","maskChar","formatChars","alwaysShowMask","placeholder","inputProps","focused","setFocused","showPlaceholder","innerRef","current","undefined","handleFocus","handleBlur","handleUnexpectedInput","value","onUnexpectedInput","blink","e","onFocus","onBlur"],"mappings":"mPAAA,OAAOA,KAAP,IAAqBC,mBAArB,EAA0CC,MAA1C,EAAkDC,QAAlD,QAAkE,OAAlE;;AAEA,SAASC,KAAT,QAA6C,UAA7C;;AAEA,SAASC,kBAAT,QAAmC,mCAAnC;AACA,SAASC,iBAAT,QAAkC,6BAAlC;;;;;;;;;;;;;;;;;;;;;;AAsBA;AACA;AACA;AACA;AACA,OAAO,IAAMC,WAAW,GAAGD,iBAAiB;AAC1C,aAD0C;AAE1C,SAASC,WAAT,CAAqBC,KAArB,EAA8CC,GAA9C,EAAsE;AACpE,MAAQC,IAAR,GAAoFF,KAApF,CAAQE,IAAR,CAAcC,QAAd,GAAoFH,KAApF,CAAcG,QAAd,CAAwBC,WAAxB,GAAoFJ,KAApF,CAAwBI,WAAxB,CAAqCC,cAArC,GAAoFL,KAApF,CAAqCK,cAArC,CAAqDC,WAArD,GAAoFN,KAApF,CAAqDM,WAArD,CAAqEC,UAArE,iCAAoFP,KAApF;AACA,kBAA8BL,QAAQ,CAAC,KAAD,CAAtC,CAAOa,OAAP,gBAAgBC,UAAhB;AACA,MAAMC,eAAe,GAAG,EAAEL,cAAc,IAAIG,OAApB,CAAxB;AACA,MAAMG,QAAQ,GAAGjB,MAAM,CAAQ,IAAR,CAAvB;;AAEAD,EAAAA,mBAAmB,CAACQ,GAAD,EAAM,oBAAMU,QAAQ,CAACC,OAAf,EAAN,CAAnB;;AAEA;AACE,wBAAC,KAAD;AACE,MAAA,GAAG,EAAED,QADP;AAEMJ,IAAAA,UAFN;AAGE,MAAA,WAAW,EAAEG,eAAe,GAAGJ,WAAH,GAAiBO,SAH/C;AAIE,MAAA,OAAO,EAAEC,WAJX;AAKE,MAAA,MAAM,EAAEC,UALV;AAME,MAAA,OAAO;AACL,0BAAC,kBAAD;AACE,QAAA,IAAI,EAAEb,IADR;AAEE,QAAA,QAAQ,EAAEC,QAFZ;AAGE,QAAA,WAAW,EAAEC,WAHf;AAIE,QAAA,cAAc,EAAEC,cAJlB;AAKE,QAAA,iBAAiB,EAAEW,qBALrB,GAPJ,IADF;;;;;;AAmBA,WAASA,qBAAT,CAA+BC,KAA/B,EAA8C;AAC5C,QAAIjB,KAAK,CAACkB,iBAAV,EAA6B;AAC3BlB,MAAAA,KAAK,CAACkB,iBAAN,CAAwBD,KAAxB;AACD,KAFD,MAEO,IAAIN,QAAQ,CAACC,OAAb,EAAsB;AAC3BD,MAAAA,QAAQ,CAACC,OAAT,CAAiBO,KAAjB;AACD;AACF;;AAED,WAASL,WAAT,CAAqBM,CAArB,EAA4D;AAC1DX,IAAAA,UAAU,CAAC,IAAD,CAAV;AACAT,IAAAA,KAAK,CAACqB,OAAN,IAAiBrB,KAAK,CAACqB,OAAN,CAAcD,CAAd,CAAjB;AACD;;AAED,WAASL,UAAT,CAAoBK,CAApB,EAA2D;AACzDX,IAAAA,UAAU,CAAC,KAAD,CAAV;AACAT,IAAAA,KAAK,CAACsB,MAAN,IAAgBtB,KAAK,CAACsB,MAAN,CAAaF,CAAb,CAAhB;AACD;AACF,CA9CyC,CAArC","sourcesContent":["import React, { Ref, useImperativeHandle, useRef, useState } from 'react';\n\nimport { Input, InputProps, InputType } from '../Input';\nimport { Nullable } from '../../typings/utility-types';\nimport { MaskedInputElement } from '../../internal/MaskedInputElement';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName';\n\nexport interface MaskedProps {\n /** Паттерн маски */\n mask: string;\n /** Символ маски */\n maskChar?: Nullable<string>;\n /**\n * Словарь символов-регулярок для маски\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' }\n */\n formatChars?: Record<string, string>;\n /** Показывать символы маски */\n alwaysShowMask?: boolean;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nexport interface MaskedInputProps extends MaskedProps, Omit<InputProps, 'mask' | 'maxLength' | 'type' | 'element'> {\n type?: MaskInputType;\n}\n\n/**\n * Интерфейс пропсов наследуется от `Input`.\n * Из пропсов `Input` исключены некоторые не применимые к полю с маской пропсы и сокращен список возможных значений в type.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const { mask, maskChar, formatChars, alwaysShowMask, placeholder, ...inputProps } = props;\n const [focused, setFocused] = useState(false);\n const showPlaceholder = !(alwaysShowMask || focused);\n const innerRef = useRef<Input>(null);\n\n useImperativeHandle(ref, () => innerRef.current);\n\n return (\n <Input\n ref={innerRef}\n {...inputProps}\n placeholder={showPlaceholder ? placeholder : undefined}\n onFocus={handleFocus}\n onBlur={handleBlur}\n element={\n <MaskedInputElement\n mask={mask}\n maskChar={maskChar}\n formatChars={formatChars}\n alwaysShowMask={alwaysShowMask}\n onUnexpectedInput={handleUnexpectedInput}\n />\n }\n />\n );\n\n function handleUnexpectedInput(value: string) {\n if (props.onUnexpectedInput) {\n props.onUnexpectedInput(value);\n } else if (innerRef.current) {\n innerRef.current.blink();\n }\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus && props.onFocus(e);\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur && props.onBlur(e);\n }\n },\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["MaskedInput.tsx"],"names":["React","useImperativeHandle","useRef","useState","useEffect","IMaskInput","globalObject","MaskedInputElement","MaskedInputElementDataTids","forwardRefAndName","cx","uiFontGlobalClasses","Input","isKeyBackspace","isKeyDelete","someKeys","isInstanceOf","globalClasses","getDefinitions","getMaskChar","MaskedInput","props","ref","mask","maskChar","formatChars","alwaysShowMask","imaskProps","onAccept","customIMaskProps","placeholder","onValueChange","onUnexpectedInput","onKeyDownCapture","onChange","element","inputProps","inputRef","imaskRef","focused","setFocused","prevValue","value","String","defaultValue","prevSelectionStart","showPlaceholder","current","Object","assign","selectAll","delaySelectAll","input","selectionStart","getCompatibleIMaskProps","undefined","handleFocus","handleBlur","handleInput","handleSelect","handleKeyDownCapture","root","getMaskChars","handleAccept","e","target","HTMLInputElement","closest","nearest","maskRef","masked","nearestInputPos","length","selectionEnd","replace","placeholderChar","definitions","eager","overwrite","lazy","imaskPropsFix","maskChars","blocks","values","forEach","push","args","handleUnexpectedInput","onInput","onFocus","selectAllOnFocus","blink","onBlur","isDeleteKey","currentTarget","repeat"],"mappings":"4WAAA,OAAOA,KAAP,IAAqBC,mBAArB,EAA0CC,MAA1C,EAAkDC,QAAlD,EAA4DC,SAA5D,QAA6E,OAA7E;;AAEA,SAASC,UAAT,QAA4C,aAA5C;AACA,SAASC,YAAT,QAA6B,0BAA7B;;;AAGA,SAASC,kBAAT,EAA6BC,0BAA7B,QAA+D,mCAA/D;AACA,SAASC,iBAAT,QAAkC,6BAAlC;AACA,SAASC,EAAT,QAAmB,2BAAnB;AACA,SAASC,mBAAT,QAAoC,yBAApC;AACA,SAASC,KAAT,QAA6C,UAA7C;AACA,SAASC,cAAT,EAAyBC,WAAzB,EAAsCC,QAAtC,QAAsD,uCAAtD;AACA,SAASC,YAAT,QAA6B,wBAA7B;;AAEA,SAASC,aAAT,QAA8B,sBAA9B;AACA,SAASC,cAAT,EAAyBC,WAAzB,QAA4C,uBAA5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA;AACA;AACA;AACA;AACA,OAAO,IAAMC,WAAW,GAAGX,iBAAiB;AAC1C,aAD0C;AAE1C,SAASW,WAAT,CAAqBC,KAArB,EAA8CC,GAA9C,EAAsE;AACpE;AACEC,EAAAA,IADF;;;;;;;;;;;;AAaIF,EAAAA,KAbJ,CACEE,IADF,CAEEC,QAFF,GAaIH,KAbJ,CAEEG,QAFF,CAGEC,WAHF,GAaIJ,KAbJ,CAGEI,WAHF,CAIEC,cAJF,GAaIL,KAbJ,CAIEK,cAJF,qBAaIL,KAbJ,CAKEM,UALF,oDAKkD,EALlD,yBAKgBC,QALhB,qBAKgBA,QALhB,CAK6BC,gBAL7B,+DAMEC,WANF,GAaIT,KAbJ,CAMES,WANF,CAOEC,aAPF,GAaIV,KAbJ,CAOEU,aAPF,CAQEC,iBARF,GAaIX,KAbJ,CAQEW,iBARF,CASEC,gBATF,GAaIZ,KAbJ,CASEY,gBATF,CAUEC,QAVF,GAaIb,KAbJ,CAUEa,QAVF,CAWEC,OAXF,GAaId,KAbJ,CAWEc,OAXF,CAYKC,UAZL,iCAaIf,KAbJ;;AAeA,MAAMgB,QAAQ,GAAGnC,MAAM,CAAQ,IAAR,CAAvB;AACA,MAAMoC,QAAQ,GAAGpC,MAAM,CAAe,IAAf,CAAvB;;AAEA,kBAA8BC,QAAQ,CAAC,KAAD,CAAtC,CAAOoC,OAAP,gBAAgBC,UAAhB;AACA,MAAMC,SAAS,GAAGvC,MAAM,CAASmB,KAAK,CAACqB,KAAN,IAAeC,MAAM,CAACtB,KAAK,CAACuB,YAAP,CAArB,IAA6C,EAAtD,CAAxB;AACA,MAAMC,kBAAkB,GAAG3C,MAAM,CAAgB,IAAhB,CAAjC;;AAEA,MAAM4C,eAAe,GAAG,EAAEpB,cAAc,IAAIa,OAApB,CAAxB;;AAEAtC,EAAAA,mBAAmB;AACjBqB,EAAAA,GADiB;AAEjB;AACEe,MAAAA,QAAQ,CAACU,OAAT;AACAC,MAAAA,MAAM,CAACC,MAAP,CAAcZ,QAAQ,CAACU,OAAvB,EAAgC;AAC9BG,QAAAA,SAAS,EAAEb,QAAQ,CAACU,OAAT,CAAiBI,cADE,EAAhC,CAFF,GAFiB;;AAOjB,IAPiB,CAAnB;;;AAUA/C,EAAAA,SAAS,CAAC,YAAM;AACd;AACN;AACA;AACA;AACA;AACM,6BAAIiC,QAAQ,CAACU,OAAb,aAAI,kBAAkBK,KAAtB,EAA6B;AAC3BX,MAAAA,SAAS,CAACM,OAAV,GAAoBV,QAAQ,CAACU,OAAT,CAAiBK,KAAjB,CAAuBV,KAA3C;AACAG,MAAAA,kBAAkB,CAACE,OAAnB,GAA6BV,QAAQ,CAACU,OAAT,CAAiBK,KAAjB,CAAuBC,cAApD;AACD;AACF,GAVQ,EAUN,EAVM,CAAT;;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAM1B,UAAU,GAAG2B,uBAAuB,EAA1C;;AAEA;AACE,wBAAC,KAAD;AACE,MAAA,GAAG,EAAEjB,QADP;AAEMD,IAAAA,UAFN;AAGE,MAAA,WAAW,EAAEU,eAAe,GAAGhB,WAAH,GAAiByB,SAH/C;AAIE,MAAA,OAAO,EAAEC,WAJX;AAKE,MAAA,MAAM,EAAEC,UALV;AAME,MAAA,OAAO,EAAEC,WANX;AAOE,MAAA,SAAS,EAAEC,YAPb;AAQE,MAAA,gBAAgB,EAAEC,oBARpB;AASE,MAAA,SAAS,EAAElD,EAAE,CAACO,aAAa,CAAC4C,IAAf,EAAqBlD,mBAAmB,CAACkD,IAAzC,CATf;AAUE,kBAAUrD,0BAA0B,CAACqD,IAVvC;AAWE,MAAA,OAAO;AACL,0BAAC,kBAAD,IAAoB,SAAS,EAAEC,YAAY,CAACnC,UAAD,CAA3C;AACE,0BAAC,UAAD,aAAY,GAAG,EAAEW,QAAjB,IAA+BX,UAA/B,IAA2C,QAAQ,EAAEoC,YAArD,IADF,CAZJ,IADF;;;;;;AAoBA,WAASJ,YAAT,CAAsBK,CAAtB,EAA6D;AAC3D;AACEhD,IAAAA,YAAY,CAACgD,CAAC,CAACC,MAAH,EAAW3D,YAAY,CAAC4D,gBAAxB,CAAZ;AACAF,IAAAA,CAAC,CAACC,MAAF,4BAAa5B,QAAQ,CAACU,OAAtB,qBAAa,mBAAkBK,KAA/B,CADA;AAEAY,IAAAA,CAAC,CAACC,MAAF,CAASE,OAAT,CAAiB,6BAAjB,CAHF;AAIE;AACA,UAAMC,OAAO,wBAAG9B,QAAQ,CAACS,OAAZ,qBAAG,kBAAkBsB,OAAlB,CAA0BC,MAA1B,CAAiCC,eAAjC,CAAiDP,CAAC,CAACC,MAAF,CAASvB,KAAT,CAAe8B,MAAhE,EAAwE,MAAxE,CAAhB;AACA;AACE,aAAOR,CAAC,CAACC,MAAF,CAASZ,cAAhB,KAAmC,QAAnC;AACA,aAAOe,OAAP,KAAmB,QADnB;AAEAJ,MAAAA,CAAC,CAACC,MAAF,CAASZ,cAAT,IAA2Be,OAH7B;AAIE;AACAJ,QAAAA,CAAC,CAACC,MAAF,CAASZ,cAAT,GAA0Be,OAA1B;AACAJ,QAAAA,CAAC,CAACC,MAAF,CAASQ,YAAT,GAAwBL,OAAxB;AACD;AACF;AACF;;AAED,WAASd,uBAAT,GAAsE;AACpE;AACE/B,MAAAA,IAAI,EAAEA,IAAI,CAACmD,OAAL,CAAa,IAAb,EAAmB,OAAnB,CADR;AAEEC,MAAAA,eAAe,EAAExD,WAAW,CAACK,QAAD,CAF9B;AAGEoD,MAAAA,WAAW,EAAE1D,cAAc,CAACO,WAAD,CAH7B;AAIEoD,MAAAA,KAAK,EAAE,IAJT;AAKEC,MAAAA,SAAS,EAAE,OALb;AAMEC,MAAAA,IAAI,EAAErD,cAAc,KAAK,IAAnB,GAA0B,IAA1B,GAAiC,EAAEA,cAAc,IAAIa,OAApB,CANzC;AAOKV,IAAAA,gBAPL;;AASD;;AAED,WAASiC,YAAT,CAAsBnC,UAAtB,EAA+E;AAC7E,QAAMqD,aAAa,GAAGrD,UAAtB;AACA,QAAMsD,SAAS,GAAG,CAACD,aAAa,CAACL,eAAf,CAAlB;AACA,QAAIK,aAAa,CAACE,MAAlB,EAA0B;AACvBlC,MAAAA,MAAM,CAACmC,MAAP,CAAcH,aAAa,CAACE,MAA5B,CAAD,CAA6EE,OAA7E;AACE,2BAAGT,eAAH,QAAGA,eAAH,QAAyBA,eAAe,IAAIM,SAAS,CAACI,IAAV,CAAeV,eAAf,CAA5C,EADF;;AAGD;;AAED,WAAOM,SAAP;AACD;;AAED,WAASlB,YAAT,GAAoG,mCAA3EuB,IAA2E,oDAA3EA,IAA2E;AAClG,QAAO5C,KAAP,GAAqB4C,IAArB,IAAgBtB,CAAhB,GAAqBsB,IAArB;;AAEA1D,IAAAA,QAAQ,QAAR,YAAAA,QAAQ,MAAR,SAAc0D,IAAd;;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACMtB,IAAAA,CAAC,KAAIjC,aAAJ,oBAAIA,aAAa,CAAGW,KAAH,CAAjB,CAAD;AACD;;AAED;AACJ;AACA;AACA;AACA;AACI,WAASgB,WAAT,CAAqBM,CAArB,EAA6D;AAC3D,QAAIvB,SAAS,CAACM,OAAV,KAAsBiB,CAAC,CAACC,MAAF,CAASvB,KAA/B,IAAwCG,kBAAkB,CAACE,OAAnB,KAA+BiB,CAAC,CAACC,MAAF,CAASZ,cAApF,EAAoG;AAClGkC,MAAAA,qBAAqB,CAACvB,CAAC,CAACC,MAAF,CAASvB,KAAV,CAArB;AACD;;AAEDD,IAAAA,SAAS,CAACM,OAAV,GAAoBiB,CAAC,CAACC,MAAF,CAASvB,KAA7B;;AAEArB,IAAAA,KAAK,CAACmE,OAAN,oBAAAnE,KAAK,CAACmE,OAAN,CAAgBxB,CAAhB;AACD;;AAED,WAASR,WAAT,CAAqBQ,CAArB,EAA4D;AAC1DxB,IAAAA,UAAU,CAAC,IAAD,CAAV;AACAnB,IAAAA,KAAK,CAACoE,OAAN,oBAAApE,KAAK,CAACoE,OAAN,CAAgBzB,CAAhB;;AAEA;AACA;AACA3C,IAAAA,KAAK,CAACqE,gBAAN,2BAA0BrD,QAAQ,CAACU,OAAnC,qBAA0B,mBAAkBI,cAAlB,EAA1B;AACD;;AAED,WAASoC,qBAAT,CAA+B7C,KAA/B,EAA2C,KAAZA,KAAY,cAAZA,KAAY,GAAJ,EAAI;AACzC,QAAIV,iBAAJ,EAAuB;AACrBA,MAAAA,iBAAiB,CAACU,KAAD,CAAjB;AACD,KAFD,MAEO,IAAIL,QAAQ,CAACU,OAAb,EAAsB;AAC3BV,MAAAA,QAAQ,CAACU,OAAT,CAAiB4C,KAAjB;AACD;AACF;;AAED,WAASlC,UAAT,CAAoBO,CAApB,EAA2D;AACzDxB,IAAAA,UAAU,CAAC,KAAD,CAAV;AACAnB,IAAAA,KAAK,CAACuE,MAAN,oBAAAvE,KAAK,CAACuE,MAAN,CAAe5B,CAAf;AACD;;AAED,WAASJ,oBAAT,CAA8BI,CAA9B,EAAwE;AACtE,QAAM6B,WAAW,GAAG9E,QAAQ,CAACF,cAAD,EAAiBC,WAAjB,CAAR,CAAsCkD,CAAtC,CAApB;;AAEAnB,IAAAA,kBAAkB,CAACE,OAAnB,GAA6BiB,CAAC,CAAC8B,aAAF,CAAgBzC,cAA7C;;AAEA,QAAI,CAACW,CAAC,CAAC8B,aAAF,CAAgBpD,KAAjB,IAA0BmD,WAA1B,IAAyC,CAAC7B,CAAC,CAAC+B,MAAhD,EAAwD;AACtDR,MAAAA,qBAAqB,CAACvB,CAAC,CAAC8B,aAAF,CAAgBpD,KAAjB,CAArB;AACAD,MAAAA,SAAS,CAACM,OAAV,GAAoBiB,CAAC,CAAC8B,aAAF,CAAgBpD,KAApC;AACD;;AAEDT,IAAAA,gBAAgB,QAAhB,YAAAA,gBAAgB,CAAG+B,CAAH,CAAhB;AACD;AACF,CA3LyC,CAArC","sourcesContent":["import React, { Ref, useImperativeHandle, useRef, useState, useEffect } from 'react';\nimport { InputMask, MaskedPatternOptions, MaskedPattern } from 'imask';\nimport { IMaskInput, IMaskInputProps } from 'react-imask';\nimport { globalObject } from '@skbkontur/global-object';\n\nimport { Nullable } from '../../typings/utility-types';\nimport { MaskedInputElement, MaskedInputElementDataTids } from '../../internal/MaskedInputElement';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName';\nimport { cx } from '../../lib/theming/Emotion';\nimport { uiFontGlobalClasses } from '../../lib/styles/UiFont';\nimport { Input, InputProps, InputType } from '../Input';\nimport { isKeyBackspace, isKeyDelete, someKeys } from '../../lib/events/keyboard/identifiers';\nimport { isInstanceOf } from '../../lib/isInstanceOf';\n\nimport { globalClasses } from './MaskedInput.styles';\nimport { getDefinitions, getMaskChar } from './MaskedInput.helpers';\n\nexport interface MaskedProps {\n /** Паттерн маски */\n mask: string;\n /** Символ маски */\n maskChar?: Nullable<string>;\n /**\n * Словарь символов-регулярок для маски\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' }\n */\n formatChars?: Record<string, string>;\n /**\n * Показывать символы маски\n *\n * null - не показывать\n * true - показывать всегда\n * false - показывать по фокусу\n */\n alwaysShowMask?: boolean | null;\n /**\n * Пропы для компонента `IMaskInput`\n *\n * @see https://imask.js.org/guide.html\n */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nexport interface IMaskRefType {\n maskRef: InputMask<MaskedPatternOptions>;\n element: HTMLInputElement;\n}\n\nexport interface MaskedInputProps\n extends MaskedProps,\n Omit<InputProps, 'mask' | 'maxLength' | 'type' | 'alwaysShowMask'> {\n type?: MaskInputType;\n}\n\n/**\n * Интерфейс пропсов наследуется от `Input`.\n * Из пропсов `Input` исключены некоторые не применимые к полю с маской пропсы и сокращен список возможных значений в type.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask,\n imaskProps: { onAccept, ...customIMaskProps } = {},\n placeholder,\n onValueChange,\n onUnexpectedInput,\n onKeyDownCapture,\n onChange,\n element,\n ...inputProps\n } = props;\n\n const inputRef = useRef<Input>(null);\n const imaskRef = useRef<IMaskRefType>(null);\n\n const [focused, setFocused] = useState(false);\n const prevValue = useRef<string>(props.value || String(props.defaultValue) || '');\n const prevSelectionStart = useRef<number | null>(null);\n\n const showPlaceholder = !(alwaysShowMask || focused);\n\n useImperativeHandle(\n ref,\n () =>\n inputRef.current &&\n Object.assign(inputRef.current, {\n selectAll: inputRef.current.delaySelectAll,\n }),\n [],\n );\n\n useEffect(() => {\n /**\n * Для корректной работы `onUnexpectedInput` надо знать предыдущий `value`,\n * но `imask` при монтировании не вызывает `onAccept`, если `value` невалиден или `laze=false`\n * Поэтому актуальный `value` при монтировании надо получать вручную\n */\n if (inputRef.current?.input) {\n prevValue.current = inputRef.current.input.value;\n prevSelectionStart.current = inputRef.current.input.selectionStart;\n }\n }, []);\n\n // useEffect(() => {\n // inputRef.current &&\n // (inputRef.current.selectAll = () => {\n // setTimeout(() => {\n // inputRef.current?.setSelectionRange(0, 999);\n // });\n // });\n // }, []);\n\n const imaskProps = getCompatibleIMaskProps();\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n placeholder={showPlaceholder ? placeholder : undefined}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onInput={handleInput}\n onMouseUp={handleSelect}\n onKeyDownCapture={handleKeyDownCapture}\n className={cx(globalClasses.root, uiFontGlobalClasses.root)}\n data-tid={MaskedInputElementDataTids.root}\n element={\n <MaskedInputElement maskChars={getMaskChars(imaskProps)}>\n <IMaskInput ref={imaskRef} {...imaskProps} onAccept={handleAccept} />\n </MaskedInputElement>\n }\n />\n );\n\n function handleSelect(e: React.MouseEvent<HTMLInputElement>) {\n if (\n isInstanceOf(e.target, globalObject.HTMLInputElement) &&\n e.target === inputRef.current?.input &&\n e.target.closest('.react-ui-masked-input-root')\n ) {\n const nearest = imaskRef.current?.maskRef.masked.nearestInputPos(e.target.value.length, 'LEFT');\n if (\n typeof e.target.selectionStart === 'number' &&\n typeof nearest === 'number' &&\n e.target.selectionStart >= nearest\n ) {\n e.target.selectionStart = nearest;\n e.target.selectionEnd = nearest;\n }\n }\n }\n\n function getCompatibleIMaskProps(): IMaskInputProps<HTMLInputElement> {\n return {\n mask: mask.replace(/0/g, '{\\\\0}') as any,\n placeholderChar: getMaskChar(maskChar),\n definitions: getDefinitions(formatChars),\n eager: true,\n overwrite: 'shift',\n lazy: alwaysShowMask === null ? true : !(alwaysShowMask || focused),\n ...customIMaskProps,\n } as IMaskInputProps<HTMLInputElement>;\n }\n\n function getMaskChars(imaskProps: IMaskInputProps<HTMLInputElement>): string[] {\n const imaskPropsFix = imaskProps as MaskedPattern;\n const maskChars = [imaskPropsFix.placeholderChar];\n if (imaskPropsFix.blocks) {\n (Object.values(imaskPropsFix.blocks) as Array<{ placeholderChar?: string }>).forEach(\n ({ placeholderChar }) => placeholderChar && maskChars.push(placeholderChar),\n );\n }\n\n return maskChars;\n }\n\n function handleAccept(...args: Parameters<Required<IMaskInputProps<HTMLInputElement>>['onAccept']>) {\n const [value, , e] = args;\n\n onAccept?.(...args);\n\n /**\n * Метод `onAccept` может вызываться при монтировании, если не задан проп `defaultValue`.\n * Но нативный `input` никогда не вызывает `onChange` при монтировании.\n * Наше событие `onValueChange` в `Input` вывается в тех же случаях, что и нативный `onChange`,\n * поэтому чтобы сохранить консинстентность будем ориентироваться на наличие аргумента `e`.\n * Он содержит нативное событие, вызвавшее изменение.\n * Если его нет, значит `imask` вызывал `onAccept` по некой собственной логике.\n */\n e && onValueChange?.(value);\n }\n\n /**\n * Отслеживаем неожиданные нажатия\n * handleAccept не вызывается когда значение с маской не меняется\n * Сначала вызывается handleAccept, затем handleInput\n */\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n if (prevValue.current === e.target.value && prevSelectionStart.current === e.target.selectionStart) {\n handleUnexpectedInput(e.target.value);\n }\n\n prevValue.current = e.target.value;\n\n props.onInput?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n\n // если `value` из пропов отличается от `value`, которое получит `input` после обработки,\n // то `imask` будет ставить курсор за последним валидным символом.\n props.selectAllOnFocus && inputRef.current?.delaySelectAll();\n }\n\n function handleUnexpectedInput(value = '') {\n if (onUnexpectedInput) {\n onUnexpectedInput(value);\n } else if (inputRef.current) {\n inputRef.current.blink();\n }\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleKeyDownCapture(e: React.KeyboardEvent<HTMLInputElement>) {\n const isDeleteKey = someKeys(isKeyBackspace, isKeyDelete)(e);\n\n prevSelectionStart.current = e.currentTarget.selectionStart;\n\n if (!e.currentTarget.value && isDeleteKey && !e.repeat) {\n handleUnexpectedInput(e.currentTarget.value);\n prevValue.current = e.currentTarget.value;\n }\n\n onKeyDownCapture?.(e);\n }\n },\n);\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { InputMask, MaskedPatternOptions } from 'imask';
|
|
2
|
+
import { IMaskInputProps } from 'react-imask';
|
|
2
3
|
import { Nullable } from '../../typings/utility-types';
|
|
4
|
+
import { Input, InputProps, InputType } from '../Input';
|
|
3
5
|
export interface MaskedProps {
|
|
4
6
|
/** Паттерн маски */
|
|
5
7
|
mask: string;
|
|
@@ -10,11 +12,27 @@ export interface MaskedProps {
|
|
|
10
12
|
* @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' }
|
|
11
13
|
*/
|
|
12
14
|
formatChars?: Record<string, string>;
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Показывать символы маски
|
|
17
|
+
*
|
|
18
|
+
* null - не показывать
|
|
19
|
+
* true - показывать всегда
|
|
20
|
+
* false - показывать по фокусу
|
|
21
|
+
*/
|
|
22
|
+
alwaysShowMask?: boolean | null;
|
|
23
|
+
/**
|
|
24
|
+
* Пропы для компонента `IMaskInput`
|
|
25
|
+
*
|
|
26
|
+
* @see https://imask.js.org/guide.html
|
|
27
|
+
*/
|
|
28
|
+
imaskProps?: IMaskInputProps<HTMLInputElement>;
|
|
15
29
|
}
|
|
16
30
|
export declare type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;
|
|
17
|
-
export interface
|
|
31
|
+
export interface IMaskRefType {
|
|
32
|
+
maskRef: InputMask<MaskedPatternOptions>;
|
|
33
|
+
element: HTMLInputElement;
|
|
34
|
+
}
|
|
35
|
+
export interface MaskedInputProps extends MaskedProps, Omit<InputProps, 'mask' | 'maxLength' | 'type' | 'alwaysShowMask'> {
|
|
18
36
|
type?: MaskInputType;
|
|
19
37
|
}
|
|
20
38
|
/**
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { isNonNullable } from "../../../lib/utils";
|
|
2
|
+
export var DEFAULT_MASK_CHAR = '_';
|
|
3
|
+
export var DEFINITIONS = Object.freeze({
|
|
4
|
+
'9': /[0-9]/,
|
|
5
|
+
a: /[A-Za-z]/,
|
|
6
|
+
'*': /[A-Za-z0-9]/
|
|
7
|
+
});
|
|
8
|
+
export function getDefinitions(formatChars) {
|
|
9
|
+
if (isNonNullable(formatChars)) {
|
|
10
|
+
var chars = {};
|
|
11
|
+
|
|
12
|
+
for (var key in formatChars) {
|
|
13
|
+
chars[key] = new RegExp(formatChars[key]);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return chars;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return DEFINITIONS;
|
|
20
|
+
}
|
|
21
|
+
export function getMaskChar(maskChar) {
|
|
22
|
+
if (maskChar === null) {
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return maskChar === undefined ? DEFAULT_MASK_CHAR : maskChar;
|
|
27
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["MaskedInput.helpers.ts"],"names":["isNonNullable","DEFAULT_MASK_CHAR","DEFINITIONS","Object","freeze","a","getDefinitions","formatChars","chars","key","RegExp","getMaskChar","maskChar","undefined"],"mappings":";;AAEA,SAASA,aAAT,QAA8B,iBAA9B;;;;AAIA,OAAO,IAAMC,iBAAiB,GAAG,GAA1B;AACP,OAAO,IAAMC,WAAW,GAAGC,MAAM,CAACC,MAAP,CAAc,EAAE,KAAK,OAAP,EAAgBC,CAAC,EAAE,UAAnB,EAA+B,KAAK,aAApC,EAAd,CAApB;;AAEP,OAAO,SAASC,cAAT,CAAwBC,WAAxB,EAAsF;AAC3F,MAAIP,aAAa,CAACO,WAAD,CAAjB,EAAgC;AAC9B,QAAMC,KAA6B,GAAG,EAAtC;;AAEA,SAAK,IAAMC,GAAX,IAAkBF,WAAlB,EAA+B;AAC7BC,MAAAA,KAAK,CAACC,GAAD,CAAL,GAAa,IAAIC,MAAJ,CAAWH,WAAW,CAACE,GAAD,CAAtB,CAAb;AACD;;AAED,WAAOD,KAAP;AACD;;AAED,SAAON,WAAP;AACD;;AAED,OAAO,SAASS,WAAT,CAAqBC,QAArB,EAAkE;AACvE,MAAIA,QAAQ,KAAK,IAAjB,EAAuB;AACrB,WAAO,EAAP;AACD;;AAED,SAAOA,QAAQ,KAAKC,SAAb,GAAyBZ,iBAAzB,GAA6CW,QAApD;AACD","sourcesContent":["import IMask, { Definitions } from 'imask';\n\nimport { isNonNullable } from '../../lib/utils';\n\nexport type AnyIMaskType = ReturnType<typeof IMask.createMask>;\n\nexport const DEFAULT_MASK_CHAR = '_';\nexport const DEFINITIONS = Object.freeze({ '9': /[0-9]/, a: /[A-Za-z]/, '*': /[A-Za-z0-9]/ });\n\nexport function getDefinitions(formatChars: Record<string, string> | undefined): Definitions {\n if (isNonNullable(formatChars)) {\n const chars: Record<string, RegExp> = {};\n\n for (const key in formatChars) {\n chars[key] = new RegExp(formatChars[key]);\n }\n\n return chars;\n }\n\n return DEFINITIONS;\n}\n\nexport function getMaskChar(maskChar: string | null | undefined): string {\n if (maskChar === null) {\n return '';\n }\n\n return maskChar === undefined ? DEFAULT_MASK_CHAR : maskChar;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import IMask, { Definitions } from 'imask';
|
|
2
|
+
export declare type AnyIMaskType = ReturnType<typeof IMask.createMask>;
|
|
3
|
+
export declare const DEFAULT_MASK_CHAR = "_";
|
|
4
|
+
export declare const DEFINITIONS: Readonly<{
|
|
5
|
+
'9': RegExp;
|
|
6
|
+
a: RegExp;
|
|
7
|
+
'*': RegExp;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function getDefinitions(formatChars: Record<string, string> | undefined): Definitions;
|
|
10
|
+
export declare function getMaskChar(maskChar: string | null | undefined): string;
|
|
@@ -1,21 +1,185 @@
|
|
|
1
|
+
#### `mask`
|
|
2
|
+
|
|
3
|
+
Маска телефона
|
|
4
|
+
|
|
5
|
+
```jsx harmony
|
|
6
|
+
const [value, setValue] = React.useState('123');
|
|
7
|
+
|
|
8
|
+
<MaskedInput
|
|
9
|
+
mask="+7 999-999-99-99"
|
|
10
|
+
alwaysShowMask
|
|
11
|
+
value={value}
|
|
12
|
+
onValueChange={setValue}
|
|
13
|
+
/>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
#### `maskChar`
|
|
17
|
+
|
|
18
|
+
может изменить символ значения с маской
|
|
19
|
+
|
|
20
|
+
```jsx harmony
|
|
21
|
+
<MaskedInput
|
|
22
|
+
mask="9999 9999 9999 9999"
|
|
23
|
+
maskChar="X"
|
|
24
|
+
placeholder="Номер карты"
|
|
25
|
+
alwaysShowMask
|
|
26
|
+
/>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
#### `formatChars`
|
|
30
|
+
|
|
31
|
+
При необходимости можно настроить собственный словарь.
|
|
32
|
+
|
|
33
|
+
Возможности `imaskProps.blocks` намного шире. Смотрите пример ниже.
|
|
34
|
+
|
|
35
|
+
```jsx harmony
|
|
36
|
+
const [value, setValue] = React.useState('');
|
|
37
|
+
|
|
38
|
+
<MaskedInput
|
|
39
|
+
mask="Hh:Mm:Ss"
|
|
40
|
+
alwaysShowMask
|
|
41
|
+
formatChars={{
|
|
42
|
+
H: '[0-2]',
|
|
43
|
+
h: value.startsWith('2') ? '[0-3]' : '[0-9]',
|
|
44
|
+
M: '[0-5]',
|
|
45
|
+
m: '[0-9]',
|
|
46
|
+
S: '[0-5]',
|
|
47
|
+
s: '[0-9]',
|
|
48
|
+
}}
|
|
49
|
+
value={value}
|
|
50
|
+
onValueChange={setValue}
|
|
51
|
+
/>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### `alwaysShowMask`
|
|
55
|
+
|
|
56
|
+
Показывает маску всегда. Placeholder в этом случае игнорируется.
|
|
57
|
+
Логика немного отличается от старой реализации, из-за специфики iMask.
|
|
58
|
+
Раньше маска обязательно появлялась при фокусе, но теперь чтобы маску было видно надо явно задать этот проп.
|
|
59
|
+
|
|
60
|
+
```jsx harmony
|
|
61
|
+
<MaskedInput mask="+7 (999) 999-99-99" alwaysShowMask placeholder="Номер телефона" />
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
#### `imaskProps`*
|
|
65
|
+
|
|
66
|
+
Переопределяет пропы iMask.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
Контрол используется внутри пакет [iMask](https://imask.js.org/). Пропы `mask`, `maskChar` и `formatChars` прокидываются
|
|
71
|
+
с необходимыми доработками. Также для обратной совместимости со старым поведением добавляется несколько других пропов.
|
|
72
|
+
|
|
73
|
+
Обратите внимание, что в `definitions` попадает **`0: /\d/`**. Это дефолтное поле, которое нельзя удалить. Но в старой
|
|
74
|
+
реализации `0` считался фиксированным символом, из-за чего приходится немного редактировать маску.
|
|
75
|
+
|
|
76
|
+
Конвертация пропов выглядит примерно так:
|
|
77
|
+
|
|
78
|
+
```typescript static
|
|
79
|
+
mask: mask.replace(/0/g, '{\\0}'),
|
|
80
|
+
placeholderChar: props.maskChar || '_',
|
|
81
|
+
definitions: props.formatChars || { '9': /[0-9]/, a: /[A-Za-z]/, '*': /[A-Za-z0-9]/ },
|
|
82
|
+
eager: true,
|
|
83
|
+
overwrite: 'shift',
|
|
84
|
+
lazy: !alwaysShowMask,
|
|
85
|
+
...props.imaskProps,
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
##### `imaskProps.unmask`
|
|
91
|
+
|
|
92
|
+
Можно сразу получать value без фиксированных символов маски
|
|
93
|
+
|
|
1
94
|
```jsx harmony
|
|
2
|
-
|
|
95
|
+
const [value, setValue] = React.useState('');
|
|
96
|
+
|
|
97
|
+
<>
|
|
98
|
+
<span>unmask value: {value}</span>
|
|
99
|
+
<br />
|
|
100
|
+
<MaskedInput
|
|
101
|
+
mask="+7 (999) 999-99-99"
|
|
102
|
+
imaskProps={{
|
|
103
|
+
unmask: true
|
|
104
|
+
}}
|
|
105
|
+
alwaysShowMask
|
|
106
|
+
value={value}
|
|
107
|
+
onValueChange={setValue}
|
|
108
|
+
/>
|
|
109
|
+
</>
|
|
3
110
|
```
|
|
4
111
|
|
|
5
|
-
|
|
112
|
+
##### `imaskProps.mask []`
|
|
113
|
+
|
|
114
|
+
Опциональные части маски
|
|
115
|
+
|
|
6
116
|
```jsx harmony
|
|
7
|
-
|
|
117
|
+
const [value, setValue] = React.useState('');
|
|
118
|
+
const [complete, setComplete] = React.useState(false);
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
<MaskedInput
|
|
122
|
+
mask="99-999999[99]-99"
|
|
123
|
+
alwaysShowMask
|
|
124
|
+
rightIcon={complete ? '✅' : '⬜'}
|
|
125
|
+
imaskProps={{
|
|
126
|
+
onAccept: (v, imask) => {
|
|
127
|
+
setValue(v);
|
|
128
|
+
setComplete(imask.masked.isComplete);
|
|
129
|
+
}
|
|
130
|
+
}}
|
|
131
|
+
/>
|
|
8
132
|
```
|
|
9
133
|
|
|
10
|
-
|
|
134
|
+
##### `imaskProps.mask {}`
|
|
135
|
+
|
|
136
|
+
Фиксированные части маски, которые попадут в `value` при `unmask = true`. Любой невалидный символ (например`пробел`) переведёт каретку за фиксированный символ.
|
|
137
|
+
|
|
11
138
|
```jsx harmony
|
|
12
|
-
|
|
139
|
+
const [value, setValue] = React.useState('');
|
|
140
|
+
const [complete, setComplete] = React.useState(false);
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
<>
|
|
144
|
+
<span>unmask value: {value}</span>
|
|
145
|
+
<br />
|
|
146
|
+
<MaskedInput
|
|
147
|
+
mask="aa[aaaaaaaaaaaaaaaaa]{@}aa[aaaaaaaaaaaaaaaaa]{\.}aa[aaaa]"
|
|
148
|
+
alwaysShowMask
|
|
149
|
+
rightIcon={complete ? '✅' : '⬜'}
|
|
150
|
+
imaskProps={{
|
|
151
|
+
unmask: true,
|
|
152
|
+
onAccept: (v, imask) => {
|
|
153
|
+
setValue(v);
|
|
154
|
+
setComplete(imask.masked.isComplete);
|
|
155
|
+
}
|
|
156
|
+
}}
|
|
157
|
+
/>
|
|
158
|
+
</>
|
|
13
159
|
```
|
|
14
160
|
|
|
15
|
-
|
|
161
|
+
##### `imaskProps.blocks`
|
|
16
162
|
|
|
17
|
-
|
|
163
|
+
Пример маски времени. Нажмите цифру `6`, чтобы сработало автозаполнение.
|
|
18
164
|
|
|
19
|
-
|
|
165
|
+
```jsx harmony
|
|
166
|
+
import IMask from 'imask';
|
|
20
167
|
|
|
21
|
-
|
|
168
|
+
const block = {
|
|
169
|
+
mask: IMask.MaskedRange,
|
|
170
|
+
from: 0,
|
|
171
|
+
autofix: 'pad',
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
<MaskedInput
|
|
175
|
+
mask="HH:MM:SS"
|
|
176
|
+
imaskProps={{
|
|
177
|
+
blocks: {
|
|
178
|
+
HH: { ...block, to: 23, },
|
|
179
|
+
MM: { ...block, to: 59, },
|
|
180
|
+
SS: { ...block, to: 59, },
|
|
181
|
+
}
|
|
182
|
+
}}
|
|
183
|
+
alwaysShowMask
|
|
184
|
+
/>
|
|
185
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["MaskedInput.styles.ts"],"names":["prefix","globalClasses","root"],"mappings":"AAAA,SAASA,MAAT,QAAuB,2BAAvB;;AAEA,OAAO,IAAMC,aAAa,GAAGD,MAAM,CAAC,cAAD,CAAN,CAAuB;AAClDE,EAAAA,IAAI,EAAE,MAD4C,EAAvB,CAAtB","sourcesContent":["import { prefix } from '../../lib/theming/Emotion';\n\nexport const globalClasses = prefix('masked-input')({\n root: 'root',\n});\n"]}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
```jsx harmony
|
|
2
|
-
import { Gapped, Radio } from '@skbkontur/react-ui';
|
|
3
|
-
|
|
4
|
-
let items = ['One', 'Two', 'Three', 'Four'];
|
|
5
|
-
|
|
6
|
-
let simpleRadioGroup = (
|
|
7
|
-
<div>
|
|
8
|
-
<h2>Numbers</h2>
|
|
9
|
-
<RadioGroup name="number-simple" items={items} defaultValue="One" />
|
|
10
|
-
</div>
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
let complexRadioGroup = (
|
|
14
|
-
<div>
|
|
15
|
-
<h2>Numbers</h2>
|
|
16
|
-
<RadioGroup name="number-complex" defaultValue="3">
|
|
17
|
-
<Gapped gap={40}>
|
|
18
|
-
<Gapped vertical gap={0}>
|
|
19
|
-
<b>Odd</b>
|
|
20
|
-
<Radio value="1">One</Radio>
|
|
21
|
-
<Radio value="3">Three</Radio>
|
|
22
|
-
<Radio value="5" disabled>
|
|
23
|
-
Five
|
|
24
|
-
</Radio>
|
|
25
|
-
<Radio value="7">Seven</Radio>
|
|
26
|
-
</Gapped>
|
|
27
|
-
<Gapped vertical gap={0}>
|
|
28
|
-
<b>Even</b>
|
|
29
|
-
<Radio value="2">Two</Radio>
|
|
30
|
-
<Radio value="4">Four</Radio>
|
|
31
|
-
<Radio value="6">Six</Radio>
|
|
32
|
-
<Radio value="8">Eight</Radio>
|
|
33
|
-
</Gapped>
|
|
34
|
-
</Gapped>
|
|
35
|
-
</RadioGroup>
|
|
36
|
-
</div>
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
<div>
|
|
40
|
-
{simpleRadioGroup}
|
|
41
|
-
{complexRadioGroup}
|
|
42
|
-
</div>;
|
|
43
|
-
```
|
|
1
|
+
```jsx harmony
|
|
2
|
+
import { Gapped, Radio } from '@skbkontur/react-ui';
|
|
3
|
+
|
|
4
|
+
let items = ['One', 'Two', 'Three', 'Four'];
|
|
5
|
+
|
|
6
|
+
let simpleRadioGroup = (
|
|
7
|
+
<div>
|
|
8
|
+
<h2>Numbers</h2>
|
|
9
|
+
<RadioGroup name="number-simple" items={items} defaultValue="One" />
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
let complexRadioGroup = (
|
|
14
|
+
<div>
|
|
15
|
+
<h2>Numbers</h2>
|
|
16
|
+
<RadioGroup name="number-complex" defaultValue="3">
|
|
17
|
+
<Gapped gap={40}>
|
|
18
|
+
<Gapped vertical gap={0}>
|
|
19
|
+
<b>Odd</b>
|
|
20
|
+
<Radio value="1">One</Radio>
|
|
21
|
+
<Radio value="3">Three</Radio>
|
|
22
|
+
<Radio value="5" disabled>
|
|
23
|
+
Five
|
|
24
|
+
</Radio>
|
|
25
|
+
<Radio value="7">Seven</Radio>
|
|
26
|
+
</Gapped>
|
|
27
|
+
<Gapped vertical gap={0}>
|
|
28
|
+
<b>Even</b>
|
|
29
|
+
<Radio value="2">Two</Radio>
|
|
30
|
+
<Radio value="4">Four</Radio>
|
|
31
|
+
<Radio value="6">Six</Radio>
|
|
32
|
+
<Radio value="8">Eight</Radio>
|
|
33
|
+
</Gapped>
|
|
34
|
+
</Gapped>
|
|
35
|
+
</RadioGroup>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
<div>
|
|
40
|
+
{simpleRadioGroup}
|
|
41
|
+
{complexRadioGroup}
|
|
42
|
+
</div>;
|
|
43
|
+
```
|
package/index.d.ts
CHANGED
|
@@ -45,6 +45,7 @@ export * from './components/TokenInput';
|
|
|
45
45
|
export * from './components/Tooltip';
|
|
46
46
|
export * from './components/TooltipMenu';
|
|
47
47
|
export * from './components/ResponsiveLayout';
|
|
48
|
+
export * from './components/MaskedInput';
|
|
48
49
|
export * from './lib/featureFlagsContext';
|
|
49
50
|
export * from './lib/locale';
|
|
50
51
|
export * from './lib/theming/ThemeContext';
|
|
@@ -55,6 +56,8 @@ export * from './lib/theming/themes/DefaultTheme8pxOld';
|
|
|
55
56
|
export * from './lib/theming/themes/FlatTheme8pxOld';
|
|
56
57
|
export * from './lib/theming/themes/Theme2022';
|
|
57
58
|
export * from './lib/theming/themes/Theme2022Dark';
|
|
59
|
+
export * from './lib/theming/themes/Theme2022Update2024';
|
|
60
|
+
export * from './lib/theming/themes/Theme2022DarkUpdate2024';
|
|
58
61
|
export * from './lib/types/props';
|
|
59
62
|
export * from './internal/Popup/types';
|
|
60
63
|
export * as ColorFunctions from './lib/styles/ColorFunctions';
|
package/index.js
CHANGED
|
@@ -45,6 +45,7 @@ export * from './components/TokenInput';
|
|
|
45
45
|
export * from './components/Tooltip';
|
|
46
46
|
export * from './components/TooltipMenu';
|
|
47
47
|
export * from './components/ResponsiveLayout';
|
|
48
|
+
export * from './components/MaskedInput';
|
|
48
49
|
export * from './lib/featureFlagsContext';
|
|
49
50
|
export * from './lib/locale';
|
|
50
51
|
export * from './lib/theming/ThemeContext';
|
|
@@ -55,6 +56,8 @@ export * from './lib/theming/themes/DefaultTheme8pxOld';
|
|
|
55
56
|
export * from './lib/theming/themes/FlatTheme8pxOld';
|
|
56
57
|
export * from './lib/theming/themes/Theme2022';
|
|
57
58
|
export * from './lib/theming/themes/Theme2022Dark';
|
|
59
|
+
export * from './lib/theming/themes/Theme2022Update2024';
|
|
60
|
+
export * from './lib/theming/themes/Theme2022DarkUpdate2024';
|
|
58
61
|
export * from './lib/types/props';
|
|
59
62
|
export * from './internal/Popup/types';import * as _ColorFunctions from
|
|
60
63
|
'./lib/styles/ColorFunctions';export { _ColorFunctions as ColorFunctions };import * as _DimensionFunctions from
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.ts"],"names":["ColorFunctions","DimensionFunctions"],"mappings":"AAAA,cAAc,2BAAd;AACA,cAAc,qBAAd;AACA,cAAc,uBAAd;AACA,cAAc,qBAAd;AACA,cAAc,uBAAd;AACA,cAAc,uBAAd;AACA,cAAc,4BAAd;AACA,cAAc,4BAAd;AACA,cAAc,wBAAd;AACA,cAAc,yBAAd;AACA,cAAc,uBAAd;AACA,cAAc,2BAAd;AACA,cAAc,2BAAd;AACA,cAAc,sBAAd;AACA,cAAc,qBAAd;AACA,cAAc,2BAAd;AACA,cAAc,oBAAd;AACA,cAAc,mBAAd;AACA,cAAc,oBAAd;AACA,cAAc,oBAAd;AACA,cAAc,mBAAd;AACA,cAAc,qBAAd;AACA,cAAc,yBAAd;AACA,cAAc,uBAAd;AACA,cAAc,4BAAd;AACA,cAAc,wBAAd;AACA,cAAc,oBAAd;AACA,cAAc,qBAAd;AACA,cAAc,4BAAd;AACA,cAAc,oBAAd;AACA,cAAc,yBAAd;AACA,cAAc,8BAAd;AACA,cAAc,qBAAd;AACA,cAAc,uBAAd;AACA,cAAc,sBAAd;AACA,cAAc,qBAAd;AACA,cAAc,uBAAd;AACA,cAAc,mBAAd;AACA,cAAc,uBAAd;AACA,cAAc,oBAAd;AACA,cAAc,0BAAd;AACA,cAAc,qBAAd;AACA,cAAc,oBAAd;AACA,cAAc,yBAAd;AACA,cAAc,sBAAd;AACA,cAAc,0BAAd;AACA,cAAc,+BAAd;AACA,cAAc,2BAAd;AACA,cAAc,cAAd;AACA,cAAc,4BAAd;AACA,cAAc,4BAAd;AACA,cAAc,mCAAd;AACA,cAAc,gCAAd;AACA,cAAc,yCAAd;AACA,cAAc,sCAAd;AACA,cAAc,gCAAd;AACA,cAAc,oCAAd;AACA,cAAc,mBAAd;AACA,cAAc,wBAAd,C;AACgC,6B,6BAApBA,c;AACwB,iC,iCAAxBC,kB","sourcesContent":["export * from './components/Autocomplete';\nexport * from './components/Button';\nexport * from './components/Calendar';\nexport * from './components/Center';\nexport * from './components/Checkbox';\nexport * from './components/ComboBox';\nexport * from './components/CurrencyInput';\nexport * from './components/CurrencyLabel';\nexport * from './components/DateInput';\nexport * from './components/DatePicker';\nexport * from './components/Dropdown';\nexport * from './components/DropdownMenu';\nexport * from './components/FileUploader';\nexport * from './components/FxInput';\nexport * from './components/Gapped';\nexport * from './components/GlobalLoader';\nexport * from './components/Group';\nexport * from './components/Hint';\nexport * from './components/Input';\nexport * from './components/Kebab';\nexport * from './components/Link';\nexport * from './components/Loader';\nexport * from './components/MenuHeader';\nexport * from './components/MenuItem';\nexport * from './components/MenuSeparator';\nexport * from './components/MiniModal';\nexport * from './components/Modal';\nexport * from './components/Paging';\nexport * from './components/PasswordInput';\nexport * from './components/Radio';\nexport * from './components/RadioGroup';\nexport * from './components/ScrollContainer';\nexport * from './components/Select';\nexport * from './components/SidePage';\nexport * from './components/Spinner';\nexport * from './components/Sticky';\nexport * from './components/Switcher';\nexport * from './components/Tabs';\nexport * from './components/Textarea';\nexport * from './components/Toast';\nexport * from './components/SingleToast';\nexport * from './components/Toggle';\nexport * from './components/Token';\nexport * from './components/TokenInput';\nexport * from './components/Tooltip';\nexport * from './components/TooltipMenu';\nexport * from './components/ResponsiveLayout';\nexport * from './lib/featureFlagsContext';\nexport * from './lib/locale';\nexport * from './lib/theming/ThemeContext';\nexport * from './lib/theming/ThemeFactory';\nexport * from './lib/theming/themes/DefaultTheme';\nexport * from './lib/theming/themes/DarkTheme';\nexport * from './lib/theming/themes/DefaultTheme8pxOld';\nexport * from './lib/theming/themes/FlatTheme8pxOld';\nexport * from './lib/theming/themes/Theme2022';\nexport * from './lib/theming/themes/Theme2022Dark';\nexport * from './lib/types/props';\nexport * from './internal/Popup/types';\nexport * as ColorFunctions from './lib/styles/ColorFunctions';\nexport * as DimensionFunctions from './lib/styles/DimensionFunctions';\n"]}
|
|
1
|
+
{"version":3,"sources":["index.ts"],"names":["ColorFunctions","DimensionFunctions"],"mappings":"AAAA,cAAc,2BAAd;AACA,cAAc,qBAAd;AACA,cAAc,uBAAd;AACA,cAAc,qBAAd;AACA,cAAc,uBAAd;AACA,cAAc,uBAAd;AACA,cAAc,4BAAd;AACA,cAAc,4BAAd;AACA,cAAc,wBAAd;AACA,cAAc,yBAAd;AACA,cAAc,uBAAd;AACA,cAAc,2BAAd;AACA,cAAc,2BAAd;AACA,cAAc,sBAAd;AACA,cAAc,qBAAd;AACA,cAAc,2BAAd;AACA,cAAc,oBAAd;AACA,cAAc,mBAAd;AACA,cAAc,oBAAd;AACA,cAAc,oBAAd;AACA,cAAc,mBAAd;AACA,cAAc,qBAAd;AACA,cAAc,yBAAd;AACA,cAAc,uBAAd;AACA,cAAc,4BAAd;AACA,cAAc,wBAAd;AACA,cAAc,oBAAd;AACA,cAAc,qBAAd;AACA,cAAc,4BAAd;AACA,cAAc,oBAAd;AACA,cAAc,yBAAd;AACA,cAAc,8BAAd;AACA,cAAc,qBAAd;AACA,cAAc,uBAAd;AACA,cAAc,sBAAd;AACA,cAAc,qBAAd;AACA,cAAc,uBAAd;AACA,cAAc,mBAAd;AACA,cAAc,uBAAd;AACA,cAAc,oBAAd;AACA,cAAc,0BAAd;AACA,cAAc,qBAAd;AACA,cAAc,oBAAd;AACA,cAAc,yBAAd;AACA,cAAc,sBAAd;AACA,cAAc,0BAAd;AACA,cAAc,+BAAd;AACA,cAAc,0BAAd;AACA,cAAc,2BAAd;AACA,cAAc,cAAd;AACA,cAAc,4BAAd;AACA,cAAc,4BAAd;AACA,cAAc,mCAAd;AACA,cAAc,gCAAd;AACA,cAAc,yCAAd;AACA,cAAc,sCAAd;AACA,cAAc,gCAAd;AACA,cAAc,oCAAd;AACA,cAAc,0CAAd;AACA,cAAc,8CAAd;AACA,cAAc,mBAAd;AACA,cAAc,wBAAd,C;AACgC,6B,6BAApBA,c;AACwB,iC,iCAAxBC,kB","sourcesContent":["export * from './components/Autocomplete';\nexport * from './components/Button';\nexport * from './components/Calendar';\nexport * from './components/Center';\nexport * from './components/Checkbox';\nexport * from './components/ComboBox';\nexport * from './components/CurrencyInput';\nexport * from './components/CurrencyLabel';\nexport * from './components/DateInput';\nexport * from './components/DatePicker';\nexport * from './components/Dropdown';\nexport * from './components/DropdownMenu';\nexport * from './components/FileUploader';\nexport * from './components/FxInput';\nexport * from './components/Gapped';\nexport * from './components/GlobalLoader';\nexport * from './components/Group';\nexport * from './components/Hint';\nexport * from './components/Input';\nexport * from './components/Kebab';\nexport * from './components/Link';\nexport * from './components/Loader';\nexport * from './components/MenuHeader';\nexport * from './components/MenuItem';\nexport * from './components/MenuSeparator';\nexport * from './components/MiniModal';\nexport * from './components/Modal';\nexport * from './components/Paging';\nexport * from './components/PasswordInput';\nexport * from './components/Radio';\nexport * from './components/RadioGroup';\nexport * from './components/ScrollContainer';\nexport * from './components/Select';\nexport * from './components/SidePage';\nexport * from './components/Spinner';\nexport * from './components/Sticky';\nexport * from './components/Switcher';\nexport * from './components/Tabs';\nexport * from './components/Textarea';\nexport * from './components/Toast';\nexport * from './components/SingleToast';\nexport * from './components/Toggle';\nexport * from './components/Token';\nexport * from './components/TokenInput';\nexport * from './components/Tooltip';\nexport * from './components/TooltipMenu';\nexport * from './components/ResponsiveLayout';\nexport * from './components/MaskedInput';\nexport * from './lib/featureFlagsContext';\nexport * from './lib/locale';\nexport * from './lib/theming/ThemeContext';\nexport * from './lib/theming/ThemeFactory';\nexport * from './lib/theming/themes/DefaultTheme';\nexport * from './lib/theming/themes/DarkTheme';\nexport * from './lib/theming/themes/DefaultTheme8pxOld';\nexport * from './lib/theming/themes/FlatTheme8pxOld';\nexport * from './lib/theming/themes/Theme2022';\nexport * from './lib/theming/themes/Theme2022Dark';\nexport * from './lib/theming/themes/Theme2022Update2024';\nexport * from './lib/theming/themes/Theme2022DarkUpdate2024';\nexport * from './lib/types/props';\nexport * from './internal/Popup/types';\nexport * as ColorFunctions from './lib/styles/ColorFunctions';\nexport * as DimensionFunctions from './lib/styles/DimensionFunctions';\n"]}
|