Pantrix UI

Badged Box

badge'i content'in üstüne, ortası bir köşesine gelecek şekilde koyar ve rozet için yer ayırmaz.

import com.pantrixui.components.elements.badge.PantrixBadgedBox

Örnekler

Bir ikonun köşesinde

PantrixBadgedBox rozeti içeriğinin köşesine oturtur: varsayılan köşe, satırın bittiği yandaki üst köşedir.

Rozet okuyucudan gizlidir; sayıyı ikonun kendi açıklaması söyler ("Gelen kutusu, 5 okunmamış"). Sayı sıfıra inince rozet hiç konmaz: bunu rozet değil, çağıran yapar. Düğmelerle sayıyı artır: 99'u geçince "99+" olur ve hap ikonun dışına doğru uzar.

var unread by rememberSaveable { mutableIntStateOf(START_UNREAD) }
Row(
    horizontalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.lg),
    verticalAlignment = Alignment.CenterVertically
) {
    PantrixBadgedBox(badge = { if (unread > 0) PantrixBadge(count = unread, tagKey = "unread") }) {
        PantrixIcon(
            imageVector = PantrixIcons.Inbox,
            contentDescription = if (unread > 0) "Gelen kutusu, $unread okunmamış" else "Gelen kutusu",
            tagKey = "inbox"
        )
    }
    PantrixButton(
        text = "+1",
        onClick = { unread += 1 },
        variant = ButtonVariant.Outline,
        size = ButtonSize.Small,
        tagKey = "one_more"
    )
    PantrixButton(
        text = "+50",
        onClick = { unread += MANY },
        variant = ButtonVariant.Outline,
        size = ButtonSize.Small,
        tagKey = "many_more"
    )
    PantrixButton(
        text = "Okundu",
        onClick = { unread = 0 },
        variant = ButtonVariant.Text,
        size = ButtonSize.Small,
        tagKey = "read"
    )
}

private const val START_UNREAD = 5

private const val MANY = 50

Avatarların üstünde

Yuvarlak bir içerikte rozet kutunun köşesinde değil çemberin üstünde durur: overlap = BadgeOverlap.Circular. alignment hangi köşe olduğunu söyler; durum noktası altta, satırın bittiği yandadır.

Durum noktaları BadgeStyle(dotSize = 12.dp) ile büyütüldü: bir avatarın üstünde seçilecek kadar. Noktanın ne anlama geldiğini avatarın açıklaması söyler ("İbrahim Öztürk, çevrimiçi"); nokta okuyucudan gizlidir.

val statusDot = BadgeStyle(dotSize = 12.dp)
Row(horizontalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.xl)) {
    PantrixBadgedBox(
        badge = { PantrixBadge(count = 2, tagKey = "messages") },
        overlap = BadgeOverlap.Circular
    ) {
        PantrixAvatar(contentDescription = "Ayşe Yılmaz, 2 yeni mesaj", initials = "AY", tagKey = "badged_ayse")
    }
    PantrixBadgedBox(
        badge = { PantrixBadge(tone = BadgeTone.Success, style = statusDot, tagKey = "online") },
        alignment = Alignment.BottomEnd,
        overlap = BadgeOverlap.Circular
    ) {
        PantrixAvatar(
            contentDescription = "İbrahim Öztürk, çevrimiçi",
            initials = "İÖ",
            tone = AvatarTone.Info,
            tagKey = "badged_ibrahim"
        )
    }
    PantrixBadgedBox(
        badge = { PantrixBadge(tone = BadgeTone.Neutral, style = statusDot, tagKey = "offline") },
        alignment = Alignment.BottomEnd,
        overlap = BadgeOverlap.Circular
    ) {
        PantrixAvatar(
            contentDescription = "ilker kaya, çevrimdışı",
            initials = "ik",
            tone = AvatarTone.Success,
            tagKey = "badged_ilker"
        )
    }
    PantrixBadgedBox(
        badge = { PantrixBadge(count = MANY * 3, tagKey = "team") },
        overlap = BadgeOverlap.Circular
    ) {
        PantrixAvatar(
            contentDescription = "Ekip, 99'dan fazla yeni mesaj",
            icon = PantrixIcons.Person,
            tone = AvatarTone.Primary,
            tagKey = "badged_team"
        )
    }
}

private const val MANY = 50

Bir yazının yanında

Rozet bir yazının üstünde de durabilir. PantrixBadgedBox içeriğinin satır çizgisini korur: alignByBaseline ile "yeni" etiketi yanındaki başlıkla aynı satırda durur, nokta da etiketin köşesinde.

Row(horizontalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixText(
        text = "Kampanyalar",
        modifier = Modifier.alignByBaseline(),
        style = PantrixTheme.typography.callout
    )
    PantrixBadgedBox(
        badge = { PantrixBadge(tone = BadgeTone.Primary, tagKey = "new") },
        modifier = Modifier.alignByBaseline()
    ) {
        PantrixText(text = "yeni", style = PantrixTheme.typography.footnote)
    }
}

API

badge

badge'i content'in üstüne, ortası bir köşesine gelecek şekilde koyar ve rozet için yer ayırmaz.

ParametreTürVarsayılanNe olduğu
badge@Composable () -> Unitİçeriğin üstüne konan şey: çoğunlukla bir PantrixBadge. Gösterilecek bir şey yoksa hiçbir şey.
modifierModifierModifierKutunun modifier'ı.
alignmentAlignmentAlignment.TopEndRozetin ortasının content üstünde nerede olduğu.
overlapBadgeOverlapBadgeOverlap.RectangularBu yerin content'in çevresindeki kutunun mu, içindeki çemberin mi üstünde olduğu.
content@Composable () -> UnitRozetin ait olduğu şey.

Erişilebilirlik