Site: storefront-tanstack Platform: vtex GTM ID: none Date: 2026-04-22 Mode: EXECUTED
| Metric | Count |
|---|---|
| Files analyzed | 112 |
| Files scaffolded | 43 |
| Files transformed | 75 |
| Files deleted | 30 |
| Files moved | 12 |
| Manual review items | 21 |
package.jsontsconfig.jsonvite.config.tswrangler.jsoncknip.config.ts.gitignore.prettierrcsrc/server.tssrc/worker-entry.tssrc/router.tsxsrc/runtime.tssrc/context.tssrc/routes/__root.tsxsrc/routes/index.tsxsrc/routes/$.tsxsrc/routes/deco/meta.tssrc/routes/deco/invoke.$.tssrc/routes/deco/render.tssrc/setup.tssrc/cache-config.tssrc/setup/commerce-loaders.tssrc/setup/section-loaders.tssrc/styles/app.csssrc/types/widgets.tssrc/types/deco.tssrc/types/commerce-app.tssrc/types/website.tssrc/types/vtex-app.tssrc/types/vtex-loaders.tssrc/types/vtex-actions.tssrc/components/ui/Image.tsxsrc/components/ui/Picture.tsxsrc/components/ui/Video.tsxsrc/hooks/useCart.tssrc/hooks/useUser.tssrc/hooks/useWishlist.tssrc/sdk/signal.tssrc/sdk/clx.tssrc/sdk/debounce.tssrc/sdk/deviceServer.tssrc/sdk/logger.tssrc/apps/site.tssrc/components/ui/Theme.tsx
src/Dockerfilesrc/_deno.serve.tssrc/actions/minicart/submit.tssrc/actions/wishlist/submit.tssrc/components/header/Alert.tsxsrc/components/header/Bag.tsxsrc/components/header/Menu.tsxsrc/components/header/NavItem.tsxsrc/components/header/SignIn.tsxsrc/components/minicart/Coupon.tsxsrc/components/minicart/FreeShippingProgressBar.tsxsrc/components/minicart/Item.tsxsrc/components/minicart/Minicart.tsxsrc/components/product/AddToCartButton.tsxsrc/components/product/Gallery.tsxsrc/components/product/OutOfStock.tsxsrc/components/product/ProductCard.tsxsrc/components/product/ProductImageZoom.tsxsrc/components/product/ProductInfo.tsxsrc/components/product/ProductSlider.tsxsrc/components/product/ProductVariantSelector.tsxsrc/components/search/Filters.tsxsrc/components/search/SearchResult.tsxsrc/components/search/Searchbar/Form.tsxsrc/components/search/Searchbar/Suggestions.tsxsrc/components/search/Sort.tsxsrc/components/shipping/Form.tsxsrc/components/shipping/Results.tsxsrc/components/ui/Avatar.tsxsrc/components/ui/Breadcrumb.tsxsrc/components/ui/CategoryBanner.tsxsrc/components/ui/Drawer.tsxsrc/components/ui/Icon.tsxsrc/components/ui/Modal.tsxsrc/components/ui/QuantitySelector.tsxsrc/components/ui/Section.tsxsrc/components/ui/Slider.tsxsrc/components/user/Provider.tsxsrc/components/wishlist/Provider.tsxsrc/components/wishlist/WishlistButton.tsxsrc/components/wishlist/WishlistGallery.tsxsrc/deploy/argocd-application.yamlsrc/deploy/values-custom.yamlsrc/loaders/minicart.tssrc/loaders/user.tssrc/loaders/wishlist.tssrc/sdk/url.tssrc/sdk/useSendEvent.tssrc/sections/Animation/Animation.tsxsrc/sections/Category/CategoryBanner.tsxsrc/sections/Category/CategoryGrid.tsxsrc/sections/Component.tsxsrc/sections/Content/Faq.tsxsrc/sections/Content/Hero.tsxsrc/sections/Content/Intro.tsxsrc/sections/Content/Logos.tsxsrc/sections/Footer/Footer.tsxsrc/sections/Header/Header.tsxsrc/sections/Images/Banner.tsxsrc/sections/Images/Carousel.tsxsrc/sections/Images/ImageGallery.tsxsrc/sections/Images/ShoppableBanner.tsxsrc/sections/Links/LinkTree.tsxsrc/sections/Miscellaneous/CampaignTimer.tsxsrc/sections/Miscellaneous/CookieConsent.tsxsrc/sections/Newsletter/Newsletter.tsxsrc/sections/Product/ProductDetails.tsxsrc/sections/Product/ProductShelf.tsxsrc/sections/Product/ProductShelfTabbed.tsxsrc/sections/Product/SearchResult.tsxsrc/sections/Product/ShelfWithImage.tsxsrc/sections/Product/Wishlist.tsxsrc/sections/Social/InstagramPosts.tsxsrc/sections/Social/WhatsApp.tsxsrc/sections/Theme/Theme.tsx
main.tsdev.tsdeno.jsontailwind.csstailwind.config.tsruntime.tsconstants.tsfresh.gen.tsmanifest.gen.tsfresh.config.tsbrowserslistbw_stats.jsonsdk/clx.tssdk/useId.tssdk/useOffer.tssdk/useVariantPossiblities.tssdk/usePlatform.tsxcomponents/Session.tsxsections/Session.tsxloaders/availableIcons.tsloaders/icons.tsroutes/apps/deco/sdk/cart/sections/components/sdk/loaders/actions/apps/
static/.well-known/assetlinks.json→public/.well-known/assetlinks.jsonstatic/browserconfig.xml→public/browserconfig.xmlstatic/favicon-16x16.png→public/favicon-16x16.pngstatic/favicon-32x32.png→public/favicon-32x32.pngstatic/favicon.ico→public/favicon.icostatic/image/app-android.png→public/image/app-android.pngstatic/image/app-apple.png→public/image/app-apple.pngstatic/image/placeholder-instagram.jpg→public/image/placeholder-instagram.jpgstatic/robots.txt→public/robots.txtstatic/site.webmanifest→public/site.webmanifeststatic/sprites.svg→public/sprites.svgstatic/sw.js→public/sw.js
🟡 src/components/minicart/Coupon.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/minicart/Coupon.tsx: hx-on:click with useScript found — convert to onClick with React event handler. The useScript serialization won't work as onClick value.
🟡 src/components/minicart/Item.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/minicart/Item.tsx: hx-on:click with useScript found — convert to onClick with React event handler. The useScript serialization won't work as onClick value.
🟡 src/components/minicart/Minicart.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/minicart/Minicart.tsx: hx-on:click with useScript found — convert to onClick with React event handler. The useScript serialization won't work as onClick value.
🟡 src/components/product/AddToCartButton.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/product/AddToCartButton.tsx: hx-on:click with useScript found — convert to onClick with React event handler. The useScript serialization won't work as onClick value.
🟡 src/components/product/OutOfStock.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/product/ProductVariantSelector.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/search/SearchResult.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/search/Searchbar/Form.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/search/Sort.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/shipping/Form.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/ui/QuantitySelector.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/ui/QuantitySelector.tsx: hx-on:click with useScript found — convert to onClick with React event handler. The useScript serialization won't work as onClick value.
🟡 src/components/wishlist/Provider.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/wishlist/WishlistButton.tsx: HTMX attributes (hx-) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
🟡 src/components/wishlist/WishlistButton.tsx: hx-on:click with useScript found — convert to onClick with React event handler. The useScript serialization won't work as onClick value.
🟡 src/sections/Component.tsx: [deno-isms] MANUAL: Deno. API usage found — needs Node.js equivalent
🟡 src/sections/Newsletter/Newsletter.tsx: HTMX attributes (hx-*) found — needs manual migration to React state/effects. HTMX server-side rendering (hx-get/hx-post with useSection) must be converted to React components with useState/useEffect or server functions.
- 27 sections analyzed
- 3 have loaders (extracted to
setup/section-loaders.ts) - 3 are layout sections (eager + sync + layout)
- 2 are listing sections (cache = "listing")
- 3 loaders inventoried
- 0 mapped to
@decocms/appsequivalents - 3 custom (included in
setup/commerce-loaders.ts)
-
src/setup/commerce-loaders.ts— verify each loader mapping is correct -
src/setup/section-loaders.ts— verify extracted loaders work correctly -
src/hooks/useCart.ts— wire to actual server functions for your platform -
src/worker-entry.ts— verify CSP, proxy, and segment builder - DaisyUI v4 to v5 class name changes
- Tailwind v3 to v4: verify all utility classes still work
- Check
src/styles/app.csstheme colors match the original design - Run
npm run generate:blocksandnpm run generate:schemaafter migration
The migration script automatically converts -z-{n} to z-0 on <img> and <Image> elements.
However, if you have non-image elements with negative z-index (e.g. -z-10 on a <div> used as a background layer), they may become invisible.
Why it breaks: In TanStack Start/React, section wrappers (<section>) or parent elements can create
CSS stacking contexts (via animation, transform, will-change, filter, isolation, etc.).
A child with negative z-index gets trapped inside that stacking context and renders behind the parent's background — making it invisible.
How to fix:
- Replace
-z-{n}withz-0on the background element - Content siblings render on top naturally via DOM order (they come after in the HTML)
- If needed, add
relative z-10to content siblings to ensure they stay above
How to detect: Search for remaining negative z-index: grep -rn '\-z-' src/ --include='*.tsx'
Tailwind v4 removed bg-opacity-{n}, text-opacity-{n}, etc. The script converts them to
the modifier syntax (e.g. bg-black bg-opacity-20 → bg-black/20). If a color and its opacity
are not in the same className string (e.g. set via different conditional branches), the script
flags them for manual review.
How to detect: grep -rn 'opacity-' src/ --include='*.tsx'
These are patterns found during migration that should eventually be handled by
@decocms/startinstead of being duplicated in every site.
- Session/analytics SDK is boilerplate duplicated across all sites — should be a single framework function
- GTM event system (useGTMEvent, data-gtm-* listeners) is universal pattern — should be in @decocms/start
- Route files (__root.tsx, index.tsx, $.tsx, deco/*) are near-identical across sites — should be generated by framework
- server.ts, worker-entry.ts, router.tsx are pure boilerplate — should be a single createSite() call
- setup.ts section registration via import.meta.glob is 100% boilerplate — framework should handle this
- runtime.ts invoke proxy is identical across sites — already in @decocms/start but sites still have local copies
- apps/site.ts is mostly empty after migration — platform config should be in a config file, not code
# 1. Install dependencies
npm install
# 2. Generate CMS blocks and schema
npm run generate:blocks
npm run generate:schema
# 3. Generate routes
npx tsr generate
# 4. Type check
npx tsc --noEmit
# 5. Find unused code
npm run knip
# 6. Run dev server
npm run dev