Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
1ba3f4e
fix: default mint selection, add new mint bottom sheet.
swedishfrenchpress Mar 19, 2026
cf9701a
fix: onboarding screen TOS bottom sheet replacement, TOS font style e…
swedishfrenchpress Mar 19, 2026
cf9f0b6
fix: fix: expand star tap target to 44x44dp with 10dp padding for rel…
swedishfrenchpress Mar 19, 2026
58fb192
fix: + New Mint copy.
swedishfrenchpress Mar 19, 2026
39a9b96
feat: added function to have any mint manually added by user replace …
swedishfrenchpress Mar 19, 2026
c3ac93c
unsure of this commit.
swedishfrenchpress Mar 20, 2026
dfc8316
fix: rename withdraw screen title and hide config sections when toggl…
swedishfrenchpress Mar 21, 2026
57704c0
fix: disabled primary buttons nearly invisible in both light and dark…
swedishfrenchpress Mar 21, 2026
f2d4785
fix: withdraw screens background color inconsistent with rest of app
swedishfrenchpress Mar 21, 2026
6f4d75e
fix: withdraw screen section headers use wrong font weight and letter…
swedishfrenchpress Mar 21, 2026
1b5b2b7
fix: differentiate auto-withdraw and withdraw now icons
swedishfrenchpress Mar 21, 2026
dc99f41
fix: hero card gradient too strong, add decorative lightning bolt wat…
swedishfrenchpress Mar 21, 2026
645b472
fix: hero card lightning bolt positioning, rotation, fade, and opacity
swedishfrenchpress Mar 21, 2026
b98914d
fix: rename hero title to Auto-Withdraw and add lightning strike anim…
swedishfrenchpress Mar 21, 2026
d563d4f
fix: tone down lightning animation and remove address label icon
swedishfrenchpress Mar 21, 2026
b03a80f
fix: remove dark mode visual inconsistencies on withdraw screen
swedishfrenchpress Mar 21, 2026
d9bfa9f
fix: remove icon from mint selection bottom sheet
swedishfrenchpress Mar 21, 2026
8db4063
fix: polish withdraw now screen for consistency
swedishfrenchpress Mar 21, 2026
21c0c7a
fix: redesign withdraw now inputs and add fiat balance display
swedishfrenchpress Mar 21, 2026
6e624a3
fix: cashu section spacing, rename amount label, add scan icon
swedishfrenchpress Mar 21, 2026
4a404e7
fix: match withdraw toggle to payment request screen's segmented control
swedishfrenchpress Mar 21, 2026
0b380c6
fix: match withdraw history icons to activity screen and clean up sty…
swedishfrenchpress Mar 21, 2026
19658b3
fix: unify recent activity fonts with withdraw screen's own typography
swedishfrenchpress Mar 21, 2026
9647d8d
fix: match recent activity icon size to other withdraw screen icons
swedishfrenchpress Mar 21, 2026
d597f25
fix: title bar dividers, font sizes, and bottom sheet typography
swedishfrenchpress Mar 22, 2026
db404bd
fix: scan invoice button border and height consistency
swedishfrenchpress Mar 22, 2026
2a3aa10
fix: confirm withdrawal screen consistency with withdraw flow
swedishfrenchpress Mar 22, 2026
6b7ff29
fix: extend entrance animation to Recent Activity section
swedishfrenchpress Mar 22, 2026
50a8936
fix: hero card gradient reflects active/inactive state, orange slider
swedishfrenchpress Mar 22, 2026
34e7775
fix: auto-withdraw row icon reflects toggle state
swedishfrenchpress Mar 22, 2026
aef9fc2
fix: revert splash screen changes, isolate mints page work only
swedishfrenchpress Mar 22, 2026
c8befd5
fix: align button and bottom sheet styles with withdraw branch design…
swedishfrenchpress Mar 22, 2026
3aca4c3
feat: redesign default mint section as hero card, remove setup chevrons
swedishfrenchpress Mar 22, 2026
14a5e2e
fix: remove stale onboarding tests referencing old layout views
swedishfrenchpress Mar 22, 2026
95969c8
fix: use dark primary color for mint selection checkmarks instead of …
swedishfrenchpress Mar 22, 2026
7d406a9
fix: left-align default mint hero card content
swedishfrenchpress Mar 22, 2026
3324e48
fix: big ui updates.
swedishfrenchpress Mar 22, 2026
b4dbc64
Merge remote-tracking branch 'origin/fix/onboarding-ui-mint-selection…
swedishfrenchpress Mar 22, 2026
c421454
fix:build error.
swedishfrenchpress Mar 22, 2026
d7f24e6
Merge remote-tracking branch 'origin/fix/onboarding-ui-mint-selection…
swedishfrenchpress Mar 23, 2026
02038f3
feat: app-wide UI refresh for Settings, Items, Basket, and Withdraw s…
swedishfrenchpress Mar 23, 2026
4b7fa42
fix: UI consistency pass — remove circles, neutral selection colors, …
swedishfrenchpress Mar 23, 2026
2adbeae
fix: simplify auto-withdraw hero card and remove hero card borders
swedishfrenchpress Mar 23, 2026
298a910
fix: subtitle contrast, Mints cleanup, toggle colors, Enter Wallet bu…
swedishfrenchpress Mar 23, 2026
b976fbb
fix: remove entrance animations, fix padding/fonts, redesign Mint Det…
swedishfrenchpress Mar 23, 2026
abdaf4f
fix: withdraw animation, security reorder, toggle colors, screen rede…
swedishfrenchpress Mar 23, 2026
1bcd95a
fix: withdraw row padding — remove double 20dp stacking
swedishfrenchpress Mar 23, 2026
ad6bed0
feat: shared empty state component, remove Settings subtitles, dedupe…
swedishfrenchpress Mar 23, 2026
d144c7d
Merge remote-tracking branch 'origin/main' into feat/app-ui-refresh
swedishfrenchpress Mar 26, 2026
be27c2c
chore: add Gradle toolchain config and UI refresh design reference
swedishfrenchpress Mar 26, 2026
d2812a5
feat: redesign wallet setup screen with teaser card and explainer ove…
swedishfrenchpress Mar 26, 2026
c521aab
fix: filter unreachable mints from onboarding defaults
swedishfrenchpress Mar 26, 2026
fd55a06
fix: dark navy setup screen, gradient blend, explainer polish
swedishfrenchpress Mar 26, 2026
8ae6474
feat: premium tap-to-pay illustration for teaser card
swedishfrenchpress Mar 26, 2026
3600431
feat: native illustrations for explainer slides 1 and 2
swedishfrenchpress Mar 27, 2026
759de97
feat: unified dark navy onboarding design system
swedishfrenchpress Mar 27, 2026
fee2016
fix: unify navy color, restore emoji circle, polish onboarding UX
swedishfrenchpress Mar 27, 2026
2f50b5f
fix: green teaser card, remove gradient, fix phone clipping, hero car…
swedishfrenchpress Mar 27, 2026
6e8073e
fix: remove bolt fade overlay, remove option subtitles
swedishfrenchpress Mar 27, 2026
a55c2a1
fix: teaser card polish, static image, copy updates, small screen scroll
swedishfrenchpress Mar 27, 2026
1f2084f
feat: real phone images on Tap to Get Paid explainer slide
swedishfrenchpress Mar 27, 2026
eb82649
fix: shrink teaser section, update image, fix clipping
swedishfrenchpress Mar 27, 2026
21e048e
feat: animated auto-custody banners, tappable chevrons, chevron on sl…
swedishfrenchpress Mar 27, 2026
ad2322e
feat: new Zero Fees floating percentages animation, smooth card cross…
swedishfrenchpress Mar 27, 2026
7170148
feat: individual fee slashing + banner dismiss cycling
swedishfrenchpress Mar 27, 2026
107dd39
fix: rewrite auto-custody banner animation to eliminate flashing
swedishfrenchpress Mar 27, 2026
efd95de
fix: restore ZeroFeesIllustration animation trigger with onAttachedTo…
swedishfrenchpress Mar 27, 2026
26e97da
fix: Zero Fees animation timing — hold fees visible, delay 0% until a…
swedishfrenchpress Mar 27, 2026
f945e32
feat: redesign wallet setup CTA hierarchy with primary/secondary buttons
swedishfrenchpress Mar 27, 2026
9551833
fix: explainer edge-to-edge + Zero Fees animation replay on re-visit
swedishfrenchpress Mar 27, 2026
ce78162
fix: auto-custody animation replay on re-visit, larger white close bu…
swedishfrenchpress Mar 27, 2026
0d6f5f2
chore: PR review cleanup — dead code, deprecated APIs, animation safety
swedishfrenchpress Mar 27, 2026
4a1197e
chore: remove dev artifact docs added on this branch
swedishfrenchpress Mar 27, 2026
15de410
fix: remove icons from wallet setup buttons, title case Restore From …
swedishfrenchpress Mar 27, 2026
a551d43
feat: ambient green color fill on NUMO wordmark after welcome loads
swedishfrenchpress Mar 27, 2026
c0fa094
ob fixes.
swedishfrenchpress Mar 27, 2026
3d63c04
fix: remove stray characters causing build error in MintsSettingsActi…
swedishfrenchpress Mar 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions .goosehints

This file was deleted.

1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ dependencies {
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.gridlayout:gridlayout:1.0.0")
implementation("androidx.viewpager2:viewpager2:1.0.0")
implementation("androidx.navigation:navigation-fragment-ktx:2.7.6")
implementation("androidx.navigation:navigation-ui-ktx:2.7.6")

Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.electricdreams.numo.R
import com.electricdreams.numo.ui.components.EmptyStateHelper

/**
* Settings activity for configuring preset basket names.
Expand All @@ -30,7 +31,7 @@ class BasketNamesSettingsActivity : AppCompatActivity() {
private lateinit var namesHeader: TextView
private lateinit var namesCard: LinearLayout
private lateinit var namesList: LinearLayout
private lateinit var emptyState: LinearLayout
private lateinit var emptyState: View
private lateinit var addNameButton: View
private lateinit var clearAllButton: View

Expand Down Expand Up @@ -74,7 +75,15 @@ class BasketNamesSettingsActivity : AppCompatActivity() {
namesHeader.visibility = View.GONE
namesCard.visibility = View.GONE
emptyState.visibility = View.VISIBLE
EmptyStateHelper.bind(
emptyState,
R.drawable.ic_label,
getString(R.string.basket_names_settings_empty_title),
getString(R.string.basket_names_settings_empty_subtitle),
"+ Add Name"
) { showAddNameDialog() }
clearAllButton.visibility = View.GONE
addNameButton.visibility = View.GONE
} else {
// Show names list
namesHeader.visibility = View.VISIBLE
Expand All @@ -94,10 +103,10 @@ class BasketNamesSettingsActivity : AppCompatActivity() {
addDivider()
}
}

// Show add button only when items exist and can add more
addNameButton.visibility = if (basketNamesManager.canAddMore()) View.VISIBLE else View.GONE
}

// Update add button visibility
addNameButton.visibility = if (basketNamesManager.canAddMore()) View.VISIBLE else View.GONE
}

private fun bindNameItem(view: View, index: Int, name: String, totalCount: Int) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.electricdreams.numo.core.model.Amount
import com.electricdreams.numo.core.util.CurrencyManager
import com.electricdreams.numo.core.worker.BitcoinPriceWorker
import com.electricdreams.numo.databinding.ActivityHistoryBinding
import com.electricdreams.numo.ui.components.EmptyStateHelper
import com.electricdreams.numo.feature.autowithdraw.AutoWithdrawManager
import com.electricdreams.numo.feature.autowithdraw.WithdrawHistoryEntry
import com.electricdreams.numo.payment.PaymentIntentFactory
Expand Down Expand Up @@ -349,7 +350,15 @@ class PaymentsHistoryActivity : AppCompatActivity() {
adapter.setEntries(currentHistoryList)

val isEmpty = currentHistoryList.isEmpty()
binding.emptyView.visibility = if (isEmpty) View.VISIBLE else View.GONE
binding.emptyView.root.visibility = if (isEmpty) View.VISIBLE else View.GONE
if (isEmpty) {
EmptyStateHelper.bind(
binding.emptyView.root,
R.drawable.ic_receipt,
"No Payments Yet",
"Payment history will appear here once you start accepting payments"
)
}
}

private fun clearAllHistory() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.electricdreams.numo.feature.enableEdgeToEdgeWithPill
import com.electricdreams.numo.R
import com.electricdreams.numo.ui.components.EmptyStateHelper
import com.electricdreams.numo.core.data.model.TokenHistoryEntry
import com.electricdreams.numo.databinding.ActivityHistoryBinding
import com.electricdreams.numo.ui.adapter.TokenHistoryAdapter
Expand Down Expand Up @@ -59,7 +60,15 @@ class TokenHistoryActivity : AppCompatActivity() {
adapter.setEntries(history)

val isEmpty = history.isEmpty()
binding.emptyView.visibility = if (isEmpty) View.VISIBLE else View.GONE
binding.emptyView.root.visibility = if (isEmpty) View.VISIBLE else View.GONE
if (isEmpty) {
EmptyStateHelper.bind(
binding.emptyView.root,
R.drawable.ic_receipt,
"No Tokens Yet",
"Cashu token history will appear here"
)
}
}

private fun showClearHistoryConfirmation() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ class ItemListActivity : AppCompatActivity() {
private lateinit var bottomActions: LinearLayout
private lateinit var fabAddItem: ImageButton
private lateinit var doneReorderButton: ImageButton
private lateinit var headerDivider: View
private lateinit var topBar: View
private lateinit var adapter: ItemAdapter
private lateinit var itemTouchHelper: ItemTouchHelper
Expand Down Expand Up @@ -111,7 +110,6 @@ class ItemListActivity : AppCompatActivity() {
bottomActions = findViewById(R.id.bottom_actions)
fabAddItem = findViewById(R.id.fab_add_item)
doneReorderButton = findViewById(R.id.done_reorder_button)
headerDivider = findViewById(R.id.header_divider)
topBar = findViewById(R.id.top_bar)
val importCsvButton: Button = findViewById(R.id.import_csv_button)
val exportCsvButton: Button = findViewById(R.id.export_csv_button)
Expand Down Expand Up @@ -209,7 +207,6 @@ class ItemListActivity : AppCompatActivity() {
emptyView.visibility = View.GONE
itemsContent.visibility = View.VISIBLE
fabAddItem.visibility = View.VISIBLE
headerDivider.visibility = View.VISIBLE
topBar.visibility = View.VISIBLE
topBar.setBackgroundResource(R.color.color_bg_white)

Expand All @@ -223,7 +220,6 @@ class ItemListActivity : AppCompatActivity() {
emptyView.visibility = View.VISIBLE
itemsContent.visibility = View.GONE
fabAddItem.visibility = View.GONE
headerDivider.visibility = View.GONE
topBar.visibility = View.GONE

// Set navigation bar to match empty state background
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package com.electricdreams.numo.feature.onboarding

import android.app.Dialog
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.EditText
import android.widget.Button
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.core.content.ContextCompat
import com.electricdreams.numo.R
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment

class AddMintBottomSheet : BottomSheetDialogFragment() {

interface Listener {
fun onAddMintUrl(url: String)
fun onScanQrCode()
}

private var listener: Listener? = null

companion object {
fun newInstance(listener: Listener): AddMintBottomSheet {
return AddMintBottomSheet().apply {
this.listener = listener
}
}
}

override fun getTheme(): Int = R.style.Theme_Numo_BottomSheet

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
dialog.window?.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
)
dialog.window?.navigationBarColor = android.graphics.Color.parseColor("#0A2540")
return dialog
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.bottom_sheet_add_mint, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

val urlInput = view.findViewById<EditText>(R.id.mint_url_input)
val addButton = view.findViewById<Button>(R.id.add_mint_button)
val scanRow = view.findViewById<View>(R.id.scan_qr_button)

urlInput.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {
val hasText = s?.toString()?.trim()?.isNotEmpty() == true
addButton.isEnabled = hasText
}
})

addButton.setOnClickListener {
val url = urlInput.text.toString().trim()
if (url.isNotEmpty()) {
listener?.onAddMintUrl(url)
}
}

scanRow.setOnClickListener {
listener?.onScanQrCode()
}

setupBottomSheetBehavior()
}

fun setLoading(loading: Boolean) {
val view = view ?: return
val addButton = view.findViewById<Button>(R.id.add_mint_button)
val loadingContainer = view.findViewById<LinearLayout>(R.id.add_mint_loading)
val urlInput = view.findViewById<EditText>(R.id.mint_url_input)

if (loading) {
addButton.visibility = View.INVISIBLE
loadingContainer.visibility = View.VISIBLE
urlInput.isEnabled = false
} else {
addButton.visibility = View.VISIBLE
loadingContainer.visibility = View.GONE
urlInput.isEnabled = true
}
}

private fun setupBottomSheetBehavior() {
dialog?.setOnShowListener { dialogInterface ->
val bottomSheetDialog = dialogInterface as BottomSheetDialog
val bottomSheet = bottomSheetDialog.findViewById<FrameLayout>(
com.google.android.material.R.id.design_bottom_sheet
)
bottomSheet?.let { sheet ->
sheet.setBackgroundColor(
android.graphics.Color.parseColor("#0A2540")
)
val behavior = BottomSheetBehavior.from(sheet)
behavior.state = BottomSheetBehavior.STATE_EXPANDED
behavior.skipCollapsed = true
behavior.isDraggable = true
}
}
}
}
Loading
Loading