From 39ffb0ed4d07e53fe3f7f07c06334395efa7320c Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 11 Jul 2026 01:33:54 +0000 Subject: [PATCH] feat(pow): move composer PoW button before Subject; switch icon to Manufacturing The per-post PoW button on the New Post screen now sits before the Subject/Title toggle instead of last in the options row. Every PoW surface (composer button, note chip, mining banner, settings tile, relay-info minimum-PoW row) switches from the Bolt icon to Manufacturing (gear, U+E726): Bolt is the app's zap/lightning glyph everywhere else, so a Bolt PoW badge next to the zap-split/zapraiser/invoice buttons read as a payment feature. Subset font regenerated for the new codepoint. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01ADb3dez9jPk6QqyQ1rTx4V --- .../amethyst/ui/broadcast/BroadcastBanner.kt | 10 +++++----- .../ui/note/creators/pow/PowOverrideButton.kt | 9 +++++---- .../amethyst/ui/note/elements/DisplayPoW.kt | 2 +- .../loggedIn/home/ShortNotePostScreen.kt | 14 +++++++------- .../loggedIn/relays/RelayInformationScreen.kt | 2 +- .../settings/ComposeSettingsScreen.kt | 2 +- .../font/material_symbols_outlined.ttf | Bin 461232 -> 464004 bytes .../commons/icons/symbols/MaterialSymbols.kt | 1 + 8 files changed, 21 insertions(+), 19 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/broadcast/BroadcastBanner.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/broadcast/BroadcastBanner.kt index 33353938aa..c455211dda 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/broadcast/BroadcastBanner.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/broadcast/BroadcastBanner.kt @@ -161,10 +161,10 @@ private fun MiningContent( miningJobs: ImmutableList, onCancelJob: (String) -> Unit, ) { - // one shared pulse for the bolt — mining has no measurable progress, so + // one shared pulse for the gear — mining has no measurable progress, so // the animation is what says "the app is working right now". val pulse = rememberInfiniteTransition(label = "miningPulse") - val boltAlpha by pulse.animateFloat( + val gearAlpha by pulse.animateFloat( initialValue = 0.35f, targetValue = 1f, animationSpec = @@ -172,7 +172,7 @@ private fun MiningContent( animation = tween(700), repeatMode = RepeatMode.Reverse, ), - label = "boltAlpha", + label = "gearAlpha", ) // 1 Hz clock driving the per-job elapsed labels; only ticks while some @@ -194,9 +194,9 @@ private fun MiningContent( modifier = Modifier.fillMaxWidth(), ) { Icon( - symbol = MaterialSymbols.Bolt, + symbol = MaterialSymbols.Manufacturing, contentDescription = stringRes(R.string.pow_mining_title), - tint = MaterialTheme.colorScheme.primary.copy(alpha = boltAlpha), + tint = MaterialTheme.colorScheme.primary.copy(alpha = gearAlpha), modifier = Modifier.size(18.dp), ) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/creators/pow/PowOverrideButton.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/creators/pow/PowOverrideButton.kt index 3c564e5551..b6274a59b4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/creators/pow/PowOverrideButton.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/creators/pow/PowOverrideButton.kt @@ -52,9 +52,10 @@ val POW_PRESETS = listOf(16, 20, 24, 28) /** * Composer options-row button showing the NIP-13 difficulty this post will be - * mined at: a bolt with the difficulty as a small badge when mining is on, - * a dimmed bolt when off. Tapping opens a menu to raise/lower/disable mining - * for this post only — the account setting is untouched. + * mined at: a manufacturing gear with the difficulty as a small badge when + * mining is on, a dimmed gear when off. Tapping opens a menu to + * raise/lower/disable mining for this post only — the account setting is + * untouched. * * [effectiveDifficulty] is what will actually be used at send time (override * or account default); null/0 means the post publishes without PoW. @@ -80,7 +81,7 @@ fun PowOverrideButton( .width(23.dp), ) { Icon( - symbol = MaterialSymbols.Bolt, + symbol = MaterialSymbols.Manufacturing, contentDescription = stringRes(R.string.pow_settings_title), modifier = Modifier.size(18.dp).align(Alignment.BottomStart), tint = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DisplayPoW.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DisplayPoW.kt index aabe123276..7324d6d65d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DisplayPoW.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DisplayPoW.kt @@ -67,7 +67,7 @@ fun DisplayPoW(pow: Int) { .padding(horizontal = 6.dp, vertical = 1.dp), ) { Icon( - symbol = MaterialSymbols.Bolt, + symbol = MaterialSymbols.Manufacturing, contentDescription = stringRes(R.string.pow_settings_title), tint = MaterialTheme.colorScheme.onSecondaryContainer, modifier = Modifier.size(12.dp), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt index bf79d262e1..534927c0f1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt @@ -834,6 +834,13 @@ private fun BottomRowActions( } } + PowOverrideButton( + effectiveDifficulty = postViewModel.effectivePowDifficulty(), + defaultDifficulty = postViewModel.defaultPowDifficulty(), + isOverridden = postViewModel.powOverride != null, + onSelect = { postViewModel.powOverride = it }, + ) + // A group thread's title is required, so the field is always shown for it — no toggle. if (postViewModel.groupThreadTarget == null) { AddSubjectButton(postViewModel.wantsSubject) { @@ -869,13 +876,6 @@ private fun BottomRowActions( postViewModel.wantsInvoice = !postViewModel.wantsInvoice } } - - PowOverrideButton( - effectiveDifficulty = postViewModel.effectivePowDifficulty(), - defaultDifficulty = postViewModel.defaultPowDifficulty(), - isOverridden = postViewModel.powOverride != null, - onSelect = { postViewModel.powOverride = it }, - ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/RelayInformationScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/RelayInformationScreen.kt index fe5a328677..7544f3900d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/RelayInformationScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/RelayInformationScreen.kt @@ -939,7 +939,7 @@ fun LimitationsCard(lim: Nip11RelayInformation.RelayInformationLimitation) { val minPoW = lim.min_pow_difficulty if (minPoW != null && minPoW > 0) { - InfoRow(MaterialSymbols.Bolt, stringRes(R.string.minimum_pow), stringRes(R.string.amount_in_bits, minPoW)) + InfoRow(MaterialSymbols.Manufacturing, stringRes(R.string.minimum_pow), stringRes(R.string.amount_in_bits, minPoW)) } else { lim.min_prefix?.let { if (it > 0) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/ComposeSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/ComposeSettingsScreen.kt index 3cfb90b687..9c50952229 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/ComposeSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/ComposeSettingsScreen.kt @@ -144,7 +144,7 @@ private fun PowDifficultyTile(accountViewModel: AccountViewModel) { .collectAsStateWithLifecycle() SettingsBlockTile( - icon = MaterialSymbols.Bolt, + icon = MaterialSymbols.Manufacturing, title = stringRes(R.string.pow_difficulty_title), description = stringRes(R.string.pow_difficulty_explainer), ) { diff --git a/commons/src/commonMain/composeResources/font/material_symbols_outlined.ttf b/commons/src/commonMain/composeResources/font/material_symbols_outlined.ttf index 43a1428fc8ca5a7d234ae119bff78612c6c2c864..01bd58472eab53e9922f2ac64092cd463a60370c 100644 GIT binary patch delta 6673 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 delta 3980 zcmZXW3s{t87RS%~e)E0 z)hS1i%o{FgC5r3Ex`w2nX{Iag6J}ls0XvrUUFyd zCjdXxqrELBb78@J{G%HtOvF!@oV?evkLIo!iphNe4kYKG!{TudreVNGpa$*Fot2q2 zs4Uh9aBw;5BXSYwujsw7pe=YEm^=5?r4zqQ>x=gN0K6?Pe`e;Jzg8ay(ALuR+{~r( z*+!Oy*Ob>bFVk=Ctn`ExC$RYM@q~u?`3qmYRli^_!0|Q!ubDNz%ynbU@bW}Iwy37G z_G4a<|6=oa^Z1qHo8v>{)8apiZ%;@|SebAw(VF-{;x9=BNzKV~lK+(wm-0r+k(8Sg zUY<~ws!x3`b#>~=w6SSrX>AijCvKnk?@2FD+B2zba_`Bz(?xnh`quQ;jJ|RZ{O+H| zz-XA}G3=fTSL(4wXqoTO+@4>TX#cFPyz5SE)JmM49#-134}VzW zS-*n&&siy1~Bx$e=+vzR&vx_zv?O z?5hW`m@FoI?`{d8OcpSAn6F#1%rR!O*<#+?qum^7&M=D}J9^~U1CNG#toLs8wg7lP z^d9B&g3kzh?$O@8Rnu(KInx7Eh}Uag*S(TWVCrpbHMV-ae}dRp4&wb<5L>2#*j)#r`V@%TG!O?Lf;h4q#4%)NFz&fSAimCp zFmVxsT`dK19gR2dg19#WL_0eC+YG9@3RE{6sGf&FH8p{1;h&1dYa z3v+iwcVUC{ZZO$qF!yjoxiK&8y)NvgD_T|=Ss029V9@G}>~#a8Vg8Il1=tMQQh)X| zW^+{ZlE{Lp^S#(Rn9q?NB2hm?+d^0+IgX2zv3jCoVI;GYqj4k)b8&<2U~tj7B z`f5u@GEY64ieseOhyjkoux5%`9{)rg)T!=>XW)L_h*pSx8&)c#p2ypF>gA3uk}vV)b;Ed6+LdF6BTY`9})`Q{3LT|XXet)>>kBj zS^2~?wA0jD$@Gr&GibI(cFl&UON&&| zc*nM|!#YIj4XNsnsu4HXU&*oMfmFGmDxjV1?uqEMiPK(mL8N-~-sBi+k;oezvn|}J zqFJE1*q>kRistzt{ErQE)P?bF_m6N?tA|G_zwvgX* z`6GM9a{i7UZv~WE{Txxh@uwV#CEQ(0TFI+v2)u;Toq}dxizD+mnx_YHS8YlOzehzU zuai-!!qRozpHTG%Cu-ZkgD6P%_d5~hj(?wL&>gs|QX;CbrINdn>gH~VR8;l*hz}q% zb)Pd<=-+vW>NsA@ga40DBL|M1wE#6hdn*^Zv}B9lFfD6ufNuQ7ZI+x4>0C zhjwyVn-d*q<4Y)8=pAS1m+$acLi^h#qE_5&=R;@#gY^pSjw{B>)+=WyTZEfLRMP@C zWekO{H7fm46^N=fqY_Sz0Rd9wi>j#s%5hTl3YLf-Uo(Q0Mp}&(}%hg~)hVxk{&h*q}UqEDUT^%4m5`osg;?V9;DnDhmlM zKkY=drUEPo-)Qs**p|CD00P zJ1J2FqDv=r(D`B zK{OYx3Oa=!q7kZCtz&N5=Uv2Hj;07VX`%)$a1-tHxXkmGXgs1SZxKRiz6x}r?m^-T z)pvh@pk`5LLI;XXG@p}^Qbk**4i#U}teZwkM7M~0lt`lR)8izHLsStbR@0LAN|%Vf zJ7%PdbCfY6SBCGLg|N^miu0w4zU+_Xi(k7Tsw?RZycG^r_NQbk`)8_Pr(b>h?}CvvF}=LlWgED=3jeLfIh5^C8hQK${4zD?XB zWULft$xSwS;r7xgS_%GSV zj_ToRA8oBgm9s4llHw2)9}7~OX^@)-N-=H~?Clim!qmC+Fk3KOifP|I8Loaqtt^g} z=sEI_Rc}$U+Q||DIoqPPv}02=l3of5?&s@rCNQP>YH~+#-f() oJft?#`SMOkL~FC-g!&V8d3}>~r2jilH>nwYvA*C(YP!#V0E2|^#Q*>R diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/icons/symbols/MaterialSymbols.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/icons/symbols/MaterialSymbols.kt index 603098e77a..a038c5603d 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/icons/symbols/MaterialSymbols.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/icons/symbols/MaterialSymbols.kt @@ -152,6 +152,7 @@ object MaterialSymbols { val Lock = MaterialSymbol("\uE899") val LockOpen = MaterialSymbol("\uE898") val Mail = MaterialSymbol("\uE159") + val Manufacturing = MaterialSymbol("\uE726") val MenuBook = MaterialSymbol("\uEA19") val Mic = MaterialSymbol("\uE31D") val MicOff = MaterialSymbol("\uE02B")