
Design Systems — 2026 Week 2
Week 2's design systems story is anchored by a genuinely novel signal: Penpot is experimenting with MCP servers as a programmatic bridge between LLMs and its… Compiled for immediate developer deployment.


ADA Reform and the Path to a True Win-Win for Businesses and People With Disabilities

From Figma Smart Animate to React: The Real Pipeline
AnimatePresence character transitions and hover/tap scale responses. The @lottiefiles/dotlottie-web package (not lottie-web) uses a WebAssembly renderer drawing to <canvas> for performance, requiring the WASM binary in the Vite public/ folder. A key implementation detail: multiple dotLottie animations for the same component each need their own <canvas> element — swapping src on a single instance causes a loading flash — with CSS opacity transitions for the crossfade. Known export pitfalls include nested component state flattening, variable font text properties, and Figma Spring easing approximated as cubic bezier.Focus Rings With Nested contrast-color()?
contrast-color() — as in contrast-color(contrast-color(var(--page-bg))) — can replace the two-token focus-ring pattern (a --focus-inner-ring and --focus-outer-ring) used in Microsoft's Fluent design system, which combines a 1 px inset white highlight with a 2 px offset black outline to guarantee contrast against arbitrary backgrounds like blue buttons. The nested call inverts the return value of contrast-color(), theoretically reducing the required tokens from two themed pairs down to a single existing --page-bg token. He identifies a key caveat: the trick fails when focus rings appear over surfaces that differ from --page-bg, such as card backgrounds. Rupert ultimately recommends color-scheme and light-dark() instead — e.g., light-dark(white, black) for the inner ring and light-dark(black, white) for the outer — because browser support for contrast-color() is still spotty and light-dark() keeps the code readable and simple.
Why Most Product Teams Aren't Really Empowered

Common Misconceptions About Testing Accessibility

Penpot Is Experimenting With MCP Servers For AI-Powered Design Workflows
ADA Reform and the Path to a True Win-Win for Businesses and People With Disabilities
From Figma Smart Animate to React: The Real Pipeline
AnimatePresence character transitions and hover/tap scale responses. The @lottiefiles/dotlottie-web package (not lottie-web) uses a WebAssembly renderer drawing to <canvas> for performance, requiring the WASM binary in the Vite public/ folder. A key implementation detail: multiple dotLottie animations for the same component each need their own <canvas> element — swapping src on a single instance causes a loading flash — with CSS opacity transitions for the crossfade. Known export pitfalls include nested component state flattening, variable font text properties, and Figma Spring easing approximated as cubic bezier.Focus Rings With Nested contrast-color()?
contrast-color() — as in contrast-color(contrast-color(var(--page-bg))) — can replace the two-token focus-ring pattern (a --focus-inner-ring and --focus-outer-ring) used in Microsoft's Fluent design system, which combines a 1 px inset white highlight with a 2 px offset black outline to guarantee contrast against arbitrary backgrounds like blue buttons. The nested call inverts the return value of contrast-color(), theoretically reducing the required tokens from two themed pairs down to a single existing --page-bg token. He identifies a key caveat: the trick fails when focus rings appear over surfaces that differ from --page-bg, such as card backgrounds. Rupert ultimately recommends color-scheme and light-dark() instead — e.g., light-dark(white, black) for the inner ring and light-dark(black, white) for the outer — because browser support for contrast-color() is still spotty and light-dark() keeps the code readable and simple.Why Most Product Teams Aren't Really Empowered
Common Misconceptions About Testing Accessibility
Week 2's design systems story is anchored by a genuinely novel signal: Penpot is experimenting with MCP servers as a programmatic bridge between LLMs and its design API, enabling AI to perform real design operations rather than generating from prose descriptions. Because Penpot expresses designs as code, the MCP layer gets the granularity that competing tools cannot match — demonstrated live at Penpot Fest 2025 using Claude Desktop, and already tested across VS Code, Cursor, and JetBrains Rider. The system supports design-to-code, code-to-design, Storybook generation, accessibility analysis, and design-system compliance checking, all from an LLM-agnostic Python SDK. It has not reached beta yet, but the architecture is a preview of how design tooling integrates with the agentic layer.
The accessibility thread this week has two distinct registers. Ela Gorla at TetraLogical dismantles five misconceptions that quietly undermine team-wide accessibility testing: automated tools only catch 20–40% of WCAG requirements yet are routinely treated as comprehensive audits, testing is still deferred to project-end QA despite the remediation cost of late fixes, and responsibility is still too often delegated to specialists rather than distributed across designers, developers, and content writers. The WebAIM Screen Reader User Survey is recommended for prioritizing which AT/browser/OS combinations to actually test. Alongside this, the Deque analysis of U.S. ADA reform legislation — specifically the ADA 30 Days to Comply Act — argues that notice-and-cure provisions shift the legal burden onto disabled users who must first identify and report violations before protections apply, a structurally problematic inversion in time-sensitive digital contexts like job applications or healthcare information.
Dave Rupert's investigation into nested contrast-color() for focus rings is the week's clearest example of CSS feature composition pushed to its edge: the nested call theoretically reduces a two-token pattern (--focus-inner-ring and --focus-outer-ring) down to a single --page-bg token, but fails when focus rings appear over surfaces that differ from the page background. His recommendation to fall back to light-dark() with explicit values is pragmatic given spotty contrast-color() browser support. Carmen Ansio's Figma Config 2025 talk documenting the dotLottie/Framer Motion pipeline for React animation handoff closes the week — dotLottie via WebAssembly canvas rendering for motion fidelity, Framer Motion for state-driven interactivity, with a critical implementation note that multiple animations per component each need their own <canvas> element to avoid loading flashes.
- Evaluate Penpot's MCP server experiment as a template for design-to-code automation: the LLM-agnostic architecture means the same server could wire to whichever model your team already uses.
- Distribute accessibility testing responsibility across every discipline now — automated tooling catches at most 40% of WCAG requirements, and retrofitting late-stage failures costs dramatically more than building in the checks from the start.
- In Figma-to-React animation pipelines, give each dotLottie animation its own dedicated
<canvas>element and use CSS opacity transitions for crossfades — swappingsrcon a single instance causes a loading flash.