Compare commits
2 commits
95672d3124
...
ad98b9f499
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad98b9f499 | ||
|
|
1c9491e3dc |
7 changed files with 125 additions and 146 deletions
|
|
@ -502,6 +502,7 @@ fun MessageRow(
|
||||||
.background(innerHighlight)
|
.background(innerHighlight)
|
||||||
.border(1.2.dp, borderBrush, shape),
|
.border(1.2.dp, borderBrush, shape),
|
||||||
) {
|
) {
|
||||||
|
androidx.compose.foundation.text.selection.SelectionContainer {
|
||||||
Column {
|
Column {
|
||||||
if (isVoiceOnly) {
|
if (isVoiceOnly) {
|
||||||
Row(
|
Row(
|
||||||
|
|
@ -529,6 +530,7 @@ fun MessageRow(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!message.streaming) {
|
if (!message.streaming) {
|
||||||
Row(
|
Row(
|
||||||
Modifier.padding(top = 6.dp, end = 4.dp),
|
Modifier.padding(top = 6.dp, end = 4.dp),
|
||||||
|
|
@ -567,6 +569,7 @@ fun MessageRow(
|
||||||
KaizenOrb(28.dp, streaming = message.streaming)
|
KaizenOrb(28.dp, streaming = message.streaming)
|
||||||
Spacer(Modifier.width(10.dp))
|
Spacer(Modifier.width(10.dp))
|
||||||
Box(Modifier.weight(1f).padding(top = 3.dp)) {
|
Box(Modifier.weight(1f).padding(top = 3.dp)) {
|
||||||
|
androidx.compose.foundation.text.selection.SelectionContainer {
|
||||||
Column {
|
Column {
|
||||||
if (message.reasoning.isNotBlank()) {
|
if (message.reasoning.isNotBlank()) {
|
||||||
ReasoningBlock(message.reasoning, streaming = message.streaming)
|
ReasoningBlock(message.reasoning, streaming = message.streaming)
|
||||||
|
|
@ -589,6 +592,7 @@ fun MessageRow(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!message.streaming && !message.thinking && message.content.isNotBlank()) {
|
if (!message.streaming && !message.thinking && message.content.isNotBlank()) {
|
||||||
Row(
|
Row(
|
||||||
Modifier.padding(start = 38.dp, top = 6.dp),
|
Modifier.padding(start = 38.dp, top = 6.dp),
|
||||||
|
|
|
||||||
|
|
@ -459,14 +459,14 @@ fun MarkdownText(text: String, streaming: Boolean = false, modifier: Modifier =
|
||||||
val isLast = idx == blocks.lastIndex
|
val isLast = idx == blocks.lastIndex
|
||||||
when (block) {
|
when (block) {
|
||||||
is MdBlock.Heading -> {
|
is MdBlock.Heading -> {
|
||||||
if (idx > 0) Spacer(Modifier.height(18.dp))
|
if (idx > 0) Spacer(Modifier.height(if (block.level == 1) 24.dp else 20.dp))
|
||||||
val rendered = inlineMarkdown(block.text + if (isLast) cursor else "", cs.onBackground, inlineCodeColor, inlineCodeBg, linkColor)
|
val rendered = inlineMarkdown(block.text + if (isLast) cursor else "", cs.onBackground, inlineCodeColor, inlineCodeBg, linkColor)
|
||||||
ClickableMarkdownText(rendered, context, cs.onBackground,
|
ClickableMarkdownText(rendered, context, cs.onBackground,
|
||||||
fontSize = when (block.level) { 1 -> 26.sp; 2 -> 22.sp; else -> 18.sp },
|
fontSize = when (block.level) { 1 -> 26.sp; 2 -> 22.sp; else -> 18.sp },
|
||||||
fontWeight = when (block.level) { 1 -> FontWeight.W600; 2 -> FontWeight.W600; else -> FontWeight.W500 },
|
fontWeight = when (block.level) { 1 -> FontWeight.W600; 2 -> FontWeight.W600; else -> FontWeight.W500 },
|
||||||
lineHeight = when (block.level) { 1 -> 34.sp; 2 -> 30.sp; else -> 26.sp },
|
lineHeight = when (block.level) { 1 -> 34.sp; 2 -> 30.sp; else -> 26.sp },
|
||||||
)
|
)
|
||||||
Spacer(Modifier.height(8.dp))
|
Spacer(Modifier.height(10.dp))
|
||||||
}
|
}
|
||||||
|
|
||||||
is MdBlock.CodeFence -> {
|
is MdBlock.CodeFence -> {
|
||||||
|
|
@ -573,21 +573,22 @@ fun MarkdownText(text: String, streaming: Boolean = false, modifier: Modifier =
|
||||||
}
|
}
|
||||||
|
|
||||||
is MdBlock.ListBlock -> {
|
is MdBlock.ListBlock -> {
|
||||||
if (idx > 0) Spacer(Modifier.height(8.dp))
|
if (idx > 0) Spacer(Modifier.height(10.dp))
|
||||||
block.items.forEachIndexed { itemIdx, item ->
|
block.items.forEachIndexed { itemIdx, item ->
|
||||||
Row(Modifier.fillMaxWidth().padding(start = 6.dp, bottom = 6.dp)) {
|
Row(Modifier.fillMaxWidth().padding(start = 4.dp, bottom = 8.dp)) {
|
||||||
if (item.checked != null) {
|
if (item.checked != null) {
|
||||||
val checkColor = if (item.checked) linkColor else cs.onSurfaceVariant.copy(alpha = 0.4f)
|
val checkColor = if (item.checked) linkColor else cs.onSurfaceVariant.copy(alpha = 0.4f)
|
||||||
val checkIcon = if (item.checked) KaizenIcons.Check else KaizenIcons.Square
|
val checkIcon = if (item.checked) KaizenIcons.Check else KaizenIcons.Square
|
||||||
Icon(checkIcon, null, tint = checkColor, modifier = Modifier.size(18.dp).padding(top = 3.dp))
|
Icon(checkIcon, null, tint = checkColor, modifier = Modifier.size(18.dp).padding(top = 4.dp))
|
||||||
Spacer(Modifier.width(6.dp))
|
Spacer(Modifier.width(8.dp))
|
||||||
} else {
|
} else {
|
||||||
val bullet = if (item.ordered) "${item.index}." else "•"
|
val bullet = if (item.ordered) "${item.index}." else "•"
|
||||||
Text(
|
Text(
|
||||||
bullet,
|
bullet,
|
||||||
color = cs.onSurfaceVariant,
|
color = cs.onSurfaceVariant.copy(alpha = 0.7f),
|
||||||
fontSize = 16.sp,
|
fontSize = 16.sp,
|
||||||
modifier = Modifier.width(if (item.ordered) 24.dp else 16.dp),
|
fontWeight = FontWeight.W300,
|
||||||
|
modifier = Modifier.width(if (item.ordered) 24.dp else 18.dp).padding(top = 1.dp),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
val appendCursor = isLast && itemIdx == block.items.lastIndex
|
val appendCursor = isLast && itemIdx == block.items.lastIndex
|
||||||
|
|
@ -598,7 +599,7 @@ fun MarkdownText(text: String, streaming: Boolean = false, modifier: Modifier =
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Spacer(Modifier.height(8.dp))
|
Spacer(Modifier.height(10.dp))
|
||||||
}
|
}
|
||||||
|
|
||||||
is MdBlock.HorizontalRule -> {
|
is MdBlock.HorizontalRule -> {
|
||||||
|
|
@ -613,21 +614,21 @@ fun MarkdownText(text: String, streaming: Boolean = false, modifier: Modifier =
|
||||||
}
|
}
|
||||||
|
|
||||||
is MdBlock.Blockquote -> {
|
is MdBlock.Blockquote -> {
|
||||||
if (idx > 0) Spacer(Modifier.height(12.dp))
|
if (idx > 0) Spacer(Modifier.height(14.dp))
|
||||||
Row(
|
Row(
|
||||||
Modifier
|
Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.height(IntrinsicSize.Min)
|
.height(IntrinsicSize.Min)
|
||||||
.padding(start = 2.dp)
|
.padding(start = 4.dp)
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
Modifier
|
Modifier
|
||||||
.width(3.dp)
|
.width(3.dp)
|
||||||
.fillMaxHeight()
|
.fillMaxHeight()
|
||||||
.clip(RoundedCornerShape(1.5.dp))
|
.clip(RoundedCornerShape(1.5.dp))
|
||||||
.background(cs.primary.copy(alpha = 0.5f))
|
.background(cs.primary.copy(alpha = 0.45f))
|
||||||
)
|
)
|
||||||
Spacer(Modifier.width(10.dp))
|
Spacer(Modifier.width(12.dp))
|
||||||
val rendered = inlineMarkdown(block.text + if (isLast) cursor else "", cs.onSurfaceVariant, inlineCodeColor, inlineCodeBg, linkColor)
|
val rendered = inlineMarkdown(block.text + if (isLast) cursor else "", cs.onSurfaceVariant, inlineCodeColor, inlineCodeBg, linkColor)
|
||||||
ClickableMarkdownText(rendered, context, cs.onSurfaceVariant,
|
ClickableMarkdownText(rendered, context, cs.onSurfaceVariant,
|
||||||
fontSize = 15.sp, lineHeight = 24.sp,
|
fontSize = 15.sp, lineHeight = 24.sp,
|
||||||
|
|
|
||||||
|
|
@ -286,58 +286,68 @@ fun KaizenSidebar(
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.clip(KaizenShapes.md)
|
.clip(KaizenShapes.lg)
|
||||||
.kaizenShadow(stack = KaizenShadows.level1, cornerRadius = 12.dp)
|
.kaizenShadow(stack = KaizenShadows.level1, cornerRadius = 20.dp)
|
||||||
.background(if (isDark) Color(0x14FFFFFF) else Color(0x0A000000))
|
.background(if (isDark) Color(0x14FFFFFF) else Color(0x0A000000))
|
||||||
.border(0.8.dp, cardBorder, KaizenShapes.md)
|
.border(0.8.dp, cardBorder, KaizenShapes.lg)
|
||||||
.innerTopHighlight()
|
.innerTopHighlight()
|
||||||
.clickable { onOpenSettings() }
|
.clickable { onOpenSettings() }
|
||||||
.padding(horizontal = 12.dp, vertical = 10.dp),
|
.padding(horizontal = 14.dp, vertical = 12.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.size(30.dp)
|
.size(38.dp)
|
||||||
.clip(KaizenShapes.circle)
|
.clip(KaizenShapes.circle)
|
||||||
.background(
|
.background(
|
||||||
Brush.verticalGradient(
|
Brush.radialGradient(
|
||||||
listOf(accent.primary.copy(alpha = 0.8f), accent.primary.copy(alpha = 0.6f))
|
listOf(accent.primary.copy(alpha = 0.9f), accent.primaryDeep.copy(alpha = 0.75f))
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
contentAlignment = Alignment.Center
|
contentAlignment = Alignment.Center
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
userName.firstOrNull()?.toString()?.uppercase() ?: "A",
|
userName.firstOrNull()?.toString()?.uppercase() ?: "A",
|
||||||
color = Color.White, fontSize = 13.sp, fontWeight = FontWeight.Bold
|
color = Color.White, fontSize = 15.sp, fontWeight = FontWeight.W600
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Spacer(Modifier.width(10.dp))
|
Spacer(Modifier.width(12.dp))
|
||||||
Text(
|
Text(
|
||||||
userName,
|
userName,
|
||||||
color = cs.onBackground,
|
color = cs.onBackground,
|
||||||
fontSize = 14.sp,
|
fontSize = 15.sp,
|
||||||
fontWeight = FontWeight.Medium,
|
fontWeight = FontWeight.W400,
|
||||||
modifier = Modifier.weight(1f),
|
modifier = Modifier.weight(1f),
|
||||||
)
|
)
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.size(32.dp)
|
||||||
|
.clip(KaizenShapes.circle)
|
||||||
|
.background(if (isDark) Color.White.copy(alpha = 0.06f) else Color.Black.copy(alpha = 0.04f))
|
||||||
|
.clickable { onOpenSettings() },
|
||||||
|
contentAlignment = Alignment.Center,
|
||||||
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
KaizenIcons.Settings,
|
KaizenIcons.Settings,
|
||||||
stringResource(R.string.sidebar_settings),
|
stringResource(R.string.sidebar_settings),
|
||||||
tint = cs.onSurfaceVariant.copy(alpha = 0.45f),
|
tint = cs.onSurfaceVariant.copy(alpha = 0.55f),
|
||||||
modifier = Modifier.size(17.dp),
|
modifier = Modifier.size(16.dp),
|
||||||
)
|
)
|
||||||
|
}
|
||||||
Spacer(Modifier.width(6.dp))
|
Spacer(Modifier.width(6.dp))
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.size(28.dp)
|
.size(32.dp)
|
||||||
.clip(KaizenShapes.circle)
|
.clip(KaizenShapes.circle)
|
||||||
|
.background(if (isDark) Color.White.copy(alpha = 0.06f) else Color.Black.copy(alpha = 0.04f))
|
||||||
.clickable { onLogout() },
|
.clickable { onLogout() },
|
||||||
contentAlignment = Alignment.Center,
|
contentAlignment = Alignment.Center,
|
||||||
) {
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
KaizenIcons.LogOut,
|
KaizenIcons.LogOut,
|
||||||
stringResource(R.string.sidebar_logout),
|
stringResource(R.string.sidebar_logout),
|
||||||
tint = cs.onSurfaceVariant.copy(alpha = 0.45f),
|
tint = cs.onSurfaceVariant.copy(alpha = 0.55f),
|
||||||
modifier = Modifier.size(15.dp),
|
modifier = Modifier.size(16.dp),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
android:viewportWidth="108"
|
android:viewportWidth="108"
|
||||||
android:viewportHeight="108">
|
android:viewportHeight="108">
|
||||||
<!-- Dark mode: deep obsidian with subtle warm center glow -->
|
<!-- Dark mode: app obsidian background -->
|
||||||
<path android:pathData="M0,0h108v108h-108z">
|
<path android:pathData="M0,0h108v108h-108z">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
|
|
@ -13,8 +13,8 @@
|
||||||
android:centerX="54"
|
android:centerX="54"
|
||||||
android:centerY="50"
|
android:centerY="50"
|
||||||
android:gradientRadius="72">
|
android:gradientRadius="72">
|
||||||
<item android:color="#FF141C28" android:offset="0.0" />
|
<item android:color="#FF0F1520" android:offset="0.0" />
|
||||||
<item android:color="#FF0E1420" android:offset="0.5" />
|
<item android:color="#FF0C1018" android:offset="0.6" />
|
||||||
<item android:color="#FF080C14" android:offset="1.0" />
|
<item android:color="#FF080C14" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
android:viewportWidth="108"
|
android:viewportWidth="108"
|
||||||
android:viewportHeight="108">
|
android:viewportHeight="108">
|
||||||
<!-- Light mode: warm cream with subtle vignette -->
|
<!-- Light mode: neutral off-white matching app background -->
|
||||||
<path android:pathData="M0,0h108v108h-108z">
|
<path android:pathData="M0,0h108v108h-108z">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
|
|
@ -13,9 +13,9 @@
|
||||||
android:centerX="54"
|
android:centerX="54"
|
||||||
android:centerY="50"
|
android:centerY="50"
|
||||||
android:gradientRadius="72">
|
android:gradientRadius="72">
|
||||||
<item android:color="#FFF9F3EB" android:offset="0.0" />
|
<item android:color="#FFF6F7F9" android:offset="0.0" />
|
||||||
<item android:color="#FFF4ECE0" android:offset="0.5" />
|
<item android:color="#FFF1F2F5" android:offset="0.6" />
|
||||||
<item android:color="#FFEAE0D0" android:offset="1.0" />
|
<item android:color="#FFEAECF0" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
|
||||||
|
|
@ -6,23 +6,22 @@
|
||||||
android:viewportWidth="108"
|
android:viewportWidth="108"
|
||||||
android:viewportHeight="108">
|
android:viewportHeight="108">
|
||||||
|
|
||||||
<!-- L0: Soft outer halo — large, diffuse amber glow -->
|
<!-- L0: Soft outer halo — subtle, not overwhelming -->
|
||||||
<path android:pathData="M54,54m-34,0a34,34 0,1 1,68 0a34,34 0,1 1,-68 0">
|
<path android:pathData="M54,54m-32,0a32,32 0,1 1,64 0a32,32 0,1 1,-64 0">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:type="radial"
|
android:type="radial"
|
||||||
android:centerX="52"
|
android:centerX="52"
|
||||||
android:centerY="50"
|
android:centerY="50"
|
||||||
android:gradientRadius="34">
|
android:gradientRadius="32">
|
||||||
<item android:color="#40D4942A" android:offset="0.0" />
|
<item android:color="#28D4942A" android:offset="0.0" />
|
||||||
<item android:color="#20D4942A" android:offset="0.4" />
|
<item android:color="#10D4942A" android:offset="0.5" />
|
||||||
<item android:color="#08D4942A" android:offset="0.7" />
|
|
||||||
<item android:color="#00000000" android:offset="1.0" />
|
<item android:color="#00000000" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- L1: Orb body — warm amber core, light source offset top-left -->
|
<!-- L1: Orb body — glass-tinted, not opaque paint -->
|
||||||
<path android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0">
|
<path android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
|
|
@ -30,48 +29,46 @@
|
||||||
android:centerX="48"
|
android:centerX="48"
|
||||||
android:centerY="46"
|
android:centerY="46"
|
||||||
android:gradientRadius="26">
|
android:gradientRadius="26">
|
||||||
<item android:color="#FFFCE8C0" android:offset="0.0" />
|
<item android:color="#50E0A840" android:offset="0.0" />
|
||||||
<item android:color="#FFEAB86A" android:offset="0.28" />
|
<item android:color="#40D49430" android:offset="0.45" />
|
||||||
<item android:color="#FFD49430" android:offset="0.52" />
|
<item android:color="#55BE7A20" android:offset="0.75" />
|
||||||
<item android:color="#FFBE7A20" android:offset="0.72" />
|
<item android:color="#60A06018" android:offset="1.0" />
|
||||||
<item android:color="#FF9A5A12" android:offset="0.88" />
|
|
||||||
<item android:color="#FF7A4410" android:offset="1.0" />
|
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- L2: Glass overlay — cool-tinted top half for lens refraction feel -->
|
<!-- L2: Top-left light source — white glow for glass refraction -->
|
||||||
<path android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0">
|
<path android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:type="radial"
|
android:type="radial"
|
||||||
android:centerX="50"
|
android:centerX="46"
|
||||||
android:centerY="40"
|
android:centerY="42"
|
||||||
android:gradientRadius="24">
|
android:gradientRadius="22">
|
||||||
<item android:color="#18FFFFFF" android:offset="0.0" />
|
<item android:color="#50FFFFFF" android:offset="0.0" />
|
||||||
<item android:color="#0CFFFFFF" android:offset="0.35" />
|
<item android:color="#20FFFFFF" android:offset="0.3" />
|
||||||
<item android:color="#00FFFFFF" android:offset="0.65" />
|
<item android:color="#08FFFFFF" android:offset="0.55" />
|
||||||
|
<item android:color="#00FFFFFF" android:offset="1.0" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
|
||||||
|
<!-- L3: Bottom-right warm accent -->
|
||||||
|
<path android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:type="radial"
|
||||||
|
android:centerX="63"
|
||||||
|
android:centerY="64"
|
||||||
|
android:gradientRadius="14">
|
||||||
|
<item android:color="#35E0A040" android:offset="0.0" />
|
||||||
|
<item android:color="#15E0A040" android:offset="0.5" />
|
||||||
<item android:color="#00000000" android:offset="1.0" />
|
<item android:color="#00000000" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- L3: Bottom-right accent warmth (bounce light from environment) -->
|
<!-- L4: Bottom shadow — subtle volume -->
|
||||||
<path android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0">
|
|
||||||
<aapt:attr name="android:fillColor">
|
|
||||||
<gradient
|
|
||||||
android:type="radial"
|
|
||||||
android:centerX="64"
|
|
||||||
android:centerY="66"
|
|
||||||
android:gradientRadius="14">
|
|
||||||
<item android:color="#50FFBE50" android:offset="0.0" />
|
|
||||||
<item android:color="#20FFBE50" android:offset="0.4" />
|
|
||||||
<item android:color="#00FFBE50" android:offset="1.0" />
|
|
||||||
</gradient>
|
|
||||||
</aapt:attr>
|
|
||||||
</path>
|
|
||||||
|
|
||||||
<!-- L4: Bottom shadow — dark crescent for volume/sphere feeling -->
|
|
||||||
<path android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0">
|
<path android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
|
|
@ -80,108 +77,75 @@
|
||||||
android:centerY="44"
|
android:centerY="44"
|
||||||
android:gradientRadius="23">
|
android:gradientRadius="23">
|
||||||
<item android:color="#00000000" android:offset="0.0" />
|
<item android:color="#00000000" android:offset="0.0" />
|
||||||
<item android:color="#00000000" android:offset="0.55" />
|
<item android:color="#00000000" android:offset="0.6" />
|
||||||
<item android:color="#30301800" android:offset="0.78" />
|
<item android:color="#18201000" android:offset="0.82" />
|
||||||
<item android:color="#70301800" android:offset="0.92" />
|
<item android:color="#35201000" android:offset="1.0" />
|
||||||
<item android:color="#90201000" android:offset="1.0" />
|
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- L5: Internal caustic structure — off-center radial for depth -->
|
<!-- L5: Primary specular — tight, clean -->
|
||||||
<path android:pathData="M54,54m-18,0a18,18 0,1 1,36 0a18,18 0,1 1,-36 0">
|
<path android:pathData="M46,42a7,5.5 -12,1 1,14 0a7,5.5 -12,1 1,-14 0">
|
||||||
<aapt:attr name="android:fillColor">
|
|
||||||
<gradient
|
|
||||||
android:type="radial"
|
|
||||||
android:centerX="58"
|
|
||||||
android:centerY="50"
|
|
||||||
android:gradientRadius="20">
|
|
||||||
<item android:color="#00FFFFFF" android:offset="0.0" />
|
|
||||||
<item android:color="#0AFFD890" android:offset="0.3" />
|
|
||||||
<item android:color="#14E8A030" android:offset="0.6" />
|
|
||||||
<item android:color="#00000000" android:offset="1.0" />
|
|
||||||
</gradient>
|
|
||||||
</aapt:attr>
|
|
||||||
</path>
|
|
||||||
|
|
||||||
<!-- L6: Primary specular — tight elliptical highlight top-left -->
|
|
||||||
<path android:pathData="M45,42.5a8,6.5 -15,1 1,16 0a8,6.5 -15,1 1,-16 0">
|
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:type="radial"
|
android:type="radial"
|
||||||
android:centerX="46"
|
android:centerX="46"
|
||||||
android:centerY="42"
|
android:centerY="42"
|
||||||
android:gradientRadius="8">
|
android:gradientRadius="7">
|
||||||
<item android:color="#D0FFFFFF" android:offset="0.0" />
|
<item android:color="#90FFFFFF" android:offset="0.0" />
|
||||||
<item android:color="#60FFFFFF" android:offset="0.3" />
|
<item android:color="#40FFFFFF" android:offset="0.35" />
|
||||||
<item android:color="#18FFFFFF" android:offset="0.6" />
|
|
||||||
<item android:color="#00FFFFFF" android:offset="1.0" />
|
<item android:color="#00FFFFFF" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- L7: Micro specular — sharp pinpoint glint -->
|
<!-- L6: Micro pinpoint glint -->
|
||||||
<path android:pathData="M44,40m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0">
|
<path android:pathData="M44.5,40m-1.8,0a1.8,1.8 0,1 1,3.6 0a1.8,1.8 0,1 1,-3.6 0">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:type="radial"
|
android:type="radial"
|
||||||
android:centerX="44"
|
android:centerX="44.5"
|
||||||
android:centerY="40"
|
android:centerY="40"
|
||||||
android:gradientRadius="2.5">
|
android:gradientRadius="1.8">
|
||||||
<item android:color="#F0FFFFFF" android:offset="0.0" />
|
<item android:color="#E0FFFFFF" android:offset="0.0" />
|
||||||
<item android:color="#60FFFFFF" android:offset="0.5" />
|
<item android:color="#40FFFFFF" android:offset="0.5" />
|
||||||
<item android:color="#00FFFFFF" android:offset="1.0" />
|
<item android:color="#00FFFFFF" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- L8: Secondary specular — bottom-right warm bounce -->
|
<!-- L7: Outer rim — crisp glass edge -->
|
||||||
<path android:pathData="M63.5,64m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0">
|
|
||||||
<aapt:attr name="android:fillColor">
|
|
||||||
<gradient
|
|
||||||
android:type="radial"
|
|
||||||
android:centerX="63.5"
|
|
||||||
android:centerY="64"
|
|
||||||
android:gradientRadius="4">
|
|
||||||
<item android:color="#50FFD890" android:offset="0.0" />
|
|
||||||
<item android:color="#20FFD890" android:offset="0.5" />
|
|
||||||
<item android:color="#00FFD890" android:offset="1.0" />
|
|
||||||
</gradient>
|
|
||||||
</aapt:attr>
|
|
||||||
</path>
|
|
||||||
|
|
||||||
<!-- L9: Outer rim — crisp glass edge -->
|
|
||||||
<path
|
<path
|
||||||
android:pathData="M54,54m-20.5,0a20.5,20.5 0,1 1,41 0a20.5,20.5 0,1 1,-41 0"
|
android:pathData="M54,54m-20.5,0a20.5,20.5 0,1 1,41 0a20.5,20.5 0,1 1,-41 0"
|
||||||
android:strokeWidth="0.7"
|
android:strokeWidth="0.5"
|
||||||
android:fillColor="#00000000">
|
android:fillColor="#00000000">
|
||||||
<aapt:attr name="android:strokeColor">
|
<aapt:attr name="android:strokeColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:type="radial"
|
android:type="radial"
|
||||||
android:centerX="46"
|
android:centerX="46"
|
||||||
android:centerY="42"
|
android:centerY="42"
|
||||||
android:gradientRadius="30">
|
android:gradientRadius="28">
|
||||||
<item android:color="#40FFFFFF" android:offset="0.0" />
|
<item android:color="#30FFFFFF" android:offset="0.0" />
|
||||||
<item android:color="#18FFFFFF" android:offset="0.5" />
|
<item android:color="#12FFFFFF" android:offset="0.5" />
|
||||||
<item android:color="#08FFFFFF" android:offset="1.0" />
|
<item android:color="#06FFFFFF" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- L10: Inner rim — subtle inset edge for glass depth -->
|
<!-- L8: Inner rim -->
|
||||||
<path
|
<path
|
||||||
android:pathData="M54,54m-19.5,0a19.5,19.5 0,1 1,39 0a19.5,19.5 0,1 1,-39 0"
|
android:pathData="M54,54m-19.5,0a19.5,19.5 0,1 1,39 0a19.5,19.5 0,1 1,-39 0"
|
||||||
android:strokeWidth="0.4"
|
android:strokeWidth="0.3"
|
||||||
android:fillColor="#00000000">
|
android:fillColor="#00000000">
|
||||||
<aapt:attr name="android:strokeColor">
|
<aapt:attr name="android:strokeColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:type="radial"
|
android:type="radial"
|
||||||
android:centerX="48"
|
android:centerX="48"
|
||||||
android:centerY="44"
|
android:centerY="44"
|
||||||
android:gradientRadius="26">
|
android:gradientRadius="24">
|
||||||
<item android:color="#20FFFFFF" android:offset="0.0" />
|
<item android:color="#15FFFFFF" android:offset="0.0" />
|
||||||
<item android:color="#08FFFFFF" android:offset="0.6" />
|
<item android:color="#06FFFFFF" android:offset="0.6" />
|
||||||
<item android:color="#04FFFFFF" android:offset="1.0" />
|
<item android:color="#00FFFFFF" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
android:viewportWidth="108"
|
android:viewportWidth="108"
|
||||||
android:viewportHeight="108">
|
android:viewportHeight="108">
|
||||||
|
|
||||||
<!-- Orb body — solid-to-fade for themed icon legibility -->
|
<!-- Orb body -->
|
||||||
<path android:pathData="M54,54m-22,0a22,22 0,1 1,44 0a22,22 0,1 1,-44 0">
|
<path android:pathData="M54,54m-22,0a22,22 0,1 1,44 0a22,22 0,1 1,-44 0">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
|
|
@ -14,23 +14,23 @@
|
||||||
android:centerX="48"
|
android:centerX="48"
|
||||||
android:centerY="44"
|
android:centerY="44"
|
||||||
android:gradientRadius="26">
|
android:gradientRadius="26">
|
||||||
<item android:color="#FFFFFFFF" android:offset="0.0" />
|
<item android:color="#E0FFFFFF" android:offset="0.0" />
|
||||||
<item android:color="#CCFFFFFF" android:offset="0.5" />
|
<item android:color="#90FFFFFF" android:offset="0.5" />
|
||||||
<item android:color="#60FFFFFF" android:offset="1.0" />
|
<item android:color="#40FFFFFF" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- Specular dot — makes it read as a sphere, not a flat circle -->
|
<!-- Specular -->
|
||||||
<path android:pathData="M45,43m-5,0a5,4 0,1 1,10 0a5,4 0,1 1,-10 0">
|
<path android:pathData="M46,42a5,4 0,1 1,10 0a5,4 0,1 1,-10 0">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:type="radial"
|
android:type="radial"
|
||||||
android:centerX="45"
|
android:centerX="46"
|
||||||
android:centerY="43"
|
android:centerY="42"
|
||||||
android:gradientRadius="5">
|
android:gradientRadius="5">
|
||||||
<item android:color="#FFFFFFFF" android:offset="0.0" />
|
<item android:color="#FFFFFFFF" android:offset="0.0" />
|
||||||
<item android:color="#80FFFFFF" android:offset="0.4" />
|
<item android:color="#60FFFFFF" android:offset="0.4" />
|
||||||
<item android:color="#00FFFFFF" android:offset="1.0" />
|
<item android:color="#00FFFFFF" android:offset="1.0" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
<!-- Rim -->
|
<!-- Rim -->
|
||||||
<path
|
<path
|
||||||
android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0"
|
android:pathData="M54,54m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0"
|
||||||
android:strokeWidth="0.8"
|
android:strokeWidth="0.6"
|
||||||
android:strokeColor="#40FFFFFF"
|
android:strokeColor="#30FFFFFF"
|
||||||
android:fillColor="#00000000" />
|
android:fillColor="#00000000" />
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue