progressive
trigger: visible
Swiper
SSR cards become a carousel on visibility.
idle -> active, swiper/js/css/cleanup all become ok/ready.
Open demoThese pages keep meaningful HTML in SSR output for SEO/GEO, then apply package enhancements on the client without hydration.
progressive
trigger: visible
SSR cards become a carousel on visibility.
idle -> active, swiper/js/css/cleanup all become ok/ready.
Open demoprogressive
trigger: visible
SSR table remains visible if chart JS fails.
SSR table always visible, enhancement status reaches ready.
Open demoprogressive
trigger: visible
SSR summary list is visible first, then ECharts enhances canvas.
status reaches ready and chart renders on client.
Open demoprogressive
trigger: idle
SSR cards stay readable while GSAP adds motion.
idle trigger runs and cards animate without SSR replacement.
Open demoprogressive
trigger: idle
SSR-first cards with lightweight anime.js enhancement.
idle trigger runs and cards animate client-side only.
Open demoprogressive
trigger: visible
Native video is SSR fallback, package may enhance controls.
native video SSR exists and enhancement status reaches ready.
Open demossr
trigger: idle
Article content is fully SSR, enhancement is optional.
SSR article/code visible before JS, status reaches ready.
Open demoprogressive
trigger: visible
SSR code block is visible first, then highlight.js styles tokens.
SSR code stays readable and enhancement status reaches ready.
Open demossr
trigger: n/a
SSR-safe named imports with date formatting.
server-rendered formatted date appears in HTML.
Open demossr
trigger: n/a
SSR-safe data shaping with lodash-es.
SSR list content renders from lodash transforms.
Open demoprogressive
trigger: visible
Package CSS is loaded only where needed.
Status reaches ready and CSS is applied only on this page.
Open democlientOnly
trigger: visible
Server renders a textual fallback while browser widget initializes later.
fallback is SSR-visible and client widget status reaches ready.
Open demodiagnostics
trigger: interaction
Friendly runtime error without breaking SSR content.
Click to trigger; shows friendly error instead of silent pending.
Open demotrigger
trigger: immediate
Runs right after DOM scan without user input.
Status changes to ready automatically as soon as runtime starts.
Open demotrigger
trigger: page-load
Runs after the full window load event.
Status changes to ready after page load even when scan already happened.
Open demotrigger
trigger: manual
Runs only when useClientEnhancement().activate() is called.
Stays idle until button click, then becomes ready.
Open demo Prefer <ClientEnhance /> over raw data attributes. It keeps resumability behavior but gives a cleaner API for app developers.
<ClientEnhance
name="swiper-carousel"
trigger="visible"
demo="swiper"
:options="{ navigation: true, pagination: true, navigationIcons: 'empty-only' }"
>
<!-- SSR HTML content stays visible first -->
</ClientEnhance><ClientEnhance name="missing-package-demo" trigger="interaction" demo="missing-package">
<!-- Click/pointer/focus starts enhancement -->
</ClientEnhance><ClientEnhance name="animation-demo" trigger="idle" demo="animation">
<!-- Useful for non-critical polish -->
</ClientEnhance><ClientEnhance name="immediate-demo" trigger="immediate" demo="immediate">
<!-- Runs right after runtime scan -->
</ClientEnhance><ClientEnhance name="page-load-demo" trigger="page-load" demo="page-load">
<!-- Runs after window load event -->
</ClientEnhance>const controller = await useClientEnhancement("manual-demo", {
target: "#manual-enhancement-target",
trigger: "manual"
});
await controller.activate();import { format } from "date-fns";
const publishedAt = format(new Date("2026-05-26"), "PPP");const [{ default: Swiper }, { Navigation, Pagination }] = await Promise.all([
useClientPackage("swiper"),
useClientPackage("swiper/modules", { preferDefault: false })
]);