Nextj.js: Support top-level weight/style in next/font/local with string src#32998
Conversation
- Add top-level weight and style to @font-face when src is a string - Exclude variable font weight ranges from className (only static weights) - Align with Next.js localFont behavior
📝 WalkthroughWalkthroughThe changes update font handling in Next.js webpack loader. The first adds conditional font-weight and font-style CSS declarations for local font paths. The second conditionalizes font-weight CSS generation and normalizes weight values by replacing spaces with dashes in class names. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
✨ Finishing touches
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (2)
🧰 Additional context used📓 Path-based instructions (4)**/*.{js,jsx,json,html,ts,tsx,mjs}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
**/*.{ts,tsx,js,jsx,mjs}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
code/**/*.{ts,tsx,js,jsx,mjs}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
{code/**,scripts/**}/**/*.{ts,tsx,js,jsx,mjs}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
🔇 Additional comments (4)
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. Comment |
Package BenchmarksCommit: No significant changes detected, all good. 👏 |
|
Hi @Chiman2937 Thank you for contributing! LGTM! Would you be interested in fixing the bug also for |
Of course! |
Closes #32992
What I did
Fixed incorrect CSS generation when using
next/font/localwith top-levelweightandstyleproperties alongside a stringsrc.Problem
Storybook only processes
weightandstylewhen they are specified inside thesrcarray:✅ Works in Storybook (array-style):
❌ Broken in Storybook (top-level properties):
However, Next.js supports both patterns. When using top-level
weight/styleproperties with a stringsrc, Storybook generates incorrect CSS:Changes
getFontFaceCSSfunction: Addweightandstyleto@font-facewhensrcis a stringgetCSSMetafunction: Filter out variable font weight ranges from className (only apply static weights)getClassNamefunction: Replace spaces with hyphens in weight ranges to generate valid CSS class namesChecklist for Contributors
Testing
The changes in this PR are covered in the following automated tests:
Manual testing
This section is mandatory for all contributions. If you believe no manual test is necessary, please state so explicitly. Thanks!
1. Test environment:
@storybook/nextjsConfigure localFont with top-level weight (string src)
2. Verify the fix
<style id="font-face-...">tagfont-weightis missing from@font-facefont-weight: 45 920;is present in@font-face.classNamedoes NOT includefont-weight(correct for variable fonts)✔️ Test Results
All test cases now match Next.js behavior - variable fonts work correctly with top-level
weightproperty, and Storybook generates identical CSS output to Next.js App.Case 1: Variable font with top-level weight range
Result - Next.js App
Result - Storybook
Case 2: top-level static weight
Result - Next.js App
Result - Storybook
Case 3: Variable font with array-style src and weight range
Result - Next.js App
Result - Storybook
Case 4: Multiple static fonts with array-style src
Result - Next.js App
Result - Storybook
Case 5: Variable font with top-level weight range and style
Result - Next.js App
Result - Storybook
Documentation
MIGRATION.MD
Checklist for Maintainers
When this PR is ready for testing, make sure to add
ci:normal,ci:mergedorci:dailyGH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found incode/lib/cli-storybook/src/sandbox-templates.tsMake sure this PR contains one of the labels below:
Available labels
bug: Internal changes that fixes incorrect behavior.maintenance: User-facing maintenance tasks.dependencies: Upgrading (sometimes downgrading) dependencies.build: Internal-facing build tooling & test updates. Will not show up in release changelog.cleanup: Minor cleanup style change. Will not show up in release changelog.documentation: Documentation only changes. Will not show up in release changelog.feature request: Introducing a new feature.BREAKING CHANGE: Changes that break compatibility in some way with current major version.other: Changes that don't fit in the above categories.🦋 Canary release
This PR does not have a canary release associated. You can request a canary release of this pull request by mentioning the
@storybookjs/coreteam here.core team members can create a canary release here or locally with
gh workflow run --repo storybookjs/storybook publish.yml --field pr=<PR_NUMBER>Summary by CodeRabbit