{"id":14373959,"url":"https://github.com/Skeptick/input-mask-compose","last_synced_at":"2025-08-22T19:31:50.550Z","repository":{"id":236384329,"uuid":"792503678","full_name":"Skeptick/input-mask-compose","owner":"Skeptick","description":null,"archived":false,"fork":false,"pushed_at":"2024-12-17T21:36:33.000Z","size":93,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-17T22:30:40.524Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Skeptick.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-26T20:04:42.000Z","updated_at":"2024-12-17T21:35:28.000Z","dependencies_parsed_at":"2024-12-18T00:02:25.121Z","dependency_job_id":null,"html_url":"https://github.com/Skeptick/input-mask-compose","commit_stats":null,"previous_names":["skeptick/input-mask-compose"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Skeptick%2Finput-mask-compose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Skeptick%2Finput-mask-compose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Skeptick%2Finput-mask-compose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Skeptick%2Finput-mask-compose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Skeptick","download_url":"https://codeload.github.com/Skeptick/input-mask-compose/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230628980,"owners_count":18256096,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-28T02:01:15.023Z","updated_at":"2025-08-22T19:31:50.532Z","avatar_url":"https://github.com/Skeptick.png","language":"Kotlin","funding_links":[],"categories":["Multiplatform"],"sub_categories":["Android samples"],"readme":"# input-mask-compose\n\nБиблиотека для форматирования вводимых пользователем значений с поддержкой Compose Multiplatform.\n\n## Использование\n\n```kotlin\nkotlin {\n    sourceSets {\n        commonMain {\n            dependencies {\n                implementation(\"io.github.skeptick.inputmask:inputmask-core:0.0.6\")\n                implementation(\"io.github.skeptick.inputmask:inputmask-compose:0.0.6\")\n            }\n        }\n    }\n}\n```\n\n## Поддерживаемые платформы\n\n`core` поддерживает все таргеты Kotlin, `compose` все таргеты Compose Multiplatform.\n\n## Идея\n\nСинтаксис масок вдохновлён небезызвестной библиотекой от RedMadRobot (\n[Android](https://github.com/RedMadRobot/input-mask-android),\n[iOS](https://github.com/RedMadRobot/input-mask-ios)\n), но реализация гораздо более примитивная. В частности, не поддерживаются\n[«родственные» маски](https://github.com/RedMadRobot/input-mask-android/wiki/2.1-Affine-Masks).\n\n## Объявление масок\n\nДетальнее [в документации RedMadRobot](https://github.com/RedMadRobot/input-mask-android/wiki/Mask-Syntax:-Basics).  \n\nВерхнеуровнево:\n- в `[]` описываем то, что ожидаем от пользователя\n- в `{}` любые символы, которые хотим получить в извлекаемом значении\n- все символы за пределами `[]` и `{}` будут вставлены в процессе форматирования, но не попадут в извлекаемое значение\n\nВ `[]` поддерживаются следующие символы:\n- `0` - обязательная цифра\n- `9` - опциональная цифра\n- `A` - обязательная буква\n- `a` - опциональная буква\n- `_` - обязательная буква или цифра\n- `-` - опциональная буква или цифра\n- `…` - неограниченное количество цифр или букв\n  - если перед `…` стоит `0` или `9`, то будут ожидаться цифровые символы\n  - если перед `…` стоит `A` или `a`, то будут ожидаться буквенные символы\n  - если перед `…` стоит `_` или `-`, или не стоит ничего, то будут ожидаться буквы или цифры\n\n### Создание маски\n\n```kotlin\nval inputMask = InputMasks.getOrCreate(\"+{7} ([000]) [000]-[0000]\")\n```\n\nПоддерживается создание с помощью простого DSL:\n```kotlin\nval inputMask = InputMasks.build {\n    fixedChar('+', extracted = false)\n    fixedChar('7', extracted = true)\n    fixedChar(' ', extracted = false)\n    fixedChar('(', extracted = false)\n    repeat(3) { singleDigit(required = true) }\n    fixedChar(')', extracted = false)\n    fixedChar(' ', extracted = false)\n    repeat(3) { singleDigit(required = true) }\n    fixedChar('-', extracted = false)\n    repeat(4) { singleDigit(required = true) }\n}\n\n```\n### Использование\n\n```kotlin\nval result = inputMask.format(\"9001234567\")\nresult.isComplete // -\u003e true\nresult.formattedValue // -\u003e +7 (900) 123-4567\nresult.extractedValue // -\u003e 79001234567\n```\n\nОбратите внимание на параметр `replacePrefix`:\n\n```kotlin\ninputMask.format(\"79001234567\", replacePrefix = true) // -\u003e +7 (900) 123-4567\ninputMask.format(\"79001234567\", replacePrefix = false) // -\u003e +7 (790) 012-3456\n```\n\n### Использование в Compose\n\nАртефакт `compose` поставляет имлементации `VisualTransformation` для `TextField` принимающих `String` или `TextFieldValue`:\n\n```kotlin\nvar text by remember { mutableStateOf(\"\") }\nval visualTransformation = rememberInputMaskVisualTransformation(\"[000]-[000]\")\n\nBasicTextField(\n    value = text,\n    onValueChange = { text = visualTransformation.sanitize(it) },\n    visualTransformation = visualTransformation,\n)\n```\n\nСпециальная вариация для форматирования телефона, обрабатывающая вставку в поле ввода номера как\nс кодом страны, так и без:\n\n```kotlin\nvar text by remember { mutableStateOf(\"\") }\nval mask = \"+{7} ([000]) [000]-[0000]\"\nval visualTransformation = rememberPhoneInputMaskVisualTransformation(mask)\n\nBasicTextField(\n    value = value,\n    onValueChange = { text = visualTransformation.sanitize(it) },\n    visualTransformation = visualTransformation,\n)\n```\n\nОбратите внимание, что если маска может измениться в процессе ввода (например, пользователю предоставляется\nвозможность выбрать страну во время авторизации), то нужно также обновить значение:\n\n```kotlin\nBasicTextField(\n    value = remember(text, mask) { visualTransformation.sanitize(value) },\n    // ...\n)\n```\n\nДля полей ввода, построенных вокруг `TextFieldState` есть имплементации `InputTransformation` и `OutputTransformation`:\n\n```kotlin\nval textFieldState = remember { TextFieldState() }\nval mask = \"[000]-[000]\"\n\nBasicTextField(\n    state = textFieldState,\n    inputTransformation = rememberInputMaskInputTransformation(mask),\n    outputTransformation = rememberInputMaskOutputTransformation(mask),\n)\n```\n\nИ специальная вариация `InputTransformation` для телефонных номеров:\n\n```kotlin\nBasicTextField(\n    // ...\n    inputTransformation = rememberPhoneInputMaskInputTransformation(mask),\n    // ...\n)\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSkeptick%2Finput-mask-compose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSkeptick%2Finput-mask-compose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSkeptick%2Finput-mask-compose/lists"}