Files
SoulStream/handoff/notes/icon-mock.html
T
KeelrLeek 9f0601027c android: the handoff — the pending rounds, the pipeline, and what is unverified
Everything written this session that has not been through the device: rounds 43
to 48 (each patch adversarially verified, 43's transient-notice expectation
fixed), a partial round 49, the pipeline scripts, the Android Auto design and
the icon comparison mock. Also the two harness changes that were never A/B'd —
adaptive waits, which may only shorten a declared wait and never lengthen it,
and a ship that runs the mock walk and the deploy at the same time. The A/B and
its 255-step baseline are in handoff/tools; main stays at what the phone has
actually walked.
2026-09-14 07:57:41 -05:00

377 lines
53 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>SoulStream Android icon — flat vs concept 04 gradient</title>
<style>
:root{
--ui-bg:#0e1013; --ui-panel:#161a1f; --ui-line:#252b33;
--ui-fg:#d2d9e1; --ui-dim:#828e9b; --ui-hi:#6fd3e0;
}
*{box-sizing:border-box}
html,body{margin:0;background:var(--ui-bg);color:var(--ui-fg);
font:13px/1.45 ui-sans-serif,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}
a{color:var(--ui-hi)}
.wrap{max-width:1180px;margin:0 auto;padding:18px 20px 60px}
header.top{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px 16px;margin-bottom:14px}
header.top h1{font-size:15px;font-weight:650;margin:0;letter-spacing:.2px}
header.top .sub{font-size:12px;color:var(--ui-dim)}
.bar{position:sticky;top:0;z-index:20;display:flex;flex-wrap:wrap;gap:8px 18px;
align-items:center;padding:10px 12px;margin:0 0 18px;border:1px solid var(--ui-line);
border-radius:10px;background:rgba(16,19,23,.94);backdrop-filter:blur(6px)}
.grp{display:flex;align-items:center;gap:7px}
.grp>label{font-size:10.5px;text-transform:uppercase;letter-spacing:.9px;color:var(--ui-dim)}
.seg{display:flex;border:1px solid var(--ui-line);border-radius:7px;overflow:hidden}
.seg button{appearance:none;border:0;background:transparent;color:var(--ui-dim);
font:inherit;font-size:12px;padding:5px 9px;cursor:pointer;white-space:nowrap}
.seg button+button{border-left:1px solid var(--ui-line)}
.seg button:hover{color:var(--ui-fg)}
.seg button[aria-pressed="true"]{background:#232c35;color:#eaf3fa}
.chk{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ui-dim);cursor:pointer}
h2.sec{font-size:11px;text-transform:uppercase;letter-spacing:1.2px;color:var(--ui-dim);
margin:26px 0 9px;font-weight:600}
.band{border-radius:12px;padding:22px 18px 16px;margin-bottom:12px;position:relative;overflow:hidden}
.band .bandname{position:absolute;top:8px;left:12px;font-size:10px;letter-spacing:1.1px;
text-transform:uppercase;opacity:.55;font-weight:600}
.band.dark{background:radial-gradient(125% 105% at 18% -5%,#2e3339 0%,#191c21 52%,#0a0b0d 100%)}
.band.dark .bandname{color:#fff}
.band.light{background:radial-gradient(125% 105% at 18% -5%,#fdfaf5 0%,#ece5db 52%,#d5cdc1 100%)}
.band.light .bandname{color:#2b2722}
.band.neutral{background:#12151a;border:1px solid var(--ui-line)}
.band.neutral .bandname{color:var(--ui-dim)}
.cols{display:flex;flex-wrap:wrap;gap:26px;align-items:flex-start;justify-content:center}
.col{display:flex;flex-direction:column;align-items:center;gap:9px;min-width:104px}
.col.today{opacity:.92}
.tilebox{display:flex;align-items:center;justify-content:center;min-height:0}
.tag{font-size:12px;font-weight:700;letter-spacing:.4px;text-align:center}
.tagsub{font-size:10.5px;line-height:1.35;text-align:center;max-width:150px}
.band.dark .tag{color:#eef4fa}.band.dark .tagsub{color:#9aa6b3}
.band.light .tag{color:#221f1b}.band.light .tagsub{color:#6a635a}
.band.neutral .tag{color:#eef4fa}.band.neutral .tagsub{color:var(--ui-dim)}
.divider{width:1px;align-self:stretch;background:currentColor;opacity:.16;margin:0 2px}
.ladder{display:flex;flex-direction:column;gap:14px}
.lrow{display:flex;align-items:flex-end;gap:26px;justify-content:center}
.lcell{display:flex;flex-direction:column;align-items:center;gap:6px}
.lcell .sz{font-size:10px;color:var(--ui-dim)}
.lhead{display:flex;gap:26px;justify-content:center;margin-bottom:2px}
.lhead span{width:118px;text-align:center;font-size:11px;font-weight:700;letter-spacing:.4px}
.note{border:1px solid var(--ui-line);border-radius:10px;padding:14px 16px;background:var(--ui-panel);
font-size:12.5px;color:#b6c0cb;margin-top:14px}
.note b{color:#e6eef6;font-weight:650}
.note p{margin:0 0 9px}.note p:last-child{margin:0}
table.m{border-collapse:collapse;font:11.5px/1.3 ui-monospace,SFMono-Regular,Consolas,monospace;margin-top:4px}
table.m th,table.m td{border:1px solid var(--ui-line);padding:4px 8px;text-align:left}
table.m th{color:var(--ui-dim);font-weight:600}
.sw{display:inline-block;width:10px;height:10px;border-radius:2px;vertical-align:-1px;margin-right:6px;
border:1px solid rgba(255,255,255,.18)}
.hidden{display:none}
.banner{border-left:2px solid var(--ui-hi);padding:8px 0 8px 12px;margin:0 0 14px;
font-size:12.5px;color:#b6c0cb}
.banner b{color:#e6eef6}
</style>
</head>
<body>
<div class="wrap">
<header class="top">
<h1>SoulStream Android launcher icon — background layer decision</h1>
<span class="sub">real kit layers · true 108/72 adaptive geometry · nothing here is shipped</span>
</header>
<div class="bar">
<div class="grp"><label>Mask</label><div class="seg" id="segMask"></div></div>
<div class="grp"><label>Size</label><div class="seg" id="segSize"></div></div>
<div class="grp"><label>Mode</label><div class="seg" id="segMode"></div></div>
<label class="chk"><input type="checkbox" id="cbShadow" checked> launcher shadow</label>
<label class="chk"><input type="checkbox" id="cbSafe"> safe-zone guides</label>
</div>
<div id="stdBanner" class="banner">
<b>A</b> is the kit as delivered. <b>B</b> and <b>C</b> are the same concept-04 gradient, differing only in
how the 1024 artwork is mapped onto the 108-unit layer. Reply with a letter.
</div>
<div id="thmBanner" class="banner hidden">
<b>Themed icons discard the background layer entirely.</b> Android 13+ draws only the
<code>&lt;monochrome&gt;</code> drawable, tinted, on a wallpaper-derived system ground — so A, B and C are
pixel-identical here. The decision below is not a background decision; it is only whether the monochrome
layer exists at all.
</div>
<div id="stage"></div>
<h2 class="sec">Size ladder — same mask, same wallpaper</h2>
<div class="band neutral"><span class="bandname">Neutral ground</span><div id="ladder" class="ladder"></div></div>
<div class="note" id="notes"></div>
</div>
<script>
const D = {"flat":"#05080B","fgPath":{"d":"M 471.889 863.531 C 470.033 861.073 467.485 856.812 466.226 854.062 C 464.398 850.070 463.857 847.418 463.544 840.920 C 463.249 834.800 463.512 831.540 464.601 827.793 C 466.399 821.609 469.407 815.555 473.409 810.066 C 476.304 806.095 476.482 805.474 476.562 799.067 C 476.630 793.639 477.162 790.964 479.217 785.732 C 483.406 775.062 489.001 766.958 499.269 756.689 C 504.437 751.520 515.049 742.428 522.967 736.383 C 530.854 730.363 540.573 722.201 544.565 718.246 C 548.557 714.290 553.986 707.799 556.630 703.821 C 566.285 689.294 570.061 677.926 570.109 663.251 C 570.167 645.247 564.288 631.978 550.406 618.778 C 543.711 612.413 537.141 607.939 527.046 602.871 C 511.185 594.907 499.224 590.830 464.632 581.594 C 429.650 572.254 407.140 565.108 384.291 556.087 C 369.696 550.324 349.615 540.740 338.462 534.213 C 320.047 523.435 302.208 509.772 290.291 497.319 C 282.487 489.163 272.391 476.452 268.043 469.309 C 260.079 456.225 252.284 438.708 251.281 431.640 C 250.907 429.006 251.062 428.044 251.860 428.044 C 252.460 428.044 257.063 430.702 262.090 433.950 C 279.955 445.495 298.689 456.033 313.781 463.025 L 321.990 466.828 L 315.175 459.916 C 306.482 451.099 297.522 440.054 290.373 429.342 C 283.846 419.562 275.156 402.180 271.326 391.240 C 268.303 382.605 266.682 375.526 264.934 363.320 C 263.614 354.107 263.278 340.053 264.377 340.053 C 264.755 340.053 271.343 346.050 279.018 353.379 C 305.154 378.337 323.767 394.790 344.545 411.305 C 357.025 421.223 379.468 437.524 391.447 445.369 C 421.469 465.031 452.755 481.034 483.387 492.398 C 493.465 496.137 514.890 502.670 542.833 510.526 C 553.736 513.591 567.823 518.023 574.138 520.375 C 589.578 526.124 605.702 534.093 616.621 541.371 C 626.525 547.973 639.041 559.257 644.889 566.856 C 650.348 573.951 654.995 583.053 657.601 591.759 C 659.560 598.303 659.892 600.978 659.957 610.795 C 660.037 622.827 659.257 627.864 655.632 638.715 C 653.007 646.577 649.606 653.442 644.525 661.136 C 642.375 664.394 640.265 667.630 639.838 668.328 C 639.410 669.026 642.266 666.701 646.183 663.161 C 658.976 651.602 669.377 635.863 674.360 620.525 C 680.887 600.431 681.418 582.436 676.073 562.442 C 672.127 547.683 662.390 530.337 650.734 517.305 C 640.568 505.936 625.125 494.022 607.956 484.301 C 589.833 474.040 573.381 467.503 530.216 453.412 C 512.773 447.718 493.356 440.996 487.066 438.473 C 474.757 433.536 464.611 428.344 455.790 422.469 C 449.119 418.025 438.217 408.277 432.454 401.601 C 422.380 389.933 413.615 372.247 410.336 356.975 C 409.168 351.535 408.804 346.280 408.840 335.400 C 408.881 323.303 409.202 319.739 410.863 312.979 C 414.453 298.361 419.429 287.287 428.148 274.505 C 434.444 265.277 446.706 252.323 456.519 244.535 C 483.937 222.774 516.119 207.844 564.045 194.653 C 579.471 190.408 592.384 187.409 620.816 181.469 C 654.191 174.497 674.652 168.373 699.416 157.943 C 728.416 145.729 764.550 125.102 787.619 107.593 C 791.507 104.642 792.482 104.208 792.476 105.431 C 792.471 106.273 791.534 108.965 790.394 111.414 C 785.297 122.364 772.485 139.362 759.953 151.803 C 750.130 161.555 738.729 170.675 725.744 179.167 C 715.779 185.684 694.819 196.809 683.162 201.768 C 680.040 203.097 677.586 204.285 677.710 204.409 C 678.135 204.834 706.608 197.159 714.223 194.567 C 728.618 189.666 742.169 183.962 756.021 176.972 C 763.653 173.121 770.077 170.148 770.294 170.366 C 771.203 171.274 761.797 182.974 752.317 192.729 C 741.008 204.364 729.933 213.624 716.943 222.304 C 698.650 234.528 680.678 243.412 657.959 251.461 C 642.229 257.034 624.511 261.607 598.311 266.858 C 587.608 269.003 574.363 271.878 568.878 273.248 C 555.300 276.639 537.612 282.530 526.395 287.397 C 507.859 295.440 490.988 307.165 482.040 318.224 C 479.729 321.080 476.651 325.830 475.199 328.779 C 473.747 331.728 471.958 337.085 471.225 340.682 C 470.121 346.096 470.058 348.298 470.860 353.458 C 472.774 365.768 478.100 375.203 489.472 386.432 C 502.963 399.753 527.921 414.250 558.969 426.799 C 566.647 429.902 581.496 435.667 591.966 439.609 C 638.284 457.049 660.959 467.018 682.072 479.225 C 693.287 485.709 708.151 495.840 717.893 503.640 C 729.475 512.914 743.275 526.023 750.422 534.542 C 762.716 549.194 773.237 567.193 778.922 583.298 C 782.840 594.397 785.607 607.564 786.657 620.110 C 787.335 628.206 787.324 633.770 786.618 641.059 C 783.472 673.507 771.319 700.824 748.857 725.937 C 745.773 729.385 740.336 734.824 736.774 738.023 C 710.587 761.547 675.649 780.088 633.589 792.780 C 625.820 795.125 606.899 800.277 591.543 804.231 C 558.928 812.627 544.532 816.705 530.869 821.417 C 510.985 828.275 497.176 835.191 487.628 843.074 C 480.759 848.745 477.646 854.394 477.088 862.205 C 476.860 865.392 476.356 868.000 475.968 868.000 C 475.580 868.000 473.745 865.989 471.889 863.531 Z M 507.752 803.633 C 514.224 802.436 520.624 799.550 524.691 795.993 C 526.496 794.414 530.427 789.316 533.427 784.662 C 536.427 780.009 539.690 775.298 540.676 774.193 L 542.471 772.184 L 540.355 772.833 C 535.533 774.313 524.758 779.223 520.900 781.698 C 515.461 785.189 506.696 794.586 503.710 800.128 C 502.401 802.557 501.665 804.545 502.074 804.545 C 502.483 804.545 505.038 804.134 507.752 803.633 Z","t":"translate(9.814 9.814) scale(0.08630000) translate(-40.740741 20.370370)","tParsed":[9.814,9.814,0.0863,-40.740741,20.37037]},"monoPath":{"d":"M 471.889 863.531 C 470.033 861.073 467.485 856.812 466.226 854.062 C 464.398 850.070 463.857 847.418 463.544 840.920 C 463.249 834.800 463.512 831.540 464.601 827.793 C 466.399 821.609 469.407 815.555 473.409 810.066 C 476.304 806.095 476.482 805.474 476.562 799.067 C 476.630 793.639 477.162 790.964 479.217 785.732 C 483.406 775.062 489.001 766.958 499.269 756.689 C 504.437 751.520 515.049 742.428 522.967 736.383 C 530.854 730.363 540.573 722.201 544.565 718.246 C 548.557 714.290 553.986 707.799 556.630 703.821 C 566.285 689.294 570.061 677.926 570.109 663.251 C 570.167 645.247 564.288 631.978 550.406 618.778 C 543.711 612.413 537.141 607.939 527.046 602.871 C 511.185 594.907 499.224 590.830 464.632 581.594 C 429.650 572.254 407.140 565.108 384.291 556.087 C 369.696 550.324 349.615 540.740 338.462 534.213 C 320.047 523.435 302.208 509.772 290.291 497.319 C 282.487 489.163 272.391 476.452 268.043 469.309 C 260.079 456.225 252.284 438.708 251.281 431.640 C 250.907 429.006 251.062 428.044 251.860 428.044 C 252.460 428.044 257.063 430.702 262.090 433.950 C 279.955 445.495 298.689 456.033 313.781 463.025 L 321.990 466.828 L 315.175 459.916 C 306.482 451.099 297.522 440.054 290.373 429.342 C 283.846 419.562 275.156 402.180 271.326 391.240 C 268.303 382.605 266.682 375.526 264.934 363.320 C 263.614 354.107 263.278 340.053 264.377 340.053 C 264.755 340.053 271.343 346.050 279.018 353.379 C 305.154 378.337 323.767 394.790 344.545 411.305 C 357.025 421.223 379.468 437.524 391.447 445.369 C 421.469 465.031 452.755 481.034 483.387 492.398 C 493.465 496.137 514.890 502.670 542.833 510.526 C 553.736 513.591 567.823 518.023 574.138 520.375 C 589.578 526.124 605.702 534.093 616.621 541.371 C 626.525 547.973 639.041 559.257 644.889 566.856 C 650.348 573.951 654.995 583.053 657.601 591.759 C 659.560 598.303 659.892 600.978 659.957 610.795 C 660.037 622.827 659.257 627.864 655.632 638.715 C 653.007 646.577 649.606 653.442 644.525 661.136 C 642.375 664.394 640.265 667.630 639.838 668.328 C 639.410 669.026 642.266 666.701 646.183 663.161 C 658.976 651.602 669.377 635.863 674.360 620.525 C 680.887 600.431 681.418 582.436 676.073 562.442 C 672.127 547.683 662.390 530.337 650.734 517.305 C 640.568 505.936 625.125 494.022 607.956 484.301 C 589.833 474.040 573.381 467.503 530.216 453.412 C 512.773 447.718 493.356 440.996 487.066 438.473 C 474.757 433.536 464.611 428.344 455.790 422.469 C 449.119 418.025 438.217 408.277 432.454 401.601 C 422.380 389.933 413.615 372.247 410.336 356.975 C 409.168 351.535 408.804 346.280 408.840 335.400 C 408.881 323.303 409.202 319.739 410.863 312.979 C 414.453 298.361 419.429 287.287 428.148 274.505 C 434.444 265.277 446.706 252.323 456.519 244.535 C 483.937 222.774 516.119 207.844 564.045 194.653 C 579.471 190.408 592.384 187.409 620.816 181.469 C 654.191 174.497 674.652 168.373 699.416 157.943 C 728.416 145.729 764.550 125.102 787.619 107.593 C 791.507 104.642 792.482 104.208 792.476 105.431 C 792.471 106.273 791.534 108.965 790.394 111.414 C 785.297 122.364 772.485 139.362 759.953 151.803 C 750.130 161.555 738.729 170.675 725.744 179.167 C 715.779 185.684 694.819 196.809 683.162 201.768 C 680.040 203.097 677.586 204.285 677.710 204.409 C 678.135 204.834 706.608 197.159 714.223 194.567 C 728.618 189.666 742.169 183.962 756.021 176.972 C 763.653 173.121 770.077 170.148 770.294 170.366 C 771.203 171.274 761.797 182.974 752.317 192.729 C 741.008 204.364 729.933 213.624 716.943 222.304 C 698.650 234.528 680.678 243.412 657.959 251.461 C 642.229 257.034 624.511 261.607 598.311 266.858 C 587.608 269.003 574.363 271.878 568.878 273.248 C 555.300 276.639 537.612 282.530 526.395 287.397 C 507.859 295.440 490.988 307.165 482.040 318.224 C 479.729 321.080 476.651 325.830 475.199 328.779 C 473.747 331.728 471.958 337.085 471.225 340.682 C 470.121 346.096 470.058 348.298 470.860 353.458 C 472.774 365.768 478.100 375.203 489.472 386.432 C 502.963 399.753 527.921 414.250 558.969 426.799 C 566.647 429.902 581.496 435.667 591.966 439.609 C 638.284 457.049 660.959 467.018 682.072 479.225 C 693.287 485.709 708.151 495.840 717.893 503.640 C 729.475 512.914 743.275 526.023 750.422 534.542 C 762.716 549.194 773.237 567.193 778.922 583.298 C 782.840 594.397 785.607 607.564 786.657 620.110 C 787.335 628.206 787.324 633.770 786.618 641.059 C 783.472 673.507 771.319 700.824 748.857 725.937 C 745.773 729.385 740.336 734.824 736.774 738.023 C 710.587 761.547 675.649 780.088 633.589 792.780 C 625.820 795.125 606.899 800.277 591.543 804.231 C 558.928 812.627 544.532 816.705 530.869 821.417 C 510.985 828.275 497.176 835.191 487.628 843.074 C 480.759 848.745 477.646 854.394 477.088 862.205 C 476.860 865.392 476.356 868.000 475.968 868.000 C 475.580 868.000 473.745 865.989 471.889 863.531 Z M 507.752 803.633 C 514.224 802.436 520.624 799.550 524.691 795.993 C 526.496 794.414 530.427 789.316 533.427 784.662 C 536.427 780.009 539.690 775.298 540.676 774.193 L 542.471 772.184 L 540.355 772.833 C 535.533 774.313 524.758 779.223 520.900 781.698 C 515.461 785.189 506.696 794.586 503.710 800.128 C 502.401 802.557 501.665 804.545 502.074 804.545 C 502.483 804.545 505.038 804.134 507.752 803.633 Z","t":"translate(9.814 9.814) scale(0.08630000) translate(-40.740741 20.370370)"},"fgGrad":{"x1":28.05,"y1":41.95,"x2":65.85,"y2":79.32,"stops":[{"o":0,"c":"#31C0CB"},{"o":0.48,"c":"#31C0CB"},{"o":0.55,"c":"#33BFD1"},{"o":0.63,"c":"#35BADF"},{"o":0.71,"c":"#38B6ED"},{"o":0.78,"c":"#39B3F1"},{"o":1,"c":"#39B3F1"}]},"gradL":{"surf":{"x1":13.710938,"y1":5.273438,"x2":92.8125,"y2":103.359375,"stops":[{"o":0,"c":"#0A2330"},{"o":0.52,"c":"#07141F"},{"o":1,"c":"#040A10"}]},"glow":{"cx":28.476563,"cy":23.203125,"rot":43,"r":69.609375,"stops":[{"o":0,"c":"#31C0CB","a":0.18},{"o":0.58,"c":"#1F8FC9","a":0.05},{"o":1,"c":"#07141F","a":0}]}},"gradM":{"surf":{"x1":27.140625,"y1":21.515625,"x2":79.875,"y2":86.90625,"stops":[{"o":0,"c":"#0A2330"},{"o":0.52,"c":"#07141F"},{"o":1,"c":"#040A10"}]},"glow":{"cx":36.984375,"cy":33.46875,"rot":43,"r":46.40625,"stops":[{"o":0,"c":"#31C0CB","a":0.18},{"o":0.58,"c":"#1F8FC9","a":0.05},{"o":1,"c":"#07141F","a":0}]}},"samples":[{"where":"visible NW corner (18, 18)","v":["#05080B","#0E3543","#0B2A39"]},{"where":"circle NW rim (28.5, 28.5)","v":["#05080B","#0F3643","#0E3442"]},{"where":"mask centre (54, 54)","v":["#05080B","#081B28","#081B28"]},{"where":"circle SE rim (79.5, 79.5)","v":["#05080B","#050E17","#040C12"]},{"where":"visible SE corner (90, 90)","v":["#05080B","#050C13","#040A10"]}],"todayPng":"data:image/png;base64,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","themed":{"light":{"ground":"#DCE3E9","ink":"#44515E"},"dark":{"ground":"#2A3138","ink":"#C6D3DF"}}};
/* ---------- Android adaptive geometry ----------------------------------
Layers are 108x108 dp. The launcher mask shows only the central 72x72 dp,
i.e. the layer is drawn at 1.5x the on-screen icon size and centre-cropped.
Every tile below is an <svg viewBox="18 18 72 72"> over 108-unit artwork,
which reproduces exactly that. The 66 dp circle is the content safe zone.
------------------------------------------------------------------------*/
const VIEWBOX = '18 18 72 72';
/* Mask outlines in a 0..100 box, mapped into the visible 72 window. */
const MASKS = {
circle: {label:'Circle', d:'M50,0 A50,50 0 1,1 50,100 A50,50 0 1,1 50,0 Z'},
squircle: {label:'Squircle', d:'M50,0 C10.05,0 0,10.05 0,50 C0,89.95 10.05,100 50,100 C89.95,100 100,89.95 100,50 C100,10.05 89.95,0 50,0 Z'},
rsquare: {label:'Rounded square',d:'M20,0 L80,0 A20,20 0 0,1 100,20 L100,80 A20,20 0 0,1 80,100 L20,100 A20,20 0 0,1 0,80 L0,20 A20,20 0 0,1 20,0 Z'},
teardrop: {label:'Teardrop (aggressive OEM)',d:'M0,20 A20,20 0 0,1 20,0 L50,0 A50,50 0 1,1 0,50 Z'}
};
const SIZES = [
{px:24, cap:'24 dp · notification'},
{px:32, cap:'32 dp · recents chip'},
{px:48, cap:'48 dp · launcher grid'},
{px:64, cap:'64 dp · folder / tablet'},
{px:112, cap:'112 dp · inspect'}
];
const VARIANTS = [
{id:'today', tag:'TODAY', sub:'shipping raster — Tauri placeholder on a white plate', today:true},
{id:'flat', tag:'A — FLAT', sub:'kit as delivered · solid ' + D.flat},
{id:'gradL', tag:'B — GRADIENT', sub:'concept 04 mapped 1024 → the whole 108 layer'},
{id:'gradM', tag:'C — GRADIENT', sub:'concept 04 mapped 1024 → the visible 72 window'}
];
/* ---------- defs ------------------------------------------------------ */
function stopsSVG(stops){
return stops.map(s =>
'<stop offset="'+s.o+'" stop-color="'+s.c+'"'+(s.a!=null?' stop-opacity="'+s.a+'"':'')+'/>'
).join('');
}
function linSVG(id,g){
return '<linearGradient id="'+id+'" gradientUnits="userSpaceOnUse" color-interpolation="sRGB" '+
'x1="'+g.x1+'" y1="'+g.y1+'" x2="'+g.x2+'" y2="'+g.y2+'">'+stopsSVG(g.stops)+'</linearGradient>';
}
function radSVG(id,g){
return '<radialGradient id="'+id+'" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" '+
'gradientTransform="translate('+g.cx+' '+g.cy+') rotate('+g.rot+') scale('+g.r+')">'+
stopsSVG(g.stops)+'</radialGradient>';
}
function buildDefs(){
let s = '<svg width="0" height="0" style="position:absolute" aria-hidden="true"><defs>';
s += linSVG('fgGrad', D.fgGrad);
s += linSVG('surfL', D.gradL.surf) + radSVG('glowL', D.gradL.glow);
s += linSVG('surfM', D.gradM.surf) + radSVG('glowM', D.gradM.glow);
for (const k in MASKS){
s += '<clipPath id="clip-'+k+'" clipPathUnits="userSpaceOnUse">'+
'<path transform="translate(18,18) scale(0.72)" d="'+MASKS[k].d+'"/></clipPath>';
}
s += '</defs></svg>';
const el = document.createElement('div'); el.innerHTML = s; document.body.appendChild(el.firstChild);
}
/* ---------- layers ---------------------------------------------------- */
const FG = '<path d="'+D.fgPath.d+'" fill="url(#fgGrad)" fill-rule="evenodd" transform="'+D.fgPath.t+'"/>';
function MONO(fillVar){
return '<path d="'+D.monoPath.d+'" fill="'+fillVar+'" fill-rule="evenodd" transform="'+D.monoPath.t+'"/>';
}
const RECT = '<rect x="0" y="0" width="108" height="108" ';
function layers(id){
switch(id){
case 'flat': return RECT+'fill="'+D.flat+'"/>' + FG;
case 'gradL': return RECT+'fill="url(#surfL)"/>' + RECT+'fill="url(#glowL)"/>' + FG;
case 'gradM': return RECT+'fill="url(#surfM)"/>' + RECT+'fill="url(#glowM)"/>' + FG;
case 'today': /* Launcher3 wraps a legacy raster: corner-extracted plate + icon at ~0.7 */
return RECT+'fill="#ffffff"/>' +
'<image href="'+D.todayPng+'" x="28.8" y="28.8" width="50.4" height="50.4" '+
'preserveAspectRatio="xMidYMid meet"/>';
case 'monoLight': return RECT+'fill="'+D.themed.light.ground+'"/>' + MONO(D.themed.light.ink);
case 'monoDark': return RECT+'fill="'+D.themed.dark.ground +'"/>' + MONO(D.themed.dark.ink);
case 'todayThemed': return layers('today');
}
return '';
}
const SAFE = '<g fill="none" stroke="#ff4d6d" stroke-opacity=".85">'+
'<circle cx="54" cy="54" r="33" stroke-width=".6" stroke-dasharray="2 2"/>'+
'<rect x="18" y="18" width="72" height="72" stroke-width=".6" stroke-opacity=".45"/></g>';
function tile(variantId, px, mask){
const sh = state.shadow
? 'filter:drop-shadow(0 '+(px/48).toFixed(2)+'px '+(px/26).toFixed(2)+'px rgba(0,0,0,.30)) '+
'drop-shadow(0 0 '+(px/40).toFixed(2)+'px rgba(0,0,0,.14));' : '';
return '<svg class="tile" width="'+px+'" height="'+px+'" viewBox="'+VIEWBOX+'" style="'+sh+'display:block">'+
'<g clip-path="url(#clip-'+mask+')">'+layers(variantId)+(state.safe?SAFE:'')+'</g></svg>';
}
/* ---------- state + render -------------------------------------------- */
const state = {mask:'circle', size:48, mode:'standard', shadow:true, safe:false};
/* the hash makes any view reproducible: #mask=teardrop&size=112&mode=themed */
(function readHash(){
for (const kv of location.hash.replace(/^#/,'').split('&')){
const [k,v] = kv.split('=');
if (k === 'mask' && MASKS[v]) state.mask = v;
if (k === 'size' && SIZES.some(s => s.px === +v)) state.size = +v;
if (k === 'mode' && (v === 'themed' || v === 'standard')) state.mode = v;
if (k === 'shadow') state.shadow = v !== '0';
if (k === 'safe') state.safe = v === '1';
}
})();
function writeHash(){
history.replaceState(null,'','#mask='+state.mask+'&size='+state.size+'&mode='+state.mode+
'&shadow='+(state.shadow?1:0)+'&safe='+(state.safe?1:0));
}
function seg(host, items, key, onpick){
host.innerHTML = items.map(i =>
'<button data-v="'+i.v+'" aria-pressed="'+(state[key]===i.v)+'">'+i.t+'</button>').join('');
host.onclick = e => {
const b = e.target.closest('button'); if(!b) return;
state[key] = items.find(i => String(i.v) === b.dataset.v).v;
[...host.children].forEach(c => c.setAttribute('aria-pressed', c === b));
onpick && onpick(); render(); writeHash();
};
}
function colHTML(v, px){
return '<div class="col'+(v.today?' today':'')+'">'+
'<div class="tilebox">'+tile(v.id, px, state.mask)+'</div>'+
'<div class="tag">'+v.tag+'</div><div class="tagsub">'+v.sub+'</div></div>';
}
function bandStandard(cls, name){
let h = '<div class="band '+cls+'"><span class="bandname">'+name+'</span><div class="cols">';
h += colHTML(VARIANTS[0], state.size);
h += '<div class="divider"></div>';
for (let i=1;i<VARIANTS.length;i++) h += colHTML(VARIANTS[i], state.size);
return h + '</div></div>';
}
function bandThemed(cls, name, which){
const t = which === 'light' ? D.themed.light : D.themed.dark;
const cols = [
{id:'todayThemed', tag:'TODAY', sub:'no monochrome layer — the launcher leaves it full-colour among themed neighbours', today:true},
{id: which==='light'?'monoLight':'monoDark', tag:'A / B / C', sub:'kit monochrome, tinted '+t.ink+' on system ground '+t.ground}
];
let h = '<div class="band '+cls+'"><span class="bandname">'+name+'</span><div class="cols">';
h += colHTML(cols[0], state.size) + '<div class="divider"></div>' + colHTML(cols[1], state.size);
return h + '</div></div>';
}
function render(){
const stage = document.getElementById('stage');
const themed = state.mode === 'themed';
document.getElementById('stdBanner').classList.toggle('hidden', themed);
document.getElementById('thmBanner').classList.toggle('hidden', !themed);
if (!themed){
stage.innerHTML = bandStandard('dark','Dark wallpaper') + bandStandard('light','Light wallpaper');
} else {
stage.innerHTML = bandThemed('light','Light theme · wallpaper-derived ground','light') +
bandThemed('dark','Dark theme · wallpaper-derived ground','dark');
}
const list = themed
? [{id:'todayThemed',tag:'TODAY'},{id:'monoLight',tag:'THEMED · LIGHT'},{id:'monoDark',tag:'THEMED · DARK'}]
: VARIANTS;
let lh = '<div class="lhead">' + list.map(v=>'<span>'+v.tag+'</span>').join('') + '</div>';
for (const s of SIZES){
lh += '<div class="lrow">' + list.map(v =>
'<div class="lcell" style="width:118px"><div class="tilebox">'+tile(v.id, s.px, state.mask)+
'</div><div class="sz">'+s.cap+'</div></div>').join('') + '</div>';
}
document.getElementById('ladder').innerHTML = lh;
}
/* ---------- measurement: how much background does the falcon leave? ---- */
function coverage(maskKey){
const N = 512, c = document.createElement('canvas');
c.width = c.height = N; const x = c.getContext('2d');
const k = N/72; // 72 visible units -> N px
// mask
x.save(); x.scale(k,k); x.translate(-18,-18);
x.translate(18,18); x.scale(0.72,0.72);
x.fill(new Path2D(MASKS[maskKey].d)); x.restore();
const maskData = x.getImageData(0,0,N,N).data;
let maskPx = 0; for (let i=3;i<maskData.length;i+=4) if (maskData[i]>127) maskPx++;
// falcon inside the mask
x.globalCompositeOperation = 'source-in';
x.save(); x.scale(k,k); x.translate(-18,-18);
const t = D.fgPath.tParsed; // [tx,ty,s,tx2,ty2]
x.translate(t[0],t[1]); x.scale(t[2],t[2]); x.translate(t[3],t[4]);
x.fill(new Path2D(D.fgPath.d),'evenodd'); x.restore();
const fgData = x.getImageData(0,0,N,N).data;
let fgPx = 0; for (let i=3;i<fgData.length;i+=4) if (fgData[i]>127) fgPx++;
// the falcon on its own, to see how much the mask shaves off
const c2 = document.createElement('canvas'); c2.width = c2.height = N;
const y = c2.getContext('2d');
y.save(); y.scale(k,k); y.translate(-18,-18);
y.translate(t[0],t[1]); y.scale(t[2],t[2]); y.translate(t[3],t[4]);
y.fill(new Path2D(D.fgPath.d),'evenodd'); y.restore();
const allData = y.getImageData(0,0,N,N).data;
let allPx = 0; for (let i=3;i<allData.length;i+=4) if (allData[i]>127) allPx++;
return {mask:maskPx, fg:fgPx, pct: 100*fgPx/maskPx, kept: 100*fgPx/allPx,
maskOfSquare: 100*maskPx/(N*N)};
}
/* ---------- notes ----------------------------------------------------- */
function notes(){
const cov = coverage(state.mask);
const rows = D.samples.map(r =>
'<tr><td>'+r.where+'</td>'+
r.v.map(v=>'<td><span class="sw" style="background:'+v+'"></span>'+v+'</td>').join('')+'</tr>').join('');
document.getElementById('notes').innerHTML =
'<p><b>Geometry.</b> Layers are 108 dp; the mask shows the central 72 dp, so every layer is drawn at '+
'1.5&times; the icon size and centre-cropped — that is what the <code>viewBox="18 18 72 72"</code> on each '+
'tile reproduces. The foreground and monochrome paths, including the kit\'s v1.1 optical offset '+
'<code>translate(-40.740741 20.370370)</code>, are copied verbatim from the kit SVGs and are '+
'<b>identical in A, B and C</b>. Only the background layer changes.</p>'+
'<p><b>Composited background colour</b> (surface + glow, under the falcon, sampled in layer units):</p>'+
'<table class="m"><tr><th>point in the visible 72 window</th><th>A flat</th><th>B layer-fit</th>'+
'<th>C mask-fit</th></tr>'+rows+'</table>'+
'<p style="margin-top:10px"><b>How much background is even visible?</b> Measured live on this page: '+
'under the '+MASKS[state.mask].label.toLowerCase()+' mask the falcon covers only <b>'+
cov.pct.toFixed(1)+'%</b> of the masked area, so the background owns the other '+
(100-cov.pct).toFixed(1)+'%. That mask keeps '+cov.maskOfSquare.toFixed(1)+'% of the 72 dp square and '+
cov.kept.toFixed(1)+'% of the falcon (the falcon\'s painted box is 46.6 &times; 65.8 of the 72 window, '+
'so even a circle shaves only the extreme tips).</p>'+
'<p><b>B vs C.</b> B maps the 1024 artwork onto the whole 108 layer, so the visible 72 window sees only '+
'the middle two-thirds of the gradient. C maps it onto the visible 72 window, so the masked result matches '+
'the desktop tile corner for corner — but C\'s outer 18 dp of bleed is flat padding, which is what a '+
'launcher reveals when it parallaxes the layers on a swipe. Under a circle the two are almost the same '+
'(#0F3643 vs #0E3442 at the NW rim); they separate only where a mask keeps the corners.</p>'+
'<p><b>Honesty notes.</b> 1 dp = 1 CSS px here; on a Pixel-class screen a 48 dp icon is ~132 physical '+
'pixels but only ~7.6 mm across. Mask outlines are the standard circle / squircle / rounded-square / '+
'teardrop families — OEM paths vary slightly. The launcher shadow is a Launcher3-style ambient+key pair, '+
'approximated in CSS, applied identically to every tile. Themed-icon ground and ink are representative '+
'Material You tones; the real values are derived from the user\'s wallpaper. The TODAY column is the '+
'actual shipping <code>mipmap-xxxhdpi/ic_launcher.png</code> with Launcher3\'s legacy plating '+
'(corner-extracted plate, icon at 0.7) applied.</p>';
}
/* ---------- boot ------------------------------------------------------ */
buildDefs();
seg(document.getElementById('segMask'),
Object.keys(MASKS).map(k=>({v:k,t:MASKS[k].label})), 'mask', notes);
seg(document.getElementById('segSize'),
SIZES.map(s=>({v:s.px,t:s.px+' dp'})), 'size');
seg(document.getElementById('segMode'),
[{v:'standard',t:'Standard'},{v:'themed',t:'Themed (13+)'}], 'mode');
document.getElementById('cbShadow').checked = state.shadow;
document.getElementById('cbSafe').checked = state.safe;
document.getElementById('cbShadow').onchange = e => { state.shadow = e.target.checked; render(); writeHash(); };
document.getElementById('cbSafe').onchange = e => { state.safe = e.target.checked; render(); writeHash(); };
render(); notes(); writeHash();
</script>
</body>
</html>