Skip to content

feat: upgrade to Next.js 16, TailwindCSS v4, Storybook 10, and Biome#422

Open
hari wants to merge 8 commits intomainfrom
hari-lamichhane/upgrade-to-latest
Open

feat: upgrade to Next.js 16, TailwindCSS v4, Storybook 10, and Biome#422
hari wants to merge 8 commits intomainfrom
hari-lamichhane/upgrade-to-latest

Conversation

@hari
Copy link
Contributor

@hari hari commented Mar 6, 2026

  • Upgrade Next.js 14 → 16, TailwindCSS v3 → v4, Storybook 9 → 10
  • Replace ESLint + Prettier with Biome for linting and formatting
  • Replace contentlayer with velite for content processing
  • Migrate CSS config from tailwind.config.ts to CSS-based @theme syntax
  • Fix animated-border-trail CSS @Property animation compatibility
  • Add (main) route group for layout separation
  • Update component preview iframe URLs for Storybook 10 autodocs
  • Fix story file issues (titles, exports, autodocs tags)
  • Add deploy-v3 GitHub Actions workflow
  • Update globals.css with TailwindCSS v4 base layer resets

- Upgrade Next.js 14 → 16, TailwindCSS v3 → v4, Storybook 9 → 10
- Replace ESLint + Prettier with Biome for linting and formatting
- Replace contentlayer with velite for content processing
- Migrate CSS config from tailwind.config.ts to CSS-based @theme syntax
- Fix animated-border-trail CSS @Property animation compatibility
- Add (main) route group for layout separation
- Update component preview iframe URLs for Storybook 10 autodocs
- Fix story file issues (titles, exports, autodocs tags)
- Add deploy-v3 GitHub Actions workflow
- Update globals.css with TailwindCSS v4 base layer resets

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link

coderabbitai bot commented Mar 6, 2026

Important

Review skipped

Too many files!

This PR contains 300 files, which is 150 over the limit of 150.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0c668bae-8e9a-4302-b9ab-b81d8eb5238e

📥 Commits

Reviewing files that changed from the base of the PR and between 04517d8 and df0b157.

📒 Files selected for processing (300)
  • .env.development
  • .eslintignore
  • .eslintrc.cjs
  • .github/workflows/deploy-v3.yml
  • .github/workflows/deploy.yml
  • .gitignore
  • .node-version
  • .prettierrc.cjs
  • .storybook/main.ts
  • .storybook/preview.tsx
  • .vscode/extensions.json
  • animata/accordion/faq.stories.tsx
  • animata/accordion/faq.tsx
  • animata/background/animated-beam.stories.tsx
  • animata/background/animated-beam.tsx
  • animata/background/blurry-blob.stories.tsx
  • animata/background/blurry-blob.tsx
  • animata/background/diagonal-lines.stories.tsx
  • animata/background/dot.stories.tsx
  • animata/background/grid.stories.tsx
  • animata/background/interactive-grid.stories.tsx
  • animata/background/interactive-grid.tsx
  • animata/background/moving-gradient.stories.tsx
  • animata/background/moving-gradient.tsx
  • animata/background/zigzag.stories.tsx
  • animata/bento-grid/eight.stories.tsx
  • animata/bento-grid/eight.tsx
  • animata/bento-grid/eleven.stories.tsx
  • animata/bento-grid/five.stories.tsx
  • animata/bento-grid/four.stories.tsx
  • animata/bento-grid/four.tsx
  • animata/bento-grid/gradient.stories.tsx
  • animata/bento-grid/gradient.tsx
  • animata/bento-grid/nine.stories.tsx
  • animata/bento-grid/nine.tsx
  • animata/bento-grid/seven.stories.tsx
  • animata/bento-grid/seven.tsx
  • animata/bento-grid/six.stories.tsx
  • animata/bento-grid/six.tsx
  • animata/bento-grid/ten.stories.tsx
  • animata/bento-grid/ten.tsx
  • animata/bento-grid/three.stories.tsx
  • animata/button/ai-button.stories.tsx
  • animata/button/ai-button.tsx
  • animata/button/algolia-blue-button.stories.tsx
  • animata/button/algolia-blue-button.tsx
  • animata/button/algolia-white-button.stories.tsx
  • animata/button/algolia-white-button.tsx
  • animata/button/animated-follow-button.stories.tsx
  • animata/button/animated-follow-button.tsx
  • animata/button/arrow-button.stories.tsx
  • animata/button/arrow-button.tsx
  • animata/button/duolingo.stories.tsx
  • animata/button/duolingo.tsx
  • animata/button/external-link-button.stories.tsx
  • animata/button/get-started-button.stories.tsx
  • animata/button/ripple-button.stories.tsx
  • animata/button/shining-button.stories.tsx
  • animata/button/shining-button.tsx
  • animata/button/slide-arrow-button.stories.tsx
  • animata/button/slide-arrow-button.tsx
  • animata/button/status-button.stories.tsx
  • animata/button/status-button.tsx
  • animata/button/swipe-button.stories.tsx
  • animata/button/swipe-button.tsx
  • animata/button/toggle-switch.stories.tsx
  • animata/button/toggle-switch.tsx
  • animata/button/work-button.stories.tsx
  • animata/card/WebHooks-card.tsx
  • animata/card/blur-stack-card.stories.tsx
  • animata/card/blur-stack-card.tsx
  • animata/card/card-comment.stories.tsx
  • animata/card/card-comment.tsx
  • animata/card/card-spread.stories.tsx
  • animata/card/case-study-card.stories.tsx
  • animata/card/case-study-card.tsx
  • animata/card/comment-reply-card.stories.tsx
  • animata/card/comment-reply-card.tsx
  • animata/card/email-feature-card.stories.tsx
  • animata/card/email-feature-card.tsx
  • animata/card/flip-card.stories.tsx
  • animata/card/fluid-tabs.stories.tsx
  • animata/card/fluid-tabs.tsx
  • animata/card/github-card-shiny.stories.tsx
  • animata/card/github-card-shiny.tsx
  • animata/card/github-card-skew.stories.tsx
  • animata/card/github-card-skew.tsx
  • animata/card/glowing-card.stories.tsx
  • animata/card/glowing-card.tsx
  • animata/card/integration-pills.stories.tsx
  • animata/card/integration-pills.tsx
  • animata/card/led-board.stories.tsx
  • animata/card/led-board.tsx
  • animata/card/notice-card.stories.tsx
  • animata/card/notice-card.tsx
  • animata/card/notification-card.stories.tsx
  • animata/card/notification-card.tsx
  • animata/card/notify-user-info.stories.tsx
  • animata/card/notify-user-info.tsx
  • animata/card/reminder-scheduler.stories.tsx
  • animata/card/reminder-scheduler.tsx
  • animata/card/score-card.stories.tsx
  • animata/card/score-card.tsx
  • animata/card/staggered-card.stories.tsx
  • animata/card/staggered-card.tsx
  • animata/card/subscribe-card.stories.tsx
  • animata/card/survey-card.stories.tsx
  • animata/card/survey-card.tsx
  • animata/card/swap-card.stories.tsx
  • animata/card/swap-card.tsx
  • animata/card/swap-text-card.stories.tsx
  • animata/card/tilted-card.stories.tsx
  • animata/card/webhooks-card.stories.tsx
  • animata/carousel/expandable.stories.tsx
  • animata/carousel/expandable.tsx
  • animata/carousel/image-carousel.stories.tsx
  • animata/carousel/image-carousel.tsx
  • animata/container/animated-border-trail.stories.tsx
  • animata/container/animated-border-trail.tsx
  • animata/container/animated-dock.stories.tsx
  • animata/container/animated-dock.tsx
  • animata/container/cursor-tracker.stories.tsx
  • animata/container/fibonacci-lines.stories.tsx
  • animata/container/marquee.stories.tsx
  • animata/container/nav-tabs.stories.tsx
  • animata/container/nav-tabs.tsx
  • animata/container/scrolling-testimonials.stories.tsx
  • animata/container/shift-tabs.stories.tsx
  • animata/fabs/speed-dial.stories.tsx
  • animata/fabs/speed-dial.tsx
  • animata/feature-cards/confirmation-message.stories.tsx
  • animata/feature-cards/confirmation-message.tsx
  • animata/feature-cards/content-scan.stories.tsx
  • animata/feature-cards/content-scan.tsx
  • animata/graphs/bar-chart.stories.tsx
  • animata/graphs/commit-graph.stories.tsx
  • animata/graphs/commit-graph.tsx
  • animata/graphs/donut-chart.stories.tsx
  • animata/graphs/donut-chart.tsx
  • animata/graphs/gauge-chart.stories.tsx
  • animata/graphs/gauge-chart.tsx
  • animata/graphs/progress.stories.tsx
  • animata/graphs/ring-chart.stories.tsx
  • animata/graphs/ring-chart.tsx
  • animata/hero/hero-section-text-hover.stories.tsx
  • animata/hero/hero-section-text-hover.tsx
  • animata/hero/hero-section.stories.tsx
  • animata/hero/product-features.stories.tsx
  • animata/hero/product-features.tsx
  • animata/hero/shape-shifter.stories.tsx
  • animata/hero/slack-intro.stories.tsx
  • animata/icon/hover-interaction.stories.tsx
  • animata/icon/hover-interaction.tsx
  • animata/icon/icon-ripple.stories.tsx
  • animata/image/disclose-image.stories.tsx
  • animata/image/disclose-image.tsx
  • animata/image/image-box-shadow.stories.tsx
  • animata/image/image-box-shadow.tsx
  • animata/image/images-reveal.stories.tsx
  • animata/image/images-reveal.tsx
  • animata/image/photo-booth.stories.tsx
  • animata/image/photo-booth.tsx
  • animata/image/skew-image.stories.tsx
  • animata/image/skew-image.tsx
  • animata/image/tilted-cover.stories.tsx
  • animata/image/tilted-cover.tsx
  • animata/image/trailing-image.stories.tsx
  • animata/image/trailing-image.tsx
  • animata/image/zoom-image.stories.tsx
  • animata/image/zoom-image.tsx
  • animata/list/avatar-list.stories.tsx
  • animata/list/flipping-cards.stories.tsx
  • animata/list/flower-menu.stories.tsx
  • animata/list/flower-menu.tsx
  • animata/list/menu-animation.stories.tsx
  • animata/list/orbiting-items-3-d.stories.tsx
  • animata/list/orbiting-items-3-d.tsx
  • animata/list/orbiting-items.stories.tsx
  • animata/list/reveal-image.stories.tsx
  • animata/list/transaction-list.stories.tsx
  • animata/list/transaction-list.tsx
  • animata/list/transition-list.stories.tsx
  • animata/list/transition-list.tsx
  • animata/overlay/modal.stories.tsx
  • animata/overlay/modal.tsx
  • animata/preloader/vertical-tiles.stories.tsx
  • animata/preloader/vertical-tiles.tsx
  • animata/progress/animatedtimeline.stories.tsx
  • animata/progress/animatedtimeline.tsx
  • animata/progress/spinner.stories.tsx
  • animata/progress/spinner.tsx
  • animata/section/pricing.stories.tsx
  • animata/section/pricing.tsx
  • animata/skeleton/code.stories.tsx
  • animata/skeleton/cookie-banner.stories.tsx
  • animata/skeleton/list.stories.tsx
  • animata/skeleton/receipt.stories.tsx
  • animata/skeleton/report.stories.tsx
  • animata/skeleton/wide-card.stories.tsx
  • animata/text/animated-gradient-text.stories.tsx
  • animata/text/bold-copy.stories.tsx
  • animata/text/circular-text.stories.tsx
  • animata/text/circular-text.tsx
  • animata/text/counter.stories.tsx
  • animata/text/counter.tsx
  • animata/text/cycle-text.stories.tsx
  • animata/text/cycle-text.tsx
  • animata/text/double-underline.stories.tsx
  • animata/text/gibberish-text.stories.tsx
  • animata/text/glitch-text.stories.tsx
  • animata/text/glitch-text.tsx
  • animata/text/jitter-text.stories.tsx
  • animata/text/jitter-text.tsx
  • animata/text/jumping-text-instagram.stories.tsx
  • animata/text/jumping-text-instagram.tsx
  • animata/text/mask-text.stories.tsx
  • animata/text/mask-text.tsx
  • animata/text/mirror-text.stories.tsx
  • animata/text/scroll-reveal.stories.tsx
  • animata/text/scroll-reveal.tsx
  • animata/text/split-text.stories.tsx
  • animata/text/split-text.tsx
  • animata/text/staggered-letter.stories.tsx
  • animata/text/staggered-letter.tsx
  • animata/text/swap-text.stories.tsx
  • animata/text/text-border-animation.stories.tsx
  • animata/text/text-border-animation.tsx
  • animata/text/text-explode-imessage.stories.tsx
  • animata/text/text-explode-imessage.tsx
  • animata/text/text-flip.stories.tsx
  • animata/text/ticker.stories.tsx
  • animata/text/ticker.tsx
  • animata/text/typing-text.stories.tsx
  • animata/text/typing-text.tsx
  • animata/text/underline-hover-text.stories.tsx
  • animata/text/underline-hover-text.tsx
  • animata/text/wave-reveal.stories.tsx
  • animata/text/wave-reveal.tsx
  • animata/widget/alarm-clock.stories.tsx
  • animata/widget/alarm-clock.tsx
  • animata/widget/battery-level.stories.tsx
  • animata/widget/battery.stories.tsx
  • animata/widget/battery.tsx
  • animata/widget/calendar-event.stories.tsx
  • animata/widget/calendar-event.tsx
  • animata/widget/calendar-widget.stories.tsx
  • animata/widget/calendar-widget.tsx
  • animata/widget/calorie-counter.stories.tsx
  • animata/widget/calorie-counter.tsx
  • animata/widget/clock-with-photo.stories.tsx
  • animata/widget/cycling.stories.tsx
  • animata/widget/delivery-card.stories.tsx
  • animata/widget/delivery-card.tsx
  • animata/widget/direction-card.stories.tsx
  • animata/widget/direction-card.tsx
  • animata/widget/expense-tracker.stories.tsx
  • animata/widget/flight-widget.stories.tsx
  • animata/widget/flight-widget.tsx
  • animata/widget/fund-widget.stories.tsx
  • animata/widget/fund-widget.tsx
  • animata/widget/live-score.stories.tsx
  • animata/widget/live-score.tsx
  • animata/widget/mobile-detail.stories.tsx
  • animata/widget/mobile-detail.tsx
  • animata/widget/music-stack-interaction.stories.tsx
  • animata/widget/music-stack-interaction.tsx
  • animata/widget/music-widget.stories.tsx
  • animata/widget/music-widget.tsx
  • animata/widget/notes.stories.tsx
  • animata/widget/profile.stories.tsx
  • animata/widget/reminder-widget.stories.tsx
  • animata/widget/reminder-widget.tsx
  • animata/widget/reminder.stories.tsx
  • animata/widget/score-board.stories.tsx
  • animata/widget/security-alert.stories.tsx
  • animata/widget/security-alert.tsx
  • animata/widget/shopping-list.stories.tsx
  • animata/widget/sleep-tracker.stories.tsx
  • animata/widget/storage-status.stories.tsx
  • animata/widget/storage-widget.stories.tsx
  • animata/widget/study-timer.stories.tsx
  • animata/widget/study-timer.tsx
  • animata/widget/team-clock.stories.tsx
  • animata/widget/team-clock.tsx
  • animata/widget/video-chat.stories.tsx
  • animata/widget/video-chat.tsx
  • animata/widget/vpn-widget.stories.tsx
  • animata/widget/vpn-widget.tsx
  • animata/widget/water-tracker.stories.tsx
  • animata/widget/water-tracker.tsx
  • animata/widget/weather-card.stories.tsx
  • animata/widget/weather-card.tsx
  • animata/widget/weekly-progress.stories.tsx
  • animata/widget/weekly-progress.tsx
  • app/(main)/_landing/call-to-action.tsx
  • app/(main)/_landing/faq-section.tsx
  • app/(main)/_landing/grid-view.tsx
  • app/(main)/_landing/hero-title.tsx
  • app/(main)/_landing/hero.tsx
  • app/(main)/_landing/highlight.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch hari-lamichhane/upgrade-to-latest

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment on lines +10 to +48
runs-on: ubuntu-latest
environment: v3-deployment
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install yarn
run: npm install -g yarn
- name: Restore cache
uses: actions/cache@v4
with:
path: |
.next/cache
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
restore-keys: |
${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}-
- name: Install dependencies
run: yarn install --immutable
- name: Build component previews
run: yarn storybook:build
- name: Build with Next.js
env:
NEXT_PUBLIC_APP_URL: ${{ vars.NEXT_PUBLIC_APP_URL }}
NEXT_PUBLIC_SUPABASE_URL: ${{ vars.NEXT_PUBLIC_SUPABASE_URL }}
NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ vars.NEXT_PUBLIC_SUPABASE_ANON_KEY }}
NEXT_PUBLIC_POSTHOG_KEY: ${{ vars.NEXT_PUBLIC_POSTHOG_KEY }}
NEXT_PUBLIC_POSTHOG_HOST: ${{ vars.NEXT_PUBLIC_POSTHOG_HOST }}
NEXT_PUBLIC_PLUNK_API_KEY: ${{ vars.NEXT_PUBLIC_PLUNK_API_KEY }}
run: yarn build
- name: Deploy to Cloudflare Pages
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy out --project-name=animata-v3 --branch=main
gitHubToken: ${{ secrets.GITHUB_TOKEN }}

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}

Copilot Autofix

AI 1 day ago

To fix the problem, explicitly define a minimal permissions block so that the GITHUB_TOKEN used by this workflow/job is limited to read-only repository contents unless more is required. The safest pattern is to declare permissions at the workflow root (applies to all jobs) or at the deploy-v3 job level. Since there is only a single job and no evidence of needing write permissions (the job checks out code, builds, caches, and then deploys to Cloudflare using Cloudflare credentials), we can safely set contents: read as the only permission.

The best minimal change is to add a permissions block near the top of .github/workflows/deploy-v3.yml, right after the name: line (or before/after on:; all are valid) so that it applies to the entire workflow. No imports or additional methods are needed since this is just YAML configuration. Concretely, in .github/workflows/deploy-v3.yml, insert:

permissions:
  contents: read

between line 1 (name: Deploy v3) and line 3 (on:), keeping indentation consistent. This documents that the workflow only needs read access to repository contents and ensures the GITHUB_TOKEN is not given unnecessary write permissions.

Suggested changeset 1
.github/workflows/deploy-v3.yml

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/.github/workflows/deploy-v3.yml b/.github/workflows/deploy-v3.yml
--- a/.github/workflows/deploy-v3.yml
+++ b/.github/workflows/deploy-v3.yml
@@ -1,5 +1,8 @@
 name: Deploy v3
 
+permissions:
+  contents: read
+
 on:
   push:
     branches:
EOF
@@ -1,5 +1,8 @@
name: Deploy v3

permissions:
contents: read

on:
push:
branches:
Copilot is powered by AI and may make mistakes. Always verify output.
Cloudflare Pages defaults to Node 18.17.1, but Next.js 16 requires
Node >=20.9.0. The .node-version file is respected by Cloudflare's
build system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Mar 6, 2026

Deploying animata with  Cloudflare Pages  Cloudflare Pages

Latest commit: 891602f
Status: ✅  Deploy successful!
Preview URL: https://cda95907.animata.pages.dev
Branch Preview URL: https://hari-lamichhane-upgrade-to-l.animata.pages.dev

View logs

hari and others added 6 commits March 6, 2026 20:03
- Inline @Property and @Keyframes in AnimatedBorderTrail component so
  the CSS custom property animation works with TailwindCSS v4
- Remove leftover test files (testingo, navigation-menu) that broke
  storybook build due to missing @radix-ui/react-navigation-menu dep

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ensures component previews are always built during `yarn build`,
including on Cloudflare Pages direct builds where the build command
is just `yarn build`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Install @storybook/addon-docs to support autodocs in Storybook 10
- Run Next.js and Storybook dev server concurrently via `yarn dev`
- Use NEXT_PUBLIC_STORYBOOK_URL env var to point previews to Storybook
  dev server in development, falling back to /preview for production
- Add prebuild script to build static storybook for production builds
- Update all 162 MDX files from --docs to --primary story IDs
- Use viewMode=story for component preview iframes
- Fix border trail animation by inlining @Property for TailwindCSS v4

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Next.js 16 uses Turbopack by default which skips the webpack velite
plugin. Run velite CLI directly: --watch mode for dev, one-shot for
prebuild. Fixes stale .velite cache causing --docs IDs to persist.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace bg-opacity-*, text-opacity-*, border-opacity-* with the
Tailwind v4 color/opacity modifier syntax (e.g. bg-gray-400/30).
Also move complex multi-layer box-shadows to inline styles for
algolia buttons since Tailwind v4 can't parse rgba() commas in
arbitrary shadow values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Restore missing styles/storybook.css (lost in migration) which
  defines storybook-fix class and embedded preview styles
- Re-add storybook.css import to storybook preview config
- Replace -z-1 with z-0 in components — in Tailwind v3 -z-1 was not
  a default utility (no-op), but in v4 it generates z-index:-1 which
  pushes elements behind the parent background

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant