feat(icons): migrate Material Icons → Material Symbols (thin weight)

Replace the `material-icons-extended` library with Google's Material Symbols
variable font, rendered via a new `commons/icons/symbols/` package. Weight is
set to 100 (Thin) via a single tunable default (MaterialSymbolsDefaults.WEIGHT),
so we can re-tune line thickness globally in one line without regenerating
assets.

Key changes:
- commons/composeResources/font/material_symbols_outlined.ttf: Material Symbols
  Outlined variable font (all 3600+ glyphs, 4 design axes: wght/FILL/GRAD/opsz).
- commons/icons/symbols/: MaterialSymbol data class, 219 codepoint constants,
  variable-font FontFamily helper, Canvas-backed Icon composable (overload that
  accepts MaterialSymbol and supports auto-mirror for RTL), and a Painter
  wrapper for use with Image / AsyncImage.
- Bulk-rewrote 250+ call sites across amethyst/, commons/, desktopApp/:
  Icons.{Default,Outlined,Filled,Rounded,AutoMirrored.*}.X → MaterialSymbols.X
  or MaterialSymbols.AutoMirrored.X. `imageVector =` renamed to `symbol =`
  inside Icon() calls; Image(imageVector = MS.X) converted to
  Image(painter = rememberMaterialSymbolPainter(MS.X)).
- Dropped material-icons-extended dependency from commons, desktopApp,
  amethyst build files.

Hand-drawn custom icons (Bookmark, Like, Reply, Zap, chess pieces, robohash)
remain as ImageVector and are untouched.

https://claude.ai/code/session_016gV9gEaSud6kDMdcaqy8ti
This commit is contained in:
Claude
2026-04-23 19:44:17 +00:00
parent dffcd258b7
commit 8ff091ca0e
263 changed files with 2050 additions and 2082 deletions
@@ -33,8 +33,6 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.HorizontalDivider
@@ -71,6 +69,8 @@ import androidx.compose.ui.window.Window
import androidx.compose.ui.window.WindowPosition
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.account.AccountManager
import com.vitorpamplona.amethyst.desktop.account.AccountState
import com.vitorpamplona.amethyst.desktop.cache.DesktopLocalCache
@@ -1394,7 +1394,7 @@ fun RelaySettingsScreen(
)
IconButton(onClick = { relayManager.connect() }) {
Icon(
Icons.Default.Refresh,
MaterialSymbols.Refresh,
contentDescription = "Reconnect",
tint = MaterialTheme.colorScheme.primary,
)
@@ -38,13 +38,6 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
@@ -84,6 +77,8 @@ import com.vitorpamplona.amethyst.commons.chess.PublicGame
import com.vitorpamplona.amethyst.commons.chess.PublicGameCard
import com.vitorpamplona.amethyst.commons.chess.SpectatingGameCard
import com.vitorpamplona.amethyst.commons.data.UserMetadataCache
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.ui.components.UserAvatar
import com.vitorpamplona.amethyst.desktop.account.AccountState
import com.vitorpamplona.amethyst.desktop.network.DesktopRelayConnectionManager
@@ -193,7 +188,7 @@ fun ChessScreen(
Row(verticalAlignment = Alignment.CenterVertically) {
if (selectedGameId != null) {
IconButton(onClick = { viewModel.selectGame(null) }) {
Icon(Icons.AutoMirrored.Default.ArrowBack, "Back to list")
Icon(MaterialSymbols.AutoMirrored.ArrowBack, "Back to list")
}
Spacer(Modifier.width(8.dp))
}
@@ -211,13 +206,13 @@ fun ChessScreen(
) {
// Refresh button
IconButton(onClick = { viewModel.forceRefresh() }) {
Icon(Icons.Default.Refresh, "Refresh")
Icon(MaterialSymbols.Refresh, "Refresh")
}
// New Game button
if (!account.isReadOnly) {
Button(onClick = { showNewGameDialog = true }) {
Icon(Icons.Default.Add, "New Game")
Icon(MaterialSymbols.Add, "New Game")
Spacer(Modifier.width(8.dp))
Text("New Game")
}
@@ -728,9 +723,9 @@ private fun DesktopChessGameLayout(
) {
Icon(
if (showInfoPanel) {
Icons.AutoMirrored.Filled.KeyboardArrowRight
MaterialSymbols.AutoMirrored.KeyboardArrowRight
} else {
Icons.AutoMirrored.Filled.KeyboardArrowLeft
MaterialSymbols.AutoMirrored.KeyboardArrowLeft
},
contentDescription = if (showInfoPanel) "Hide info panel" else "Show info panel",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -907,7 +902,7 @@ private fun DesktopChessGameLayout(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Icon(Icons.Default.Visibility, contentDescription = null)
Icon(MaterialSymbols.Visibility, contentDescription = null)
Text(
"Watching game - spectator mode",
style = MaterialTheme.typography.bodyMedium,
@@ -41,10 +41,6 @@ import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -75,6 +71,8 @@ import com.vitorpamplona.amethyst.commons.compose.article.ArticleHeader
import com.vitorpamplona.amethyst.commons.compose.article.TableOfContents
import com.vitorpamplona.amethyst.commons.compose.article.extractTableOfContents
import com.vitorpamplona.amethyst.commons.compose.markdown.RenderMarkdown
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.nip23LongContent.ReadingTimeCalculator
import com.vitorpamplona.amethyst.commons.ui.components.EmptyState
import com.vitorpamplona.amethyst.commons.ui.components.LoadingState
@@ -415,7 +413,7 @@ fun ArticleReaderScreen(
Row(verticalAlignment = Alignment.CenterVertically) {
IconButton(onClick = onBack) {
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
MaterialSymbols.AutoMirrored.ArrowBack,
contentDescription = "Back",
modifier = Modifier.size(24.dp),
)
@@ -531,9 +529,9 @@ fun ArticleReaderScreen(
) {
Icon(
if (showHighlightsPanel) {
Icons.Default.KeyboardArrowDown
MaterialSymbols.KeyboardArrowDown
} else {
Icons.AutoMirrored.Filled.KeyboardArrowRight
MaterialSymbols.AutoMirrored.KeyboardArrowRight
},
contentDescription = "Toggle highlights",
modifier = Modifier.size(20.dp),
@@ -30,9 +30,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ContentCopy
import androidx.compose.material.icons.filled.Warning
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.HorizontalDivider
@@ -51,6 +48,8 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.account.AccountState
import java.awt.Toolkit
import java.awt.datatransfer.StringSelection
@@ -85,7 +84,7 @@ fun DevSettingsSection(
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Icon(
Icons.Default.Warning,
MaterialSymbols.Warning,
contentDescription = "Warning",
tint = Color(0xFFFF9800),
)
@@ -205,7 +204,7 @@ private fun KeyRow(
),
) {
Icon(
Icons.Default.ContentCopy,
MaterialSymbols.ContentCopy,
contentDescription = "Copy",
modifier = Modifier.padding(end = 4.dp),
)
@@ -31,9 +31,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.Card
@@ -54,6 +51,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.service.drafts.DesktopDraftStore
import com.vitorpamplona.amethyst.desktop.service.drafts.DraftEntry
import kotlinx.coroutines.launch
@@ -79,7 +78,7 @@ fun DraftsScreen(
color = MaterialTheme.colorScheme.onBackground,
)
Button(onClick = { onOpenEditor(null) }) {
Icon(Icons.Default.Add, contentDescription = null)
Icon(MaterialSymbols.Add, contentDescription = null)
Text("New Draft", modifier = Modifier.padding(start = 4.dp))
}
}
@@ -178,7 +177,7 @@ private fun DraftCard(
}
IconButton(onClick = onDelete) {
Icon(
Icons.Default.Delete,
MaterialSymbols.Delete,
contentDescription = "Delete draft",
tint = MaterialTheme.colorScheme.error,
)
@@ -36,10 +36,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Dns
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.FilterChip
@@ -61,6 +57,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.compose.elements.BoostedMark
import com.vitorpamplona.amethyst.commons.compose.layouts.GenericRepostLayout
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.Note
import com.vitorpamplona.amethyst.commons.richtext.UrlParser
import com.vitorpamplona.amethyst.commons.ui.components.EmptyState
@@ -701,7 +699,7 @@ private fun FeedHeader(
modifier = Modifier.size(24.dp),
) {
Icon(
Icons.Default.Dns,
MaterialSymbols.Dns,
contentDescription = "Edit Feed Relays",
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(18.dp),
@@ -714,7 +712,7 @@ private fun FeedHeader(
modifier = Modifier.size(24.dp),
) {
Icon(
Icons.Default.Refresh,
MaterialSymbols.Refresh,
contentDescription = "Refresh",
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(18.dp),
@@ -727,7 +725,7 @@ private fun FeedHeader(
onClick = onCompose,
enabled = account != null && !account.isReadOnly,
) {
Icon(Icons.Default.Add, "New Post", Modifier.size(18.dp))
Icon(MaterialSymbols.Add, "New Post", Modifier.size(18.dp))
Spacer(Modifier.width(8.dp))
Text("New Post")
}
@@ -32,9 +32,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.LinearProgressIndicator
@@ -51,6 +48,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.resources.Res
import com.vitorpamplona.amethyst.commons.resources.login_subtitle_desktop
import com.vitorpamplona.amethyst.commons.resources.login_title
@@ -213,7 +212,7 @@ fun ConnectingRelaysScreen(
when {
status.connected -> {
Icon(
Icons.Default.Check,
MaterialSymbols.Check,
contentDescription = null,
tint = Color(0xFF4CAF50),
modifier = Modifier.size(14.dp),
@@ -222,7 +221,7 @@ fun ConnectingRelaysScreen(
status.error != null -> {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = null,
tint = MaterialTheme.colorScheme.error,
modifier = Modifier.size(14.dp),
@@ -29,10 +29,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.icons.outlined.FavoriteBorder
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
@@ -60,6 +56,8 @@ import com.vitorpamplona.amethyst.commons.icons.BookmarkFilled
import com.vitorpamplona.amethyst.commons.icons.Reply
import com.vitorpamplona.amethyst.commons.icons.Repost
import com.vitorpamplona.amethyst.commons.icons.Zap
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.nip18Reposts.RepostAction
import com.vitorpamplona.amethyst.commons.model.nip25Reactions.ReactionAction
import com.vitorpamplona.amethyst.commons.model.nip51Bookmarks.BookmarkAction
@@ -552,7 +550,7 @@ fun NoteActionsRow(
modifier = Modifier.size(32.dp),
) {
Icon(
if (isLiked) Icons.Filled.Favorite else Icons.Outlined.FavoriteBorder,
if (isLiked) MaterialSymbols.Favorite else MaterialSymbols.FavoriteBorder,
contentDescription = if (isLiked) "Unlike" else "Like",
tint =
if (isLiked) {
@@ -731,7 +729,7 @@ fun NoteActionsRow(
modifier = Modifier.size(32.dp),
) {
Icon(
Icons.Default.MoreVert,
MaterialSymbols.MoreVert,
contentDescription = "More options",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.size(18.dp),
@@ -31,8 +31,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Icon
@@ -48,10 +46,13 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.Reply
import com.vitorpamplona.amethyst.commons.icons.Repost
import com.vitorpamplona.amethyst.commons.icons.Zap
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.icons.symbols.rememberMaterialSymbolPainter
import com.vitorpamplona.amethyst.commons.state.EventCollectionState
import com.vitorpamplona.amethyst.commons.ui.components.EmptyState
import com.vitorpamplona.amethyst.commons.ui.components.LoadingState
@@ -273,28 +274,32 @@ fun NotificationCard(notification: NotificationItem) {
val (icon, label, color) =
when (notification) {
is NotificationItem.Mention -> {
Triple(Icons.Default.Favorite, "mentioned you", MaterialTheme.colorScheme.primary)
Triple(
rememberMaterialSymbolPainter(MaterialSymbols.Favorite),
"mentioned you",
MaterialTheme.colorScheme.primary,
)
}
is NotificationItem.Reply -> {
Triple(Reply, "replied", MaterialTheme.colorScheme.secondary)
Triple(rememberVectorPainter(Reply), "replied", MaterialTheme.colorScheme.secondary)
}
is NotificationItem.Reaction -> {
Triple(
Icons.Default.Favorite,
rememberMaterialSymbolPainter(MaterialSymbols.Favorite),
"reacted ${notification.content}",
MaterialTheme.colorScheme.tertiary,
)
}
is NotificationItem.Repost -> {
Triple(Repost, "reposted", MaterialTheme.colorScheme.primary)
Triple(rememberVectorPainter(Repost), "reposted", MaterialTheme.colorScheme.primary)
}
is NotificationItem.Zap -> {
val amountText = notification.amount?.let { " ${it / 1000} sats" } ?: ""
Triple(Zap, "zapped$amountText", MaterialTheme.colorScheme.primary)
Triple(rememberVectorPainter(Zap), "zapped$amountText", MaterialTheme.colorScheme.primary)
}
}
@@ -35,8 +35,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.FilterChip
@@ -57,6 +55,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.state.EventCollectionState
import com.vitorpamplona.amethyst.commons.ui.components.EmptyState
import com.vitorpamplona.amethyst.commons.ui.components.LoadingState
@@ -339,7 +339,7 @@ fun ReadsScreen(
modifier = Modifier.size(24.dp),
) {
Icon(
Icons.Default.Refresh,
MaterialSymbols.Refresh,
contentDescription = "Refresh",
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(18.dp),
@@ -39,18 +39,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowForward
import androidx.compose.material.icons.filled.Clear
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Description
import androidx.compose.material.icons.filled.Dns
import androidx.compose.material.icons.filled.History
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Star
import androidx.compose.material.icons.filled.Tag
import androidx.compose.material.icons.filled.Tune
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
@@ -86,6 +74,8 @@ import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.chess.RelaySyncStatus
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.search.AdvancedSearchBarState
import com.vitorpamplona.amethyst.commons.search.QuerySerializer
import com.vitorpamplona.amethyst.commons.search.SavedSearch
@@ -375,7 +365,7 @@ fun SearchScreen(
placeholder = { Text("Search notes, people, tags... or use operators") },
leadingIcon = {
Icon(
Icons.Default.Search,
MaterialSymbols.Search,
contentDescription = "Search",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -384,7 +374,7 @@ fun SearchScreen(
if (displayText.isNotEmpty()) {
IconButton(onClick = { state.clearSearch() }) {
Icon(
Icons.Default.Clear,
MaterialSymbols.Clear,
contentDescription = "Clear",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -397,7 +387,7 @@ fun SearchScreen(
if (account != null && !account.isReadOnly) {
IconButton(onClick = { showRelayPicker = true }) {
Icon(
Icons.Default.Dns,
MaterialSymbols.Dns,
contentDescription = "Search Relays",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -405,7 +395,7 @@ fun SearchScreen(
}
IconButton(onClick = { state.togglePanel() }) {
Icon(
Icons.Default.Tune,
MaterialSymbols.Tune,
contentDescription = "Advanced Search",
tint =
if (panelExpanded) {
@@ -553,7 +543,7 @@ private fun SearchEmptyState(
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Icon(
Icons.Default.Star,
MaterialSymbols.Star,
contentDescription = null,
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.primary,
@@ -573,7 +563,7 @@ private fun SearchEmptyState(
}
IconButton(onClick = { onDeleteSaved(saved.id) }) {
Icon(
Icons.Default.Delete,
MaterialSymbols.Delete,
contentDescription = "Delete",
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -613,7 +603,7 @@ private fun SearchEmptyState(
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Icon(
Icons.Default.History,
MaterialSymbols.History,
contentDescription = null,
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -709,12 +699,12 @@ private fun SearchResultCard(
horizontalArrangement = Arrangement.spacedBy(12.dp),
) {
Icon(
imageVector =
symbol =
when (result) {
is SearchResult.UserResult -> Icons.Default.Person
is SearchResult.NoteResult -> Icons.Default.Description
is SearchResult.AddressResult -> Icons.Default.Description
is SearchResult.HashtagResult -> Icons.Default.Tag
is SearchResult.UserResult -> MaterialSymbols.Person
is SearchResult.NoteResult -> MaterialSymbols.Description
is SearchResult.AddressResult -> MaterialSymbols.Description
is SearchResult.HashtagResult -> MaterialSymbols.Tag
},
contentDescription = null,
modifier = Modifier.size(24.dp),
@@ -746,7 +736,7 @@ private fun SearchResultCard(
}
Icon(
Icons.AutoMirrored.Filled.ArrowForward,
MaterialSymbols.AutoMirrored.ArrowForward,
contentDescription = "Navigate",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -34,8 +34,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -52,6 +50,8 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.Note
import com.vitorpamplona.amethyst.commons.ui.components.EmptyState
import com.vitorpamplona.amethyst.commons.ui.components.LoadingState
@@ -205,7 +205,7 @@ fun ThreadScreen(
) {
IconButton(onClick = onBack) {
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
MaterialSymbols.AutoMirrored.ArrowBack,
contentDescription = "Back",
modifier = Modifier.size(24.dp),
)
@@ -38,13 +38,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.ContentCopy
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.PersonAdd
import androidx.compose.material.icons.filled.PersonRemove
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.Card
@@ -72,6 +65,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.nip02FollowList.FollowAction
import com.vitorpamplona.amethyst.commons.profile.ProfileBroadcastBanner
import com.vitorpamplona.amethyst.commons.profile.ProfileBroadcastStatus
@@ -472,7 +467,7 @@ fun UserProfileScreen(
) {
Row(verticalAlignment = Alignment.CenterVertically) {
IconButton(onClick = onBack) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, "Back")
Icon(MaterialSymbols.AutoMirrored.ArrowBack, "Back")
}
Spacer(Modifier.width(8.dp))
Text(
@@ -490,7 +485,7 @@ fun UserProfileScreen(
},
) {
Icon(
Icons.Default.Edit,
MaterialSymbols.Edit,
contentDescription = "Edit profile",
modifier = Modifier.size(18.dp),
)
@@ -554,7 +549,7 @@ fun UserProfileScreen(
else -> {
Icon(
if (isFollowing) Icons.Default.PersonRemove else Icons.Default.PersonAdd,
if (isFollowing) MaterialSymbols.PersonRemove else MaterialSymbols.PersonAdd,
contentDescription = if (isFollowing) "Unfollow" else "Follow",
modifier = Modifier.size(18.dp),
)
@@ -639,7 +634,7 @@ fun UserProfileScreen(
modifier = Modifier.size(20.dp),
) {
Icon(
if (copied) Icons.Default.Check else Icons.Default.ContentCopy,
if (copied) MaterialSymbols.Check else MaterialSymbols.ContentCopy,
contentDescription = if (copied) "Copied" else "Copy npub",
modifier = Modifier.size(14.dp),
tint =
@@ -901,7 +896,7 @@ fun UserProfileScreen(
verticalAlignment = Alignment.CenterVertically,
) {
IconButton(onClick = onBack) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, "Back")
Icon(MaterialSymbols.AutoMirrored.ArrowBack, "Back")
}
Spacer(Modifier.width(8.dp))
UserAvatar(
@@ -22,9 +22,6 @@ package com.vitorpamplona.amethyst.desktop.ui.auth
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Icon
@@ -42,6 +39,8 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.resources.Res
import com.vitorpamplona.amethyst.commons.resources.login_hide_key
import com.vitorpamplona.amethyst.commons.resources.login_key_label
@@ -79,7 +78,7 @@ fun KeyInputField(
trailingIcon = {
IconButton(onClick = { showKey = !showKey }) {
Icon(
if (showKey) Icons.Default.VisibilityOff else Icons.Default.Visibility,
if (showKey) MaterialSymbols.VisibilityOff else MaterialSymbols.Visibility,
contentDescription = if (showKey) stringResource(Res.string.login_hide_key) else stringResource(Res.string.login_show_key),
)
}
@@ -28,9 +28,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -40,6 +37,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.account.LoginProgress
import com.vitorpamplona.amethyst.desktop.account.RelayLoginStatus
@@ -111,7 +110,7 @@ private fun StepRow(step: StepInfo) {
when (step.state) {
StepState.DONE -> {
Icon(
Icons.Default.Check,
MaterialSymbols.Check,
contentDescription = null,
tint = Color(0xFF4CAF50),
modifier = Modifier.size(16.dp),
@@ -155,7 +154,7 @@ private fun RelayRow(
when (status) {
RelayLoginStatus.EVENT_SENT -> {
Icon(
Icons.Default.Check,
MaterialSymbols.Check,
contentDescription = null,
tint = Color(0xFF2196F3),
modifier = Modifier.size(12.dp),
@@ -164,7 +163,7 @@ private fun RelayRow(
RelayLoginStatus.CONNECTED -> {
Icon(
Icons.Default.Check,
MaterialSymbols.Check,
contentDescription = null,
tint = Color(0xFF4CAF50),
modifier = Modifier.size(12.dp),
@@ -175,7 +174,7 @@ private fun RelayRow(
RelayLoginStatus.SEND_FAILED,
-> {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = null,
tint = MaterialTheme.colorScheme.error,
modifier = Modifier.size(12.dp),
@@ -32,11 +32,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Forward
import androidx.compose.material.icons.automirrored.filled.InsertDriveFile
import androidx.compose.material.icons.filled.Download
import androidx.compose.material.icons.filled.Lock
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator
@@ -61,6 +56,8 @@ import androidx.compose.ui.input.pointer.isSecondaryPressed
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.service.media.EncryptedMediaService
import com.vitorpamplona.quartz.nip17Dm.files.ChatMessageEncryptedFileHeaderEvent
import kotlinx.coroutines.Dispatchers
@@ -144,7 +141,7 @@ fun ChatFileAttachment(
// Encryption indicator
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
Icons.Default.Lock,
MaterialSymbols.Lock,
contentDescription = "Encrypted",
modifier = Modifier.size(14.dp),
tint = MaterialTheme.colorScheme.primary,
@@ -191,7 +188,7 @@ fun ChatFileAttachment(
// Non-image file
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
Icons.AutoMirrored.Filled.InsertDriveFile,
MaterialSymbols.AutoMirrored.InsertDriveFile,
contentDescription = "File",
modifier = Modifier.size(32.dp),
)
@@ -223,7 +220,7 @@ fun ChatFileAttachment(
DropdownMenuItem(
text = { Text("Save to disk") },
leadingIcon = {
Icon(Icons.Default.Download, contentDescription = null, modifier = Modifier.size(18.dp))
Icon(MaterialSymbols.Download, contentDescription = null, modifier = Modifier.size(18.dp))
},
enabled = decryptedBytes != null,
onClick = {
@@ -237,7 +234,7 @@ fun ChatFileAttachment(
DropdownMenuItem(
text = { Text("Forward") },
leadingIcon = {
Icon(Icons.AutoMirrored.Filled.Forward, contentDescription = null, modifier = Modifier.size(18.dp))
Icon(MaterialSymbols.AutoMirrored.Forward, contentDescription = null, modifier = Modifier.size(18.dp))
},
onClick = {
showContextMenu = false
@@ -38,13 +38,6 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.Send
import androidx.compose.material.icons.filled.AttachFile
import androidx.compose.material.icons.filled.Lock
import androidx.compose.material.icons.filled.LockOpen
import androidx.compose.material.icons.outlined.AddReaction
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -83,6 +76,8 @@ import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupProperties
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.IAccount
import com.vitorpamplona.amethyst.commons.model.Note
import com.vitorpamplona.amethyst.commons.model.cache.ICacheProvider
@@ -230,7 +225,7 @@ fun ChatPane(
modifier = Modifier.size(40.dp),
) {
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
MaterialSymbols.AutoMirrored.ArrowBack,
contentDescription = "Back to conversations",
)
}
@@ -517,7 +512,7 @@ private fun MessageWithReactions(
when (event) {
is PrivateDmEvent -> {
Icon(
Icons.Default.LockOpen,
MaterialSymbols.LockOpen,
contentDescription = "NIP-04 (legacy)",
modifier = Modifier.size(12.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.4f),
@@ -528,7 +523,7 @@ private fun MessageWithReactions(
is ChatMessageEncryptedFileHeaderEvent,
-> {
Icon(
Icons.Default.Lock,
MaterialSymbols.Lock,
contentDescription = "NIP-17 (encrypted)",
modifier = Modifier.size(12.dp),
tint = MaterialTheme.colorScheme.primary.copy(alpha = 0.6f),
@@ -572,7 +567,7 @@ private fun MessageWithReactions(
modifier = Modifier.size(20.dp),
) {
Icon(
imageVector = Icons.Outlined.AddReaction,
symbol = MaterialSymbols.AddReaction,
contentDescription = "React",
modifier = Modifier.size(14.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -709,7 +704,7 @@ private fun MessageInput(
modifier = Modifier.size(40.dp),
) {
Icon(
Icons.Default.AttachFile,
MaterialSymbols.AttachFile,
contentDescription = "Attach file",
tint =
if (isUploading) {
@@ -749,7 +744,7 @@ private fun MessageInput(
modifier = Modifier.size(40.dp),
) {
Icon(
Icons.AutoMirrored.Filled.Send,
MaterialSymbols.AutoMirrored.Send,
contentDescription = "Send",
tint =
if (canSend && !isUploading) {
@@ -768,7 +763,7 @@ private fun MessageInput(
modifier = Modifier.padding(start = 4.dp),
) {
Icon(
imageVector = Icons.Default.Lock,
symbol = MaterialSymbols.Lock,
contentDescription = "NIP-17 (encrypted)",
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.primary,
@@ -38,10 +38,6 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Dns
import androidx.compose.material.icons.filled.Group
import androidx.compose.material3.FilterChip
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -67,6 +63,8 @@ import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.ui.components.UserAvatar
import com.vitorpamplona.amethyst.commons.util.toTimeAgo
import com.vitorpamplona.quartz.nip17Dm.base.ChatroomKey
@@ -186,7 +184,7 @@ fun ConversationListPane(
modifier = Modifier.size(32.dp),
) {
Icon(
Icons.Default.Dns,
MaterialSymbols.Dns,
contentDescription = "DM Relays",
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(20.dp),
@@ -197,7 +195,7 @@ fun ConversationListPane(
modifier = Modifier.size(32.dp),
) {
Icon(
Icons.Default.Add,
MaterialSymbols.Add,
contentDescription = "New conversation",
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(20.dp),
@@ -324,7 +322,7 @@ private fun ConversationCard(
)
} else if (item.isGroup) {
Icon(
Icons.Default.Group,
MaterialSymbols.Group,
contentDescription = "Group",
modifier = Modifier.size(40.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -28,8 +28,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Email
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -53,6 +51,8 @@ import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.IAccount
import com.vitorpamplona.amethyst.commons.model.cache.ICacheProvider
import com.vitorpamplona.amethyst.commons.ui.chat.DmBroadcastStatus
@@ -335,7 +335,7 @@ private fun EmptyConversationState() {
horizontalAlignment = Alignment.CenterHorizontally,
) {
Icon(
Icons.Default.Email,
MaterialSymbols.Email,
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.3f),
modifier = Modifier.size(48.dp),
@@ -29,9 +29,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Clear
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -51,6 +48,8 @@ import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.cache.ICacheProvider
import com.vitorpamplona.amethyst.commons.search.SearchResult
import com.vitorpamplona.amethyst.commons.ui.components.UserSearchCard
@@ -161,12 +160,12 @@ fun NewDmDialog(
.focusRequester(focusRequester),
placeholder = { Text("Search users by name or npub...") },
leadingIcon = {
Icon(Icons.Default.Search, contentDescription = null)
Icon(MaterialSymbols.Search, contentDescription = null)
},
trailingIcon = {
if (searchText.isNotEmpty()) {
IconButton(onClick = { searchState.clearSearch() }) {
Icon(Icons.Default.Clear, contentDescription = "Clear")
Icon(MaterialSymbols.Clear, contentDescription = "Clear")
}
}
},
@@ -33,9 +33,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ChevronRight
import androidx.compose.material.icons.filled.ExpandMore
import androidx.compose.material3.AssistChip
import androidx.compose.material3.Checkbox
import androidx.compose.material3.Icon
@@ -51,6 +48,8 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.displayUrl
@@ -80,7 +79,7 @@ fun ComposeRelayPicker(
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
if (expanded) Icons.Default.ExpandMore else Icons.Default.ChevronRight,
if (expanded) MaterialSymbols.ExpandMore else MaterialSymbols.ChevronRight,
contentDescription = null,
)
Spacer(Modifier.width(4.dp))
@@ -42,21 +42,6 @@ import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Article
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Dns
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Explore
import androidx.compose.material.icons.filled.Groups
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.PushPin
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.SportsEsports
import androidx.compose.material.icons.filled.Star
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.DropdownMenu
@@ -90,7 +75,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.ui.input.key.key
@@ -101,6 +85,9 @@ import androidx.compose.ui.input.pointer.isSecondaryPressed
import androidx.compose.ui.input.pointer.onPointerEvent
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbol
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.LayoutMode
import kotlinx.coroutines.delay
@@ -108,14 +95,14 @@ import kotlinx.coroutines.delay
enum class ScreenCategory(
val title: String,
val icon: ImageVector,
val icon: MaterialSymbol,
) {
SOCIAL("Social", Icons.Default.Groups),
LONG_FORM("Long-Form", Icons.AutoMirrored.Filled.Article),
DISCOVERY("Discovery", Icons.Default.Explore),
IDENTITY("Identity", Icons.Default.Person),
PLAY("Play", Icons.Default.SportsEsports),
NETWORK("Network", Icons.Default.Dns),
SOCIAL("Social", MaterialSymbols.Groups),
LONG_FORM("Long-Form", MaterialSymbols.AutoMirrored.Article),
DISCOVERY("Discovery", MaterialSymbols.Explore),
IDENTITY("Identity", MaterialSymbols.Person),
PLAY("Play", MaterialSymbols.SportsEsports),
NETWORK("Network", MaterialSymbols.Dns),
}
// -- Extensions on DeckColumnType --
@@ -412,7 +399,7 @@ fun AppDrawer(
.focusRequester(searchFocusRequester),
placeholder = { Text("Search screens and workspaces...") },
singleLine = true,
leadingIcon = { Icon(Icons.Default.Search, "Search") },
leadingIcon = { Icon(MaterialSymbols.Search, "Search") },
)
if (state.awaitingHashtag) {
@@ -623,7 +610,7 @@ private fun DrawerScreenCard(
},
leadingIcon = {
Icon(
Icons.Default.PushPin,
MaterialSymbols.PushPin,
contentDescription = null,
modifier = Modifier.size(16.dp),
)
@@ -824,17 +811,17 @@ private fun WorkspaceCard(
if (isActive) {
Spacer(Modifier.width(8.dp))
Icon(
Icons.Default.Check,
MaterialSymbols.Check,
"Active",
Modifier.size(18.dp),
tint = MaterialTheme.colorScheme.primary,
)
}
IconButton(onClick = onEdit) {
Icon(Icons.Default.Edit, "Edit", Modifier.size(18.dp))
Icon(MaterialSymbols.Edit, "Edit", Modifier.size(18.dp))
}
IconButton(onClick = onDelete, enabled = canDelete) {
Icon(Icons.Default.Delete, "Delete", Modifier.size(18.dp))
Icon(MaterialSymbols.Delete, "Delete", Modifier.size(18.dp))
}
}
}
@@ -859,7 +846,7 @@ private fun AddWorkspaceCard(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
) {
Icon(Icons.Default.Add, "Add workspace", Modifier.size(24.dp))
Icon(MaterialSymbols.Add, "Add workspace", Modifier.size(24.dp))
Spacer(Modifier.width(8.dp))
Text(
"New Workspace",
@@ -1025,7 +1012,7 @@ private fun DeckColumnEditor(
},
enabled = columns.size > 1,
) {
Icon(Icons.Default.Close, "Remove")
Icon(MaterialSymbols.Close, "Remove")
}
}
}
@@ -1064,7 +1051,7 @@ private fun SinglePaneScreensEditor(
Row(verticalAlignment = Alignment.CenterVertically) {
if (idx == 0) {
Icon(
Icons.Default.Star,
MaterialSymbols.Star,
"Default",
Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.primary,
@@ -1074,7 +1061,7 @@ private fun SinglePaneScreensEditor(
Text(displayName, Modifier.weight(1f))
IconButton(onClick = {
onScreensChange(screens.toMutableList().apply { removeAt(idx) })
}) { Icon(Icons.Default.Close, "Remove", Modifier.size(16.dp)) }
}) { Icon(MaterialSymbols.Close, "Remove", Modifier.size(16.dp)) }
}
}
// Add screen dropdown
@@ -29,20 +29,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.Article
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Dns
import androidx.compose.material.icons.filled.Email
import androidx.compose.material.icons.filled.Extension
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Notifications
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Public
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.filled.Tag
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -50,10 +36,12 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbol
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
@Composable
fun ColumnHeader(
@@ -81,7 +69,7 @@ fun ColumnHeader(
if (hasBackStack) {
IconButton(onClick = onBack, modifier = Modifier.size(28.dp)) {
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
MaterialSymbols.AutoMirrored.ArrowBack,
contentDescription = "Back",
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -91,7 +79,7 @@ fun ColumnHeader(
}
Icon(
imageVector = column.type.icon(),
symbol = column.type.icon(),
contentDescription = null,
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -111,7 +99,7 @@ fun ColumnHeader(
if (canClose) {
IconButton(onClick = onClose, modifier = Modifier.size(28.dp)) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Close column",
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -121,24 +109,24 @@ fun ColumnHeader(
}
}
fun DeckColumnType.icon(): ImageVector =
fun DeckColumnType.icon(): MaterialSymbol =
when (this) {
DeckColumnType.HomeFeed -> Icons.Default.Home
DeckColumnType.Notifications -> Icons.Default.Notifications
DeckColumnType.Messages -> Icons.Default.Email
DeckColumnType.Search -> Icons.Default.Search
DeckColumnType.Reads -> Icons.AutoMirrored.Filled.Article
DeckColumnType.Bookmarks -> com.vitorpamplona.amethyst.commons.icons.Bookmark
DeckColumnType.GlobalFeed -> Icons.Default.Public
DeckColumnType.MyProfile -> Icons.Default.Person
DeckColumnType.Chess -> Icons.Default.Extension
DeckColumnType.Settings -> Icons.Default.Settings
DeckColumnType.Relays -> Icons.Default.Dns
is DeckColumnType.Article -> Icons.AutoMirrored.Filled.Article
is DeckColumnType.Editor -> Icons.AutoMirrored.Filled.Article
DeckColumnType.Drafts -> Icons.AutoMirrored.Filled.Article
DeckColumnType.MyHighlights -> Icons.AutoMirrored.Filled.Article
is DeckColumnType.Profile -> Icons.Default.Person
is DeckColumnType.Thread -> Icons.AutoMirrored.Filled.Article
is DeckColumnType.Hashtag -> Icons.Default.Tag
DeckColumnType.HomeFeed -> MaterialSymbols.Home
DeckColumnType.Notifications -> MaterialSymbols.Notifications
DeckColumnType.Messages -> MaterialSymbols.Email
DeckColumnType.Search -> MaterialSymbols.Search
DeckColumnType.Reads -> MaterialSymbols.AutoMirrored.Article
DeckColumnType.Bookmarks -> MaterialSymbols.Bookmark
DeckColumnType.GlobalFeed -> MaterialSymbols.Public
DeckColumnType.MyProfile -> MaterialSymbols.Person
DeckColumnType.Chess -> MaterialSymbols.Extension
DeckColumnType.Settings -> MaterialSymbols.Settings
DeckColumnType.Relays -> MaterialSymbols.Dns
is DeckColumnType.Article -> MaterialSymbols.AutoMirrored.Article
is DeckColumnType.Editor -> MaterialSymbols.AutoMirrored.Article
DeckColumnType.Drafts -> MaterialSymbols.AutoMirrored.Article
DeckColumnType.MyHighlights -> MaterialSymbols.AutoMirrored.Article
is DeckColumnType.Profile -> MaterialSymbols.Person
is DeckColumnType.Thread -> MaterialSymbols.AutoMirrored.Article
is DeckColumnType.Hashtag -> MaterialSymbols.Tag
}
@@ -28,9 +28,6 @@ import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -42,6 +39,8 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.vitorpamplona.amethyst.commons.domain.nip46.SignerConnectionState
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.tor.TorServiceStatus
import com.vitorpamplona.amethyst.commons.ui.components.BunkerHeartbeatIndicator
import com.vitorpamplona.amethyst.desktop.ui.tor.TorStatusIndicator
@@ -77,7 +76,7 @@ fun DeckSidebar(
IconButton(onClick = onAddColumn) {
Icon(
Icons.Default.Add,
MaterialSymbols.Add,
contentDescription = "Add Column",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -97,7 +96,7 @@ fun DeckSidebar(
IconButton(onClick = onOpenSettings) {
Icon(
Icons.Default.Settings,
MaterialSymbols.Settings,
contentDescription = "Settings",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -29,8 +29,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Apps
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationRail
@@ -46,6 +44,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.domain.nip46.SignerConnectionState
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.ui.components.BunkerHeartbeatIndicator
import com.vitorpamplona.amethyst.desktop.DesktopScreen
import com.vitorpamplona.amethyst.desktop.account.AccountManager
@@ -131,7 +131,7 @@ fun SinglePaneLayout(
onClick = onOpenAppDrawer,
icon = {
Icon(
Icons.Default.Apps,
MaterialSymbols.Apps,
contentDescription = "App Drawer",
modifier = Modifier.size(22.dp),
)
@@ -20,22 +20,8 @@
*/
package com.vitorpamplona.amethyst.desktop.ui.deck
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Bookmark
import androidx.compose.material.icons.filled.Chat
import androidx.compose.material.icons.filled.Code
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Explore
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.icons.filled.Groups
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.MenuBook
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.SportsEsports
import androidx.compose.material.icons.filled.Star
import androidx.compose.material.icons.filled.Work
import androidx.compose.ui.graphics.vector.ImageVector
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbol
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.LayoutMode
data class Workspace(
@@ -57,25 +43,25 @@ data class Workspace(
}
object WorkspaceIcons {
private val icons: Map<String, ImageVector> =
private val icons: Map<String, MaterialSymbol> =
mapOf(
"Groups" to Icons.Default.Groups,
"Edit" to Icons.Default.Edit,
"MenuBook" to Icons.Default.MenuBook,
"Home" to Icons.Default.Home,
"Chat" to Icons.Default.Chat,
"Search" to Icons.Default.Search,
"SportsEsports" to Icons.Default.SportsEsports,
"Bookmark" to Icons.Default.Bookmark,
"Explore" to Icons.Default.Explore,
"Person" to Icons.Default.Person,
"Star" to Icons.Default.Star,
"Favorite" to Icons.Default.Favorite,
"Work" to Icons.Default.Work,
"Code" to Icons.Default.Code,
"Groups" to MaterialSymbols.Groups,
"Edit" to MaterialSymbols.Edit,
"MenuBook" to MaterialSymbols.MenuBook,
"Home" to MaterialSymbols.Home,
"Chat" to MaterialSymbols.Chat,
"Search" to MaterialSymbols.Search,
"SportsEsports" to MaterialSymbols.SportsEsports,
"Bookmark" to MaterialSymbols.Bookmark,
"Explore" to MaterialSymbols.Explore,
"Person" to MaterialSymbols.Person,
"Star" to MaterialSymbols.Star,
"Favorite" to MaterialSymbols.Favorite,
"Work" to MaterialSymbols.Work,
"Code" to MaterialSymbols.Code,
)
val availableNames: List<String> = icons.keys.sorted()
fun resolve(name: String): ImageVector = icons[name] ?: Icons.Default.Home
fun resolve(name: String): MaterialSymbol = icons[name] ?: MaterialSymbols.Home
}
@@ -28,11 +28,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Lock
import androidx.compose.material.icons.filled.Public
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Icon
@@ -49,6 +44,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.highlights.HighlightData
import com.vitorpamplona.amethyst.desktop.network.DesktopRelayConnectionManager
import com.vitorpamplona.amethyst.desktop.service.highlights.DesktopHighlightStore
@@ -160,7 +157,7 @@ private fun HighlightPanelCard(
) {
// Published status
Icon(
imageVector = if (highlight.published) Icons.Default.Public else Icons.Default.Lock,
symbol = if (highlight.published) MaterialSymbols.Public else MaterialSymbols.Lock,
contentDescription = if (highlight.published) "Published" else "Private",
modifier = Modifier.size(14.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -178,7 +175,7 @@ private fun HighlightPanelCard(
if (onPublish != null) {
IconButton(onClick = onPublish, modifier = Modifier.size(32.dp)) {
Icon(
Icons.Default.Public,
MaterialSymbols.Public,
contentDescription = "Publish to relays",
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.primary,
@@ -188,7 +185,7 @@ private fun HighlightPanelCard(
IconButton(onClick = onEditNote, modifier = Modifier.size(32.dp)) {
Icon(
Icons.Default.Edit,
MaterialSymbols.Edit,
contentDescription = "Edit note",
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -196,7 +193,7 @@ private fun HighlightPanelCard(
}
IconButton(onClick = onDelete, modifier = Modifier.size(32.dp)) {
Icon(
Icons.Default.Delete,
MaterialSymbols.Delete,
contentDescription = "Delete",
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.error,
@@ -32,10 +32,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Lock
import androidx.compose.material.icons.filled.Public
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
@@ -56,6 +52,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.highlights.HighlightData
import com.vitorpamplona.amethyst.commons.ui.components.EmptyState
import com.vitorpamplona.amethyst.desktop.service.highlights.DesktopHighlightStore
@@ -208,7 +206,7 @@ private fun HighlightCard(
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
Icon(
imageVector = if (highlight.published) Icons.Default.Public else Icons.Default.Lock,
symbol = if (highlight.published) MaterialSymbols.Public else MaterialSymbols.Lock,
contentDescription = if (highlight.published) "Published" else "Private",
modifier = Modifier.size(14.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -218,7 +216,7 @@ private fun HighlightCard(
IconButton(onClick = onDelete) {
Icon(
Icons.Default.Delete,
MaterialSymbols.Delete,
contentDescription = "Delete highlight",
tint = MaterialTheme.colorScheme.error,
)
@@ -27,10 +27,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.MusicNote
import androidx.compose.material.icons.filled.Pause
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -43,6 +39,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.service.media.GlobalMediaPlayer
@Composable
@@ -69,7 +67,7 @@ fun AudioPlayer(
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Icon(
Icons.Default.MusicNote,
MaterialSymbols.MusicNote,
contentDescription = null,
modifier = Modifier.size(20.dp),
tint = MaterialTheme.colorScheme.primary,
@@ -86,7 +84,7 @@ fun AudioPlayer(
modifier = Modifier.size(32.dp),
) {
Icon(
if (isPlaying) Icons.Default.Pause else Icons.Default.PlayArrow,
if (isPlaying) MaterialSymbols.Pause else MaterialSymbols.PlayArrow,
contentDescription = if (isPlaying) "Pause" else "Play",
modifier = Modifier.size(20.dp),
)
@@ -38,16 +38,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.ArrowForward
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.ContentCopy
import androidx.compose.material.icons.filled.Error
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.icons.filled.OpenInBrowser
import androidx.compose.material.icons.filled.Save
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
@@ -78,6 +68,8 @@ import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.richtext.RichTextParser
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -350,7 +342,7 @@ fun LightboxOverlay(
is DownloadState.Done -> {
Icon(
Icons.Default.Check,
MaterialSymbols.Check,
contentDescription = null,
tint = Color.White,
modifier = Modifier.size(16.dp),
@@ -365,7 +357,7 @@ fun LightboxOverlay(
is DownloadState.Failed -> {
Icon(
Icons.Default.Error,
MaterialSymbols.Error,
contentDescription = null,
tint = MaterialTheme.colorScheme.onErrorContainer,
modifier = Modifier.size(16.dp),
@@ -412,7 +404,7 @@ fun LightboxOverlay(
modifier = Modifier.align(Alignment.TopStart).padding(8.dp),
) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Close",
tint = Color.White,
modifier = Modifier.size(32.dp),
@@ -443,7 +435,7 @@ fun LightboxOverlay(
modifier = Modifier.align(Alignment.CenterStart).padding(16.dp),
) {
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
MaterialSymbols.AutoMirrored.ArrowBack,
contentDescription = "Previous",
tint = Color.White,
modifier = Modifier.size(48.dp),
@@ -457,7 +449,7 @@ fun LightboxOverlay(
modifier = Modifier.align(Alignment.CenterEnd).padding(16.dp),
) {
Icon(
Icons.AutoMirrored.Filled.ArrowForward,
MaterialSymbols.AutoMirrored.ArrowForward,
contentDescription = "Next",
tint = Color.White,
modifier = Modifier.size(48.dp),
@@ -480,7 +472,7 @@ private fun MoreOptionsMenu(
Box {
IconButton(onClick = onExpandMenu, modifier = Modifier.size(32.dp)) {
Icon(
Icons.Default.MoreVert,
MaterialSymbols.MoreVert,
contentDescription = "More options",
tint = Color.White,
modifier = Modifier.size(20.dp),
@@ -493,7 +485,7 @@ private fun MoreOptionsMenu(
) {
DropdownMenuItem(
text = { Text("Save") },
leadingIcon = { Icon(Icons.Default.Save, contentDescription = null) },
leadingIcon = { Icon(MaterialSymbols.Save, contentDescription = null) },
onClick = {
onDismissMenu()
onSave()
@@ -501,7 +493,7 @@ private fun MoreOptionsMenu(
)
DropdownMenuItem(
text = { Text("Copy URL") },
leadingIcon = { Icon(Icons.Default.ContentCopy, contentDescription = null) },
leadingIcon = { Icon(MaterialSymbols.ContentCopy, contentDescription = null) },
onClick = {
onDismissMenu()
onCopyUrl()
@@ -509,7 +501,7 @@ private fun MoreOptionsMenu(
)
DropdownMenuItem(
text = { Text("Open in Browser") },
leadingIcon = { Icon(Icons.Default.OpenInBrowser, contentDescription = null) },
leadingIcon = { Icon(MaterialSymbols.OpenInBrowser, contentDescription = null) },
onClick = {
onDismissMenu()
onOpenInBrowser()
@@ -30,10 +30,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AttachFile
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.ContentPaste
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator
@@ -46,6 +42,8 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImage
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import java.io.File
@Composable
@@ -63,14 +61,14 @@ fun MediaAttachmentRow(
) {
IconButton(onClick = onAttach) {
Icon(
Icons.Default.AttachFile,
MaterialSymbols.AttachFile,
contentDescription = "Attach media",
tint = MaterialTheme.colorScheme.primary,
)
}
IconButton(onClick = onPaste) {
Icon(
Icons.Default.ContentPaste,
MaterialSymbols.ContentPaste,
contentDescription = "Paste from clipboard",
tint = MaterialTheme.colorScheme.primary,
)
@@ -113,7 +111,7 @@ private fun AttachedFileThumbnail(
)
IconButton(onClick = onRemove, modifier = Modifier.size(20.dp)) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Remove",
tint = MaterialTheme.colorScheme.error,
modifier = Modifier.size(16.dp),
@@ -33,15 +33,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.VolumeOff
import androidx.compose.material.icons.automirrored.filled.VolumeUp
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Fullscreen
import androidx.compose.material.icons.filled.MusicNote
import androidx.compose.material.icons.filled.Pause
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material.icons.filled.Save
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -58,6 +49,8 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.service.media.GlobalMediaPlayer
import kotlinx.coroutines.launch
@@ -107,7 +100,7 @@ fun NowPlayingBar(modifier: Modifier = Modifier) {
)
} else {
Icon(
Icons.Default.MusicNote,
MaterialSymbols.MusicNote,
contentDescription = null,
modifier = Modifier.size(20.dp),
tint = MaterialTheme.colorScheme.primary,
@@ -126,7 +119,7 @@ fun NowPlayingBar(modifier: Modifier = Modifier) {
modifier = Modifier.size(32.dp),
) {
Icon(
if (activeState.isPlaying) Icons.Default.Pause else Icons.Default.PlayArrow,
if (activeState.isPlaying) MaterialSymbols.Pause else MaterialSymbols.PlayArrow,
contentDescription = if (activeState.isPlaying) "Pause" else "Play",
modifier = Modifier.size(20.dp),
)
@@ -185,9 +178,9 @@ fun NowPlayingBar(modifier: Modifier = Modifier) {
) {
Icon(
if (activeState.isMuted) {
Icons.AutoMirrored.Filled.VolumeOff
MaterialSymbols.AutoMirrored.VolumeOff
} else {
Icons.AutoMirrored.Filled.VolumeUp
MaterialSymbols.AutoMirrored.VolumeUp
},
contentDescription = if (activeState.isMuted) "Unmute" else "Mute",
modifier = Modifier.size(16.dp),
@@ -225,7 +218,7 @@ fun NowPlayingBar(modifier: Modifier = Modifier) {
modifier = Modifier.size(24.dp),
) {
Icon(
Icons.Default.Save,
MaterialSymbols.Save,
contentDescription = "Save",
modifier = Modifier.size(16.dp),
)
@@ -238,7 +231,7 @@ fun NowPlayingBar(modifier: Modifier = Modifier) {
modifier = Modifier.size(24.dp),
) {
Icon(
Icons.Default.Fullscreen,
MaterialSymbols.Fullscreen,
contentDescription = "Fullscreen",
modifier = Modifier.size(16.dp),
)
@@ -259,7 +252,7 @@ fun NowPlayingBar(modifier: Modifier = Modifier) {
modifier = Modifier.size(24.dp),
) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Stop",
modifier = Modifier.size(16.dp),
)
@@ -34,13 +34,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.VolumeOff
import androidx.compose.material.icons.automirrored.filled.VolumeUp
import androidx.compose.material.icons.filled.Fullscreen
import androidx.compose.material.icons.filled.FullscreenExit
import androidx.compose.material.icons.filled.Pause
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -59,6 +52,8 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
@Composable
fun VideoControls(
@@ -112,7 +107,7 @@ fun VideoControls(
modifier = Modifier.align(Alignment.Center).size(64.dp),
) {
Icon(
Icons.Default.PlayArrow,
MaterialSymbols.PlayArrow,
contentDescription = "Play",
tint = Color.White,
modifier = Modifier.size(48.dp),
@@ -158,7 +153,7 @@ fun VideoControls(
) {
IconButton(onClick = onPlayPause, modifier = Modifier.size(32.dp)) {
Icon(
if (isPlaying) Icons.Default.Pause else Icons.Default.PlayArrow,
if (isPlaying) MaterialSymbols.Pause else MaterialSymbols.PlayArrow,
contentDescription = if (isPlaying) "Pause" else "Play",
tint = Color.White,
modifier = Modifier.size(20.dp),
@@ -179,9 +174,9 @@ fun VideoControls(
IconButton(onClick = onMuteToggle, modifier = Modifier.size(32.dp)) {
Icon(
if (isMuted) {
Icons.AutoMirrored.Filled.VolumeOff
MaterialSymbols.AutoMirrored.VolumeOff
} else {
Icons.AutoMirrored.Filled.VolumeUp
MaterialSymbols.AutoMirrored.VolumeUp
},
contentDescription = if (isMuted) "Unmute" else "Mute",
tint = Color.White,
@@ -216,9 +211,9 @@ fun VideoControls(
) {
Icon(
if (viewMode == ViewMode.FULLSCREEN) {
Icons.Default.FullscreenExit
MaterialSymbols.FullscreenExit
} else {
Icons.Default.Fullscreen
MaterialSymbols.Fullscreen
},
contentDescription =
if (viewMode == ViewMode.FULLSCREEN) "Exit fullscreen" else "Fullscreen",
@@ -229,7 +224,7 @@ fun VideoControls(
} else if (onFullscreen != null) {
IconButton(onClick = onFullscreen, modifier = Modifier.size(32.dp)) {
Icon(
Icons.Default.Fullscreen,
MaterialSymbols.Fullscreen,
contentDescription = "Fullscreen",
tint = Color.White,
modifier = Modifier.size(20.dp),
@@ -29,9 +29,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -53,6 +50,8 @@ import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.quartz.nip01Core.core.Event
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.displayUrl
@@ -117,7 +116,7 @@ fun BlockedRelayEditor(
if (error == null) newRelayUrl = ""
},
) {
Icon(Icons.Default.Add, contentDescription = "Add relay")
Icon(MaterialSymbols.Add, contentDescription = "Add relay")
}
}
@@ -142,7 +141,7 @@ fun BlockedRelayEditor(
)
IconButton(onClick = { localRelays.remove(url) }, modifier = Modifier.size(28.dp)) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Remove",
modifier = Modifier.size(16.dp),
)
@@ -29,9 +29,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -55,6 +52,8 @@ import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.quartz.nip01Core.core.Event
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.displayUrl
@@ -139,7 +138,7 @@ fun DmRelayEditor(
if (error == null) newRelayUrl = ""
},
) {
Icon(Icons.Default.Add, contentDescription = "Add relay")
Icon(MaterialSymbols.Add, contentDescription = "Add relay")
}
}
@@ -156,7 +155,7 @@ fun DmRelayEditor(
)
IconButton(onClick = { localRelays.remove(url) }, modifier = Modifier.size(28.dp)) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Remove",
modifier = Modifier.size(16.dp),
)
@@ -29,9 +29,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Button
import androidx.compose.material3.FilterChip
import androidx.compose.material3.Icon
@@ -57,6 +54,8 @@ import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.nip65RelayList.Nip65RelayListState
import com.vitorpamplona.amethyst.desktop.network.DefaultRelays
import com.vitorpamplona.quartz.nip01Core.core.Event
@@ -163,7 +162,7 @@ fun Nip65RelayEditor(
if (error == null) newRelayUrl = ""
},
) {
Icon(Icons.Default.Add, contentDescription = "Add relay")
Icon(MaterialSymbols.Add, contentDescription = "Add relay")
}
}
@@ -206,7 +205,7 @@ fun Nip65RelayEditor(
IconButton(onClick = { localRelays.remove(relay) }, modifier = Modifier.size(28.dp)) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Remove",
modifier = Modifier.size(16.dp),
)
@@ -31,9 +31,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ChevronRight
import androidx.compose.material.icons.filled.ExpandMore
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -47,6 +44,8 @@ import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.nip65RelayList.Nip65RelayListState
import com.vitorpamplona.amethyst.desktop.model.DesktopAccountRelays
import com.vitorpamplona.amethyst.desktop.network.DesktopRelayConnectionManager
@@ -185,7 +184,7 @@ private fun CollapsibleSection(
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
if (expanded) Icons.Default.ExpandMore else Icons.Default.ChevronRight,
if (expanded) MaterialSymbols.ExpandMore else MaterialSymbols.ChevronRight,
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -28,10 +28,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Circle
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -50,6 +46,8 @@ import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.displayUrl
@@ -104,7 +102,7 @@ fun RelayListEditor(
if (error == null) newRelayUrl = ""
},
) {
Icon(Icons.Default.Add, contentDescription = "Add relay")
Icon(MaterialSymbols.Add, contentDescription = "Add relay")
}
}
@@ -118,7 +116,7 @@ fun RelayListEditor(
) {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
Icons.Default.Circle,
MaterialSymbols.Circle,
contentDescription = null,
modifier = Modifier.size(8.dp),
tint =
@@ -144,7 +142,7 @@ fun RelayListEditor(
}
IconButton(onClick = { onRemove(url) }, modifier = Modifier.size(28.dp)) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Remove",
modifier = Modifier.size(16.dp),
)
@@ -30,8 +30,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Circle
import androidx.compose.material3.Card
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -42,6 +40,8 @@ import androidx.compose.runtime.produceState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.network.Nip11Fetcher
import com.vitorpamplona.amethyst.desktop.network.RelayMetrics
import com.vitorpamplona.amethyst.desktop.network.RelayStatus
@@ -75,7 +75,7 @@ fun RelayMetricCard(
Row(verticalAlignment = Alignment.CenterVertically) {
// Status indicator
Icon(
Icons.Default.Circle,
MaterialSymbols.Circle,
contentDescription = if (status.connected) "Connected" else "Disconnected",
modifier = Modifier.size(10.dp),
tint =
@@ -30,8 +30,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -45,6 +43,8 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.network.DesktopRelayConnectionManager
import com.vitorpamplona.amethyst.desktop.network.Nip11Fetcher
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
@@ -84,7 +84,7 @@ fun RelayMetricsTab(
relayManager.disconnect()
relayManager.connect()
}) {
Icon(Icons.Default.Refresh, contentDescription = "Reconnect all")
Icon(MaterialSymbols.Refresh, contentDescription = "Reconnect all")
}
}
@@ -26,9 +26,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator
@@ -41,6 +38,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.tor.TorServiceStatus
import com.vitorpamplona.amethyst.desktop.network.RelayStatus
import com.vitorpamplona.amethyst.desktop.ui.tor.LocalTorState
@@ -82,14 +81,14 @@ fun RelayStatusCard(
if (status.connected) {
Icon(
Icons.Default.Check,
MaterialSymbols.Check,
contentDescription = "Connected",
tint = statusColor,
modifier = Modifier.size(20.dp),
)
} else if (status.error != null) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Error",
tint = statusColor,
modifier = Modifier.size(20.dp),
@@ -148,7 +147,7 @@ fun RelayStatusCard(
IconButton(onClick = onRemove) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Remove relay",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -29,9 +29,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -54,6 +51,8 @@ import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.quartz.nip01Core.core.Event
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.displayUrl
@@ -118,7 +117,7 @@ fun SearchRelayEditor(
if (error == null) newRelayUrl = ""
},
) {
Icon(Icons.Default.Add, contentDescription = "Add relay")
Icon(MaterialSymbols.Add, contentDescription = "Add relay")
}
}
@@ -143,7 +142,7 @@ fun SearchRelayEditor(
)
IconButton(onClick = { localRelays.remove(url) }, modifier = Modifier.size(28.dp)) {
Icon(
Icons.Default.Close,
MaterialSymbols.Close,
contentDescription = "Remove",
modifier = Modifier.size(16.dp),
)
@@ -31,9 +31,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.AssistChip
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
@@ -56,6 +53,8 @@ import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.search.ContentPreset
import com.vitorpamplona.amethyst.commons.search.DateUtils
import com.vitorpamplona.amethyst.commons.search.KindRegistry
@@ -215,7 +214,7 @@ private fun AuthorInputField(
)
},
trailingIcon = {
Icon(Icons.Default.Close, contentDescription = "Remove", modifier = Modifier.size(14.dp))
Icon(MaterialSymbols.Close, contentDescription = "Remove", modifier = Modifier.size(14.dp))
},
)
}
@@ -244,7 +243,7 @@ private fun AuthorInputField(
onAuthorAdded(authorInput.trim())
authorInput = ""
}) {
Icon(Icons.Default.Add, contentDescription = "Add author")
Icon(MaterialSymbols.Add, contentDescription = "Add author")
}
}
},
@@ -349,7 +348,7 @@ private fun ChipGroupWithInput(
onClick = { onRemove(item) },
label = { Text("$prefix$item", style = MaterialTheme.typography.bodySmall) },
trailingIcon = {
Icon(Icons.Default.Close, contentDescription = "Remove", modifier = Modifier.size(14.dp))
Icon(MaterialSymbols.Close, contentDescription = "Remove", modifier = Modifier.size(14.dp))
},
)
}
@@ -34,12 +34,6 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Article
import androidx.compose.material.icons.filled.Description
import androidx.compose.material.icons.filled.ExpandMore
import androidx.compose.material.icons.filled.Forum
import androidx.compose.material.icons.filled.Person
import androidx.compose.material3.FilterChip
import androidx.compose.material3.FilterChipDefaults
import androidx.compose.material3.HorizontalDivider
@@ -58,8 +52,10 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbol
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.search.AdvancedSearchBarState
import com.vitorpamplona.amethyst.commons.search.SearchSortOrder
import com.vitorpamplona.amethyst.commons.ui.components.UserSearchCard
@@ -106,7 +102,7 @@ fun SearchResultsList(
SortableHeader(
title = "People",
count = people.size,
icon = Icons.Default.Person,
icon = MaterialSymbols.Person,
options = SearchSortOrder.PEOPLE_OPTIONS,
selected = peopleSortOrder,
onSelect = { state.updatePeopleSortOrder(it) },
@@ -147,7 +143,7 @@ fun SearchResultsList(
SortableHeader(
title = "Notes",
count = textNotes.size,
icon = Icons.Default.Description,
icon = MaterialSymbols.Description,
options = SearchSortOrder.EVENT_OPTIONS,
selected = eventSortOrder,
onSelect = { state.updateEventSortOrder(it) },
@@ -192,7 +188,7 @@ fun SearchResultsList(
SortableHeader(
title = "Articles",
count = articles.size,
icon = Icons.AutoMirrored.Default.Article,
icon = MaterialSymbols.AutoMirrored.Article,
options = SearchSortOrder.EVENT_OPTIONS,
selected = eventSortOrder,
onSelect = { state.updateEventSortOrder(it) },
@@ -234,7 +230,7 @@ fun SearchResultsList(
SortableHeader(
title = "Other",
count = otherNotes.size,
icon = Icons.Default.Forum,
icon = MaterialSymbols.Forum,
options = SearchSortOrder.EVENT_OPTIONS,
selected = eventSortOrder,
onSelect = { state.updateEventSortOrder(it) },
@@ -264,7 +260,7 @@ fun SearchResultsList(
private fun SortableHeader(
title: String,
count: Int,
icon: ImageVector,
icon: MaterialSymbol,
options: List<SearchSortOrder>,
selected: SearchSortOrder,
onSelect: (SearchSortOrder) -> Unit,
@@ -282,7 +278,7 @@ private fun SortableHeader(
modifier = Modifier.clickable(onClick = onToggleCollapse).padding(vertical = 4.dp),
) {
Icon(
Icons.Default.ExpandMore,
MaterialSymbols.ExpandMore,
contentDescription = if (collapsed) "Expand $title" else "Collapse $title",
modifier = Modifier.size(18.dp).rotate(chevronRotation),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
@@ -343,7 +339,7 @@ private fun <T> ExpandableSection(
onClick = { expanded = true },
modifier = Modifier.fillMaxWidth(),
) {
Icon(Icons.Default.ExpandMore, contentDescription = null, modifier = Modifier.size(16.dp))
Icon(MaterialSymbols.ExpandMore, contentDescription = null, modifier = Modifier.size(16.dp))
Text("Show all ${remaining.size} more")
}
}
@@ -32,13 +32,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.filled.CloudDownload
import androidx.compose.material.icons.filled.Error
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.icons.filled.ExpandMore
import androidx.compose.material.icons.filled.HourglassEmpty
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -51,11 +44,13 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.chess.RelaySyncState
import com.vitorpamplona.amethyst.commons.chess.RelaySyncStatus
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbol
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import kotlinx.collections.immutable.ImmutableList
@Composable
@@ -103,7 +98,7 @@ fun SearchSyncBanner(
)
Icon(
imageVector = if (isExpanded) Icons.Default.ExpandLess else Icons.Default.ExpandMore,
symbol = if (isExpanded) MaterialSymbols.ExpandLess else MaterialSymbols.ExpandMore,
contentDescription = if (isExpanded) "Collapse" else "Expand",
tint = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.size(16.dp),
@@ -132,7 +127,7 @@ fun SearchSyncBanner(
modifier = Modifier.fillMaxWidth(),
) {
Icon(
imageVector = relayStatusIcon(relay.status),
symbol = relayStatusIcon(relay.status),
contentDescription = null,
tint = relayStatusColor(relay.status),
modifier = Modifier.size(14.dp),
@@ -159,13 +154,13 @@ fun SearchSyncBanner(
}
}
private fun relayStatusIcon(status: RelaySyncStatus): ImageVector =
private fun relayStatusIcon(status: RelaySyncStatus): MaterialSymbol =
when (status) {
RelaySyncStatus.CONNECTING -> Icons.Default.HourglassEmpty
RelaySyncStatus.WAITING -> Icons.Default.HourglassEmpty
RelaySyncStatus.RECEIVING -> Icons.Default.CloudDownload
RelaySyncStatus.EOSE_RECEIVED -> Icons.Default.CheckCircle
RelaySyncStatus.FAILED -> Icons.Default.Error
RelaySyncStatus.CONNECTING -> MaterialSymbols.HourglassEmpty
RelaySyncStatus.WAITING -> MaterialSymbols.HourglassEmpty
RelaySyncStatus.RECEIVING -> MaterialSymbols.CloudDownload
RelaySyncStatus.EOSE_RECEIVED -> MaterialSymbols.CheckCircle
RelaySyncStatus.FAILED -> MaterialSymbols.Error
}
@Composable
@@ -31,10 +31,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
@@ -64,6 +60,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.desktop.service.media.ServerHealthCheck
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
@@ -173,7 +171,7 @@ fun MediaServerSettings(
},
enabled = newServerUrl.isNotBlank() && isValidServerUrl(newServerUrl.trim()),
) {
Icon(Icons.Default.Add, contentDescription = "Add")
Icon(MaterialSymbols.Add, contentDescription = "Add")
Spacer(Modifier.width(4.dp))
Text("Add")
}
@@ -203,7 +201,7 @@ fun MediaServerSettings(
if (isChecking) {
CircularProgressIndicator(modifier = Modifier.size(16.dp))
} else {
Icon(Icons.Default.Refresh, contentDescription = "Refresh")
Icon(MaterialSymbols.Refresh, contentDescription = "Refresh")
}
Spacer(Modifier.width(4.dp))
Text("Check All")
@@ -295,7 +293,7 @@ private fun ServerRow(
IconButton(onClick = onRefresh) {
Icon(
Icons.Default.Refresh,
MaterialSymbols.Refresh,
contentDescription = "Refresh",
modifier = Modifier.size(18.dp),
)
@@ -303,7 +301,7 @@ private fun ServerRow(
IconButton(onClick = onRemove) {
Icon(
Icons.Default.Delete,
MaterialSymbols.Delete,
contentDescription = "Remove",
modifier = Modifier.size(18.dp),
tint = MaterialTheme.colorScheme.error,
@@ -26,9 +26,6 @@ import androidx.compose.foundation.TooltipPlacement
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Shield
import androidx.compose.material.icons.outlined.Shield
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -40,6 +37,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.tor.TorServiceStatus
/**
@@ -56,19 +55,19 @@ fun TorStatusIndicator(
val (icon, tint, tooltip) =
when (status) {
is TorServiceStatus.Off -> {
Triple(Icons.Outlined.Shield, Color.Gray, "Tor: Off")
Triple(MaterialSymbols.Shield, Color.Gray, "Tor: Off")
}
is TorServiceStatus.Connecting -> {
Triple(Icons.Filled.Shield, Color(0xFFFFB300), "Tor: Connecting...")
Triple(MaterialSymbols.Shield, Color(0xFFFFB300), "Tor: Connecting...")
}
is TorServiceStatus.Active -> {
Triple(Icons.Filled.Shield, Color(0xFF4CAF50), "Tor: Connected")
Triple(MaterialSymbols.Shield, Color(0xFF4CAF50), "Tor: Connected")
}
is TorServiceStatus.Error -> {
Triple(Icons.Outlined.Shield, Color(0xFFF44336), "Tor: ${status.message}")
Triple(MaterialSymbols.Shield, Color(0xFFF44336), "Tor: ${status.message}")
}
}
@@ -91,7 +90,7 @@ fun TorStatusIndicator(
if (onClick != null) {
IconButton(onClick = onClick, modifier = modifier.size(28.dp)) {
Icon(
imageVector = icon,
symbol = icon,
contentDescription = tooltip,
tint = tint,
modifier = Modifier.size(20.dp),
@@ -99,7 +98,7 @@ fun TorStatusIndicator(
}
} else {
Icon(
imageVector = icon,
symbol = icon,
contentDescription = tooltip,
tint = tint,
modifier = modifier.size(20.dp),