算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
design-mobile-first【设计与创意】Design a new touch-first UI: targets, safe areas, gestures, then enhance up. Use when building for phones, touch, swipe, PWA, or tablet. Responsive audit → audit-responsive.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Degree of freedom: MIXED. Pattern choice [HIGH freedom]; breakpoint,
viewport, and existing-hook inventory [LOW freedom — run exactly].
Build interfaces that work on mobile first, then enhance for larger screens.
Not this skill: a desktop that is a linearized phone (no max-width, stacked
at 1440, stretched buttons). That is audit-responsive.
sm:/md:/lg: add up; they do not replace the baseSurvey: Tailwind
sm/md/lgexist; checkout CTA ish-8; nosafe-area-inset-bottom. Base:min-h-[44px],pb-[env(safe-area-inset-bottom)], stacked fields, 16px inputs. Enhance: two-column names atsm:; table replaces cards atmd:. Device-check: thumb reaches the CTA; iOS does not zoom on focus.
lg:-onlyaudit-responsive; an existing app that feels like a website → enhance-mobile-native-feel; hybrid web + native axes → enhance-capacitor-uiBefore ANY mobile optimization, verify:
cat tailwind.config.* | grep -A10 "screens\|breakpoints"
rg "sm:|md:|lg:|xl:" --type tsx | head -20
rg "useMediaQuery|useBreakpoint|isMobile" --type ts --type tsx
ls -la src/hooks/use*Mobile* src/hooks/use*Responsive* 2>/dev/null
rg "viewport" src/app/layout.tsx index.html
Why: Maintain consistent responsive patterns across the app.
Base styles are mobile; media queries and sm:/md:/lg: prefixes only add (p-4 sm:p-6 md:p-8, text-sm sm:text-base lg:text-lg, grid-cols-1 sm:grid-cols-2 lg:grid-cols-3).
.card {
padding: 1rem;
font-size: 0.875rem;
}
@media (min-width: 640px) {
.card {
padding: 1.5rem;
font-size: 1rem;
}
}
Size every control to 44×44 CSS px (Apple's default control size; WCAG 2.5.5 AAA); 48 when
the page ships in an Android shell (Material's 48dp). WCAG 2.2 SC 2.5.8 (AA) is the floor:
24×24 CSS px, or a 24px-diameter circle around a smaller target that touches no other
target. List items too: py-3 px-4 min-h-[44px] active:bg-muted. Icon buttons extend the
hit area with negative margin.
<button className="min-h-[44px] min-w-[44px] px-4 py-3">
Tap me
</button>
<button
className="p-3 -m-3" // Negative margin extends touch area
aria-label="Menu"
>
<MenuIcon className="h-5 w-5" />
</button>
Primary actions in a fixed bottom nav; .safe-area-pb { padding-bottom: env(safe-area-inset-bottom); } for notched devices.
A fixed bar can hide the focused field: set html { scroll-padding-bottom: <bar height> }
(and scroll-padding-top for a sticky header) so keyboard focus is never fully covered
(WCAG 2.4.11, technique C43).
<nav className="fixed bottom-0 left-0 right-0 border-t bg-background safe-area-pb">
<div className="flex justify-around py-2">
<NavItem icon={HomeIcon} label="Home" />
<NavItem icon={SearchIcon} label="Search" />
<NavItem icon={PlusIcon} label="Create" />
<NavItem icon={BellIcon} label="Alerts" />
<NavItem icon={UserIcon} label="Profile" />
</div>
</nav>
When the UI ships inside a native shell, the platform already owns the chrome: a
system tab bar (3–5 destinations), sheets for secondary flows, edge-to-edge insets.
Do not rebuild it in JS or HTML. The version-gated APIs live in
enhance-mobile-native-feel (references/stack-recipes.md); Capacitor bars, insets,
and keyboard live in mobile-capacitor-platform. The drawer below is the web / PWA pattern.
A slide-in drawer with backdrop, spring transition, and a close control. Full component in
references/web-nav-drawer.md. Keep it lg:hidden; on native shells the system tab bar replaces it.
Card layout in a md:hidden stack on mobile; a hidden md:table traditional table on desktop, both mapping the same data.
Full component: references/components.md §Responsive Tables.
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
Auto-fit variant (grid-cols-[repeat(auto-fit,minmax(280px,1fr))]): references/components.md §Responsive Grid.
drag="x" with dragConstraints={{ left: -100, right: 0 }}; background interpolates to red via useTransform; delete when offset.x < -100drag="y", dragElastic={0.5}; indicator opacity/scale follow y over 0–60px; refresh when y > 60@media (prefers-reduced-motion: reduce) drop the travel and keep the state change (fade, color)Full components: references/components.md §Swipe to Delete, §Pull to Refresh.
y: '100%' → 0 panel, rounded-t-xl max-h-[90dvh] (vh ignores the mobile browser toolbar), drag handle via useDragControls; close on velocity.y > 500 or offset.y > 200, plus a visible close button; pb-safe contentsm:grid-cols-2 up; inputs h-12 with fontSize: '16px' to prevent iOS focus-zoom; w-full sm:w-auto h-12 submitFull components: references/components.md §Bottom Sheet, §Mobile-Optimized Forms.
width: 'device-width', initialScale: 1, viewportFit: 'cover'; no maximumScale / userScalable: false (the 16px inputs already stop iOS focus-zoom, and disabling pinch-zoom fails WCAG 1.4.4); appleWebApp capable + titlebeforeinstallprompt, preventDefault, show a card with Install / Not now; call prompt() and read userChoiceCode: references/pwa.md.
Run at a 390×844 viewport, then on a real phone:
| Check | Probe | Done |
|---|---|---|
| Targets | document.querySelectorAll('a,button,input,select,[role=button]') → getBoundingClientRect() | none under 24×24; primary controls ≥ 44×44 |
| Drag alternatives | list every swipe / drag handler | each has a tap path |
| Focus under fixed bars | Tab through a long form with the bottom nav visible | focused field never fully hidden |
| Reduced motion | DevTools → Rendering → emulate prefers-reduced-motion: reduce | no travel; state changes still visible |
| Safe area | iPhone with Dynamic Island + Android 16 gesture nav | nothing under the notch or home indicator |
| Inputs | focus each input on iOS Safari | font-size ≥ 16px, no focus-zoom |
Also: thumb-zone CTAs · 60fps gestures · offline-graceful.
enhance-mobile-native-feel — an existing Expo/RN or Capacitor app that feels like a websiteaudit-responsive — unstack desktop; layout/IA at 375 / 768 / 1440audit-accessibility — the full WCAG 2.2 AA audit, including the checks abovemobile-capacitor-platform — Capacitor bars, insets, keyboardenhance-capacitor-ui — hybrid web + native form-factor axesdesign-frontend — new visual surfacesaudit-performance — mobile perf budgets