public final class GlassRecipe
- Object
- GlassRecipe
A typed, named recipe for the “Liquid Glass” backdrop materials (iOS 26).
A glass surface is described by its material INTENT – which named recipe it uses – rather than by loose per-parameter theme constants. Each recipe bundles the bounded, measured parameters of one native material (the colour transform the real UIVisualEffectView / UIGlassEffect applies to the blurred backdrop, plus the edge optics), so similar glass surfaces cannot silently diverge and a theme cannot tune itself into an incoherent material. The available recipes:
blur–Kind.PLAIN_BLUR: backdrop blur only, no material colour transform (a plain CSS backdrop-filter).chrome–Kind.LIQUID_CHROME: the rectangular chrome bars anchored at a screen edge (navigation / title bars). Very transparent; the backdrop reads through at near-full saturation.pill–Kind.LIQUID_PILL: the floating pill chrome (the iOS 26 tab bar). Frostier than the edge bars – in light mode it washes strongly toward white while boosting saturation.panel–Kind.LIQUID_PANEL: a bare glass panel or button capsule (UIGlassEffect). The strongest material: heavy wash, plus edge refraction and a specular rim so the glass reads as a layer on top of the content rather than a flat hole.chrome27,pill27,panel27– the same three materials as iOS 27 retuned them. Light is measured as unchanged in chrome and pill; dark moved in all three. SeeliquidPanel27(boolean)for how the constants were measured and why dark is approximate.
A theme assigns a recipe per UIID with the theme constant
<UIID>GlassRecipe (for example ToolbarGlassRecipe: chrome),
with glassRecipeDefault as the theme-wide default (panel
when unset). The recipe is resolved at paint time by
Component.internalPaintImpl and its parameters are passed to the
port through Graphics.glassRegion; ports never read material
constants themselves.
The travelling tab-selection lens is the remaining glass surface; it is
an optics-over-content effect bound to the morph motion, so its typed
parameters live with the motion model (TabSelectionMorph) rather
than here.
Nested types
enum GlassRecipe.Kind | The material kind a GlassRecipe renders. |
Methods
public static GlassRecipe plainBlur() | Plain backdrop blur with no material transform. |
public static GlassRecipe liquidChrome(boolean dark) | The rectangular edge-anchored chrome bar material (navigation/title bars). |
public static GlassRecipe liquidPill(boolean dark) | The floating pill chrome material (the iOS 26 tab bar). |
public static GlassRecipe liquidPanel(boolean dark) | The bare glass panel / button capsule material (UIGlassEffect). |
public static GlassRecipe liquidChrome27(boolean dark) | The iOS 27 chrome-bar material. |
public static GlassRecipe liquidPill27(boolean dark) | The iOS 27 floating-pill material. |
public static GlassRecipe liquidPanel27(boolean dark) | The iOS 27 glass-panel material, and the recipe that carries the method these three were measured with. |
public static GlassRecipe named(String name, boolean dark) | Looks up a recipe by its theme name: blur, chrome, pill, panel, or their iOS 27 variants chrome27, pill27 and panel27. |
public static GlassRecipe resolve(UIManager manager, String uiid, boolean dark) | Resolves the recipe for a UIID from the theme: the per-UIID <UIID>GlassRecipe constant wins, then the theme-wide glassRecipeDefault, then the panel recipe. |
public GlassRecipe.Kind getKind() | The material kind this recipe renders. |
public float getSaturation() | The saturation boost applied to the blurred backdrop. |
public float getScale() | The colour scale multiplier of the material’s affine colour transform. |
public float getOffset() | The colour offset (wash floor) of the material’s affine colour transform, in 0..255 channel units. |
public float getRefraction() | The edge refraction (lensing) strength – bends the backdrop toward the edges so the glass reads as a layer on top rather than a flat hole. |
public float getSpecular() | The brightness of the specular edge rim (the bright glint). |
Inherited methods
Method details
plainBlur
public static GlassRecipe plainBlur()Returns
liquidChrome
public static GlassRecipe liquidChrome(boolean dark)Parameters
darkboolean- true for the dark appearance
Returns
liquidPill
public static GlassRecipe liquidPill(boolean dark)Parameters
darkboolean- true for the dark appearance
Returns
liquidPanel
public static GlassRecipe liquidPanel(boolean dark)Parameters
darkboolean- true for the dark appearance
Returns
liquidChrome27
public static GlassRecipe liquidChrome27(boolean dark)The iOS 27 chrome-bar material.
LIGHT IS DELIBERATELY IDENTICAL to liquidChrome(boolean). Fitting
the transform against the iOS 27 capture returned sat 1.09, scale 0.860,
offset 18.9 where iOS 26 is 1.10 / 0.850 / 20.0 – inside 1.3% on every
parameter, at an rms of 1.27/255. That is a measurement saying “unchanged”,
so the iOS 26 numbers are reused verbatim rather than replaced by a
near-identical duplicate that would read as a real difference.
DARK is the best affine fit (rms 14.6/255) and is KNOWN NOT TO BE EXACT.
See liquidPanel27(boolean) for why dark cannot be fitted properly.
Parameters
darkboolean- true for the dark appearance
Returns
liquidPill27
public static GlassRecipe liquidPill27(boolean dark)The iOS 27 floating-pill material.
LIGHT is again measured as unchanged – the fit returned 1.86 / 0.984 / 111.4 against iOS 26’s 1.80 / 1.000 / 108.0 – so the iOS 26 values are reused. DARK is the best affine fit and, like chrome, is approximate.
Parameters
darkboolean- true for the dark appearance
Returns
liquidPanel27
public static GlassRecipe liquidPanel27(boolean dark)The iOS 27 glass-panel material, and the recipe that carries the method these three were measured with.
HOW THE NUMBERS WERE OBTAINED. The material is the documented affine
transform c' = clamp((lum + (c - lum) * sat) * scale + offset). The iOS
26 constants are known, so every interior pixel of a committed
goldens/ios-26-metal tile can be inverted back to the backdrop that
produced it, and the matching goldens/ios-27-metal pixel then fitted
against that same backdrop. Nothing about the backdrop has to be assumed,
and because the transform is linear it commutes with the Gaussian blur, so
the blur does not bias the fit. Clipping does NOT commute, so a pixel is
used only when nothing within the blur’s reach clipped – without that
erosion the photo-backdrop tile fitted at rms 14 against rms 1 for the flat
ones, and it dragged every parameter with it.
The method self-checks: run against the iOS 26 set it recovers the iOS 26 chrome constants it was never told, to within 1.3%.
WHY DARK IS APPROXIMATE, IN ALL THREE RECIPES. After the best affine fit, the light residual is flat across the whole backdrop-luma range (within +/-0.9/255). The dark residual is not: on the chrome bar it runs +8.9 at low luma, -9.3 through the middle and +10.3 at high luma – a systematic curve, not noise. iOS 27’s dark glass therefore applies a NON-LINEAR luminance response, and no choice of sat/scale/offset can express it, because this transform is affine by construction. Matching dark properly needs a curve term in the material model and in every port’s shader, which is a larger change than new constants; these values are the closest an affine material gets until then.
Parameters
darkboolean- true for the dark appearance
Returns
named
public static GlassRecipe named(String name, boolean dark)blur, chrome,
pill, panel, or their iOS 27 variants chrome27,
pill27 and panel27. Unknown names fall back to the panel
recipe – the safest default for a free-standing glass surface.Parameters
nameString- the recipe name from the theme
darkboolean- true for the dark appearance
Returns
resolve
public static GlassRecipe resolve(UIManager manager, String uiid, boolean dark)<UIID>GlassRecipe constant wins, then the theme-wide
glassRecipeDefault, then the panel recipe.Parameters
managerUIManager- the UI manager holding the theme
uiidString- the component’s UIID
darkboolean- true for the dark appearance
Returns
getKind
public GlassRecipe.Kind getKind()Returns
getSaturation
public float getSaturation()Returns
getScale
public float getScale()Returns
getOffset
public float getOffset()Returns
getRefraction
public float getRefraction()Returns
getSpecular
public float getSpecular()