Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
ce410fb
feat: shared URL-backed flow stepper (useFlowStepper)
jjramirezn Sep 1, 2026
bd7806d
feat: Field — form-field chrome (label + control + helper/error line)
jjramirezn Sep 1, 2026
7950bb6
feat: rebuild withdraw on the URL stepper; scope the flow context to …
jjramirezn Sep 1, 2026
03dfe2f
fix: withdraw stepper riders — manteca honors ?amount=, chain icons, …
jjramirezn Sep 1, 2026
2b8baef
test: retarget withdraw/send/home suites at the URL stepper
jjramirezn Sep 1, 2026
8567bc6
test(shots): fixture coverage for the withdraw amount step and the Fi…
jjramirezn Sep 1, 2026
d42df7a
fix: crypto back-nav returns to the amount step (Chip review)
jjramirezn Sep 1, 2026
192686e
Merge remote-tracking branch 'origin/tech-debt' into feat/TASK-21816-…
jjramirezn Sep 2, 2026
d22eeb1
fix: gate terminal steps on execution proof; revalidate the URL amoun…
jjramirezn Sep 2, 2026
55a7d4d
fix: gate money paths on live balance/limits verdicts (Chip round 3)
jjramirezn Sep 2, 2026
f4e939e
fix: validate crypto URL amounts before records + unfreeze the bank s…
jjramirezn Sep 3, 2026
ebcabe3
fix: enforce per-rail bank minimums at submit; test the Manteca money…
jjramirezn Sep 3, 2026
d5a8708
fix: convert the UK minimum with the GBP rate; ask the live balance a…
jjramirezn Sep 3, 2026
40cf01f
fix: fail-closed URL amount parse for the Manteca seed; pin the crypt…
jjramirezn Sep 3, 2026
96669a1
fix: pin the bank success amount to what executed (Chip round 8)
jjramirezn Sep 3, 2026
26a1958
fix: pin the bank success points; test the existing-account destinati…
jjramirezn Sep 3, 2026
384f88e
fix: carry ?amount= through context-loss recovery + reject non-decima…
jjramirezn Sep 3, 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
4 changes: 3 additions & 1 deletion e2e/shots/fixtures.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,9 @@ for (const [name, fixture] of Object.entries(FIXTURES)) {
await page.clock.setFixedTime(FROZEN_NOW)
await page.addInitScript(seenOnceModals)

await page.goto(`${fixture.route}?${FIXTURE_PARAM}=${name}`, { waitUntil: 'domcontentloaded' })
// A fixture route may carry its own query (deep-linked flow steps).
const sep = fixture.route.includes('?') ? '&' : '?'
await page.goto(`${fixture.route}${sep}${FIXTURE_PARAM}=${name}`, { waitUntil: 'domcontentloaded' })
await settle(page)

// A build without NEXT_PUBLIC_VERCEL_ENV=preview ignores the param and
Expand Down
7 changes: 7 additions & 0 deletions src/app/(mobile-ui)/dev/ds/_components/nav-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ export const SIDEBAR_CONFIG: Record<string, NavItem[]> = {
description: 'Inline field-level error (Body/XS, foreground-error) — flow errors stay Notification',
status: 'production',
},
{
label: 'Field',
icon: 'docs',
href: '/dev/ds/primitives/field',
description: 'Form-field chrome: label + control + helper/error line — error is text only, never borders',
status: 'production',
},
{
label: 'BaseSelect',
icon: 'clip',
Expand Down
70 changes: 70 additions & 0 deletions src/app/(mobile-ui)/dev/ds/primitives/field/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
'use client'

import { useState } from 'react'
import { BaseInput } from '@/components/0_Bruddle/BaseInput'
import { Field } from '@/components/0_Bruddle/Field'
import { DocHeader } from '../../_components/DocHeader'
import { DocSection } from '../../_components/DocSection'
import { DocPage } from '../../_components/DocPage'
import { CodeBlock } from '../../_components/CodeBlock'

export default function FieldPage() {
const [bic, setBic] = useState('NOTABIC')
const bicInvalid = bic.length > 0 && bic.length !== 8 && bic.length !== 11

return (
<DocPage>
<DocHeader
title="Field"
description="Form-field chrome from the form board (17802:61539): label + control + one helper/error line, gap 4. The error is text only and replaces the helper — Field never paints error borders. react-hook-form owns the state; wrap the control in a Controller."
status="production"
/>

<DocSection title="Label + helper">
<DocSection.Content>
<Field label="IBAN" htmlFor="ds-field-iban" helper="The account you withdraw to.">
<BaseInput id="ds-field-iban" placeholder="DE89 3704 0044 0532 0130 00" />
</Field>
</DocSection.Content>
<DocSection.Code>
<CodeBlock
label="Field"
code={`import { Field } from '@/components/0_Bruddle/Field'

<Field label="IBAN" htmlFor="iban" helper="The account you withdraw to.">
<BaseInput id="iban" ... />
</Field>`}
/>
</DocSection.Code>
</DocSection>

<DocSection title="Error replaces helper (text only, no borders)">
<DocSection.Content>
<Field
label="BIC"
htmlFor="ds-field-bic"
helper="8 or 11 characters"
error={bicInvalid ? 'A BIC has 8 or 11 characters.' : undefined}
>
<BaseInput id="ds-field-bic" value={bic} onChange={(e) => setBic(e.target.value)} />
</Field>
</DocSection.Content>
<DocSection.Code>
<CodeBlock
label="With react-hook-form"
code={`<Controller
name="bic"
control={control}
rules={{ validate: ... }}
render={({ field, fieldState }) => (
<Field label="BIC" htmlFor="bic" error={fieldState.error?.message}>
<BaseInput id="bic" {...field} />
</Field>
)}
/>`}
/>
</DocSection.Code>
</DocSection>
</DocPage>
)
}
2 changes: 1 addition & 1 deletion src/app/(mobile-ui)/recover-funds/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { fetchWalletBalances } from '@/services/tokens-price'
import { PEANUT_WALLET_CHAIN, PEANUT_WALLET_TOKEN } from '@/constants/zerodev.consts'
import { nativeCurrencyAddresses } from '@/constants/general.consts'
import { areEvmAddressesEqual, isTxReverted, getExplorerUrl, getChainName, getTokenLogo } from '@/utils/general.utils'
import { type RecipientState } from '@/context/WithdrawFlowContext'
import { type RecipientState } from '@/components/Global/GeneralRecipientInput/types'
import GeneralRecipientInput, { type GeneralRecipientUpdate } from '@/components/Global/GeneralRecipientInput'
import { Button } from '@/components/0_Bruddle/Button'
import Card from '@/components/Global/Card'
Expand Down
Loading
Loading