From 5ecb3333001313e83898cd07644227897e3bae1f Mon Sep 17 00:00:00 2001 From: Devon Govett Date: Thu, 30 Jul 2026 17:48:11 -0700 Subject: [PATCH 1/2] Publish --- packages/@adobe/react-spectrum/package.json | 12 +- packages/@internationalized/date/package.json | 2 +- .../@internationalized/string/package.json | 2 +- packages/@react-spectrum/ai/package.json | 14 +- .../@react-spectrum/filetrigger/package.json | 4 +- packages/@react-spectrum/s2/package.json | 12 +- .../s2/style/__tests__/style-macro.test.js | 144 +++++++++--------- packages/@react-types/shared/package.json | 2 +- packages/dev/codemods/package.json | 4 +- .../dev/optimize-locales-plugin/package.json | 2 +- packages/react-aria-components/package.json | 12 +- packages/react-aria/package.json | 10 +- packages/react-stately/package.json | 8 +- scripts/bumpVersions.js | 5 +- yarn.lock | 74 ++++----- 15 files changed, 153 insertions(+), 154 deletions(-) diff --git a/packages/@adobe/react-spectrum/package.json b/packages/@adobe/react-spectrum/package.json index 66807b32bdc..ab6170de3d7 100644 --- a/packages/@adobe/react-spectrum/package.json +++ b/packages/@adobe/react-spectrum/package.json @@ -1,6 +1,6 @@ { "name": "@adobe/react-spectrum", - "version": "3.47.2", + "version": "3.47.3", "description": "Spectrum UI components in React", "license": "Apache-2.0", "main": "./dist/exports/index.cjs", @@ -52,16 +52,16 @@ "url": "https://github.com/adobe/react-spectrum" }, "dependencies": { - "@internationalized/date": "^3.12.2", - "@react-types/shared": "^3.36.0", + "@internationalized/date": "^3.12.3", + "@react-types/shared": "^3.36.1", "@spectrum-icons/ui": "^3.7.1", "@spectrum-icons/workflow": "^4.3.1", "@swc/helpers": "^0.5.0", "client-only": "^0.0.1", "clsx": "^2.0.0", - "react-aria": "3.50.0", - "react-aria-components": "1.19.0", - "react-stately": "3.48.0", + "react-aria": "3.51.0", + "react-aria-components": "1.20.0", + "react-stately": "3.49.0", "react-transition-group": "^4.4.5", "use-sync-external-store": "^1.6.0" }, diff --git a/packages/@internationalized/date/package.json b/packages/@internationalized/date/package.json index d60c2839e4e..4520eb8f799 100644 --- a/packages/@internationalized/date/package.json +++ b/packages/@internationalized/date/package.json @@ -1,6 +1,6 @@ { "name": "@internationalized/date", - "version": "3.12.2", + "version": "3.12.3", "description": "Internationalized calendar, date, and time manipulation utilities", "license": "Apache-2.0", "repository": { diff --git a/packages/@internationalized/string/package.json b/packages/@internationalized/string/package.json index 91fd91fef52..2c6c8f0f513 100644 --- a/packages/@internationalized/string/package.json +++ b/packages/@internationalized/string/package.json @@ -1,6 +1,6 @@ { "name": "@internationalized/string", - "version": "3.2.9", + "version": "3.2.10", "description": "Internationalized string formatting and locale negotiation", "license": "Apache-2.0", "repository": { diff --git a/packages/@react-spectrum/ai/package.json b/packages/@react-spectrum/ai/package.json index 4d32a79c534..d404a777d83 100644 --- a/packages/@react-spectrum/ai/package.json +++ b/packages/@react-spectrum/ai/package.json @@ -1,6 +1,6 @@ { "name": "@react-spectrum/ai", - "version": "0.1.1", + "version": "0.2.0", "description": "Spectrum 2 UI AI components in React", "license": "Apache-2.0", "repository": { @@ -45,13 +45,13 @@ "postpack": "git checkout -- package.json" }, "dependencies": { - "@internationalized/date": "^3.12.2", + "@internationalized/date": "^3.12.3", "@internationalized/number": "^3.6.7", - "@react-spectrum/s2": "1.5.1", - "@react-types/shared": "^3.36.0", - "react-aria": "3.50.0", - "react-aria-components": "1.19.0", - "react-stately": "3.48.0" + "@react-spectrum/s2": "1.6.0", + "@react-types/shared": "^3.36.1", + "react-aria": "3.51.0", + "react-aria-components": "1.20.0", + "react-stately": "3.49.0" }, "devDependencies": { "@react-aria/test-utils": "^1.0.0-alpha.8", diff --git a/packages/@react-spectrum/filetrigger/package.json b/packages/@react-spectrum/filetrigger/package.json index 665b2155c15..0ade25f8675 100644 --- a/packages/@react-spectrum/filetrigger/package.json +++ b/packages/@react-spectrum/filetrigger/package.json @@ -1,6 +1,6 @@ { "name": "@react-spectrum/filetrigger", - "version": "3.1.2", + "version": "3.1.3", "description": "Spectrum UI components in React", "license": "Apache-2.0", "repository": { @@ -32,7 +32,7 @@ }, "dependencies": { "@swc/helpers": "^0.5.0", - "react-aria-components": "1.19.0" + "react-aria-components": "1.20.0" }, "devDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", diff --git a/packages/@react-spectrum/s2/package.json b/packages/@react-spectrum/s2/package.json index 8dd38987a70..4c8d8bf4490 100644 --- a/packages/@react-spectrum/s2/package.json +++ b/packages/@react-spectrum/s2/package.json @@ -1,6 +1,6 @@ { "name": "@react-spectrum/s2", - "version": "1.5.1", + "version": "1.6.0", "description": "Spectrum 2 UI components in React", "license": "Apache-2.0", "repository": { @@ -85,13 +85,13 @@ "postpack": "git checkout -- package.json" }, "dependencies": { - "@internationalized/date": "^3.12.2", + "@internationalized/date": "^3.12.3", "@internationalized/number": "^3.6.7", "@parcel/macros": "^2.16.3", - "@react-types/shared": "^3.36.0", - "react-aria": "3.50.0", - "react-aria-components": "1.19.0", - "react-stately": "3.48.0" + "@react-types/shared": "^3.36.1", + "react-aria": "3.51.0", + "react-aria-components": "1.20.0", + "react-stately": "3.49.0" }, "devDependencies": { "@adobe/spectrum-tokens": "14.0.0", diff --git a/packages/@react-spectrum/s2/style/__tests__/style-macro.test.js b/packages/@react-spectrum/s2/style/__tests__/style-macro.test.js index 5d080160efc..10ce51f765d 100644 --- a/packages/@react-spectrum/s2/style/__tests__/style-macro.test.js +++ b/packages/@react-spectrum/s2/style/__tests__/style-macro.test.js @@ -40,26 +40,26 @@ describe('style-macro', () => { "@layer _.prose, _.a, _.b, _.c; @layer _.b { - .Jbs151:first-child { + .Jbs16:first-child { margin-top: 0.25rem; } } @layer _.c.p { @media (min-width: 64rem) { - .Jbpv151:first-child { + .Jbpv16:first-child { margin-top: 0.5rem; } } } -.-macro-static-OZFeNe { - --macro-data-OZFeNe: {"style":{"marginTop":{":first-child":{"default":4,"lg":8}}},"loc":"undefined:undefined:undefined"}; +.-macro-static-k4lBYc { + --macro-data-k4lBYc: {"style":{"marginTop":{":first-child":{"default":4,"lg":8}}},"loc":"undefined:undefined:undefined"}; } " `); - expect(js).toMatchInlineSnapshot(`" Jbs151 Jbpv151 -macro-static-OZFeNe"`); + expect(js).toMatchInlineSnapshot(`" Jbs16 Jbpv16 -macro-static-k4lBYc"`); }); it('should support self references', () => { @@ -73,60 +73,60 @@ describe('style-macro', () => { "@layer _.prose, _.a; @layer _.a { - ._kc151 { + ._kc16 { border-top-width: 2px; } - .hc151 { + .hc16 { border-bottom-width: 2px; } - .mCPFGYc151 { + .mCPFGYc16 { border-inline-start-width: var(--m); } - .lc151 { + .lc16 { border-inline-end-width: 2px; } - .SMBFGYc151 { + .SMBFGYc16 { padding-inline-start: var(--S); } - .Rv151 { + .Rv16 { padding-inline-end: calc(var(--F, var(--M)) * 3 / 8); } - .ZjUQgKd151 { + .ZjUQgKd16 { width: calc(200px - var(--m) - var(--S)); } - .-m_-mc151 { + .-m_-mc16 { --m: 2px; } - .-S_-Sv151 { + .-S_-Sv16 { --S: calc(var(--F, var(--M)) * 3 / 8); } } -.-macro-static-6DrPJb { - --macro-data-6DrPJb: {"style":{"borderWidth":2,"paddingX":"edge-to-text","width":"calc(200px - self(borderStartWidth) - self(paddingStart))"},"loc":"undefined:undefined:undefined"}; +.-macro-static-Mb83Ob { + --macro-data-Mb83Ob: {"style":{"borderWidth":2,"paddingX":"edge-to-text","width":"calc(200px - self(borderStartWidth) - self(paddingStart))"},"loc":"undefined:undefined:undefined"}; } " `); expect(js).toMatchInlineSnapshot( - `" _kc151 hc151 mCPFGYc151 lc151 SMBFGYc151 Rv151 ZjUQgKd151 -m_-mc151 -S_-Sv151 -macro-static-6DrPJb"` + `" _kc16 hc16 mCPFGYc16 lc16 SMBFGYc16 Rv16 ZjUQgKd16 -m_-mc16 -S_-Sv16 -macro-static-Mb83Ob"` ); }); @@ -144,9 +144,9 @@ describe('style-macro', () => { color: 'green-400' }); - expect(js()).toMatchInlineSnapshot(`" gw151 pg151 -macro-dynamic-ksiu6q"`); - expect(overrides).toMatchInlineSnapshot(`" g8tmWqb151 pHJ3AUd151 -macro-static-4DCFgd"`); - expect(js({}, overrides)).toMatchInlineSnapshot(`" g8tmWqb151 pg151 -macro-dynamic-197x9i6"`); + expect(js()).toMatchInlineSnapshot(`" gw16 pg16 -macro-dynamic-va45iq"`); + expect(overrides).toMatchInlineSnapshot(`" g8tmWqb16 pHJ3AUd16 -macro-static-mluMGe"`); + expect(js({}, overrides)).toMatchInlineSnapshot(`" g8tmWqb16 pg16 -macro-dynamic-1ka988u"`); }); it('should support allowed overrides for properties that expand into multiple', () => { @@ -161,10 +161,10 @@ describe('style-macro', () => { translateX: 40 }); - expect(js()).toMatchInlineSnapshot(`" -_7PloMd-B151 __Ya151 -macro-dynamic-clboub"`); - expect(overrides).toMatchInlineSnapshot(`" -_7PloMd-D151 __Ya151 -macro-static-pdFIDc"`); + expect(js()).toMatchInlineSnapshot(`" -_7PloMd-B16 __Ya16 -macro-dynamic-n4pr0j"`); + expect(overrides).toMatchInlineSnapshot(`" -_7PloMd-D16 __Ya16 -macro-static-dVorDb"`); expect(js({}, overrides)).toMatchInlineSnapshot( - `" -_7PloMd-D151 __Ya151 -macro-dynamic-n9a5xh"` + `" -_7PloMd-D16 __Ya16 -macro-dynamic-1nqd9c5"` ); }); @@ -180,10 +180,10 @@ describe('style-macro', () => { padding: 40 }); - expect(js()).toMatchInlineSnapshot(`" Tk151 Qk151 Sk151 Rk151 -macro-dynamic-1esad0h"`); - expect(overrides).toMatchInlineSnapshot(`" Tm151 Qm151 Sm151 Rm151 -macro-static-Nfrh6d"`); + expect(js()).toMatchInlineSnapshot(`" Tk16 Qk16 Sk16 Rk16 -macro-dynamic-145tku9"`); + expect(overrides).toMatchInlineSnapshot(`" Tm16 Qm16 Sm16 Rm16 -macro-static-XW4HYc"`); expect(js({}, overrides)).toMatchInlineSnapshot( - `" Tm151 Qm151 Sm151 Rm151 -macro-dynamic-7axbah"` + `" Tm16 Qm16 Sm16 Rm16 -macro-dynamic-91t6bt"` ); }); @@ -199,11 +199,9 @@ describe('style-macro', () => { fontSize: 'ui-xs' }); - expect(js()).toMatchInlineSnapshot(`" -_6BNtrc-woabcc151 vx151 -macro-dynamic-xhgg6a"`); - expect(overrides).toMatchInlineSnapshot(`" -_6BNtrc-a151 vx151 -macro-static-grInxd"`); - expect(js({}, overrides)).toMatchInlineSnapshot( - `" -_6BNtrc-a151 vx151 -macro-dynamic-hitxxw"` - ); + expect(js()).toMatchInlineSnapshot(`" -_6BNtrc-woabcc16 vx16 -macro-dynamic-1omk2g2"`); + expect(overrides).toMatchInlineSnapshot(`" -_6BNtrc-a16 vx16 -macro-static-Yts0we"`); + expect(js({}, overrides)).toMatchInlineSnapshot(`" -_6BNtrc-a16 vx16 -macro-dynamic-1c7vv9w"`); }); it("should support allowed overrides for values that aren't defined", () => { @@ -218,9 +216,9 @@ describe('style-macro', () => { minWidth: 32 }); - expect(js()).toMatchInlineSnapshot(`" gE151 -macro-dynamic-wd489e"`); - expect(overrides).toMatchInlineSnapshot(`" Nk151 -macro-static-f34NMd"`); - expect(js({}, overrides)).toMatchInlineSnapshot(`" Nk151 gE151 -macro-dynamic-1qncav6"`); + expect(js()).toMatchInlineSnapshot(`" gE16 -macro-dynamic-91ynya"`); + expect(overrides).toMatchInlineSnapshot(`" Nk16 -macro-static-tAGYMd"`); + expect(js({}, overrides)).toMatchInlineSnapshot(`" Nk16 gE16 -macro-dynamic-tnvuwy"`); }); it('should support runtime conditions', () => { @@ -241,32 +239,32 @@ describe('style-macro', () => { "@layer _.prose, _.a; @layer _.a { - .gH151 { + .gH16 { background-color: light-dark(rgb(233, 233, 233), rgb(44, 44, 44)); } - .gF151 { + .gF16 { background-color: light-dark(rgb(225, 225, 225), rgb(50, 50, 50)); } - .gE151 { + .gE16 { background-color: light-dark(rgb(218, 218, 218), rgb(57, 57, 57)); } - .pt151 { + .pt16 { color: light-dark(rgb(41, 41, 41), rgb(219, 219, 219)); } - .po151 { + .po16 { color: light-dark(rgb(19, 19, 19), rgb(242, 242, 242)); } - .pm151 { + .pm16 { color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); } } @@ -274,9 +272,9 @@ describe('style-macro', () => { " `); - expect(js({})).toMatchInlineSnapshot(`" gH151 pt151 -macro-dynamic-13m9l9s"`); - expect(js({isHovered: true})).toMatchInlineSnapshot(`" gF151 po151 -macro-dynamic-1e5szmx"`); - expect(js({isPressed: true})).toMatchInlineSnapshot(`" gE151 pm151 -macro-dynamic-1ltkejq"`); + expect(js({})).toMatchInlineSnapshot(`" gH16 pt16 -macro-dynamic-phpdio"`); + expect(js({isHovered: true})).toMatchInlineSnapshot(`" gF16 po16 -macro-dynamic-ja3wp"`); + expect(js({isPressed: true})).toMatchInlineSnapshot(`" gE16 pm16 -macro-dynamic-11mwkcm"`); }); it('should support nested runtime conditions', () => { @@ -295,33 +293,33 @@ describe('style-macro', () => { "@layer _.prose, _.a; @layer _.a { - .gH151 { + .gH16 { background-color: light-dark(rgb(233, 233, 233), rgb(44, 44, 44)); } - .gF151 { + .gF16 { background-color: light-dark(rgb(225, 225, 225), rgb(50, 50, 50)); } - .g_h151 { + .g_h16 { background-color: light-dark(rgb(75, 117, 255), rgb(64, 105, 253)); } - .g3151 { + .g316 { background-color: light-dark(rgb(59, 99, 251), rgb(86, 129, 255)); } } " `); - expect(js({})).toMatchInlineSnapshot(`" gH151 -macro-dynamic-1ap2imt"`); - expect(js({isHovered: true})).toMatchInlineSnapshot(`" gF151 -macro-dynamic-1153npv"`); - expect(js({isSelected: true})).toMatchInlineSnapshot(`" g_h151 -macro-dynamic-7jyd2s"`); + expect(js({})).toMatchInlineSnapshot(`" gH16 -macro-dynamic-meizj9"`); + expect(js({isHovered: true})).toMatchInlineSnapshot(`" gF16 -macro-dynamic-116isgz"`); + expect(js({isSelected: true})).toMatchInlineSnapshot(`" g_h16 -macro-dynamic-1jnn0bo"`); expect(js({isSelected: true, isHovered: true})).toMatchInlineSnapshot( - `" g3151 -macro-dynamic-heik00"` + `" g316 -macro-dynamic-1z0sueo"` ); }); @@ -336,9 +334,9 @@ describe('style-macro', () => { } }); - expect(js({variant: 'accent'})).toMatchInlineSnapshot(`" gY151 -macro-dynamic-1kvorfq"`); - expect(js({variant: 'primary'})).toMatchInlineSnapshot(`" gjQquMe151 -macro-dynamic-17tas0w"`); - expect(js({variant: 'secondary'})).toMatchInlineSnapshot(`" gw151 -macro-dynamic-1m4zj7o"`); + expect(js({variant: 'accent'})).toMatchInlineSnapshot(`" gY16 -macro-dynamic-3c8qja"`); + expect(js({variant: 'primary'})).toMatchInlineSnapshot(`" gjQquMe16 -macro-dynamic-2xzl3k"`); + expect(js({variant: 'secondary'})).toMatchInlineSnapshot(`" gw16 -macro-dynamic-1tsrwdw"`); }); it('supports runtime conditions nested inside css conditions', () => { @@ -356,14 +354,14 @@ describe('style-macro', () => { @layer _.b.l { @media (forced-colors: active) { - .plb151 { + .plb16 { color: ButtonText; } } @media (forced-colors: active) { - .ple151 { + .ple16 { color: HighlightText; } } @@ -372,8 +370,8 @@ describe('style-macro', () => { " `); - expect(js({})).toMatchInlineSnapshot(`" plb151 -macro-dynamic-1gtim5g"`); - expect(js({isSelected: true})).toMatchInlineSnapshot(`" ple151 -macro-dynamic-1v5gwiv"`); + expect(js({})).toMatchInlineSnapshot(`" plb16 -macro-dynamic-ia8bis"`); + expect(js({isSelected: true})).toMatchInlineSnapshot(`" ple16 -macro-dynamic-vmsn3r"`); }); it('inherits parent default when nested branch has no default key', () => { @@ -389,9 +387,9 @@ describe('style-macro', () => { }); // forcedColors.default should apply when variant=highlight but !isSelected expect(css).toContain('ButtonText'); - expect(js({variant: 'highlight'})).toMatchInlineSnapshot(`" plb151 -macro-dynamic-1gtim5g"`); + expect(js({variant: 'highlight'})).toMatchInlineSnapshot(`" plb16 -macro-dynamic-ia8bis"`); expect(js({variant: 'highlight', isSelected: true})).toMatchInlineSnapshot( - `" ple151 -macro-dynamic-1v5gwiv"` + `" ple16 -macro-dynamic-vmsn3r"` ); }); @@ -400,33 +398,33 @@ describe('style-macro', () => { padding: 24 }); - expect(js).toMatchInlineSnapshot(`" Th151 Qh151 Sh151 Rh151 -macro-static-dvFMTb"`); + expect(js).toMatchInlineSnapshot(`" Th16 Qh16 Sh16 Rh16 -macro-static-3XoZ4"`); expect(css).toMatchInlineSnapshot(` "@layer _.prose, _.a; @layer _.a { - .Th151 { + .Th16 { padding-top: 24px; } - .Qh151 { + .Qh16 { padding-bottom: 24px; } - .Sh151 { + .Sh16 { padding-inline-start: 24px; } - .Rh151 { + .Rh16 { padding-inline-end: 24px; } } -.-macro-static-dvFMTb { - --macro-data-dvFMTb: {"style":{"padding":24},"loc":"undefined:undefined:undefined"}; +.-macro-static-3XoZ4 { + --macro-data-3XoZ4: {"style":{"padding":24},"loc":"undefined:undefined:undefined"}; } " @@ -442,13 +440,13 @@ describe('style-macro', () => { "@layer _.prose, _.a; @layer _.a { - .gpQzfVb151 { + .gpQzfVb16 { background-color: rgb(from light-dark(rgb(39, 77, 234), rgb(105, 149, 254)) r g b / 50%); } } -.-macro-static-GJJsFd { - --macro-data-GJJsFd: {"style":{"backgroundColor":"blue-1000/50"},"loc":"undefined:undefined:undefined"}; +.-macro-static-OHuwdd { + --macro-data-OHuwdd: {"style":{"backgroundColor":"blue-1000/50"},"loc":"undefined:undefined:undefined"}; } " @@ -467,13 +465,13 @@ describe('style-macro', () => { "@layer _.prose, _.a; @layer _.a { - .-FUeYm-gE151 { + .-FUeYm-gE16 { --foo: light-dark(rgb(218, 218, 218), rgb(57, 57, 57)); } } -.-macro-static-QA93Ie { - --macro-data-QA93Ie: {"style":{"--foo":{"type":"backgroundColor","value":"gray-300"}},"loc":"undefined:undefined:undefined"}; +.-macro-static-g8lhGc { + --macro-data-g8lhGc: {"style":{"--foo":{"type":"backgroundColor","value":"gray-300"}},"loc":"undefined:undefined:undefined"}; } " diff --git a/packages/@react-types/shared/package.json b/packages/@react-types/shared/package.json index 629a5ba9edd..411815db2fb 100644 --- a/packages/@react-types/shared/package.json +++ b/packages/@react-types/shared/package.json @@ -1,6 +1,6 @@ { "name": "@react-types/shared", - "version": "3.36.0", + "version": "3.36.1", "description": "Spectrum UI components in React", "license": "Apache-2.0", "repository": { diff --git a/packages/dev/codemods/package.json b/packages/dev/codemods/package.json index c26e987a956..0e19d07e283 100644 --- a/packages/dev/codemods/package.json +++ b/packages/dev/codemods/package.json @@ -1,6 +1,6 @@ { "name": "@react-spectrum/codemods", - "version": "1.2.4", + "version": "1.2.5", "license": "Apache-2.0", "repository": { "type": "git", @@ -25,7 +25,7 @@ "@babel/parser": "^7.24.5", "@babel/traverse": "^7.24.5", "@babel/types": "^7.24.5", - "@react-spectrum/s2": "1.5.1", + "@react-spectrum/s2": "1.6.0", "@react-types/shared": "^3.34.0", "@types/node": "^24", "boxen": "^5.1.2", diff --git a/packages/dev/optimize-locales-plugin/package.json b/packages/dev/optimize-locales-plugin/package.json index 2faf1d32277..97e74fa85fc 100644 --- a/packages/dev/optimize-locales-plugin/package.json +++ b/packages/dev/optimize-locales-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-aria/optimize-locales-plugin", - "version": "2.0.0", + "version": "2.0.1", "main": "LocalesPlugin.js", "types": "LocalesPlugin.d.ts", "publishConfig": { diff --git a/packages/react-aria-components/package.json b/packages/react-aria-components/package.json index 0c7576f5ea5..34aff3e05c0 100644 --- a/packages/react-aria-components/package.json +++ b/packages/react-aria-components/package.json @@ -1,6 +1,6 @@ { "name": "react-aria-components", - "version": "1.19.0", + "version": "1.20.0", "description": "A library of styleable components built using React Aria", "license": "Apache-2.0", "repository": { @@ -54,13 +54,13 @@ "access": "public" }, "dependencies": { - "@internationalized/date": "^3.12.2", - "@internationalized/string": "^3.2.9", - "@react-types/shared": "^3.36.0", + "@internationalized/date": "^3.12.3", + "@internationalized/string": "^3.2.10", + "@react-types/shared": "^3.36.1", "@swc/helpers": "^0.5.0", "client-only": "^0.0.1", - "react-aria": "3.50.0", - "react-stately": "3.48.0" + "react-aria": "3.51.0", + "react-stately": "3.49.0" }, "devDependencies": { "@tailwindcss/postcss": "^4.0.0", diff --git a/packages/react-aria/package.json b/packages/react-aria/package.json index d9cbab9b385..5e83ad3ab21 100644 --- a/packages/react-aria/package.json +++ b/packages/react-aria/package.json @@ -1,6 +1,6 @@ { "name": "react-aria", - "version": "3.50.0", + "version": "3.51.0", "description": "Spectrum UI components in React", "license": "Apache-2.0", "main": "./dist/exports/index.cjs", @@ -47,14 +47,14 @@ "url": "https://github.com/adobe/react-spectrum" }, "dependencies": { - "@internationalized/date": "^3.12.2", + "@internationalized/date": "^3.12.3", "@internationalized/number": "^3.6.7", - "@internationalized/string": "^3.2.9", - "@react-types/shared": "^3.36.0", + "@internationalized/string": "^3.2.10", + "@react-types/shared": "^3.36.1", "@swc/helpers": "^0.5.0", "aria-hidden": "^1.2.3", "clsx": "^2.0.0", - "react-stately": "3.48.0", + "react-stately": "3.49.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { diff --git a/packages/react-stately/package.json b/packages/react-stately/package.json index 191738d9cee..1b6f9488022 100644 --- a/packages/react-stately/package.json +++ b/packages/react-stately/package.json @@ -1,6 +1,6 @@ { "name": "react-stately", - "version": "3.48.0", + "version": "3.49.0", "description": "Spectrum UI components in React", "license": "Apache-2.0", "main": "./dist/exports/index.cjs", @@ -37,10 +37,10 @@ "url": "https://github.com/adobe/react-spectrum" }, "dependencies": { - "@internationalized/date": "^3.12.2", + "@internationalized/date": "^3.12.3", "@internationalized/number": "^3.6.7", - "@internationalized/string": "^3.2.9", - "@react-types/shared": "^3.36.0", + "@internationalized/string": "^3.2.10", + "@react-types/shared": "^3.36.1", "@swc/helpers": "^0.5.0", "use-sync-external-store": "^1.6.0" }, diff --git a/scripts/bumpVersions.js b/scripts/bumpVersions.js index e9ebadc58f8..6b1b15986ed 100644 --- a/scripts/bumpVersions.js +++ b/scripts/bumpVersions.js @@ -13,7 +13,6 @@ const exec = require('child_process').execSync; const spawn = require('child_process').spawnSync; const fs = require('fs'); -const fetch = require('node-fetch'); const semver = require('semver'); const readline = require('readline'); const chalk = require('chalk'); @@ -48,7 +47,9 @@ function isSkipped(pkg) { (pkg.name.includes('@react-aria') && pkg.dependencies?.['react-aria']) || (pkg.name.includes('@react-stately') && pkg.dependencies?.['react-stately']) || (pkg.name.includes('@react-types') && !pkg.name.includes('@react-types/shared')) || - (pkg.name.includes('@react-spectrum') && pkg.dependencies?.['@adobe/react-spectrum']) + (pkg.name.includes('@react-spectrum') && + pkg.dependencies?.['@adobe/react-spectrum'] && + !pkg.name.includes('@react-spectrum/codemods')) ); } diff --git a/yarn.lock b/yarn.lock index 67c78467c9a..6330a4fde4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -95,19 +95,19 @@ __metadata: "@adobe/spectrum-css-temp": "npm:3.0.0-alpha.1" "@babel/cli": "npm:^7.12.10" "@babel/core": "npm:^7.24.3" - "@internationalized/date": "npm:^3.12.2" + "@internationalized/date": "npm:^3.12.3" "@react-spectrum/style-macro-s1": "npm:3.0.0-alpha.6" - "@react-types/shared": "npm:^3.36.0" + "@react-types/shared": "npm:^3.36.1" "@spectrum-icons/ui": "npm:^3.7.1" "@spectrum-icons/workflow": "npm:^4.3.1" "@swc/helpers": "npm:^0.5.0" client-only: "npm:^0.0.1" clsx: "npm:^2.0.0" react: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - react-aria: "npm:3.50.0" - react-aria-components: "npm:1.19.0" + react-aria: "npm:3.51.0" + react-aria-components: "npm:1.20.0" react-dom: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - react-stately: "npm:3.48.0" + react-stately: "npm:3.49.0" react-transition-group: "npm:^4.4.5" use-sync-external-store: "npm:^1.6.0" peerDependencies: @@ -2904,7 +2904,7 @@ __metadata: languageName: node linkType: hard -"@internationalized/date@npm:^3.12.1, @internationalized/date@npm:^3.12.2, @internationalized/date@workspace:packages/@internationalized/date": +"@internationalized/date@npm:^3.12.1, @internationalized/date@npm:^3.12.3, @internationalized/date@workspace:packages/@internationalized/date": version: 0.0.0-use.local resolution: "@internationalized/date@workspace:packages/@internationalized/date" dependencies: @@ -2937,7 +2937,7 @@ __metadata: languageName: unknown linkType: soft -"@internationalized/string@npm:^3.2.8, @internationalized/string@npm:^3.2.9, @internationalized/string@workspace:packages/@internationalized/string": +"@internationalized/string@npm:^3.2.10, @internationalized/string@npm:^3.2.8, @internationalized/string@workspace:packages/@internationalized/string": version: 0.0.0-use.local resolution: "@internationalized/string@workspace:packages/@internationalized/string" dependencies: @@ -7374,20 +7374,20 @@ __metadata: version: 0.0.0-use.local resolution: "@react-spectrum/ai@workspace:packages/@react-spectrum/ai" dependencies: - "@internationalized/date": "npm:^3.12.2" + "@internationalized/date": "npm:^3.12.3" "@internationalized/number": "npm:^3.6.7" "@react-aria/test-utils": "npm:^1.0.0-alpha.8" - "@react-spectrum/s2": "npm:1.5.1" - "@react-types/shared": "npm:^3.36.0" + "@react-spectrum/s2": "npm:1.6.0" + "@react-types/shared": "npm:^3.36.1" "@storybook/jest": "npm:^0.2.3" "@testing-library/dom": "npm:^10.1.0" "@testing-library/react": "npm:^16.0.0" "@testing-library/user-event": "npm:^14.0.0" react: "npm:^19.0.0-rc.1" - react-aria: "npm:3.50.0" - react-aria-components: "npm:1.19.0" + react-aria: "npm:3.51.0" + react-aria-components: "npm:1.20.0" react-dom: "npm:^19.0.0-rc.1" - react-stately: "npm:3.48.0" + react-stately: "npm:3.49.0" peerDependencies: react: ^19.0.0-rc.1 react-dom: ^19.0.0-rc.1 @@ -7530,7 +7530,7 @@ __metadata: "@babel/parser": "npm:^7.24.5" "@babel/traverse": "npm:^7.24.5" "@babel/types": "npm:^7.24.5" - "@react-spectrum/s2": "npm:1.5.1" + "@react-spectrum/s2": "npm:1.6.0" "@react-types/shared": "npm:^3.34.0" "@types/jscodeshift": "npm:^0.11.11" "@types/node": "npm:^24" @@ -7716,7 +7716,7 @@ __metadata: dependencies: "@swc/helpers": "npm:^0.5.0" react: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - react-aria-components: "npm:1.19.0" + react-aria-components: "npm:1.20.0" react-dom: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -8107,25 +8107,25 @@ __metadata: languageName: unknown linkType: soft -"@react-spectrum/s2@npm:1.5.1, @react-spectrum/s2@npm:^1.0.0, @react-spectrum/s2@workspace:packages/@react-spectrum/s2": +"@react-spectrum/s2@npm:1.6.0, @react-spectrum/s2@npm:^1.0.0, @react-spectrum/s2@workspace:packages/@react-spectrum/s2": version: 0.0.0-use.local resolution: "@react-spectrum/s2@workspace:packages/@react-spectrum/s2" dependencies: "@adobe/spectrum-tokens": "npm:14.0.0" - "@internationalized/date": "npm:^3.12.2" + "@internationalized/date": "npm:^3.12.3" "@internationalized/number": "npm:^3.6.7" "@parcel/macros": "npm:^2.16.3" "@react-aria/test-utils": "npm:^1.0.0-alpha.8" - "@react-types/shared": "npm:^3.36.0" + "@react-types/shared": "npm:^3.36.1" "@storybook/jest": "npm:^0.2.3" "@testing-library/dom": "npm:^10.1.0" "@testing-library/react": "npm:^16.0.0" "@testing-library/user-event": "npm:^14.0.0" react: "npm:^19.0.0-rc.1" - react-aria: "npm:3.50.0" - react-aria-components: "npm:1.19.0" + react-aria: "npm:3.51.0" + react-aria-components: "npm:1.20.0" react-dom: "npm:^19.0.0-rc.1" - react-stately: "npm:3.48.0" + react-stately: "npm:3.49.0" peerDependencies: react: ^19.0.0-rc.1 react-dom: ^19.0.0-rc.1 @@ -9462,7 +9462,7 @@ __metadata: languageName: unknown linkType: soft -"@react-types/shared@npm:^3.30.0, @react-types/shared@npm:^3.34.0, @react-types/shared@npm:^3.36.0, @react-types/shared@workspace:packages/@react-types/shared": +"@react-types/shared@npm:^3.30.0, @react-types/shared@npm:^3.34.0, @react-types/shared@npm:^3.36.1, @react-types/shared@workspace:packages/@react-types/shared": version: 0.0.0-use.local resolution: "@react-types/shared@workspace:packages/@react-types/shared" dependencies: @@ -26383,42 +26383,42 @@ __metadata: languageName: node linkType: hard -"react-aria-components@npm:1.19.0, react-aria-components@npm:^1.7.1, react-aria-components@workspace:packages/react-aria-components": +"react-aria-components@npm:1.20.0, react-aria-components@npm:^1.7.1, react-aria-components@workspace:packages/react-aria-components": version: 0.0.0-use.local resolution: "react-aria-components@workspace:packages/react-aria-components" dependencies: - "@internationalized/date": "npm:^3.12.2" - "@internationalized/string": "npm:^3.2.9" - "@react-types/shared": "npm:^3.36.0" + "@internationalized/date": "npm:^3.12.3" + "@internationalized/string": "npm:^3.2.10" + "@react-types/shared": "npm:^3.36.1" "@swc/helpers": "npm:^0.5.0" "@tailwindcss/postcss": "npm:^4.0.0" client-only: "npm:^0.0.1" react: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - react-aria: "npm:3.50.0" + react-aria: "npm:3.51.0" react-dom: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - react-stately: "npm:3.48.0" + react-stately: "npm:3.49.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 languageName: unknown linkType: soft -"react-aria@npm:3.50.0, react-aria@npm:^3.40.0, react-aria@npm:^3.47.0, react-aria@npm:^3.48.0, react-aria@workspace:packages/react-aria": +"react-aria@npm:3.51.0, react-aria@npm:^3.40.0, react-aria@npm:^3.47.0, react-aria@npm:^3.48.0, react-aria@workspace:packages/react-aria": version: 0.0.0-use.local resolution: "react-aria@workspace:packages/react-aria" dependencies: "@babel/cli": "npm:^7.24.1" "@babel/core": "npm:^7.24.3" - "@internationalized/date": "npm:^3.12.2" + "@internationalized/date": "npm:^3.12.3" "@internationalized/number": "npm:^3.6.7" - "@internationalized/string": "npm:^3.2.9" - "@react-types/shared": "npm:^3.36.0" + "@internationalized/string": "npm:^3.2.10" + "@react-types/shared": "npm:^3.36.1" "@swc/helpers": "npm:^0.5.0" aria-hidden: "npm:^1.2.3" clsx: "npm:^2.0.0" react: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" react-dom: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - react-stately: "npm:3.48.0" + react-stately: "npm:3.49.0" use-sync-external-store: "npm:^1.6.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -26674,16 +26674,16 @@ __metadata: languageName: unknown linkType: soft -"react-stately@npm:3.48.0, react-stately@npm:^3.38.0, react-stately@npm:^3.46.0, react-stately@workspace:packages/react-stately": +"react-stately@npm:3.49.0, react-stately@npm:^3.38.0, react-stately@npm:^3.46.0, react-stately@workspace:packages/react-stately": version: 0.0.0-use.local resolution: "react-stately@workspace:packages/react-stately" dependencies: "@babel/cli": "npm:^7.24.1" "@babel/core": "npm:^7.24.3" - "@internationalized/date": "npm:^3.12.2" + "@internationalized/date": "npm:^3.12.3" "@internationalized/number": "npm:^3.6.7" - "@internationalized/string": "npm:^3.2.9" - "@react-types/shared": "npm:^3.36.0" + "@internationalized/string": "npm:^3.2.10" + "@react-types/shared": "npm:^3.36.1" "@swc/helpers": "npm:^0.5.0" react: "npm:^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" use-sync-external-store: "npm:^1.6.0" From 0b5220fa728ce71e36515783bc96334a0da30505 Mon Sep 17 00:00:00 2001 From: Yihui Liao <44729383+yihuiliao@users.noreply.github.com> Date: Fri, 31 Jul 2026 08:24:51 -0700 Subject: [PATCH 2/2] chore: July release notes (#10381) --- .../pages/react-aria/releases/v1-20-0.mdx | 346 ++++++++++++++++++ .../dev/s2-docs/pages/s2/releases/v1-6-0.mdx | 141 +++++++ packages/dev/s2-docs/src/CodeBlock.tsx | 30 +- scripts/changelog.js | 18 + 4 files changed, 522 insertions(+), 13 deletions(-) create mode 100644 packages/dev/s2-docs/pages/react-aria/releases/v1-20-0.mdx create mode 100644 packages/dev/s2-docs/pages/s2/releases/v1-6-0.mdx diff --git a/packages/dev/s2-docs/pages/react-aria/releases/v1-20-0.mdx b/packages/dev/s2-docs/pages/react-aria/releases/v1-20-0.mdx new file mode 100644 index 00000000000..6f9c12248c4 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/releases/v1-20-0.mdx @@ -0,0 +1,346 @@ +{/* Copyright 2026 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. */} + +import {InstallCommand} from '../../../src/InstallCommand'; + +import {Layout} from '../../../src/Layout'; +export default Layout; + +import docs from 'docs:@react-spectrum/s2'; + +export const hideNav = true; +export const section = 'Releases'; +export const tags = ['release', 'React Aria']; +export const date = 'July 31, 2026'; +export const title = 'v1.20.0'; +export const description = 'This release introduces two new components, along with several new features including support for context menus, a simplified API for keyboard shortcuts, and the ability to use interactive components within Table rows. It also adds new documentation for hooks.' +export const isSubpage = true; + +# v1.20.0 + +This release includes many new components and features! + +The new [PreviewTrigger](../PreviewTrigger) component shows a Popover on hover, focus, or long press. Unlike Tooltip, it may include interactive content, useful for hoverable link previews. Keyboard users can tab in and out of the popover, and it's accessible across devices. Includes open delay, safe area handling, and coordinated entry and exit animations. + +```tsx render hideCode +"use client"; +import {PreviewTrigger} from 'react-aria-components/PreviewTrigger'; +import {Popover} from 'vanilla-starter/Popover'; +import {Link} from 'vanilla-starter/Link'; +import {Button} from 'vanilla-starter/Button'; + +function ProfilePreview({handle, name, bio, avatar, href, ...popoverProps}) { + return ( + + @{handle} + +
+ +
+
{name}
+
@{handle}
+
+ +
+
{bio}
+
+
+ ); +} + +function Example(props) { + return ( +

+ Just shipped a new release with help from{' '} + + {' '}and{' '} + + ! +

+ ); +} +``` + +[TokenField](../TokenField) (alpha) allows users to enter text with inline tokens, supporting autocomplete and auto-tokenization. Use it to build AI prompt fields, tag inputs, structured search fields, mention inputs, and multi-select comboboxes. + +```tsx render hideCode +"use client"; +import {Autocomplete} from 'react-aria-components/Autocomplete'; +import {Text} from 'react-aria-components/Text'; +import {Token, TokenField} from 'vanilla-starter/TokenField'; +import {tokenFieldPositionToDOMRange} from 'react-aria/useTokenField'; +import {TokenFieldValue} from 'react-aria-components/TokenField'; +import {Menu, MenuItem} from 'vanilla-starter/Menu'; +import {Popover} from 'vanilla-starter/Popover'; +import {useMemo, useRef, useState} from 'react'; + +type Item = {username: string} | {command: string; description: string}; + +/*- begin collapse -*/ +const usernames = [ + {username: 'alexmiller'}, + {username: 'sarahjones'}, + {username: 'davidkim'}, + {username: 'emmawatson'}, + {username: 'oliverliu'}, + {username: 'ellagreen'}, + {username: 'lucasbrown'}, + {username: 'amandarivera'}, + {username: 'masonlee'}, + {username: 'nataliasmith'}, + {username: 'benjamintaylor'}, + {username: 'zoewilson'}, + {username: 'henrywalker'}, + {username: 'madelineyoung'}, + {username: 'noahscott'}, + {username: 'lucygonzalez'}, + {username: 'jacobmartin'}, + {username: 'averymoore'}, + {username: 'loganmurphy'}, + {username: 'miahernandez'}, + {username: 'danieladair'}, + {username: 'sofiacox'}, + {username: 'jackharris'}, + {username: 'chloebaker'}, + {username: 'liamrodriguez'} +]; +/*- end collapse -*/ + +/*- begin collapse -*/ +const slashCommands = [ + {command: 'gif', description: 'Insert a GIF'}, + {command: 'todo', description: 'Add a todo list item'}, + {command: 'mention', description: 'Mention a user with @username'}, + {command: 'date', description: 'Insert the current date'}, + {command: 'quote', description: 'Insert a quote block'} +]; +/*- end collapse -*/ + +function Example() { + let inputRef = useRef(null); + let [value, setValue] = useState( + new TokenFieldValue([ + {type: 'text', text: 'This example has autocomplete for '}, + {type: 'token', text: '@usernames'}, + {type: 'text', text: ' and '}, + {type: 'token', text: '/commands'} + ]) + ); + + let [filterAnchor, filterValue] = useMemo(() => { + let filterAnchor = value.findText(value.caretPosition, TokenFieldValue.Direction.Backward, /(?<=^|\s)[@/]/); + if (filterAnchor != null) { + let filterValue = value.slice(filterAnchor, value.caretPosition).toString(); + return [filterAnchor, filterValue]; + } + return [null, null]; + }, [value]); + + let items: Item[] = []; + if (filterValue != null && filterValue.startsWith('/')) { + items = slashCommands.filter(item => item.command.includes(filterValue.slice(1))); + } else if (filterValue != null && filterValue.startsWith('@')) { + items = usernames.filter(item => item.username.includes(filterValue.slice(1))); + } + + return ( + /*- begin highlight -*/ + + + {segment => {segment.text}} + + 0} + isNonModal + hideArrow + placement="bottom start" + trigger="MenuTrigger" + getTargetRect={target => { + return tokenFieldPositionToDOMRange(target, filterAnchor!).getBoundingClientRect(); + }}> + + {item => ( + { + setValue(value => + value.replaceRangeWithSegments( + filterAnchor!, + value.caretPosition, + [ + { + type: 'token', + text: 'username' in item ? '@' + item.username : item.command + }, + {type: 'text', text: ' '} + ], + false + ) + ); + }}> + {'username' in item ? item.username : item.command} + {'description' in item ? {item.description} : null} + + )} + + + + /*- end highlight -*/ + ); +} +``` + +[MenuTrigger](/Menu#context-menu) now supports `trigger="contextMenu"`, enabling accessible context menus via mouse, keyboard, and touch input. + +```tsx render hideCode +"use client"; +import {MenuTrigger, Menu, MenuItem, SubmenuTrigger, Separator} from 'vanilla-starter/Menu'; +import {Button} from 'react-aria-components/Button'; + + + + + Open + + Open with + + Preview + Photoshop + Safari + + + + Get Info + Rename + Duplicate + Move to Trash + + +``` + +```css render hidden +.context-menu-trigger { + width: 250px; + height: 150px; + display: flex; + align-items: center; + justify-content: center; + border: 2px dashed var(--gray-400); + border-radius: 10px; + background: transparent; + font: inherit; + color: inherit; + outline: none; + + &[data-focus-visible] { + outline: 2px solid var(--focus-ring-color); + outline-offset: -2px; + } +} +``` + +In addition, we have added a simpler API to implement keyboard shortcuts to [useKeyboard](../useKeyboard), and support for interactive components like textfields inside Table rows. + +Finally, the React Aria and React Stately hook documentation has been completely rewritten! The new docs use the same styles as our React Aria Components examples, and show how to use both components and hooks together. + +As always, thank you to all our contributors! + +## Changelog + +### General Changes +- Add new React Aria hooks documentation - [@reidbarber](https://github.com/reidbarber) - [PR](https://github.com/adobe/react-spectrum/pull/10153), [PR](https://github.com/adobe/react-spectrum/pull/10355) +### Breadcrumbs +- Prevent passing an empty string to the `href` attribute when undefined - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10286) +### Checkbox +- Fix Enter key presses on Checkbox inputs so they no longer block native implicit form submission - [@nami8824](https://github.com/nami8824) - [PR](https://github.com/adobe/react-spectrum/pull/9972) +### Collections +- Add guide explaining how to update collection structure to documentation - [@patrickwehbe](https://github.com/patrickwehbe) - [PR](https://github.com/adobe/react-spectrum/pull/10232) +- Support collections in React canary and Next.js 16's app router - [@nwidynski](https://github.com/nwidynski) - [PR](https://github.com/adobe/react-spectrum/pull/10323) +### ComboBox +- Document `defaultFilter`'s default `contains` filter behavior - [@patrickwehbe](https://github.com/patrickwehbe) - [PR](https://github.com/adobe/react-spectrum/pull/10222) +- Accept a readonly array for controlled multiple ComboBox `value` - [@lixiaoyan](https://github.com/lixiaoyan) - [PR](https://github.com/adobe/react-spectrum/pull/10290) +### Date and Time +- Export `DayOfWeek` type from `@internationalized/date` - [@patrickwehbe](https://github.com/patrickwehbe) - [PR](https://github.com/adobe/react-spectrum/pull/10234) +- Clamp milliseconds to a valid maximum of 999 - [@spokodev](https://github.com/spokodev) - [PR](https://github.com/adobe/react-spectrum/pull/10289) +- Resolve locales with an explicit script to language-script strings - [@stas-m2muchcoffee](https://github.com/stas-m2muchcoffee) - [PR](https://github.com/adobe/react-spectrum/pull/10268) +### DatePicker +- Avoid stealing focus into a date segment from a `selectionchange` event in Firefox - [@doolse](https://github.com/doolse) - [PR](https://github.com/adobe/react-spectrum/pull/10260) +### Dialog +- Add `aria-describedby` support for the `alertdialog` role - [@costajohnt](https://github.com/costajohnt) - [PR](https://github.com/adobe/react-spectrum/pull/9924) +- Pass the overlay id to `PopoverContext` in Dialog - [@albertdugba](https://github.com/albertdugba) - [PR](https://github.com/adobe/react-spectrum/pull/9807) +### Drag and drop +- Prefer the ancestor drop target over the nearest-by-distance target in DragManager - [@mvanhorn](https://github.com/mvanhorn) - [PR](https://github.com/adobe/react-spectrum/pull/10170) +- Prevent Android Chrome taps from being detected as a drag event - [@LFDanLu](https://github.com/LFDanLu) - [PR](https://github.com/adobe/react-spectrum/pull/10332) +### DropZone +- Prevent focus from moving to DropZone when clicking its hidden file input - [@pradeep-ramola](https://github.com/pradeep-ramola) - [PR](https://github.com/adobe/react-spectrum/pull/10173), [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10336) +### Link +- Add `onPressChange` prop to `useLink` - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10306) +### Menu +- Add `useContextMenu` and `trigger="contextMenu"` to MenuTrigger - [@devongovett](https://github.com/devongovett) - [PR](https://github.com/adobe/react-spectrum/pull/10237) +### Meter +- Guard the percentage calculation against `NaN` when `min` equals `max` - [@mvanhorn](https://github.com/mvanhorn) - [PR](https://github.com/adobe/react-spectrum/pull/10169) +### Overlays +- Restore focus in `FocusScope` containment without scrolling- [@mvanhorn](https://github.com/mvanhorn) - [PR](https://github.com/adobe/react-spectrum/pull/10339) +- Add an `addGlobalScrollListener` utility and close overlays on scroll events inside a shadow DOM - [@pzaczkiewicz-athenahealth](https://github.com/pzaczkiewicz-athenahealth) - [PR](https://github.com/adobe/react-spectrum/pull/10188) +### PreviewTrigger +- Add PreviewTrigger component - [@devongovett](https://github.com/devongovett) - [PR](https://github.com/adobe/react-spectrum/pull/10243) +### ProgressBar +- Guard the percentage calculation against `NaN` when `min` equals `max` - [@mvanhorn](https://github.com/mvanhorn) - [PR](https://github.com/adobe/react-spectrum/pull/10169) +### RadioGroup +- Fix `Enter` key presses on Radio inputs so they no longer block native implicit form submission - [@nami8824](https://github.com/nami8824) - [PR](https://github.com/adobe/react-spectrum/pull/9972) +### Select +- Restore the default `type` for Select - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10361) +### Switch +- Delegate label `keydown` handling to the native input for switches so key events behave consistently - [@nami8824](https://github.com/nami8824) - [PR](https://github.com/adobe/react-spectrum/pull/9972) +### Table +- Support TextFields and other interactive components inside Table rows using `keyboardNavigationBehavior="tab"` - [@LFDanLu](https://github.com/LFDanLu) - [PR](https://github.com/adobe/react-spectrum/pull/10159), [PR](https://github.com/adobe/react-spectrum/pull/10206) +- Floor fractional table column widths so columns don't overflow - [@ardittirana](https://github.com/ardittirana) - [PR](https://github.com/adobe/react-spectrum/pull/10238) +- Fix column resizing getting stuck after a press and hold - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10040) +- Restore focus without an infinite loop when no focusable row remains in `useGridState` - [@RobHannay](https://github.com/RobHannay) - [PR](https://github.com/adobe/react-spectrum/pull/10241) +### TokenField +- Add TokenField component - [@devongovett](https://github.com/devongovett) - [PR](https://github.com/adobe/react-spectrum/pull/10318) +### Tree +- Fix non-selection checkboxes in Tree items - [@mvanhorn](https://github.com/mvanhorn) - [PR](https://github.com/adobe/react-spectrum/pull/10274) +- Prevent virtualized grid layouts from disappearing when hidden via `display: none` - [@LFDanLu](https://github.com/LFDanLu) - [PR](https://github.com/adobe/react-spectrum/pull/10190) +- Export `TreeSectionProps` and `TreeHeaderProps` types - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10306) +### useId +- Prevent `FinalizationRegistry` entries from accumulating on every re-render - [@reidbarber](https://github.com/reidbarber) - [PR](https://github.com/adobe/react-spectrum/pull/9853) +### useKeyboard +- Adds support for new shortcuts that allow control over stopping prpagation and preventing default - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10200), [PR](https://github.com/adobe/react-spectrum/pull/10322), [PR](https://github.com/adobe/react-spectrum/pull/10285) +### usePress +- Fix press events not firing consistently for trackpad taps - [@LFDanLu](https://github.com/LFDanLu) - [PR](https://github.com/adobe/react-spectrum/pull/10225) +### Virtualizer +- Add `shouldObserveItemSize` to Virtualizer to force re-layout when items change size - [@yihuiliao](https://github.com/yihuiliao) - [PR](https://github.com/adobe/react-spectrum/pull/10258) + +## Released packages + +``` + - @internationalized/date@3.12.3 + - @internationalized/string@3.2.10 + - @react-types/shared@3.36.1 + - @react-aria/optimize-locales-plugin@2.0.1 + - react-aria@3.51.0 + - react-aria-components@1.20.0 + - react-stately@3.49.0 +``` diff --git a/packages/dev/s2-docs/pages/s2/releases/v1-6-0.mdx b/packages/dev/s2-docs/pages/s2/releases/v1-6-0.mdx new file mode 100644 index 00000000000..39cb2792219 --- /dev/null +++ b/packages/dev/s2-docs/pages/s2/releases/v1-6-0.mdx @@ -0,0 +1,141 @@ +{/* Copyright 2026 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. */} + +import {InstallCommand} from '../../../src/InstallCommand'; + +import {Layout} from '../../../src/Layout'; +export default Layout; + +import docs from 'docs:@react-spectrum/s2'; + +export const hideNav = true; +export const section = 'Releases'; +export const tags = ['release', 'S2']; +export const date = 'July 31, 2026'; +export const title = 'v1.6.0'; +export const description = 'This release adds the long-awaited SideNav component for app navigation sidebars, context menu support in MenuTrigger, and support for textfields and other interactive elements in TableView cells.'; +export const isSubpage = true; + +# v1.6.0 + +This release introduces the new [SideNav](../SideNav) component for building app navigation sidebars, adds `trigger="contextMenu"` support to [MenuTrigger](../Menu#context-menu), and lets [TableView](../TableView#keyboard-navigation) cells hold interactive content like TextFields. + +```tsx render hideCode +"use client"; +import {SideNav, SideNavItem, SideNavItemContent, SideNavItemLink, SideNavSection, SideNavHeader, Text} from '@react-spectrum/s2/SideNav'; +import {style} from '@react-spectrum/s2/style' with {type: 'macro'}; +import UserGroup from '@react-spectrum/s2/icons/UserGroup'; +import CCLibrary from '@react-spectrum/s2/icons/CCLibrary'; +import Files from '@react-spectrum/s2/icons/Files'; +import Images from '@react-spectrum/s2/icons/Images'; +import Animation from '@react-spectrum/s2/icons/Animation'; +import Download from '@react-spectrum/s2/icons/Download'; +import Apps from '@react-spectrum/s2/icons/Apps'; +import {RouterProvider} from 'react-aria-components'; +import React, {useState} from 'react'; + +function RoutedSideNav(props) { + let {children} = props; + let [selectedRoute, setSelectedRoute] = useState(props.defaultSelectedRoute); + + let updateSelection = (href: string) => { + setSelectedRoute(href); + }; + + return {children({selectedRoute})}; +} + + + {({selectedRoute}) => ( + + + Favorites + + + + + Applications + + + + + + + + Downloads + + + + + + Workspaces + + + + + Files + + + + + + + + Your Libraries + + + + + + + Photos + + + + + + + + + Shared with You + + + + + + + Animations + + + + + + + )} + +``` + +## Changelog + +### General Changes +- Adds support for chaining multiple keyboard shortcut handlers - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10200) +### Dialog +- Adds `aria-describedby` support so AlertDialog content is announced to assistive technology - [@costajohnt](https://github.com/costajohnt) - [PR](https://github.com/adobe/react-spectrum/pull/9924) +### Menu +- Adds `trigger="contextMenu"` support to MenuTrigger for showing menus on right-click or long-press - [@devongovett](https://github.com/devongovett) - [PR](https://github.com/adobe/react-spectrum/pull/10237) +### SideNav +- Adds SideNav component - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10306) +### Switch +- Fixes Switch's hidden native input positioning so it doesn't shift layout - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10336) +### Table +- Adds support for TextField and other interactive components inside Table cells using `keyboardNavigationBehavior="tab"`- [@LFDanLu](https://github.com/LFDanLu) - [PR](https://github.com/adobe/react-spectrum/pull/10159) +### TextArea +- Fixes empty TextArea height jumping when an overlay is open - [@reidbarber](https://github.com/reidbarber) - [PR](https://github.com/adobe/react-spectrum/pull/9933) +### Toast +- Allows an `id` prop to be passed through to the DOM on Toast - [@snowystinger](https://github.com/snowystinger) - [PR](https://github.com/adobe/react-spectrum/pull/10342) diff --git a/packages/dev/s2-docs/src/CodeBlock.tsx b/packages/dev/s2-docs/src/CodeBlock.tsx index 35a2d522013..b5c25dd75e4 100644 --- a/packages/dev/s2-docs/src/CodeBlock.tsx +++ b/packages/dev/s2-docs/src/CodeBlock.tsx @@ -75,6 +75,7 @@ interface CodeBlockProps extends VisualExampleProps { files?: string[]; expanded?: boolean; hidden?: boolean; + hideCode?: boolean; showCoachMark?: boolean; } @@ -85,6 +86,7 @@ export function CodeBlock({ files, expanded, hidden, + hideCode, ...props }: CodeBlockProps) { if (hidden) { @@ -147,19 +149,21 @@ export function CodeBlock({ return (
-
- {files ? ( - - {content} - - ) : ( - content - )} -
+ {!hideCode && ( +
+ {files ? ( + + {content} + + ) : ( + content + )} +
+ )}
); } diff --git a/scripts/changelog.js b/scripts/changelog.js index 2bce12dfc9b..f9ec64d239d 100644 --- a/scripts/changelog.js +++ b/scripts/changelog.js @@ -43,6 +43,11 @@ function packageToLibrary(name) { if (name === '@react-spectrum/s2') { return 'Spectrum 2'; } + // @react-spectrum/ai has no release doc set yet — collected into its own + // bucket and console-logged only (like v3), not written to a file. + if (name === '@react-spectrum/ai') { + return 'AI'; + } // V3 has no LIBRARY_CONFIG entry. Its commits are collected but only printed // as a warning, never written to a file. See the v3Bucket handling at the end of run(). if (name === '@adobe/react-spectrum' || name.startsWith('@react-spectrum/')) { @@ -346,4 +351,17 @@ async function run() { } console.warn(); } + + // Handle commits in @react-spectrum/ai + let aiBucket = commitsByLibrary.get('AI'); + if (aiBucket && aiBucket.size > 0) { + console.warn( + `\nℹ ${aiBucket.size} @react-spectrum/ai commit(s) were not written to a file. Review them manually if needed:\n` + ); + let sorted = [...aiBucket.values()].sort((a, b) => (a[1] < b[1] ? -1 : 1)); + for (let commit of sorted) { + console.warn(` ${commit[3]}`); + } + console.warn(); + } }