Top Bar
Ekranın üstündeki bar: ekranın başlığı, önünde bir gezinme ikonu ve arkasında eylemler.
import com.pantrixui.components.container.topbar.PantrixTopBar
- Başlık ve alt başlık.
titleekranın adıdır ve tek satırdır;subtitlealtında, daha küçük yazılır: bir sayı, bir durum. İkisi de gezinme ikonu ile eylemlerin arasındaki yere sığmadığında kısaltılır, onların altına girmez. Yazı stillerititleStylevesubtitleStyleile verilir; verilmezse temanıntitlevefootnotestilleridir. - Platform. Başlık Android'de, masaüstünde ve web'de başta, iOS'ta bar'ın ortasında durur. Ortadaki başlık sığdığı sürece bar'ın tam ortasındadır; sığmayınca geniş olan yandan uzaklaşır. Bar Android'de ve iOS'ta 54dp, masaüstünde ve web'de 56dp yüksekliğindedir.
- Gezinme ikonu ve eylemler.
navigationIconbaşlığın önünde durur: bir geri düğmesi ya da bir menüyü açan düğme.actionsbaşlığın arkasında bir satırdır: ekranın yapabildikleri için ikon düğmeleri, en çok kullanılan başta. - Geri düğmesi.
PantrixBackButtonplatformun ikonunu çizer: Android'de, masaüstünde ve web'de ok, iOS'ta ok başı; ikisi de sağdan sola düzende döner. Ekran okuyucu ona temanın dilinde "Geri" der. - Kayan içeriğin çizgisi.
scrolledtrue iken bar'ın alt kenarında bir çizgi çizilir. Çizgi bar'ın yüksekliğinin içindedir; belirip kaybolurken hiçbir şey yerinden oynamaz. - Çöken başlık.
stateverilen bar açıkken başlığı, satırın altındaki bir bantta büyük yazar; içerik yukarı kaydıkça bant kapanır ve başlık satıra geçer. İçerik kaydırmasını bar'aModifier.topBarScroll(state)ile verir. - Paylar.
insetsbar'ın kenarlarında açık bıraktığı yerdir: durum çubuğunun ve çentiğin payı. Bar'ın dolgusu onların arkasına uzanır. - Renk. Bar temanın
surface'ındadır, başlıktextPrimary, alt başlıktextSecondaryile yazılır.TopBarColorsdolguyu, içeriğin rengini ve çizgiyi verir; dolgulu bir bar'da hepsi tek renkle yazılır. - Okuma sırası. Ekran okuyucu ve Tab tuşu bar'ı okunduğu sırayla gezer: gezinme ikonu, başlık ve altındaki alt başlık, eylemler. Başlık ekran okuyucu için ekranın başlığıdır.
- Otomasyon.
tagKeyile barTopBar_<tagKey>, çöken bar'ın büyük başlığıTopBar_<tagKey>.Title_largeolur. Geri düğmesi bir ikon düğmesidir:IconButton_<tagKey>etiketini taşır ve basışı öyle bildirilir.
Örnekler
Yalnızca başlık
En az yazılan hâli: yalnızca title. Gezinme ikonu olmadığında başta duran başlık bar'ın kendi iç boşluğundan başlar; iOS'ta başlık ortadadır.
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(title = "Gelen Kutusu", tagKey = "plain")
}
Geri düğmesi, eylemler ve altında kayan içerik
Bir konuşma ekranı: geri düğmesi, iki eylem ve bar'ın altında kayan bir liste. navigationIcon başlığın önüne bir PantrixBackButton koyar; geri düğmesine kaç kez basıldığı alt başlıkta yazar. actions başlığın arkasına iki ikon düğmesi koyar: kendi hâlleriyle, markanın renginde.
Listeyi kaydır: liste başından ayrılınca bar'ın alt kenarında bir çizgi belirir (scrolled) ve liste geri kayabildiği sürece görünür. Çizgi bar'ın yüksekliğinin içindedir; belirip kaybolurken hiçbir şey yerinden oynamaz.
val list = rememberLazyListState()
var back by rememberSaveable { mutableIntStateOf(0) }
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
Column(modifier = Modifier.height(220.dp)) {
PantrixTopBar(
title = "Konuşma",
subtitle = if (back == 0) null else "Geri'ye $back kez basıldı",
navigationIcon = { PantrixBackButton(onClick = { back++ }, tagKey = "back") },
actions = {
PantrixIconButton(
imageVector = PantrixIcons.Search,
contentDescription = "Ara",
onClick = {},
tagKey = "search"
)
PantrixIconButton(
imageVector = PantrixIcons.MoreHorizontal,
contentDescription = "Diğer",
onClick = {},
tagKey = "more"
)
},
scrolled = list.canScrollBackward,
tagKey = "conversation"
)
LazyColumn(
// Liste bar kadar geniştir: dar kalsaydı yanındaki boşluğa basan parmak listeyi değil sayfayı
// kaydırırdı.
modifier = Modifier.fillMaxWidth(),
state = list,
contentPadding = PaddingValues(PantrixTheme.spacing.lg),
verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.md)
) {
items(12) { index -> PantrixText(text = "Mesaj ${index + 1}") }
}
}
}
Alt başlık
subtitle başlığın altına daha küçük yazılan bir satır koyar: bir sayı, bir durum. Gezinme ikonu burada bir geri düğmesi değil, bir menüyü açan ikon düğmesidir.
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Projeler",
subtitle = "12 açık",
navigationIcon = {
PantrixIconButton(
imageVector = PantrixIcons.Menu,
contentDescription = "Menüyü aç",
onClick = {},
tagKey = "menu"
)
},
tagKey = "subtitle"
)
}
Başlık ve alt başlık kendi yazı stilleriyle
Başlığın ve alt başlığın yazı stili verilebilir: titleStyle ve subtitleStyle. Verilmezse temanın title ve footnote stilleridir; burada callout ve caption verildi. Stilin kendi rengi yoksa yazı bar'ın renginde kalır. Daha büyük bir stil bar'ı satırının gerektirdiği kadar uzatır.
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Projeler",
subtitle = "12 açık",
titleStyle = PantrixTheme.typography.callout,
subtitleStyle = PantrixTheme.typography.caption,
navigationIcon = {
PantrixIconButton(
imageVector = PantrixIcons.Menu,
contentDescription = "Menüyü aç",
onClick = {},
tagKey = "type_menu"
)
},
tagKey = "own_type"
)
}
Sığmayan başlık kısaltılır
Başlık gezinme ikonunun ve eylemlerin altına girmez: aralarında kalan yere sığmayan başlık kısaltılır. Bar burada en fazla 360dp genişliğindedir; başlık geri düğmesi ile yıldızın arasına sığmaz ve sonu kesilir.
PantrixSurface(modifier = Modifier.widthIn(max = 360.dp), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Üçüncü çeyreğin raporları, yönetim kuruluna gönderildiği hâliyle",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "long_back") },
actions = {
PantrixIconButton(
imageVector = PantrixIcons.Star,
contentDescription = "Favorilere ekle",
onClick = {},
tagKey = "favourite"
)
},
tagKey = "long"
)
}
Başlığın yeri: başta ve ortada
Başlığın yeri platforma göredir: Android'de, masaüstünde ve web'de başta, iOS'ta bar'ın ortasında. Burada aynı bar iki kez çizildi ve yer style ile verildi: TopBarStyle(titleAlignment = ...). Hangi platformda bakılırsa bakılsın ikisi de görünür.
Ortadaki başlık, yanında ne durursa dursun bar'ın ortasındadır: geri düğmesi onu yana itmez.
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Ayarlar",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "start_back") },
style = TopBarStyle(titleAlignment = TopBarTitleAlignment.Start),
tagKey = "start"
)
}
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Ayarlar",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "center_back") },
style = TopBarStyle(titleAlignment = TopBarTitleAlignment.Center),
tagKey = "center"
)
}
Geri düğmesinin ikonu
PantrixBackButton hangi ikonu çizeceğini bar'ın stilinden alır: TopBarStyle.backIcon. Platformun kendi ikonu Android'de, masaüstünde ve web'de ok, iOS'ta ok başıdır. Burada iki bar'a style ile birer ikon verildi; bir bar'ın navigationIcon'ındaki geri düğmesi o bar'a verilen stili kullanır.
İkisi de sağdan sola düzende döner: uygulamanın üst bar'ındaki "Yazı tipi ve yön" menüsünden yazı yönünü çevirip bak.
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Ok",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "arrow_back") },
style = TopBarStyle(backIcon = BackButtonIcon.Arrow),
tagKey = "arrow"
)
}
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Ok başı",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "chevron_back") },
style = TopBarStyle(backIcon = BackButtonIcon.Chevron),
tagKey = "chevron"
)
}
Dönülecek yer yokken
Bir akışın ilk ekranında dönülecek yer yoktur: PantrixBackButton'ın enabled'ı false olur ve düğme basılamaz. Sondaki düğmeyle ilerle: geri düğmesi ikinci adımdan itibaren açılır.
var step by rememberSaveable { mutableIntStateOf(0) }
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Adım ${step + 1} / 3",
navigationIcon = { PantrixBackButton(onClick = { step -= 1 }, enabled = step > 0, tagKey = "step_back") },
actions = {
PantrixIconButton(
imageVector = PantrixIcons.ArrowForward,
contentDescription = "Sonraki adım",
onClick = { step += 1 },
enabled = step < 2,
tagKey = "step_next"
)
},
tagKey = "steps"
)
}
Liste kaydıkça çöken büyük başlık
Çöken başlık: durum uygulamanındır ve rememberPantrixTopBarState() ile tutulur; liste kaydırmasını bar'a Modifier.topBarScroll(state) ile verir. Bar açıkken başlık, satırın altındaki bir bantta temanın headline stiliyle büyük yazılır. Büyük başlık her platformda bar'ın başında durur; satırdaki başlık platformun yerinde, iOS'ta ortada.
Listeyi yukarı kaydır: önce bant kapanır, başlık satıra geçer, liste ancak ondan sonra kayar. Bar yeniden yalnızca liste başına dönünce açılır. Bir parmak onu iki yüksekliğin arasında bırakırsa yakın olana gider; fare tekerleğinden sonra tekerleğin son çevrildiği yöne gider. Ekran okuyucu satırdaki başlığı okur: o hep oradadır ve başlık iki kez okunmaz.
Bar ile liste bir scaffold'un içindedir, bir uygulamada olduğu gibi: liste scaffold'un tamamını doldurur ve bar'ın yüksekliği ona üst pay olarak gelir. Bar kapanıp açılırken listenin kendisi yerinde durur, yalnızca payı değişir. Alttaki düğme listeyi başa alır ve collapsedFraction'ı sıfırlayarak bar'ı açar.
val topBar = rememberPantrixTopBarState()
val list = rememberLazyListState()
val scope = rememberCoroutineScope()
val spacing = PantrixTheme.spacing
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixScaffold(
modifier = Modifier.height(320.dp),
topBar = { insets ->
PantrixTopBar(
title = "Gelen Kutusu",
subtitle = "3 okunmamış",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "collapsing_back") },
actions = {
PantrixIconButton(
imageVector = PantrixIcons.Search,
contentDescription = "Ara",
onClick = {},
tagKey = "collapsing_search"
)
},
scrolled = list.canScrollBackward,
state = topBar,
insets = insets,
tagKey = "collapsing"
)
},
containerColor = PantrixTheme.colors.surface,
// Sayfanın içindeki bir kutu: sistem çubukları sayfanın scaffold'undadır, bunun payı yoktur.
windowInsets = WindowInsets(0, 0, 0, 0)
) { padding ->
LazyColumn(
modifier = Modifier.fillMaxSize().topBarScroll(topBar),
state = list,
contentPadding = PaddingValues(
start = spacing.lg,
top = padding.calculateTopPadding() + spacing.lg,
end = spacing.lg,
bottom = spacing.lg
),
verticalArrangement = Arrangement.spacedBy(spacing.md)
) {
items(24) { index -> PantrixText(text = "Konuşma ${index + 1}") }
}
}
}
PantrixButton(
text = "Başa dön ve bar'ı aç",
onClick = {
scope.launch {
list.scrollToItem(0)
topBar.collapsedFraction = 0f
}
},
variant = ButtonVariant.Outline,
size = ButtonSize.Small,
tagKey = "collapsing_to_top"
)
Bar'ın açık bıraktığı pay
insets bar'ın kenarlarında açık bıraktığı paydır: durum çubuğunun ve çentiğin yeri. Bir PantrixScaffold bunu üst bar'ına kendisi verir; burada elle 28dp'lik bir üst pay verildi. Bar'ın dolgusu payın arkasına uzanır, başlık ve geri düğmesi payın altında kalır: bar, stilinin yüksekliğine ek olarak pay kadar uzundur.
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Ayarlar",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "insets_back") },
colors = TopBarColors(container = PantrixTheme.colors.primary.container),
insets = PaddingValues(top = 28.dp),
tagKey = "insets"
)
}
Kendi renkleriyle
colors bar'a temanın değil, verilen renkleri verir. İlk bar'ın dolgusu temanın bir rolünün rengi ve yalnızca o verildi: başlığın, alt başlığın ve geri düğmesinin rengini tema eşleştirir.
İkinci bar temada olmayan bir renkte, uygulamanın kendi morunda: üstünde okunan renk content ile verilir. Başlık, alt başlık ve geri düğmesi content rengini alır. İkon düğmesinin kendi renkleri vardır: dolgunun üstünde okunan renk ona ayrıca verilir.
val own = ownColors()
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Gelen Kutusu",
subtitle = "Yalnızca dolgu verildi",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "role_back") },
colors = TopBarColors(container = PantrixTheme.colors.primary.color),
tagKey = "role"
)
}
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
PantrixTopBar(
title = "Gelen Kutusu",
subtitle = "3 okunmamış",
navigationIcon = { PantrixBackButton(onClick = {}, tagKey = "own_back") },
actions = {
PantrixIconButton(
imageVector = PantrixIcons.Search,
contentDescription = "Ara",
onClick = {},
colors = ButtonColors(container = Color.Transparent, content = own.onColor),
tagKey = "own_search"
)
},
colors = TopBarColors(container = own.color, content = own.onColor),
tagKey = "own"
)
}
API
title
Ekranın üstündeki bar: ekranın başlığı, önünde bir gezinme ikonu ve arkasında eylemler.
| Parametre | Tür | Varsayılan | Ne olduğu |
|---|---|---|---|
title | String | Ekranın adı, tek satırda. | |
modifier | Modifier | Modifier | Bar'ın modifier'ı. |
subtitle | String? | null | Başlığın altında daha küçük yazılan bir satır: bir sayı, bir durum. Alt başlık yoksa null. |
titleStyle | TextStyle | PantrixTheme.typography.title | Satırdaki başlığın yazı stili: verilmezse temanın title stilidir. Daha büyük bir stil bar'ı satırının gerektirdiği kadar uzatır. Yazı stilinin kendi rengi yoksa başlık bar'ın rengindedir. Çöken bir bar'ın büyük başlığı, burada ne verilirse verilsin temanın headline stilindedir. |
subtitleStyle | TextStyle | PantrixTheme.typography.footnote | Alt başlığın satırdaki ve çöken bir bar'ın bandındaki yazı stili: verilmezse temanın footnote stilidir. Yazı stilinin kendi rengi yoksa alt başlık bar'ın rengindedir. |
navigationIcon | (@Composable () -> Unit)? | null | Başlığın önünde duran şey: bir PantrixBackButton ya da bir çekmeceyi açan düğme. Gezinme ikonu yoksa null: başlık o zaman bar'ın kendi iç boşluğundan başlar. |
actions | (@Composable RowScope.() -> Unit)? | null | Başlığın arkasında bir satırda duranlar: ekranın yapabildikleri için ikon düğmeleri, en çok kullanılan başta. Bir düğme kendi renkleriyle çizilir, başka renk verilmezse markanın rengiyle. Kendi dolgusu olan bir bar'da her düğmeye orada okunan renk verilir. |
scrolled | Boolean | false | Bar'ı altında kayan içerikten ayırmak için alt kenarı boyunca bir çizgi çizilip çizilmediği. İçeriğin geri kayıp kayamadığı verilir: listState.canScrollBackward gibi. Çizgi bar'ın yüksekliğinin içindedir, belirip kaybolurken hiçbir şey yerinden oynamaz. |
state | PantrixTopBarState? | null | Bar'a çöken bir başlık verir. rememberPantrixTopBarState ile tutulur, içeriğin kaydırması ona Modifier.topBarScroll ile verilir. Null iken bar tek yüksekliktedir. |
style | TopBarStyle? | null | Bu bar'ın kendi geometrisi. navigationIcon içindeki bir PantrixBackButton da onunla çizilir. Her platformda yalnızca verdiği alanlar değişir. |
colors | TopBarColors? | null | Bu bar'ın kendi renkleri. Null iken temanın renkleri kullanılır: bar temanın surface'ındadır, başlık textPrimary, alt başlık textSecondary ile yazılır. |
insets | PaddingValues | PaddingValues() | Bar'ın kenarlarında açık bıraktığı pay: durum çubuğunun ve çentiğin yeri, bir PantrixScaffold'un üst bar'ına verdiği gibi. Bar'ın dolgusu payın arkasına uzanır. |
tagKey | String? | null | Bar'ın otomasyon anahtarı, her dilde aynıdır: bar TopBar_<tagKey> olarak, çöken bir bar'ın büyük başlığı TopBar_<tagKey>.Title_large olarak etiketlenir. |
TopBarStyle
PantrixTopBar'ın geometrisi ve PantrixBackButton'ın çizdiği ikon.
| Parametre | Tür | Varsayılan | Ne olduğu |
|---|---|---|---|
height | Dp | Dp.Unspecified | Bar'ın, açık bıraktığı payların altındaki yüksekliği: Android'de ve iOS'ta 54dp, masaüstünde ve web'de 56dp. |
expandedHeight | Dp | Dp.Unspecified | Çöken başlıklı bir bar'ın çökmeden önceki yüksekliği: height ve onun altında, başlığı büyük yazan bant. Android'de ve iOS'ta 106dp, masaüstünde ve web'de 104dp: bant 52dp, masaüstünde ve web'de 48dp'dir. Bant yalnızca içindeki satırlar gerektirdiğinde daha yüksek olur. Bunu height'tan yüksek vermeyen bir stilin bandı yoktur: bar'ı, durum verilse de verilmese de tek yüksekliktedir. |
horizontalPadding | Dp | Dp.Unspecified | Bar'ın kenarları ile gezinme ikonu ve eylemler arasındaki boşluk: 8dp. |
titleInset | Dp | Dp.Unspecified | Gezinme ikonu yokken başlığın bar'ın başlangıç kenarına, eylemler yokken bitiş kenarına uzaklığı: 16dp. Başlık hiçbir kenara horizontalPadding'den yakın olmaz. |
titleGap | Dp | Dp.Unspecified | Gezinme ikonu ile başlık ve başlık ile eylemler arasındaki aralık: 8dp. |
titleAlignment | TopBarTitleAlignment? | null | Başlığın yeri: iOS'ta ortada, öteki platformlarda başta. |
backIcon | BackButtonIcon? | null | Bir PantrixBackButton'ın ne çizdiği: iOS'ta ok başı, öteki platformlarda ok. |
TopBarColors
Temanın renklerini almayan bir bar için PantrixTopBar'ın neyle boyandığı: verilen renk kullanılır, verilmeyen temanınki olarak kalır.
| Parametre | Tür | Varsayılan | Ne olduğu |
|---|---|---|---|
container | Color | Color.Unspecified | Bar'ın dolgusu. Bar'ın açık bıraktığı payların arkasına uzanır. Temanın surface'ıdır. |
content | Color | Color.Unspecified | Başlık, alt başlık ve gezinme ikonu ile eylemlerdeki ikonlardan kendi rengini vermeyenler. Temanın kendi dolgusunda başlık temanın textPrimary, alt başlık textSecondary rengindedir, ikon da kendi varsayılanındadır. |
divider | Color | Color.Unspecified | İçerik bar'ın altına kaymışken alt kenarı boyunca çizilen çizgi. Temanın kendi zeminlerinde temanın divider rengidir. Bir dolgunun üstünde, o çizginin okunmayacağı yerde, content'in bir payıdır: Subtle bir düğmenin kenarı gibi. |