The team wanted the app's existing iOS screens — dashboards, device cards, hierarchy panels, port views — moved from the current flat design system to Apple's Liquid Glass material. With dozens of screens built on the old system, manually reapplying a new material treatment to every card, button, and nav bar would be slow and inconsistent.
Batch migration mode — classify and apply, per frame, in one click
Nav bar, card, and button, each with its own material values
Custom Figma plugin built to automate the migration
Built and debugged with Claude throughout
Liquid Glass is a different material logic, not a new color. Every card, button and nav bar needed new blur, translucency and stroke properties, applied by hand across hundreds of layers.
Glass requires blur, translucency, and stroke together — a single color change doesn't reproduce it.
Existing layers were auto-named (Frame 488267, etc.), ruling out find-and-replace by name.
A nav bar can be almost fully see-through; a button with text on it can't — each element type needs its own values.
Before any styling logic was written, the plugin needed to actually run inside Figma and talk to itself in both directions.
Initial preset values were cross-checked against Apple's official design library file alongside a few Liquid Glass kits on Figma Community — their blur and opacity values differed from the first pass, and the three presets were adjusted accordingly before finalizing them.
The three presets aren't interchangeable values — they scale with how much a user needs to read or tap. Nav bar carries no critical content, so it leans furthest into the material: highest blur, lowest fill. Button carries text and needs a confident tap target, so it stays closest to opaque. Card sits in between, translucent enough to feel like glass without losing the content underneath.
Blur 40 • Fill 12% • Stroke 20%
Blur 30 • Fill 16% • Stroke 25%
Blur 24 • Fill 20% • Stroke 30%
A saved style applies one fixed value to whatever's selected — it still can't decide anything on its own. The real upgrade was giving the plugin the ability to scan an entire frame, look at each layer, and decide what it is.
Select one layer, pick a preset, apply. Same speed as using a saved style.
Select one frame. The plugin scans every nested layer, classifies each by size, and applies the right preset automatically.
Three things went wrong along the way — each one changed how the plugin actually works.
The first fill logic replaced a layer's original color entirely instead of layering glass on top — a blue button turned solid white.
Appended the translucent white fill on top of the existing fill array instead of overwriting it — original color stayed visible underneath.
A batch run reported "86 buttons" on one screen — the size thresholds were catching tiny 16–24px status icons.
Added a 40px minimum-dimension floor to the classifier so only real UI elements qualify, not icons.
Glass effects were invisible on plain white panels — a translucent white layer on white content has almost no contrast.
Not a code fix — a design finding. Prioritized screens with real color/detail behind glass elements, matching Apple's own guidance that glass sits over content, not blank space.
The batch tool automatically classified and migrated nav bars, cards, and buttons across a frame in a single run — skipping anything it couldn't confidently identify rather than guessing wrong — with manual mode still available to handle those cases by hand.
Clearest visible shift — saturated color to frosted glass
Fill and stroke refinement on a UI element
The plugin's value wasn't the styling values themselves — those could've lived in a saved style. It was the ability to scan an entire frame, classify each layer without relying on naming, and apply the right glass treatment automatically, cutting a manual layer process down to a single click per screen.