Repository navigation
feat: six icon glyphs + nuri mark at 22/32 — implements nuri-com/nuri-design-system#230 - #236
Merged
Merged
Conversation
Implements the contract admitted in #230 (comment) (sole-architect exception · Project Ready confirmed by the operator). The seven drawings are the operator's exports of 2026-10-29, copied unchanged. Spec - icons: address-book, id-card, selfie, lock, lock-open, phone added; nuri.svg replaced by the 22/32 redraw (letters unchanged, 2px gap). Intake per file: viewBox 0 0 32 32, no stroke=, <path> only, coordinates inside 4–28. address-book is drawn 2–30 by the operator's decision: a known deviation from acceptance criterion 1, with a follow-up. Codegen - regenerated: packages/rn/generated/data/icons.ts (IconName 39 → 45) and packages/prototype/generated/icons.js (45 keys). No other generated file changed; nothing under packages/doc/generated/. RN tests - render-smoke: the six names join the targeted NuriIcon mount list (the #131 / #186 pattern). - the two snapshots that embed the mark (IconAvatar inverse accessory, ListAction leadingAvatar) are updated; only the mark's four path `d` values and the SvgXml `xml` string changed. Playground - new pages/component/icon.html: every registry name at 24px (md), 18px (sm) and 15px (the IconAvatar accessory, the only 15px placement), one board per size; theme and accent from the board controls. Card added to component/index.html. - send.html: All contacts (three boards) list-bullets → address-book; Mobile money wallet → phone. - send-wip.html: bank · activate copy → id-card, eye → selfie; bank · recipient · locked: the outline bank avatar → lock (outline). MISFIT lines rewritten. Evidence: docs/evidence/icons-230/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements #230: six icon glyphs (
address-book,id-card,selfie,lock,lock-open,phone) and thenurimark redrawn at 22/32.Readywas confirmed by the operator in chat on 2026-10-29. The gh token has noread:projectscope, so this PR does not verify it.origin/mainatf28e14c.Contract delivered
IconNamegains exactly six names. The RN union and the web registry key set both go from 39 to 45, and they are identical to each other:nuriis the operator's 22/32 file: the letters are unchanged and the gap between them is 2px instead of 4. The old mark spanned 4–28; the new one spans 5–27.The seven files are the operator's exports from
prompts/icons-230/(2026-10-29), copied unchanged. The sha256 of each committed file equals its source.Anti-scope respected:
user,camera,globe,iban-globe,tourismorusers; no operator or brand marks;Intake check (acceptance criterion 1)
The check parses every
dattribute into absolute coordinates, counting endpoints and Bézier control points. A Bézier curve lies inside the hull of its control points, so this box bounds the drawn glyph. It also lists every element in the file and everystroke*attribute. The sources use the commands M, L, H, V, C and Z only, with no arcs.stroke=address-book.svg0 0 32 32id-card.svg0 0 32 32selfie.svg0 0 32 32lock.svg0 0 32 32lock-open.svg0 0 32 32phone.svg0 0 32 32nuri.svg(new)0 0 32 32A grep cross-check agrees:
grep -c strokegives 0 for all seven files, and the only tags are 7<svgand 25<path.Known deviation:
address-bookis drawn at 2–30. The operator decided on 2026-10-29 that it goes in as drawn and is not rescaled here. This conflicts with acceptance criterion 1 and with the accepted contract's line "the glyph inside the 4–28 box". At 24px it reads slightly larger than its neighbours on the sheet. The correction is follow-up 1.Changes
packages/spec/icons/: 6 new SVGs, andnuri.svgreplacedpackages/rn/generated/data/icons.ts·packages/prototype/generated/icons.js. No other generated file changed:packages/doc/generated/,packages/playground/generated/andpackages/prototype/styles/have no diff.render-smoke.test.tsx: the six names join the targetedNuriIconmount list (the #131 / #186 pattern). The two snapshots that embed the mark are updated.pages/component/icon.html, the name ↔ drawing sheet, plus its card incomponent/index.htmlsend.html: All contactslist-bullets→address-book(three boards); Mobile moneywallet→phone.send-wip.html: bank · activatecopy→id-cardandeye→selfie; bank · recipient · locked: the outlinebankavatar →lock, still outline.send.html: the Mobile money line is rewritten as resolved, and a resolved All contacts line is added.send-wip.html: the locked-row line and the ID-document / selfie line are rewritten, the latter replacing the oldcamera(oruser) suggestion. No other line in either log mentioned the dropped portrait oruserglyph.Snapshots. Exactly two snapshots changed, 5 lines each, and only in the mark:
IconAvatar — the inverse accessory equals the neutral accent solid…ListAction — leadingAvatar forwards initials + accessory + accessorySurface…In each, the 4 changed lines are the mark's four
RNSVGPath dvalues and the fifth is theSvgXml xmlstring that carries the same markup. In that string, the source putsfill-rule/clip-ruleafterdon the R path; the parser keeps source attribute order. The parsedfillRuleprops did not change.The icon sheet (
component/icon.html):<nuri-icon>md), 18px (size="sm") and 15px. All 45 names are in registry order, with each glyph next to its name, and theme and accent come from the board controls.size.2xsis the IconAvatar accessory leaf from DS admission: IconAvatar initials + corner accessory (+ ListAction forwarding) #231, so the 15px board shows each glyph where the DS draws it at 15px: as the accessory over the sameinitials="EB"avatar. An avatar with no content was tried first and warns ("expects exactly one oficon,sourceorinitials").Verification (commands and output)
All commands were run in a fresh worktree (
origin/mainatf28e14cplusnpm ci) on the source tree committed as7d69f3b.Before the snapshot update,
npm test -w @nuri/rnfailed exactly 2 snapshots (Tests: 2 failed, 306 passed). The new six-name mount test passed on the first run.Deterministic re-emit. I ran the full build chain twice:
node scripts/tokens-parser.js, thennpm run build, then the@nuri/prototype,@nuri/playgroundand@nuri/docbuilds. After each run I hashed every file underpackages/{rn,prototype,doc,playground}/generated,packages/prototype/stylesandpackages/spec(169 files):Rendered proof (web playground, light and dark)
The pages were served statically from the worktree and captured with headless Chrome at device scale 2. Each board's theme was switched with its own toolbar control. No console warnings or errors were logged on any captured page.
Name ↔ drawing check: every glyph renders its own drawing. I compared each of the six new names and
nuriwith its source file at 24, 18 and 15px, in light and dark. The 15px check used 3× crops of the accessory cells, which are not committed.address-bookid-cardselfielocklock-openphonenuriThe other 38 names show the same drawings as before; no other value changed in the registry.
Evidence (
docs/evidence/icons-230/, at7d69f3b):nuriat the 15px accessory:address-book, and the Nuri accessory on Emil and Sara.md"Nuri user" avatar, and Mobile money withphone. On these two boards the All contacts row sits under the sheet; its markup is the same as onsend · recipient.lock; bank · activate withid-cardandselfie.screens.html, overview).Notes
variant="outline". Only the glyph was swapped,banktolock. Whether the locked row should also change variant is the operator's call.lock-openbeforelock. The filename sort places-before.. The sheet follows registry order, and so do the union and the key set.http-serveron port 8791, and both helper processes were stopped afterwards.Not verified
nurimark: expo-demoHome.tsx(topbar mark), the toast, and gen-ui were not rendered. On RN the proof is jest only: the six names mount throughNuriIconand their register markup reachesSvgXml, and the twonurisnapshots were updated. The issue's plan lists "the six names mounted on RN-web, light and dark". That step was not run.address-booksize deviation is visible on the sheet and is left to follow-up 1.Ready. It is not verifiable with this gh token (noread:projectscope).Follow-ups
address-bookinto the 4–28 box. The operator re-exports it (phone's ratio, same height). That restores the accepted contract's "inside the 4–28 box", so it is a Correction under the policy. It is one SVG plus a regen, with no snapshot change because no snapshot embedsaddress-book.scripts/parsers/icons.jsshould fail loud onstroke=and on any element other than<path>. Today both pass silently:fill="none"is rewritten tocurrentColor, and other elements are dropped. It could also check the 4–28 box and thatcomponent/icon.htmllists every registry name.address-book,id-card,selfie,lock,lock-open,phone; thenurimark redrawn at 22/32" in the nextrn/v0.x.ytag. Tagging is the operator's.lock/lock-open, which is unverified from DS inputs, and the send boards' glyphs.🤖 Generated with Claude Code