Refactor typography.

This commit is contained in:
Thomas Andres Gomez 2023-11-03 21:35:39 +01:00
parent 82ce19ec4d
commit ff1ac694bb
18 changed files with 148 additions and 196 deletions

View file

@ -14,13 +14,13 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
@ -38,22 +38,14 @@ fun GenericHeader(
) { ) {
Text( Text(
modifier = Modifier.padding(paddingValues = padding), modifier = Modifier.padding(paddingValues = padding),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
maxLines = 1, maxLines = 1,
text = stringResource(id = label).let { text = annotateWithDropCap(
AnnotatedString( text = stringResource(id = label),
text = it, style = MaterialTheme.lexicon.typography.titleMediumDropCap,
spanStyles = listOf( ),
AnnotatedString.Range(
item = MaterialTheme.lexicon.typography.bodyDropCapSpan,
start = 0,
end = Integer.min(1, it.length),
)
)
)
},
) )
} }
Divider( Divider(

View file

@ -18,7 +18,7 @@ import androidx.compose.runtime.Stable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
@ -27,6 +27,7 @@ import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.screens.character.composable.common.CounterButton import com.pixelized.rplexicon.ui.screens.character.composable.common.CounterButton
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
@Stable @Stable
@ -64,26 +65,19 @@ fun SpellHeader(
.weight(1f) .weight(1f)
.alignByBaseline(), .alignByBaseline(),
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Bold,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
maxLines = 1, maxLines = 1,
text = stringResource( text = annotateWithDropCap(
id = when (header.level) { text = stringResource(
0 -> R.string.character_sheet_action_spell_level_0 id = when (header.level) {
else -> R.string.character_sheet_action_spell_level_X 0 -> R.string.character_sheet_action_spell_level_0
}, else -> R.string.character_sheet_action_spell_level_X
header.level },
).let { label -> header.level
AnnotatedString( ),
text = label, style = MaterialTheme.lexicon.typography.titleMediumDropCap,
spanStyles = listOf( ),
AnnotatedString.Range(
item = MaterialTheme.lexicon.typography.bodyDropCapSpan,
start = 0,
end = Integer.min(1, label.length),
)
)
)
},
) )
header.count?.let { count -> header.count?.let { count ->
CounterButton( CounterButton(

View file

@ -226,7 +226,7 @@ fun ActionsPageContent(
} }
} }
spells.value.forEach { entry -> spells.value.forEachIndexed { index, entry ->
stickyHeader { stickyHeader {
SpellHeader( SpellHeader(
header = entry.first, header = entry.first,
@ -242,6 +242,11 @@ fun ActionsPageContent(
onCast = onCast, onCast = onCast,
) )
} }
if (index != spells.value.lastIndex) {
items(count = 1) {
Spacer(modifier = Modifier.height(height = 16.dp))
}
}
} }
} }
} }

View file

@ -83,7 +83,7 @@ fun SkillDetail(
text = detail.name, text = detail.name,
spanStyles = listOf( spanStyles = listOf(
AnnotatedString.Range( AnnotatedString.Range(
item = MaterialTheme.lexicon.typography.bodyDropCapSpan, item = MaterialTheme.lexicon.typography.titleMediumDropCap,
start = 0, start = 0,
end = Integer.min(1, detail.name.length), end = Integer.min(1, detail.name.length),
) )

View file

@ -26,7 +26,6 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@ -34,6 +33,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.ddBorder import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
@ -77,17 +77,12 @@ fun AlterationDetail(
Text( Text(
modifier = Modifier.alignByBaseline(), modifier = Modifier.alignByBaseline(),
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
maxLines = 1, fontWeight = FontWeight.Bold,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
text = AnnotatedString( maxLines = 1,
text = annotateWithDropCap(
text = detail.name, text = detail.name,
spanStyles = listOf( style = MaterialTheme.lexicon.typography.titleMediumDropCap,
AnnotatedString.Range(
item = MaterialTheme.lexicon.typography.bodyDropCapSpan,
start = 0,
end = Integer.min(1, detail.name.length),
)
)
), ),
) )
detail.original?.let { detail.original?.let {

View file

@ -29,7 +29,6 @@ import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
@ -37,6 +36,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
@Stable @Stable
@ -115,15 +115,9 @@ private fun LandingHorizontalItem(
modifier = Modifier.alignByBaseline(), modifier = Modifier.alignByBaseline(),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
text = AnnotatedString( text = annotateWithDropCap(
text = it, text = it,
spanStyles = listOf( style = MaterialTheme.lexicon.typography.titleLargeDropCap,
AnnotatedString.Range(
item = MaterialTheme.lexicon.typography.bodyDropCapSpan,
start = 0,
end = Integer.min(1, it.length),
)
),
) )
) )
} }

View file

@ -23,6 +23,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
@Composable @Composable
@ -45,15 +46,9 @@ private fun LandingContent(
Text( Text(
modifier = Modifier.padding(horizontal = padding), modifier = Modifier.padding(horizontal = padding),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
text = AnnotatedString( text = annotateWithDropCap(
text = "Feuilles de personnages", text = "Feuilles de personnages",
spanStyles = listOf( style = MaterialTheme.lexicon.typography.titleLargeDropCap,
AnnotatedString.Range(
item = MaterialTheme.lexicon.typography.titleDropCapSpan,
start = 0,
end = Integer.min(1, "Character".length),
)
),
), ),
) )
} }
@ -72,15 +67,9 @@ private fun LandingContent(
Text( Text(
modifier = Modifier.padding(horizontal = padding), modifier = Modifier.padding(horizontal = padding),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
text = AnnotatedString( text = annotateWithDropCap(
text = "Lexique", text = "Lexique",
spanStyles = listOf( MaterialTheme.lexicon.typography.titleLargeDropCap,
AnnotatedString.Range(
item = MaterialTheme.lexicon.typography.titleDropCapSpan,
start = 0,
end = Integer.min(1, "Lexique".length),
)
),
), ),
) )
} }

View file

@ -83,6 +83,7 @@ fun LexiconItem(
modifier = Modifier modifier = Modifier
.alignByBaseline() .alignByBaseline()
.placeholder { item.placeholder }, .placeholder { item.placeholder },
style = typography.base.titleMedium,
text = if (item.isPlayingCharacter) LOS_FULL else LOS_HOLLOW, text = if (item.isPlayingCharacter) LOS_FULL else LOS_HOLLOW,
) )
@ -94,7 +95,7 @@ fun LexiconItem(
modifier = Modifier modifier = Modifier
.alignByBaseline() .alignByBaseline()
.placeholder { item.placeholder }, .placeholder { item.placeholder },
style = typography.base.bodyLarge, style = typography.base.titleMedium,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
@ -104,7 +105,7 @@ fun LexiconItem(
true -> emptyList() true -> emptyList()
else -> listOf( else -> listOf(
AnnotatedString.Range( AnnotatedString.Range(
item = typography.bodyDropCapSpan, item = typography.titleMediumDropCap,
start = 0, start = 0,
end = 1, end = 1,
) )

View file

@ -13,6 +13,7 @@ import androidx.compose.runtime.Stable
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
@ -39,10 +40,10 @@ fun FantasyMap(
state: FantasyMapState, state: FantasyMapState,
model: Any?, model: Any?,
contentScale: ContentScale = ContentScale.Fit, contentScale: ContentScale = ContentScale.Fit,
items: State<List<AnnotatedMarqueeUio>>, items: State<List<MarqueeUio>>,
highlight: State<Offset>, highlight: State<Offset>,
selectedItem: State<Int>, selectedItem: State<Int>,
onMarquee: (AnnotatedMarqueeUio) -> Unit, onMarquee: (MarqueeUio) -> Unit,
onTap: (Offset) -> Unit, onTap: (Offset) -> Unit,
) { ) {
val lexiconTheme = MaterialTheme.lexicon val lexiconTheme = MaterialTheme.lexicon
@ -197,7 +198,7 @@ class FantasyMapState(
private val maxY by derivedStateOf { imageSize.height * scale / 2f } private val maxY by derivedStateOf { imageSize.height * scale / 2f }
private val minY by derivedStateOf { -maxY } private val minY by derivedStateOf { -maxY }
private val _scale: MutableState<Float> = mutableStateOf(initialScale) private val _scale: MutableState<Float> = mutableFloatStateOf(initialScale)
val scale: Float by _scale val scale: Float by _scale
private val _offset: MutableState<Offset> = mutableStateOf(initialOffset) private val _offset: MutableState<Offset> = mutableStateOf(initialOffset)

View file

@ -3,7 +3,6 @@ package com.pixelized.rplexicon.ui.screens.location.detail
import android.content.res.Configuration import android.content.res.Configuration
import android.net.Uri import android.net.Uri
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.ScrollState import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.gestures.scrollBy import androidx.compose.foundation.gestures.scrollBy
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@ -48,9 +47,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow import androidx.compose.ui.draw.shadow
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
@ -61,7 +58,6 @@ import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntOffset
@ -73,6 +69,7 @@ import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.Handle import com.pixelized.rplexicon.ui.composable.Handle
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@ -86,13 +83,6 @@ data class LocationDetailUio(
val marquees: List<MarqueeUio>, val marquees: List<MarqueeUio>,
) )
@Stable
data class AnnotatedLocationDetailUio(
val name: AnnotatedString,
val map: Uri,
val marquees: List<AnnotatedMarqueeUio>,
)
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
fun LocationDetail( fun LocationDetail(
@ -114,7 +104,6 @@ fun LocationDetail(
val ok = stringResource(id = android.R.string.ok) val ok = stringResource(id = android.R.string.ok)
val location = rememberAnnotation(item = viewModel.location)
val snackJob = remember { mutableStateOf<Job?>(null) } val snackJob = remember { mutableStateOf<Job?>(null) }
val mapHighlight = remember { mutableStateOf(Offset.Unspecified) } val mapHighlight = remember { mutableStateOf(Offset.Unspecified) }
val selectedIndex = remember { mutableIntStateOf(0) } val selectedIndex = remember { mutableIntStateOf(0) }
@ -128,7 +117,7 @@ fun LocationDetail(
scrollState = scroll, scrollState = scroll,
pagerState = pager, pagerState = pager,
fantasyMapState = fantasy, fantasyMapState = fantasy,
item = location, item = viewModel.location,
selectedIndex = selectedIndex, selectedIndex = selectedIndex,
mapHighlight = mapHighlight, mapHighlight = mapHighlight,
onBack = { onBack = {
@ -136,7 +125,7 @@ fun LocationDetail(
}, },
onMarquee = { onMarquee = {
scope.launch { scope.launch {
val index = max(location.value.marquees.indexOf(it), 0) val index = max(viewModel.location.value.marquees.indexOf(it), 0)
selectedIndex.value = index selectedIndex.value = index
pager.animateScrollToPage(page = index) pager.animateScrollToPage(page = index)
} }
@ -225,11 +214,11 @@ private fun LocationContent(
scrollState: ScrollState, scrollState: ScrollState,
pagerState: PagerState, pagerState: PagerState,
fantasyMapState: FantasyMapState, fantasyMapState: FantasyMapState,
item: State<AnnotatedLocationDetailUio>, item: State<LocationDetailUio>,
selectedIndex: State<Int>, selectedIndex: State<Int>,
mapHighlight: State<Offset>, mapHighlight: State<Offset>,
onBack: () -> Unit, onBack: () -> Unit,
onMarquee: (AnnotatedMarqueeUio) -> Unit, onMarquee: (MarqueeUio) -> Unit,
onMapTap: (Offset) -> Unit, onMapTap: (Offset) -> Unit,
onTouch: (Boolean) -> Unit, onTouch: (Boolean) -> Unit,
onCenter: () -> Unit, onCenter: () -> Unit,
@ -366,7 +355,10 @@ private fun LocationContent(
Text( Text(
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = MaterialTheme.typography.headlineSmall, style = MaterialTheme.typography.headlineSmall,
text = item.value.name, text = annotateWithDropCap(
text = item.value.name,
style = MaterialTheme.lexicon.typography.headlineSmallDropCap,
),
) )
} }
@ -411,31 +403,6 @@ private fun HandlePagerScroll(
} }
} }
@Composable
@Stable
fun rememberAnnotation(item: State<LocationDetailUio>): State<AnnotatedLocationDetailUio> {
val typography = MaterialTheme.lexicon.typography
return remember(item) {
derivedStateOf {
AnnotatedLocationDetailUio(
name = AnnotatedString(
text = item.value.name,
spanStyles = listOf(
AnnotatedString.Range(
item = typography.titleDropCapSpan,
start = 0,
end = Integer.min(1, item.value.name.length),
)
)
),
map = item.value.map,
marquees = item.value.marquees.map { it.annotate(typography) },
)
}
}
}
@Composable @Composable
@Stable @Stable
private fun rememberSnapConnection( private fun rememberSnapConnection(
@ -505,7 +472,7 @@ private fun LocationPreview() {
scrollState = rememberScrollState(), scrollState = rememberScrollState(),
pagerState = rememberPagerState(pageCount = { 2 }), pagerState = rememberPagerState(pageCount = { 2 }),
fantasyMapState = rememberFantasyMapState(), fantasyMapState = rememberFantasyMapState(),
item = rememberAnnotation(item = remember { item = remember {
mutableStateOf( mutableStateOf(
LocationDetailUio( LocationDetailUio(
name = "Daggerfall", name = "Daggerfall",
@ -524,7 +491,7 @@ private fun LocationPreview() {
), ),
) )
) )
}), },
selectedIndex = remember { mutableStateOf(0) }, selectedIndex = remember { mutableStateOf(0) },
mapHighlight = remember { mutableStateOf(Offset(0.5f, 0.5f)) }, mapHighlight = remember { mutableStateOf(Offset(0.5f, 0.5f)) },
onBack = { }, onBack = { },

View file

@ -3,6 +3,7 @@ package com.pixelized.rplexicon.ui.screens.location.detail
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
@ -13,15 +14,14 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.ui.theme.typography.LexiconTypography
import com.pixelized.rplexicon.utilitary.LOS_HOLLOW import com.pixelized.rplexicon.utilitary.LOS_HOLLOW
import com.pixelized.rplexicon.utilitary.extentions.annotateWithDropCap import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
@Stable @Stable
@ -31,32 +31,10 @@ data class MarqueeUio(
val description: String?, val description: String?,
) )
@Stable
data class AnnotatedMarqueeUio(
val name: AnnotatedString?,
val position: Offset,
val description: AnnotatedString?,
)
@Stable
fun MarqueeUio.annotate(
typography: LexiconTypography
): AnnotatedMarqueeUio {
return AnnotatedMarqueeUio(
name = name?.annotateWithDropCap(
style = typography.bodyDropCapSpan,
),
position = position,
description = description?.annotateWithDropCap(
style = typography.bodyDropCapSpan,
),
)
}
@Composable @Composable
fun MarqueeItem( fun MarqueeItem(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
marquee: AnnotatedMarqueeUio, marquee: MarqueeUio,
) { ) {
Column( Column(
modifier = modifier, modifier = modifier,
@ -73,10 +51,14 @@ fun MarqueeItem(
Text( Text(
modifier = Modifier.alignByBaseline(), modifier = Modifier.alignByBaseline(),
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
maxLines = 3, maxLines = 3,
text = marquee.name, text = annotateWithDropCap(
text = it,
style = MaterialTheme.lexicon.typography.titleMediumDropCap,
),
) )
} }
} }
@ -84,7 +66,10 @@ fun MarqueeItem(
Text( Text(
modifier = Modifier.verticalScroll(rememberScrollState()), modifier = Modifier.verticalScroll(rememberScrollState()),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
text = it, text = annotateWithDropCap(
text = it,
style = MaterialTheme.lexicon.typography.bodyMediumDropCap,
),
) )
} }
} }
@ -96,14 +81,14 @@ private fun MarqueeItemPreview() {
LexiconTheme { LexiconTheme {
Surface { Surface {
MarqueeItem( MarqueeItem(
modifier = Modifier.padding(all = 16.dp), modifier = Modifier
.fillMaxWidth()
.padding(all = 16.dp),
marquee = MarqueeUio( marquee = MarqueeUio(
name = "Name", name = "Barovie",
position = Offset.Zero, position = Offset.Zero,
description = "description", description = "Village lugubre à la population clairsemé théatre récent d'une d'une rebelion sanglante.",
).annotate( ),
typography = MaterialTheme.lexicon.typography,
)
) )
} }
} }

View file

@ -13,6 +13,8 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
@ -63,6 +65,7 @@ fun LocationItem(
true -> Modifier.placeholder { true } true -> Modifier.placeholder { true }
else -> Modifier.alignByBaseline() else -> Modifier.alignByBaseline()
}, },
style = typography.base.titleMedium,
text = LOS_HOLLOW, text = LOS_HOLLOW,
) )
Text( Text(
@ -70,6 +73,10 @@ fun LocationItem(
true -> Modifier.placeholder { true } true -> Modifier.placeholder { true }
else -> Modifier.alignByBaseline() else -> Modifier.alignByBaseline()
}, },
style = typography.base.titleMedium,
fontWeight = FontWeight.Bold,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
text = remember(item.placeholder) { text = remember(item.placeholder) {
AnnotatedString( AnnotatedString(
text = item.title, text = item.title,
@ -77,7 +84,7 @@ fun LocationItem(
true -> emptyList() true -> emptyList()
else -> listOf( else -> listOf(
AnnotatedString.Range( AnnotatedString.Range(
item = typography.bodyDropCapSpan, item = typography.titleMediumDropCap,
start = 0, start = 0,
end = 1, end = 1,
) )

View file

@ -56,7 +56,7 @@ import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.LOS_FULL import com.pixelized.rplexicon.utilitary.LOS_FULL
import com.pixelized.rplexicon.utilitary.LOS_HOLLOW import com.pixelized.rplexicon.utilitary.LOS_HOLLOW
import com.pixelized.rplexicon.utilitary.extentions.annotateWithDropCap import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scrollOffset import com.pixelized.rplexicon.utilitary.extentions.scrollOffset
@ -183,7 +183,8 @@ private fun QuestDetailContent(
.padding(bottom = 16.dp), .padding(bottom = 16.dp),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = MaterialTheme.typography.headlineLarge, style = MaterialTheme.typography.headlineLarge,
text = quest.title.annotateWithDropCap( text = annotateWithDropCap(
text = quest.title,
style = MaterialTheme.lexicon.typography.headlineLargeDropCap, style = MaterialTheme.lexicon.typography.headlineLargeDropCap,
), ),
) )
@ -201,7 +202,8 @@ private fun QuestDetailContent(
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
maxLines = 3, maxLines = 3,
text = subtitle.annotateWithDropCap( text = annotateWithDropCap(
text = subtitle,
style = MaterialTheme.lexicon.typography.titleLargeDropCap, style = MaterialTheme.lexicon.typography.titleLargeDropCap,
), ),
) )
@ -292,7 +294,8 @@ private fun QuestDetailContent(
Text( Text(
modifier = Modifier.padding(horizontal = 16.dp), modifier = Modifier.padding(horizontal = 16.dp),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
text = quest.description.annotateWithDropCap( text = annotateWithDropCap(
text = quest.description,
style = MaterialTheme.lexicon.typography.bodyMediumDropCap, style = MaterialTheme.lexicon.typography.bodyMediumDropCap,
), ),
) )

View file

@ -13,6 +13,8 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
@ -67,6 +69,7 @@ fun QuestItem(
true -> Modifier.placeholder { true } true -> Modifier.placeholder { true }
else -> Modifier.alignByBaseline() else -> Modifier.alignByBaseline()
}, },
style = typography.base.titleMedium,
text = if (item.complete) LOS_FULL else LOS_HOLLOW, text = if (item.complete) LOS_FULL else LOS_HOLLOW,
) )
Text( Text(
@ -74,6 +77,10 @@ fun QuestItem(
true -> Modifier.placeholder { true } true -> Modifier.placeholder { true }
else -> Modifier.alignByBaseline() else -> Modifier.alignByBaseline()
}, },
style = typography.base.titleMedium,
fontWeight = FontWeight.Bold,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
text = remember(item.placeholder) { text = remember(item.placeholder) {
AnnotatedString( AnnotatedString(
text = item.title, text = item.title,
@ -81,7 +88,7 @@ fun QuestItem(
true -> emptyList() true -> emptyList()
else -> listOf( else -> listOf(
AnnotatedString.Range( AnnotatedString.Range(
item = typography.bodyDropCapSpan, item = typography.titleMediumDropCap,
start = 0, start = 0,
end = 1, end = 1,
) )

View file

@ -52,6 +52,8 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
@ -164,12 +166,15 @@ private fun RollOverlayContent(
Text( Text(
modifier = Modifier.padding(horizontal = 16.dp), modifier = Modifier.padding(horizontal = 16.dp),
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Normal,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
text = stringResource(id = R.string.dice_roll_alteration_action).let { text = stringResource(id = R.string.dice_roll_alteration_action).let {
AnnotatedString( AnnotatedString(
text = it, text = it,
spanStyles = listOf( spanStyles = listOf(
AnnotatedString.Range( AnnotatedString.Range(
item = MaterialTheme.lexicon.typography.bodyDropCapSpan, item = MaterialTheme.lexicon.typography.titleMediumDropCap,
start = 0, start = 0,
end = Integer.min(1, it.length), end = Integer.min(1, it.length),
) )

View file

@ -8,6 +8,7 @@ import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.BaselineShift import androidx.compose.ui.text.style.BaselineShift
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
@ -28,43 +29,42 @@ class LexiconTypography(
val stamp: TextStyle = base.headlineLarge.copy( val stamp: TextStyle = base.headlineLarge.copy(
fontFamily = stampFontFamily, fontFamily = stampFontFamily,
), ),
@Deprecated("")
val bodyDropCap: TextStyle = base.headlineLarge.copy(
fontFamily = zallFontFamily,
baselineShift = BaselineShift(-0.1f),
letterSpacing = (-3).sp
),
@Deprecated("")
val titleDropCap: TextStyle = base.displayMedium.copy(
fontFamily = zallFontFamily,
baselineShift = BaselineShift(-0.1f),
letterSpacing = (-4).sp
),
@Deprecated("")
val bodyDropCapSpan: SpanStyle = bodyDropCap.toSpanStyle(),
@Deprecated("")
val titleDropCapSpan: SpanStyle = titleDropCap.toSpanStyle(),
val bodyMediumDropCap: SpanStyle = base.bodyMedium.toDropCapSpan( val bodyMediumDropCap: SpanStyle = base.bodyMedium.toDropCapSpan(
sizeRatio = 1.8f, sizeRatio = 1.8f,
antiLetterSpacing = 1.sp,
baselineShift = BaselineShift(-0.08f),
),
val titleMediumDropCap: SpanStyle = base.titleMedium.toDropCapSpan(
sizeRatio = 1.8f,
antiLetterSpacing = 2.sp,
baselineShift = BaselineShift(-0.04f),
), ),
val titleLargeDropCap: SpanStyle = base.titleLarge.toDropCapSpan( val titleLargeDropCap: SpanStyle = base.titleLarge.toDropCapSpan(
sizeRatio = 1.4f, sizeRatio = 1.4f,
antiLetterSpacing = 2.sp,
baselineShift = BaselineShift(-0.04f),
),
val headlineSmallDropCap: SpanStyle = base.headlineSmall.toDropCapSpan(
antiLetterSpacing = 4.sp,
sizeRatio = 1.2f,
), ),
val headlineLargeDropCap: SpanStyle = base.headlineLarge.toDropCapSpan( val headlineLargeDropCap: SpanStyle = base.headlineLarge.toDropCapSpan(
antiLetterSpacing = 4.sp,
sizeRatio = 1.2f, sizeRatio = 1.2f,
), ),
) )
private fun TextStyle.toDropCapSpan( private fun TextStyle.toDropCapSpan(
sizeRatio : Float, sizeRatio: Float = 1.5f,
antiLetterSpacing: TextUnit? = null,
baselineShift: BaselineShift? = null,
): SpanStyle { ): SpanStyle {
return copy( return copy(
fontFamily = zallFontFamily, fontFamily = zallFontFamily,
fontSize = fontSize * sizeRatio, fontSize = fontSize * sizeRatio,
letterSpacing = antiLetterSpacing?.let { -it } ?: this.letterSpacing,
baselineShift = baselineShift ?: this.baselineShift
).toSpanStyle() ).toSpanStyle()
} }
fun lexiconTypography() = LexiconTypography() fun lexiconTypography(): LexiconTypography = LexiconTypography()

View file

@ -0,0 +1,22 @@
package com.pixelized.rplexicon.utilitary
import androidx.compose.runtime.Stable
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
import com.pixelized.rplexicon.utilitary.extentions.annotatedSpan
private val dropCapRegex = Regex(
pattern = "(?:^|\n\n)([A-Z])"
)
@Stable
fun annotateWithDropCap(
text: String,
style: SpanStyle,
) = AnnotatedString(
text = text,
spanStyles = dropCapRegex.annotatedSpan(
input = text,
spanStyle = style,
)
)

View file

@ -6,10 +6,6 @@ import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.SpanStyle
import androidx.core.net.toUri import androidx.core.net.toUri
private val dropCapRegex = Regex(
pattern = "(?:^|\n\n)([A-Z])"
)
val String.ARG: String get() = "$this={$this}" val String.ARG: String get() = "$this={$this}"
@Stable @Stable
@ -41,17 +37,6 @@ val List<String>.finderRegex: Regex?
) )
} else null } else null
@Stable
fun String.annotateWithDropCap(
style: SpanStyle,
) = AnnotatedString(
text = this,
spanStyles = dropCapRegex.annotatedSpan(
input = this,
spanStyle = style,
)
)
@Stable @Stable
fun String?.toUriOrNull(): Uri? = try { fun String?.toUriOrNull(): Uri? = try {
this?.takeIf { it.isNotBlank() }?.toUri() this?.takeIf { it.isNotBlank() }?.toUri()