Files
punktfunk/clients/shared/console-vectors.json
T
enricobuehler 0b550dad84 feat(android): the console tables stop drifting in silence, and the stats overlay gets a pad route
WP8 and WP9 of `punktfunk-planning/design/android-console-ui-visual-refresh.md`, in part.

**WP9.3 — shared parity vectors.** The console's background palettes, its settings section names
and its screen-transition motion each existed in three hand-written copies (`pf-console-ui`, this
client, the Apple client) held together by a comment asking the next person to keep them in step.
`clients/shared/console-vectors.json` now holds them, read the way `deeplink-vectors.json` already
is: `include_str!` in Rust, a relative path in Kotlin, `#filePath` in Swift — never a copy, because
a copy is a fourth contract free to go stale. It carries the DERIVED tables too, the 16-cell mesh
and the 4 blob colours per palette, which is the half that reaches the screen and the half Android
never checked: `GamepadPaletteTest` only ever measured the `stops` they are computed from.

Two drifts it immediately caught, both now closed:

* **The easing was the wrong curve.** `ConsoleMotion.EaseOutCubic` shipped as
  `cubic-bezier(0.215, 0.61, 0.355, 1)` while claiming to be the desktop's `ease_out_cubic`. It is
  not: that is the Penner/Ceaser table's curve, ~0.80 at the midpoint where `1 − (1−t)³` is 0.875 —
  visibly slacker over a 260 ms transition. Compose's `Easing` is a plain function, so it now
  evaluates the real thing analytically rather than approximating it at all. (Apple approximates
  with a different bezier only because SwiftUI's `timingCurve` cannot take a closure; the vectors
  sample the curve with a tolerance so all three can meet it.)
* **The desktop has a seventh tab.** Input — touch mode, mouse, invert-scroll, shortcuts — with
  nothing to set on a phone or a TV. `settings.rs` claims in prose that a setting is found under
  the same word on every client; that was true modulo an omission nobody could see. The vectors
  model it with `desktop_only` rather than picking a side, so neither client has to be wrong.

Rust reads it from three tests placed in the files that own the constants, so nothing had to be
made `pub` to be checkable. Verified green under Linux (the crate is `cfg(linux|windows)` throughout
— `cargo test` on a Mac compiles nothing and passes vacuously): 77 passed, 0 failed. Android's side
gates in CI as a FILTERED task; a plain `:app:testDebugUnitTest` would drag the ~20 Roborazzi
screenshot scenes into every push, and those are a release-artifact job.

**WP8.1 — a pad route to the stats overlay.** The tier could only be cycled by a three-finger tap,
which does not exist on a TV, on a gamepad-only session, or under touch passthrough — while the
settings row promised a live cycle. `Select + X` now cycles it, byte-identical to the Apple
client's `GamepadWire.back | GamepadWire.x`, implemented as the mic chord's twin in `GamepadRouter`
and edge-triggered on the button that completes the mask. The buttons still reach the game, as both
existing chords do. `GamepadChordTest` pins eight cases the kit had no cover for at all, including
that the three chords intersect only on Select and that none is reachable through another.

**WP8.5 — a start-of-stream banner.** The desktop's `skia_overlay` banner, ported with its timing
(opaque 5.4 s, then a 0.6 s fade) and its rule of naming only shortcuts that exist: pad chords when
a pad is present, the touch gesture when there is a touchscreen and the mode can use it. Nothing
`Ctrl+Alt+Shift` is advertised, because Android has none of it. It yields to the motion-unreachable
notice rather than stacking with it — that one reports something broken about *this* session.

**WP8.6 — the home card says which profile it connects with.** `HomeTile` carried a
`pinnedProfileId` the card never drew, so a pinned host+profile card was distinguishable from the
host's own only by a subtitle that had been quietly repurposed to hold the profile name. Both now
show the address like every other card and wear a tinted profile chip — the touch grid's own
convention and the Apple client's, inked from the console palette. Unsaved tiles (discovered, Add
Host) take a dashed edge, which is what the other two surfaces already use to say "not yours yet".

⚠ Not a detail panel: the Apple client REMOVED its own and moved the status onto the card, which is
where the lock and the online pip already were here.

**WP8.7 — accessibility, in part.** The console screens carried three `contentDescription`s and no
`semantics`, `Role` or `stateDescription` at all. A settings row now announces once, merged —
label, value, and the description that lives in the floating band far from it — with `Role.Switch`
and a real toggle state, because a toggle row's on/off string was drawn by nothing at all: the
switch replaces the value text, and the switch was two undescribed `Box`es. Decoration is silenced
rather than labelled (the chevrons were read aloud as punctuation on every focused row). The hint
bar's glyphs, the tab strip and the home tiles are done; `GamepadAddHostScreen` and `LibraryScreen`
are not yet.
2026-08-10 19:20:40 +02:00

2006 lines
30 KiB
JSON

{
"$comment": "Cross-client CONSOLE-UI parity vectors: the background palette table, the settings section tabs, and the screen-transition motion contract. Consumed by pf-console-ui's Rust tests, the Android app's ConsoleVectorsTest, and the Apple client's ConsoleVectorsTests -- so the three hand-copies of these tables can no longer drift in silence. Sibling of deeplink-vectors.json, same rules: this file is the contract, and a value absent here is a value no client may assume.",
"version": 1,
"cell_ramp": [
0.1,
-0.06,
0.04,
-0.12,
-0.08,
0.14,
-0.1,
0.06,
0.06,
-0.12,
0.16,
-0.04,
-0.1,
0.08,
-0.06,
0.12
],
"mesh_interior": [
[
0.333,
0.333,
0.11,
0.049,
0.063,
0.4
],
[
0.667,
0.333,
0.1,
0.055,
0.052,
2.1
],
[
0.333,
0.667,
0.1,
0.058,
0.049,
3.6
],
[
0.667,
0.667,
0.12,
0.047,
0.061,
5.0
]
],
"palettes": [
{
"id": "violet",
"name": "Violet",
"light": false,
"stops": [],
"ground": [
0.075,
0.06,
0.16
],
"accent": [
0.525,
0.471,
0.961
],
"mesh": [
[
0.075,
0.06,
0.16
],
[
0.34,
0.27,
0.72
],
[
0.3,
0.26,
0.74
],
[
0.075,
0.06,
0.16
],
[
0.42,
0.2,
0.54
],
[
0.49,
0.39,
0.95
],
[
0.28,
0.31,
0.84
],
[
0.16,
0.26,
0.64
],
[
0.45,
0.23,
0.6
],
[
0.53,
0.31,
0.75
],
[
0.35,
0.35,
0.91
],
[
0.19,
0.28,
0.7
],
[
0.075,
0.06,
0.16
],
[
0.22,
0.18,
0.54
],
[
0.24,
0.2,
0.58
],
[
0.075,
0.06,
0.16
]
],
"blobs": [
[
0.356,
0.308,
0.816
],
[
0.468,
0.26,
0.768
],
[
0.38,
0.348,
0.836
],
[
0.406,
0.434,
0.92
]
]
},
{
"id": "oled",
"name": "Eclipse",
"light": false,
"stops": [
[
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0
],
[
0.01,
0.02,
0.1
],
[
0.045,
0.016,
0.115
],
[
0.12,
0.024,
0.13
]
],
"ground": [
0.0,
0.0,
0.0
],
"accent": [
0.525,
0.471,
0.961
],
"mesh": [
[
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0
],
[
0.004933333,
0.009866667,
0.049333333
],
[
0.0052,
0.0104,
0.052
],
[
0.0,
0.0,
0.0
],
[
0.008933333,
0.017866667,
0.089333333
],
[
0.006,
0.012,
0.06
],
[
0.041733333,
0.016373333,
0.1136
],
[
0.005733333,
0.011466667,
0.057333333
],
[
0.0052,
0.0104,
0.052
],
[
0.068,
0.018453333,
0.1196
],
[
0.058,
0.017386667,
0.1176
],
[
0.006,
0.012,
0.06
],
[
0.044533333,
0.016053333,
0.1148
],
[
0.052,
0.016746667,
0.1164
],
[
0.12,
0.024,
0.13
]
],
"blobs": [
[
0.0,
0.0,
0.0
],
[
0.006,
0.012,
0.06
],
[
0.031,
0.0176,
0.109
],
[
0.09,
0.0208,
0.124
]
]
},
{
"id": "nebula",
"name": "Nebula",
"light": false,
"stops": [
[
0.07,
0.05,
0.2
],
[
0.26,
0.14,
0.54
],
[
0.52,
0.2,
0.72
],
[
0.82,
0.26,
0.62
],
[
0.98,
0.46,
0.68
]
],
"ground": [
0.055,
0.04,
0.135
],
"accent": [
0.95,
0.42,
0.72
],
"mesh": [
[
0.146,
0.086,
0.336
],
[
0.151066667,
0.0884,
0.345066667
],
[
0.388266667,
0.1696,
0.6288
],
[
0.3952,
0.1712,
0.6336
],
[
0.135866667,
0.0812,
0.317866667
],
[
0.492266667,
0.1936,
0.7008
],
[
0.416,
0.176,
0.648
],
[
0.792,
0.2544,
0.629333333
],
[
0.409066667,
0.1744,
0.6432
],
[
0.3952,
0.1712,
0.6336
],
[
0.869066667,
0.321333333,
0.6384
],
[
0.847733333,
0.294666667,
0.6304
],
[
0.416,
0.176,
0.648
],
[
0.816,
0.2592,
0.621333333
],
[
0.834933333,
0.278666667,
0.6256
],
[
0.98,
0.46,
0.68
]
],
"blobs": [
[
0.184,
0.104,
0.404
],
[
0.416,
0.176,
0.648
],
[
0.7,
0.236,
0.66
],
[
0.916,
0.38,
0.656
]
]
},
{
"id": "abyss",
"name": "Abyss",
"light": false,
"stops": [
[
0.02,
0.1,
0.17
],
[
0.04,
0.28,
0.42
],
[
0.07,
0.46,
0.63
],
[
0.16,
0.38,
0.78
],
[
0.26,
0.22,
0.58
]
],
"ground": [
0.018,
0.07,
0.13
],
"accent": [
0.26,
0.76,
0.92
],
"mesh": [
[
0.028,
0.172,
0.27
],
[
0.028533333,
0.1768,
0.276666667
],
[
0.0548,
0.3688,
0.5236
],
[
0.0556,
0.3736,
0.5292
],
[
0.026933333,
0.1624,
0.256666667
],
[
0.0668,
0.4408,
0.6076
],
[
0.058,
0.388,
0.546
],
[
0.1516,
0.387466667,
0.766
],
[
0.0572,
0.3832,
0.5404
],
[
0.0556,
0.3736,
0.5292
],
[
0.190666667,
0.330933333,
0.718666667
],
[
0.177333333,
0.352266667,
0.745333333
],
[
0.058,
0.388,
0.546
],
[
0.1588,
0.381066667,
0.778
],
[
0.169333333,
0.365066667,
0.761333333
],
[
0.26,
0.22,
0.58
]
],
"blobs": [
[
0.032,
0.208,
0.32
],
[
0.058,
0.388,
0.546
],
[
0.124,
0.412,
0.72
],
[
0.22,
0.284,
0.66
]
]
},
{
"id": "ember",
"name": "Ember",
"light": false,
"stops": [
[
0.16,
0.03,
0.1
],
[
0.45,
0.06,
0.12
],
[
0.72,
0.18,
0.06
],
[
0.9,
0.42,
0.08
],
[
0.95,
0.68,
0.18
]
],
"ground": [
0.09,
0.035,
0.04
],
"accent": [
0.98,
0.62,
0.26
],
"mesh": [
[
0.276,
0.042,
0.108
],
[
0.283733333,
0.0428,
0.108533333
],
[
0.5832,
0.1192,
0.0904
],
[
0.5904,
0.1224,
0.0888
],
[
0.260533333,
0.0404,
0.106933333
],
[
0.6912,
0.1672,
0.0664
],
[
0.612,
0.132,
0.084
],
[
0.8832,
0.3976,
0.078133333
],
[
0.6048,
0.1288,
0.0856
],
[
0.5904,
0.1224,
0.0888
],
[
0.915333333,
0.499733333,
0.110666667
],
[
0.908666667,
0.465066667,
0.097333333
],
[
0.612,
0.132,
0.084
],
[
0.8976,
0.4168,
0.079733333
],
[
0.904666667,
0.444266667,
0.089333333
],
[
0.95,
0.68,
0.18
]
],
"blobs": [
[
0.334,
0.048,
0.112
],
[
0.612,
0.132,
0.084
],
[
0.828,
0.324,
0.072
],
[
0.93,
0.576,
0.14
]
]
},
{
"id": "moss",
"name": "Moss",
"light": false,
"stops": [
[
0.03,
0.11,
0.09
],
[
0.06,
0.27,
0.2
],
[
0.09,
0.45,
0.31
],
[
0.28,
0.61,
0.28
],
[
0.58,
0.77,
0.31
]
],
"ground": [
0.025,
0.085,
0.07
],
"accent": [
0.48,
0.86,
0.46
],
"mesh": [
[
0.042,
0.174,
0.134
],
[
0.0428,
0.178266667,
0.136933333
],
[
0.0748,
0.3588,
0.254266667
],
[
0.0756,
0.3636,
0.2572
],
[
0.0404,
0.165466667,
0.128133333
],
[
0.0868,
0.4308,
0.298266667
],
[
0.078,
0.378,
0.266
],
[
0.262266667,
0.595066667,
0.2828
],
[
0.0772,
0.3732,
0.263066667
],
[
0.0756,
0.3636,
0.2572
],
[
0.372,
0.659066667,
0.2892
],
[
0.332,
0.637733333,
0.2852
],
[
0.078,
0.378,
0.266
],
[
0.277466667,
0.607866667,
0.2804
],
[
0.308,
0.624933333,
0.2828
],
[
0.58,
0.77,
0.31
]
],
"blobs": [
[
0.048,
0.206,
0.156
],
[
0.078,
0.378,
0.266
],
[
0.204,
0.546,
0.292
],
[
0.46,
0.706,
0.298
]
]
},
{
"id": "graphite",
"name": "Graphite",
"light": false,
"stops": [
[
0.06,
0.07,
0.11
],
[
0.15,
0.18,
0.25
],
[
0.3,
0.31,
0.35
],
[
0.45,
0.42,
0.38
],
[
0.6,
0.56,
0.49
]
],
"ground": [
0.055,
0.055,
0.07
],
"accent": [
0.78,
0.8,
0.86
],
"mesh": [
[
0.096,
0.114,
0.166
],
[
0.0984,
0.116933333,
0.169733333
],
[
0.224,
0.244133333,
0.299333333
],
[
0.228,
0.2476,
0.302
],
[
0.0912,
0.108133333,
0.158533333
],
[
0.284,
0.296133333,
0.339333333
],
[
0.24,
0.258,
0.31
],
[
0.436,
0.409733333,
0.3772
],
[
0.236,
0.254533333,
0.307333333
],
[
0.228,
0.2476,
0.302
],
[
0.496,
0.462933333,
0.413733333
],
[
0.476,
0.444266667,
0.399066667
],
[
0.24,
0.258,
0.31
],
[
0.448,
0.418533333,
0.3796
],
[
0.464,
0.433066667,
0.390266667
],
[
0.6,
0.56,
0.49
]
],
"blobs": [
[
0.114,
0.136,
0.194
],
[
0.24,
0.258,
0.31
],
[
0.39,
0.376,
0.368
],
[
0.54,
0.504,
0.446
]
]
},
{
"id": "holo",
"name": "Holo",
"light": true,
"stops": [
[
0.99,
0.72,
0.9
],
[
0.8,
0.6,
0.98
],
[
0.58,
0.62,
0.99
],
[
0.55,
0.86,
0.98
],
[
0.94,
0.98,
1.0
]
],
"ground": [
0.96,
0.92,
0.99
],
"accent": [
0.42,
0.28,
0.86
],
"mesh": [
[
0.914,
0.672,
0.932
],
[
0.908933333,
0.6688,
0.934133333
],
[
0.691466667,
0.609866667,
0.984933333
],
[
0.6856,
0.6104,
0.9852
],
[
0.924133333,
0.6784,
0.927733333
],
[
0.603466667,
0.617866667,
0.988933333
],
[
0.668,
0.612,
0.986
],
[
0.5528,
0.8376,
0.980933333
],
[
0.673866667,
0.611466667,
0.985733333
],
[
0.6856,
0.6104,
0.9852
],
[
0.6696,
0.8968,
0.986133333
],
[
0.6176,
0.8808,
0.983466667
],
[
0.668,
0.612,
0.986
],
[
0.5504,
0.8568,
0.980133333
],
[
0.5864,
0.8712,
0.981866667
],
[
0.94,
0.98,
1.0
]
],
"blobs": [
[
0.876,
0.648,
0.948
],
[
0.668,
0.612,
0.986
],
[
0.562,
0.764,
0.984
],
[
0.784,
0.932,
0.992
]
]
},
{
"id": "sunset",
"name": "Sunset",
"light": true,
"stops": [
[
0.55,
0.45,
0.92
],
[
0.86,
0.31,
0.66
],
[
0.97,
0.26,
0.34
],
[
0.99,
0.51,
0.18
],
[
1.0,
0.8,
0.22
]
],
"ground": [
0.98,
0.74,
0.34
],
"accent": [
0.64,
0.13,
0.44
],
"mesh": [
[
0.674,
0.394,
0.816
],
[
0.682266667,
0.390266667,
0.809066667
],
[
0.914266667,
0.285333333,
0.502133333
],
[
0.9172,
0.284,
0.4936
],
[
0.657466667,
0.401466667,
0.829866667
],
[
0.958266667,
0.265333333,
0.374133333
],
[
0.926,
0.28,
0.468
],
[
0.988133333,
0.486666667,
0.194933333
],
[
0.923066667,
0.281333333,
0.476533333
],
[
0.9172,
0.284,
0.4936
],
[
0.993066667,
0.598933333,
0.192266667
],
[
0.991733333,
0.560266667,
0.186933333
],
[
0.926,
0.28,
0.468
],
[
0.989733333,
0.506666667,
0.182133333
],
[
0.990933333,
0.537066667,
0.183733333
],
[
1.0,
0.8,
0.22
]
],
"blobs": [
[
0.736,
0.366,
0.764
],
[
0.926,
0.28,
0.468
],
[
0.982,
0.41,
0.244
],
[
0.996,
0.684,
0.204
]
]
},
{
"id": "bloom",
"name": "Bloom",
"light": true,
"stops": [
[
1.0,
0.86,
0.72
],
[
0.99,
0.73,
0.79
],
[
0.95,
0.65,
0.89
],
[
0.82,
0.68,
0.96
],
[
0.73,
0.79,
0.99
]
],
"ground": [
0.99,
0.9,
0.89
],
"accent": [
0.72,
0.24,
0.55
],
"mesh": [
[
0.996,
0.808,
0.748
],
[
0.995733333,
0.804533333,
0.749866667
],
[
0.970266667,
0.690533333,
0.839333333
],
[
0.9692,
0.6884,
0.842
],
[
0.996533333,
0.814933333,
0.744266667
],
[
0.954266667,
0.658533333,
0.879333333
],
[
0.966,
0.682,
0.85
],
[
0.832133333,
0.6772,
0.953466667
],
[
0.967066667,
0.684133333,
0.847333333
],
[
0.9692,
0.6884,
0.842
],
[
0.7924,
0.713733333,
0.9692
],
[
0.8044,
0.699066667,
0.9652
],
[
0.966,
0.682,
0.85
],
[
0.821733333,
0.6796,
0.959066667
],
[
0.8116,
0.690266667,
0.9628
],
[
0.73,
0.79,
0.99
]
],
"blobs": [
[
0.994,
0.782,
0.762
],
[
0.966,
0.682,
0.85
],
[
0.872,
0.668,
0.932
],
[
0.766,
0.746,
0.978
]
]
},
{
"id": "dawn",
"name": "Dawn",
"light": true,
"stops": [
[
1.0,
0.92,
0.7
],
[
1.0,
0.8,
0.62
],
[
0.99,
0.66,
0.62
],
[
0.9,
0.62,
0.78
],
[
0.77,
0.69,
0.95
]
],
"ground": [
1.0,
0.93,
0.82
],
"accent": [
0.82,
0.33,
0.28
],
"mesh": [
[
1.0,
0.872,
0.668
],
[
1.0,
0.8688,
0.665866667
],
[
0.995066667,
0.730933333,
0.62
],
[
0.9948,
0.7272,
0.62
],
[
1.0,
0.8784,
0.672266667
],
[
0.991066667,
0.674933333,
0.62
],
[
0.994,
0.716,
0.62
],
[
0.9084,
0.623733333,
0.765066667
],
[
0.994266667,
0.719733333,
0.62
],
[
0.9948,
0.7272,
0.62
],
[
0.860133333,
0.641466667,
0.832133333
],
[
0.877466667,
0.632133333,
0.809466667
],
[
0.994,
0.716,
0.62
],
[
0.9012,
0.620533333,
0.777866667
],
[
0.887866667,
0.626533333,
0.795866667
],
[
0.77,
0.69,
0.95
]
],
"blobs": [
[
1.0,
0.848,
0.652
],
[
0.994,
0.716,
0.62
],
[
0.936,
0.636,
0.716
],
[
0.822,
0.662,
0.882
]
]
},
{
"id": "mint",
"name": "Mint",
"light": true,
"stops": [
[
0.82,
0.98,
0.9
],
[
0.62,
0.94,
0.88
],
[
0.55,
0.88,
0.95
],
[
0.63,
0.82,
0.99
],
[
0.82,
0.87,
1.0
]
],
"ground": [
0.9,
0.98,
0.96
],
"accent": [
0.04,
0.42,
0.4
],
"mesh": [
[
0.74,
0.964,
0.892
],
[
0.734666667,
0.962933333,
0.891466667
],
[
0.585466667,
0.9104,
0.914533333
],
[
0.5836,
0.9088,
0.9164
],
[
0.750666667,
0.966133333,
0.893066667
],
[
0.557466667,
0.8864,
0.942533333
],
[
0.578,
0.904,
0.922
],
[
0.622533333,
0.8256,
0.986266667
],
[
0.579866667,
0.9056,
0.920133333
],
[
0.5836,
0.9088,
0.9164
],
[
0.688266667,
0.835333333,
0.993066667
],
[
0.662933333,
0.828666667,
0.991733333
],
[
0.578,
0.904,
0.922
],
[
0.628933333,
0.8208,
0.989466667
],
[
0.647733333,
0.824666667,
0.990933333
],
[
0.82,
0.87,
1.0
]
],
"blobs": [
[
0.7,
0.956,
0.888
],
[
0.578,
0.904,
0.922
],
[
0.598,
0.844,
0.974
],
[
0.744,
0.85,
0.996
]
]
},
{
"id": "opal",
"name": "Opal",
"light": true,
"stops": [
[
0.98,
0.92,
0.96
],
[
0.87,
0.93,
0.99
],
[
0.91,
0.99,
0.95
],
[
0.99,
0.96,
0.88
],
[
0.94,
0.9,
0.99
]
],
"ground": [
0.97,
0.96,
0.99
],
"accent": [
0.36,
0.32,
0.44
],
"mesh": [
[
0.936,
0.924,
0.972
],
[
0.933066667,
0.924266667,
0.9728
],
[
0.889733333,
0.9596,
0.970266667
],
[
0.8908,
0.9612,
0.9692
],
[
0.941866667,
0.923466667,
0.9704
],
[
0.905733333,
0.9836,
0.954266667
],
[
0.894,
0.966,
0.966
],
[
0.982533333,
0.9628,
0.886533333
],
[
0.892933333,
0.9644,
0.967066667
],
[
0.8908,
0.9612,
0.9692
],
[
0.974666667,
0.9416,
0.913733333
],
[
0.981333333,
0.9496,
0.899066667
],
[
0.894,
0.966,
0.966
],
[
0.988933333,
0.9604,
0.880933333
],
[
0.985333333,
0.9544,
0.890266667
],
[
0.94,
0.9,
0.99
]
],
"blobs": [
[
0.914,
0.926,
0.978
],
[
0.894,
0.966,
0.966
],
[
0.958,
0.972,
0.908
],
[
0.96,
0.924,
0.946
]
]
}
],
"tabs": [
{
"name": "Stream"
},
{
"name": "Video"
},
{
"name": "Audio"
},
{
"name": "Controller"
},
{
"name": "Input",
"desktop_only": true,
"$why": "Touch mode, mouse, invert-scroll and shortcuts are desktop-host settings with nothing to set on a phone or a TV, so the mobile clients ship six tabs and the desktop console seven. Modelled rather than omitted: a flat six-name list would red the desktop on day one, and a seven-name list would red both mobile clients."
},
{
"name": "Interface"
},
{
"name": "Profiles"
}
],
"motion": {
"$why": "The console screen transition, from pf-console-ui's shell: TRANSITION_S and the paint geometry in shell/render.rs. Every client re-implements this by hand in its own animation system, which is why it is pinned here.",
"transition_s": 0.26,
"push_slide_dp": 36.0,
"enter_scale": 0.985,
"exit_scale": 0.96,
"reveal_alpha": 0.4,
"ease_out_cubic": {
"$why": "Sampled, not given as Bezier control points: the desktop's curve is the analytic 1-(1-t)^3, Android reproduces it exactly, and SwiftUI can only approximate it with a timing curve. A tolerance on samples is the only form all three can meet. Two different beziers are published under the name 'easeOutCubic' and neither is this curve -- that is the drift this pins.",
"tolerance": 0.02,
"samples": [
{
"t": 0.0,
"p": 0.0
},
{
"t": 0.125,
"p": 0.330078125
},
{
"t": 0.25,
"p": 0.578125
},
{
"t": 0.375,
"p": 0.755859375
},
{
"t": 0.5,
"p": 0.875
},
{
"t": 0.625,
"p": 0.947265625
},
{
"t": 0.75,
"p": 0.984375
},
{
"t": 0.875,
"p": 0.998046875
},
{
"t": 1.0,
"p": 1.0
}
]
}
}
}