Skip to content

refactor(core): migrate navbar chrome, nav drawer and workspace previews to vanilla-extract - #14994

Draft
stipsan wants to merge 1 commit into
cody/ve-lite2-06-studio-screens-scheduling-0ee6from
cody/ve-lite2-07-navbar-chrome-0ee6
Draft

stipsan wants to merge 1 commit into
cody/ve-lite2-06-studio-screens-scheduling-0ee6from
cody/ve-lite2-07-navbar-chrome-0ee6

Conversation

@stipsan

@stipsan stipsan commented Sep 24, 2026 •

Copy link
Copy Markdown
Member

Description

Layer 7/10 of a second low-risk cherry-pick stack from the styled-components to vanilla-extract migration in #14566 (the 12-PR ve-stack series, #14616 to #14627). The first stack (#14905 to #14914) took the purely static rules and has merged; this one takes the lowest-risk tier that is left, in the same shape: at most 20 files per layer, one commit each, every file copied verbatim from the reference tip, whose merge base with main is 455717e. On top of static rules and && overrides, this tier allows attribute and pseudo selectors, keyframes, globalStyle scoped under a local class, closed-set styleVariants, a few prop- or theme-driven values (createVar with assignInlineVars, or useTheme_v2) and a few media or container queries with default-theme literal breakpoints. Layers are ordered by risk, lowest first, so the stack can be merged bottom-up and stopped at any layer. Based on #14992.

This layer covers the rest of the navbar: the root navbar layer and grid, nav drawer, resources button and studio info dialog, the search header spinner, filter labels, image reference previews, workspace previews and the default workspace icon.

What to review

  • StudioNavbar: the theme.sanity.media[4] breakpoint becomes a literal 1800px (the default theme value) and line-height gets &&.
  • FilterLabel passes $flexShrink through createVar and assignInlineVars, merging style and className; WorkspacePreview turns its $size into styleVariants.
  • createDefaultIcon reads the font from useTheme_v2() instead of styled-components' useTheme(), using the same keys in the v2 theme; StudioInfoDialog's .attrs({overflow, radius}) become props on Card.
  • One review fix on top of the reference: NavDrawer's inner card had min-width: 200px at single-class specificity, which loses to v4 Box's own flex-item min-width: 0 (measured in Chromium, it computed 0px; the styled original won that tie by injection order). It now sits under the existing && with height, which computes 200px.
  • Rebase note: StudioNavbar.tsx also carries feat(core): read every selected variant from perspective #14918 (read every selected variant), which main added in a separate hunk; the rebase kept both.
  • Package: sanity (core/studio/components/navbar, core/config).

Testing

Each layer passes oxfmt --check and a type-aware oxlint --type-check of its files plus every file importing them, on its own commit. At the stack tip pnpm check:oxlint passes, the packages build with the migrated rules in lib/bundle.css, and pnpm vitest run --project=sanity --changed origin/main passes (227 files, 1885 tests, rebased on main at 4cebde0), as does the exports snapshot test, so no public export changes shape. Every Storybook story that renders a file from this stack (17 stories) was screenshotted on main and at the tip and compared pixel by pixel: all 17 are identical, while a one-value negative control produced 42,739 changed pixels. For this layer, the WorkspacePreview and WorkspaceAuthLayout stories are pixel-identical.

Notes for release

N/A – Internal styling migration.


Open in Web Open in Cursor 

@vercel

vercel Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
auth-test-studio Ready Ready Preview Sep 25, 2026 8:16am UTC
page-building-studio Ready Ready Preview Sep 25, 2026 8:16am UTC
studio-diagnostics Ready Ready Preview Sep 25, 2026 8:16am UTC
studio-radar Ready Ready Preview Sep 25, 2026 8:16am UTC
studio-storybook Ready Ready Preview Sep 25, 2026 8:16am UTC
test-studio Ready Ready Preview Sep 25, 2026 8:16am UTC
test-studio-preview-iframe Ready Ready Preview Sep 25, 2026 8:16am UTC

Request Review

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

📦 Bundle Stats — sanity

Compared against cody/ve-lite2-06-studio-screens-scheduling-0ee6 (aea264f7) · v6.16.0 (npm)

sanity

Metric Value vs cody/ve-lite2-06-studio-screens-scheduling-0ee6 (aea264f) vs v6.16.0
Internal (raw) 4.46 MB -241 B, -0.0% +30.7 KB, +0.7%
Internal (gzip) 1.11 MB -8 B, -0.0% +9.6 KB, +0.9%
Bundled (raw) 13.29 MB -265 B, -0.0% +28.8 KB, +0.2%
Bundled (gzip) 3.14 MB -168 B, -0.0% +8.2 KB, +0.3%
Import time 1.82s -6ms, -0.3% +86ms, +5.0%

bin:sanity

Metric Value vs cody/ve-lite2-06-studio-screens-scheduling-0ee6 (aea264f) vs v6.16.0
Internal (raw) 7.1 KB - -
Internal (gzip) 2.9 KB - -
Bundled (raw) 7.1 KB - -
Bundled (gzip) 2.8 KB - -
Import time 5ms -0ms, -1.3% +0ms, +7.1%

🗺️ View treemap · Artifacts

Details
  • Import time regressions over 10% are flagged with ⚠️
  • Sizes shown as raw / gzip 🗜️. Internal bytes = own code only. Total bytes = with all dependencies. Import time = Node.js cold-start median.

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

📚 TypeDoc Generation Result

✅ TypeDoc generated successfully!

  • File size: 8.7M
  • Total exports: 1105
  • Artifact: sanity-typedoc-33fb8eaf32911aa863ae9df39c31f29b5c4c2942

The TypeDoc JSON file has been generated and validated. All documentation scripts completed successfully.

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

❌ E2E Tests

🟢 169 passed • 🔴 2 failed • 🟡 47 flaky • (⚪ 92 skipped) • view full report • view run

🤖 Share with an AI agent:

Fix the failing e2e tests. The failure report with error messages and page snapshots is at https://e2e-studio-7ecnq15sn.sanity.dev/agent-report.md
Debug failing tests locally
SANITY_E2E_PROJECT_ID=ittbm412 \
SANITY_E2E_BASE_URL=https://e2e-studio-453h9m9fv.sanity.dev \
SANITY_E2E_DATASET=pr-14994-chromium-36111985279 \
SANITY_E2E_DATASET_CHROMIUM=pr-14994-chromium-36111985279 \
SANITY_E2E_DATASET_FIREFOX=pr-14994-firefox-36111985279 \
pnpm test:e2e --headed \
  e2e/tests/expanded-document/expanded.spec.ts \
  e2e/tests/tasks/tasks.spec.ts

Studio: https://e2e-studio-453h9m9fv.sanity.dev

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Visual regression coverage

130 changed UI files: 28 covered, 4 pending, 98 uncovered.

Per-file coverage (130)
File Status Evidence
packages/sanity/src/core/comments-v2/components/avatars/CommentsAvatar.css.ts uncovered
packages/sanity/src/core/comments-v2/components/avatars/CommentsAvatar.tsx uncovered
packages/sanity/src/core/comments-v2/components/list/CommentOriginBadge.css.ts covered packages/sanity/src/core/comments-v2/components/list/__tests__/CommentOriginBadge.stories.tsx
packages/sanity/src/core/comments-v2/components/list/CommentOriginBadge.tsx covered packages/sanity/src/core/comments-v2/components/list/__tests__/CommentOriginBadge.stories.tsx
packages/sanity/src/core/comments-v2/components/list/CommentsListItemContextMenu.css.ts uncovered
packages/sanity/src/core/comments-v2/components/list/CommentsListItemContextMenu.tsx uncovered
packages/sanity/src/core/comments-v2/components/mentions/MentionsMenu.css.ts covered packages/sanity/src/core/comments-v2/components/mentions/__tests__/MentionsMenu.stories.tsx
packages/sanity/src/core/comments-v2/components/mentions/MentionsMenu.tsx covered packages/sanity/src/core/comments-v2/components/mentions/__tests__/MentionsMenu.stories.tsx
packages/sanity/src/core/comments-v2/components/onboarding/CommentsOnboardingPopover.css.ts uncovered
packages/sanity/src/core/comments-v2/components/onboarding/CommentsOnboardingPopover.tsx uncovered
packages/sanity/src/core/comments-v2/plugin/inspector/CommentsInspector.css.ts uncovered
packages/sanity/src/core/comments-v2/plugin/inspector/CommentsInspector.tsx uncovered
packages/sanity/src/core/comments/components/avatars/CommentsAvatar.css.ts uncovered
packages/sanity/src/core/comments/components/avatars/CommentsAvatar.tsx uncovered
packages/sanity/src/core/comments/components/list/CommentsListItemContextMenu.css.ts uncovered
packages/sanity/src/core/comments/components/list/CommentsListItemContextMenu.tsx uncovered
packages/sanity/src/core/comments/components/mentions/MentionsMenu.css.ts covered packages/sanity/src/core/comments/components/mentions/__tests__/MentionsMenu.stories.tsx
packages/sanity/src/core/comments/components/mentions/MentionsMenu.tsx covered packages/sanity/src/core/comments/components/mentions/__tests__/MentionsMenu.stories.tsx
packages/sanity/src/core/comments/components/mentions/MentionsMenuItem.tsx uncovered
packages/sanity/src/core/comments/components/onboarding/CommentsOnboardingPopover.css.ts uncovered
packages/sanity/src/core/comments/components/onboarding/CommentsOnboardingPopover.tsx uncovered
packages/sanity/src/core/comments/components/pte/blocks/NormalBlock.css.ts uncovered
packages/sanity/src/core/comments/components/pte/blocks/NormalBlock.tsx uncovered
packages/sanity/src/core/comments/components/reactions/TransparentCard.css.ts uncovered
packages/sanity/src/core/comments/components/reactions/TransparentCard.styled.tsx uncovered
packages/sanity/src/core/comments/plugin/field/CommentsFieldButton.css.ts uncovered
packages/sanity/src/core/comments/plugin/field/CommentsFieldButton.tsx uncovered
packages/sanity/src/core/comments/plugin/input/components/FloatingButtonPopover.css.ts uncovered
packages/sanity/src/core/comments/plugin/input/components/FloatingButtonPopover.tsx uncovered
packages/sanity/src/core/comments/plugin/input/components/InlineCommentInputPopover.css.ts covered packages/sanity/src/core/comments/components/pte/comment-input/__tests__/InlineComposerMentions.browser.test.tsx (browser test)
packages/sanity/src/core/comments/plugin/input/components/InlineCommentInputPopover.tsx covered packages/sanity/src/core/comments/components/pte/comment-input/__tests__/InlineComposerMentions.browser.test.tsx (browser test)
packages/sanity/src/core/comments/plugin/inspector/CommentsInspector.css.ts uncovered
packages/sanity/src/core/comments/plugin/inspector/CommentsInspector.tsx uncovered
packages/sanity/src/core/comments/plugin/inspector/CommentsInspectorHeader.css.ts uncovered
packages/sanity/src/core/comments/plugin/inspector/CommentsInspectorHeader.tsx uncovered
packages/sanity/src/core/config/createDefaultIcon.tsx uncovered
packages/sanity/src/core/documentGroupInventory/components/CreateVariant/SelectBundle.css.ts uncovered
packages/sanity/src/core/documentGroupInventory/components/CreateVariant/SelectBundle.tsx uncovered
packages/sanity/src/core/documentGroupInventory/components/DocumentGroupInventoryAction.css.ts uncovered
packages/sanity/src/core/documentGroupInventory/components/DocumentGroupInventoryAction.tsx uncovered
packages/sanity/src/core/documentGroupInventory/components/VariantSet/VariantCheckbox.css.ts uncovered
packages/sanity/src/core/documentGroupInventory/components/VariantSet/VariantCheckbox.tsx uncovered
packages/sanity/src/core/documentGroupInventory/components/VariantSet/VariantSet.css.ts uncovered
packages/sanity/src/core/documentGroupInventory/components/VariantSet/VariantSet.tsx uncovered
packages/sanity/src/core/field/diff/components/DiffInspectWrapper.css.ts uncovered
packages/sanity/src/core/field/diff/components/DiffInspectWrapper.tsx uncovered
packages/sanity/src/core/field/diff/components/MetaInfo.css.ts covered packages/sanity/src/core/field/diff/components/__tests__/FieldDiffChrome.stories.tsx
packages/sanity/src/core/field/diff/components/MetaInfo.tsx covered packages/sanity/src/core/field/diff/components/__tests__/FieldDiffChrome.stories.tsx
packages/sanity/src/core/field/types/portableText/diff/components/Header.css.ts uncovered
packages/sanity/src/core/field/types/portableText/diff/components/Header.tsx uncovered
packages/sanity/src/core/form/inputs/TextInput.css.ts uncovered
packages/sanity/src/core/form/inputs/TextInput.tsx uncovered
packages/sanity/src/core/form/inputs/arrays/common/DragHandle.css.ts uncovered
packages/sanity/src/core/form/inputs/arrays/common/DragHandle.tsx uncovered
packages/sanity/src/core/form/inputs/files/ImageToolInput/imagetool/HotspotImage.css.ts uncovered
packages/sanity/src/core/form/inputs/files/ImageToolInput/imagetool/HotspotImage.styles.tsx uncovered
packages/sanity/src/core/presence/FieldPresence.styled.css.ts covered packages/sanity/src/core/form/inputs/arrays/__tests__/ArrayItemLayouts.stories.tsx
packages/sanity/src/core/presence/FieldPresence.styled.tsx covered packages/sanity/src/core/form/inputs/arrays/__tests__/ArrayItemLayouts.stories.tsx
packages/sanity/src/core/releases/components/documentHeader/contextMenu/CopyToReleaseMenuGroup.css.ts uncovered
packages/sanity/src/core/releases/components/documentHeader/contextMenu/CopyToReleaseMenuGroup.tsx uncovered
packages/sanity/src/core/releases/components/documentHeader/styles.css.ts uncovered
packages/sanity/src/core/releases/components/documentHeader/styles.tsx uncovered
packages/sanity/src/core/releases/tool/components/Table/TableHeader.css.ts covered packages/sanity/src/core/releases/tool/components/Table/__tests__/Table.browser.test.tsx (browser test)
packages/sanity/src/core/releases/tool/components/Table/TableHeader.tsx covered packages/sanity/src/core/releases/tool/components/Table/__tests__/Table.browser.test.tsx (browser test)
packages/sanity/src/core/releases/tool/detail/ReleaseTypePicker.css.ts uncovered
packages/sanity/src/core/releases/tool/detail/ReleaseTypePicker.tsx uncovered
packages/sanity/src/core/releases/tool/detail/documentTable/DocumentTableColumnDefs.css.ts uncovered
packages/sanity/src/core/releases/tool/detail/documentTable/DocumentTableColumnDefs.tsx uncovered
packages/sanity/src/core/releases/tool/overview/SchedulesUpsell.css.ts pending #15007 packages/sanity/src/core/studio/upsell/__tests__/UpsellPanelHosts.stories.tsx
packages/sanity/src/core/releases/tool/overview/SchedulesUpsell.tsx pending #15007 packages/sanity/src/core/studio/upsell/__tests__/UpsellPanelHosts.stories.tsx
packages/sanity/src/core/scheduled-publishing/tool/Tool.css.ts uncovered
packages/sanity/src/core/scheduled-publishing/tool/Tool.tsx uncovered
packages/sanity/src/core/scheduled-publishing/tool/schedules/Schedules.css.ts uncovered
packages/sanity/src/core/scheduled-publishing/tool/schedules/Schedules.tsx uncovered
packages/sanity/src/core/studio/StudioLayoutComponent.css.ts uncovered
packages/sanity/src/core/studio/StudioLayoutComponent.tsx uncovered
packages/sanity/src/core/studio/components/navbar/StudioNavbar.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/StudioNavbar.tsx uncovered
packages/sanity/src/core/studio/components/navbar/free-trial/FreeTrialButton.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/free-trial/FreeTrialButton.tsx uncovered
packages/sanity/src/core/studio/components/navbar/free-trial/PopoverContent.css.ts covered packages/sanity/src/core/studio/components/navbar/free-trial/__tests__/FreeTrialPopoverContent.stories.tsx
packages/sanity/src/core/studio/components/navbar/free-trial/PopoverContent.tsx covered packages/sanity/src/core/studio/components/navbar/free-trial/__tests__/FreeTrialPopoverContent.stories.tsx
packages/sanity/src/core/studio/components/navbar/navDrawer/NavDrawer.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/navDrawer/NavDrawer.tsx uncovered
packages/sanity/src/core/studio/components/navbar/new-document/NewDocumentList.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/new-document/NewDocumentList.tsx uncovered
packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx uncovered
packages/sanity/src/core/studio/components/navbar/resources/DiagnosticsReport.css.ts covered packages/sanity/src/core/studio/components/navbar/resources/__tests__/DiagnosticsReport.stories.tsx
packages/sanity/src/core/studio/components/navbar/resources/DiagnosticsReport.tsx covered packages/sanity/src/core/studio/components/navbar/resources/__tests__/DiagnosticsReport.stories.tsx
packages/sanity/src/core/studio/components/navbar/resources/ResourcesButton.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/resources/ResourcesButton.tsx uncovered
packages/sanity/src/core/studio/components/navbar/resources/StudioInfoDialog.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/resources/StudioInfoDialog.tsx uncovered
packages/sanity/src/core/studio/components/navbar/search/SearchDialog.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/search/SearchDialog.tsx uncovered
packages/sanity/src/core/studio/components/navbar/search/components/SearchHeader.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/search/components/SearchHeader.tsx uncovered
packages/sanity/src/core/studio/components/navbar/search/components/common/FilterLabel.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/search/components/common/FilterLabel.tsx uncovered
packages/sanity/src/core/studio/components/navbar/search/components/common/FilterPill.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/search/components/common/FilterPill.tsx uncovered
packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/FilterPopoverContent.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/FilterPopoverContent.tsx uncovered
packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/asset/preview/ImageReferencePreview.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/asset/preview/ImageReferencePreview.tsx uncovered
packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/date/datePicker/calendar/CalendarMonth.css.ts uncovered
packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/date/datePicker/calendar/CalendarMonth.tsx uncovered
packages/sanity/src/core/studio/components/navbar/workspace/WorkspaceAuth/Layout.css.ts covered packages/sanity/src/core/studio/components/navbar/workspace/WorkspaceAuth/__tests__/WorkspaceAuthLayout.stories.tsx
packages/sanity/src/core/studio/components/navbar/workspace/WorkspaceAuth/Layout.tsx covered packages/sanity/src/core/studio/components/navbar/workspace/WorkspaceAuth/__tests__/WorkspaceAuthLayout.stories.tsx
packages/sanity/src/core/studio/components/navbar/workspace/WorkspacePreview.css.ts covered packages/sanity/src/core/studio/components/navbar/workspace/__tests__/WorkspacePreview.stories.tsx
packages/sanity/src/core/studio/components/navbar/workspace/WorkspaceAuth/__tests__/WorkspaceAuthLayout.stories.tsx
packages/sanity/src/core/studio/components/navbar/workspace/WorkspacePreview.tsx covered packages/sanity/src/core/studio/components/navbar/workspace/__tests__/WorkspacePreview.stories.tsx
packages/sanity/src/core/studio/components/navbar/workspace/WorkspaceAuth/__tests__/WorkspaceAuthLayout.stories.tsx
packages/sanity/src/core/studio/screens/schemaErrors/SchemaProblemGroups.css.ts covered packages/sanity/src/core/studio/screens/schemaErrors/__tests__/SchemaProblemGroups.stories.tsx
packages/sanity/src/core/studio/screens/schemaErrors/SchemaProblemGroups.tsx covered packages/sanity/src/core/studio/screens/schemaErrors/__tests__/SchemaProblemGroups.stories.tsx
packages/sanity/src/core/studio/studioAnnouncements/Divider.css.ts uncovered
packages/sanity/src/core/studio/studioAnnouncements/Divider.tsx uncovered
packages/sanity/src/core/studio/studioAnnouncements/StudioAnnouncementsDialog.css.ts uncovered
packages/sanity/src/core/studio/studioAnnouncements/StudioAnnouncementsDialog.tsx uncovered
packages/sanity/src/core/studio/upsell/UpsellPanel.css.ts covered packages/sanity/src/core/studio/upsell/__tests__/UpsellPanel.stories.tsx
packages/sanity/src/core/studio/upsell/UpsellPanel.tsx covered packages/sanity/src/core/studio/upsell/__tests__/UpsellPanel.stories.tsx
packages/sanity/src/core/studio/workspaces/ConfigErrorScreen.css.ts pending #14897 packages/sanity/src/core/studio/workspaces/__tests__/ConfigErrorScreen.stories.tsx
packages/sanity/src/core/studio/workspaces/ConfigErrorScreen.tsx pending #14897 packages/sanity/src/core/studio/workspaces/__tests__/ConfigErrorScreen.stories.tsx
packages/sanity/src/core/studio/workspaces/CorsOriginErrorScreen.css.ts covered packages/sanity/src/core/studio/workspaces/__tests__/CorsOriginError.stories.tsx
packages/sanity/src/core/studio/workspaces/CorsOriginErrorScreen.tsx covered packages/sanity/src/core/studio/workspaces/__tests__/CorsOriginError.stories.tsx
packages/sanity/src/core/tasks/components/activity/helpers/index.css.ts uncovered
packages/sanity/src/core/tasks/components/activity/helpers/index.tsx uncovered
packages/sanity/src/core/tasks/plugin/TasksFooterOpenTasks.css.ts uncovered
packages/sanity/src/core/tasks/plugin/TasksFooterOpenTasks.tsx uncovered
packages/sanity/src/media-library/plugin/VideoInput/styles.css.ts uncovered
packages/sanity/src/media-library/plugin/VideoInput/styles.tsx uncovered

covered: a committed *.stories.tsx (snapshotted by the "sanity studio" Chromatic project) or *.browser.test.tsx (end state snapshotted by "sanity studio vitest") imports the file, directly or through its *Story.tsx harness. pending: an open PR adds such a story; do not open a duplicate. uncovered: no story or browser test renders this file. How to add one: .agents/skills/sanity-visual-coverage/SKILL.md.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Navbar grid columns may not apply
    • Both navGrid column templates are now wrapped in && so they sit at (0,2,0) like the sibling ui5 Grid migrations (CalendarMonth, ImageListView) and can no longer lose an order-dependent cascade tie, though the impact is latent rather than currently visible since ui5's Grid only emits its own grid-template-columns when the gridTemplateColumns prop is passed and the navbar passes none.

Create PR

Or push these changes by commenting:

@cursor push 981ba62287
Preview (981ba62287)
diff --git a/packages/sanity/src/core/studio/components/navbar/StudioNavbar.css.ts b/packages/sanity/src/core/studio/components/navbar/StudioNavbar.css.ts
--- a/packages/sanity/src/core/studio/components/navbar/StudioNavbar.css.ts
+++ b/packages/sanity/src/core/studio/components/navbar/StudioNavbar.css.ts
@@ -22,12 +22,17 @@
 })
 
 export const navGrid = style({
-  // Allow the tools column to shrink below its content so CollapseTabList can collapse into the overflow menu.
-  'gridTemplateColumns': 'auto minmax(0, 1fr) auto',
-  '@media': {
-    // media[4]
-    'screen and (min-width: 1800px)': {
-      gridTemplateColumns: '1fr auto 1fr',
+  selectors: {
+    // `&&` beats ui5 Grid's own column template regardless of stylesheet order
+    '&&': {
+      // Allow the tools column to shrink below its content so CollapseTabList can collapse into the overflow menu.
+      'gridTemplateColumns': 'auto minmax(0, 1fr) auto',
+      '@media': {
+        // media[4]
+        'screen and (min-width: 1800px)': {
+          gridTemplateColumns: '1fr auto 1fr',
+        },
+      },
     },
   },
 })

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit e4f0fda. Configure here.

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 49.82% 40041 / 80368
🔵 Statements 45% 53240 / 118293
🔵 Functions 45.05% 8138 / 18064
🔵 Branches 40.01% 30758 / 76864
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
packages/sanity/src/core/config/createDefaultIcon.tsx 96.22% 65.21% 100% 100% 29-69
packages/sanity/src/core/studio/components/navbar/StudioNavbar.css.ts 0% 0% 0% 0%
packages/sanity/src/core/studio/components/navbar/StudioNavbar.tsx 0.94% 0% 0% 1.76% 52-295
packages/sanity/src/core/studio/components/navbar/navDrawer/NavDrawer.css.ts 0% 0% 0% 0%
packages/sanity/src/core/studio/components/navbar/navDrawer/NavDrawer.tsx 19.23% 0% 0% 25.64% 63-91
packages/sanity/src/core/studio/components/navbar/resources/ResourcesButton.css.ts 0% 0% 0% 0%
packages/sanity/src/core/studio/components/navbar/resources/ResourcesButton.tsx 0% 0% 0% 0% 25-121
packages/sanity/src/core/studio/components/navbar/resources/StudioInfoDialog.css.ts 0% 0% 0% 0%
packages/sanity/src/core/studio/components/navbar/resources/StudioInfoDialog.tsx 0.71% 0% 0% 1.23% 29-39, 44-366
packages/sanity/src/core/studio/components/navbar/search/components/SearchHeader.css.ts 0% 0% 0% 0%
packages/sanity/src/core/studio/components/navbar/search/components/SearchHeader.tsx 0% 0% 0% 0% 26-158
packages/sanity/src/core/studio/components/navbar/search/components/common/FilterLabel.css.ts 0% 0% 0% 0%
packages/sanity/src/core/studio/components/navbar/search/components/common/FilterLabel.tsx 89.18% 59.55% 100% 93.22% 56, 73, 128, 131, 138, 141, 26-121
packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/asset/preview/ImageReferencePreview.css.ts 0% 0% 0% 0%
packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/asset/preview/ImageReferencePreview.tsx 0% 0% 0% 0% 17-43
packages/sanity/src/core/studio/components/navbar/workspace/WorkspacePreview.css.ts 0% 0% 0% 0%
packages/sanity/src/core/studio/components/navbar/workspace/WorkspacePreview.tsx 41.17% 16.66% 60% 42.85% 32, 33, 47-52, 49-86
Generated in workflow #71951 for commit 4aca2d5 by the Vitest Coverage Report Action

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Two extracted styles need stronger specificity to preserve minimum sizing against runtime @sanity/ui styles.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 2 Medium severity

Open (2)
What changed in this PR

Migrates navbar-related styling from styled-components to vanilla-extract while preserving existing behavior.

Changes:

  • Migrates navbar, drawer, search, resources, and workspace preview styles.
  • Replaces dynamic styles with variants, CSS variables, and keyframes.
  • Uses useTheme_v2 for default workspace icons.
File Description
WorkspacePreview.tsx Applies extracted preview styles.
WorkspacePreview.css.ts Defines icon sizing and SVG styles.
StudioNavbar.tsx Replaces styled navbar wrappers.
StudioNavbar.css.ts Defines navbar layout and responsive grid.
SearchHeader.tsx Migrates spinner and filter wrapper.
SearchHeader.css.ts Defines spinner animation and layout.
ImageReferencePreview.tsx Applies extracted image preview styles.
ImageReferencePreview.css.ts Defines square preview and image positioning.
FilterLabel.tsx Bridges dynamic flex shrink through a CSS variable.
FilterLabel.css.ts Defines the flex-shrink variable.
StudioInfoDialog.tsx Replaces styled dialog elements.
StudioInfoDialog.css.ts Defines monogram and badge truncation styles.
ResourcesButton.tsx Applies extracted menu sizing.
ResourcesButton.css.ts Defines menu width constraints.
NavDrawer.tsx Replaces styled motion cards and layer.
NavDrawer.css.ts Defines drawer, backdrop, and panel layout.
createDefaultIcon.tsx Reads font values through useTheme_v2.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

…ews to vanilla-extract

Layer 7/10 of the second low-risk cherry-pick series from the styled-components to
vanilla-extract migration in #14566. Files are taken from the tip of that stack.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The migration preserves the original styling contracts and correctly resolves the previously identified drawer specificity issue.

Review effort: Balanced
Findings: None

This branch was successfully deployed

7 active deployments
Preview – test-studio — 4aca2d5e Deployed Sep 25, 2026 by vercel[bot]
Preview – studio-storybook — 4aca2d5e Deployed Sep 25, 2026 by vercel[bot]
Preview – studio-radar — 4aca2d5e Deployed Sep 25, 2026 by vercel[bot]
Preview – page-building-studio — 4aca2d5e Deployed Sep 25, 2026 by vercel[bot]
Preview – studio-diagnostics — 4aca2d5e Deployed Sep 25, 2026 by vercel[bot]
Preview – auth-test-studio — 4aca2d5e Deployed Sep 25, 2026 by vercel[bot]
Preview – test-studio-preview-iframe — 4aca2d5e Deployed Sep 25, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants