From 77a15bb9028562da147ab733d3c682ba773d06d7 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Tue, 11 Nov 2025 11:38:12 -0800 Subject: [PATCH 1/9] strip markdown from blog post card descriptions --- packages/dev/s2-docs/src/MobileSearchMenu.tsx | 5 +++-- packages/dev/s2-docs/src/SearchMenu.tsx | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/dev/s2-docs/src/MobileSearchMenu.tsx b/packages/dev/s2-docs/src/MobileSearchMenu.tsx index 684f5a4ada6..d8287476c45 100644 --- a/packages/dev/s2-docs/src/MobileSearchMenu.tsx +++ b/packages/dev/s2-docs/src/MobileSearchMenu.tsx @@ -10,6 +10,7 @@ import NoSearchResults from '@react-spectrum/s2/illustrations/linear/NoSearchRes import {OverlayTriggerStateContext, Provider, Dialog as RACDialog, DialogProps as RACDialogProps, Tab as RACTab, TabList as RACTabList, TabPanel as RACTabPanel, TabPanelProps as RACTabPanelProps, TabProps as RACTabProps, Tabs as RACTabs, SelectionIndicator, TabRenderProps} from 'react-aria-components'; import type {PageProps} from '@parcel/rsc'; import React, {ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState} from 'react'; +import {stripMarkdown} from './SearchMenu'; import {useId} from '@react-aria/utils'; @@ -326,7 +327,7 @@ function MobileNav({pages, currentPage}: PageProps) { return filteredPages .sort((a, b) => title(a).localeCompare(title(b))) - .map(page => ({id: page.url.replace(/^\//, ''), name: title(page), href: page.url, description: page.exports?.description})); + .map(page => ({id: page.url.replace(/^\//, ''), name: title(page), href: page.url, description: stripMarkdown(page.exports?.description)})); }; let getAllContent = (libraryId: string, searchValue: string = ''): ComponentCardItem[] => { @@ -335,7 +336,7 @@ function MobileNav({pages, currentPage}: PageProps) { let filteredPages = filterPages(allPages, searchValue); return filteredPages .sort((a, b) => title(a).localeCompare(title(b))) - .map(page => ({id: page.url.replace(/^\//, ''), name: title(page), href: page.url, description: page.exports?.description})); + .map(page => ({id: page.url.replace(/^\//, ''), name: title(page), href: page.url, description: stripMarkdown(page.exports?.description)})); }; let getItemsForSelection = (section: string | undefined, libraryId: string, searchValue: string = ''): ComponentCardItem[] => { diff --git a/packages/dev/s2-docs/src/SearchMenu.tsx b/packages/dev/s2-docs/src/SearchMenu.tsx index cd388e8ced7..bac5a524757 100644 --- a/packages/dev/s2-docs/src/SearchMenu.tsx +++ b/packages/dev/s2-docs/src/SearchMenu.tsx @@ -17,6 +17,10 @@ import {style} from '@react-spectrum/s2/style' with { type: 'macro' }; import {Tab, TabList, TabPanel, Tabs} from './Tabs'; import {TextFieldRef} from '@react-types/textfield'; +export function stripMarkdown(description: string | undefined) { + return (description || '').replace(/\[(.*?)\]\(.*?\)/g, '$1'); +} + export const divider = style({ marginY: 8, marginStart: -8, @@ -96,7 +100,7 @@ export function SearchMenu(props: SearchMenuProps) { const title = page.tableOfContents?.[0]?.title || name; const section: string = (page.exports?.section as string) || 'Components'; const tags: string[] = (page.exports?.tags || page.exports?.keywords as string[]) || []; - const description: string = page.exports?.description; + const description: string = stripMarkdown(page.exports?.description); const date: string | undefined = page.exports?.date; return { id: name, From fa204519d9c97a318ff211ba05f846ff15b0941d Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Tue, 11 Nov 2025 11:53:20 -0800 Subject: [PATCH 2/9] fix release notes link --- packages/dev/s2-docs/pages/s2/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dev/s2-docs/pages/s2/index.mdx b/packages/dev/s2-docs/pages/s2/index.mdx index c6774e6e4ed..120c41c33de 100644 --- a/packages/dev/s2-docs/pages/s2/index.mdx +++ b/packages/dev/s2-docs/pages/s2/index.mdx @@ -84,5 +84,5 @@ export const title = 'Home'; {id: 'ToggleButtonGroup', name: 'ToggleButtonGroup', href: 'ToggleButtonGroup.html'}, {id: 'Tooltip', name: 'Tooltip', href: 'Tooltip.html'}, {id: 'TreeView', name: 'TreeView', href: 'TreeView.html'}, - {id: 'Release Notes', name: 'Release Notes', href: 'release-notes.html'} + {id: 'Release Notes', name: 'Release Notes', href: 'releases/index.html'} ]}/> From b2abef9b2f452c1d75addaefe99d9196a81d0fb8 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 12 Nov 2025 10:11:55 -0800 Subject: [PATCH 3/9] fix icon search overflow and focus visible style --- packages/dev/s2-docs/src/IconSearchView.tsx | 18 +++++++++--------- packages/dev/s2-docs/src/ReleasesList.tsx | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/dev/s2-docs/src/IconSearchView.tsx b/packages/dev/s2-docs/src/IconSearchView.tsx index da720249066..d88fab55d79 100644 --- a/packages/dev/s2-docs/src/IconSearchView.tsx +++ b/packages/dev/s2-docs/src/IconSearchView.tsx @@ -80,7 +80,7 @@ function IconListBox({items, copiedId, onAction, listBoxClassName}: IconListBoxP onAction={(item) => onAction(item.toString())} items={items} layout="grid" - className={listBoxClassName || style({width: '100%', scrollPaddingY: 4})} + className={listBoxClassName || style({width: '100%', scrollPaddingY: 4, overflow: 'auto'})} dependencies={[copiedId]} renderEmptyState={() => ( @@ -101,7 +101,7 @@ const itemStyle = style({ backgroundColor: { default: 'gray-50', isHovered: 'gray-100', - isFocused: 'gray-100', + isFocusVisible: 'gray-100', isSelected: 'neutral' }, '--iconPrimary': { @@ -160,7 +160,7 @@ function IconItem({item, isCopied = false}: {item: typeof iconList[number], isCo export function SkeletonIconItem({item}: {item: {id: string}}) { const PlaceholderIcon = Close; const ref = useRef(null); - + const itemStyle = style({ ...focusRing(), size: 'full', @@ -189,11 +189,11 @@ export function SkeletonIconItem({item}: {item: {id: string}}) { }); return ( -
+ className={style({width: '100%', scrollPaddingY: 4, overflow: 'auto'})}> {(item) => } diff --git a/packages/dev/s2-docs/src/ReleasesList.tsx b/packages/dev/s2-docs/src/ReleasesList.tsx index 2874614d850..962cee08796 100644 --- a/packages/dev/s2-docs/src/ReleasesList.tsx +++ b/packages/dev/s2-docs/src/ReleasesList.tsx @@ -19,7 +19,7 @@ export function ReleasesList({pages}: {pages: Page[]}) {

{renderHTMLfromMarkdown(release.exports?.description, {})}

))} -

For all previous releases or React Spectrum v3, see the Archived releases page.

+

For all previous releases of React Spectrum v3, see the Archived releases page.

); } From 8acc27b98e80cdfa3112f37881da813bfa618e36 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 12 Nov 2025 11:03:42 -0800 Subject: [PATCH 4/9] add color swatch --- .../react-aria/blog/ColorEditorExample.tsx | 76 +++++++++++++++++++ .../blog/accessible-color-descriptions.mdx | 19 +---- 2 files changed, 78 insertions(+), 17 deletions(-) create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx diff --git a/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx b/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx new file mode 100644 index 00000000000..202a0dbef49 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx @@ -0,0 +1,76 @@ +/* + * Copyright 2025 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. + */ + +'use client'; +import {ColorPicker} from 'react-aria-components'; +import {ColorArea, ColorSlider, ColorField, ColorSwatch, Picker, PickerItem} from '@react-spectrum/s2'; +import {style} from '@react-spectrum/s2/style' with {type: 'macro'}; +import {getColorChannels} from '@react-stately/color'; +import {useState} from 'react'; +import type {ColorSpace} from 'react-aria-components'; + +interface ColorEditorProps { + hideAlphaChannel?: boolean; +} + +function ColorEditor({hideAlphaChannel = false}: ColorEditorProps) { + let [format, setFormat] = useState('hex'); + + return ( +
+
+ + + {!hideAlphaChannel && ( + + )} +
+
+ setFormat(key as typeof format)}> + Hex + RGB + HSL + HSB + + {format === 'hex' + ? + : getColorChannels(format).map(channel => ( + + ))} + {!hideAlphaChannel && ( + + )} +
+
+ ); +} + +export function ColorEditorExample() { + return ( + + {({color}) => ( + <> + +
+ + {color.getColorName(navigator.language || 'en-US')} +
+ + )} +
+ ); +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/accessible-color-descriptions.mdx b/packages/dev/s2-docs/pages/react-aria/blog/accessible-color-descriptions.mdx index 9f959fbb21b..9b79af60bb3 100644 --- a/packages/dev/s2-docs/pages/react-aria/blog/accessible-color-descriptions.mdx +++ b/packages/dev/s2-docs/pages/react-aria/blog/accessible-color-descriptions.mdx @@ -17,6 +17,7 @@ export default Layout; import docs from 'docs:@react-spectrum/s2'; import React from 'react'; import {Byline} from '../../../src/BlogList'; +import {ColorEditorExample} from './ColorEditorExample'; export const tags = ['color picker', 'color', 'internationalization', 'localization', 'components', 'accessibility', 'react spectrum', 'react']; export const description = 'Recently, we released a suite of color picker components in React Aria and React Spectrum. Since colors are inherently visual, ensuring these components are accessible to users with visual impairments presented a significant challenge. In this post, we\'ll discuss how we developed an algorithm that generates clear color descriptions for screen readers in multiple languages, while minimizing bundle size.'; @@ -157,23 +158,7 @@ The order that the hue, chroma, and lightness descriptors are combined varies by Check out the color picker below to see the results of this algorithm: -```tsx render -'use client'; -import {ColorPicker} from 'react-aria-components'; -import {ColorSwatch} from '@react-spectrum/s2'; - -// TODO: No ColorEditor in S2 - - {({color}) => -
-
- - {color.getColorName(navigator.language || 'en-US')} -
-
- } -
-``` + ## Final result From b85d5a909cd332041760fe07f1569fc597a47763 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 12 Nov 2025 11:33:39 -0800 Subject: [PATCH 5/9] translations --- .../react-aria/blog/ColorEditorExample.tsx | 18 +++++++++++------- .../pages/react-aria/blog/intl/ar-AE.json | 7 +++++++ .../pages/react-aria/blog/intl/bg-BG.json | 7 +++++++ .../pages/react-aria/blog/intl/cs-CZ.json | 7 +++++++ .../pages/react-aria/blog/intl/da-DK.json | 7 +++++++ .../pages/react-aria/blog/intl/de-DE.json | 7 +++++++ .../pages/react-aria/blog/intl/el-GR.json | 7 +++++++ .../pages/react-aria/blog/intl/en-US.json | 7 +++++++ .../pages/react-aria/blog/intl/es-ES.json | 7 +++++++ .../pages/react-aria/blog/intl/et-EE.json | 7 +++++++ .../pages/react-aria/blog/intl/fi-FI.json | 7 +++++++ .../pages/react-aria/blog/intl/fr-FR.json | 7 +++++++ .../pages/react-aria/blog/intl/he-IL.json | 7 +++++++ .../pages/react-aria/blog/intl/hr-HR.json | 7 +++++++ .../pages/react-aria/blog/intl/hu-HU.json | 7 +++++++ .../pages/react-aria/blog/intl/it-IT.json | 7 +++++++ .../pages/react-aria/blog/intl/ja-JP.json | 7 +++++++ .../pages/react-aria/blog/intl/ko-KR.json | 7 +++++++ .../pages/react-aria/blog/intl/lt-LT.json | 7 +++++++ .../pages/react-aria/blog/intl/lv-LV.json | 7 +++++++ .../pages/react-aria/blog/intl/nb-NO.json | 7 +++++++ .../pages/react-aria/blog/intl/nl-NL.json | 7 +++++++ .../pages/react-aria/blog/intl/pl-PL.json | 7 +++++++ .../pages/react-aria/blog/intl/pt-BR.json | 7 +++++++ .../pages/react-aria/blog/intl/pt-PT.json | 7 +++++++ .../pages/react-aria/blog/intl/ro-RO.json | 7 +++++++ .../pages/react-aria/blog/intl/ru-RU.json | 7 +++++++ .../pages/react-aria/blog/intl/sk-SK.json | 7 +++++++ .../pages/react-aria/blog/intl/sl-SI.json | 7 +++++++ .../pages/react-aria/blog/intl/sr-SP.json | 7 +++++++ .../pages/react-aria/blog/intl/sv-SE.json | 7 +++++++ .../pages/react-aria/blog/intl/tr-TR.json | 7 +++++++ .../pages/react-aria/blog/intl/uk-UA.json | 7 +++++++ .../pages/react-aria/blog/intl/zh-CN.json | 7 +++++++ .../pages/react-aria/blog/intl/zh-TW.json | 7 +++++++ 35 files changed, 249 insertions(+), 7 deletions(-) create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/ar-AE.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/bg-BG.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/cs-CZ.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/da-DK.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/de-DE.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/el-GR.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/en-US.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/es-ES.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/et-EE.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/fi-FI.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/fr-FR.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/he-IL.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/hr-HR.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/hu-HU.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/it-IT.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/ja-JP.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/ko-KR.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/lt-LT.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/lv-LV.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/nb-NO.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/nl-NL.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/pl-PL.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/pt-BR.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/pt-PT.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/ro-RO.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/ru-RU.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/sk-SK.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/sl-SI.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/sr-SP.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/sv-SE.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/tr-TR.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/uk-UA.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/zh-CN.json create mode 100644 packages/dev/s2-docs/pages/react-aria/blog/intl/zh-TW.json diff --git a/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx b/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx index 202a0dbef49..37ffad88d1c 100644 --- a/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx +++ b/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx @@ -17,6 +17,9 @@ import {style} from '@react-spectrum/s2/style' with {type: 'macro'}; import {getColorChannels} from '@react-stately/color'; import {useState} from 'react'; import type {ColorSpace} from 'react-aria-components'; +// @ts-ignore +import intlMessages from './intl/*.json'; +import {useLocalizedStringFormatter} from '@react-aria/i18n'; interface ColorEditorProps { hideAlphaChannel?: boolean; @@ -24,10 +27,11 @@ interface ColorEditorProps { function ColorEditor({hideAlphaChannel = false}: ColorEditorProps) { let [format, setFormat] = useState('hex'); + let formatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/color'); return (
-
+
{!hideAlphaChannel && ( @@ -36,18 +40,18 @@ function ColorEditor({hideAlphaChannel = false}: ColorEditorProps) {
setFormat(key as typeof format)}> - Hex - RGB - HSL - HSB + {formatter.format('hex')} + {formatter.format('rgb')} + {formatter.format('hsl')} + {formatter.format('hsb')} {format === 'hex' - ? + ? : getColorChannels(format).map(channel => ( ))} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/ar-AE.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/ar-AE.json new file mode 100644 index 00000000000..b6678b071a4 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/ar-AE.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "تنسيق اللون", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/bg-BG.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/bg-BG.json new file mode 100644 index 00000000000..27c41644ca7 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/bg-BG.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Цветен формат", + "hex": "шестнадесетичен", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/cs-CZ.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/cs-CZ.json new file mode 100644 index 00000000000..c81961067a9 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/cs-CZ.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Barevný formát", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/da-DK.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/da-DK.json new file mode 100644 index 00000000000..0b8d5f08f14 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/da-DK.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Farveformat", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/de-DE.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/de-DE.json new file mode 100644 index 00000000000..99673b88f25 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/de-DE.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Farbformat", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/el-GR.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/el-GR.json new file mode 100644 index 00000000000..39874b13ab9 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/el-GR.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Μορφή χρώματος", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/en-US.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/en-US.json new file mode 100644 index 00000000000..875d85ac4a2 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/en-US.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Color format", + "hex": "Hex", + "rgb": "RGB", + "hsl": "HSL", + "hsb": "HSB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/es-ES.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/es-ES.json new file mode 100644 index 00000000000..67ef8cad893 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/es-ES.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Formato en color", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/et-EE.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/et-EE.json new file mode 100644 index 00000000000..2b9f7e64e5a --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/et-EE.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Värvivorming", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/fi-FI.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/fi-FI.json new file mode 100644 index 00000000000..6fd911a471a --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/fi-FI.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Värimuoto", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/fr-FR.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/fr-FR.json new file mode 100644 index 00000000000..247fc4bdadc --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/fr-FR.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Format de couleur", + "hex": "Hex", + "hsb": "HSB", + "hsl": "TSL", + "rgb": "RVB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/he-IL.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/he-IL.json new file mode 100644 index 00000000000..53b2f3e5e80 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/he-IL.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "פורמט צבע", + "hex": "משושה", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/hr-HR.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/hr-HR.json new file mode 100644 index 00000000000..9a1de55306c --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/hr-HR.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Format boja", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/hu-HU.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/hu-HU.json new file mode 100644 index 00000000000..35ab5ff857a --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/hu-HU.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Színformátum", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/it-IT.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/it-IT.json new file mode 100644 index 00000000000..81448d6d4f5 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/it-IT.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Formato colore", + "hex": "Esadecimale", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/ja-JP.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/ja-JP.json new file mode 100644 index 00000000000..d57dcd6dfe8 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/ja-JP.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "カラーフォーマット", + "hex": "16 進数", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/ko-KR.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/ko-KR.json new file mode 100644 index 00000000000..d7d27fbf9a8 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/ko-KR.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "색상 형식", + "hex": "HEX", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/lt-LT.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/lt-LT.json new file mode 100644 index 00000000000..2c0ad0d7961 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/lt-LT.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Spalvų formatas", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/lv-LV.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/lv-LV.json new file mode 100644 index 00000000000..b2cb861e4eb --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/lv-LV.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Krāsu formāts", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/nb-NO.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/nb-NO.json new file mode 100644 index 00000000000..7e5fcf667b8 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/nb-NO.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Fargeformat", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/nl-NL.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/nl-NL.json new file mode 100644 index 00000000000..7df6b21dd87 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/nl-NL.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Kleuropmaak", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/pl-PL.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/pl-PL.json new file mode 100644 index 00000000000..aad3a8685b5 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/pl-PL.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Format koloru", + "hex": "Szesnastkowy", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/pt-BR.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/pt-BR.json new file mode 100644 index 00000000000..b10da4eeb2a --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/pt-BR.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Formato da cor", + "hex": "Hexagonal", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/pt-PT.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/pt-PT.json new file mode 100644 index 00000000000..623eb82e92d --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/pt-PT.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Formato da cor", + "hex": "Hexadecimal", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/ro-RO.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/ro-RO.json new file mode 100644 index 00000000000..ea32089b2c5 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/ro-RO.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Format de culoare", + "hex": "Hexazecimal", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/ru-RU.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/ru-RU.json new file mode 100644 index 00000000000..f37c7d0ccbe --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/ru-RU.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Формат цвета", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/sk-SK.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/sk-SK.json new file mode 100644 index 00000000000..6246d22e5ba --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/sk-SK.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Farebný formát", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/sl-SI.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/sl-SI.json new file mode 100644 index 00000000000..f1e0c059a10 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/sl-SI.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Format barv", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/sr-SP.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/sr-SP.json new file mode 100644 index 00000000000..364a7d25900 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/sr-SP.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Format boje", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/sv-SE.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/sv-SE.json new file mode 100644 index 00000000000..f7960088d35 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/sv-SE.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Färgformat", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/tr-TR.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/tr-TR.json new file mode 100644 index 00000000000..35a27fcfe54 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/tr-TR.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Renk formatı", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/uk-UA.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/uk-UA.json new file mode 100644 index 00000000000..71781c27ce3 --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/uk-UA.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "Кольоровий формат", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/zh-CN.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/zh-CN.json new file mode 100644 index 00000000000..103f5e97a1b --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/zh-CN.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "颜色格式", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} diff --git a/packages/dev/s2-docs/pages/react-aria/blog/intl/zh-TW.json b/packages/dev/s2-docs/pages/react-aria/blog/intl/zh-TW.json new file mode 100644 index 00000000000..61e088dba9c --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/blog/intl/zh-TW.json @@ -0,0 +1,7 @@ +{ + "colorFormat": "顏色格式", + "hex": "Hex", + "hsb": "HSB", + "hsl": "HSL", + "rgb": "RGB" +} From f114e6b17cab13847608cae6212c388b7194e064 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 12 Nov 2025 12:58:42 -0800 Subject: [PATCH 6/9] fix styling/layout and add background --- .../react-aria/blog/ColorEditorExample.tsx | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx b/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx index 37ffad88d1c..2794f68a93d 100644 --- a/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx +++ b/packages/dev/s2-docs/pages/react-aria/blog/ColorEditorExample.tsx @@ -30,8 +30,8 @@ function ColorEditor({hideAlphaChannel = false}: ColorEditorProps) { let formatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/color'); return ( -
-
+
+
{!hideAlphaChannel && ( @@ -51,12 +51,12 @@ function ColorEditor({hideAlphaChannel = false}: ColorEditorProps) { {formatter.format('hsb')} {format === 'hex' - ? + ? : getColorChannels(format).map(channel => ( - + ))} {!hideAlphaChannel && ( - + )}
@@ -65,16 +65,29 @@ function ColorEditor({hideAlphaChannel = false}: ColorEditorProps) { export function ColorEditorExample() { return ( - - {({color}) => ( - <> - -
- - {color.getColorName(navigator.language || 'en-US')} +
+ + {({color}) => ( +
+ +
+ + {color.getColorName(navigator.language || 'en-US')} +
- - )} -
+ )} + +
); } From cd46ad9a2532aca9fc42e817296188a84fc59d38 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 12 Nov 2025 13:05:33 -0800 Subject: [PATCH 7/9] add background to submenu animation --- .../react-aria/blog/SubmenuAnimation.tsx | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/packages/dev/s2-docs/pages/react-aria/blog/SubmenuAnimation.tsx b/packages/dev/s2-docs/pages/react-aria/blog/SubmenuAnimation.tsx index b4fb3b27dfa..2114063e38d 100644 --- a/packages/dev/s2-docs/pages/react-aria/blog/SubmenuAnimation.tsx +++ b/packages/dev/s2-docs/pages/react-aria/blog/SubmenuAnimation.tsx @@ -114,21 +114,33 @@ export function SubmenuAnimation(): JSX.Element { }, []); return ( -
- +
+
+ +
); } From 611ecf2227afb9cfb33cef176fdf312374b847df Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 12 Nov 2025 13:13:06 -0800 Subject: [PATCH 8/9] make videos full width --- .../blog/accessible-color-descriptions.mdx | 4 ++-- .../blog/building-a-button-part-1.mdx | 6 ++--- .../blog/building-a-button-part-2.mdx | 5 ++-- .../blog/building-a-button-part-3.mdx | 3 +-- .../react-aria/blog/building-a-combobox.mdx | 9 ++++---- .../blog/date-and-time-pickers-for-all.mdx | 7 +++--- .../pages/react-aria/blog/drag-and-drop.mdx | 7 +++--- .../pages/react-aria/blog/rtl-date-time.mdx | 23 +++++++++---------- 8 files changed, 29 insertions(+), 35 deletions(-) diff --git a/packages/dev/s2-docs/pages/react-aria/blog/accessible-color-descriptions.mdx b/packages/dev/s2-docs/pages/react-aria/blog/accessible-color-descriptions.mdx index 9b79af60bb3..27eceaf3178 100644 --- a/packages/dev/s2-docs/pages/react-aria/blog/accessible-color-descriptions.mdx +++ b/packages/dev/s2-docs/pages/react-aria/blog/accessible-color-descriptions.mdx @@ -38,7 +38,7 @@ Accessibility is at the core of all of our work on the React Spectrum team, and Our initial implementation followed the typical ARIA patterns such as [slider](https://www.w3.org/WAI/ARIA/apg/patterns/slider/) to implement ColorArea, ColorSlider, and ColorWheel, and [listbox](https://www.w3.org/WAI/ARIA/apg/patterns/listbox/) to implement ColorSwatchPicker. This provided good support for mouse, touch, and keyboard input, but the screen reader experience left something to be desired. Out of the box, screen readers would only announce raw channel values like “Red: 182, Green: 96, Blue: 38”. I don’t know about you, but I can’t imagine what color that is just by hearing those numbers! -
@@ -127,18 +127,18 @@ After fixing the formatting, we also needed to update the keyboard navigation. P 3 . 11 - . + . 2020 , 8 - : + : 45
``` -Below is an example of a date field in Hebrew with the correct date format but incorrect keyboard navigation. Pressing the left arrow key should navigate you to the segment to the immediate left, while the right arrow key should navigate you to the segment to the immediate right. +Below is an example of a date field in Hebrew with the correct date format but incorrect keyboard navigation. Pressing the left arrow key should navigate you to the segment to the immediate left, while the right arrow key should navigate you to the segment to the immediate right. -