Skip to content

Commit 685748f

Browse files
committed
Merge branch 'main' into dnd-highlight-nice-to-have
2 parents 3e6bb52 + a6e9b25 commit 685748f

225 files changed

Lines changed: 1901 additions & 767 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
11
.disableAnimations * {
22
transition: none !important;
3+
animation: none !important;
4+
}
5+
6+
/*
7+
Overlays that use useEnterAnimation/useExitAnimation (Popover, Tooltip, Tabs)
8+
render at a translate offset while [data-entering]/[data-exiting] is true,
9+
relying on the transition to slide back to translate: 0. With transitions
10+
disabled in Chromatic, the slide never happens, so a snapshot taken while
11+
isEntering is still true catches the popover ~4px off.
12+
*/
13+
.disableAnimations [data-entering],
14+
.disableAnimations [data-exiting] {
15+
translate: none !important;
316
}

.chromatic-fc/preview-head.html

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,38 @@
187187
as="font"
188188
crossorigin="anonymous" />
189189

190+
<!--
191+
Noto Sans Ethiopic: Adobe Clean does not cover the Ethiopic script (U+1200-137F),
192+
so without an explicit @font-face the browser falls through to a system font
193+
whose loading is not tracked by document.fonts.ready. That makes Amharic
194+
stories (e.g. DateField > Amharic Preferences) flaky in Chromatic.
195+
Declaring it under font-family: adobe-clean with a unicode-range
196+
for Ethiopic extends the adobe-clean family for those code points, and
197+
font-display: block ensures Chromatic waits for it before snapshotting.
198+
199+
This font is what Chrome falls back to anyways, we're just making sure Chromatic
200+
waits for it before snapshotting.
201+
-->
202+
<link
203+
rel="preload"
204+
href="https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OK5D1yGb8bJ9vaUNpog.woff2"
205+
as="font"
206+
type="font/woff2"
207+
crossorigin="anonymous" />
208+
<style>
209+
@font-face {
210+
font-family: 'adobe-clean';
211+
font-style: normal;
212+
font-weight: 400;
213+
font-display: block;
214+
src: url('https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OK5D1yGb8bJ9vaUNpog.woff2')
215+
format('woff2');
216+
unicode-range:
217+
U+030E, U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, U+1E7E8-1E7EB, U+1E7ED-1E7EE,
218+
U+1E7F0-1E7FE;
219+
}
220+
</style>
221+
190222
<!--
191223
fe1ce2 font: adobe-clean-serif, weight: 900
192224
f46796 font: adobe-clean-serif, style: italic, weight: 900
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
11
.disableAnimations * {
22
transition: none !important;
3+
animation: none !important;
4+
}
5+
6+
/*
7+
Overlays that use useEnterAnimation/useExitAnimation (Popover, Tooltip, Tabs)
8+
render at a translate offset while [data-entering]/[data-exiting] is true,
9+
relying on the transition to slide back to translate: 0. With transitions
10+
disabled in Chromatic, the slide never happens, so a snapshot taken while
11+
isEntering is still true catches the popover ~4px off.
12+
*/
13+
.disableAnimations [data-entering],
14+
.disableAnimations [data-exiting] {
15+
translate: none !important;
316
}

.chromatic/preview-head.html

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,38 @@
187187
as="font"
188188
crossorigin="anonymous" />
189189

190+
<!--
191+
Noto Sans Ethiopic: Adobe Clean does not cover the Ethiopic script (U+1200-137F),
192+
so without an explicit @font-face the browser falls through to a system font
193+
whose loading is not tracked by document.fonts.ready. That makes Amharic
194+
stories (e.g. DateField > Amharic Preferences) flaky in Chromatic.
195+
Declaring it under font-family: adobe-clean with a unicode-range
196+
for Ethiopic extends the adobe-clean family for those code points, and
197+
font-display: block ensures Chromatic waits for it before snapshotting.
198+
199+
This font is what Chrome falls back to anyways, we're just making sure Chromatic
200+
waits for it before snapshotting.
201+
-->
202+
<link
203+
rel="preload"
204+
href="https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OK5D1yGb8bJ9vaUNpog.woff2"
205+
as="font"
206+
type="font/woff2"
207+
crossorigin="anonymous" />
208+
<style>
209+
@font-face {
210+
font-family: 'adobe-clean';
211+
font-style: normal;
212+
font-weight: 400;
213+
font-display: block;
214+
src: url('https://fonts.gstatic.com/s/notosansethiopic/v50/7cHPv50vjIepfJVOZZgcpQ5B9FBTH9KGNfhSTgtoow1KVnIvyBoMSzUMacb-T35OK5D1yGb8bJ9vaUNpog.woff2')
215+
format('woff2');
216+
unicode-range:
217+
U+030E, U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, U+1E7E8-1E7EB, U+1E7ED-1E7EE,
218+
U+1E7F0-1E7FE;
219+
}
220+
</style>
221+
190222
<!--
191223
fe1ce2 font: adobe-clean-serif, weight: 900
192224
f46796 font: adobe-clean-serif, style: italic, weight: 900

.circleci/config.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,30 +21,31 @@ executors:
2121
rsp:
2222
docker:
2323
- image: cimg/node:24.14.1
24+
resource_class: medium.gen2
2425
environment:
2526
CACHE_VERSION: v1
2627
working_directory: ~/react-spectrum
2728

2829
rsp-large:
2930
docker:
3031
- image: cimg/node:24.14.1
31-
resource_class: large
32+
resource_class: large.gen2
3233
environment:
3334
CACHE_VERSION: v1
3435
working_directory: ~/react-spectrum
3536

3637
rsp-xlarge:
3738
docker:
3839
- image: cimg/node:24.14.1
39-
resource_class: xlarge
40+
resource_class: xlarge.gen2
4041
environment:
4142
CACHE_VERSION: v1
4243
working_directory: ~/react-spectrum
4344

4445
rsp-2xlarge:
4546
docker:
4647
- image: cimg/node:24.14.1
47-
resource_class: 2xlarge
48+
resource_class: 2xlarge.gen2
4849
environment:
4950
CACHE_VERSION: v1
5051
working_directory: ~/react-spectrum
@@ -447,7 +448,7 @@ jobs:
447448
name: build fork-point apis
448449
command: |
449450
mkdir -p ~/.ssh
450-
curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | sed -e 's/^/github.com /' >> ~/.ssh/known_hosts
451+
ssh-keyscan -t rsa,ed25519 github.com >> ~/.ssh/known_hosts
451452
yarn build:api-branch --githash="origin/main" --output="base-api" && yarn build:api-branch && yarn compare:apis
452453
453454
- persist_to_workspace:
@@ -490,7 +491,7 @@ jobs:
490491
name: build agent skills (main)
491492
command: |
492493
mkdir -p ~/.ssh
493-
curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | sed -e 's/^/github.com /' >> ~/.ssh/known_hosts
494+
ssh-keyscan -t rsa,ed25519 github.com >> ~/.ssh/known_hosts
494495
BRANCH_ROOT="$(pwd)"
495496
BUILD_SKILLS="$BRANCH_ROOT/.circleci/build-skills.sh"
496497
git worktree add --detach /tmp/main-worktree origin/main

.github/labeler.yml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@ needs translations:
66

77
S2:
88
- changed-files:
9-
- any-glob-to-any-file: ['**/s2/**']
9+
- all-globs-to-any-file: ['**/s2/**', '!**/*.stories.*', '!**/*.test.*']
1010

1111
RAC:
12-
- changed-files:
13-
- any-glob-to-any-file: ['**/react-aria-components/**', '**/@react-aria/**']
12+
- any:
13+
- changed-files:
14+
- all-globs-to-any-file:
15+
['**/react-aria-components/**', '!**/*.stories.*', '!**/*.test.*']
16+
- changed-files:
17+
- all-globs-to-any-file: ['**/@react-aria/**', '!**/*.stories.*', '!**/*.test.*']
1418

1519
v3:
1620
- all:
1721
- changed-files:
18-
- any-glob-to-any-file: '**/@react-spectrum/**'
22+
- all-globs-to-any-file: ['**/@react-spectrum/**', '!**/*.stories.*', '!**/*.test.*']
1923
- all-globs-to-all-files: '!**/@react-spectrum/s2/**'
2024

2125
Accordion:

.github/workflows/weekly-api-diff.yml

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ jobs:
136136
env:
137137
SLACK_TSDIFF_CHROMATIC_BOT_TOKEN: ${{ secrets.SLACK_TSDIFF_CHROMATIC_BOT_TOKEN }}
138138
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
139-
TEST_SLACK_ID: ${{ secrets.TEST_SLACK_ID }}
140139
GITHUB_TOKEN: ${{ github.token }}
141140
run: |
142141
python3 << 'PYEOF'
@@ -165,17 +164,38 @@ jobs:
165164
166165
new_release = os.environ.get('NEW_RELEASE') == 'true'
167166
167+
def post(text, thread_ts=None):
168+
payload = {"channel": channel, "text": text, "unfurl_links": False, "unfurl_media": False}
169+
if thread_ts:
170+
payload["thread_ts"] = thread_ts
171+
req = urllib.request.Request(
172+
'https://slack.com/api/chat.postMessage',
173+
data=json.dumps(payload).encode(),
174+
headers={
175+
'Authorization': f'Bearer {slack_token}',
176+
'Content-Type': 'application/json'
177+
}
178+
)
179+
resp = json.loads(urllib.request.urlopen(req).read())
180+
print("Slack response:", resp.get('ok'), resp.get('error', ''))
181+
if not resp.get('ok'):
182+
raise SystemExit(f"Slack error: {resp.get('error')}")
183+
return resp['message']['ts']
184+
168185
if vs_release_size == 0:
169-
message = f"📊 Weekly API Diff — {today}\n\nNo API changes detected vs last release — all pending changes have been included in a release."
186+
body = "No API changes detected vs last release — all pending changes have been included in a release."
170187
elif vs_last_week_size == 0 and not new_release:
171188
prev_ref = f"last diff ({prev_date}): {prev_url}" if prev_date else "last diff"
172-
message = f"📊 Weekly API Diff — {today}\n\nNo new API changes since {prev_ref}."
189+
body = f"No new API changes since {prev_ref}."
173190
elif new_release:
174-
message = f"📊 Weekly API Diff — {today}\n\nNew release since last diff — resetting baseline. Full diff vs release: {diff_url}\n\nReact ✅ if changes look expected, or 🚨 if something looks wrong."
191+
body = f"New release since last diff — resetting baseline. Full diff vs release: {diff_url}\n\nReact ✅ if changes look expected, or 🚨 if something looks wrong."
175192
else:
176193
# Read the already-processed delta saved by the shell step
177194
delta_path = f"{workspace}/snapshots/deltas/{today}.txt"
178-
model_input = open(delta_path).read() if os.path.exists(delta_path) else ""
195+
model_input_full = open(delta_path).read() if os.path.exists(delta_path) else ""
196+
TRUNCATE_LIMIT = 8000
197+
truncated = len(model_input_full) > TRUNCATE_LIMIT
198+
model_input = model_input_full[:TRUNCATE_LIMIT] if truncated else model_input_full
179199
180200
# Extract classification rules from prompt.md (single source of truth)
181201
prompt_md = open(f"{workspace}/scripts/weekly-api-diff/prompt.md").read()
@@ -210,18 +230,9 @@ jobs:
210230
}
211231
)
212232
summary = json.loads(urllib.request.urlopen(req).read())['choices'][0]['message']['content']
213-
message = f"📊 Weekly API Diff — {today}\n\n{summary}\n\nWhat's new this week: {delta_url}\nFull diff vs release: {diff_url}\n\nReact ✅ if changes look expected, or 🚨 if something looks wrong."
214-
215-
req = urllib.request.Request(
216-
'https://slack.com/api/chat.postMessage',
217-
data=json.dumps({"channel": channel, "text": message}).encode(),
218-
headers={
219-
'Authorization': f'Bearer {slack_token}',
220-
'Content-Type': 'application/json'
221-
}
222-
)
223-
resp = json.loads(urllib.request.urlopen(req).read())
224-
print("Slack response:", resp.get('ok'), resp.get('error', ''))
225-
if not resp.get('ok'):
226-
raise SystemExit(f"Slack error: {resp.get('error')}")
233+
truncation_note = "\n\n⚠️ Delta was large — summary may be incomplete. Check the full delta link below." if truncated else ""
234+
body = f"{summary}{truncation_note}\n\nWhat's new this week: {delta_url}\nFull diff vs release: {diff_url}\n\nReact ✅ if changes look expected, or 🚨 if something looks wrong."
235+
236+
ts = post(f"📊 Weekly API Diff — {today}")
237+
post(f"📊 Weekly API Diff — {today}\n\n{body}", thread_ts=ts)
227238
PYEOF

.github/workflows/weekly-chromatic.yml

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,29 @@ jobs:
9393
return f"✅ | {url}"
9494
return f"⚠️ changes pending review | {url}"
9595
96-
message = "\n".join([
97-
f"📸 Weekly Chromatic — {today}",
98-
"",
96+
body = "\n".join([
9997
f"Chromatic: {fmt(os.environ['CHROMATIC_CODE'], os.environ['CHROMATIC_URL'])}",
10098
f"Forced Colors: {fmt(os.environ['CHROMATIC_FC_CODE'], os.environ['CHROMATIC_FC_URL'])}",
10199
])
102100
103-
req = urllib.request.Request(
104-
'https://slack.com/api/chat.postMessage',
105-
data=json.dumps({"channel": channel, "text": message}).encode(),
106-
headers={
107-
'Authorization': f'Bearer {slack_token}',
108-
'Content-Type': 'application/json'
109-
}
110-
)
111-
resp = json.loads(urllib.request.urlopen(req).read())
112-
print("Slack response:", resp.get('ok'), resp.get('error', ''))
113-
if not resp.get('ok'):
114-
raise SystemExit(f"Slack error: {resp.get('error')}")
101+
def post(text, thread_ts=None):
102+
payload = {"channel": channel, "text": text, "unfurl_links": False, "unfurl_media": False}
103+
if thread_ts:
104+
payload["thread_ts"] = thread_ts
105+
req = urllib.request.Request(
106+
'https://slack.com/api/chat.postMessage',
107+
data=json.dumps(payload).encode(),
108+
headers={
109+
'Authorization': f'Bearer {slack_token}',
110+
'Content-Type': 'application/json'
111+
}
112+
)
113+
resp = json.loads(urllib.request.urlopen(req).read())
114+
print("Slack response:", resp.get('ok'), resp.get('error', ''))
115+
if not resp.get('ok'):
116+
raise SystemExit(f"Slack error: {resp.get('error')}")
117+
return resp['message']['ts']
118+
119+
ts = post(f"📸 Weekly Chromatic — {today}")
120+
post(f"📸 Weekly Chromatic — {today}\n\n{body}", thread_ts=ts)
115121
PYEOF

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ Lastly, please follow the pull request template when submitting a pull request!
4848
All third-party contributions to this project must be accompanied by a signed contributor license agreement. This gives Adobe permission to redistribute your contributions as part of the project. [Sign our CLA](https://opensource.adobe.com/cla.html). You only need to submit an Adobe CLA one time, so if you have submitted one previously, you are good to go!
4949

5050
## Where to start
51-
There are many places to dive into react-spectrum to help out. Before you take on a feature or issue, make sure you become familiar with [our architecture](https://react-spectrum.adobe.com/architecture.html).
51+
There are many places to dive into react-spectrum to help out. Before you take on a feature or issue, make sure you become familiar with [our architecture](https://github.com/adobe/react-spectrum/blob/main/rfcs/2019-v3-architecture.md).
5252

5353
If you are looking for place to start, consider the following options:
5454
- Look for issues tagged with help wanted and/or good first issue.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ React Spectrum includes several libraries, which you can choose depending on you
4141
* [React Aria](https://react-spectrum.adobe.com/react-aria/getting-started.html) is a collection of unstyled React components and hooks that helps you build accessible, high quality UI components for your own application or design system. If you're building a component library for the web from scratch with your own styling, start here.
4242
* [React Stately](https://react-spectrum.adobe.com/react-stately/getting-started.html) is a library of state management hooks for use in your component library. If you're using React Aria, you'll likely also use React Stately, but it can also be used independently (e.g. on other platforms like React Native).
4343

44-
[Read more about our architecture](https://react-spectrum.adobe.com/architecture.html).
44+
[Read more about our architecture](https://github.com/adobe/react-spectrum/blob/main/rfcs/2019-v3-architecture.md).
4545

4646
## Contributing
4747

4848
One of the goals of the React Spectrum project is to make building design systems and component libraries as easy as possible, while maintaining high quality interactions and accessibility support. We aim to raise the bar for web applications. The best way to achieve that goal is **together**. We would love contributions from the community no matter how big or small. 😍
4949

50-
Read our [contributing guide](https://github.com/adobe/react-spectrum/blob/main/CONTRIBUTING.md) to learn about how to propose bugfixes and improvements, and how the development process works. For detailed information about our architecture, and how all of the pieces fit together, read our [architecture docs](https://react-spectrum.adobe.com/architecture.html).
50+
Read our [contributing guide](https://github.com/adobe/react-spectrum/blob/main/CONTRIBUTING.md) to learn about how to propose bugfixes and improvements, and how the development process works. For detailed information about our architecture, and how all of the pieces fit together, read our [architecture rfc](https://github.com/adobe/react-spectrum/blob/main/rfcs/2019-v3-architecture.md).

0 commit comments

Comments
 (0)