Pantrix UI

Date Picker

Ay ay gezilen ve bir gün seçtiren bir takvim: ayın başlığı ve iki yanında ayı çeviren oklar, sütunların üstünde haftanın günleri, bir de ayın günleri.

import com.pantrixui.components.date.datepicker.PantrixDatePicker

Örnekler

Popover'da tek gün

Bir düğme seçilen günü gösterir ve takvimi altında bir popover'da açar; bir gün seçilince popover kapanır. Bugünden önceki günler seçilemez.

var due by remember { mutableStateOf<PantrixDate?>(null) }
var open by remember { mutableStateOf(false) }
val strings = PantrixTheme.strings
PantrixPopover(
    visible = open,
    onDismissRequest = { open = false },
    anchor = {
        PantrixButton(
            text = due?.let(strings::written) ?: "Teslim tarihi seçin",
            onClick = { open = !open },
            variant = ButtonVariant.Outline,
            leadingIcon = { PantrixIcon(PantrixIcons.Calendar, contentDescription = null) },
            tagKey = "due"
        )
    },
    alignment = PopoverAlignment.Start,
    tagKey = "due"
) {
    PantrixDatePicker(
        selected = due,
        onSelect = {
            due = it
            open = false
        },
        minDate = rememberToday(),
        tagKey = "due"
    )
}

private fun PantrixStrings.written(day: PantrixDate): String = date(day.day, day.month, day.year)

Sayfada hafta içi bir aralık

Sayfada duran bir takvimden bir izin aralığı: yalnızca hafta içi günler uç olabilir, hafta her dilde Pazartesi başlar. Seçilen aralık takvimin altında yazılır.

var leave by remember { mutableStateOf<PantrixDateRange?>(null) }
val strings = PantrixTheme.strings
Column(verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixDatePicker(
        selectedRange = leave,
        onRangeSelect = { leave = it },
        isDateEnabled = { it.dayOfWeek <= FRIDAY },
        firstDayOfWeek = MONDAY,
        tagKey = "leave"
    )
    PantrixText(
        text = leave?.let { "İzin: ${strings.written(it.start)} – ${strings.written(it.end)}" }
            ?: "İznin ilk ve son gününü seçin",
        style = PantrixTheme.typography.body
    )
}

private fun PantrixStrings.written(day: PantrixDate): String = date(day.day, day.month, day.year)

private const val MONDAY = 1

private const val FRIDAY = 5

Dialog'da sınırlı günler

Bir dialog'da önümüzdeki otuz günden biri. Takvimdeki seçim bir taslaktır: Tamam onu kabul eder, Vazgeç ya da dialog'un dışına basmak bırakır.

var appointment by remember { mutableStateOf<PantrixDate?>(null) }
var draft by remember { mutableStateOf<PantrixDate?>(null) }
var open by remember { mutableStateOf(false) }
val today = rememberToday()
val strings = PantrixTheme.strings
val report = LocalExampleEvents.current
PantrixButton(
    text = appointment?.let { "Randevu: ${strings.written(it)}" } ?: "Randevu günü seçin",
    onClick = {
        draft = appointment
        open = true
    },
    variant = ButtonVariant.Outline,
    tagKey = "appointment"
)
PantrixDialog(
    visible = open,
    onDismissRequest = { open = false },
    title = "Randevu günü",
    actions = {
        PantrixButton(text = "Vazgeç", onClick = { open = false }, variant = ButtonVariant.Text, tagKey = "cancel")
        PantrixButton(
            text = "Tamam",
            onClick = {
                appointment = draft
                open = false
                report("Randevu seçildi")
            },
            enabled = draft != null,
            tagKey = "accept"
        )
    },
    tagKey = "appointment"
) {
    PantrixDatePicker(
        selected = draft,
        onSelect = { draft = it },
        minDate = today,
        maxDate = today.plusDays(DAYS_AHEAD),
        tagKey = "appointment"
    )
}

private fun PantrixStrings.written(day: PantrixDate): String = date(day.day, day.month, day.year)

private const val DAYS_AHEAD = 30

Sheet'te doğum günü, yıllarla

Bir sheet'te doğum günü: bugünden sonrası seçilemez. Uzak bir yıl başlığa basıp yıllardan seçilir; takvim o yılın aynı ayına döner. Takvim sheet'in genişliğini doldurur (fillMaxWidth): sütunları genişler, çok geniş bir sheet'te ortada durur.

var birthday by remember { mutableStateOf<PantrixDate?>(null) }
var open by remember { mutableStateOf(false) }
val strings = PantrixTheme.strings
PantrixButton(
    text = birthday?.let { "Doğum günü: ${strings.written(it)}" } ?: "Doğum gününü seçin",
    onClick = { open = true },
    variant = ButtonVariant.Outline,
    tagKey = "birthday"
)
PantrixSheet(
    visible = open,
    onDismissRequest = { open = false },
    title = "Doğum günü",
    tagKey = "birthday"
) {
    PantrixDatePicker(
        selected = birthday,
        onSelect = {
            birthday = it
            open = false
        },
        modifier = Modifier.fillMaxWidth(),
        maxDate = rememberToday(),
        tagKey = "birthday"
    )
}

private fun PantrixStrings.written(day: PantrixDate): String = date(day.day, day.month, day.year)

Başka bir yerin bugünü

Takvimin bugünü cihazın saatine göre değil, bir otelin saatine göre: today bugünün halkasını verir, minDate de onunla seçilebilen ilk günü. Kiritimati (UTC+14) ile Pago Pago (UTC-11) arasında 25 saat vardır, ikisinde her an başka bir gündür: yer değişince halka ve ilk gün bir gün kayar. Verilmezse today ekranın saatinin günüdür (rememberToday()) ve gece yarısı kendiliğinden döner; bu örnek otelin gününü yer seçilince okur.

var hotel by remember { mutableStateOf(Hotel.Kiritimati) }
var arrival by remember { mutableStateOf<PantrixDate?>(null) }
val today = remember(hotel) { PantrixDate.of(Clock.System.now(), offset = hotel.offset) }
val strings = PantrixTheme.strings
Column(verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixSegmentButton(
        options = listOf(
            SegmentOption(Hotel.Kiritimati, "Kiritimati", tagKey = "kiritimati"),
            SegmentOption(Hotel.PagoPago, "Pago Pago", tagKey = "pago_pago")
        ),
        selected = hotel,
        onSelect = {
            hotel = it
            arrival = null
        },
        fullWidth = false,
        tagKey = "hotel"
    )
    PantrixDatePicker(
        selected = arrival,
        onSelect = { arrival = it },
        minDate = today,
        today = today,
        tagKey = "arrival"
    )
    PantrixText(
        text = "Otelde bugün ${strings.written(today)} (${hotel.zone})",
        style = PantrixTheme.typography.body
    )
    PantrixText(
        text = arrival?.let { "Varış: ${strings.written(it)}" } ?: "Varış gününü seçin",
        style = PantrixTheme.typography.body
    )
}

private enum class Hotel(
    val zone: String,
    val offset: Duration
) {
    Kiritimati("UTC+14", 14.hours),
    PagoPago("UTC-11", (-11).hours)
}

private fun PantrixStrings.written(day: PantrixDate): String = date(day.day, day.month, day.year)

Ekranın saati

Bütün bir ekranın saati: LocalPantrixClock otelin saatini verir ve içindeki her şey onu okur. Takvime today verilmedi; halkası, rememberToday() ve saatin kendisi otelin saatindedir. Bir önizleme ya da bir test ekranı böyle bir günde ve bir saatte gösterir: PantrixClock(clock, utcOffset) bir Clock'u da kendisi alır.

var hotel by remember { mutableStateOf(Hotel.Kiritimati) }
val clock = remember(hotel) { PantrixClock(Clock.System) { hotel.offset } }
Column(verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixSegmentButton(
        options = listOf(
            SegmentOption(Hotel.Kiritimati, "Kiritimati", tagKey = "kiritimati"),
            SegmentOption(Hotel.PagoPago, "Pago Pago", tagKey = "pago_pago")
        ),
        selected = hotel,
        onSelect = { hotel = it },
        fullWidth = false,
        tagKey = "screen_hotel"
    )
    CompositionLocalProvider(LocalPantrixClock provides clock) {
        var arrival by remember { mutableStateOf<PantrixDate?>(null) }
        PantrixDatePicker(selected = arrival, onSelect = { arrival = it }, tagKey = "screen_arrival")
        val today = rememberToday()
        val now = LocalPantrixClock.current.time()
        val strings = PantrixTheme.strings
        PantrixText(
            text = "Ekranda bugün ${strings.written(today)}, saat ${strings.clock(now.hour, now.minute)}",
            style = PantrixTheme.typography.body
        )
    }
}

private enum class Hotel(
    val zone: String,
    val offset: Duration
) {
    Kiritimati("UTC+14", 14.hours),
    PagoPago("UTC-11", (-11).hours)
}

private fun PantrixStrings.written(day: PantrixDate): String = date(day.day, day.month, day.year)

Kendi renkleri ve devre dışı

Takvimin kendi renkleri ve ölçüsü, bir anahtarla devre dışı. Aralığın uçları başarı renginde, arası onun açık dolgusunda, bugünün halkası uyarı renginde; verilmeyen her renk temanındır. Takvimin kenar boşluğu yok (padding = 0.dp): kartın kendi boşluğunda durur. Anahtar kapalıyken takvim soluktur: ne gün seçilir ne ay değişir, seçili aralık yerinde kalır.

var trip by remember { mutableStateOf<PantrixDateRange?>(null) }
var enabled by remember { mutableStateOf(true) }
val colors = PantrixTheme.colors
Column(verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixSwitchButton(
        checked = enabled,
        onCheckedChange = { enabled = it },
        label = "Seçilebilir",
        tagKey = "trip_enabled"
    )
    PantrixDatePicker(
        selectedRange = trip,
        onRangeSelect = { trip = it },
        enabled = enabled,
        style = DatePickerStyle(padding = 0.dp),
        colors = DatePickerColors(
            selectedContainer = colors.success.color,
            rangeContainer = colors.success.container,
            today = colors.warning.color
        ),
        tagKey = "trip"
    )
}

API

selected

Ay ay gezilen ve bir gün seçtiren bir takvim: ayın başlığı ve iki yanında ayı çeviren oklar, sütunların üstünde haftanın günleri, bir de ayın günleri.

ParametreTürVarsayılanNe olduğu
selectedPantrixDate?seçili gün; hiçbiri seçili değilken null.
onSelect(PantrixDate) -> Unitbir basışın seçtiği günü alır: seçilebilen bir gün.
modifierModifierModifiertakvimin modifier'ı. Takvim yedi gün genişliğindedir; daha az yer verilen yerde daralır. Bir genişlik verilince, örneğin Modifier.fillMaxWidth() ona bir sheet'in genişliğini verince, o genişliği doldurur: sütunları DatePickerStyle.maxCellWidth'e kadar genişler, ötesinde takvim ortada durur.
minDatePantrixDate?nullseçilebilen ilk gün; öyle erken bir sınır yoksa null.
maxDatePantrixDate?nullseçilebilen son gün; öyle geç bir sınır yoksa null.
isDateEnabled((PantrixDate) -> Boolean)?nullaradaki bir günün seçilip seçilemeyeceği; hepsi seçilebiliyorsa null.
firstDayOfWeekInt?nullhaftaların başladığı gün, ISO 8601'in numaralarıyla: 1 Pazartesi, 7 Pazar. Null dilin gününü, PantrixLocale.firstDayOfWeek'i kullanır: İngilizcede Pazar, Türkçede Pazartesi, Arapçada Cumartesi.
enabledBooleantruebir günün seçilip seçilemeyeceği. Seçim almayan bir takvim soluk çizilir.
todayPantrixDaterememberToday()bugün olarak işaretlenen gün: varsayılan, ekranın saatinin gösterdiği gün (rememberToday), gece yarısı döner. Bir test kendi gününü verir.
styleDatePickerStyle?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.
colorsDatePickerColors?nullbu takvimin kendi renkleri: verdikleri kullanılır, gerisi temanınkidir.
tagKeyString?nulltakvimin otomasyon anahtarı: DatePicker_<tagKey> olur, günleri de DatePicker_<tagKey>.Day_2026_10_17.

selectedRange

Bir gün aralığı seçtiren takvim: bir konaklama, bir izin, bir raporun kapsadığı günler. Bir gün seçtiren takvimin kendisidir, iki kez basılır: ilk basış aralığın ilk gününü, ikincisi son gününü seçer.

ParametreTürVarsayılanNe olduğu
selectedRangePantrixDateRange?seçili aralık; hiçbiri seçili değilken null.
onRangeSelect(PantrixDateRange) -> Unitiki basışın seçtiği aralığı alır.
modifierModifierModifiertakvimin modifier'ı. Takvim yedi gün genişliğindedir, daha az yer verilen yerde daralır; bir genişlik verilince, sütunları DatePickerStyle.maxCellWidth'e kadar genişleyerek o genişliği doldurur.
minDatePantrixDate?nullseçilebilen ilk gün; öyle erken bir sınır yoksa null.
maxDatePantrixDate?nullseçilebilen son gün; öyle geç bir sınır yoksa null.
isDateEnabled((PantrixDate) -> Boolean)?nullaradaki bir günün bir aralığın ilk ya da son günü olup olamayacağı; hepsi olabiliyorsa null.
firstDayOfWeekInt?nullhaftaların başladığı gün, ISO 8601'in numaralarıyla: 1 Pazartesi, 7 Pazar. Null dilin gününü, PantrixLocale.firstDayOfWeek'i kullanır.
enabledBooleantruebir aralığın seçilip seçilemeyeceği. Seçim almayan bir takvim soluk çizilir.
todayPantrixDaterememberToday()bugün olarak işaretlenen gün: varsayılan, ekranın saatinin gösterdiği gün (rememberToday), gece yarısı döner. Bir test kendi gününü verir.
styleDatePickerStyle?nullBu çağrının kendi stili: çevresindeki her stili ezer, yoğunluk ona da uygulanır.
colorsDatePickerColors?nullbu takvimin kendi renkleri: verdikleri kullanılır, gerisi temanınkidir.
tagKeyString?nulltakvimin otomasyon anahtarı: DatePicker_<tagKey> olur, günleri de DatePicker_<tagKey>.Day_2026_10_17.

DatePickerStyle

PantrixDatePicker'ın geometrisi: bir günün yeri, seçili bir günün çizildiği yuvarlak işaret ve ayın çevresindeki boşluk.

ParametreTürVarsayılanNe olduğu
cellSizeDpDp.UnspecifiedBir günün yerinin genişliği ve yüksekliği: sütun ve satır. Başlık ve yılların yerleri de bu yükseklikte.
daySizeDpDp.UnspecifiedSeçili günün, bugünün ve işaretçinin altındaki günün çizildiği, yerinin ortasındaki yuvarlak işaretin genişliği ve yüksekliği. Bir gün aralığı bu yükseklikte bir şerittir.
paddingDpDp.UnspecifiedTakvimin kenarı ile içindekiler arasındaki boşluk.
gapDpDp.UnspecifiedBaşlık ile ayın üstündeki haftanın günleri arasındaki ara.
maxCellWidthDpDp.UnspecifiedTakvime yedi günün yerinden geniş bir yer verildiğinde bir sütunun genişleyebileceği en büyük genişlik: cellSize'ın bir buçuk katı.

DatePickerColors

Bir PantrixDatePicker'ın temanın renkleri yerine boyandığı renkler: verilen renk kullanılır, verilmeyen temanın kalır.

ParametreTürVarsayılanNe olduğu
contentColorColor.UnspecifiedGünlerin sayıları, başlık ve oklar. Temanın textPrimary'si.
weekdayColorColor.UnspecifiedSütunların üstündeki haftanın günleri. Temanın textSecondary'si.
selectedContainerColorColor.UnspecifiedSeçili günün ve bir aralığın ilk ve son gününün yuvarlak işareti. primary rolünün color'ı.
selectedContentColorColor.UnspecifiedÜstündeki sayı. primary rolünün onColor'ı, ya da selectedContainer olarak verilen bir rol dolgusunun üstünde duran için verdiği renk.
rangeContainerColorColor.UnspecifiedBir aralığın ilk ve son günü arasındaki günlerin altındaki şerit. primary rolünün container'ı. Son gün işaretçiyle seçilirken altındaki güne kadar olan şerit bu rengin yarısıyla çizilir.
rangeContentColorColor.UnspecifiedŞeridin üstündeki sayılar. primary rolünün onContainer'ı.
todayColorColor.UnspecifiedBugünün çevresindeki halka ve sayısı. primary rolünün color'ı.
hoverColorColor.Unspecifiedİşaretçinin altındaki yuvarlak işaret: bir basışın hangi günü seçeceği. content'in bir payı.
disabledColorColor.UnspecifiedSeçilemeyen günlerin sayıları ve seçim almayan bir takvimin her şeyi. Temanın textDisabled'ı.

Erişilebilirlik