The audio player's play/pause control was the app's only mat-fab. It is now
a mat-icon-button drawn as the same 56px primary circle (icon-button
overrides: 56px state layer, 32px white icon, 50% shape, selection-colour
fill, hover scale), so the eager button chunk no longer carries the fab
directives and the theme no longer emits the fab tokens:
renderer.initialBytes 1,349,048 -> 1,329,249 bytes (-19,799: -13,799 in
button.mjs, -6,028 in the stylesheet), measured locally against the merge
base. The fab also reset the keyboard focus ring with `outline: none`; the
icon button keeps the app ring.
- tools/nx/check-material-theme-scope.mjs: `button` brings button and
icon-button; `fab` is required only while a runtime template renders
mat-fab / mat-mini-fab (matFab / matMiniFab), found through the component
templates the way check-form-field-defaults.mjs resolves them. That
resolution moves to tools/nx/component-templates.mjs, shared by both.
Templates know HTML comments only, so the scan strips just those: a `//`
in text or an attribute value no longer hides a fab on the same line.
- apps/web/src/m3-theme.scss drops `fab` from $material-components.
- apps/web-e2e: the Stalker radio test checks the control's size, shape,
fill, icon and keyboard focus ring.
- journey-baselines.json: renderer.initialBytes 1,345,807 -> 1,329,249.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>