Pantrix UI

Filled Secure Text Field

Etiketi kutusunun içinde duran güvenli metin alanı: bir şifre, bir PIN ya da bir kartın güvenlik kodu, PantrixFilledTextField'ın dolgulu kutusunda.

import com.pantrixui.components.inputs.filledsecuretextfield.PantrixFilledSecureTextField

Örnekler

En yalın hâli

En az yazılan: bir TextFieldState ve bir etiket. Etiket kutunun içindedir: alan boşken yazının yerinde durur, alana basınca yazının üstündeki satırına çıkar. Yazılan nokta nokta çizilir; kesilemez ve kopyalanamaz.

Bir şey yazıp kutunun sonundaki göz düğmesine bas: metin görünür, bir daha basınca yeniden gizlenir. Fareyle basmak imleci alandan çıkarmaz; klavyede Tab alandan sonra düğmeye uğrar. Metnin gösterildiği kaydedilmez.

PantrixFilledSecureTextField(
    state = rememberTextFieldState(),
    modifier = Modifier.fillMaxWidth(),
    label = "Kasa şifresi",
    tagKey = "safe_password"
)

Yardım metni ve hata

supportingText kutunun altında durur. error = true kutuyu danger rengiyle çerçeveler; yardım metni ve imleç de o renge döner ve mesaj ekran okuyucuya hata olarak bildirilir. Etiket kendi renginde kalır.

Alan hatada başlar: metninde bir boşluk var. Göz düğmesine basıp metni gör ve boşluğu sil: hata kalkar. Hatayı alan değil çağıran hesaplar; burada password.text'i okuyarak.

val password = rememberTextFieldState("gizli sifre")
val hasSpace = password.text.contains(' ')
PantrixFilledSecureTextField(
    state = password,
    modifier = Modifier.fillMaxWidth(),
    label = "Uygulama kilidi",
    supportingText = if (hasSpace) "Şifrede boşluk olamaz" else "Boşluk içermeyen bir şifre",
    error = hasSpace,
    showClearButton = true,
    tagKey = "app_lock"
)

İkon, temizleme düğmesi ve sayaç

leadingIcon etiketin ve metnin önünde durur. Yuva içine konanı boyutlandırmaz: buradaki ikona dolgulu alanın stilindeki boyutu örnek kendisi verir, PantrixTheme.style(FilledTextFieldStyle).iconSize. Kutunun sonundakiler hep aynı sıradadır: önce temizleme düğmesi, sonra metni gösteren düğme, verilmişse en sonda trailingIcon.

Temizleme düğmesi alan boş değilken görünür, imleci alanda bırakır ve Tab durağı değildir; göz düğmesi ise bir Tab durağıdır. maxLength = 16 daha uzun bir şifreyi almaz ve sayacı kutunun altına yazar.

PantrixFilledSecureTextField(
    state = rememberTextFieldState(),
    modifier = Modifier.fillMaxWidth(),
    label = "Yönetici şifresi",
    leadingIcon = {
        PantrixIcon(
            imageVector = PantrixIcons.Person,
            contentDescription = null,
            size = PantrixTheme.style(FilledTextFieldStyle).iconSize
        )
    },
    showClearButton = true,
    maxLength = 16,
    tagKey = "admin_password"
)

Forma bağlı bir şifre değişikliği

İki alan da değerini, hatasını ve adını formdaki alanından alır. Mevcut şifrede klavyenin "İleri" tuşu odağı yeni şifreye taşır; yeni şifrede eylem tuşu formu "Şifreyi değiştir" düğmesi üzerinden gönderir. İki alanı boş bırakıp düğmeye bas: form gönderilmez, hatalı ilk alan odağı alır.

Yeni şifre platforma seçilmekte olan bir şifre olarak bildirilir (ContentType.NewPassword): bir şifre yöneticisi buraya kayıtlı olanı doldurmayı değil, yenisini önermeyi teklif eder. Mevcut şifrede contentType verilmedi: alan ContentType.Password tutar.

val snackbars = LocalPantrixSnackbars.current
val scope = rememberCoroutineScope()
val form = rememberFormState()
PantrixFilledSecureTextField(
    field = form.field("current_password", initial = "", Rules.notBlank("Mevcut şifrenizi yazın")),
    modifier = Modifier.fillMaxWidth(),
    form = form,
    label = "Mevcut şifre",
    keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next)
)
PantrixFilledSecureTextField(
    field = form.field("new_password", initial = "", Rules.minLength(8, "Yeni şifre en az 8 karakter olmalı")),
    modifier = Modifier.fillMaxWidth(),
    form = form,
    label = "Yeni şifre",
    supportingText = "En az 8 karakter",
    showClearButton = true,
    contentType = ContentType.NewPassword
)
PantrixButton(
    text = "Şifreyi değiştir",
    onClick = {
        scope.launch {
            form.submit { snackbars?.show(message = "Şifre değiştirildi", tagKey = "password_changed") }
        }
    },
    form = form,
    tagKey = "change_password"
)

Kullanılacağı anda okunan güvenlik kodu

Kartın arkasındaki üç rakamlı güvenlik kodu: klavyesi rakam klavyesidir, rakam olmayanı bir giriş dönüşümü geri çevirir ve sayacı gösterilmez. Göz düğmesi durur: kullanıcı yazdığı kodu karttakiyle karşılaştırabilsin diye.

Metin kullanılacağı anda durumdan okunur: düğmeye basılınca code.text. Arada bir yere taşınmaz, alanın durumu tek kaynağıdır. Bildirim kodun kendisini değil, kaç rakam alındığını söyler.

val snackbars = LocalPantrixSnackbars.current
val scope = rememberCoroutineScope()
val code = rememberTextFieldState()
PantrixFilledSecureTextField(
    state = code,
    modifier = Modifier.fillMaxWidth(),
    label = "Güvenlik kodu",
    placeholder = "000",
    supportingText = "Kartın arkasındaki üç rakam",
    maxLength = 3,
    showCharacterCount = false,
    keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.NumberPassword),
    inputTransformation = DigitsOnly,
    contentType = ContentType.CreditCardSecurityCode,
    tagKey = "card_code"
)
PantrixButton(
    text = "Kartı doğrula",
    onClick = {
        val entered = code.text.toString()
        val message = when (entered.length) {
            3 -> "Kod alındı: ${entered.length} rakam"
            else -> "Kod 3 rakam olmalı, ${entered.length} rakam yazıldı"
        }
        scope.launch { snackbars?.show(message = message, tagKey = "card_code_read") }
    },
    tagKey = "verify_card"
)

private val DigitsOnly = InputTransformation {
    if (!asCharSequence().all(Char::isDigit)) revertAllChanges()
}

Yazıldıkça izlenen metin

Metni yazıldıkça isteyen bir çağıran onu durumdan izler: snapshotFlow { state.text.toString() } her değişikliği verir, burada çağıranın tuttuğu bir String'e. Yardım metni o String'ten üretilir ve şifrede neyin eksik olduğunu söyler.

Akış tek yönlüdür: metin alandan çağırana akar. Bir ViewModel'e taşımak da aynı biçimde yazılır: her değişiklik collect içinde ViewModel'e bildirilir.

var password by remember { mutableStateOf("") }
val state = rememberTextFieldState(password)
LaunchedEffect(state) {
    snapshotFlow { state.text.toString() }.collect { password = it }
}
PantrixFilledSecureTextField(
    state = state,
    modifier = Modifier.fillMaxWidth(),
    label = "Yeni hesap şifresi",
    supportingText = when {
        password.isEmpty() -> "En az 10 karakter, içinde bir rakam"
        password.length < 10 -> "${10 - password.length} karakter daha"
        password.none(Char::isDigit) -> "Bir rakam ekleyin"
        else -> "Şifre yeterli"
    },
    contentType = ContentType.NewPassword,
    tagKey = "followed_password"
)

Hiç gösterilmeyen bir PIN

showRevealButton = false göz düğmesini kaldırır: metin textObfuscationMode'un çizdiği gibi kalır. TextObfuscationMode.Hidden ile son yazılan rakam hiçbir platformda görünmez; varsayılan System, Android'de sistemin kendi ayarı öyle diyorsa son yazılan karakteri bir an gösterirdi. textObfuscationCharacter noktanın yerine yıldız çizer.

Klavyesi bir PIN'inkidir: KeyboardType.NumberPassword. maxLength = 4 beşinci rakamı almaz ve sayacı kutunun altına yazar.

PantrixFilledSecureTextField(
    state = rememberTextFieldState(),
    modifier = Modifier.fillMaxWidth(),
    label = "Kart şifresi",
    supportingText = "Dört rakam",
    showRevealButton = false,
    maxLength = 4,
    textObfuscationMode = TextObfuscationMode.Hidden,
    textObfuscationCharacter = '*',
    keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.NumberPassword),
    inputTransformation = DigitsOnly,
    tagKey = "card_pin"
)

private val DigitsOnly = InputTransformation {
    if (!asCharSequence().all(Char::isDigit)) revertAllChanges()
}

Devre dışı ve salt okunur

enabled = false alanın dolgusunu kaldırır: alan temanın devre dışı yazı rengiyle çizilir, odak almaz ve metnini gösteren düğmesi yoktur.

readOnly = true alanın dolgusu yerindedir: alan odaklanır ve metni göz düğmesiyle gösterilebilir, ama değiştirilemez.

PantrixFilledSecureTextField(
    state = rememberTextFieldState("degismez"),
    modifier = Modifier.fillMaxWidth(),
    enabled = false,
    label = "Uygulama şifresi",
    supportingText = "Kuruluşunuz belirler",
    tagKey = "managed_password"
)
PantrixFilledSecureTextField(
    state = rememberTextFieldState("PX-7730-1184"),
    modifier = Modifier.fillMaxWidth(),
    readOnly = true,
    label = "Yedek kod",
    supportingText = "Göz düğmesiyle gösterilir, değiştirilemez",
    tagKey = "backup_code"
)

Kendi renkleri ve stili

Dolgulu güvenli alan, dolgulu metin alanının FilledTextFieldColors'ını ve FilledTextFieldStyle'ını alır: iki dolgulu alan birlikte biçimlenir.

İlk alanın dolgusu, etiketi, yazısı, ikonu, çerçevesi ve imleci uygulamanın kendi morundandır; göz düğmesi ikon rengiyle çizilir. Verilmeyenler, odaktaki dolgu gibi, temadaki rolünde kalır. İkincinin kutusu tam yuvarlaktır: FilledTextFieldStyle(shape = ShapeRole.Full).

val own = ownColors()
PantrixFilledSecureTextField(
    state = rememberTextFieldState(),
    modifier = Modifier.fillMaxWidth(),
    label = "Üyelik şifresi",
    colors = FilledTextFieldColors(
        container = own.container,
        focusedOutline = own.color,
        text = own.onContainer,
        label = own.onContainer,
        icon = own.onContainer,
        cursor = own.color
    ),
    tagKey = "own_colors"
)
PantrixFilledSecureTextField(
    state = rememberTextFieldState(),
    modifier = Modifier.fillMaxWidth(),
    label = "Arşiv şifresi",
    style = FilledTextFieldStyle(shape = ShapeRole.Full),
    tagKey = "pill"
)

API

state

Etiketi kutusunun içinde duran güvenli metin alanı: bir şifre, bir PIN ya da bir kartın güvenlik kodu, PantrixFilledTextField'ın dolgulu kutusunda.

ParametreTürVarsayılanNe olduğu
stateTextFieldStateMetin ve seçim. rememberTextFieldState() ile kurulur ve yazılan ondan okunur: metnin kullanıldığı yerde state.text, değiştikçe izlemek için snapshotFlow { state.text.toString() }.
modifierModifierModifierAlanın bütününün modifier'ı: kutusunun ve kutunun altındakilerin. fillMaxWidth() kutuyu üst öğesi kadar geniş yapar.
enabledBooleantrueAlana yazılıp yazılamayacağı. Yazılamayan alan odak almaz, dolgusuz ve devre dışı renklerle çizilir, metnini gösteren düğmesi yoktur ve devre dışı olduğunu söyler.
readOnlyBooleanfalseMetnin salt okunur olup olmadığı: alan yine odaklanabilir ve metni düğmeyle gösterilebilir.
labelString?nullAlanın ne için olduğu. Kutunun içinde yazar ve ekran okuyucu için alanın adıdır. Etiket yoksa metin kutunun ortasında durur ve placeholder alan boş olduğu sürece görünür.
placeholderString?nullAlan boşken ve etiketi yerinden çıkmışken, yani alan odaktayken, yazının geleceği yerde gösterilir.
supportingTextString?nullKutunun altındaki yardım metni, daha küçük bir yazıyla. error ile birlikte neyin düzeltileceğini söyleyen mesajdır ve ekran okuyucu onu hata olarak duyurur.
errorBooleanfalseMetnin yanlış olup olmadığı: kutu danger rolünün rengiyle çerçevelenir, yardım metni ve imleç de o renge döner ve ekran okuyucuya bildirilir.
leadingIcon(@Composable () -> Unit)?nullEtiketin ve metnin önünde durur, ikincil yazı rengindedir. Yuva içine konanı boyutlandırmaz: PantrixIcon(size = PantrixTheme.style(FilledTextFieldStyle).iconSize) platformun boyutundadır.
trailingIcon(@Composable () -> Unit)?nullMetnin arkasında durur: temizleme düğmesinin ve metni gösteren düğmenin de arkasında.
showClearButtonBooleanfalseAlana yazılabildiği ve alan boş olmadığı sürece, alanı boşaltan bir düğme gösterir. Düğme imleci alanda bırakır ve Tab durağı değildir.
showRevealButtonBooleantrueAlan etkinken, metni gösterip yeniden gizleyen düğmeyi gösterir. Düğme olmadan metin textObfuscationMode'un çizdiği gibi kalır: bu, hiç gösterilmeyecek bir metin ve metni başka bir yolla gösteren bir çağıran içindir.
maxLengthInt?nullKullanıcının girebileceği en çok karakter sayısı: karakterler String.length'in saydığı gibi sayılır. Sınırı aşacak bir değişiklik bütünüyle geri çevrilir. Kodla verilen metin kesilmez ve kullanıcı onu yine kısaltabilir. Pozitif olmalıdır.
showCharacterCountBooleantruemaxLength verilmişken kutunun altında count/maxLength gösterir.
textObfuscationModeTextObfuscationModeTextObfuscationMode.SystemMetnin gizliyken nasıl çizildiği. TextObfuscationMode.System platformun yaptığını yapar: Android'de, sistemin kendi ayarı öyle diyorsa, son yazılan karakter bir an görünür, başka hiçbir yerde bir şey görünmez. Hidden hiçbir platformda bir şey göstermez, RevealLastTyped ise son yazılan karakteri her platformda gösterir.
textObfuscationCharacterChar'•'Gizli bir karakterin yerine çizilen karakter.
keyboardOptionsKeyboardOptionsKeyboardOptions.DefaultKlavyenin türü, büyük harfleri, düzeltmeleri ve eylem tuşu. Bunların söylemedikleri bir şifreninkidir: şifre klavyesi, düzeltme yok. Böylece bir eylem adlandırmak, yazılanı öğrenen bir klavyeyi geri getirmez. KeyboardType.NumberPassword bir PIN'inkidir.
onKeyboardActionKeyboardActionHandler?nullKlavyenin eylem tuşuna basılınca, keyboardOptions'ın adlandırdığı eylem için çağrılır. Null verilirse platformun yaptığı kalır.
inputTransformationInputTransformation?nullKullanıcı yazarken metne yapılan işlem. maxLength ile birlikte önce bu çalışır ve sınır onun geçirdiğine uygulanır.
contentTypeContentType?nullPlatforma alanın ne tuttuğunu söyler, alanı o doldurabilsin diye. Verilmezse alan ContentType.Password tutar, Foundation'ın güvenli alanının kendisi için söylediği gibi. ContentType.NewPassword ise seçilmekte olan bir şifredir.
styleFilledTextFieldStyle?nullBu çağrının kendi stili: çevresindeki her stili ezer, yoğunluk ona da uygulanır. Yalnızca verdiği alanlar değişir ve her platformda değişir.
colorsFilledTextFieldColors?nullBu çağrının kendi renkleri, temanın rollerinin yerine: verilenler kullanılır, gerisi temanın renklerinde kalır. Devre dışı bir alanın, ne verilirse verilsin dolgusu yoktur ve alan temanın devre dışı yazı rengiyle çizilir.
contentDescriptionString?nullEkran okuyucunun alan için söylediği: label verilmeyen alanın adıdır. Aynı şeyi söyleyen bir placeholder o zaman yalnızca göze kalır, ekran okuyucuya okunmaz.
tagKeyString?nullAlanın otomasyon anahtarı: alan FilledSecureTextField_<tagKey>, temizleme düğmesi FilledSecureTextFieldClear_<tagKey>, metnini gösteren düğme FilledSecureTextFieldReveal_<tagKey> diye etiketlenir. Alan odağı aldığını, temizlendiğini ve metninin gösterildiğini ya da gizlendiğini bildirir, metnini asla.
interactionSourceMutableInteractionSource?nullAlanın dışarı taşınan etkileşimleri: odağı, üstündeki fare ve basışları. Null verilirse alan kendi kaynağını tutar.

field

Bir formun alanına bağlı dolgulu güvenli metin alanı: metni, hatası ve adı field'dan gelir.

ParametreTürVarsayılanNe olduğu
fieldFormField<String>Metin alanının gösterdiği ve değiştirdiği form alanı.
modifierModifierModifierAlanın bütününün modifier'ı.
formFormState?nullVerilirse klavyenin eylem tuşu formu, forma kayıtlı düğme üzerinden gönderir. Next ya da Previous eylemi odağı her zamanki gibi taşır. Eylem adlandırmayan bir alan ImeAction.Done alır, çünkü varsayılan eylem hiçbir işleyiciye ulaşmaz. Çağıranın kendi onKeyboardAction'ı gönderimin yerine geçer.
enabledBooleantrueAlana yazılıp yazılamayacağı.
readOnlyBooleanfalseMetnin salt okunur olup olmadığı.
labelString?nullAlanın ne için olduğu. Kutunun içinde yazar ve ekran okuyucu için alanın adıdır.
placeholderString?nullAlan boşken ve etiketi yerinden çıkmışken yazının geleceği yerde gösterilir.
supportingTextString?nullKutunun altındaki yardım metni: alanın orada gösterecek bir hatası olmadığı sürece.
leadingIcon(@Composable () -> Unit)?nullEtiketin ve metnin önünde durur.
trailingIcon(@Composable () -> Unit)?nullMetnin arkasında durur: temizleme düğmesinin ve metni gösteren düğmenin de arkasında.
showClearButtonBooleanfalseAlana yazılabildiği ve alan boş olmadığı sürece, alanı boşaltan bir düğme gösterir.
showRevealButtonBooleantrueAlan etkinken, metni gösterip yeniden gizleyen düğmeyi gösterir.
maxLengthInt?nullKullanıcının girebileceği en çok karakter sayısı. Pozitif olmalıdır.
showCharacterCountBooleantruemaxLength verilmişken kutunun altında count/maxLength gösterir.
textObfuscationModeTextObfuscationModeTextObfuscationMode.SystemMetnin gizliyken nasıl çizildiği.
textObfuscationCharacterChar'•'Gizli bir karakterin yerine çizilen karakter.
keyboardOptionsKeyboardOptionsKeyboardOptions.DefaultKlavyenin türü, büyük harfleri, düzeltmeleri ve eylem tuşu. Bunların söylemedikleri bir şifreninkidir.
onKeyboardActionKeyboardActionHandler?nullKlavyenin eylem tuşuna basılınca, formun gönderimi yerine çağrılır.
inputTransformationInputTransformation?nullKullanıcı yazarken metne yapılan işlem.
contentTypeContentType?nullPlatforma alanın ne tuttuğunu söyler, alanı o doldurabilsin diye. Verilmezse ContentType.Password olur.
styleFilledTextFieldStyle?nullBu çağrının kendi stili: çevresindeki her stili ezer, yoğunluk ona da uygulanır. Yalnızca verdiği alanlar değişir ve her platformda değişir.
colorsFilledTextFieldColors?nullBu çağrının kendi renkleri, temanın rollerinin yerine: verilenler kullanılır, gerisi temanın renklerinde kalır. Devre dışı bir alanın, ne verilirse verilsin dolgusu yoktur ve alan temanın devre dışı yazı rengiyle çizilir.
contentDescriptionString?nulllabel verilmeyen alan için ekran okuyucunun söylediği.
interactionSourceMutableInteractionSource?nullAlanın dışarı taşınan etkileşimleri. Null verilirse alan kendi kaynağını tutar.

FilledTextFieldStyle

PantrixFilledTextField'ın kutusu: şekli, en az yüksekliği ve genişliği, içindekilerin çevresindeki boşluk, ikonları ve çerçevesi.

ParametreTürVarsayılanNe olduğu
shapeShapeSpecShapeSpec.UnspecifiedKutunun şekli. Tam yuvarlak bir şekil, ShapeRole.Full, yalnızca alan tek satır tutarken bir haptır: birkaç satırlı bir alan onun yerine ShapeRole.Large alır, çünkü bir kapsülün eğrisi metninin ilk satırına girer.
heightDpDp.UnspecifiedKutunun en az yüksekliği.
minWidthDpDp.UnspecifiedKutunun en az genişliği: boş bir alanın, kullanıcı içine yazdıkça genişlemesini önler.
horizontalPaddingDpDp.Unspecifiedİkon olmayan yerde, kutunun kenarı ile etiketi ve metni arasındaki boşluk.
verticalPaddingDpDp.UnspecifiedEtiketin satırının üstündeki ve metnin son satırının altındaki boşluk.
iconPaddingDpDp.UnspecifiedYuvasındaki bir ikonun çevresindeki boşluk.
iconSizeDpDp.UnspecifiedYuvadaki bir ikonun alması gereken boyut. Yuva, içine konanı boyutlandırmaz.
borderWidthDpDp.UnspecifiedKutunun odakta, hatada ve fare üstündeyken aldığı çerçevenin kalınlığı. Dinlenirken çerçevesi yoktur.
textRoleTypeRole?nullMetnin yazıldığı, etiketin dinlendiği ve yer tutucunun yazıldığı yazı ölçeği rolü: Android'de ve iOS'ta body, 16sp, Material 3'ün bir alana yazdığı gibi; masaüstünde ve web'de label, 14sp, işaretçiyle kullanılan bir sayfadaki gibi.

FilledTextFieldColors

Temanın renklerini almayan bir alan için PantrixFilledTextField'ın boyandığı renkler: verilen renk kullanılır, verilmeyen temadaki rolünde kalır. Bir ürün yalnızca değiştirdiği renkleri verir, başkasını vermez:

ParametreTürVarsayılanNe olduğu
containerColorColor.UnspecifiedDinlenirken kutunun dolgusu. Temanın neutral rolünün container'ı.
focusedContainerColorColor.UnspecifiedÇerçeveliyken kutunun dolgusu: odakta ve hatada. Temanın surface rengi.
hoveredOutlineColorColor.UnspecifiedFare üstündeyken çerçeve. Temanın borderHover rengi.
focusedOutlineColorColor.UnspecifiedAlan odaktayken çerçeve. Temanın primary rengi.
errorColorColor.UnspecifiedMetnin yanlış olduğunu söyleyenler: çerçeve, kutunun altındaki mesaj, imleç ve sınırını aştığında sayaç. Temanın danger rengi.
textColorColor.UnspecifiedYazılan metin. Temanın textPrimary rengi.
labelColorColor.UnspecifiedEtiket: hem dinlenirken yazının yerinde, hem yazının üstündeki kendi satırında. Temanın textSecondary rengi.
placeholderColorColor.UnspecifiedYer tutucu. Temanın textSecondary rengi.
supportingTextColorColor.UnspecifiedKutunun altındaki yardım metni ve sayaç. Temanın textSecondary rengi.
iconColorColor.UnspecifiedYuvadaki bir ikonun, kendi rengini vermedikçe çizildiği renk ve temizleme düğmesinin çarpısı. Temanın textSecondary rengi.
cursorColorColor.Unspecifiedİmleç ve onunla birlikte bir seçimin tutamaçları ile zemini. Temanın primary rengi.
scrollBarColorColor.UnspecifiedBirkaç satırlı bir kutunun metninin ne kadar kaydığını gösteren çubuk. Temanın borderStrong rengi: çubuk, kutunun dolgusunun üstünde bir işarettir ve bir kutunun yumuşak kenarı orada görünmezdi.

Erişilebilirlik