feat: Convert commons module to Kotlin Multiplatform
- Rewrite build.gradle.kts for KMP with Android + JVM targets - Restructure source sets: commonMain, jvmAndroid, androidMain, jvmMain - Replace android.util.LruCache with androidx.collection.LruCache (KMP-ready) - Replace android.util.Patterns with local regex constants - Move shared code to commonMain (icons, hashtags, robohash, compose, etc.) - Move JVM-shared code to jvmAndroid (richtext, base64Image detection) - Keep Android-specific code in androidMain (blurhash, bitmap handling) - Remove @Preview annotations from shared code (Android-only feature) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
+37
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Vitor Pamplona
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||
* Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
package com.vitorpamplona.amethyst.commons.base64Image
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import java.util.Base64
|
||||
|
||||
fun Base64Image.toBitmap(content: String): Bitmap {
|
||||
val matcher = pattern.matcher(content)
|
||||
|
||||
if (matcher.find()) {
|
||||
val base64String = matcher.group(2)
|
||||
val byteArray = Base64.getDecoder().decode(base64String)
|
||||
return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
|
||||
}
|
||||
|
||||
throw Exception("Unable to convert base64 to image $content")
|
||||
}
|
||||
+5
-5
@@ -20,13 +20,13 @@
|
||||
*/
|
||||
package com.vitorpamplona.amethyst.commons.compose
|
||||
|
||||
import android.util.LruCache
|
||||
import androidx.collection.LruCache
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.State
|
||||
import androidx.compose.runtime.produceState
|
||||
|
||||
@Composable
|
||||
fun <K, V> produceCachedStateAsync(
|
||||
fun <K : Any, V : Any> produceCachedStateAsync(
|
||||
cache: AsyncCachedState<K, V>,
|
||||
key: K,
|
||||
): State<V?> =
|
||||
@@ -39,7 +39,7 @@ fun <K, V> produceCachedStateAsync(
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun <K, V> produceCachedStateAsync(
|
||||
fun <K : Any, V : Any> produceCachedStateAsync(
|
||||
cache: AsyncCachedState<K, V>,
|
||||
key: String,
|
||||
updateValue: K,
|
||||
@@ -52,13 +52,13 @@ fun <K, V> produceCachedStateAsync(
|
||||
}
|
||||
}
|
||||
|
||||
interface AsyncCachedState<K, V> {
|
||||
interface AsyncCachedState<K : Any, V : Any> {
|
||||
fun cached(k: K): V?
|
||||
|
||||
suspend fun update(k: K): V?
|
||||
}
|
||||
|
||||
abstract class GenericBaseCacheAsync<K, V>(
|
||||
abstract class GenericBaseCacheAsync<K : Any, V : Any>(
|
||||
capacity: Int,
|
||||
) : AsyncCachedState<K, V> {
|
||||
private val cache = LruCache<K, V>(capacity)
|
||||
+5
-5
@@ -20,13 +20,13 @@
|
||||
*/
|
||||
package com.vitorpamplona.amethyst.commons.compose
|
||||
|
||||
import android.util.LruCache
|
||||
import androidx.collection.LruCache
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.State
|
||||
import androidx.compose.runtime.produceState
|
||||
|
||||
@Composable
|
||||
fun <K, V> produceCachedState(
|
||||
fun <K : Any, V : Any> produceCachedState(
|
||||
cache: CachedState<K, V>,
|
||||
key: K,
|
||||
): State<V?> =
|
||||
@@ -39,7 +39,7 @@ fun <K, V> produceCachedState(
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun <K, V> produceCachedState(
|
||||
fun <K : Any, V : Any> produceCachedState(
|
||||
cache: CachedState<K, V>,
|
||||
key: String,
|
||||
updateValue: K,
|
||||
@@ -52,13 +52,13 @@ fun <K, V> produceCachedState(
|
||||
}
|
||||
}
|
||||
|
||||
interface CachedState<K, V> {
|
||||
interface CachedState<K : Any, V : Any> {
|
||||
fun cached(k: K): V?
|
||||
|
||||
suspend fun update(k: K): V?
|
||||
}
|
||||
|
||||
abstract class GenericBaseCache<K, V>(
|
||||
abstract class GenericBaseCache<K : Any, V : Any>(
|
||||
capacity: Int,
|
||||
) : CachedState<K, V> {
|
||||
private val cache = LruCache<K, V>(capacity)
|
||||
-2
@@ -32,10 +32,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsAmethystPreview() {
|
||||
Image(
|
||||
-2
@@ -33,10 +33,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsBtcPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsCashuPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsCoffeePreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsFlowerstrPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsFootstrPreview() {
|
||||
Image(
|
||||
-2
@@ -28,10 +28,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsGamestrPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsGrownostrPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsLightningPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsMatePreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsNostrPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsPlebsPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsSkullPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsTunestrPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsWeedPreview() {
|
||||
Image(
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CustomHashTagIconsZapPreview() {
|
||||
Image(
|
||||
-2
@@ -29,10 +29,8 @@ import androidx.compose.ui.graphics.StrokeCap
|
||||
import androidx.compose.ui.graphics.StrokeJoin
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Following, null)
|
||||
-2
@@ -30,10 +30,8 @@ import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Like, null)
|
||||
-2
@@ -30,10 +30,8 @@ import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Liked, null)
|
||||
-2
@@ -30,10 +30,8 @@ import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Reply, null)
|
||||
-2
@@ -30,10 +30,8 @@ import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Repost, null)
|
||||
-2
@@ -30,10 +30,8 @@ import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Reposted, null)
|
||||
-2
@@ -30,10 +30,8 @@ import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Search, null)
|
||||
-2
@@ -30,10 +30,8 @@ import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Share, null)
|
||||
-2
@@ -31,9 +31,7 @@ import androidx.compose.ui.graphics.vector.DefaultFillType
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.PathBuilder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(Zap, null)
|
||||
-2
@@ -31,10 +31,8 @@ import androidx.compose.ui.graphics.vector.DefaultFillType
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.PathBuilder
|
||||
import androidx.compose.ui.graphics.vector.path
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun VectorPreview() {
|
||||
Image(ZapSplit, null)
|
||||
+1
-1
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
package com.vitorpamplona.amethyst.commons.robohash
|
||||
|
||||
import android.util.LruCache
|
||||
import androidx.collection.LruCache
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
|
||||
object CachedRobohash {
|
||||
-2
@@ -32,7 +32,6 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.vitorpamplona.amethyst.commons.robohash.parts.accessory0Seven
|
||||
import com.vitorpamplona.amethyst.commons.robohash.parts.accessory1Nose
|
||||
@@ -107,7 +106,6 @@ val MediumGray = SolidColor(Color(0xFFd0d2d3))
|
||||
val DefaultSize = 55.dp
|
||||
const val VIEWPORT_SIZE = 300f
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun RobohashPreview() {
|
||||
val assembler = RobohashAssembler()
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory0SevenPreview() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory1NosePreview() {
|
||||
Image(
|
||||
-2
@@ -27,7 +27,6 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightBrown
|
||||
@@ -36,7 +35,6 @@ import com.vitorpamplona.amethyst.commons.robohash.LightRed
|
||||
import com.vitorpamplona.amethyst.commons.robohash.MediumGray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory2HornRedPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightRed
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory3ButtonPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightRed
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory4SatellitePreview() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory5MustachePreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightRed
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory6Hat() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory7Antenna() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory8Brush() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.MediumGray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Accessory9Horn() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body0TropperPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body1ThinPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body2ThinnestPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body3FrontPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body4RoundPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body5NeckPreview() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Yellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body6IronManPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body7NeckThinnerPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body8BigPreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Gray
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Body9HugePreview() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes0Squint() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.DarkYellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes1Round() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightRed
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes2Single() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightRed
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes3Scott() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightRed
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes4RoundSingle() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightRed
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes5RoundSmall() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightYellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes6WallE() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes7Bar() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.LightYellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes8SmallBar() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Eyes9Shield() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face0C3po() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face1Rock() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face2Long() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face3Oval() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face4Cylinder() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face5Baloon() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face6Triangle() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face7Bent() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face8TriangleInv() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Face9Square() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth0Horz() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth1Cylinder() {
|
||||
Image(
|
||||
-2
@@ -27,14 +27,12 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.DarkYellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.OrangeOne
|
||||
import com.vitorpamplona.amethyst.commons.robohash.OrangeTwo
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth2Teeth() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.DarkYellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Yellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth3Grid() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth4Vert() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth5MidOpen() {
|
||||
Image(
|
||||
-2
@@ -27,12 +27,10 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Brown
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth6Cell() {
|
||||
Image(
|
||||
-2
@@ -27,13 +27,11 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.OrangeThree
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Yellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth7Happy() {
|
||||
Image(
|
||||
-2
@@ -27,14 +27,12 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.OrangeThree
|
||||
import com.vitorpamplona.amethyst.commons.robohash.OrangeTwo
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Yellow
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth8Buttons() {
|
||||
Image(
|
||||
-2
@@ -27,11 +27,9 @@ import androidx.compose.ui.graphics.SolidColor
|
||||
import androidx.compose.ui.graphics.vector.ImageVector.Builder
|
||||
import androidx.compose.ui.graphics.vector.PathData
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.vitorpamplona.amethyst.commons.robohash.Black
|
||||
import com.vitorpamplona.amethyst.commons.robohash.roboBuilder
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun Mouth9Closed() {
|
||||
Image(
|
||||
+8
-24
@@ -20,33 +20,17 @@
|
||||
*/
|
||||
package com.vitorpamplona.amethyst.commons.base64Image
|
||||
|
||||
import android.R.attr.data
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import com.vitorpamplona.amethyst.commons.richtext.RichTextParser
|
||||
import java.util.Base64
|
||||
import java.util.regex.Pattern
|
||||
|
||||
class Base64Image {
|
||||
companion object {
|
||||
val pattern = Pattern.compile("data:image/(${RichTextParser.imageExtensions.joinToString(separator = "|") { it } });base64,([a-zA-Z0-9+/]+={0,2})")
|
||||
object Base64Image {
|
||||
val pattern: Pattern =
|
||||
Pattern.compile(
|
||||
"data:image/(${RichTextParser.imageExtensions.joinToString(separator = "|")});base64,([a-zA-Z0-9+/]+={0,2})",
|
||||
)
|
||||
|
||||
fun isBase64(content: String): Boolean {
|
||||
val matcher = pattern.matcher(content)
|
||||
return matcher.find()
|
||||
}
|
||||
|
||||
fun toBitmap(content: String): Bitmap {
|
||||
val matcher = pattern.matcher(data.toString())
|
||||
|
||||
if (matcher.find()) {
|
||||
val base64String = matcher.group(2)
|
||||
|
||||
val byteArray = Base64.getDecoder().decode(base64String)
|
||||
return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
|
||||
}
|
||||
|
||||
throw Exception("Unable to convert base64 to image $content")
|
||||
}
|
||||
fun isBase64(content: String): Boolean {
|
||||
val matcher = pattern.matcher(content)
|
||||
return matcher.find()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Vitor Pamplona
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||
* Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
package com.vitorpamplona.amethyst.commons.richtext
|
||||
|
||||
import java.util.regex.Pattern
|
||||
|
||||
/**
|
||||
* Pattern constants for email and phone validation.
|
||||
* These replace android.util.Patterns for KMP compatibility.
|
||||
*/
|
||||
object Patterns {
|
||||
/**
|
||||
* Email address pattern from RFC 5322.
|
||||
*/
|
||||
val EMAIL_ADDRESS: Pattern =
|
||||
Pattern.compile(
|
||||
"[a-zA-Z0-9+._%-]+@[a-zA-Z0-9][a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}",
|
||||
)
|
||||
|
||||
/**
|
||||
* Phone number pattern - matches common phone formats.
|
||||
*/
|
||||
val PHONE: Pattern =
|
||||
Pattern.compile(
|
||||
"^[+]?[(]?[0-9]{1,4}[)]?[-\\s./0-9]*\$",
|
||||
)
|
||||
}
|
||||
-1
@@ -20,7 +20,6 @@
|
||||
*/
|
||||
package com.vitorpamplona.amethyst.commons.richtext
|
||||
|
||||
import android.util.Patterns
|
||||
import com.linkedin.urls.detection.UrlDetector
|
||||
import com.linkedin.urls.detection.UrlDetectorOptions
|
||||
import com.vitorpamplona.amethyst.commons.base64Image.Base64Image
|
||||
Reference in New Issue
Block a user