Pantrix UI

Text

Temanın yazı ölçeğinde bir metin. style verilmezse temel yazıdır, LocalPantrixTextStyle: label stili ya da ekranın çevresindeki bölümünün verdiği. role ekran okuyucuya metnin ne olduğunu söyler: bir başlık, bir etiket ya da süs. selectable ile kullanıcı metni seçer ve kopyalar.

import com.pantrixui.components.elements.text.PantrixText

Örnekler

Stil verilmeyen metin

En az yazılan hâli: yalnızca metin. Stil verilmediği için temanın label stilinde, renk verilmediği için temanın textPrimary rengiyle yazılır. İkinci satır aynı metnin label stili açıkça verilmiş hâlidir: ikisi aynıdır.

label bir kontrolün etiketinin stilidir. Bir paragrafa body, bir başlığa title ya da headline stilini sen verirsin: üçüncü satır body ile yazıldı.

PantrixText(text = "Siparişin yola çıktı", tagKey = "no_style")
PantrixText(text = "Siparişin yola çıktı", style = PantrixTheme.typography.label)
PantrixText(text = "Siparişin yola çıktı", style = PantrixTheme.typography.body)

Yazı ölçeği

Temanın dokuz stili, büyükten küçüğe: her satır kendi stiliyle yazıldı ve o stilin ne için olduğunu söylüyor. Bir stil yazının boyutunu, satır yüksekliğini, ağırlığını ve harf aralığını birlikte taşır.

code eş aralıklı bir yazıyla yazılır. Stillerin ölçüleri "Tipografi" sayfasında, temadan okunarak yazar.

val typography = PantrixTheme.typography
PantrixText(text = "display: sayfanın başlığı", style = typography.display)
PantrixText(text = "headline: bölüm başlığı", style = typography.headline)
PantrixText(text = "title: kartın, panelin, dialog'un başlığı", style = typography.title)
PantrixText(text = "callout: öne çıkan gövde metni, boş bir ekranın açıklaması", style = typography.callout)
PantrixText(text = "body: gövde metni, bir paragraf, bir açıklama", style = typography.body)
PantrixText(text = "label: bir kontrolün etiketi, stil verilmeyen metin", style = typography.label)
PantrixText(text = "footnote: yardımcı metin, bir alanın altındaki açıklama", style = typography.footnote)
PantrixText(text = "caption: küçük bilgi, bir saat, bir sayaç", style = typography.caption)
PantrixText(text = "code: order_id = 8F2A-19C4", style = typography.code)

Roller

role metnin ne olduğunu söyler; nasıl göründüğünü style söyler. TextRole.Heading metni ekran okuyucuya başlık olarak bildirir: okuyucuyla başlıktan başlığa gezen kullanıcı ona uğrar. level başlığın derinliğidir: 1 sayfanın başlığı, 2 bölümleri. Büyük ve kalın yazılmış ama rolü verilmemiş bir metin okuyucu için düz yazıdır.

Paragraph ve Label oldukları gibi okunur. Decorative metin okuyucudan gizlenir ve sözleri hiç okunmaz: başka bir şeyin zaten söylediğini yineleyen metin içindir. Burada büyük "%72", altındaki cümlenin resmidir; okuyucu yalnızca cümleyi okur.

val typography = PantrixTheme.typography
PantrixText(
    text = "Hesap",
    style = typography.headline,
    role = TextRole.Heading(level = 1),
    tagKey = "heading_account"
)
PantrixText(
    text = "Depolama",
    style = typography.title,
    role = TextRole.Heading(level = 2),
    tagKey = "heading_storage"
)
PantrixText(text = "%72", style = typography.display, role = TextRole.Decorative, tagKey = "share")
PantrixText(text = "Depolama alanının yüzde 72'si dolu.", style = typography.body)
Row(horizontalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixText(text = "Plan", role = TextRole.Label)
    PantrixText(text = "Aylık, 50 GB", color = PantrixTheme.colors.textSecondary)
}

Renk ve durduğu yerin rengi

Renk verilmeyen metin sayfada temanın textPrimary rengiyle yazılır. color onu değiştirir: ikincil bir bilgiye textSecondary, bir hataya danger rolünün rengi.

Bir dolgunun üstünde renk yine verilmez. PantrixSurface bir rolün rengiyle doldurulunca içindeki metin, o dolgunun üstünde okunan rengi kendiliğinden alır: ilk kutuda primary.onColor, ikincisinde success.onContainer. Temanın kendi yüzeyi bir dolgu değil, bir zemindir: üçüncü kutudaki metin yine textPrimary ile yazılır.

val colors = PantrixTheme.colors
val inside = Modifier.padding(PantrixTheme.spacing.md)
PantrixText(text = "Renk verilmedi")
PantrixText(text = "Son güncelleme: 2 dakika önce", color = colors.textSecondary)
PantrixText(text = "Kart numarası geçersiz", color = colors.danger.color, tagKey = "error")
FlowRow(
    horizontalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm),
    verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)
) {
    PantrixSurface(color = colors.primary.color) {
        PantrixText(text = "primary dolgusunda", modifier = inside)
    }
    PantrixSurface(color = colors.success.container) {
        PantrixText(text = "success.container dolgusunda", modifier = inside)
    }
    PantrixSurface(border = colors.divider) {
        PantrixText(text = "Temanın yüzeyinde", modifier = inside)
    }
}

En çok satır ve taşma

Aynı paragraf üç kez, en fazla 320dp genişliğinde bir sütunda. İlki istediği kadar satır tutar. İkincisi maxLines = 2 ile iki satırda kalır ve sığmayan kısmı üç noktayla biter: overflow'un varsayılanı TextOverflow.Ellipsis'tir. Üçüncüsü tek satırdır ve TextOverflow.Clip ile, üç nokta konmadan kesilir.

val paragraph = "Siparişin kargoya verildi. Teslimat adresine yarın 09:00 ile 18:00 arasında ulaşacak; kurye " +
    "kapıya gelmeden önce seni arayacak."
Column(
    modifier = Modifier.widthIn(max = 320.dp),
    verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.md)
) {
    PantrixText(text = paragraph, style = PantrixTheme.typography.body)
    PantrixText(text = paragraph, style = PantrixTheme.typography.body, maxLines = 2, tagKey = "two_lines")
    PantrixText(
        text = paragraph,
        style = PantrixTheme.typography.body,
        maxLines = 1,
        overflow = TextOverflow.Clip,
        tagKey = "clipped"
    )
}

En az satır

minLines kısa bir metne de o kadar satırlık yer tutturur. Yan yana duran iki kutunun başlıkları minLines = 2 ve maxLines = 2 ile yazıldı: biri tek satıra sığar, öteki iki satırdan uzundur, ama ikisi de iki satır yer tutar. Böylece altlarındaki fiyatlar aynı hizada durur ve kutular aynı boydadır.

val colors = PantrixTheme.colors
val spacing = PantrixTheme.spacing
Row(
    modifier = Modifier.widthIn(max = 420.dp),
    horizontalArrangement = Arrangement.spacedBy(spacing.md)
) {
    PantrixSurface(modifier = Modifier.weight(1f), border = colors.divider) {
        Column(modifier = Modifier.padding(spacing.md), verticalArrangement = Arrangement.spacedBy(spacing.xs)) {
            PantrixText(text = "Çay", style = PantrixTheme.typography.callout, maxLines = 2, minLines = 2)
            PantrixText(text = "45,00 TL", color = colors.textSecondary)
        }
    }
    PantrixSurface(modifier = Modifier.weight(1f), border = colors.divider) {
        Column(modifier = Modifier.padding(spacing.md), verticalArrangement = Arrangement.spacedBy(spacing.xs)) {
            PantrixText(
                text = "Soğuk demlenmiş, tarçınlı ve portakallı filtre kahve",
                style = PantrixTheme.typography.callout,
                maxLines = 2,
                minLines = 2
            )
            PantrixText(text = "120,00 TL", color = colors.textSecondary)
        }
    }
}

Hizalama

textAlign satırları metnin kendi genişliği içinde hizalar. Bu yüzden metinlere fillMaxWidth() verildi: yalnızca sözleri kadar geniş bir metnin içinde hizalanacak yer yoktur.

PantrixText(text = "Başa hizalı", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Start)
PantrixText(text = "Ortalanmış", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center)
PantrixText(text = "Sona hizalı", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.End)

Seçilebilir metin

selectable = true ile kullanıcı metni seçer ve kopyalar. Başka bir yere taşınacak metin içindir: bir sipariş numarası, bir IBAN, bir hata kodu. Ekran okuyucu onu öteki metinler gibi okur.

İkinci satırdaki numarayı seçmeyi dene; üstündeki etiket seçilemez.

PantrixText(text = "Sipariş numarası", style = PantrixTheme.typography.footnote, role = TextRole.Label)
PantrixText(
    text = "PX-2026-0001-8F2A-19C4",
    style = PantrixTheme.typography.code,
    selectable = true,
    tagKey = "order_number"
)

Biçimli metin

AnnotatedString alan PantrixText: tek bir metnin içinde ayrı biçimde parçalar. Stili, rengi, satırları ve rolü düz metindekiyle aynıdır.

İlk satırda tutarın kuruşu 0.6.em ile yazıldı: em, çevresindeki yazının boyutunun payıdır. İkinci satırda bir parça kalın, bir parça danger rolünün renginde. Üçüncü satırda bir bağlantı var; altı çizilidir, çünkü cümlesinden yalnızca renkle ayrılan bir bağlantıyı renkleri ayırt edemeyen göremez. Bağlantıya bas: uygulamanın snackbar'ı haber verir.

val colors = PantrixTheme.colors
val snackbars = LocalPantrixSnackbars.current
val scope = rememberCoroutineScope()
val price = buildAnnotatedString {
    append("1.250")
    withStyle(SpanStyle(fontSize = 0.6.em)) { append(",00 TL") }
}
val notice = buildAnnotatedString {
    append("Ödemen ")
    withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { append("28 Ekim") }
    append(" tarihinde alınacak. ")
    withStyle(SpanStyle(color = colors.danger.color)) { append("Kartının süresi dolmak üzere.") }
}
val linkStyles = TextLinkStyles(
    style = SpanStyle(color = colors.primary.color, textDecoration = TextDecoration.Underline)
)
val terms = buildAnnotatedString {
    append("Devam ederek ")
    withLink(
        LinkAnnotation.Clickable(tag = "terms", styles = linkStyles) {
            scope.launch { snackbars?.show(message = "Kullanım koşulları açıldı") }
        }
    ) {
        append("kullanım koşullarını")
    }
    append(" kabul etmiş olursun.")
}
PantrixText(text = price, style = PantrixTheme.typography.headline, tagKey = "price")
PantrixText(text = notice, style = PantrixTheme.typography.body)
PantrixText(text = terms, style = PantrixTheme.typography.body, tagKey = "terms")

Satırın içinde bir ikon

inlineContent satırın içine metin olmayan bir şey koyar. Metinde appendInlineContent ile bir yer ayrılır; inlineContent o yerin anahtarına ne çizileceğini ve ne kadar yer tutacağını söyler. Burada cümlenin ortasında bir ikon var: yazıyla aynı satırda durur.

appendInlineContent'in ikinci değeri o yerin metindeki karşılığıdır: ekran okuyucu ikonu bu sözle okur.

val hint = buildAnnotatedString {
    append("Bir ürün bulmak için ")
    appendInlineContent(id = "search", alternateText = "arama")
    append(" düğmesine bas.")
}
PantrixText(
    text = hint,
    style = PantrixTheme.typography.body,
    inlineContent = mapOf(
        "search" to InlineTextContent(
            placeholder = Placeholder(
                width = 1.25.em,
                height = 1.25.em,
                placeholderVerticalAlign = PlaceholderVerticalAlign.TextCenter
            )
        ) {
            PantrixIcon(imageVector = PantrixIcons.Search, contentDescription = null, size = 20.dp)
        }
    ),
    tagKey = "hint"
)

API

text

Temanın yazı ölçeğinde bir metin. style verilmezse temel yazıdır, LocalPantrixTextStyle: label stili ya da ekranın çevresindeki bölümünün verdiği. role ekran okuyucuya metnin ne olduğunu söyler: bir başlık, bir etiket ya da süs. selectable ile kullanıcı metni seçer ve kopyalar.

ParametreTürVarsayılanNe olduğu
textStringmetin.
modifierModifierModifiermetnin modifier'ı.
styleTextStyleLocalPantrixTextStyle.current
colorColorColor.Unspecified
textAlignTextAlign?nullsatırların metnin genişliği içinde nasıl hizalandığı.
maxLinesIntInt.MAX_VALUEmetnin en çok kaç satır aldığı; onları aşan kısım overflow'un dediği gibi kesilir.
minLinesInt1metnin en az kaç satır yüksekliğinde olduğu.
overflowTextOverflowTextOverflow.Ellipsis
softWrapBooleantruemetnin, genişliğinin bittiği yerde satırlara bölünüp bölünmediği.
roleTextRoleTextRole.Paragraph
selectableBooleanfalse
onTextLayout((TextLayoutResult) -> Unit)?nullmetin yerleştirilirken onunla çağrılır.
tagKeyString?nullmetnin otomasyon anahtarı: metin Text_<tagKey>'dır. Anahtar yoksa etiketi olmaz.

text

AnnotatedString alan PantrixText: metnin biçimli parçalarını ve bağlantılarını çizer, metnin adını verdiği yer tutucular için de inlineContent alır.

ParametreTürVarsayılanNe olduğu
textAnnotatedStringmetin, aralıkları ve bağlantılarıyla.
modifierModifierModifiermetnin modifier'ı.
styleTextStyleLocalPantrixTextStyle.currenttemel metin: verilmezse LocalPantrixTextStyle, yani label rolü ya da ekranın çevresindeki bir parçanın sağladığı.
colorColorColor.Unspecifiedmetnin rengi, yoksa stilin rengi, o da yoksa temanın textPrimary'si; bir dolgunun üstünde, oraya yazılan renk.
textAlignTextAlign?nullsatırların metnin genişliği içinde nasıl hizalandığı.
maxLinesIntInt.MAX_VALUEmetnin en çok kaç satır aldığı; onları aşan kısım overflow'un dediği gibi kesilir.
minLinesInt1metnin en az kaç satır yüksekliğinde olduğu.
overflowTextOverflowTextOverflow.EllipsismaxLines'tan uzun bir metnin nasıl kesildiği: başka bir şey söylenmedikçe üç noktayla.
softWrapBooleantruemetnin, genişliğinin bittiği yerde satırlara bölünüp bölünmediği.
roleTextRoleTextRole.Paragraphmetnin ekran okuyucu için ne olduğu: düz yazı, bir başlık, bir etiket ya da süs.
selectableBooleanfalsekullanıcının metni seçip kopyalayıp kopyalayamayacağı.
inlineContentMap<String, InlineTextContent>emptyMap()
onTextLayout((TextLayoutResult) -> Unit)?nullmetin yerleştirilirken onunla çağrılır.
tagKeyString?nullmetnin otomasyon anahtarı: metin Text_<tagKey>'dır. Anahtar yoksa etiketi olmaz.