feat: add remaining components (EnterAmount, Converter, Transaction, TopIntro)#5
Conversation
… TopIntro, Transaction) Final migration PR — brings the rest of the library across: - CoinSelector, NumericKeyboardView, ReceiveEstimateView - EnterAmount suite (CurrencyOption, DashBalanceView, DashPickerView, DualSwapAmountView, EnterAmountView, SwapAmountView) - ConverterCard suite (ConverterArrowBadge, ConverterCard, ConverterCardItem, ConverterCardRow) - TopIntro/TopIntroView, Transaction/TransactionView - Foundation: DashTextStyle + Font (caption1Medium) - assets: arrow-down, diagonal-up-down, stopwatch, Transactions/, text-field-qr dark variant iOS 14 compatibility fixes applied during migration: - replaced iOS 16+ .rect(cornerRadius:) / .contentShape(.rect) with RoundedRectangle(...,style:.continuous) / Rectangle() (CoinSelector, DashPickerView, ConverterCardRow, TransactionView) - added missing @available(iOS 14, macOS 11, *) to ReceiveEstimateView, CurrencyOption, TopIntroView and their preview scaffolding
📝 WalkthroughWalkthroughThis PR adds reusable DashUIKit SwiftUI components for amount entry, currency conversion, coin selection, transactions, receive estimates, numeric input, and introductory content, plus typography tokens, image asset manifests, repository guidance, component documentation, and numeric keyboard tests. ChangesAmount Entry and Dual-Swap Flow
Input Controls and Receive Feedback
Converter Card
Display Components
Asset Catalogs
Documentation and Guidance
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant EnterAmountView
participant DualSwapAmountView
participant SwapAmountView
participant DualInputTypeSwitcher
EnterAmountView->>DualSwapAmountView: render dual amounts and currencies
DualSwapAmountView->>SwapAmountView: provide swap animation and callbacks
DualSwapAmountView->>DualInputTypeSwitcher: provide currency codes and selection
DualSwapAmountView->>EnterAmountView: invoke swap or input-type callback
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Migrate the remaining non-code files: the per-component reference under docs/ (linked from README) and the library development guide (iOS 14 constraint, conventions).
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (8)
Sources/DashUIKit/Components/TopIntro/TopIntroView.swift (1)
34-54: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueFormat
MARKcomments correctly.SwiftLint flags that
MARKcomments should be formatted with a space after//and optionally-for better IDE integration and readability.🧹 Proposed formatting fix
- //MARK: Title + // MARK: - Title Text(title) .dashFont(.title1) .foregroundColor(Color.dash.primaryText) - //MARK: Main description + // MARK: - Main description if let mainDescription { Text(mainDescription) .dashFont(.subhead) .foregroundColor(Color.dash.primaryText) } - //MARK: Secondary description + // MARK: - Secondary description if let secondaryDescription {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DashUIKit/Components/TopIntro/TopIntroView.swift` around lines 34 - 54, Update the section comments in the TopIntroView body around the title and description blocks to use SwiftLint-compliant MARK formatting, adding the required space after the comment delimiter and preserving the existing section labels.Source: Linters/SAST tools
Sources/DashUIKit/Components/Transaction/TransactionView.swift (1)
115-140: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueFix spacing and consider consolidating duplicate offsets.
There is a missing space after the comma in
.offset(x: 3,y: 3). Additionally, note thatsecondaryBadgealso applies its own internal offset usingLayout.badgeRing. If the cumulative visual shift of 5 points was intended, consider combining these into a single.offsetmodifier for better clarity.🧹 Proposed formatting fix
.overlay( secondaryBadge - .offset(x: 3,y: 3), + .offset(x: 3, y: 3), alignment: .bottomTrailing )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DashUIKit/Components/Transaction/TransactionView.swift` around lines 115 - 140, Update the offset modifiers in iconWrap and secondaryBadge: fix the spacing in the alignment offset and consolidate the two badge offsets into one modifier with the intended cumulative visual shift, removing the redundant offset while preserving the badge’s placement.Sources/DashUIKit/Components/EnterAmount/SwapAmountView.swift (2)
227-239: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
displayAmount/displaySecondarynormalisation duplicated betweenSwapAmountViewandAnimatedSwapLayout.Identical bare-decimal normalisation logic exists in both types. Extracting a shared static helper (e.g. a free function or
SwapAmountView-scoped static func) would keep the display rule in one place.Also applies to: 437-447
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DashUIKit/Components/EnterAmount/SwapAmountView.swift` around lines 227 - 239, Extract the duplicated bare-decimal normalization from displayAmount and displaySecondary into one shared helper accessible by both SwapAmountView and AnimatedSwapLayout. Replace each local implementation with that helper while preserving the existing empty-string and leading "."/"," behavior.
202-219: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUnused
secondaryAmountView— dead code duplicatingAnimatedSwapLayout.rowContent.
secondaryAmountViewis never called;staticBodyrenderssecondaryTextas plainText, and the animated path uses its ownrowContenthelper. This duplicates symbol/logo rendering logic that could silently drift fromrowContent.♻️ Suggested cleanup
- private func secondaryAmountView(font: Font, dashSize: CGSize? = nil) -> some View { - HStack(spacing: 4) { - if let sym = secondarySymbol, !sym.isEmpty { - Text(sym) - .font(font) - } - - Text(displaySecondary) - .font(font) - - if showSecondaryDashLogo { - Image(dash: .custom("enter-amount-dash", bundle: .dashUIKit)) - .resizable() - .scaledToFit() - .frame(width: dashSize?.width, height: dashSize?.height) - } - } - } -🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DashUIKit/Components/EnterAmount/SwapAmountView.swift` around lines 202 - 219, Remove the unused secondaryAmountView method from SwapAmountView, since staticBody and the animated layout do not call it and rowContent already owns the secondary symbol/logo rendering. Leave the existing secondaryText and AnimatedSwapLayout behavior unchanged.Sources/DashUIKit/Components/ConverterCard/ConverterArrowBadge.swift (1)
32-48: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winSwap button tap target (35x35pt) is below the recommended 44x44pt minimum, and lacks an accessibility label.
Both are easy, high-value fixes for a control that drives the converter swap action.
♻️ Suggested fix
Button { withAnimation(.spring(response: 0.35, dampingFraction: 0.82)) { rotation += 180 } onSwap() } label: { badge(iconName: "diagonal-up-down", iconRotation: rotation) } .buttonStyle(.plain) + .accessibilityLabel(Text("Swap", bundle: .module)) + .contentShape(Rectangle().inset(by: -4.5)) // pads 35x35 up toward ~44x44 } else { badge(iconName: "arrow-down", iconRotation: 0) }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DashUIKit/Components/ConverterCard/ConverterArrowBadge.swift` around lines 32 - 48, Update the swap Button in ConverterArrowBadge.body to provide at least a 44×44pt tappable frame and add an accessibility label describing the swap action. Keep the existing animation, onSwap callback, icon, and plain button style unchanged; the non-button badge should remain unaffected.Sources/DashUIKit/Components/ReceiveEstimateView.swift (1)
72-86: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winCenter-align multiline text to maintain layout symmetry.
Since the parent
VStackcenters its contents, iferrorMessageoramountwrap to a second line (e.g. on small screens or with long localized strings), they will default to leading alignment within their own bounds. Applying.multilineTextAlignment(.center)ensures the text remains symmetrically aligned.✨ Proposed alignment fix
} else if let errorMessage { // An error (e.g. insufficient balance) supersedes the receive estimate — both can // be set at once, so show the error first. Text(errorMessage) .dashFont(.caption1) .foregroundColor(Color.dash.errorText) + .multilineTextAlignment(.center) } else if let amount { Text(title) .dashFont(.caption1) .foregroundColor(Color.dash.tertiaryText) + .multilineTextAlignment(.center) Text(amountText(amount)) .dashFont(.subhead) .foregroundColor(Color.dash.primaryText) + .multilineTextAlignment(.center) }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DashUIKit/Components/ReceiveEstimateView.swift` around lines 72 - 86, Update the Text views in the errorMessage and amount branches of ReceiveEstimateView to apply centered multiline text alignment, including the title and formatted amount, so wrapped localized content remains symmetric within the parent VStack.Sources/DashUIKit/Components/ConverterCard/ConverterCard.swift (1)
60-60: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAnimate structural changes for both source and destination.
Binding the animation solely to
fromItem.idmeans that if only the destination changes (e.g., the user selects a new receive currency without swapping), the card's height and layout will snap abruptly instead of animating.Track both IDs so that any structural change to either row triggers the layout animation.
✨ Proposed fix to the animation value
- .animation(.spring(response: 0.35, dampingFraction: 0.82), value: fromItem.id) + .animation(.spring(response: 0.35, dampingFraction: 0.82), value: [fromItem.id, toItem.id])🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DashUIKit/Components/ConverterCard/ConverterCard.swift` at line 60, Update the animation modifier in ConverterCard to track both the source and destination item IDs, ensuring structural changes to either row animate the card’s layout. Replace the single fromItem.id animation value with a combined value that changes when either item changes.Sources/DashUIKit/Components/NumericKeyboardView.swift (1)
158-167: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winDisable the empty placeholder key to prevent tap highlights.
The empty cell in the bottom-left corner of the keyboard renders an invisible button. When tapped, it will still show a standard button press highlight. Disabling it when
key.isEmptyprevents this unintended interactive feedback.✨ Proposed fix to disable the empty key
private func keyButtonView(_ key: String) -> some View { Button { handleKeyPress(key) } label: { keyContentView(key) } .frame(height: 50) .frame(maxWidth: .infinity) - .disabled(inProgress) + .disabled(inProgress || key.isEmpty) }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DashUIKit/Components/NumericKeyboardView.swift` around lines 158 - 167, Update keyButtonView to disable the button when either inProgress is true or key.isEmpty is true, preventing the invisible placeholder key from producing tap highlights while preserving existing behavior for active keys.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Sources/DashUIKit/Components/EnterAmount/SwapAmountView.swift`:
- Around line 383-411: The isPrimaryLarge change handler schedules delayed
animations that can execute with stale newValue after a subsequent toggle.
Update the onChange handler and its async callbacks to cancel or guard prior
work using a generation/token or equivalent current-state check, ensuring stale
scale and offset animations cannot mutate scaleA, scaleB, or offsetPrimary after
a newer toggle.
- Around line 452-475: The documentation for dashPasteContextMenu incorrectly
claims the helper checks for clipboard strings. Either implement that clipboard
guard within dashPasteContextMenu before invoking onPaste, or revise the doc
comment to state that clipboard validation is handled by the caller; keep the
existing long-press behavior otherwise unchanged.
---
Nitpick comments:
In `@Sources/DashUIKit/Components/ConverterCard/ConverterArrowBadge.swift`:
- Around line 32-48: Update the swap Button in ConverterArrowBadge.body to
provide at least a 44×44pt tappable frame and add an accessibility label
describing the swap action. Keep the existing animation, onSwap callback, icon,
and plain button style unchanged; the non-button badge should remain unaffected.
In `@Sources/DashUIKit/Components/ConverterCard/ConverterCard.swift`:
- Line 60: Update the animation modifier in ConverterCard to track both the
source and destination item IDs, ensuring structural changes to either row
animate the card’s layout. Replace the single fromItem.id animation value with a
combined value that changes when either item changes.
In `@Sources/DashUIKit/Components/EnterAmount/SwapAmountView.swift`:
- Around line 227-239: Extract the duplicated bare-decimal normalization from
displayAmount and displaySecondary into one shared helper accessible by both
SwapAmountView and AnimatedSwapLayout. Replace each local implementation with
that helper while preserving the existing empty-string and leading "."/","
behavior.
- Around line 202-219: Remove the unused secondaryAmountView method from
SwapAmountView, since staticBody and the animated layout do not call it and
rowContent already owns the secondary symbol/logo rendering. Leave the existing
secondaryText and AnimatedSwapLayout behavior unchanged.
In `@Sources/DashUIKit/Components/NumericKeyboardView.swift`:
- Around line 158-167: Update keyButtonView to disable the button when either
inProgress is true or key.isEmpty is true, preventing the invisible placeholder
key from producing tap highlights while preserving existing behavior for active
keys.
In `@Sources/DashUIKit/Components/ReceiveEstimateView.swift`:
- Around line 72-86: Update the Text views in the errorMessage and amount
branches of ReceiveEstimateView to apply centered multiline text alignment,
including the title and formatted amount, so wrapped localized content remains
symmetric within the parent VStack.
In `@Sources/DashUIKit/Components/TopIntro/TopIntroView.swift`:
- Around line 34-54: Update the section comments in the TopIntroView body around
the title and description blocks to use SwiftLint-compliant MARK formatting,
adding the required space after the comment delimiter and preserving the
existing section labels.
In `@Sources/DashUIKit/Components/Transaction/TransactionView.swift`:
- Around line 115-140: Update the offset modifiers in iconWrap and
secondaryBadge: fix the spacing in the alignment offset and consolidate the two
badge offsets into one modifier with the intended cumulative visual shift,
removing the redundant offset while preserving the badge’s placement.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: f2132230-9e6d-4a4f-a35e-6c3494d10962
⛔ Files ignored due to path filters (120)
Sources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Other/text-field-qr.imageset/text-field-qr-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Other/text-field-qr.imageset/text-field-qr-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Other/text-field-qr.imageset/text-field-qr-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-error.imageset/additional-info-error-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-error.imageset/additional-info-error-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-error.imageset/additional-info-error-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-error.imageset/additional-info-error.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-error.imageset/additional-info-error@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-error.imageset/additional-info-error@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-gift-card.imageset/additional-info-gift-card-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-gift-card.imageset/additional-info-gift-card-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-gift-card.imageset/additional-info-gift-card-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-gift-card.imageset/additional-info-gift-card.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-gift-card.imageset/additional-info-gift-card@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-gift-card.imageset/additional-info-gift-card@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-received.imageset/additional-info-received-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-received.imageset/additional-info-received-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-received.imageset/additional-info-received-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-received.imageset/additional-info-received.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-received.imageset/additional-info-received@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-received.imageset/additional-info-received@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-sent.imageset/additional-info-sent-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-sent.imageset/additional-info-sent-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-sent.imageset/additional-info-sent-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-sent.imageset/additional-info-sent.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-sent.imageset/additional-info-sent@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-sent.imageset/additional-info-sent@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-all.trans.imageset/transaction-all.trans-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-all.trans.imageset/transaction-all.trans-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-all.trans.imageset/transaction-all.trans-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-all.trans.imageset/transaction-all.trans.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-all.trans.imageset/transaction-all.trans@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-all.trans.imageset/transaction-all.trans@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-coinbase.received.imageset/transaction-coinbase.received-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-coinbase.received.imageset/transaction-coinbase.received-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-coinbase.received.imageset/transaction-coinbase.received-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-coinbase.received.imageset/transaction-coinbase.received.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-coinbase.received.imageset/transaction-coinbase.received@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-coinbase.received.imageset/transaction-coinbase.received@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-approve.imageset/transaction-contact-request-approve-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-approve.imageset/transaction-contact-request-approve-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-approve.imageset/transaction-contact-request-approve-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-approve.imageset/transaction-contact-request-approve.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-approve.imageset/transaction-contact-request-approve@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-approve.imageset/transaction-contact-request-approve@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-sent.imageset/transaction-contact-request-sent-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-sent.imageset/transaction-contact-request-sent-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-sent.imageset/transaction-contact-request-sent-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-sent.imageset/transaction-contact-request-sent.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-sent.imageset/transaction-contact-request-sent@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-sent.imageset/transaction-contact-request-sent@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-convert.imageset/transaction-convert-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-convert.imageset/transaction-convert-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-convert.imageset/transaction-convert-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-convert.imageset/transaction-convert.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-convert.imageset/transaction-convert@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-convert.imageset/transaction-convert@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-crowdnode.imageset/transaction-crowdnode-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-crowdnode.imageset/transaction-crowdnode-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-crowdnode.imageset/transaction-crowdnode-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-crowdnode.imageset/transaction-crowdnode.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-crowdnode.imageset/transaction-crowdnode@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-crowdnode.imageset/transaction-crowdnode@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-error.imageset/transaction-error-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-error.imageset/transaction-error-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-error.imageset/transaction-error-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-error.imageset/transaction-error.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-error.imageset/transaction-error@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-error.imageset/transaction-error@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-gift-card.imageset/transaction-gift-card-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-gift-card.imageset/transaction-gift-card-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-gift-card.imageset/transaction-gift-card-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-gift-card.imageset/transaction-gift-card.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-gift-card.imageset/transaction-gift-card@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-gift-card.imageset/transaction-gift-card@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-internal-transfer.imageset/transaction-internal-transfer-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-internal-transfer.imageset/transaction-internal-transfer-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-internal-transfer.imageset/transaction-internal-transfer-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-internal-transfer.imageset/transaction-internal-transfer.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-internal-transfer.imageset/transaction-internal-transfer@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-internal-transfer.imageset/transaction-internal-transfer@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mining.imageset/transaction-mining-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mining.imageset/transaction-mining-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mining.imageset/transaction-mining-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mining.imageset/transaction-mining.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mining.imageset/transaction-mining@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mining.imageset/transaction-mining@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mixing.imageset/transaction-mixing-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mixing.imageset/transaction-mixing-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mixing.imageset/transaction-mixing-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mixing.imageset/transaction-mixing.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mixing.imageset/transaction-mixing@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mixing.imageset/transaction-mixing@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-received.imageset/transaction-received-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-received.imageset/transaction-received-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-received.imageset/transaction-received-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-received.imageset/transaction-received.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-received.imageset/transaction-received@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-received.imageset/transaction-received@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-sent.imageset/transaction-sent-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-sent.imageset/transaction-sent-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-sent.imageset/transaction-sent-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-sent.imageset/transaction-sent.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-sent.imageset/transaction-sent@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-sent.imageset/transaction-sent@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-uphold.received.imageset/transaction-uphold.received-dark.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-uphold.received.imageset/transaction-uphold.received-dark@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-uphold.received.imageset/transaction-uphold.received-dark@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-uphold.received.imageset/transaction-uphold.received.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-uphold.received.imageset/transaction-uphold.received@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-uphold.received.imageset/transaction-uphold.received@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/arrow-down.imageset/arrow-down.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/arrow-down.imageset/arrow-down@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/arrow-down.imageset/arrow-down@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/diagonal-up-down.imageset/diagonal-up-down.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/diagonal-up-down.imageset/diagonal-up-down@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/diagonal-up-down.imageset/diagonal-up-down@3x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/stopwatch.imageset/stopwatch.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/stopwatch.imageset/stopwatch@2x.pngis excluded by!**/*.pngSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/stopwatch.imageset/stopwatch@3x.pngis excluded by!**/*.png
📒 Files selected for processing (42)
Sources/DashUIKit/Components/CoinSelector.swiftSources/DashUIKit/Components/ConverterCard/ConverterArrowBadge.swiftSources/DashUIKit/Components/ConverterCard/ConverterCard.swiftSources/DashUIKit/Components/ConverterCard/ConverterCardItem.swiftSources/DashUIKit/Components/ConverterCard/ConverterCardRow.swiftSources/DashUIKit/Components/EnterAmount/CurrencyOption.swiftSources/DashUIKit/Components/EnterAmount/DashBalanceView.swiftSources/DashUIKit/Components/EnterAmount/DashPickerView.swiftSources/DashUIKit/Components/EnterAmount/DualSwapAmountView.swiftSources/DashUIKit/Components/EnterAmount/EnterAmountView.swiftSources/DashUIKit/Components/EnterAmount/SwapAmountView.swiftSources/DashUIKit/Components/NumericKeyboardView.swiftSources/DashUIKit/Components/ReceiveEstimateView.swiftSources/DashUIKit/Components/TopIntro/TopIntroView.swiftSources/DashUIKit/Components/Transaction/TransactionView.swiftSources/DashUIKit/Foundation/DashTextStyle.swiftSources/DashUIKit/Foundation/Font+DashUI.swiftSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Other/text-field-qr.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-error.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-gift-card.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-received.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/AdditionalInfo/additional-info-sent.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-all.trans.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-coinbase.received.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-approve.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-contact-request-sent.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-convert.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-crowdnode.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-error.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-gift-card.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-internal-transfer.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mining.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-mixing.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-received.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-sent.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/Transactions/Preview/transaction-uphold.received.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/arrow-down.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/diagonal-up-down.imageset/Contents.jsonSources/DashUIKit/Resources/Media.xcassets/Icons & Illustrations/stopwatch.imageset/Contents.json
- guard the delayed scale/offset animation callbacks with a generation token so a rapid re-toggle of isPrimaryLarge cannot let stale updates run after the newer state (visible jump) - reword dashPasteContextMenu doc to match behavior (it invokes onPaste on long-press; the clipboard check is the caller's responsibility)
Lets a row qualify its amount with a short status — the wallet shows "Locked" on a coinbase reward that has not matured yet. Rendered in the warning tone immediately before the amount, mirroring the row it replaces. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@CLAUDE.md`:
- Line 34: Update the fenced directory listing in CLAUDE.md by adding a language
identifier, preferably text, to its opening fence so it satisfies markdownlint
MD040 while preserving the listing content.
In `@docs/amount-and-currency.md`:
- Around line 40-60: Update the EnterAmountView example’s secondaryAmount from
"$ 150.00" to the symbol-free "150.00", and clarify the surrounding
documentation that amount strings contain host-formatted numeric values without
currency symbols because secondaryCurrency supplies the fiat symbol.
In `@docs/feedback.md`:
- Around line 23-29: Update the ToastStyle documentation in docs/feedback.md to
include the .noInternet style and identify its toast-no-wifi asset mapping,
while preserving the existing .loading LoadingSpinner description and
placeholder-assets note.
In `@docs/foundation.md`:
- Around line 63-82: Add the missing caption1Medium entry to the Available
styles table, documenting the token exposed by both Font.dash and DashTextStyle
with its exact size, medium weight, and line-height values from the
implementation.
In `@docs/navigation-and-containers.md`:
- Around line 40-63: Update the fillsHeight: true guidance in the BottomSheet
documentation to explicitly qualify the presentation-detent recommendation
(.large, .medium, and .height) as iOS 16+. Keep the existing iOS 14
compatibility statement and the fillsHeight: false guidance unchanged.
In `@docs/README.md`:
- Around line 3-26: Update the docs/README.md component catalog to include
ReceiveEstimateView, ConverterCard, ConverterCardItem, ConverterCardRow,
ConverterArrowBadge, TopIntroView, and TransactionView. Add them to appropriate
existing sections or create linked documentation entries, and ensure the page
list and alphabetical index reflect every newly introduced public component.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 1eadf61c-54d3-428f-a5f9-63fa2a36e4cb
📒 Files selected for processing (11)
CLAUDE.mdSources/DashUIKit/Components/EnterAmount/SwapAmountView.swiftSources/DashUIKit/Components/Transaction/TransactionView.swiftdocs/README.mddocs/amount-and-currency.mddocs/buttons-and-inputs.mddocs/feedback.mddocs/foundation.mddocs/lists-and-rows.mddocs/navigation-and-containers.mddocs/utilities.md
🚧 Files skipped from review as they are similar to previous changes (2)
- Sources/DashUIKit/Components/Transaction/TransactionView.swift
- Sources/DashUIKit/Components/EnterAmount/SwapAmountView.swift
Adds a test target and moves NumericKeyboardLocaleSupportTests here from the wallet, where it could no longer compile: the type it exercises lives in this package and is internal to it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ross-dash
left a comment
There was a problem hiding this comment.
Looks good from the design side
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
docs/lists-and-rows.md (1)
32-33: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winUse
Rectangle()in thecontentShapeexample.docs/lists-and-rows.md:32-33should match the package’s iOS 14 target;.contentShape(.rect)is too new for copy-paste, whilecontentShape(Rectangle())works on the supported deployment target.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/lists-and-rows.md` around lines 32 - 33, Update the contentShape example in the lists-and-rows documentation to use Rectangle() instead of the newer .rect shape syntax, preserving the surrounding Button tappable-area guidance.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@docs/lists-and-rows.md`:
- Around line 32-33: Update the contentShape example in the lists-and-rows
documentation to use Rectangle() instead of the newer .rect shape syntax,
preserving the surrounding Button tappable-area guidance.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: c34986f6-6f69-49f1-93b3-fed3144048e2
📒 Files selected for processing (9)
CLAUDE.mdPackage.swiftTests/DashUIKitTests/NumericKeyboardLocaleSupportTests.swiftdocs/README.mddocs/amount-and-currency.mddocs/feedback.mddocs/foundation.mddocs/lists-and-rows.mddocs/navigation-and-containers.md
🚧 Files skipped from review as they are similar to previous changes (4)
- docs/feedback.md
- docs/foundation.md
- docs/navigation-and-containers.md
- docs/amount-and-currency.md
Final migration PR — brings the rest of DashUIKit into the repo.
Components
CoinSelector,NumericKeyboardView,ReceiveEstimateViewTopIntro/TopIntroView,Transaction/TransactionViewFoundation
DashTextStyle+Font: addcaption1Medium(used by TransactionView).Assets
arrow-down,diagonal-up-down,stopwatch,Transactions/icon set,text-field-qrdark variant.iOS 14 compat fixes applied during migration
.rect(cornerRadius:)/.contentShape(.rect)withRoundedRectangle(...,style:.continuous)/Rectangle()(CoinSelector, DashPickerView, ConverterCardRow, TransactionView).@available(iOS 14, macOS 11, *)to ReceiveEstimateView, CurrencyOption, TopIntroView and unannotated preview scaffolding.Verification
swift build(debug) andswift build -c releaseboth pass.This completes the DashUIKit migration.
Summary by CodeRabbit