Pantrix UI

JSON View

Okunmak için dizilmiş bir JSON metni: her satırda bir değer, her düzey kendisini tutandan içeride, her tür değer kendi renginde. Her nesne ve her dizi ilk satırının arkasına katlanır.

import com.pantrixui.components.data.jsonview.PantrixJsonView

Örnekler

Bir yanıt

En yalın hâli: bir JSON metni, bir de otomasyon anahtarı. Görünüm metni okunacak biçimde dizer: her satırda bir değer, her düzey kendisini tutandan içeride. Adlar ve metin değerleri tırnaklarıyla, parantezler ve virgüller yerinde durur: açık bir belgenin gösterdiği belgenin kendisidir. Sayılar metinde yazıldığı gibidir, 249.90 son sıfırını korur.

Her tür değer kendi rengindedir: metin değerleri, sayılar, true, false ve null. Nesnelerin ve dizilerin ilk satırı bir düğmedir: "items" satırına bas, dizi tek satıra katlanır ve içinde kaç şey olduğunu yazar. Yeniden bas, açılır.

PantrixJsonView(json = RESPONSE, tagKey = "response")

private val RESPONSE =
    """
    {
      "id": 4821,
      "status": "shipped",
      "total": 249.90,
      "paid": true,
      "coupon": null,
      "customer": {
        "name": "Ada Yılmaz",
        "city": "İzmir"
      },
      "items": [
        { "sku": "KB-104", "quantity": 1, "price": 189.90 },
        { "sku": "MS-220", "quantity": 2, "price": 30.00 }
      ]
    }
    """.trimIndent()

İlk açılışta ne kadarı açık

expandedDepth belgenin başta kaç düzeyinin açık olduğunu söyler. 1 metnin kendi değerini açar ve içindeki her şeyi katlanmış bırakır; 2 onları da açar; verilmezse her düzey açıktır.

Neyin açık olduğunu görünüm kendisi tutar: bir satıra basıp katladığın ya da açtığın öyle kalır. Başka bir derinlik verilince görünüm oradan yeniden başlar: "customer" satırına bas, sonra başka bir derinlik seç.

var depth by rememberSaveable { mutableIntStateOf(1) }
PantrixSegmentButton(
    options = DEPTHS,
    selected = depth,
    onSelect = { depth = it },
    fullWidth = false,
    tagKey = "depth"
)
PantrixJsonView(json = RESPONSE, expandedDepth = depth, tagKey = "by_depth")

private val DEPTHS = listOf(
    SegmentOption(value = 1, label = "1 düzey", tagKey = "one"),
    SegmentOption(value = 2, label = "2 düzey", tagKey = "two"),
    SegmentOption(value = Int.MAX_VALUE, label = "Hepsi", tagKey = "all")
)

private val RESPONSE =
    """
    {
      "id": 4821,
      "status": "shipped",
      "total": 249.90,
      "paid": true,
      "coupon": null,
      "customer": {
        "name": "Ada Yılmaz",
        "city": "İzmir"
      },
      "items": [
        { "sku": "KB-104", "quantity": 1, "price": 189.90 },
        { "sku": "MS-220", "quantity": 2, "price": 30.00 }
      ]
    }
    """.trimIndent()

Yüksekliği verilen uzun bir belge

Birkaç yüz satırlık bir belge, 280dp yüksekliğinde bir yerde. Yükseklik görünümün modifier'ına verildi: belge o yüksekliğin içinde kayar ve yalnızca ekrandaki satırlar kurulur. Binlerce satırlık bir belge de böyle gösterilir.

Yükseklik verilmeseydi görünüm, bu sayfa gibi kayan bir sayfada, 300 satırı geçen bu belgeyle pencerenin yüksekliğini alır ve onun içinde kayardı. 300 satırı geçmeyen bir belgeyle bütün satırları kadar yüksek olurdu: yüksekliği verilmeyen öteki örneklerde öyledir. Metin yalnızca değiştiğinde yeniden okunur; burada bir kez kurulur ve remember ile tutulur.

val readings = remember { sensorReadings(count = 60) }
PantrixJsonView(json = readings, modifier = Modifier.height(280.dp), tagKey = "readings")

private fun sensorReadings(count: Int): String =
    (1..count).joinToString(separator = ",", prefix = "[", postfix = "]") { n ->
        """{"id": $n, "sensor": "T-${n % 4 + 1}", "celsius": ${18 + n % 7}.${n % 10}, "ok": ${n % 9 != 0}}"""
    }

Arama

search aradığını adlarda ve değerlerde bulur, büyük küçük harfe bakmadan, ve üç şey yapar: bulduğunu işaretler, onu tutan değerleri açar ve görünümün kaydığı yerde bulduklarının ilkini ekrana getirir.

Belge kırk sekiz siparişlik bir dizidir, 240dp yüksekliğinde bir yerde, ve yalnızca ilk düzeyi açıktır: her sipariş tek satıra katlanmış durur. Alana returned yaz: iade edilen dört sipariş açılır, sözcük dördünde de işaretlenir ve görünüm ilkine, on ikinci siparişe kayar. Alanı boşalt: işaretler kalkar ve aramanın açtığı siparişler yeniden katlanır.

val query = rememberTextFieldState()
val orders = remember { orderExport(count = 48) }
PantrixTextField(
    state = query,
    modifier = Modifier.fillMaxWidth(),
    placeholder = "Siparişlerde ara",
    showClearButton = true,
    contentDescription = "Siparişlerde ara",
    tagKey = "order_search"
)
PantrixJsonView(
    json = orders,
    modifier = Modifier.height(240.dp),
    expandedDepth = 1,
    search = query.text.toString(),
    tagKey = "orders"
)

private fun orderExport(count: Int): String =
    (1..count).joinToString(separator = ",", prefix = "[", postfix = "]") { n ->
        val status = if (n % 12 == 0) "returned" else "shipped"
        """{"id": ${4800 + n}, "status": "$status", "total": ${30 + n * 4}.50}"""
    }

Satır numaraları ve bölünmeyen satırlar

lineNumbers her satırın başına numarasını yazar: belge bütünüyle açıkken taşıdığı numarayı. "request" satırına bas: katlanan değer açıldığı satırın numarasını, 4'ü, korur ve ardındaki satır 9'dan sürer.

"signature" değeri karta sığmayacak kadar uzundur. Başta satır kendi altında sürer ve tek bir numara taşır. Anahtarı kapat: softWrap = false her değeri tek satırda tutar, görünüm genişliğini korur ve belge yana kayar.

var wraps by rememberSaveable { mutableStateOf(true) }
PantrixSwitchButton(
    checked = wraps,
    onCheckedChange = { wraps = it },
    label = "Uzun satır kendi altında sürsün",
    tagKey = "soft_wrap"
)
PantrixJsonView(json = WEBHOOK, softWrap = wraps, lineNumbers = true, tagKey = "webhook")

private val WEBHOOK =
    """
    {
      "event": "payment.failed",
      "order": 4821,
      "request": {
        "method": "POST",
        "url": "https://api.example.com/v2/payments",
        "attempts": 3
      },
      "signature": "${"9f2c41d7a0b35e68".repeat(14)}",
      "handled": false
    }
    """.trimIndent()

Kopyalama ve seçme

Görünümün sağ üst köşesindeki düğme belgenin tamamını kopyalar: ekranda katlanmış olanı da, açık bir görünümün yazdığı gibi, her satırda bir değer ve her düzeyde iki boşlukla. Kopyalayınca düğme iki saniye bir onay işareti gösterir.

onCopy belgenin panoya ulaşıp ulaşmadığını bildirir: burada kartın "Son olay" satırına yazılır. Bunu kullanıcısına söyleyen bir ekran, sistemin kopyalananı kendisi gösterdiği yerde, Android 13 ve üstünde, yalnızca kopyalanamadığında söyler: orada rememberPantrixClipboard().traits.announcedBySystem true'dur.

Üstteki görünümde ekrandaki satırlar da seçilir, fareyle sürükleyerek ya da uzun basarak, ve sistemin kendi yoluyla kopyalanır. Alttaki görünüm aynı belgedir: copyable = false düğmeyi kaldırır, selectable = false seçmeyi kapatır.

val report = LocalExampleEvents.current
PantrixJsonView(
    json = SETTINGS,
    expandedDepth = 1,
    onCopy = { copied -> report(if (copied) "Belge panoya kopyalandı" else "Belge panoya kopyalanamadı") },
    tagKey = "copyable"
)
PantrixJsonView(
    json = SETTINGS,
    expandedDepth = 1,
    selectable = false,
    copyable = false,
    tagKey = "not_copyable"
)

private val SETTINGS =
    """
    {
      "theme": "dark",
      "fontScale": 1.15,
      "notifications": {
        "email": true,
        "push": false,
        "quietHours": { "from": "22:00", "to": "07:00" }
      },
      "shortcuts": [
        { "keys": "Ctrl+K", "action": "search" },
        { "keys": "Ctrl+S", "action": "save" }
      ]
    }
    """.trimIndent()

Ekranın kendi düğmeleriyle

expanded alan biçimde neyin açık olduğunu ekran tutar, bir accordion'ın bölümlerinde olduğu gibi: görünüme açık nesnelerin ve dizilerin yolları verilir, bir satıra basılınca açık olması gereken yeni küme onExpandedChange ile bildirilir. Görünüm kendiliğinden hiçbir şeyi değiştirmez.

Durum jsonViewPaths(json, depth = 1) ile kuruldu: yalnızca metnin kendi değeri açık. "Hepsini aç" belgenin bütün yollarını koyar, "Hepsini kapat" kümeyi boşaltır: açık hiçbir şey kalmaz ve belge tek satıra iner. Her değişiklik, kaç yolun açık olduğuyla birlikte, kartın "Son olay" satırına yazılır.

Bir yol bir JSON Pointer'dır: metnin kendi değeri boş metin, notifications üyesi /notifications, shortcuts'un ilki /shortcuts/0.

val report = LocalExampleEvents.current
var open by rememberSaveable { mutableStateOf(jsonViewPaths(SETTINGS, depth = 1)) }
Row(horizontalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixButton(
        text = "Hepsini aç",
        onClick = {
            open = jsonViewPaths(SETTINGS)
            report("Hepsi açıldı, açık yol: ${open.size}")
        },
        variant = ButtonVariant.Outline,
        size = ButtonSize.Small,
        tagKey = "json_open_all"
    )
    PantrixButton(
        text = "Hepsini kapat",
        onClick = {
            open = emptySet()
            report("Hepsi kapatıldı, açık yol: ${open.size}")
        },
        variant = ButtonVariant.Text,
        size = ButtonSize.Small,
        tagKey = "json_close_all"
    )
}
PantrixJsonView(
    json = SETTINGS,
    expanded = open,
    onExpandedChange = { paths ->
        open = paths
        report("Satıra basıldı, açık yol: ${paths.size}")
    },
    tagKey = "settings"
)

private val SETTINGS =
    """
    {
      "theme": "dark",
      "fontScale": 1.15,
      "notifications": {
        "email": true,
        "push": false,
        "quietHours": { "from": "22:00", "to": "07:00" }
      },
      "shortcuts": [
        { "keys": "Ctrl+K", "action": "search" },
        { "keys": "Ctrl+S", "action": "save" }
      ]
    }
    """.trimIndent()

Arama, ekranın kendi durumuyla

expanded alan biçimde arama yalnızca işaretler; bulduğunu açmak ekranın işidir. jsonViewSearchPaths içinde aranandan bir şey olan değerlerin yollarını verir ve ekran onları kendi kümesine ekler.

Alana ctrl yaz: shortcuts dizisi ve içindeki iki nesne açılır, Ctrl ikisinde de işaretlenir. Arama sürerken bu satırlar katlanmaz: aramanın yolları kümeye her seferinde yeniden eklenir. Alanı boşalt: açık olan yine yalnızca ekranın kümesidir.

val query = rememberTextFieldState()
var open by rememberSaveable { mutableStateOf(jsonViewPaths(SETTINGS, depth = 1)) }
PantrixTextField(
    state = query,
    modifier = Modifier.fillMaxWidth(),
    placeholder = "Ayarlarda ara",
    showClearButton = true,
    contentDescription = "Ayarlarda ara",
    tagKey = "settings_search"
)
PantrixJsonView(
    json = SETTINGS,
    expanded = open + jsonViewSearchPaths(SETTINGS, query.text.toString()),
    onExpandedChange = { open = it },
    search = query.text.toString(),
    tagKey = "searched_settings"
)

private val SETTINGS =
    """
    {
      "theme": "dark",
      "fontScale": 1.15,
      "notifications": {
        "email": true,
        "push": false,
        "quietHours": { "from": "22:00", "to": "07:00" }
      },
      "shortcuts": [
        { "keys": "Ctrl+K", "action": "search" },
        { "keys": "Ctrl+S", "action": "save" }
      ]
    }
    """.trimIndent()

JSON olmayan bir metin

Son üyesinden sonra bir virgül kalmış bir metin: JSON değildir. Görünüm okuyamadığı metni saklamaz, olduğu gibi, satır satır gösterir. Üstündeki satır, temanın dilinde, okumanın nerede durduğunu söyler: satır ve sütun, ikisi de birden sayılır.

Burada okuma dördüncü satırın ilk karakterinde durur: virgülden sonra bir ad beklenirken kapanış parantezi gelir.

PantrixJsonView(json = NOT_JSON, tagKey = "not_json")

private val NOT_JSON =
    """
    {
      "id": 4821,
      "status": "shipped",
    }
    """.trimIndent()

Bir kartın içinde, kendi renkleriyle

Görünümün kendi dolgusu ve kenarı vardır: dolgu temanın surface'ı, kenar temanın divider'ıdır. İkisi de olan bir kartın içinde colors ikisini de saydam verir. Verilen renk kullanılır, verilmeyen temanınki kalır: adlar temanın textPrimary'si, parantezler ve virgüller textSecondary'sidir; metin değerleri success, sayılar warning, true, false ve null ise primary rolünün rengindedir.

style görünümün geometrisini değiştirir; yalnızca verilen alanlar değişir. Burada satırlar kartın iç boşluğunun bittiği yerden başlasın diye horizontalPadding sıfır verildi, her düzey de 24dp içeride: indent.

PantrixCard(modifier = Modifier.fillMaxWidth(), variant = CardVariant.Outlined) {
    PantrixText(text = "Son sipariş", style = PantrixTheme.typography.title)
    PantrixJsonView(
        json = RESPONSE,
        style = JsonViewStyle(horizontalPadding = 0.dp, indent = 24.dp),
        colors = JsonViewColors(container = Color.Transparent, border = Color.Transparent),
        tagKey = "in_a_card"
    )
}

private val RESPONSE =
    """
    {
      "id": 4821,
      "status": "shipped",
      "total": 249.90,
      "paid": true,
      "coupon": null,
      "customer": {
        "name": "Ada Yılmaz",
        "city": "İzmir"
      },
      "items": [
        { "sku": "KB-104", "quantity": 1, "price": 189.90 },
        { "sku": "MS-220", "quantity": 2, "price": 30.00 }
      ]
    }
    """.trimIndent()

API

json

Okunmak için dizilmiş bir JSON metni: her satırda bir değer, her düzey kendisini tutandan içeride, her tür değer kendi renginde. Her nesne ve her dizi ilk satırının arkasına katlanır.

ParametreTürVarsayılanNe olduğu
jsonStringJSON metni, RFC 8259'un yazdığı gibi. Yalnızca değiştiğinde yeniden okunur: bir megabaytı bir telefon saniyenin onda birkaçında okur.
modifierModifierModifierGörünümün modifier'ı. Burada verilen yükseklik, belgenin içinde kaydığı yerdir.
expandedDepthIntInt.MAX_VALUEBaşta kaç düzeyin açık olduğu: 1 metnin kendi değerini, içindeki her şey katlanmış olarak gösterir, 2 onları da açar; varsayılan olarak her düzey açıktır. Başka bir derinlik vermek görünümü oradan yeniden başlatır.
searchString""Adlarda ve değerlerde aranan, büyük ya da küçük harfle. Varsayılan olarak boştur ve hiçbir şey işaretlenmez. Verildiği gibi, satırların yazıldığı hâlinde aranır: bir ad ve bir metin değeri tırnaklarıyla; aranan metnin başındaki ve sonundaki boşluk atılmaz. Her değiştiğinde belgenin tamamına bakılır: megabaytlarca bir metinde, okuyan yazmayı bıraktığında ver.
softWrapBooleantrueGörünüme sığmayan satırın kendi altında sürüp sürmediği. Değeri false ise her değer tek satırda kalır ve belge yana kayar.
lineNumbersBooleanfalseHer satırın, açık belgedeki numarasını başında, geri kalanından önce taşıyıp taşımadığı.
selectableBooleantrueSatırların yazdığının seçilip seçilemediği: üstünde bir imleç sürüklenerek ya da parmak basılı tutularak seçilir ve sistemin kendi yoluyla kopyalanır. Böyle kopyalanan, satırların gösterdiğidir, satır satır: girintisi olmadan, katlanmış bir değer de katlandığı gibi. Kendi yüksekliğinde kayan bir görünüm yalnızca ekranındaki satırları kurmuştur; orada "tümünü seç" de onları seçer. Düğme ise belgenin kendisini kopyalar.
copyableBooleantrueGörünümde belgeyi kopyalayan düğmenin olup olmadığı.
onCopy((copied: Boolean) -> Unit)?nullO düğmeye basıldıktan sonra, belgenin panoya ulaşıp ulaşmadığıyla çağrılır: bunu kendi yoluyla söyleyen ekran burayı dinler. Düğmenin kendisi kısa bir süre bir onay işareti gösterir ve ekran okuyucuya söyler; sistem her kopyayı kendisi gösteriyorsa (PantrixClipboard.traits) söylemez: orada başka bir şey gerekmez.
styleJsonViewStyle?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.
colorsJsonViewColors?nullBu görünümün, temadan gelmeyen kendi renkleri: burada verilenler kullanılır, gerisi temanınki kalır.
tagKeyString?nullGörünümün otomasyon anahtarı: görünüm JsonView_<tagKey>, içindeki bir satır JsonView_<tagKey>.Row_<path> olarak etiketlenir; yol yazıldığı gibidir (Row_/user/tags/0, metnin kendi değeri için Row_root). Açık bir değeri kapatan satır JsonView_<tagKey>.End_<path>, JSON olmayan bir metnin üstündeki satır JsonView_<tagKey>.Note_fault, kopyalama düğmesi JsonView_<tagKey>.Button_copy olarak etiketlenir. Yalnızca aynı adı taşıyan iki üye aynı yolu, dolayısıyla aynı test etiketini paylaşır. Bir basış JsonView olayı olarak bildirilir: expand ve collapse satırın düzeyiyle, copy panoya ulaşıp ulaşmadığıyla. Belgeden hiçbir şey bildirilmez.

json

Neyin açık olduğunu çağıranın tuttuğu PantrixJsonView, bir accordion'ın bölümlerinde olduğu gibi: expanded verilir, onExpandedChange'in bildirdiği uygulanır. Böylece bir ekran kendi düğmesiyle her şeyi açabilir, bir aramanın bulduğu değere giden yolu açabilir ya da başka bir ekrana gidip dönünce açık olanı koruyabilir.

ParametreTürVarsayılanNe olduğu
jsonStringJSON metni, RFC 8259'un yazdığı gibi. Yalnızca değiştiğinde yeniden okunur.
expandedSet<String>Açık nesnelerin ve dizilerin yolları, jsonViewPaths'in yazdığı gibi: metnin kendi değeri için boş metin, user üyesi için /user, onun tags'inin ilki için /user/tags/0. Katlanan bir şeye götürmeyen yol hiçbir şeyi değiştirmez.
onExpandedChange(Set<String>) -> UnitBir satıra basıldığında, bundan sonra açık olması gereken yollarla çağrılır: expanded, o satırın yolu eklenmiş ya da çıkarılmış olarak. Görünüm kendiliğinden hiçbir şeyi değiştirmez.
modifierModifierModifierGörünümün modifier'ı. Burada verilen yükseklik, belgenin içinde kaydığı yerdir.
searchString""Adlarda ve değerlerde aranan, büyük ya da küçük harfle.
softWrapBooleantrueGörünüme sığmayan satırın kendi altında sürüp sürmediği.
lineNumbersBooleanfalseHer satırın, açık belgedeki numarasını taşıyıp taşımadığı.
selectableBooleantrueSatırların yazdığının seçilip sistemin kendi yoluyla kopyalanıp kopyalanamadığı.
copyableBooleantrueGörünümde belgeyi kopyalayan düğmenin olup olmadığı.
onCopy((copied: Boolean) -> Unit)?nullO düğmeye basıldıktan sonra, belgenin panoya ulaşıp ulaşmadığıyla çağrılır.
styleJsonViewStyle?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.
colorsJsonViewColors?nullBu görünümün, temadan gelmeyen kendi renkleri: burada verilenler kullanılır, gerisi temanınki kalır.
tagKeyString?nullGörünümün otomasyon anahtarı, öteki overload'daki gibi.

JsonViewStyle

PantrixJsonView'in geometrisi: satırlarının çevresindeki boşluk, bir düzeyin ne kadar içeride durduğu ve kenar.

ParametreTürVarsayılanNe olduğu
shapeShapeSpecShapeSpec.UnspecifiedGörünümün köşeleri: markanın şekil ölçeğinden bir basamak ya da sabit bir şekil.
horizontalPaddingDpDp.UnspecifiedGörünümün yan kenarları ile satırları arasındaki boşluk. İmlecin altındaki iz ve basış bu boşluğun da üstüne, yan kenarlara kadar çizilir.
verticalPaddingDpDp.Unspecifiedİlk satırın üstündeki ve son satırın altındaki boşluk.
linePaddingDpDp.UnspecifiedHer satırın yazısının üstündeki ve altındaki boşluk.
indentDpDp.UnspecifiedHer düzeyin, kendisini tutandan ne kadar içeride durduğu. Satırların kendi altında sürdüğü yerde bir satır, ne kadar derinde olursa olsun, kendisine kalan yerin yarısından fazla içeri girmez.
chevronSizeDpDp.UnspecifiedKatlanan bir satırın başındaki okun genişliği ve yüksekliği.
chevronGapDpDp.UnspecifiedO ok ile satırın yazısı arasındaki aralık. Her satır okun yerini boş bırakır: böylece bir düzeyin adları alt alta başlar.
borderWidthDpDp.UnspecifiedGörünümün çevresindeki kenarın kalınlığı. Sıfır verilirse kenar çizilmez.
guideWidthDpDp.UnspecifiedAçık bir nesneden ya da diziden, okunun altından, içindekilerin sonuna kadar inen çizgilerin kalınlığı: girintinin dar olduğu yerde bir düzeyi ötekinden ayıran bunlardır. Sıfır verilirse çizgi çizilmez.

JsonViewColors

Temanın renklerini almayan bir görünüm için PantrixJsonView'in renkleri: verilen renk kullanılır, verilmeyen temanınki kalır.

ParametreTürVarsayılanNe olduğu
containerColorColor.UnspecifiedSatırların arkasındaki dolgu: temanın surface'ı. Color.Transparent verilirse görünümün arkasındaki görünür.
keyColorColor.UnspecifiedBir üyenin adı. Katlanan bir satırda imlecin altındaki iz ve basış da bu renkle çizilir. Temanın textPrimary'si.
stringColorColor.UnspecifiedBir metin değeri. Temanın success rolü.
numberColorColor.UnspecifiedBir sayı. Temanın warning rolü.
literalColorColor.Unspecifiedtrue, false ve null. Temanın primary rolü.
punctuationColorColor.UnspecifiedParantezler, iki noktalar ve virgüller, katlanmış olanın üç noktası ile içinde kaç şey olduğu, katlanan bir satırın başındaki ok ve JSON olmayan bir metin. Temanın textSecondary'si.
borderColorColor.UnspecifiedGörünümün çevresindeki kenar. Temanın kendi zeminlerinde temanın divider'ıdır; o çizginin okunmayacağı bir dolgunun üstünde ise orada yazılan rengin bir payıdır.
guideColorColor.UnspecifiedAçık bir nesneden ya da diziden inen çizgiler. Temanın kendi zeminlerinde temanın divider'ıdır; bir dolgunun üstünde ise orada yazılan rengin bir payıdır. border da, kendisine bir şey verilmediğinde budur; ama ikisi ayrıdır: border'a verilen renk kılavuz çizgilerini değiştirmez.
matchColorColor.UnspecifiedBir aramanın bulduğu harflerin arkasına konan dolgu. Temanın warning rolünün yumuşatılmış hâlidir ve üstündeki harfler temanın onunla eşlediği renkle yazılır; bir dolgunun üstünde ise orada yazılan rengin bir payıdır ve harfler kendi renklerini korur. Burada verilen renk temanın rol renklerinden biriyse eşini de getirir.

Erişilebilirlik