Skip to content

feat(icons): add menu-identities and menu-voting - #20

Merged
romchornyi merged 5 commits into
masterfrom
feat/menu-identities-voting-icons
Sep 28, 2026
Merged

romchornyi merged 5 commits into
masterfrom
feat/menu-identities-voting-icons

Conversation

@romchornyi

@romchornyi romchornyi commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator

Issue being fixed or feature implemented

Dash Wallet's More screen moves its rows onto the design system's menu icons. Two of the rows
have no asset in the library: Identities and the new Voting row (voting was split out of
Governance into its own More row). Consumed by dashpay/dashwallet-ios feat/more-menu-icons.

Stacked on #19 — merge that first; this PR then retargets to master.

What was done?

  • menu-identities.imageset and menu-voting.imageset in Icons & Illustrations/Menu, from the
    Figma Menu export (light only, 30 pt, @1x/@2x/@3x — the same shape as the other Menu icons).
    Normalized with normalize-icons.py --template "menu-*.png" and assembled with
    build-imagesets.py, the scripts the rest of the set was built with.
  • DashIcon.Menu.identities and DashIcon.Menu.voting, in alphabetical order with the other
    cases.
  • menu-username-voting is left as is: a different glyph that other screens may use.

Screenshots

DashIcon.Menu at 30 pt (NEW = this PR) In the app — More screen (dashwallet-ios#1161)
Menu icons More screen rows

How Has This Been Tested?

  • swift build of the package.
  • dashwallet-ios dashpay scheme builds against this branch as a local package override, with the
    More rows switched to DashIcon.Menu.*.

Breaking Changes

None — two new enum cases and two new assets.

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have made corresponding changes to the documentation

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

🤖 Generated with Claude Code

jeanpierreroma and others added 2 commits September 21, 2026 20:31
… work behind them

Two new components, from the Join DashPay and create-username designs:

- `Criteria` — the validation-rule block: a mark box that sets the row height,
  four states (pending ring, met, failed, blocking), and the icons the design
  system draws for each. Rules that are met are dropped by the caller, so the
  list shrinks as the input becomes valid.
- `SimpleSelect` — the option rows the funding-privacy page picks a source with.

`AddressFieldView` gains what those screens needed, all additive:

- an optional `isFocused` binding, mirrored both ways, so a host can raise the
  keyboard on entry and drop it before presenting a sheet while the field still
  owns its `@FocusState`;
- `showsClearButton`, because a short field the user can clear by hand does not
  need a ✕ to hit by accident, and `isAccepted`, which drops the focus ring once
  the content has been accepted;
- the 3pt focus/error ring from Figma, drawn as an inset stroke rather than a
  shadow (with no blur and no offset a shadow lands under the field and is never
  seen);
- the QR button only when an `onScanQR` handler exists — a username has no QR
  form, and the glyph was offering a control that did nothing. A field that can
  show neither control now reserves no trailing space.

`SystemMessageView` takes a `buttonStyle`: a message that points somewhere else
reads as a link, not as a call to action, and is spaced against the sentence it
follows instead of sitting in a pill's padding.

`BottomSheet` collapses its header when there is no title, no back button and no
close button — 64pt of nothing that a self-sizing sheet was measuring into its
own height.

Also: the `RedAlpha20` token and six feature icons (friends, profile, recovery,
selected-list, username, username-block).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The More screen moves its rows onto the design system's menu icons, and two of
them had no asset: Identities and the new Voting row. Both come from the Figma
Menu export (light only, like the rest of the Menu set), normalized and
assembled with the same scripts as the existing imagesets, and are exposed as
`DashIcon.Menu.identities` and `DashIcon.Menu.voting`.

`menu-username-voting` stays: it is a different glyph and other screens may
use it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Repository: dashpay/DashUIKit/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 5aa2c4ee-560b-4ea2-8049-aa4e86b3c6de


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@romchornyi

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

jeanpierreroma and others added 2 commits September 28, 2026 14:41
…e for VoiceOver, link layout, SimpleSelect docs

- Criteria: a repeated `id` (two rules with the same text and no explicit
  id) gave SwiftUI two rows with one identity. Render identities are now
  unique; the first occurrence keeps its bare id, so a row with a stable
  explicit id still animates in place.
- VoiceOver: `.blocking` read the same as `.failed` ("Not met"). It now says
  the rule is required to continue, which the red text says visually.
- SystemMessageView: the link layout (negative padding, tight spacing) was
  applied whenever the style was a link, including a row that shows only the
  secondary pill. It now applies only when the primary link renders.
- Docs: `SimpleSelect` gets a catalog row and a section in Buttons & inputs;
  `Criteria` and `SimpleSelect` join the section summary.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@llbartekll llbartekll left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against a local checkout of pull/20/head (stacked on #19 as described).

Verified

  • swift build passes (Swift 6.3.3 / Xcode 26.6).
  • Both imagesets match the existing Menu set exactly: 30/60/90 px, 8-bit RGBA, same Contents.json shape as e.g. menu-wallet, glyph colour #008DE4 like the other Menu icons.
  • identities and voting are in the correct alphabetical slots, no duplicate raw values, and every DashIcon.Menu case ↔ imageset pairing is 1:1 across all 91 icons.
  • menu-username-voting is indeed a different glyph (checkmark badge vs thumbs-up), so keeping it is right.
  • Consumer side (dashwallet-ios#1161) renders via Image(name, bundle: .dashUIKit) with no template tinting, so the baked colours are what ships.

Non-blocking: dark variant for menu-identities
"Light only, like the rest of the Menu set" isn't quite accurate — 32 of the 91 Menu icons ship a -dark variant, and the pattern is: icons with a white cut-out get one, where the white becomes dark navy (menu-security: #ffffff → #082538, menu-support: #ffffff → #063f63). menu-identities has the largest white area in the whole set (the person silhouette, ~890 px @3x) and sits on the same More screen as security and support, so in dark mode it will be the one row whose cut-out stays bright white while its neighbours go navy. menu-voting is solid blue, so light-only is fine there (same as wallet/settings/tools).

The recent additions (menu-send-disabled, menu-receive-disabled, menu-swap-dash-coin) skipped dark variants too, so this follows precedent rather than breaking anything — a follow-up for identities (and ideally those three) would be enough. Not holding the PR on it.

Optional: there is no test that every DashIcon.* case resolves to an asset in Bundle.module. A CaseIterable loop asserting UIImage(named:in:) is non-nil would be a cheap guard against the next typo in a raw value.

Base automatically changed from feat/join-dashpay-feature-icons to master September 28, 2026 12:13
@romchornyi
romchornyi merged commit 28a67a3 into master Sep 28, 2026
2 checks passed
@romchornyi
romchornyi deleted the feat/menu-identities-voting-icons branch September 28, 2026 12:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants