Loading...
Loading...
UI interaction design patterns for skeleton loading, infinite scroll with accessibility, progressive disclosure, modal/drawer/inline selection, drag-and-drop with keyboard alternatives, tab overflow handling, and toast notification positioning. Use when implementing loading states, content pagination, disclosure patterns, overlay components, reorderable lists, or notification systems.
npx skill4agent add yonatangross/orchestkit interaction-patterns| Rule | File | Impact | When to Use |
|---|---|---|---|
| Skeleton Loading | | HIGH | Content-shaped placeholders for async data |
| Infinite Scroll | | CRITICAL | Paginated content with a11y and keyboard support |
| Progressive Disclosure | | HIGH | Revealing complexity based on user need |
| Modal / Drawer / Inline | | HIGH | Choosing overlay vs inline display patterns |
| Drag & Drop | | CRITICAL | Reorderable lists with keyboard alternatives |
| Tabs Overflow | | MEDIUM | Tab bars with 7+ items or dynamic tabs |
| Toast Notifications | | HIGH | Success/error feedback and notification stacking |
| Cognitive Load Thresholds | | HIGH | Enforcing Miller's Law, Hick's Law, and Doherty Threshold with numeric limits |
| Form UX | | HIGH | Target sizing, label placement, error prevention, and smart defaults |
| Persuasion Ethics | | HIGH | Detecting dark patterns and applying ethical engagement principles |
| Scenario | Pattern | Why |
|---|---|---|
| List/card content loading | Skeleton | Matches content shape, reduces perceived latency |
| Form submission | Spinner | Indeterminate, short-lived action |
| File upload | Progress bar | Measurable operation with known total |
| Image loading | Blur placeholder | Prevents layout shift, progressive reveal |
| Route transition | Skeleton | Preserves layout while data loads |
| Background sync | None / subtle indicator | Non-blocking, low priority |
function CardSkeleton() {
return (
<div className="animate-pulse space-y-3">
<div className="h-48 w-full rounded-lg bg-muted" />
<div className="h-4 w-3/4 rounded bg-muted" />
<div className="h-4 w-1/2 rounded bg-muted" />
</div>
)
}
function CardList({ items, isLoading }: { items: Item[]; isLoading: boolean }) {
if (isLoading) {
return (
<div className="grid grid-cols-3 gap-4">
{Array.from({ length: 6 }).map((_, i) => (
<CardSkeleton key={i} />
))}
</div>
)
}
return (
<div className="grid grid-cols-3 gap-4">
{items.map((item) => <Card key={item.id} item={item} />)}
</div>
)
}function InfiniteList({ fetchNextPage, hasNextPage, items }: Props) {
const sentinelRef = useRef<HTMLDivElement>(null)
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => { if (entry.isIntersecting && hasNextPage) fetchNextPage() },
{ rootMargin: "200px" }
)
if (sentinelRef.current) observer.observe(sentinelRef.current)
return () => observer.disconnect()
}, [fetchNextPage, hasNextPage])
return (
<div role="feed" aria-busy={isFetching}>
{items.map((item) => (
<article key={item.id} aria-posinset={item.index} aria-setsize={-1}>
<ItemCard item={item} />
</article>
))}
<div ref={sentinelRef} />
{hasNextPage && (
<button onClick={() => fetchNextPage()}>Load more items</button>
)}
<div aria-live="polite" className="sr-only">
{`Showing ${items.length} items`}
</div>
</div>
)
}Load:rules/interaction-skeleton-loading.md
Load:rules/interaction-infinite-scroll.md
Load:rules/interaction-progressive-disclosure.md
Load:rules/interaction-modal-drawer-inline.md
@dnd-kit/coreLoad:rules/interaction-drag-drop.md
Load:rules/interaction-tabs-overflow.md
Load:rules/interaction-toast-notifications.md
Load:rules/interaction-cognitive-load-thresholds.md
Load:rules/interaction-form-ux.md
Load:rules/interaction-persuasion-ethics.md
<dialog><details>role="feed"aria-liverole="status"role="alert"| Resource | Description |
|---|---|
| references/loading-states-decision-tree.md | Decision tree for skeleton vs spinner vs progress bar |
| references/interaction-pattern-catalog.md | Catalog of 15+ interaction patterns with when-to-use guidance |
| references/keyboard-interaction-matrix.md | Keyboard shortcuts matrix for all interactive patterns (WAI-ARIA APG) |
ork:ui-componentsork:animation-motion-designork:accessibilityork:responsive-patternsork:performance