M1
Two parallel token systems, neither consistent
CSS custom properties (--color-primary) and SCSS variables ($rapid-grey, $button-green) coexist. Hardcoded hex values also appear throughout. No single source of truth for design tokens. Optics provides a complete token system to consolidate all three into one.
variables.scss
Optics replaces both systems entirely
M2
Typography only defines h2
No base styles for h1, h3, h4, p, small, strong, or body text. The app relies entirely on browser defaults, causing visual inconsistency across browsers. Optics provides a 12-step font scale with line-height and weight tokens.
typography.scss
Optics font scale: 2x-small → 6x-large
M3
Mixed icon systems
ShareViewOnlyLinkButton uses Material Icons font (add_link) while every other icon uses custom SVGs via RapidAirIconFactory. Adds an extra font request and creates visual inconsistency.
ShareViewOnlyLinkButton.jsx
Optics Icon uses Material Symbols
M4
Magic number left:300px in floating controls
Floating controls (layers, snapping, legend) hardcode left: 300px to sit beside the 260px left panel. If panel width changes, controls overlap. Should use a shared variable.
floating-controls.scss
M5
Building Length input has no label
The width x length dimension inputs show "ft x ft" but only building_width has a <label>. Screen readers cannot announce what the second field is for.
_form.html.slim
Optics Form includes accessible labels
M6
<a> wrapping <button> in help video links
Help video links nest a button inside an anchor — invalid HTML that creates ambiguous keyboard/screen reader behavior. Use one or the other.
ProjectComponentsPanel.jsx
M7
Select placeholder options not disabled
The "Select..." placeholder in dropdowns is not marked disabled. Users can re-select it, leaving fields in an empty state that may cause downstream errors.
CeilingOutletPropertyPanel.jsx, AutomaticCompressorPropertyPanel.jsx
Optics Form select handles placeholders
M8
No autosave status indicator
The editor autosaves but shows no "Saving..." / "Saved" indicator. Users cannot tell whether their work is persisted. Causes anxiety and unnecessary manual save attempts.
Editor — global