Pantrix UI

Navigation Rail

Uygulamanın üst düzey hedefleri, geniş bir pencerenin başlangıç kenarında alt alta, uygulamanın bulunduğu hedef işaretli olarak: tablette, açık bir katlanır telefonda ya da bir masaüstü penceresinde navigation bar'ın yerini tutar.

import com.pantrixui.components.navigation.navigationrail.PantrixNavigationRail

Örnekler

Üç hedef

En yalın hâli: hedeflerin listesi (items), bulunulan hedefin anahtarı (selected) ve basılan hedefin anahtarını alan onSelect. Hedefler üstten başlayarak alt alta durur; her biri ray kadar geniştir, ikonun yanına basmak da hedefe basmaktır.

Ray, çerçevenin boyu kadardır (240dp): boyu olmayan bir yerde, kayan bir sayfanın içinde, ona bir boy vermek gerekir.

val destinations = listOf(
    NavigationItem(key = "files", label = "Dosyalar", icon = PantrixIcons.Folder),
    NavigationItem(key = "search", label = "Ara", icon = PantrixIcons.Search),
    NavigationItem(key = "profile", label = "Profil", icon = PantrixIcons.Person)
)
var where by rememberSaveable { mutableStateOf("files") }
PantrixSurface(modifier = Modifier.fillMaxWidth().height(240.dp), border = PantrixTheme.colors.divider) {
    Row {
        PantrixNavigationRail(
            items = destinations,
            selected = where,
            onSelect = { where = it },
            tagKey = "plain"
        )
        PantrixText(
            text = "Açık hedef: ${destinations.first { it.key == where }.label}",
            modifier = Modifier.padding(PantrixTheme.spacing.lg),
            color = PantrixTheme.colors.textSecondary
        )
    }
}

Menü düğmesinin altında üç hedef

header hedeflerin üstünde, rayın ortasında durur: burada menüyü açan bir düğme. Basınca yandaki alan sayar.

Hedefler bir posta uygulamasınındır. "Gelen"deki rozet okunmamışları sayar: hedef açılınca sayı sıfırlanır ve rozet kalkar. Ekran okuyucu rozeti hedefin adından sonra okur: "Gelen, 3 okunmamış".

var where by rememberSaveable { mutableStateOf("starred") }
var unread by rememberSaveable { mutableIntStateOf(3) }
var menus by rememberSaveable { mutableIntStateOf(0) }
PantrixSurface(modifier = Modifier.fillMaxWidth().height(440.dp), border = PantrixTheme.colors.divider) {
    Row {
        PantrixNavigationRail(
            items = listOf(
                NavigationItem(key = "starred", label = "Yıldızlı", icon = PantrixIcons.Star),
                NavigationItem(
                    key = "inbox",
                    label = "Gelen",
                    icon = PantrixIcons.Inbox,
                    badge = if (unread > 0) NavigationBadge("$unread okunmamış", count = unread) else null
                ),
                NavigationItem(key = "profile", label = "Profil", icon = PantrixIcons.Person)
            ),
            selected = where,
            onSelect = { key ->
                where = key
                if (key == "inbox") unread = 0
            },
            header = {
                PantrixIconButton(
                    imageVector = PantrixIcons.Menu,
                    contentDescription = "Menüyü aç",
                    onClick = { menus++ },
                    tagKey = "rail_menu"
                )
            },
            tagKey = "mail"
        )
        PantrixText(
            text = when (where) {
                "starred" -> "Yıldızlı iletiler"
                "inbox" -> "Gelen kutusu: okunmamış kalmadı"
                else -> "Profil ve ayarlar"
            } + if (menus > 0) "\nMenü $menus kez açıldı" else "",
            modifier = Modifier.padding(PantrixTheme.spacing.lg),
            color = PantrixTheme.colors.textSecondary
        )
    }
}

Kısa bir rayda hedefler kayar

Yedi hedef, 220dp'lik bir rayda: bir rayın taşıdığı en çok hedef, hepsini gösteremeyecek kadar kısa bir yerde. Hedefler kendi içinde kayar; başlıktaki düğme kaymaz, yerinde kalır. Rayı yukarı kaydır: "Hakkında"ya kadar iner.

"Klasörler"deki rozet bir noktadır, "Profil"deki 128 "99+" olur, "Takvim" basılamaz.

var where by rememberSaveable { mutableStateOf("search") }
PantrixSurface(modifier = Modifier.fillMaxWidth().height(220.dp), border = PantrixTheme.colors.divider) {
    Row {
        PantrixNavigationRail(
            items = SEVEN,
            selected = where,
            onSelect = { where = it },
            header = {
                PantrixIconButton(
                    imageVector = PantrixIcons.Menu,
                    contentDescription = "Menüyü aç",
                    onClick = {},
                    tagKey = "short_menu"
                )
            },
            tagKey = "short"
        )
    }
}

private val SEVEN = listOf(
    NavigationItem(key = "starred", label = "Yıldızlı", icon = PantrixIcons.Star),
    NavigationItem(
        key = "folders",
        label = "Klasörler",
        icon = PantrixIcons.Folder,
        badge = NavigationBadge(contentDescription = "Yeni dosyalar var")
    ),
    NavigationItem(key = "search", label = "Ara", icon = PantrixIcons.Search),
    NavigationItem(key = "calendar", label = "Takvim", icon = PantrixIcons.Calendar, enabled = false),
    NavigationItem(
        key = "profile",
        label = "Profil",
        icon = PantrixIcons.Person,
        badge = NavigationBadge(contentDescription = "128 bildirim", count = 128)
    ),
    NavigationItem(key = "inbox", label = "Gelen", icon = PantrixIcons.Inbox),
    NavigationItem(key = "info", label = "Hakkında", icon = PantrixIcons.Info)
)

Yalnızca renk ile

NavigationIndicator.None ile hap çizilmez: bulunulan hedefin ikonu ve etiketi temanın primary rengindedir, ötekiler ikincil yazı renginde. Basış ve odak halkası yine hapın yerinde çizilir.

Çerçeve 440dp: yedi hedef hazır ölçüleriyle sığar ve ray kaymaz.

var where by rememberSaveable { mutableStateOf("search") }
PantrixSurface(modifier = Modifier.fillMaxWidth().height(440.dp), border = PantrixTheme.colors.divider) {
    Row {
        PantrixNavigationRail(
            items = SEVEN,
            selected = where,
            onSelect = { where = it },
            style = NavigationRailStyle(indicator = NavigationIndicator.None),
            tagKey = "tint"
        )
    }
}

private val SEVEN = listOf(
    NavigationItem(key = "starred", label = "Yıldızlı", icon = PantrixIcons.Star),
    NavigationItem(
        key = "folders",
        label = "Klasörler",
        icon = PantrixIcons.Folder,
        badge = NavigationBadge(contentDescription = "Yeni dosyalar var")
    ),
    NavigationItem(key = "search", label = "Ara", icon = PantrixIcons.Search),
    NavigationItem(key = "calendar", label = "Takvim", icon = PantrixIcons.Calendar, enabled = false),
    NavigationItem(
        key = "profile",
        label = "Profil",
        icon = PantrixIcons.Person,
        badge = NavigationBadge(contentDescription = "128 bildirim", count = 128)
    ),
    NavigationItem(key = "inbox", label = "Gelen", icon = PantrixIcons.Inbox),
    NavigationItem(key = "info", label = "Hakkında", icon = PantrixIcons.Info)
)

Stil: genişlik, aralıklar ve etiket yazısı

style rayın ölçülerini, labelStyle etiketlerin yazı stilini değiştirir; yalnızca verilen alanlar değişir. İlk ray hazır hâlidir: 80dp genişliğinde, hedefleri 56dp ve 4dp arayla. İkincisi 96dp genişliğinde, hedefleri 64dp ve 12dp arayla, üstten ve alttan 16dp içeride; etiketleri caption ile yazılı.

İkinci rayın bitiş kenarında çizgi de yok: divider = false.

val destinations = SEVEN.take(4)
var where by rememberSaveable { mutableStateOf("search") }
PantrixSurface(modifier = Modifier.fillMaxWidth().height(340.dp), border = PantrixTheme.colors.divider) {
    Row {
        PantrixNavigationRail(
            items = destinations,
            selected = where,
            onSelect = { where = it },
            tagKey = "usual"
        )
        PantrixNavigationRail(
            items = destinations,
            selected = where,
            onSelect = { where = it },
            labelStyle = PantrixTheme.typography.caption,
            style = NavigationRailStyle(
                width = 96.dp,
                itemMinHeight = 64.dp,
                itemSpacing = 12.dp,
                verticalPadding = 16.dp,
                divider = false
            ),
            tagKey = "wide"
        )
    }
}

private val SEVEN = listOf(
    NavigationItem(key = "starred", label = "Yıldızlı", icon = PantrixIcons.Star),
    NavigationItem(
        key = "folders",
        label = "Klasörler",
        icon = PantrixIcons.Folder,
        badge = NavigationBadge(contentDescription = "Yeni dosyalar var")
    ),
    NavigationItem(key = "search", label = "Ara", icon = PantrixIcons.Search),
    NavigationItem(key = "calendar", label = "Takvim", icon = PantrixIcons.Calendar, enabled = false),
    NavigationItem(
        key = "profile",
        label = "Profil",
        icon = PantrixIcons.Person,
        badge = NavigationBadge(contentDescription = "128 bildirim", count = 128)
    ),
    NavigationItem(key = "inbox", label = "Gelen", icon = PantrixIcons.Inbox),
    NavigationItem(key = "info", label = "Hakkında", icon = PantrixIcons.Info)
)

Bir rolün dolgusunda, başlığıyla

container temanın bir rolünün rengi olduğunda üstünde neyin okunduğunu tema bilir: content verilmedi, hedefler rolün eşlenik rengiyle yazıldı. Basılamayan hedef o rengin bir payıyla yazılır, kenardaki çizgi de ondan çıkar.

Başlıktaki ikon ve yazı da renk söylemiyor: temanın kendi dolgusunda kendi varsayılan renklerinde olurlardı, burada rayın üstüne yazılan renktedirler.

var where by rememberSaveable { mutableStateOf("search") }
PantrixSurface(modifier = Modifier.fillMaxWidth().height(340.dp), border = PantrixTheme.colors.divider) {
    Row {
        PantrixNavigationRail(
            items = SEVEN.take(4),
            selected = where,
            onSelect = { where = it },
            colors = NavigationColors(container = PantrixTheme.colors.primary.color),
            header = {
                PantrixIcon(imageVector = PantrixIcons.Star, contentDescription = null)
                PantrixText(text = "Acme", style = PantrixTheme.typography.footnote)
            },
            tagKey = "role"
        )
    }
}

private val SEVEN = listOf(
    NavigationItem(key = "starred", label = "Yıldızlı", icon = PantrixIcons.Star),
    NavigationItem(
        key = "folders",
        label = "Klasörler",
        icon = PantrixIcons.Folder,
        badge = NavigationBadge(contentDescription = "Yeni dosyalar var")
    ),
    NavigationItem(key = "search", label = "Ara", icon = PantrixIcons.Search),
    NavigationItem(key = "calendar", label = "Takvim", icon = PantrixIcons.Calendar, enabled = false),
    NavigationItem(
        key = "profile",
        label = "Profil",
        icon = PantrixIcons.Person,
        badge = NavigationBadge(contentDescription = "128 bildirim", count = 128)
    ),
    NavigationItem(key = "inbox", label = "Gelen", icon = PantrixIcons.Inbox),
    NavigationItem(key = "info", label = "Hakkında", icon = PantrixIcons.Info)
)

Kendi renkleriyle

Temada olmayan bir renkte ray: uygulamanın kendi moru. Dolgu (container) ve üstünde okunan renk (content) birlikte verilir; öteki hedefler, basılamayan hedef ve kenardaki çizgi o renkten çıkar. Hap ve üstündeki ikon da ayrıca verildi (selectedContainer, selectedContent).

Aynı NavigationColors bir PantrixNavigationBar'a da verilebilir: bar ile ray tek bir renk kümesiyle boyanır.

val own = ownColors()
var where by rememberSaveable { mutableStateOf("search") }
PantrixSurface(modifier = Modifier.fillMaxWidth().height(440.dp), border = PantrixTheme.colors.divider) {
    Row {
        PantrixNavigationRail(
            items = SEVEN,
            selected = where,
            onSelect = { where = it },
            colors = NavigationColors(
                container = own.color,
                content = own.onColor,
                selectedContainer = own.container,
                selectedContent = own.onContainer
            ),
            tagKey = "own"
        )
    }
}

private val SEVEN = listOf(
    NavigationItem(key = "starred", label = "Yıldızlı", icon = PantrixIcons.Star),
    NavigationItem(
        key = "folders",
        label = "Klasörler",
        icon = PantrixIcons.Folder,
        badge = NavigationBadge(contentDescription = "Yeni dosyalar var")
    ),
    NavigationItem(key = "search", label = "Ara", icon = PantrixIcons.Search),
    NavigationItem(key = "calendar", label = "Takvim", icon = PantrixIcons.Calendar, enabled = false),
    NavigationItem(
        key = "profile",
        label = "Profil",
        icon = PantrixIcons.Person,
        badge = NavigationBadge(contentDescription = "128 bildirim", count = 128)
    ),
    NavigationItem(key = "inbox", label = "Gelen", icon = PantrixIcons.Inbox),
    NavigationItem(key = "info", label = "Hakkında", icon = PantrixIcons.Info)
)

Sistem çubuklarının arkasında

insets rayın üstte, altta ve başlangıç kenarında boş bıraktığı paydır: dolgu payın arkasına uzanır, başlık ve hedefler payın dışında kalır. Gerçek bir ekranda payı PantrixScaffold yan bar'ına verir ve ray sistem çubuklarının arkasına uzanır.

Burada scaffold yok: üstteki 24dp'lik şerit sistemin durum çubuğunun yerini tutuyor. Rayın dolgusu şeridin arkasında sürer, menü düğmesi şeridin altında başlar.

var where by rememberSaveable { mutableStateOf("search") }
PantrixSurface(modifier = Modifier.fillMaxWidth().height(340.dp), border = PantrixTheme.colors.divider) {
    Row {
        PantrixNavigationRail(
            items = SEVEN.take(4),
            selected = where,
            onSelect = { where = it },
            header = {
                PantrixIconButton(imageVector = PantrixIcons.Menu, contentDescription = "Menüyü aç", onClick = {}, tagKey = "menu")
            },
            insets = PaddingValues(top = 24.dp),
            tagKey = "insets"
        )
    }
    // Sistemin durum çubuğunun yerinde bir şerit: rayın dolgusu arkasında sürer.
    Box(
        modifier = Modifier
            .fillMaxWidth()
            .height(24.dp)
            .background(PantrixTheme.colors.textSecondary.copy(alpha = 0.16f))
    )
}

private val SEVEN = listOf(
    NavigationItem(key = "starred", label = "Yıldızlı", icon = PantrixIcons.Star),
    NavigationItem(
        key = "folders",
        label = "Klasörler",
        icon = PantrixIcons.Folder,
        badge = NavigationBadge(contentDescription = "Yeni dosyalar var")
    ),
    NavigationItem(key = "search", label = "Ara", icon = PantrixIcons.Search),
    NavigationItem(key = "calendar", label = "Takvim", icon = PantrixIcons.Calendar, enabled = false),
    NavigationItem(
        key = "profile",
        label = "Profil",
        icon = PantrixIcons.Person,
        badge = NavigationBadge(contentDescription = "128 bildirim", count = 128)
    ),
    NavigationItem(key = "inbox", label = "Gelen", icon = PantrixIcons.Inbox),
    NavigationItem(key = "info", label = "Hakkında", icon = PantrixIcons.Info)
)

API

items

Uygulamanın üst düzey hedefleri, geniş bir pencerenin başlangıç kenarında alt alta, uygulamanın bulunduğu hedef işaretli olarak: tablette, açık bir katlanır telefonda ya da bir masaüstü penceresinde navigation bar'ın yerini tutar.

ParametreTürVarsayılanNe olduğu
itemsList<NavigationItem>Hedefler, sırasıyla: üç ile yedi hedef.
selectedString?Uygulamanın bulunduğu hedefin anahtarı; uygulama hiçbirinde değilse null.
onSelect(key: String) -> UnitBasılan hedefin anahtarıyla çağrılır, bulunulan hedefe basılınca da.
modifierModifierModifierRaya uygulanır.
labelStyleTextStylePantrixTheme.typography.footnoteEtiketlerin yazı stili: verilmezse temanın footnote stili. Renklerini ray verir.
styleNavigationRailStyle?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.
colorsNavigationColors?nullBu çağrının kendi renkleri. Yalnızca verdikleri değişir, gerisi temanınki kalır.
header(@Composable ColumnScope.() -> Unit)?nullHedeflerin üstünde, rayın genişliğinin ortasında durur. İçindeki bir yazı ya da ikon kendi rengini söylemiyorsa temanın dolgusunda kendi varsayılan rengindedir, çağıranın dolgusunda ise rayın üstüne yazılan renkte.
insetsPaddingValuesPaddingValues()Rayın üstte, altta ve başlangıç kenarında boş bıraktığı pay. Dolgusu bu payın arkasına uzanır. Bir scaffold'un yan bar'ına verdiği paydır.
tagKeyString?nullOtomasyon için, dilden bağımsız bir anahtar: rayın test etiketi NavigationRail_<tagKey> olur, hedefleri de onun içinde adlandırılır: NavigationRail_<tagKey>.Item_<destination's key>.

NavigationRailStyle

PantrixNavigationRail'in geometrisi ve uygulamanın bulunduğu hedefi nasıl işaretlediği.

ParametreTürVarsayılanNe olduğu
widthDpDp.UnspecifiedRayın, boş bıraktığı payların yanındaki genişliği.
indicatorWidthDpDp.UnspecifiedBulunulan hedefin ikonunun arkasındaki hapın ve bir basışın çizildiği yerin genişliği.
indicatorHeightDpDp.UnspecifiedO hapın yüksekliği.
iconSizeDpDp.UnspecifiedBir hedefin ikonu.
labelGapDpDp.UnspecifiedHapın yeriyle altındaki etiketin arası.
itemMinHeightDpDp.UnspecifiedBir hedefin en az yüksekliği. Hedef hiçbir zaman platformun dokunma hedefinden alçak olmaz ve büyüyen yazıyla birlikte uzar.
itemSpacingDpDp.UnspecifiedBir hedefle sonrakinin arası.
headerGapDpDp.UnspecifiedBaşlıkla ilk hedefin arası.
verticalPaddingDpDp.UnspecifiedBaşlığın ya da ilk hedefin üstündeki ve son hedefin altındaki boşluk.
indicatorNavigationIndicator?nullBulunulan hedefi neyin işaretlediği.
dividerBoolean?nullRayın bitiş kenarı boyunca, genişliğinin içinde ince bir çizgi olup olmadığı.

NavigationColors

Temanın renklerini almadığı yerde bir navigation bar'ın ya da bir rayın renkleri: verilen renk kullanılır, verilmeyen temanınki kalır. İkisi aynı renkleri alır. Böylece pencerenin genişliğine göre birini ya da ötekini gösteren bir ekran ikisini de tek bir renk kümesiyle boyar.

ParametreTürVarsayılanNe olduğu
containerColorColor.UnspecifiedDolgu. Boş bırakılan payların arkasına da uzanır. Temanın surface rengi.
contentColorColor.UnspecifiedDolgunun üstüne yazılanlar: uygulamanın bulunduğu hedefin, hapının altındaki etiketi ve öteki hedeflerin ikonlarıyla etiketleri. Temanın kendi dolgusunda ilki temanın textPrimary, ötekiler textSecondary rengindedir. Çağıranın dolgusunda ve bu renk verildiğinde hepsi bu renktedir. Bulunulan hedefi bir hap işaretlemiyorsa ötekiler bu rengin bir payındadır.
selectedContainerColorColor.UnspecifiedStil hap çiziyorsa, bulunulan hedefin ikonunun arkasındaki hap. primary rolünün container'ı.
selectedContentColorColor.UnspecifiedBulunulan hedefin, hapının üstündeki ikonu: selectedContainer'ın üstünde okunan renk. primary rolünün onContainer'ı.
selectedTintColorColor.UnspecifiedStilin hap çizmediği, hedefi yalnızca rengin işaretlediği yerde bulunulan hedefin ikonu ve etiketi: container'ın üstünde okunan bir renk. Temanın kendi dolgusunda primary rolünün color'ı, çağıranın dolgusunda content: orada marka renginin okunduğunu söyleyen bir şey yoktur.
dividerColorColor.UnspecifiedStil çizgi çiziyorsa, bir bar'ın üst kenarı ya da bir rayın bitiş kenarı boyunca uzanan ince çizgi. Temanın kendi zeminlerinde temanın divider rengi. Bir dolgunun üstünde, o çizginin okunmayacağı yerde, content'in bir payı: Subtle bir düğmenin kenarı gibi.

Erişilebilirlik