PWAs should feel like natural apps. Design principles include:
Use CSS Grid, Flexbox, and media queries to create adaptive layouts that work on all screen sizes.
/* Responsive app layout */
.app-layout {
display: grid;
grid-template-areas:
"header"
"main"
"footer";
grid-template-rows: 56px 1fr auto;
min-height: 100vh;
}
@media (min-width: 768px) {
.app-layout {
grid-template-columns: 240px 1fr;
grid-template-areas:
"header header"
"sidebar main"
"sidebar footer";
}
}
/* Touch-friendly targets */
button, a, input {
min-height: 48px;
min-width: 48px;
}
/* Pull-to-refresh simulation */
.pull-to-refresh {
touch-action: pan-y;
overscroll-behavior: contain;
}
PWAs must be accessible to all users:
<nav>, <main>, <article>)<!-- Accessible navigation -->
<nav aria-label="Main navigation" role="navigation">
<button aria-label="Open menu">
<span class="hamburger" aria-hidden="true"></span>
</button>
<ul role="menubar">
<li role="none">
<a role="menuitem" href="/" aria-current="page">Home</a>
</li>
</ul>
</nav>
-apple-system, Segoe UI) for native feelenv(safe-area-inset-*) for proper padding/* Safe area support for notched devices */
body {
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);
padding-right: env(safe-area-inset-right);
}
/* System font stack */
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI',
Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
}