diff --git a/.gitignore b/.gitignore index 82b7f232..5605f8a7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,9 @@ mockups/canvases/*/assets/refs/ # spotify-ios is the exception: prototyping.rescience.com is built from the checkout, so # its captures sit under the replicas on the hosted page only as committed boards. !mockups/canvases/spotify-ios/ref-*.html +# grok-ios shows one capture on the hosted page, under board 14, by request: a native +# screenshot, not a Mobbin one, parked where the replica can be compared against it. +!mockups/canvases/grok-ios/ref-14-grok-bot-sheet.html # Same rule for the walkthrough row and its crops: they show the capture itself. mockups/canvases/*/w[0-9]-*.html mockups/canvases/*/walkassets.json diff --git a/AGENTS.md b/AGENTS.md index 702bd439..1274008e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -58,8 +58,10 @@ Rules inside a canvas folder: hands it back as a vector asset. - Never commit `ref-*.html` or `assets/refs/`. They hold third-party captures, the root `.gitignore` already excludes them, and the - clone-prototype skill rebuilds them. `spotify-ios` is the one exception: - its five `ref-*` boards are committed so the hosted canvas shows them. + clone-prototype skill rebuilds them. `spotify-ios` is the exception: its + five `ref-*` boards are committed so the hosted canvas shows them. So is + `grok-ios/ref-14-grok-bot-sheet.html`, a native screenshot kept under + board 14 for comparison on request. - Put everything else a run makes in `scratch/`. The root `.gitignore` ignores it at any depth. Do not use the repo root or a dot directory. - Give every canvas folder a `README.md`: it carries the evidence, and diff --git a/mockups/canvases/README.md b/mockups/canvases/README.md index a7269f7f..f691cc0d 100644 --- a/mockups/canvases/README.md +++ b/mockups/canvases/README.md @@ -224,6 +224,46 @@ declares a box other than the default 478 x 980. is worthless on grey, and that a blur which monotonically improves a band is hiding a content defect rather than an antialiasing one. The 25 `ref-*` boards are gitignored, so a fresh clone has 29. +- `grok-ios/`: the run to read when the ask is that the icons match the + source exactly, and the one with two devices on one canvas. Fifteen + screens of the Grok iOS app - the Home Screen widget, two pages of the + widget guide, the Voice Settings sheet over the 3D companion scene, the + SuperGrok paywall, the Terms update, the SuperGrok home with its composer, + the voice picker on two voices, the Settings sheet at three scroll + positions, the Terms update signing out, the Introducing Grok Bot sheet + and the App Store page for Grok Bot. Twenty-six boards in three rows: a + token board, a type board and nine evidence boards for 167 tokens, the + fifteen replicas, and the capture of each parked underneath. Ten are + Mobbin captures of a 393pt phone at 2.2417 px/pt; five are native 1206 x + 2622 captures of a 402pt phone at exactly 3 px/pt, rendered and scored on + their own grid with the template's status bar in place of the capture's. + Mean absolute delta is 0.27-1.41 on the three Mobbin screens that are + mostly crops or a drawn illustration, 9.53 on the Voice Settings sheet, + whose companion scene under the sheet is the one ground the capture does + not hold and is a gpt-image-2 edit with the sheet drawn over it, 5.77 on + the paywall (eighteen lines of white type over an inpainted hero), + 0.80-0.95 on the three native white pages, 2.12 on the App Store page, + 3.83 on the Grok Bot sheet, whose card wash, glass and vibrant copy are + drawn in CSS and fitted, and 0.74-1.66 on the voice picker and the settings sheet, + which are flat grounds, white cards and crops. Every icon but three, 66 of + them, is a crop of the capture at its measured ink box rather than a + drawing, because a crop scores 0 by construction and most of the glyphs + are SF Symbols whose outlines cannot be redistributed; the three side + glyphs on the voice screen are SVGs in `assets/icons/`, traced against the + capture's coverage maps by request. Its `README.md` records the inpainting + that clears the type off the crops before they are cut (a Coons fill from + each box's own edges, and a card whose material is un-applied and + re-applied by CSS), the five alphas solved against those patched frames, + the shadows and the glass fitted by sweep, a colour cast on three of the Mobbin exports + taken out with a per-channel lookup before anything was sampled, and the + type sizes that are not on the iOS ladder because the widths said so - + including a title that measured as 400 at 42px by width and turned out to + be 500 at 40.5px by ink mass, which halved its band's delta. The widget + guide's illustration is the one picture that is drawn rather than cropped: + a phone in CSS on 03, and on 02 a sheet over it with the widget card as a + flat rectangle under one fitted `matrix3d`. Fourteen of the fifteen `ref-*` + boards are gitignored; `ref-14-grok-bot-sheet` is committed so the hosted + canvas shows the capture under its replica, and a fresh clone has 27. - `substack-ios/`: the run to read when a translucent bar sits over content the board does not control. Seven screens of the Substack iOS home feed - a note, the Keep reading toast, three notes in a row, your own just-published diff --git a/mockups/canvases/grok-ios/00-design-tokens.html b/mockups/canvases/grok-ios/00-design-tokens.html new file mode 100644 index 00000000..a9268f1d --- /dev/null +++ b/mockups/canvases/grok-ios/00-design-tokens.html @@ -0,0 +1,253 @@ + + +
+ +Ten Mobbin captures at 2.2417 px per pt, five native 1206 × 2622 captures at 3 px per pt. One face (SF Pro), one type ladder, surfaces from white and light grey to black and a blurred photograph. Translucent surfaces are materials, not fills: the ground under them is not flat.
Every size is fitted to a measured width on the board, so several are off the iOS ladder. The evidence rows carry the widths.
One row per token. A token with no evidence is a guess.
| --k-font | -apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display","Helvetica Neue",Helvetica,Arial,sans-serif | refkit font on 02 'Widget', 05 'SuperGrok' and 'Unlock the full power of Grok': SF Pro top on all three, weak call each time. The platform face |
| --k-ground | #D5D5D5 | 01 flat census left of the widget (x 0-20, y 100-240): #D5D5D5 100% |
| --k-card | #FFFFFF | 01 widget body, col x68 y 80.7-94.5; 02 card interior, row y300 x 60-340; 02 the drawn sheet x 221-311 y 339-352 #FFFFFF on 100% of the flats |
| --k-well | #E5E5E5 | 01 pill and both circles: row y125 x 39-172 and row y196 x 39-100 flat #E5E5E5; 02 the drawn widget's pill x 150-163 y 437-472 #E5E5E5 100% |
| --k-dim | #CBCBCB | 02/03 the band above the sheet, y 0-58.9 flat #CBCBCB: the dimmed parent |
| --k-sheet | #F6F6F6 | 02/03 col x100 from 59.0 down and row y700 outside the card: #F6F6F6 |
| --k-illo-frame | #AAAAAA | 02/03 the guide illustration's phone: frame col x 49.7 y 316-428 and island x 163-230 y 232-247 flat #AAAAAA on 100% of the flats |
| --k-illo-screen | #FAFAFA | 03 inside the drawn frame, x 132-257 y 258-272: #FAFAFA, five under the card, on 100% of the flats |
| --k-illo-tile | #DDDDDD | 03 tile core x 83-119 y 290-330: #DDDDDD on 99.5% of the flats |
| --k-illo-scrim | rgba(0,0,0,.12) | 02 the drawn screen under its sheet: #FAFAFA reads #DBDBDB at col x87 y 218-278 and #DDDDDD at col x200 y 252-274, (250-219..221)/250 = .116-.124; the island still reads #A9A9A9, so the scrim lies under it |
| --k-illo-grabber | #CCCCCC | 02 sheet grabber x 183.8-209.2 y 302.4-306.0: mode #CCCCCC, flat #CDCDCD |
| --k-night | #010101 | 05 flat census x 20-372 at y 718-728 and y 822-838, above the CTA and below the footer: #010101 on 73% and 100% of the flats. The band between the feature card and the plan group is not flat (#171717-#1D1D1D, the smoke's tail) and stays in the crop |
| --k-skip | #121212 | 05 row y83 across the Skip pill 316.1-371.8 reads #111111, col x344 68-98.4 reads #141414; the mean |
| --k-material | rgba(255,255,255,.067) | 05 feature card censuses #131313 at y 203-213, 264-276 and 500-518 and #111111 at y 384-396, over a ground of #000000-#030303 outside it: (19-2)/253 = .067 white. At its top edge it reads #333033 with the smoke behind it, so a fill would be wrong and a material is right |
| --k-disc | rgba(255,255,255,.17) | 05 icon discs solved against the patched frame i5 over a ring r 11-18.5 around each glyph: alpha .185/.183/.167/.165/.182 on the five rows |
| --k-price | #131313 | 05 census x 30-190 y 695-715, the blank of the Monthly side of the plan group: #131313 on 99.8% of the flats |
| --k-plan-lo | #282828 | 05 Yearly card, bottom-left blank x 212-228 y 700-712: #282828 on 99.8% of the flats. The card is a diagonal ramp, not a fill: its four corners census 45/52/40/45 mean level (TL/TR/BL/BR) |
| --k-plan-hi | #333536 | 05 Yearly card, top-right blank x 340-358 y 626-636: #333536 on 72% of the flats; the light end of the ramp, laid to top right in the builder |
| --k-free-bg | #341A0E | 05 FREE badge interior, rows 643-648 x 134-140: #321B10 #371B10 #33170C |
| --k-scrim-btn | rgba(0,0,0,.32) | 04 X and grid buttons solved against the patched frame i4 over a ring r 9-20: black at .325 (sd .02) and .320; the close disc on the sheet .28 |
One row per token. A token with no evidence is a guess.
| --k-glass | rgba(255,255,255,.09) | 04 side-stack discs solved against the patched frame i4 over a ring r 10-14.5: white at .089 and .090 over sky, .037 over the cloud where the ground is too bright to resolve |
| --k-grabber | rgba(255,255,255,.35) | 04 grabber #8B7467 over the patched sheet #412A1C at y 410-412: white at .39/.35/.33 per channel |
| --k-sheet-v | rgba(0,0,0,.40) | 04 fitted through the drawn sheet at the 4px blur: at .40 the band under the sheet's edge (y 406-428) reads -0.2 signed and the body band (y 606-740) +0.6; .35 leaves both +4, .45 both -5 (README) |
| --k-side-ink | #CDCECF | 04 ink of the three vector side glyphs: top 3% of each box 203-208 over grounds 163/180/194, so flat, not white at an alpha (.16-.49 would fit) |
| --k-voice-pill | #767676 | 04 the voice pill reads #474747 flat through the sheet (x 300-370, y 772-797, std 3.6): 71/.60 = 118 under the .40 tint |
| --k-rec | #F09540 | 04 the recording dot inside the island, x 215.0-220.8 y 26.8-32.6: #F09540 #F29442 #F09444 |
| --k-page | #FFFFFF | 06 flat census x 40-360 y 520-700, 07 x 100-300 y 200-300: #FFFFFF on 100% of the flats |
| --k-chip | #F5F5F5 | 07 suggestion chips y 675-727, census x 20-60 y 680-690 above the bot glyph: #F5F5F5 on 100% of the flats |
| --k-composer | #FEFEFE | 07 composer interior census x 140-300 y 765-785, right of the placeholder and above the controls: #FEFDFE on 84% of the flats; the 2pt inside its edge reads #F9F9F9, the inset the line token carries |
| --k-ctl | #F4F3F4 | 07 the Auto pill x 59.3-134 y 789.3-822, census y 792-797 above its glyph: #F4F3F4 on 98% of the flats; the + and mic discs the same |
| --k-btn | #000000 | 06 Got it pill 20-382 x 730.7-784.7, census x 40-150 y 740-775: #000000 on 100% of the flats; 07 Speak pill, 14 CTA the same |
| --k-scrim-sheet | rgba(0,0,0,.19) | 14 the Terms page under the sheet: its white reads #CCCCCC on 100% of the flats (x 20-380 y 150-250) and the title's ink stays #000000; (255-204)/255 = .20, the pill under the glass reads #8E8E8E at .19 and #8B8B8B at .20, so .19 |
| --k-glass-sheet | rgba(255,255,255,.5) | 14 the sheet over the scrimmed page: #E6E6E6 over #CCCCCC on 95% of the flats (x 60-340 y 840-855) is white at .51; over the black Got it pill it reads #8E8E8E, white at .56 with the pill's edges blurred in. At the 19px blur the flats read .48 -0.48, .5 +0.74, .52 +1.74, .55 +2.79 signed, and .5 is the alpha the blur was swept at over the pill |
| --k-grabber-pro | #A4A4A6 | 14 grabber 172.3-229.7 x 451.3-455.0: #A4A4A6 on 78% of its flats |
| --k-store-dim | #BDBFBC | 15 the App Store page above the sheet, census x 100-300 y 20-50: #BDBFBC, green one and two levels over red and blue in the capture itself |
| --k-store-disc | #FAFAFA | 15 the close and share discs (d 45.4 at 15.3 and 341.3, y 77.3-122.7): interior mode #FAFAFA left of the X glyph (x 20-32 y 100-112), rim two capture px of #D7D7D7 at the sides, #EEEEEE at the top |
| --k-store-pill | #EEEEEF | 15 the Purchased pill 289-382 x 440-472, census x 300-382 y 440-448: #EEEEEF on 94% of the flats |
| --k-card-blue | #80BEFD | 14 the Grok Bot card 23.3-378.7 x 460.7-660.7: #80BEFD on a 20pt grid over its right half and lower two thirds (x 66-366 y 583-643), every cell within a level |
One row per token. A token with no evidence is a guess.
| --k-card-pale | #E8F3FE | 14 the pale shape in the card's top-left, cells x 46-106 y 463-513: #E8F3FE, #E8F2FE. Along row 481 it holds 243 to x 108 and falls to 189 by x 208, along column 88 it falls from 240 to 190 over y 521-537, and a darker ring runs 20-30pt outside it (162-167 at x 208 y 505, x 168 y 541). Its ellipse, fade and ring are one fit to the card at 1pt, mean |d| 3.13 to 1.87 over the card outside its crops and title (README) |
| --k-material-line | rgba(255,255,255,.16) | 05 card edge peaks #3B3B3B over one 0.9pt band at y 522.8-523.6 and #5C5A5D at 198.9-199.8 with smoke behind; .16 over #131313 is #393939 |
| --k-price-line | #252525 | 05 col x100 618.4-619.3 #252525 and 713.8-714.7 #222222: the plan group's 1pt edge |
| --k-plan-line | rgba(255,255,255,.17) | 05 Yearly card edge peaks #505052 (row 623.5), #565658 (625), #535557 (row 660 right); .17 over the ramp's #333536 top is #565758 |
| --k-composer-shadow | rgba(0,0,0,.07) | 07 the halo under the composer: the page reads #F5F5F5 at y 833, a pt under the card's bottom edge (832.3), and climbs to #FDFDFD by y 848; beside the card (x 392-395, row 780) #FAFAFA-#FCFCFC. Swept with the line at #F9F9F9 over the composer band y 728-862: blur 6px reads 4.63, 4.59, 4.63 at alpha .05, .07, .09 and blur 14px 4.45, 4.39, 4.51 |
| --k-composer-line | #F9F9F9 | 07 the card's edge, row y 780: x 10.33 #DEDEDE, 10.67 #A9A9A9, 11.0 #DFDFDF, 11.33 #E0E0E0, 11.67 #EFEFEF, then the #F9F9F9 inset; the right edge x 390.3-391.3 #E0E0E0 #E0E0E0 #BABABA #C5C5C5, the top at 737.33-737.67 #EFEFEF #E5E5E5 and the bottom at 832.0-832.3 #DBDBDB #E6E6E6: a line 2 capture px wide, darkest at the sides. Drawn at .67pt any grey is too dark, because the halo carries the edge: swept #A9A9A9 to #FFFFFF over the band y 728-862, #A9A9A9 5.25, #E4E4E4 4.59, #EEEEEE 4.48, #F6F6F6 4.40, #F9F9F9 4.39, #FFFFFF 4.41 |
| --k-sheet-line | rgba(0,0,0,.45) | 14 the sheet's outline, row y 600: x 7.33 #9A9A9A and 7.67 #696969 over a scrim of #C0C0C0 beside it, x 394.0 #696969 and 394.33 #9A9A9A on the right; two capture px of black at .45 mean over #C0C0C0 (.25 and .59), and the scrim beside it is #C0C0C0-#C4C4C4 against #CCCCCC away from it, the sheet's own soft shadow |
| --k-store-rule | #E7E7E8 | 15 the rules at y 278.67 and 366.67 x 20-402 and the three column separators at x 124.67, 229.67, 334.67 y 305.7-339.7: one capture px, #E7E7E8 on 100% of the pixels, no solve needed at 3 px/pt |
| --k-illo-card-shadow | rgba(0,0,0,.24) | 02 the drawn widget card's halo: col x 176.8 climbs #FCFBFC to #E9E9E9 over the 21pt above its top edge, row y 455 #F9F9F9 to #E5E5E5 over the 20.5pt left of it, row y 473 #E2E2E2 to #FEFEFE over 20pt to the right: 22-29 levels at the edge. One box-shadow swept dy 0-8 / blur 14-44 / alpha .12-.30 over the 25pt above the card: minimum .85 at 4px 28px .24, 0 28px .18 costs .1, 4px 20px .18 costs 2.6 |
| --k-row-line | rgba(255,255,255,.10) | 04 the row cards are a 1pt line and no fill: coverage solve over x 230-300 of both rows' top and bottom edges (486.8, 537.7, 549.3, 600.3), white at .087-.114, and .06-.14 on their sides, mean .10; inside a row reads #42401C against #423F19 outside |
| --k-illo-sheet-shadow | rgba(0,0,0,.12) | 02 above the drawn sheet's top edge 299.1, col x200: #DDDDDD to 274.6, #DADADA to 285.3, #D7D7D7 to 292.4, #D4D4D4 to 298.7, nine levels over 46pt on top of the scrim. One box-shadow swept blur 12-56 / alpha .05-.20 over that band: minimum 1.51 at 24px / .12, 40px / .08 costs .2 |
One row per token. A token with no evidence is a guess.
| --k-ink | #000000 | 01 'Grok' and icon core; 02/03 body ink core #010101; 05 CTA label |
| --k-ink-inv | #FFFFFF | 05 title and feature titles ink core #FFFFFF; 04 title reads #FDF8F4 through the warm blur |
| --k-mute | #A9A9A9 | 05 feature subtitles #ACA9AB and #A5A4A5, 'Monthly' #A6A6A7, '/year' and '$25 /month' #ACACAC: one grey, four readings, the mean |
| --k-skip-ink | #BBBBBB | 05 'Skip' ink core #B8B8B8-#BBBBBB |
| --k-foot | #838383 | 05 footer line ink core, x 34.8-358.2 y 805-817 |
| --k-free-ink | #E07D54 | 05 FREE ink core (brightest 2%) inside x 135-180 y 645-662 |
| --k-dots | #C5C5C5 | 02/03 page dots, mode of each 6.2pt disc: #C4C4C4-#C5C5C5 |
| --k-copy-mute | #7F7F7F | 06 body ink core on a grey-only window, 'review them.' x 200-245 y 482-493: #7F7F7F; a window that takes in the black 'Terms of Service' span reads the span's pixels, not the grey |
| --k-placeholder | #7E7E7E | 07 'Ask Anything' ink core x 27-121 y 755-770 |
| --k-sheet-copy | #818181 | 14 the three body lines under 'Introducing Grok Bot', a plus-darker grey: each ink pixel is the ground under it plus this minus white, against the capture's ground at its 97th percentile over x 60-330 every 2pt of y 704-766 (228 at 704, 146 at 752). Line 1's core over 227 reads #5B5B5B and line 3's over 146 #0E0E0E. Swept over the copy (x 20-390 y 700-770): #727272 9.30, #7C7C7C 8.52, #818181 8.32, #868686 8.37, #8C8C8C 8.50 |
| --k-store-mute | #8A8A8D | 15 'AI agents that do real work' (x 155-326 y 173-187), 'News', 'Version 1.8.0', '1d ago' and the chevron: ink core #8A8A8D on each |
| --k-store-val | #8E8E92 | 15 '4.9' x 52-84 y 318-334 ink core #8E8E92; '18+', '#19', 'Years', 'Productivity', 'X Corp' and the stars the same to a level |
| --k-store-label | #B1B1B4 | 15 '3.3K RATINGS' x 30-107 y 295-303: ink core #B1B1B4 |
| --k-store-link | #0088FF | 15 'more' x 350-382 y 638-647 and the cloud glyph x 157-183 y 231-256: ink core #0088FF on both |
| --k-store-pill-ink | #CFCFD1 | 15 'Purchased' x 302-369 y 451-461 on the #EEEEEF pill: ink core #CFCFD1 |
| --k-illo-label | #333333 | 02 'Grok' beside the drawn app icon, x 98-124 y 321-330: ink core #333333 |
| --k-illo-sub | #5A5A5A | 02 'Quickly start a new chat with Grok.' x 104-289 y 388-398: ink core #5A5A5A; the title above it (x 174-219 y 361-377) and the pill's 'Grok' (x 192-227 y 450-465) core #000000 and #080808, the ink token |
| --k-r-phone | 52px | iPhone 14 Pro/15/16 display corner, this repo's stand-in |
| --k-r-widget | 27px | 01 widget corner insets 21.3/12.4/8.4/2.1 at 0.7/3.7/6.7/15.7 down: r 27 |
| --k-r-card | 26px | 02 card corner insets 16.2/12.2/8.6/5.1/2.4 at 2/4/7/11/16 down: r 26 |
| --k-r-sheet | 30px | 02 sheet corner insets 20.5/13.8/8.5/4.5 at 2.1/5.1/9.1/14.1 down: r 30 |
| --k-r-illo | 53.5px | 03 frame outer arc, leftmost frame pixel 28.5/13.8/5.4pt in at 8/21.4/39.3pt down from 205.9: a 53.5pt circle; the inner arc (32.6/22.8/14.7 at 7.4/16.3/34.1 down from 215.5) is 42.4, the stroke less |
| --k-r-illo-tile | 14.3px | 03 tile corner insets 10.7/6.2/3.6/0.9pt at 0.2/2/4.7/9.1 down from 278.4: r 14.3 |
| --k-r-illo-sheet | 26.8px | 02 drawn sheet corner: row y300, 1pt under the top edge at 299.1, white begins at 76.9 against a sheet edge of 55.9: the inset of a 26.8 radius |
One row per token. A token with no evidence is a guess.
| --k-r-illo-card | 22px | 02 the widget card's left edge leaves its fitted line 23pt below the top-left corner and the top edge 25pt right of it, at a local scale of .80 down and 1.09 across: 22 in the card's own plane |
| --k-r-sheet-v | 35px | 04 sheet corner insets 20.9/15.1/10.2/6.2/2.7 at 3.4/6.4/10.4/15.4/21.4 down from 403.6, left edge 8.5: r 35 |
| --k-r-row | 13px | 04 row card corner: the top edge's 1pt line reaches full coverage 8.1pt in from the left edge (x 28.5 against 20.4), and r - sqrt(2r - 1) = 8.1 at r 13 (12 gives 7.2, 14 gives 8.8) |
| --k-r-feat | 32px | 05 feature card insets 14.9/10.5/6.9/3.8/1.7 at 5/8/12/17/23 down: r 32 |
| --k-r-price | 18px | 05 plan group insets 10.9/7.3/4.2/1.7 at 1.6/3.6/6.6/10.6 down: r 18 |
| --k-r-plan | 15px | 05 Yearly card insets 7.3/4.5/2.2/0.8 at 2.4/4.4/7.4/11.4 down: r 15 |
| --k-r-chip | 22px | 07 chip corner: the first chip's left edge (x 11) reaches full coverage at y 697 and the top edge (675) at x 33, on a 52 tall chip whose ends are not full semicircles; circle fit on the arc r 22 |
| --k-r-composer | 28px | 07 composer corner insets 21.3/15.0/10.3/6.3/3.0/1.0 at 1/3/6/10/15/21 down from 737.3, left edge 10.3: r 28 |
| --k-r-sheet-pro | 37px | 14 the sheet's top-left corner, where its glass clears the scrim by 25 levels: insets 18.67/9.0/3.33 at 4.7/12.7/21.7 down from its top edge (outline 444.67-445.0, first white row 445.67) against a left edge of 8.0. r 37 gives 18.95/9.1/3.3, 36 gives 18.2/8.6/3.0, 38 19.7/9.6/3.7 |
| --k-r-store | 38px | 15 the App Store sheet's corner (top 62, left edge 0): insets 17.7/10.7/6.0/3.3/1.7/0.7 at 5.7/11.3/17/22.7/28.3/34 down; r 38 gives 17.3/10.4/6.4/3.5/1.6/0.5 |
| --k-r-card | 18px | 14 the Grok Bot card's bottom-left corner (left edge 23.3, bottom 660.7): insets 7.3/3.7/2.0/0.7 at 3.3/6.7/10/13.3 up; r 18 gives 7.0/3.6/1.9/0.7 |
| --k-r-tip | 14px | 07 tooltip corner insets 9.7/7.7/6.0/4.0/1.7 at 1/2/3/5/8 down from 773, left edge 215.3: r 14 |
| --k-r-pill | 999px | 01 pill 61.6 tall, 05 Skip 31.4, FREE 27.7 and CTA 56: all fully round (CTA inset 19.5 at 1.5 down fits r 28) |
| --k-t-time | 600 15px/20px var(--k-font) | iOS status bar clock |
| --k-t-widget | 600 19.5px/24px var(--k-font) | 01 'Grok' 42.4 wide, G 14.3 tall with overshoot; 20px sets 43.3 x 15.0 and 19.5px 42.2 x 14.6 |
| --k-t-h | 600 17px/22px var(--k-font) | 02 'Widget' 55.8 wide, 'Home Screen Widget' 166.4 wide, both 16.1 cap-to-descender: 17px; 05 CTA 'Upgrade to SuperGrok' 177.1 wide at the same |
| --k-t-body | 400 17px/22px var(--k-font) | 02/03 body pitch 21.9, F cap to g descender 15.6, line 1 315.8 wide on both boards; 17px sets it 315.8 |
| --k-t-feat | 400 17.5px/22px var(--k-font) | 05 'Longer conversations in Chat' 224.8 wide and 'Skip' 32.6: 17px sets 219.3 and 31.3, 17.5px 225.3 and 32.3. Same cap as t-body, wider set |
| --k-t-row | 400 16.5px/21px var(--k-font) | 04 'Select Audio Device' 147.7 x 12.9, 'Microphone Selection' 161.0 x 15.2: 17px sets 150.3/163.3, 16px 143.3/155.7, 16.5px 147.0/159.0 |
| --k-t-sheet | 600 16px/21px var(--k-font) | 04 'Voice Settings' V cap 11.6 and 108.4 wide: one size under the nav |
One row per token. A token with no evidence is a guess.
| --k-t-h1 | 500 40.5px/50px var(--k-font) | 05 'SuperGrok' 194.0 x 36.1 from S top to p foot with 10332 ink px; swept in the board: 42px regular with .5px tracking hits the width but sets 37.5 tall with 9116 ink px, 40.5px medium with .6px tracking sets 194.0 x 36.1 with 10053 and halves the title band's delta (16.5 to 10.9) |
| --k-t-h2 | 600 20px/25px var(--k-font) | 05 'Unlock the full power of Grok' U cap 14.3, 263.2 wide |
| --k-t-sub | 400 13.25px/18px var(--k-font) | 05 feature subtitles W cap 9.4, pitch 21.8 under the title; footer T cap 9.4. Widths disagree on the size: 13px sets the two long subtitles 2.1% narrow (211.0 for 215.5, 230.2 for 235.5) and the footer 1.2% narrow, while '$25 /month' 67.8 x 12.5 is what 13px sets. 13.25px splits it |
| --k-t-plan | 600 15px/20px var(--k-font) | 05 'Monthly' M cap 10.3, 'Yearly' Y cap 10.7 |
| --k-t-unit | 400 15.4px/20px var(--k-font) | 05 '/month' 11.2 tall (slash to h ascender), '/year' 13.8 (to y descender); '/month' runs 85.0-133.6 (48.6) and '/year' 270.7-305.0 (34.3), which 15px sets 47.3 and 33.5, 2.5% narrow |
| --k-t-price | 700 20px/26px var(--k-font) | 05 '300' digits 14.7 tall, '30' 15.2, which reads as 21px bold, but '$300' runs 215.8-265.3 (49.5) and '$30' 42.1-80.9 (38.8), which 21px sets 52.2 and 40.6, 5% wide, and the whole string 17.0 tall against 21px's 18.7. 20px carries the width |
| --k-t-free | 700 12.5px/14px var(--k-font) | 05 FREE 29.4 x 8.9; 12px bold sets 28.7 x 8.3, 12.5px 29.7 x 8.7, 13px 30.7 x 9.0 |
| --k-t-title | 600 21px/26px var(--k-font) | 06 'Updates to our Terms of Service and' 304.0 wide (x 49.3-353.3), its U cap 15.0 (y 379.0-394.0), cap tops 379.0 and 405.0: a 26 pitch; 21px semibold has a 15.05 cap |
| --k-t-copy | 400 14px/19px var(--k-font) | 06 body: W cap 10.0, cap tops 444.7 / 463.7 / 482.7 (19 pitch), line 2 305.3 wide (48.0-353.3); 14px has a 10.03 cap |
| --k-t-link | 400 16.75px/22px var(--k-font) | 06 'Sign out' 61.7 wide (170.0-231.7), S 12.0 tall with overshoot; 17px sets 63.0, 16.5px 61.1, 16.75px 62.1. The underline is one pt of ink 1.7 under the baseline (y 817.67-818.67) |
| --k-t-btn | 600 15.5px/20px var(--k-font) | 06 'Got it' 39.7 wide (181.3-221.0), G 11.7 tall with overshoot, the 'o' 8.3 wide; 14 'Upgrade to Access' 138.7 wide (132.0-270.7), U 11.0 flat top to overshoot; 16px semibold sets 40.8 and 143.2, 15.5px 39.6 and 138.8 |
| --k-t-hdr | 600 22px/28px var(--k-font) | 07 'SuperGrok' 107.7 wide (x 53.3-161.0), 20.0 from S top to p foot, and its glyphs wider than medium's at the same height: S 12.7 against 11.7, G 15.3 against 14.0, k 11.0 against 10.0 on the board at 500; semibold sets 106.7, with .12px tracking 107.7 |
| --k-t-chip | 500 14px/20px var(--k-font) | 07 'Build a Bot' 69.0 wide (58.0-127.0), 'Try Finance' 75.0 (198.0-273.0), caps 10.0-10.3; 14px medium sets 69.3 and 74.7 |
| --k-t-ask | 400 16px/21px var(--k-font) | 07 'Ask Anything' 93.0 x 14.3, A top to y foot (x 27.3-120.3); 17px (t-body) sets 98.3 x 15.7 on the board, 16px 92.5 x 14.8 |
| --k-t-ctl | 400 14px/18px var(--k-font) | 07 'Auto' in the model pill x 93.0-121.3 (28.3), cap 10.0: 14px regular |
| --k-t-speak | 600 14.5px/18px var(--k-font) | 07 'Speak' 42.3 wide (328.7-371.0) on the black pill, S 11.0 with overshoot; 15px semibold sets 43.7, 14.5px 42.3, the same width the 430pt capture gave |
| --k-t-sheet-h | 600 18.2px/22px var(--k-font) | 14 'Introducing Grok Bot' 174.3 wide (28.7-203.0), I cap 13.0 (679.67-692.67), 17.3 to the g foot; 18px sets 172.7 x 17.0 on the board, 18.2px 174.3 |
| --k-t-sheet-copy | 400 15.25px/20px var(--k-font) | 14 sheet body cap tops 708.3 / 728.3 / 748.3 (20 pitch), line 1 'AI teammates you can give real work to. Bots can' 338.7 x 14.0 (x 28.0-366.7); 15px sets 333.7 x 13.3 on the board, 15.25px 339.2 |
One row per token. A token with no evidence is a guess.
| --k-t-card | 500 36.5px/44px var(--k-font) | 14 'Grok Bot' on the card, 136.7 wide (155.3-292.0), cap 26.4 (547.3-573.7): 36px medium sets 135.0 on the board, 36.5px 136.9 |
| --k-t-store-h | 700 21px/26px var(--k-font) | 15 'Also Included In' 154.7 x 15.7 (x 20.7-175.3), 'What's New', 'Preview': 21px bold sets 155.0; 20.5px sets 151.3 |
| --k-t-store-title | 600 21px/26px var(--k-font) | 15 'Grok Bot' beside the icon, 82.0 x 15.7 (x 155-237, G top to the k foot): the same height as the section heads but 21px bold sets 84.3, 2.7% wide, and 21px semibold 82.2 |
| --k-t-store-sub | 400 14px/19px var(--k-font) | 15 'AI agents that do real work' 171.3 wide (154.7-326.0); 14px sets 171.5 |
| --k-t-store-label | 600 11px/13px var(--k-font) | 15 '3.3K RATINGS' 76.0 wide (30.3-106.3), 'AGE RATING' 66.3, 'CHART' 38.0, cap 8.0 (295.0-303.0): 11px semibold caps at 7.9 |
| --k-t-store-val | 700 21px/25px var(--k-font) | 15 '4.9' 31.3 wide (52-83.3), '18+' 35.0, '#19' 32.3, digit tops 318.7: 21px bold sets 31.5 / 35.2 / 32.0 |
| --k-t-store-small | 400 11.5px/14px var(--k-font) | 15 'Years' 29.7 wide (161.7-191.3), 'Productivity' 66.3 (249-315.3): 11.5px sets 29.5 / 66.0; 'News' under the bundle the same size |
| --k-t-store-bundle | 400 16px/19px var(--k-font) | 15 'Apps by SpaceXAI: AI,' cap tops 432.0 and 451.0 (19 pitch), A cap 11.3: 16px has 11.5 |
| --k-t-store-body | 400 14px/19px var(--k-font) | 15 'Version 1.8.0' cap 569.3, the three release-note lines at 598.3 / 617.3 / 636.3 (19 pitch), V cap 10.0: 14px |
| --k-t-store-btn | 600 13px/16px var(--k-font) | 15 'Purchased' 66.7 wide (302.3-369.0), P cap 9.3: 13px semibold sets 66.4 with a 9.3 cap |
| --k-t-illo-label | 500 11.5px/14px var(--k-font) | 02 'Grok' beside the app icon: ink 25.9 x 8.9; the stack sets 600 12px to 27.3 x 9.3 and 11.5px to 26.2 x 8.9. Weight and size swept over the word's box: 500 11.5px 7.9, 600 11.5px 13.4, 400 11.5px 10.1 |
| --k-t-illo-title | 600 21.25px/26px var(--k-font) | 02 sheet title 'Grok': ink 44.6 x 16.1; 700 21px sets 46.3 x 15.7, 22px 48.7 x 16.3, 600 22px 47.3 x 16.3. Swept over the word's box: 600 21.25px 7.9, 600 21px 8.7, 500 21.5px 9.1, 700 21px 11.2, 700 22px 16.7 |
| --k-t-illo-sub | 400 11.25px/15px var(--k-font) | 02 'Quickly start a new chat with Grok.': ink 184.7 x 10.7; 400 11.5px sets 188.7 x 10.7, 12px 195.7 x 11.3. Swept over the line's box in .05 steps: 11.25px 11.3, 11.2px 11.8, 11.3px 13.4, 11.5px 19.8 |
| --k-t-illo-pill | 600 15.5px/20px var(--k-font) | 02 'Grok' in the widget pill, unprojected into the card's plane: ink 35.0 x 12.2; 600 16px sets 35.3 x 12.3, and projected back reads 34.8 x 13.8 against the capture's 34.3 x 15.2, a taller face. Swept over the word's box: 15.5px 27.9, 15px 28.3, 16px 34.7, 16.5px 40.1. Set in the card's flat coordinates, before its matrix3d |
| --k-w | 393px | iPhone 14 Pro/15/16 logical width |
| --k-h | 852px | iPhone 14 Pro/15/16 logical height |
| --k-status | 54px | iOS status bar, Dynamic Island devices |
| --k-gutter | 16px | 02 card x 16.1-376.8; 04 buttons x 16.3 and 333.2-377 |
| --k-gutter-w | 20px | 05 card x 20.5-372.3, plan group and CTA the same |
| --k-tap | 44px | 02 back disc 44.1 x 43.7; 04 X and grid buttons 43-43.7 |
| --k-sheet-top | 59px | 02/03 sheet ground starts at 58.9 |
| --k-sheet-top-v | 403.6px | 04 sheet edge, col x100 |
| --k-widget | 162.4px | 01 widget 24.1-186.5 both axes |
| --k-disc | 40px | 05 icon discs 40 x 39.8, left edge 40.3 |
| --k-w-pro | 402px | iPhone 16 Pro logical width: cp6, cp7 and cp13-cp15 are 1206 x 2622 at 3 px/pt |
| --k-h-pro | 874px | iPhone 16 Pro logical height |
One row per token. A token with no evidence is a guess.
| --k-sheet-v-blur | 4px | 04 sigma of the blur read off the voice pill's edge, the one sharp edge the capture holds under the sheet: across x 270-300 at y 776/784/792 the ramp from the ground (40) to the pill (74) is 10pt for 10-90%, down x 310/334/358 over y 755-775 it is 8pt, 3.1-3.9 sigma; blur(4px). A sweep cannot read it: it walks to 44px+ because blurring the generated scene away hides the scene's own error (sheet band 13.3 at 44px against 16.3 at 4px) |
| --k-illo-stroke | 10px | 03 the drawn frame's stroke: 10.0pt at the sides (x 45.8-55.8), 9.6 at the top (y 205.9-215.5); one border |
| --k-status-pro | 59px | iOS status bar on the 402pt device: 07 clock and cluster ink y 25.7-39.3, x 44.7-366.7, no island on a screenshot; the band the template bar covers on 06-07 and 13-15, and where their scoring starts |
| --k-mono | ui-monospace,"SF Mono",Menlo,monospace | 12 the version line: every glyph of 'VERSION 1.3.42 (BUILD 2776)' sets on one pitch, 6.95pt per character over 27 characters (187.4 wide); a monospaced face, the platform's |
| --k-voice-sheet | #EDEDEE | 08/09 the voice card's interior, col x196 405-700 and row y520 outside the orb: flat #EDEDEE once the export's cast is taken out (README, colour normalisation). Its 1pt edge reads #FCFAFC, card white |
| --k-nav-well | #C8C8C9 | 08/09 the tints under the nav: the menu disc 17.8-60.7 x 63.1-106.9, the Ask pill from 130.3 x 69.4-99.8, the compose disc from 335.4 x 64.0-106.9, all flat #C8C8C9, three levels under dim |
| --k-avatar | #F0F0F0 | 10 the profile disc 32.1-91.9 x 180.2-240.4, flat #F0F0F0 around the glyph |
| --k-toggle-off | #C5C4C7 | 11 'Open App in Voice Mode' track 300.3-362.7 x 283.0-310.7, flat #C5C4C7 beside its white knob 302.0-339.1 x 285.3-308.9 |
| --k-card-line | #EAEAEA | 10 the rule between rows, x 64.3-360.7 at y 373.9-374.8 and every 52 below: two capture pixels (0.9pt) of #EAEAEA between white rows, no solve needed; drawn 0.9pt tall so the same two pixels carry it |
| --k-voice-shadow | rgba(0,0,0,.11) | 08/09 the ground beside the card reads 7-11 levels under dim, 3 above it. Swept as 0 4px 16px over the bands beside the card: .10 leaves them +0.6/+0.4, .11 +0.2/-0.0, .12 -0.5/-0.8, .14 -1.6/-2.1; 0 2px 10px and 0 6px 24px score worse at every alpha |
| --k-voice-sub | #5E5E5E | 08/09 'Upbeat Female', 'Soothing Female' and 'Swipe to explore more voices' ink core #5E5E5E |
| --k-dot-off | #A6A3A7 | 08/09 the three inactive page dots, mode #A6A3A7 across y 707.1-713.4; the active one is ink |
| --k-voice-btn | #090709 | 09 the Continue pill 46.5-347.2 x 746.1-796.5, 99.4% flat #090709: the capture's black, 9 levels above btn, which the same export reads on 07 |
| --k-section-ink | #787878 | 10/11/12 'General', 'Voice', 'Data & Information', 'Subscription' ink core #787878, three screens |
| --k-sec-ink | #7C7C7C | 10 'English' core #7C7C7C, the email line #7B7B7B: one secondary ink. 07's placeholder reads #7D7D7D off a 3 px/pt capture, kept apart because that is another device's export |
| --k-danger | #BE484C | 12 'Sign Out', the label: its 20 most-covered pixels average #BE484C (darkest 2% by luminance #AE4E52). The glyph beside it cores at #E83B43, a brighter red no ink this dark could give, and is its own crop |
| --k-version-ink | #C2C2C2 | 12 'VERSION 1.3.42 (BUILD 2776)' ink core #C3C1C3, the lightest type on the set |
One row per token. A token with no evidence is a guess.
| --k-r-voice | 37.5px | 08/09 the voice card's top corners: circle fit to its edge 37.5 (err 4.2). Its bottom corners, fit 50.5 with a poor residual, arrive as pixels in the band crop |
| --k-r-modal | 39.5px | 10/11/12 the sheet's top corners, circle fit on the dim/sheet edge 39.5 |
| --k-r-group | 25.5px | 10 the settings cards, fit 25.5 at x 16.1 / y 323.1 on the sheet |
| --k-t-nav | 500 16px/22px var(--k-font) | 08/09 'Ask' 26.3 x 12.0, 'Imagine' 56.7 wide: 500 17px sets 28.5 / 59.8, 16px 26.8 / 56.3 |
| --k-t-voice | 600 16.25px/21px var(--k-font) | 08/09 'Voice Selection' 115.5 wide, 'Ara' 24.5, 'Eve' 25.0, 09 'Continue' 67.4: 600 17px (t-h) sets 120.4 / 25.9 / 26.3 / 70.5, 16.25px 115.1 / 24.8 / 25.1 / 67.4 |
| --k-t-mail | 400 15.9px/20px var(--k-font) | 10 'alexsmith.mobbin+1@gmail.-' 207.4 wide, 'com' 29.4: 400 15px sets 195.8 / 27.7, 15.9px 207.5 / 29.4. 'Alex Smith' above it is t-h: 83.0 against 17px semibold's 82.8 |
| --k-t-section | 600 15px/20px var(--k-font) | 10/11/12 'General' 53.1 x 11.2 cap, 'Voice' 37.9, 'Data & Information' 132.0, 'Subscription' 88.8: 600 15.5px sets 55.3 / 39.3 / 136.1 / 91.9, 15px 53.5 / 38.0 / 131.7 / 88.9 |
| --k-t-voice-sub | 400 16px/21px var(--k-font) | 08/09 'Upbeat Female' 108.4 x 14.7 (cap to descender), 'Soothing Female' 120.4: 400 16px sets 108.6 / 120.2 |
| --k-t-hint | 400 14.25px/18px var(--k-font) | 08 'Swipe to explore more voices' 190.5 x 12.9: 400 14px sets 186.9, 14.25px 190.2 |
| --k-t-version | 400 11.65px/16px var(--k-mono) | 12 'VERSION 1.3.42 (BUILD 2776)' 186.9 x 11.6, parentheses to their full height: 12px sets 192.3 x 10.7, 11.65px 186.7; the face's parens are shorter than the capture's, so the width is what this fits |
| --k-row-s | 52px | 10/11 settings rows: cap tops 343.0/394.3/446.5/498.3/550.9 (pitch 51.3-52.6), a three-row card 156.1 tall, rules every 52.0 |
| --k-sheet-blur | 19px | 14 the glass sheet's backdrop blur, swept with glass-sheet over the Got it pill seen through the sheet (x 40-360 y 764-784): at .5 white, 14px sits -6.63, 16px -3.76, 18px -0.92, 19px +0.17, 20px +1.57, 28px +11.9; the same band at .52/14px -2.47 and .55/14px +3.12 |
| --k-sheet-top-s | 58.7px | 10/11/12 the sheet's edge, col x100: dim to 58.7, the header band from there |