Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
3934 commits
Select commit Hold shift + click to select a range
f568841
chore(deps): update renovatebot/github-action action to v46.1.19 (#1570)
squiggler-app[bot] Jul 14, 2026
caca6ae
fix(deps): update dependency @sanity/icons to ^5.1.0 (#1574)
squiggler-app[bot] Jul 14, 2026
d0f0ab2
fix(deps): update dependency @tanstack/react-virtual to ^3.14.6 (#1573)
squiggler-app[bot] Jul 14, 2026
d93e529
chore(deps): dedupe pnpm-lock.yaml (#1575)
squiggler-app[bot] Jul 14, 2026
2c2a229
Version Packages (#1572)
squiggler-app[bot] Jul 14, 2026
2c633a0
fix(deps): update build tooling dependencies (#1580)
stipsan Jul 14, 2026
a5a2aaf
chore: simplify, rely on default options
stipsan Jul 14, 2026
e01f2aa
fix(deps): update dependency @sanity/tsdown-config to ^0.14.2 (#1583)
squiggler-app[bot] Jul 14, 2026
e87cfa2
Remove redundant `dts` option from tsdown configs (#1567)
stipsan Jul 14, 2026
d13b36b
fix(deps): update dependency @sanity/pkg-utils to ^11.0.3 (#1582)
squiggler-app[bot] Jul 14, 2026
bbb2948
chore(deps): update dependency @vitejs/devtools to ^0.4.0 (#1578)
squiggler-app[bot] Jul 14, 2026
f6172fc
chore(deps): dedupe pnpm-lock.yaml (#1585)
squiggler-app[bot] Jul 14, 2026
b5afb08
chore(deps): bump sanity to 6.5.0 and enable unstable_bundledDev (#1589)
stipsan Jul 15, 2026
67f4292
Migrate plugin-kit and the monorepo from prettier/eslint to oxfmt/oxl…
stipsan Jul 15, 2026
e2ccb40
fix(deps): update dependency groq to ^6.5.0 (#1523)
squiggler-app[bot] Jul 15, 2026
1c5abb6
fix(deps): update dependency nanoid to v6 (#1577)
squiggler-app[bot] Jul 15, 2026
0a0e77e
chore(deps): update pnpm to v11 (#1579)
squiggler-app[bot] Jul 15, 2026
3d240ba
chore(deps): update actions/setup-node action to v7 (#1586)
squiggler-app[bot] Jul 15, 2026
69f608d
fix(deps): update dependency @sanity/tsconfig to ^2.2.1 (#1595)
squiggler-app[bot] Jul 15, 2026
f06fd76
fix(deps): update dependency tsdown to ^0.22.8 (#1596)
squiggler-app[bot] Jul 15, 2026
314c536
fix(deps): update dependency xstate to ^5.32.5 (#1597)
squiggler-app[bot] Jul 15, 2026
0cad29a
fix(media): use useMediaIndex so Tags panel works on wide viewports (…
stipsan Jul 16, 2026
2b25b8d
chore(deps): dedupe pnpm-lock.yaml (#1602)
squiggler-app[bot] Jul 16, 2026
da9b808
Version Packages (#1591)
squiggler-app[bot] Jul 16, 2026
a225f52
chore(deps): update dependency @vitejs/devtools to ^0.4.1 (#1593)
squiggler-app[bot] Jul 16, 2026
4ea684b
fix(deps): update dependency @changesets/cli to ^2.31.1 (#1607)
squiggler-app[bot] Jul 16, 2026
e536ff3
chore(deps): replace @vanilla-extract/vite-plugin with @sanity/vanill…
stipsan Jul 16, 2026
0df2f4d
chore(deps): lock file maintenance (#1611)
squiggler-app[bot] Jul 16, 2026
99ae8c1
chore(deps): update zizmorcore/zizmor-action action to v0.6.0 (#1609)
squiggler-app[bot] Jul 16, 2026
bfd5a92
fix(deps): update dependency oxlint to ^1.74.0 (#1603)
squiggler-app[bot] Jul 16, 2026
e645292
chore(deps): bump tsdown and vanilla-extract
stipsan Jul 16, 2026
4621007
Fix TypeGen workflow failure by pinning `@sanity/vanilla-extract-vite…
Copilot Jul 16, 2026
f7e4f4f
fix(deps): update dependency @sanity/pkg-utils to ^11.0.7 (#1594)
squiggler-app[bot] Jul 16, 2026
f9cb255
fix(deps): update dependency oxfmt to ^0.59.0 (#1599)
squiggler-app[bot] Jul 16, 2026
6283900
fix(deps): update dependency @codemirror/lang-markdown to ^6.5.1 (#1610)
squiggler-app[bot] Jul 16, 2026
6fe93e7
chore: fix css
stipsan Jul 17, 2026
e2113a7
chore(deps): update dependency knip to ^6.27.0
stipsan Jul 17, 2026
feca3d7
fix(deps): update turbo monorepo to v2.10.5 (#1626)
squiggler-app[bot] Jul 17, 2026
b9724cf
fix(deps): update dependency @sanity/pkg-utils to ^11.0.9 (#1625)
squiggler-app[bot] Jul 17, 2026
20ded50
chore(deps): update pnpm to v11.13.1 (#1624)
squiggler-app[bot] Jul 17, 2026
1e7f013
chore(deps): dedupe pnpm-lock.yaml (#1619)
squiggler-app[bot] Jul 17, 2026
735b86a
docs(assist): fix README markdown formatting and document English-onl…
stipsan Jul 17, 2026
3ef4719
fix(deps): update dependency @sanity/pkg-utils to ^11.0.10 (#1630)
squiggler-app[bot] Jul 17, 2026
f170525
Move turbo/**/*.hbs oxfmt ignore to root config (#1604)
stipsan Jul 17, 2026
edbfa95
fix(deps): update dependency @sanity/vanilla-extract-vite-plugin to ^…
squiggler-app[bot] Jul 17, 2026
6e96e3e
chore(deps): dedupe pnpm-lock.yaml (#1631)
squiggler-app[bot] Jul 17, 2026
fe9acb1
fix(deps): update dependency @sanity/tsdown-config to ^0.19.3 (#1598)
squiggler-app[bot] Jul 17, 2026
387896a
fix(bynder-input): restore Compact View modal visibility in Studio v6…
pedrobonamin Jul 17, 2026
ebecfbf
fix(assist): keep field group selection while editing AI Assist input…
stipsan Jul 17, 2026
6fe3c11
fix(deps): update dependency tsdown to ^0.22.9 (#1622)
squiggler-app[bot] Jul 17, 2026
22bd64e
chore(deps): dedupe pnpm-lock.yaml (#1632)
squiggler-app[bot] Jul 17, 2026
a5e050a
chore(format): 🤖 ✨ (#1633)
squiggler-app[bot] Jul 17, 2026
8984de8
fix(typegen): 🤖 ✨ (#1634)
squiggler-app[bot] Jul 17, 2026
aa5d52e
ci: shard Vitest suite (#1584)
stipsan Jul 17, 2026
03ad374
Version Packages (#1612)
squiggler-app[bot] Jul 17, 2026
25c3a19
chore(deps): update davelosert/vitest-coverage-report-action action t…
squiggler-app[bot] Jul 17, 2026
48e32f9
fix(deps): update dependency react-hook-form to ^7.82.0 (#1639)
squiggler-app[bot] Jul 19, 2026
b33eb96
chore(deps): dedupe pnpm-lock.yaml (#1637)
squiggler-app[bot] Jul 19, 2026
9b066ef
docs(agents): catalog shared deps + enable pnpm catalogMode prefer (#…
stipsan Jul 19, 2026
2087502
fix(deps): update dependency react-virtuoso to ^4.18.11 (#1641)
squiggler-app[bot] Jul 20, 2026
081d1ac
chore(deps): dedupe pnpm-lock.yaml (#1643)
squiggler-app[bot] Jul 20, 2026
b08fe44
fix(deps): update dependency styled-components to ^6.4.4 (#1566)
squiggler-app[bot] Jul 20, 2026
6be2e74
fix(deps): update dependency tsdown to ^0.22.12 (#1642)
squiggler-app[bot] Jul 20, 2026
1aaa8eb
chore(deps): bump @sanity/vanilla-extract-vite-plugin to ^0.2.4
cursoragent Jul 20, 2026
397fed5
chore(deps): update renovatebot/github-action action to v46.1.20 (#1646)
squiggler-app[bot] Jul 20, 2026
e768e32
chore(deps): dedupe pnpm-lock.yaml (#1645)
squiggler-app[bot] Jul 20, 2026
ec5d55b
fix(deps): update dependency @sanity/pkg-utils to ^11.0.12 (#1647)
squiggler-app[bot] Jul 20, 2026
513ebc3
chore(deps): dedupe pnpm-lock.yaml (#1649)
squiggler-app[bot] Jul 20, 2026
1d5f733
Migrate to date-fns v4 and official @date-fns/tz, matching sanity cor…
stipsan Jul 20, 2026
25e8f9a
Delete dependencies-GH-1642.md
stipsan Jul 20, 2026
0fe5967
chore(test-studio): stop waiting on dependency builds (#1652)
Copilot Jul 20, 2026
741a65d
chore(deps): lock file maintenance (#1651)
squiggler-app[bot] Jul 20, 2026
86cf238
chore: remove @typescript/native-preview (use TypeScript 7 native tsc…
stipsan Jul 20, 2026
1856b0d
chore(deps): dedupe pnpm-lock.yaml (#1653)
squiggler-app[bot] Jul 20, 2026
2b48e4c
chore(deps): bump pkg-utils, tsdown-config, and vanilla-extract plugi…
stipsan Jul 20, 2026
f95d5b0
chore(test-studio): use turbo transit for build cache invalidation (#…
stipsan Jul 20, 2026
23eafe8
Version Packages (#1640)
squiggler-app[bot] Jul 20, 2026
b9b210c
chore(deps): lock file maintenance (#1657)
squiggler-app[bot] Jul 20, 2026
3c0f473
fix(deps): update dependency @sanity/client to ^7.24.0 (#1581)
squiggler-app[bot] Jul 20, 2026
f4def8a
chore(deps): dedupe pnpm-lock.yaml (#1658)
squiggler-app[bot] Jul 20, 2026
ae97408
chore(changeset): bump google maps input for css dts cleanup (#1659)
Copilot Jul 20, 2026
9e30870
Version Packages (#1660)
squiggler-app[bot] Jul 20, 2026
edb64e9
chore(changeset): note npm provenance re-enabled for sanity-plugin-ut…
stipsan Jul 20, 2026
da9f7f8
Version Packages (#1662)
squiggler-app[bot] Jul 20, 2026
9734bff
feat(code-input): export SUPPORTED_LANGUAGES and LANGUAGE_ALIASES (#1…
GabeStah Jul 21, 2026
09adb6e
feat: add @sanity/block-insert-picker (#1601)
GabeStah Jul 21, 2026
94ff15b
Version Packages (#1663)
squiggler-app[bot] Jul 21, 2026
7874d51
chore(deps): dedupe pnpm-lock.yaml (#1665)
squiggler-app[bot] Jul 21, 2026
6063d87
fix(deps): update dependency @tanstack/react-virtual to ^3.14.7 (#1664)
squiggler-app[bot] Jul 21, 2026
a09a8a7
fix(typegen): 🤖 ✨ (#1666)
squiggler-app[bot] Jul 21, 2026
4b2545b
fix(sanity-plugin-markdown): declare @sanity/client as a regular depe…
stipsan Jul 21, 2026
7846580
chore(deps): dedupe pnpm-lock.yaml (#1669)
squiggler-app[bot] Jul 21, 2026
f64af98
feat(@sanity/plugin-kit)!: remove Studio v2 upgrade and compatibility…
stipsan Jul 21, 2026
bc05c14
ci: request workflows permission for typegen app token (#935)
Copilot Jul 21, 2026
5ecc71c
Migrate sanity-plugin-workflow styling to vanilla-extract (#1450)
stipsan Jul 21, 2026
f46ddb5
chore(deps): dedupe pnpm-lock.yaml (#1671)
squiggler-app[bot] Jul 21, 2026
ec18416
Version Packages (#1668)
squiggler-app[bot] Jul 21, 2026
fa4097c
fix(color-input): simplify components, remove HOC (#1673)
stipsan Jul 21, 2026
3fb0013
Version Packages (#1674)
squiggler-app[bot] Jul 21, 2026
1f96853
fix(deps): update dependency @sanity/icons to ^5.2.0 (#1676)
squiggler-app[bot] Jul 21, 2026
06848cc
fix(deps): update dependency @sanity/preview-url-secret to ^4.1.0 (#1…
squiggler-app[bot] Jul 22, 2026
ed96385
fix(deps): update dependency @sanity/ui to ^3.4.0 (#1677)
squiggler-app[bot] Jul 22, 2026
fc35ac5
fix(deps): update dependency get-it to ^9.2.0 (#1675)
squiggler-app[bot] Jul 22, 2026
85f2edc
chore(deps): dedupe pnpm-lock.yaml (#1678)
squiggler-app[bot] Jul 22, 2026
4ea0d1f
chore: add per-plugin changesets for latest @sanity/icons and @sanity…
Copilot Jul 22, 2026
320c0a5
fix(typegen): 🤖 ✨ (#1686)
squiggler-app[bot] Jul 22, 2026
74adb09
Version Packages (#1689)
squiggler-app[bot] Jul 22, 2026
96830b8
chore(plugin-kit): bump CLI dependencies to latest compatible majors …
stipsan Jul 22, 2026
ac23c6b
fix(deps): update dependency tsdown to ^0.22.13 (#1691)
squiggler-app[bot] Jul 23, 2026
578c494
Version Packages (#1694)
squiggler-app[bot] Jul 23, 2026
f01a080
Delete dependencies-GH-1691.md
stipsan Jul 23, 2026
2a3a7ea
fix(deps): update dependency @sanity/ui to ^3.4.3
cursoragent Jul 23, 2026
122dd42
fix(deps): update dependency @portabletext/block-tools to ^5.1.12 (#1…
squiggler-app[bot] Jul 23, 2026
cb38e51
Merge pull request #1702 from sanity-io/cursor/bump-sanity-ui-f3da
stipsan Jul 23, 2026
5eb902e
fix(deps): upgrade oxlint and oxlint-tsgolint to latest (#1707)
stipsan Jul 23, 2026
fc7c0cf
Remove @sanity/styled-components override, move back to styled-compon…
stipsan Jul 23, 2026
2c676f5
fix(deps): update dependency @portabletext/plugin-input-rule to ^6.0.…
squiggler-app[bot] Jul 23, 2026
8acf59b
Version Packages (#1708)
squiggler-app[bot] Jul 23, 2026
cac02bf
chore(deps): update dependency @portabletext/editor to ^7.10.10 (#1703)
squiggler-app[bot] Jul 23, 2026
9da2688
chore(deps): dedupe pnpm-lock.yaml (#1709)
squiggler-app[bot] Jul 23, 2026
2fc8d23
fix(deps): update dependency @sanity/preview-url-secret to ^4.1.1 (#1…
squiggler-app[bot] Jul 23, 2026
03e126b
feat(test-studio): enable React profiling on Vercel preview builds (#…
stipsan Jul 23, 2026
b89105a
fix(deps): update dependency @sanity/color to ^3.0.7 (#1716)
squiggler-app[bot] Jul 23, 2026
d268b24
fix(deps): upgrade Sanity monorepo to ^6.6.0 (#1717)
stipsan Jul 23, 2026
09c10da
feat(plugin-kit)!: require Node.js 24 and bump held-back CLI deps (#1…
stipsan Jul 23, 2026
8375bb0
fix(deps): update dependency @tanstack/react-query to ^5.101.4 (#1706)
squiggler-app[bot] Jul 23, 2026
06c7167
chore(deps): update dependency @vitejs/devtools to ^0.4.3 (#1704)
squiggler-app[bot] Jul 23, 2026
4829dd9
fix(deps): update react monorepo to ^19.2.8 (#1692)
squiggler-app[bot] Jul 23, 2026
f27f1eb
fix(deps): update dependency @testing-library/jest-dom to v7 (#1679)
squiggler-app[bot] Jul 23, 2026
d82235e
fix(deps): update dependency oxfmt to ^0.60.0 (#1697)
squiggler-app[bot] Jul 23, 2026
5f04732
fix(deps): update dependency @sanity/icons to ^5.2.1 (#1720)
squiggler-app[bot] Jul 23, 2026
9aa0431
Delete .changeset/dependencies-GH-1692.md
stipsan Jul 23, 2026
447ea25
Delete .changeset/dependencies-GH-1697.md
stipsan Jul 23, 2026
ba86b7d
chore(deps): update dependency @portabletext/editor to ^7.10.11 (#1721)
squiggler-app[bot] Jul 24, 2026
ce2d492
chore(deps): update dependency @types/google.maps to ^3.65.3 (#1722)
squiggler-app[bot] Jul 24, 2026
9641947
fix(deps): update dependency @portabletext/plugin-input-rule to ^6.0.…
squiggler-app[bot] Jul 24, 2026
ecb3805
Version Packages (#1718)
squiggler-app[bot] Jul 24, 2026
6b382bb
chore(deps): dedupe pnpm-lock.yaml (#1724)
squiggler-app[bot] Jul 24, 2026
f6c28de
Make test-studio typegen idempotent in CI by forcing schema overwrite…
Copilot Jul 24, 2026
eef637c
feat: add Playwright smoke e2e with ephemeral datasets (#1710)
pedrobonamin Jul 24, 2026
7040150
chore(deps): update dependency @vitejs/devtools to ^0.4.5 (#1726)
squiggler-app[bot] Jul 24, 2026
8bc5b71
chore(deps): update dependency knip to ^6.29.0 (#1727)
squiggler-app[bot] Jul 24, 2026
ed28fe7
fix(deps): update dependency @tanstack/react-virtual to ^3.14.8 (#1728)
squiggler-app[bot] Jul 24, 2026
3687995
fix(deps): update turbo monorepo to v2.10.6 (#1729)
squiggler-app[bot] Jul 24, 2026
6ece7a6
chore(deps): update actions/cache action to v5 (#1730)
squiggler-app[bot] Jul 24, 2026
66b6605
fix(deps): update dependency @sanity/pkg-utils to ^11.0.14 (#1732)
squiggler-app[bot] Jul 24, 2026
ca61d53
fix(deps): update dependency @sanity/vanilla-extract-vite-plugin to ^…
squiggler-app[bot] Jul 24, 2026
3384a87
fix(deps): update dependency @sanity/tsdown-config to ^0.21.0 (#1736)
squiggler-app[bot] Jul 24, 2026
0ccd7f1
chore(deps): update dependency @playwright/test to ^1.61.1 (#1737)
squiggler-app[bot] Jul 25, 2026
7a93209
chore(deps): update actions/cache action to v6 (#1731)
squiggler-app[bot] Jul 25, 2026
f223342
fix(deps): update dependency tsdown to ^0.22.14 (#1739)
squiggler-app[bot] Jul 25, 2026
915f29f
chore(deps): update zizmorcore/zizmor-action action to v0.6.1 (#1740)
squiggler-app[bot] Jul 25, 2026
eb87adb
fix(deps): update dependency @sanity/pkg-utils to ^11.0.15 (#1741)
squiggler-app[bot] Jul 25, 2026
c906eba
fix(deps): update dependency @sanity/tsdown-config to ^0.21.1 (#1742)
squiggler-app[bot] Jul 25, 2026
c941233
fix(deps): update dependency @sanity/vanilla-extract-vite-plugin to ^…
squiggler-app[bot] Jul 25, 2026
08ca35a
fix(deps): update dependency @sanity/color to ^3.0.8 (#1743)
squiggler-app[bot] Jul 25, 2026
77a74ae
Delete dependencies-GH-1739.md
stipsan Jul 25, 2026
7b36300
chore(deps): dedupe pnpm-lock.yaml (#1734)
squiggler-app[bot] Jul 25, 2026
f6d588d
fix(deps): update dependency @sanity/preview-url-secret to ^4.1.2 (#1…
squiggler-app[bot] Jul 25, 2026
1097877
fix(deps): update dependency @mux/mux-player-react to ^3.13.2 (#1752)
squiggler-app[bot] Jul 27, 2026
95509fd
fix(deps): update dependency react-hook-form to ^7.83.0 (#1750)
squiggler-app[bot] Jul 27, 2026
037e637
chore(deps): dedupe pnpm-lock.yaml (#1748)
squiggler-app[bot] Jul 27, 2026
b065f3d
fix(deps): update dependency @mux/mux-player to ^3.13.2 (#1751)
squiggler-app[bot] Jul 27, 2026
87e9ee4
fix(deps): update dependency @sanity/ui to ^3.4.5 (#1745)
squiggler-app[bot] Jul 27, 2026
a1bf316
fix(deps): update dependency @sanity/client to ^7.25.0 (#1747)
squiggler-app[bot] Jul 27, 2026
fbbe478
chore(deps): dedupe pnpm-lock.yaml (#1753)
squiggler-app[bot] Jul 27, 2026
a7b840c
chore: fix lockfile
stipsan Jul 27, 2026
00be634
chore(deps): lock file maintenance (#1749)
squiggler-app[bot] Jul 27, 2026
14599e6
chore(deps): update dependency @portabletext/editor to ^7.10.13 (#1755)
squiggler-app[bot] Jul 27, 2026
126205c
chore(deps): update dependency @vitejs/devtools to ^0.4.8 (#1756)
squiggler-app[bot] Jul 27, 2026
7d03cd8
fix(deps): update dependency @portabletext/plugin-input-rule to ^6.0.…
squiggler-app[bot] Jul 27, 2026
965c25e
fix(deps): update dependency concurrently to ^10.0.4 (#1758)
squiggler-app[bot] Jul 27, 2026
220d02f
fix(deps): update turbo monorepo to v2.10.7 (#1759)
squiggler-app[bot] Jul 27, 2026
11ce842
chore(deps): update dependency @playwright/test to ^1.62.0 (#1760)
squiggler-app[bot] Jul 27, 2026
82cf916
chore(deps): dedupe pnpm-lock.yaml (#1754)
squiggler-app[bot] Jul 27, 2026
4b84531
test(document-internationalization): expand Vitest + Playwright e2e c…
pedrobonamin Jul 27, 2026
e8d373d
chore(deps): dedupe pnpm-lock.yaml (#1761)
squiggler-app[bot] Jul 27, 2026
efeda83
fix(deps): update dependency @sanity/ui to ^3.5.0 (#1762)
squiggler-app[bot] Jul 28, 2026
07ee2e1
chore(deps): update renovatebot/github-action action to v46.1.21 (#1763)
squiggler-app[bot] Jul 28, 2026
379c7f8
fix(deps): update dependency @vanilla-extract/css to ^1.21.2 (#1764)
squiggler-app[bot] Jul 28, 2026
7d87b28
feat(test-studio): add experimental @sanity/themer tool (#1738)
stipsan Jul 28, 2026
c45776b
fix(deps): update dependency @sanity/pkg-utils to ^11.0.16 (#1768)
squiggler-app[bot] Jul 28, 2026
535b12f
chore(deps): dedupe pnpm-lock.yaml (#1766)
squiggler-app[bot] Jul 28, 2026
e15fd10
fix(deps): bump @sanity/pkg-utils, @sanity/tsdown-config and vanilla-…
stipsan Jul 28, 2026
5c18ae5
Version Packages (#1735)
squiggler-app[bot] Jul 28, 2026
6c2470e
Ban React class component imports (#1362)
stipsan Jul 28, 2026
cfa596d
refactor(color-input): migrate styling to vanilla-extract (#1670)
stipsan Jul 28, 2026
ed4f2c2
Version Packages (#1775)
squiggler-app[bot] Jul 28, 2026
fe7337a
chore(deps): update dependency @vitejs/devtools to ^0.4.9 (#1773)
squiggler-app[bot] Jul 28, 2026
26cbe2f
chore(deps): update actions/stale action to v11 (#1781)
squiggler-app[bot] Jul 29, 2026
5555795
fix(deps): update dependency oxfmt to ^0.61.0 (#1779)
squiggler-app[bot] Jul 29, 2026
2a2cb2e
fix(typegen): 🤖 ✨ (#1785)
squiggler-app[bot] Jul 29, 2026
97937c4
test(internationalized-array): expand Vitest + Playwright e2e coverag…
pedrobonamin Jul 29, 2026
4eda215
docs(shopify-assets): update Sanity Connect option name
redasalmi Jul 28, 2026
7af8f41
fix(deps): update sanity monorepo to ^6.7.0 (#1778)
squiggler-app[bot] Jul 29, 2026
9628df4
fix(deps): update dependency motion to ^12.43.0 (#1789)
squiggler-app[bot] Jul 29, 2026
d3dedd3
fix(deps): update dependency oxlint to ^1.76.0 (#1698)
squiggler-app[bot] Jul 29, 2026
777894b
chore(deps): dedupe pnpm-lock.yaml (#1790)
squiggler-app[bot] Jul 29, 2026
c61bb44
fix(deps): update dependency react-rx to ^4.2.5 (#1792)
squiggler-app[bot] Jul 30, 2026
5890779
chore: rely on pnpm v11 default minimumReleaseAge (#1782)
stipsan Jul 30, 2026
51317b2
fix(personalization-plugin): address review feedback from #971 (#1208)
stipsan Jul 30, 2026
d4dd45b
fix(sanity-plugin-studio-smartling): address review feedback on #975 …
stipsan Jul 30, 2026
93858fc
fix(plugin-kit): use react/prefer-function-component instead of impor…
stipsan Aug 3, 2026
71d77d5
fix(cross-dataset-duplicator): handle reference errors during duplica…
stipsan Aug 3, 2026
3b02635
feat(cloudinary): add cloudinaryReferencePlugin (port of sanity-plugi…
stipsan Aug 3, 2026
899fb47
docs: document vanilla-extract disableRuntimeStyles for Vitest (#1654)
stipsan Aug 3, 2026
a8fcfdc
fix(typegen): 🤖 ✨ (#1809)
squiggler-app[bot] Aug 3, 2026
30fa7e2
feat(media): add folder management to the media browser (#1121)
stipsan Aug 3, 2026
f4e7fcc
fix(async-list): refactor input into a real React component and fix `…
stipsan Aug 3, 2026
1dc3a7b
fix(media): add crossOrigin="anonymous" to Image component to fix Fir…
stipsan Aug 3, 2026
1dd36c8
fix(form-toolkit): address post-migration review feedback (#1234)
stipsan Aug 3, 2026
1143bd6
feat(personalization): add field-level personalization (#1226)
stipsan Aug 3, 2026
7ec89b6
fix(cloudinary): address PR #970 review feedback (#1236)
stipsan Aug 3, 2026
36f3fe2
feat(cloudinary): performant preview images (#1233)
stipsan Aug 3, 2026
e7ec6e6
feat(media): extract image EXIF metadata (sanity.imageExifTags) on as…
stipsan Aug 3, 2026
f4e7edd
chore(format): 🤖 ✨ (#1812)
squiggler-app[bot] Aug 3, 2026
6f4316d
feat(media): add excludeTags option to hide tagged assets from Media …
stipsan Aug 3, 2026
186e29c
feat(media): replace asset and update its references (port of sanity-…
stipsan Aug 3, 2026
ab39674
feat(media): allow editing media details from a document (#1119)
stipsan Aug 3, 2026
fc7b26c
chore(deps): dedupe pnpm-lock.yaml (#1811)
squiggler-app[bot] Aug 3, 2026
fd6cd91
fix(typegen): 🤖 ✨ (#1810)
squiggler-app[bot] Aug 3, 2026
8b42416
fix(deps): update dependency @sanity/ui to ^3.5.1 (#1800)
squiggler-app[bot] Aug 3, 2026
9e2a955
fix(deps): update dependency react-hook-form to ^7.84.0 (#1807)
squiggler-app[bot] Aug 3, 2026
3feed3c
chore(deps): update renovatebot/github-action action to v46.2.0 (#1796)
squiggler-app[bot] Aug 3, 2026
99603ce
fix(hierarchical-document-list): address review feedback from #985 (#…
stipsan Aug 3, 2026
8d35f29
feat(cross-dataset-duplicator): add migrationFilters config option (#…
stipsan Aug 3, 2026
bc34d32
fix(typegen): 🤖 ✨ (#1818)
squiggler-app[bot] Aug 3, 2026
846ee40
chore(deps): update zizmorcore/zizmor-action action to v0.6.2 (#1815)
squiggler-app[bot] Aug 3, 2026
031b895
chore(deps): update dependency @vitejs/devtools to ^0.4.10 (#1806)
squiggler-app[bot] Aug 3, 2026
6e2d73a
fix(shopify-assets): address Copilot review feedback from #976 (#1231)
stipsan Aug 3, 2026
2ab8636
fix(@sanity/cross-dataset-duplicator): address review feedback from #…
stipsan Aug 3, 2026
00797f0
fix(deps): update react monorepo (#1804)
squiggler-app[bot] Aug 3, 2026
14b5749
fix(deps): update dependency @sanity/client to ^7.26.0 (#1801)
squiggler-app[bot] Aug 3, 2026
e93e6b2
Version Packages (#1784)
squiggler-app[bot] Aug 3, 2026
1c44147
chore(deps): override sanity and @sanity/vision to next (#1821)
stipsan Aug 3, 2026
3537b0d
fix(deps): update sanity monorepo to ^6.8.0 (#1803)
squiggler-app[bot] Aug 4, 2026
e18ecdc
chore(deps): update renovatebot/github-action action to v46.2.1 (#1827)
squiggler-app[bot] Aug 4, 2026
c8d1f6a
chore(deps): update dependency @playwright/test to ^1.62.1 (#1805)
squiggler-app[bot] Aug 4, 2026
0f39261
chore(deps): add @vitejs/devtools oxc, rolldown, and vite plugins (#1…
stipsan Aug 4, 2026
0998aaf
chore(deps): lock file maintenance (#1831)
squiggler-app[bot] Aug 4, 2026
2442491
fix(deps): update dependency oxlint to ^1.77.0 (#1833)
squiggler-app[bot] Aug 4, 2026
c48e18f
fix(deps): update dependency tsx to ^4.23.5 (#1834)
squiggler-app[bot] Aug 5, 2026
a723c55
fix(media): enable Save when editing asset string fields (#1840)
pedrobonamin Aug 5, 2026
f93bddd
Merge pull request #1823 from sanity-io/changeset-release/main
squiggler-app[bot] Aug 5, 2026
287bc44
docs: add migrate-styled-components-to-vanilla-extract skill (#1774)
stipsan Aug 6, 2026
e55ccd5
feat(test-studio): enable React profiling on all Vercel builds (#1824)
stipsan Aug 6, 2026
b433dd5
fix(deps): update sanity monorepo to ^6.9.0 (#1838)
squiggler-app[bot] Aug 6, 2026
4b45fc9
Initial plan
Copilot Jun 5, 2026
7a50381
fix google-translate review thread issues
Copilot Jun 5, 2026
9f6978a
Merge remote branch into rebased branch
Copilot Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
289 changes: 289 additions & 0 deletions .agents/skills/migrate-styled-components-to-vanilla-extract/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,289 @@
---
name: migrate-styled-components-to-vanilla-extract
description: Step-by-step procedure for migrating a workspace off styled-components to vanilla-extract (zero-runtime CSS). Use when converting styled() components to .css.ts files, removing a styled-components dependency, adding a ./bundle.css export, or when asked to migrate styling to vanilla-extract. Pair with the sanity-plugin-best-practices styling reference for the underlying patterns.
metadata:
author: Sanity.io
version: '1.0.0'
---

# Migrate styled-components to vanilla-extract

The repeatable procedure for converting a workspace's styling from `styled-components` (the Studio's
legacy styling library) to [vanilla-extract](https://vanilla-extract.style).

This skill covers the **workflow**: what to change, in what order, and how to verify it. The styling
**patterns** themselves (dynamic theming, variants, keyframes, the `&&` specificity trick,
encapsulation) live in the `sanity-plugin-best-practices` skill's
[styling reference](../sanity-plugin-best-practices/references/styling.md) — read it first and defer
to it for pattern details. For monorepo-specific policy (one plugin per PR, never during a transfer,
which plugins are reference implementations), see `AGENTS.md` →
`Migrating plugin styling off styled-components`.

## Ground rules

- **Identical visual output is the goal.** This is a refactor, not a redesign — every rule, theme
token, and specificity outcome must be preserved. Verify the result against the original rendering
before opening the PR.

## Step 1: Inventory

Find every styled-components usage in the workspace and classify it before touching code:

```bash
rg "styled-components" <workspace>/src
```

| Usage | Migration target |
| --------------------------------------------------- | ---------------------------------------------------------------------------------- |
| Static `styled(Primitive)` / `styled.div` | `style()` in a colocated `.css.ts` + thin wrapper component (or plain `className`) |
| Theme reads (`({theme}) => theme.sanity...`) | `createVar()` + `assignInlineVars()` + `useTheme_v2()` |
| Prop-driven variants (`$isInvalid`, `css` branches) | `styleVariants()` or conditional class composition |
| `keyframes` animations | vanilla-extract `keyframes()` |
| Descendant selectors (`& img`, third-party classes) | class on the child directly, or `globalStyle()` scoped under a local wrapper class |
| `createGlobalStyle` | `globalStyle()` (scope it — never leak outside the workspace) |
| `*.styles.tsx` modules | replaced by `.css.ts` (+ a component layer where call sites need it) |
| Computed inline `style={{}}` objects | static parts into `style()`, changing values via `createVar()` (Shape C below) |

Each row's pattern is documented with examples in the
[styling reference](../sanity-plugin-best-practices/references/styling.md).

## Step 2: Migrate the code

Work component by component. Create a `.css.ts` next to each component and move its rules over. Two
real shapes cover most cases:

**Shape A — keep the component layer.** When the styled element is used like a component (composed,
given props), replace it with a `style()` rule plus a thin wrapper that keeps the same name and API,
so call sites don't change:

```ts
// FloatingCard.css.ts
import {style} from '@vanilla-extract/css'

export const floatingCard = style({
position: 'fixed',
bottom: 0,
left: 0,
zIndex: 1000,
})
```

```tsx
// FloatingCard.tsx — before: const StyledFloatingCard = styled(Card)`position: fixed; ...`
import {Card} from '@sanity/ui'
import {clsx} from 'clsx/lite'
import type {ComponentProps} from 'react'

import {floatingCard} from './FloatingCard.css'

function StyledFloatingCard({className, ...props}: ComponentProps<typeof Card>) {
return <Card {...props} className={clsx(floatingCard, className)} />
}
```

Type the wrapper with `ComponentProps<typeof Primitive>` (or `ComponentProps<'div'>`) and never use
`forwardRef` — `ref` is a regular prop on React 19. **Merge, don't clobber:** a fixed
`className={floatingCard}` after `{...props}` silently drops a `className` a caller passes in. Pull
`className` out of props and merge it with `clsx(floatingCard, className)` — prefer
`import {clsx} from 'clsx/lite'` when only joining strings (the usual case); reach for full `clsx`
only if you need the object/array API. A `` `${floatingCard} ${className ?? ''}` `` template literal
also works. See
[Keep the component layer](../sanity-plugin-best-practices/references/styling.md#keep-the-component-layer-encapsulation).

**Shape B — flatten single-use wrappers.** When the styled element was an internal, single-use
`styled.div` with no meaningful API, put the class directly on the element. Descendant selectors
like `& img { ... }` usually migrate best by styling the child directly when you render it yourself:

```tsx
// Before: <MapDiffImage><img ... /></MapDiffImage> where MapDiffImage = styled.div`& img {...}`
<img className={mapDiffImage} alt="" src={url} height={280} width={500} />
```

**Shape C — dynamic values through CSS variables.** When a value varies per instance, with
props/state, or reads the theme, keep the static parts in `style()` and bridge only the changing
values through `createVar()` + `assignInlineVars()` (from `@vanilla-extract/dynamic`). This also
migrates computed inline `style={{}}` objects — hoist the static properties into the `.css.ts` and
keep only the variables inline:

```ts
// Checkboard.css.ts
import {createVar, style} from '@vanilla-extract/css'

export const borderRadiusVar = createVar()
export const backgroundImageVar = createVar()

export const checkboard = style({
borderRadius: borderRadiusVar,
position: 'absolute',
inset: 0,
background: backgroundImageVar,
})
```

```tsx
// Checkboard.tsx — before: <div style={{borderRadius, position: 'absolute', inset: 0, background}} />
import {assignInlineVars} from '@vanilla-extract/dynamic'

import {backgroundImageVar, borderRadiusVar, checkboard} from './Checkboard.css'

function Checkboard({borderRadius, background}: {borderRadius?: string; background?: string}) {
return (
<div
className={checkboard}
style={assignInlineVars({
[borderRadiusVar]: borderRadius,
[backgroundImageVar]: background ? `url(${background}) center left` : undefined,
})}
/>
)
}
```

`assignInlineVars` omits `undefined` values, so one class serves every instance. Theme tokens flow
the same way: read them with `useTheme_v2()` in a small wrapper and assign them to variables.

For everything else — variants (`styleVariants`), keyframes, theming third-party widgets'
classes, and overriding a `@sanity/ui` primitive's own styles (the `selectors: {'&&': {...}}`
trick) — follow the corresponding section of the
[styling reference](../sanity-plugin-best-practices/references/styling.md). Where styled-components
silently won specificity battles via CSSOM insertion order, you may need `&&` to match the original
rendering.

Delete the `*.styles.tsx` modules (and their `styled-components` imports) as they empty out.

## Step 3: Switch the build config

In the workspace's `tsdown.config.ts`, drop `styledComponents: true` and add `vanillaExtract: true`:

```ts
import {defineConfig} from '@sanity/tsdown-config'
import type {UserConfig} from 'tsdown'

export default defineConfig({
reactCompiler: true,
vanillaExtract: true,
}) satisfies Promise<UserConfig>
```

The integration extracts all `.css.ts` rules into `dist/bundle.css` at build time, auto-imports it
from `dist/index.js`, and writes/syncs the `./bundle.css` entry in `package.json` `exports` and
`publishConfig.exports` on every build — nothing to hand-edit there. After the first build the
export block looks like:

```jsonc
"./bundle.css": {
"types": "./dist/bundle-css.d.ts",
"browser": "./dist/bundle.css",
"style": "./dist/bundle.css",
"node": "./dist/bundle-css.js",
"default": "./dist/bundle-css.js"
}
```

## Step 4: Update dependencies

In the workspace's `package.json`:

- **Add** dev dependencies `"@sanity/vanilla-extract-vite-plugin": "catalog:"` and
`"@vanilla-extract/css": "catalog:"`. Both are build-time only — never runtime `dependencies`.
(If the workspace uses `assignInlineVars`, add `"@vanilla-extract/dynamic": "catalog:"` under
`dependencies` — that one is a small runtime helper.)
- **Remove** the `styled-components` entry from `peerDependencies`, and any
`babel-plugin-styled-components` devDependency.
- **Peer alignment:** when the workspace depends on `@sanity/ui` (which peers on styled-components),
removing the `"styled-components": "catalog:"` devDependency can make pnpm resolve a separate
styled-components copy, forking the workspace's `sanity` peer variant away from the rest of the
monorepo and breaking type-aware lint. Dropping it can be fine, but you must verify: after
`pnpm install`, the workspace's `sanity` / `@sanity/ui` resolution strings in `pnpm-lock.yaml` must
match other workspaces that depend on `@sanity/ui`. If they fork, keep the `catalog:`
devDependency.

No `knip.jsonc` or catalog changes are needed — `@vanilla-extract/css` is globally ignored and all
the catalog entries already exist.

## Step 5: Register the Vite plugin for Vitest

The package-exports test resolves the workspace `exports` map, whose `.` entry points at
`./src/index.ts` — so it imports real `.css.ts` source and Vitest must compile it. Add the plugin to
the workspace's `vitest.config.ts`:

```ts
import {vanillaExtractPlugin} from '@sanity/vanilla-extract-vite-plugin'
import {defineConfig} from 'vitest/config'

export default defineConfig({
plugins: [vanillaExtractPlugin()],
// ...existing test config
})
```

Use `@sanity/vanilla-extract-vite-plugin` (faster drop-in for the upstream
`@vanilla-extract/vite-plugin`). If a host app or studio already registers the Vite plugin
globally, you don't need to touch that file for the workspace under migration.

> **Optional, jsdom-only:** if the workspace has `jsdom`/`happy-dom` suites that don't assert on real
> CSS (layout, `getComputedStyle`), you can skip runtime style injection with
> `setupFiles: ['@vanilla-extract/css/disableRuntimeStyles']`. This does **not** replace the Vite
> plugin, is irrelevant under the default `node` environment, and is opted into per workspace — never
> monorepo-wide. See
> [Disabling runtime styles in tests](../sanity-plugin-best-practices/references/styling.md#disabling-runtime-styles-in-tests)
> in the styling reference.

## Step 6: Build and update the exports snapshot

```bash
pnpm install
pnpm build --filter=<workspace-name>
```

Check the output: `dist/bundle.css` must contain every migrated rule, and `dist/index.js` must
import it. Then update the package-exports inline snapshot, which gains a `"./bundle.css"` entry:

```bash
pnpm test -u --project <workspace-name>
```

## Step 7: Verify

Run the full pre-PR suite (all must pass):

```bash
pnpm format
pnpm lint
pnpm knip
pnpm build
pnpm test run
```

Then verify **visual fidelity** manually: exercise the workspace's UI and compare against the
pre-migration rendering — theme tokens, spacing, stacking, hover/sticky/fixed behavior. If an
override no longer takes effect, reach for the `&&` trick rather than `!important`.

Optionally lock the migration in: once the workspace no longer imports `styled-components`, a
`no-restricted-imports` ban in a workspace-level lint override keeps it from creeping back.

## Step 8: Add a changeset

One patch changeset for the migrated workspace:

```markdown
---
'<workspace-name>': patch
---

Migrate styling from styled-components to vanilla-extract (zero-runtime CSS)
```

## Checklist

- [ ] Every `styled-components` import in `src/` removed; `.styles.tsx` modules deleted
- [ ] `.css.ts` files colocated with their components; component layer preserved where call sites
need it
- [ ] `tsdown.config.ts`: `styledComponents` removed, `vanillaExtract: true` added
- [ ] `package.json`: vanilla-extract devDeps added; `styled-components` peer removed; `sanity` /
`@sanity/ui` peer variants verified aligned in `pnpm-lock.yaml`
- [ ] `vitest.config.ts` registers `vanillaExtractPlugin()`
- [ ] `dist/bundle.css` emitted with all rules; package-exports snapshot updated
- [ ] `pnpm format` / `pnpm lint` / `pnpm knip` / `pnpm build` / `pnpm test run` all pass
- [ ] Visual fidelity verified against the pre-migration rendering
- [ ] Patch changeset added
97 changes: 97 additions & 0 deletions .agents/skills/plugin-test-coverage/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
---
name: plugin-test-coverage
description: Guides agents through expanding Vitest and Playwright e2e coverage for a monorepo plugin. Use when adding or improving plugin tests, wiring e2e-studio, or following the internationalized-array / document-internationalization coverage playbook.
---

# Plugin Test Coverage

Use this skill when expanding **Vitest** and/or **Playwright e2e** coverage for a plugin under `plugins/`.

Reference implementations:

- `@sanity/document-internationalization` — Vitest + e2e under `e2e/tests/document-internationalization/`
- `sanity-plugin-internationalized-array` — Vitest + e2e under `e2e/tests/internationalized-array/`

Also read [`e2e/README.md`](../../../e2e/README.md) before writing Playwright specs.

## When to use

- Filling unit/integration gaps for a published plugin
- Wiring a plugin into `dev/e2e-studio` and adding Playwright specs
- Porting the doc-i18n / internationalized-array coverage process to another plugin

## Workflow

1. **Inventory use cases** from README + source (authoring loops, config knobs, integrations).
2. **Map each use case** to Vitest (pure logic, components with mocks) vs Playwright (studio UX that needs a real form).
3. **Fill Vitest gaps** co-located under `plugins/<pkg>/src/` — plugin assembly, context/providers, utils, components.
4. **Wire e2e-studio** — `definePlugin` example file, register in **both** chromium/firefox workspaces.
5. **Add helpers + specs** — `e2e/helpers/<plugin>/`, `e2e/tests/<plugin>/`.
6. **Changesets** — separate patch changeset per published package that gained `data-testid`s or runtime changes. Private e2e/studio files need none.
7. **Verify** — `pnpm format && pnpm lint && pnpm knip && pnpm build && pnpm test` (and targeted e2e when secrets allow).
8. **PR** — draft, `🤖 bot` label, inventory + e2e test table in the description.

Skip one-off tooling (migrations, banners) unless they are part of the main authoring loop.

## Vitest patterns

- Co-locate `*.test.ts(x)` next to source; use jsdom via the package `vitest.config.ts`.
- Shared mocks/fixtures in `src/test/helpers.ts` and `src/test/component-helpers.tsx` (`ThemeWrapper` for `@sanity/ui`).
- Plugin assembly tests: call the plugin factory, assert schema type names, document layout, form input wrappers, nested plugins.
- Context/provider tests: mock `useClient` / `useWorkspace` / pane hooks; use `Suspense` + `act` for async `React.use` language resolution; call any module-level `clear()` between tests.
- Timeouts: `test('name', {timeout: 30_000}, async () => { … })` — options object as second arg.
- Keep the package-exports snapshot test; update with `pnpm test -u` only when exports intentionally change.
- React Compiler is on — do not add unnecessary `useMemo` / `useCallback`.

Run a single package:

```bash
pnpm --filter <package-name> test run
```

## E2e structure

```
e2e/
├── tests/
│ ├── smoke.spec.ts # studio-wide only
│ └── <plugin-name>/
│ └── <plugin-name>.spec.ts
└── helpers/
└── <plugin-name>/
└── <helpers>.ts
```

Do not dump plugin specs at the top level of `tests/`.

## E2e-studio wiring

1. Add `dev/e2e-studio/src/<example>.ts` with `definePlugin` that registers schema + the plugin under test.
2. Import and add it to **both** workspaces in `dev/e2e-studio/sanity.config.ts`.
3. Ensure the workspace `package.json` already depends on the plugin (`workspace:*`).
4. Update the “Currently wired” list in `e2e/README.md`.

## Hard-won Playwright lessons

- Project `baseURL` must end with a **trailing slash** (`…/chromium/`, `…/firefox/`).
- Navigate with **relative** intents: `intent/edit/id=…;type=…`. Never host-absolute `/intent/…` (drops workspace basePath → “Workspace not found”).
- Auth: Playwright `storageState` seeds `__studio_auth_token_<projectId>`; preflight `/users/me`. Never use `SANITY_DEPLOY_TOKEN` for e2e session auth.
- Local pitfall: stale server on `:3333` + `reuseExistingServer` → signed-out studio. Kill and restart.
- Prefer accessible role/name locators; add `data-testid` + a **patch** changeset only when selectors are flaky or ambiguous (e.g. duplicate add-button grids).
- Seed documents via the Content Lake API; always `try/finally` cleanup.
- Video: `SANITY_E2E_VIDEO=on` when debugging.
- Document existence matters: some plugins only auto-seed after `_rev` exists — seed empty persisted docs, don’t rely on brand-new unsaved drafts.

## PR checklist

- [ ] Separate changeset per published package touched
- [ ] Draft PR with `🤖 bot` label
- [ ] Use-case inventory + e2e test table in the description
- [ ] `pnpm format` / `lint` / `knip` / `build` / `test` green
- [ ] CI e2e (chromium + firefox) green when studio wiring changed

## Pointers

- [`e2e/README.md`](../../../e2e/README.md)
- [`AGENTS.md`](../../../AGENTS.md) — CI commands, changesets, Node version notes
- Doc-i18n + internationalized-array as living examples
Loading