# GLASS do Figma decomposto — sondas analíticas, mapas medidos, backdrop-filter url()

Aprendido em 2026-09-30 levando o Primary Button da NASH (`327:850`, arquivo
`<figma-ds>`) ao HTML. Estudo, sondas e medidas em
`~/Documents/Profissional/replicas/nash-glass-primary-button/`. Renderizado e
visto: prancha Figma | kit | receita nova, diff por região em densidade 2.

- **Exportar em escala 2 pelo MCP:** `get_screenshot` não passa do tamanho
  natural do nó. `exportAsync({constraint:{type:'SCALE',value:2}})` →
  `figma.createImage(bytes)` → retângulo temporário com o fill 1:1 →
  `get_screenshot` dele → apagar o retângulo. Canal conferido: 1x direto contra
  1x via imagem deu |Δ| 0,0001.
- **Decompor com sondas, não com o botão.** Retângulos sem fill com o mesmo
  GLASS e um parâmetro zerado por vez, sobre fundos analíticos: rampa X e rampa
  Y (o valor lido é a coordenada de origem — o campo de refração sai pixel a
  pixel), preto e cinza 128 (a luz com sinal), meia tela branca e barra fora da
  forma (o frost). Esconder as sondas e exportar de novo dá o fundo exato.
- **O que o GLASS é, medido (radius 100, depth 20, refraction 0,8, luz −45°
  0,8, splay 0,37, dispersion 0,5):** frost = gaussiano σ ≈ radius/2 (42) sobre
  a caixa da forma + ~100 px, preto fora; depois a refração, sempre para
  dentro, 15,6 px na borda, zero a ~13 px, com componente tangencial que puxa
  para o centro (f(d)·normal erra 1,4 px; usar o campo medido); depois a luz,
  aditiva e neutra, que não passa pelo frost (aro de 1 px até +192, sombreado
  −10/+8 no bisel); o fill vem por cima de tudo. Dispersão: R 1,044×, B
  0,953× — some depois de σ 42.
- **Em Chromium, `backdrop-filter: url(#f)` reproduz:** camada 100 px maior que
  o botão com `clip-path: inset(100px round r)` no mesmo elemento;
  `feGaussianBlur edgeMode="none"` + `feComposite over` preto; `feImage` do
  campo (R=dx, G=dy, escala 34) sobre `feFlood` 128 → `feDisplacementMap`; luz
  por `feComposite arithmetic` (L+ com k2=k3=1; L− codificado 1−20L/255 sobre
  branco com k3=0,05, k4=−0,05, que mantém o alfa em 1);
  `color-interpolation-filters="sRGB"`. Resultado: |Δ| 0,87 no bisel e no miolo
  contra 13,4/12,3 do `blur(28px) saturate(1.85)`.
- **Texto:** `-webkit-font-smoothing: antialiased` tirou o texto de 8,1 para
  3,6; o resto é o rasterizador (peso 400 é o mínimo da varredura).
- **Conota**: o frost diz que o fundo existe mas não se entrega; a borda que
  puxa o fundo para dentro dá espessura, e com espessura a placa vira objeto
  posto sobre a tela em vez de buraco nela.
