Interface as a System
The interface is designed not as a set of separate pages, but as a system of components, states, scenarios, data, and responsive rules.
Design Engineering
Designing interfaces at the intersection of product logic, UX architecture, design systems, and frontend development.
The interface is designed not as a set of separate pages, but as a system of components, states, scenarios, data, and responsive rules.
Before the visual layer, it is important to analyze the product model: roles, entities, user flows, constraints, states, and decision points.
Large products are easier to design through screen families: Home, Search / Catalog, Detail Pages, Booking Flow, Account, Workspace, Repository, Dashboard. This helps preserve shared logic as the product grows.
Live Demo, reference surfaces, and component assembly help reveal what is not always visible in a static mockup: long data, empty states, responsive behavior, map/list sync, selected state, fallback scenarios, and component boundaries.
Handoff should explain not only the appearance, but also the structure: component map, states, variants, data dependencies, runtime boundaries, responsive behavior, and visual QA expectations.
In a complex product, drawing a set of screens is not enough. It is necessary to understand which entities participate in the system, which states appear, which components should be reusable, where the boundary between UI and runtime logic sits, how the interface will be validated, and how the solution will move into development.
Design engineering in my practice is a way to design an interface closer to how it will live in the product: in components, data, states, responsive scenarios, and documentation.
This does not mean that a designer should replace a frontend developer. The point is different: interface decisions become more precise when component boundaries, states, props-like thinking, data dependencies, and future page assembly logic are already understood at the design stage.
This approach is especially important for complex B2B, B2C, and B2E products, where a screen rarely exists on its own. Behind it are user roles, access rights, filters, catalogs, statuses, transactions, documents, maps, tables, empty states, responsive behavior, and handoff to development.
Figma is excellent for visual language, structure, component anatomy, and communicating a solution. But in a complex product, a static mockup does not always show how the interface will behave in a real environment.
For example, a mockup can neatly show an ideal card. But in the product, questions quickly appear:
These questions are easy to hide on a static screen. In runtime, they become visible. That is why Live Demo, reference surfaces, and component assembly are used as a continuation of design, not as a separate stage “after design.”
One of the main principles is not to design a product as a set of isolated pages.
Instead, the interface is decomposed into screen families: groups of screens that share logic but change active blocks depending on data and scenario.
For example, a detail page can be a family rather than a single page. For a route, it shows an itinerary, stop cards, and a map. For a commercial venue, it shows offer groups, BookingWidget, policies, and reviews. For a geographic location, it shows a map, related places, and recommendations. At the same time, the basic structure, navigation, grid, and responsive behavior remain recognizable.
This approach helps the team avoid creating every new screen from scratch. New entities are connected through clear composition rules, while the product remains coherent.
In complex products, a design system should be more than a button library. It should explain how product logic becomes an interface.
I separate the system into several levels.
Tokens, colors, typography, spacing, radius, shadows, surface rules, and basic visual principles.
Base interface elements: buttons, inputs, badges, chips, selects, overlays, menus, tabs, feedback states, navigation primitives. This lower layer should not know the product’s business logic.
Components that already carry product meaning: cards, offer rows, reservation rows, notification rows, payment method rows, filter units, account tiles.
Large reusable sections: search toolbar, filter panel, hero media header, detail support blocks, BookingWidget, account sections, recommendation rails.
Page assembly rules: section order, grid, responsive behavior, sticky zones, mobile stacking, sidebar behavior, and conditions for showing blocks.
The layer that prepares data and state for the UI: routes, filters, selected offer, map/list state, booking draft, source-backed labels, callbacks. It helps avoid mixing visual anatomy with business logic.
Separate surfaces for validating components, states, and layout families outside the user journey. They show the system separately from the “beautiful final screen.”
A component should have a clear role and responsibility boundary.
A button should not know business logic. A card should not decide routing and application state by itself. A detail block should not own source data. A page layout should not turn into a random set of local divs. A runtime adapter should not become a design system.
When these boundaries are not defined, the product quickly starts to fall apart: one-off components, page-local styles, repeated states, and hidden logic inside visual elements appear.
When boundaries are described, design and development start speaking the same language: what is a primitive, what is a product component, where a block begins, where layout logic lives, and where runtime state is located.
A good example is even a small divider.
In a weak system, it often remains a random border-top inside a specific screen. After some time, different shades, different spacing, different thicknesses, and different mobile behavior rules appear.
In a mature system, even this element has a place:
This is not complexity for the sake of complexity. It is a way to prevent small local decisions from accumulating into system debt.
A runtime-first approach does not mean “writing production code immediately.” In the context of a portfolio and design system, this can be a Live Demo, showcase app, reference surface, or local component assembly.
The purpose of this layer is to check how the interface behaves outside an ideal mockup:
This validation helps make decisions not only at the level of “looks good,” but also at the level of “this can be maintained.”
A frontend-aware approach helps design interfaces without separating them from implementation.
In my practice, React, TypeScript, Next.js, and Vite are used as a working environment for validating a product system: portfolio site, Live Demo, showcase surfaces, component layers, and runtime adapters.
This is not positioning as a full-stack engineer. It is a way to better understand how the interface will live in the product:
Reference surfaces are not user-facing pages. They are surfaces for validating the system.
They help review:
This inspection layer makes it possible to evaluate the system not by one polished screen, but by how well it handles different data, states, and use cases.
In a design engineering approach, handoff is not just a link to a mockup.
A good handoff should explain:
This way, development receives not just a picture, but also the logic of how the interface should work and evolve.
Design engineering helps turn an interface into a system that can be explained, validated, assembled, and handed over.
It reduces the risk that:
The main result is a more resilient interface: it is understandable for the user, predictable for the team, and better prepared for product growth.