+
{children}
);
}
-export function Output({align = 'center'}: {align?: 'center' | 'start' | 'end'}) {
- let {component, props} = useContext(Context);
+export function Output({align = 'center', acceptOrientation}: {align?: 'center' | 'start' | 'end', acceptOrientation?: boolean}) {
+ let {component, props, propsObject} = useContext(Context);
if (!isValidElement(component)) {
let children = props.children;
@@ -109,11 +123,23 @@ export function Output({align = 'center'}: {align?: 'center' | 'start' | 'end'})
props = {...props, children};
}
+ if (props.contextualHelp) {
+ props = {
+ ...props,
+ contextualHelp: Heading Content
+ };
+ }
+
+ if (propsObject) {
+ props = {[propsObject]: props};
+ }
+
return (
+ align={align}
+ orientation={acceptOrientation ? props.orientation : undefined} />
);
}
@@ -125,7 +151,7 @@ interface CodeOutputProps {
}
export function CodeOutput({code, files, type, registryUrl}: CodeOutputProps) {
- let {name, importSource, props, controls} = useContext(Context);
+ let {name, importSource, props, controls, propsObject} = useContext(Context);
let searchParams = new URLSearchParams();
let exampleType = useContext(ExampleSwitcherContext);
@@ -134,17 +160,22 @@ export function CodeOutput({code, files, type, registryUrl}: CodeOutputProps) {
}
for (let prop in props) {
+ let value = props[prop];
if (
- props[prop] != null &&
+ value != null &&
controls[prop] != null &&
- (controls[prop].default == null || props[prop] !== controls[prop].default)
+ (controls[prop].default == null || value !== controls[prop].default)
) {
- searchParams.set(prop, JSON.stringify(props[prop]));
+ searchParams.set(prop, JSON.stringify(value));
}
}
let url = '?' + searchParams.toString();
+ if (propsObject) {
+ props = {[propsObject]: props};
+ }
+
code ||= (
@@ -162,8 +193,12 @@ export function CodeOutput({code, files, type, registryUrl}: CodeOutputProps) {
}
export function CodeProps({indent = ''}) {
- let {props, controls} = useContext(Context);
- let renderedProps: ReactNode[] = Object.keys(props).filter(prop => prop !== 'children').map(prop => renderProp(prop, props[prop], controls[prop])).filter(Boolean);
+ let {props, controls, propsObject} = useContext(Context);
+ if (propsObject) {
+ props = {[propsObject]: props};
+ }
+
+ let renderedProps: ReactNode[] = Object.keys(props).filter(prop => prop !== 'children').map(prop => renderProp(prop, props[prop], controls[prop], indent)).filter(Boolean);
let newlines = indent.length > 0 || countChars(renderedProps) > 40;
let separator = newlines ? (indent || ' ') : ' ';
renderedProps = renderedProps.map((p, i) => {
@@ -179,45 +214,47 @@ export function CodeProps({indent = ''}) {
return renderedProps;
}
-function renderElement(name: string, props: Props, controls?: Controls) {
+function renderElement(name: string, props: Props, controls?: Controls, indent = '') {
let start = <><{name} >;
- let renderedProps = Object.keys(props).filter(prop => prop !== 'children').map(prop => renderProp(prop, props[prop], controls?.[prop])).filter(Boolean);
+ let renderedProps = Object.keys(props).filter(prop => prop !== 'children').map(prop => renderProp(prop, props[prop], controls?.[prop], ' ' + indent)).filter(Boolean);
let newlines = name.length + countChars(renderedProps) > 40;
- renderedProps = renderedProps.map((p, i) => {newlines ? '\n ' : ' '}{p} );
+ renderedProps = renderedProps.map((p, i) => {newlines ? '\n ' + indent : ' '}{p} );
if (props.children) {
let end = <></{name} >>;
- let children = renderChildren(props.children);
+ let children = renderChildren(props.children, indent);
if (typeof children !== 'string') {
newlines = true;
}
- return <>{start}{renderedProps}>{newlines ? '\n ' : null}{children}{newlines ? '\n' : null}{end}>;
+ return <>{start}{renderedProps}>{newlines ? '\n ' + indent : null}{children}{newlines ? '\n' + indent : null}{end}>;
}
return <>{start}{renderedProps} />>;
}
-function renderChildren(children) {
+function renderChildren(children, indent = '') {
if (children?.icon || children?.avatar || children?.badge) {
let result: ReactNode = null;
if (children.avatar) {
- result = renderElement('Avatar', {src: 'https://i.imgur.com/xIe7Wlb.png'});
+ result = renderElement('Avatar', {src: 'https://i.imgur.com/xIe7Wlb.png'}, undefined, indent);
} else if (children.icon) {
- result = renderElement(children.icon.replace(/^(\d)/, '_$1'), {});
+ result = renderElement(children.icon.replace(/^(\d)/, '_$1'), {}, undefined, indent);
}
if (children.text) {
- let text = renderElement('Text', {children: children.text});
- result = <>{result}{result ? '\n ' : null}{text}>;
+ let text = renderElement('Text', {children: children.text}, undefined, indent);
+ result = <>{result}{result ? '\n ' + indent : null}{text}>;
}
if (children.badge) {
- let badge = renderElement('NotificationBadge', {value: 12});
- result = <>{result}{result ? '\n ' : null}{badge}>;
+ let badge = renderElement('NotificationBadge', {value: 12}, undefined, indent);
+ result = <>{result}{result ? '\n ' + indent : null}{badge}>;
}
return result;
} else if (children?.text) {
return children.text;
+ } else if (Array.isArray(children)) {
+ return children.map((c, i) => {i > 0 ? '\n ' + indent : null}{c} );
}
return children;
@@ -234,7 +271,7 @@ function countChars(element: ReactNode) {
return 0;
}
-function renderProp(name: string, value: any, control?: PropControl) {
+function renderProp(name: string, value: any, control?: PropControl, indent = '') {
if (value === control?.default) {
return null;
}
@@ -249,11 +286,21 @@ function renderProp(name: string, value: any, control?: PropControl) {
if (value === false && control?.optional) {
return null;
}
- propValue = value === false ? <>{'{'}{String(value)} {'}'}> : null;
+ if (name === 'contextualHelp') {
+ let res = renderElement('ContextualHelp', {
+ children: [
+ renderElement('Heading', {children: 'Heading'}),
+ renderElement('Content', {children: 'Content'})
+ ]
+ }, undefined, indent + ' ');
+ propValue = <>{`{\n ${indent}`}{res}{`\n ${indent}}`}>;
+ } else {
+ propValue = value === false ? <>{'{'}{String(value)} {'}'}> : null;
+ }
} else if (value == null) {
return null;
} else if (typeof value === 'object') {
- propValue = <>{'{'}{renderValue(value)}{'}'}>;
+ propValue = <>{'{'}{renderValue(value, indent)}{'}'}>;
}
if (propValue) {
@@ -263,7 +310,7 @@ function renderProp(name: string, value: any, control?: PropControl) {
return {propName}{propValue} ;
}
-function renderValue(value: any) {
+function renderValue(value: any, indent = '') {
switch (typeof value) {
case 'string':
return "{value}" ;
@@ -275,9 +322,30 @@ function renderValue(value: any) {
if (value == null) {
return {String(value)} ;
}
+ if (Array.isArray(value)) {
+ let res: ReactNode[] = value.map((item, i) => {
+ let result = renderValue(item, indent);
+ if (i < value.length - 1) {
+ result = <>{result}, >;
+ }
+ return {result} ;
+ });
+
+ if (countChars(res) > 40) {
+ res = res.map((p, i) => {'\n ' + indent}{p} );
+ res.push('\n ');
+ }
+
+ return <>{'['}{res}{']'}>;
+ }
+
+ if (value instanceof Size) {
+ return <>new Size ({value.width} , {value.height} )>;
+ }
+
let entries = Object.entries(value);
let res: ReactNode[] = entries.map(([name, value], i) => {
- let result = <>{name} : {renderValue(value)}>;
+ let result = <>{name} : {renderValue(value, indent)}>;
if (i < entries.length - 1) {
result = <>{result}, >;
}
@@ -285,8 +353,8 @@ function renderValue(value: any) {
});
if (countChars(res) > 40) {
- res = res.map((p, i) => {'\n '}{p} );
- res.push('\n ');
+ res = res.map((p, i) => {'\n ' + indent}{p} );
+ res.push('\n' + indent);
}
return <>{'{'}{res}{'}'}>;
@@ -307,6 +375,10 @@ function renderImports(name: string, importSource: string, props: Props) {
if (components.length > 1 || props.children?.icon) {
components.push('Text');
}
+
+ if (props.contextualHelp) {
+ components.push('ContextualHelp', 'Heading', 'Content');
+ }
imports.push(renderImport(components.join(', '), importSource));
@@ -340,6 +412,9 @@ export function Control({name}: {name: string}) {
if (name === 'colorSpace') {
return ;
}
+ if (name === 'placement' && control.value.elements.length === 22) {
+ return ;
+ }
return ;
case 'number':
return ;
@@ -348,7 +423,7 @@ export function Control({name}: {name: string}) {
return ;
}
if (name === 'contextualHelp') {
- return ;
+ return ;
}
if (control.value.name === 'ReactNode') {
return ;
@@ -363,7 +438,16 @@ export function Control({name}: {name: string}) {
if (control.value.name === 'DateDuration') {
return ;
}
+ if (control.value.name === 'Size') {
+ return ;
+ }
break;
+ case 'array':
+ return ;
+ case 'application':
+ if (control.value.base.type === 'identifier' && (control.value.base.name === 'ReadonlyArray' || control.value.base.name === 'Array')) {
+ return ;
+ }
default:
if (name === 'children') {
return ;
@@ -388,7 +472,7 @@ function BooleanControl({control, value, onChange}: ControlProps) {
function UnionControl({control, value, onChange, isPicker = false}) {
let length = control.value.elements.reduce((p, v) => p + v.value, '').length;
- if (isPicker || length > 18) {
+ if (isPicker || control.options?.control === 'picker' || length > 18) {
return (
onChange(v === '__none' ? null : v)}
styles={style({width: 130})}>
{control.optional && !control.default ? Default : null}
- {control.value.elements.map(element => (
- {element.value}
+ {control.value.elements.filter(e => e.value).map(element => (
+ {String(element.value)}
))}
);
@@ -439,9 +523,9 @@ function UnionControl({control, value, onChange, isPicker = false}) {
);
}
-function Wrapper({control, children, styles}: {control: PropControl, children: ReactNode, styles?: StyleString}) {
+function Wrapper({control, children, styles, ref}: {control: PropControl, children: ReactNode, styles?: StyleString, ref?: Ref}) {
return (
-
+
{control.name}
@@ -469,13 +553,30 @@ function PropContextualHelp({control}) {
}
function NumberControl({control, value, onChange}: ControlProps) {
+ if (control.options?.control === 'slider') {
+ return (
+ }
+ value={value}
+ onChange={onChange}
+ styles={style({width: 130})} />
+ );
+ }
+
return (
}
value={value}
onChange={onChange}
- styles={style({width: 130})} />
+ styles={style({width: 130})}
+ minValue={control.options?.minValue}
+ maxValue={control.options?.maxValue}
+ formatOptions={control.name === 'delay' || control.name === 'closeDelay' ? {
+ style: 'unit',
+ unit: 'millisecond'
+ } : undefined} />
);
}
@@ -636,14 +737,6 @@ function ChildrenControl({control, value, onChange}: ControlProps) {
return ;
}
-function ContextualHelpControl({control, value, onChange}: ControlProps) {
- return (
-
- onChange(v ? Heading Content : null)} aria-label={control.name} />
-
- );
-}
-
// https://github.com/unicode-org/cldr/blob/22af90ae3bb04263f651323ce3d9a71747a75ffb/common/supplemental/supplementalData.xml#L4649-L4664
const preferences = [
@@ -839,6 +932,7 @@ function DurationControl({control, value, onChange}: ControlProps) {
label={control.name}
contextualHelp={ }
value={value.months}
+ minValue={1}
onChange={months => onChange({months})}
styles={style({width: 130})}
formatOptions={{
@@ -897,3 +991,171 @@ function ColorSpaceControl({control, value}) {
}} />
);
}
+
+function PlacementControl({control, value, onChange}) {
+ return (
+
+ onChange([...keys][0])}
+ className=""
+ style={{
+ display: 'grid',
+ gridTemplateAreas: `
+ ". ts tc te . "
+ "st . . . et"
+ "sc . . . ec"
+ "sb . . . eb"
+ ". bs bc be . "
+ `,
+ gridTemplateColumns: '25px 24px 24px 25px 24px',
+ gridTemplateRows: '25px 24px 24px 25px 24px'
+ }}>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function PlacementControlItem(props) {
+ return (
+
+
+
+ );
+}
+
+function ArrayControl({control, valueType, value = [], onChange}) {
+ let ref = useRef(null);
+ return (
+
+ {value.length === 0 &&
+ {
+ flushSync(() => onChange(['']));
+ ref.current?.querySelector('input')?.focus();
+ }}>
+
+
+ }
+ {value.map((item, index) => {
+ let rendered;
+ switch (valueType.type) {
+ case 'string':
+ rendered = (
+ {
+ let arr: any[] = [...value];
+ arr[index] = newValue;
+ onChange(arr);
+ }} />
+ );
+ break;
+ default:
+ console.warn('unknown array element type', valueType);
+ return null;
+ }
+
+ return (
+
+ {rendered}
+
{
+ let arr: any[] = [...value];
+ arr.splice(index + 1, 0, '');
+ flushSync(() => onChange(arr));
+ ref.current?.querySelectorAll('input')[index + 1]?.focus();
+ }}>
+
+
+
{
+ let arr: any[] = [...value];
+ arr.splice(index, 1);
+ flushSync(() => onChange(arr));
+ if (arr.length > 0) {
+ ref.current?.querySelectorAll('input')[Math.min(arr.length - 1, index)]?.focus();
+ } else {
+ ref.current?.querySelector('button')?.focus();
+ }
+ }}>
+
+
+
+ );
+ })}
+
+ );
+}
+
+function SizeControl({control, value, onChange}: ControlProps) {
+ return (
+
+
+ onChange(new Size(width, value?.height ?? 0))}
+ styles={style({flexShrink: 1, flexGrow: 1})}
+ hideStepper />
+ onChange(new Size(value?.width ?? 0, height))}
+ styles={style({flexShrink: 1, flexGrow: 1})}
+ hideStepper />
+
+
+ );
+}
diff --git a/packages/dev/s2-docs/src/anatomy.css b/packages/dev/s2-docs/src/anatomy.css
index 0bd144ef475..8745807b156 100644
--- a/packages/dev/s2-docs/src/anatomy.css
+++ b/packages/dev/s2-docs/src/anatomy.css
@@ -12,4 +12,18 @@
--anatomy-gray-75: light-dark(#FDFDFE, #0e1525);
--anatomy-gray-50: light-dark(#FFFFFF, #0c1220);
--anatomy-radius: 16px;
+ --anatomy-font: adobe-clean-spectrum-vf;
+}
+
+#api + svg {
+ display: block;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ margin-bottom: 4px !important;
+}
+
+#api + svg + pre {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ margin-top: 0;
}
diff --git a/packages/dev/s2-docs/src/client.tsx b/packages/dev/s2-docs/src/client.tsx
index 710d6937690..4471c218992 100644
--- a/packages/dev/s2-docs/src/client.tsx
+++ b/packages/dev/s2-docs/src/client.tsx
@@ -7,7 +7,7 @@ import type {ReactElement} from 'react';
let updateRoot = hydrate({
// Intercept HMR window reloads, and do it with RSC instead.
onHmrReload() {
- navigate(location.pathname);
+ navigate(location.pathname + location.search + location.hash);
}
});
@@ -25,29 +25,29 @@ async function navigate(pathname: string, push = false) {
}
// Intercept link clicks to perform RSC navigation.
-// document.addEventListener('click', e => {
-// let link = (e.target as Element).closest('a');
-// if (
-// link &&
-// link instanceof HTMLAnchorElement &&
-// link.href &&
-// (!link.target || link.target === '_self') &&
-// link.origin === location.origin &&
-// link.pathname !== location.pathname &&
-// !link.hasAttribute('download') &&
-// e.button === 0 && // left clicks only
-// !e.metaKey && // open in new tab (mac)
-// !e.ctrlKey && // open in new tab (windows)
-// !e.altKey && // download
-// !e.shiftKey &&
-// !e.defaultPrevented
-// ) {
-// e.preventDefault();
-// navigate(link.pathname, true);
-// }
-// });
+document.addEventListener('click', e => {
+ let link = (e.target as Element).closest('a');
+ if (
+ link &&
+ link instanceof HTMLAnchorElement &&
+ link.href &&
+ (!link.target || link.target === '_self') &&
+ link.origin === location.origin &&
+ link.pathname !== location.pathname &&
+ !link.hasAttribute('download') &&
+ e.button === 0 && // left clicks only
+ !e.metaKey && // open in new tab (mac)
+ !e.ctrlKey && // open in new tab (windows)
+ !e.altKey && // download
+ !e.shiftKey &&
+ !e.defaultPrevented
+ ) {
+ e.preventDefault();
+ navigate(link.pathname + link.search + link.hash, true);
+ }
+});
-// // When the user clicks the back button, navigate with RSC.
-// window.addEventListener('popstate', e => {
-// navigate(location.pathname);
-// });
+// When the user clicks the back button, navigate with RSC.
+window.addEventListener('popstate', () => {
+ navigate(location.pathname + location.search + location.hash);
+});
diff --git a/packages/dev/s2-docs/src/iconAliases.js b/packages/dev/s2-docs/src/iconAliases.js
new file mode 100644
index 00000000000..da810ff1930
--- /dev/null
+++ b/packages/dev/s2-docs/src/iconAliases.js
@@ -0,0 +1,123 @@
+// Maps common terms to potentially relevant S2 workflow icons.
+export const iconAliases = {
+ 'add': ['New', 'ProjectCreate'],
+ 'again': ['Redo'],
+ 'annotation': ['MusicNote', 'StickyNote'],
+ 'arrow': ['ChevronDoubleLeft', 'ChevronDoubleRight', 'ChevronDown', 'ChevronLeft', 'ChevronRight', 'ChevronUp'],
+ 'attention': ['AlertDiamond', 'AlertTriangle'],
+ 'audio': ['MusicNote', 'VolumeOff', 'VolumeOne', 'VolumeTwo'],
+ 'begin': ['Play'],
+ 'browser': ['WebNavBar', 'WebPage'],
+ 'call': ['DevicePhone'],
+ 'camera': ['Image', 'ImageAdd', 'ImageBackgroundRemove'],
+ 'cancel': ['Close', 'CloseCaptions', 'CloseCircle'],
+ 'caret': ['ArrowHeadTool', 'ChevronDoubleLeft', 'ChevronDoubleRight', 'ChevronDown', 'ChevronLeft', 'ChevronRight', 'ChevronUp'],
+ 'chat': ['Comment', 'CommentCheckmark', 'CommentHide', 'CommentRemove', 'CommentShow', 'CommentText', 'TextReplaceComment'],
+ 'chevron': ['ArrowHeadTool'],
+ 'clockwise': ['RotateCW'],
+ 'close': ['Cancel'],
+ 'comment': ['Feedback'],
+ 'confirm': ['CheckBox'],
+ 'connection': ['SocialNetwork'],
+ 'conversation': ['Chat'],
+ 'copy': ['Duplicate'],
+ 'counterclockwise': ['RotateCCW'],
+ 'create': ['Add', 'AddCircle', 'AddContent', 'CalendarAdd', 'DataAdd', 'FileAdd', 'FolderAdd', 'ImageAdd', 'New', 'ProjectAddInto', 'TextAdd', 'UserAdd'],
+ 'date': ['Calendar', 'CalendarAdd', 'CalendarDay', 'CalendarEdit', 'CalendarWeek'],
+ 'decrease': ['ChevronDown', 'OrderOneDown', 'SortDown', 'ThumbDown'],
+ 'delete': ['CommentRemove', 'ImageBackgroundRemove', 'RemoveCircle'],
+ 'developer': ['Code'],
+ 'diagram': ['ChartBarVert', 'ChartPie', 'ChartTrend'],
+ 'directory': ['Folder', 'FolderAdd', 'FolderBreadcrumb', 'FolderClock', 'FolderMoveTo', 'FolderOpen', 'FolderSearch'],
+ 'display': ['ViewGrid', 'ViewGridFluid', 'ViewList', 'ViewTransparency'],
+ 'doc': ['File', 'FileAdd', 'FileConvert', 'FileText', 'FileUser'],
+ 'document': ['File', 'FileAdd', 'FileConvert', 'FileText', 'FileUser'],
+ 'download': ['SaveFloppy'],
+ 'duplicate': ['Copy'],
+ 'edit': ['PenBrush'],
+ 'end': ['Cancel', 'Close', 'CloseCaptions', 'CloseCircle'],
+ 'enlarge': ['ZoomIn', 'ZoomOut'],
+ 'eye': ['ViewGrid', 'ViewGridFluid', 'ViewList', 'ViewTransparency'],
+ 'favorite': ['Heart', 'Star', 'StarFilled'],
+ 'feedback': ['Comment', 'CommentCheckmark', 'CommentHide', 'CommentRemove', 'CommentShow', 'CommentText', 'TextReplaceComment'],
+ 'film': ['MovieCamera', 'Video'],
+ 'find': ['FolderSearch', 'Search'],
+ 'finish': ['Close', 'CloseCaptions', 'CloseCircle'],
+ 'funnel': ['Filter'],
+ 'gear': ['DataSettings', 'Settings', 'TextVariableFontSettings', 'UserSettings'],
+ 'graph': ['ChartBarVert', 'ChartPie', 'ChartTrend'],
+ 'horizontal': ['RectangleHoriz', 'UnlinkHoriz'],
+ 'house': ['Home'],
+ 'image': ['Camera', 'CameraProperties', 'MovieCamera'],
+ 'increase': ['ChevronUp', 'OrderOneUp', 'SortUp', 'ThumbUp'],
+ 'information': ['InfoCircle'],
+ 'insert': ['Add', 'AddCircle', 'AddContent', 'CalendarAdd', 'DataAdd', 'FileAdd', 'FolderAdd', 'ImageAdd', 'New', 'ProjectAddInto', 'ProjectCreate', 'TextAdd', 'UserAdd'],
+ 'internet': ['WebNavBar', 'WebPage'],
+ 'keyboard': ['Key'],
+ 'label': ['Tag'],
+ 'like': ['Heart'],
+ 'list': ['MenuHamburger'],
+ 'location': ['PinOff', 'PinOn'],
+ 'lookup': ['FindAndReplace', 'FolderSearch', 'Search'],
+ 'love': ['Heart'],
+ 'lower': ['ChevronDown', 'OrderOneDown', 'SortDown', 'ThumbDown'],
+ 'magnify': ['FolderSearch', 'Search', 'ZoomIn', 'ZoomOut'],
+ 'map': ['Location', 'PinOff', 'PinOn'],
+ 'marker': ['Flag'],
+ 'member': ['FileUser', 'User', 'UserAdd', 'UserAvatar', 'UserAvatarCursor', 'UserEdit', 'UserFollowing', 'UserGroup', 'UserLock', 'UserSettings'],
+ 'menu': ['ListBulleted', 'ListMultiSelect', 'ListNumbered', 'ViewList'],
+ 'message': ['Chat', 'Comment', 'CommentCheckmark', 'CommentHide', 'CommentRemove', 'CommentShow', 'CommentText', 'TextReplaceComment'],
+ 'minus': ['CommentRemove', 'Delete', 'ImageBackgroundRemove', 'RemoveCircle'],
+ 'modify': ['CalendarEdit', 'Edit', 'EditNo', 'UserEdit'],
+ 'movie': ['Video'],
+ 'music': ['AudioWave'],
+ 'network': ['CloudStateSlowConnection', 'SlowConnectionCircle'],
+ 'new': ['Add', 'AddCircle', 'AddContent', 'CalendarAdd', 'DataAdd', 'FileAdd', 'FolderAdd', 'ImageAdd', 'ProjectAddInto', 'ProjectCreate', 'TextAdd', 'UserAdd'],
+ 'next': ['StepForward'],
+ 'online': ['Cloud', 'CloudStateDisconnected', 'CloudStateError', 'CloudStateInProgress', 'CloudStatePaused', 'CloudStatePending', 'CloudStateSlowConnection', 'UploadToCloud'],
+ 'options': ['DataSettings', 'PluginGear', 'Settings', 'TextVariableFontSettings', 'UserSettings'],
+ 'padlock': ['Lock', 'LockOpen', 'UserLock', 'UsersLock'],
+ 'person': ['FileUser', 'User', 'UserAdd', 'UserAvatar', 'UserAvatarCursor', 'UserEdit', 'UserFollowing', 'UserGroup', 'UserLock', 'UserSettings'],
+ 'phone': ['CallCenter'],
+ 'photo': ['Camera', 'CameraProperties', 'Image', 'ImageAdd', 'ImageBackgroundRemove', 'MovieCamera'],
+ 'picture': ['Camera', 'CameraProperties', 'Image', 'ImageAdd', 'ImageBackgroundRemove', 'MovieCamera'],
+ 'pin': ['Location'],
+ 'place': ['Location'],
+ 'plus': ['Add', 'AddCircle', 'AddContent', 'CalendarAdd', 'DataAdd', 'FileAdd', 'FolderAdd', 'ImageAdd', 'New', 'ProjectAddInto', 'TextAdd', 'UserAdd'],
+ 'profile': ['FileUser', 'User', 'UserAdd', 'UserAvatar', 'UserAvatarCursor', 'UserEdit', 'UserFollowing', 'UserGroup', 'UserLock', 'UserSettings'],
+ 'program': ['Code'],
+ 'raise': ['ChevronUp', 'OrderOneUp', 'SortUp', 'TextIncrease', 'ThumbUp'],
+ 'reload': ['DataRefresh', 'Refresh'],
+ 'remove': ['Delete'],
+ 'repeat': ['Redo'],
+ 'reverse': ['Undo'],
+ 'save': ['Download'],
+ 'schedule': ['Calendar', 'CalendarAdd', 'CalendarDay', 'CalendarEdit', 'CalendarWeek'],
+ 'script': ['Code'],
+ 'search': ['FindAndReplace'],
+ 'secure': ['Lock', 'LockOpen', 'UserLock', 'UsersLock'],
+ 'send': ['DataUpload', 'Share', 'ShareAndroid', 'Upload', 'UploadToCloud'],
+ 'settings': ['PluginGear'],
+ 'share': ['Send'],
+ 'sound': ['AudioWave', 'MusicNote', 'VolumeOff', 'VolumeOne', 'VolumeTwo'],
+ 'start': ['Play'],
+ 'stop': ['Cancel', 'Close', 'CloseCaptions', 'CloseCircle', 'Pause', 'PauseCircle'],
+ 'store': ['SaveFloppy'],
+ 'subtract': ['CommentRemove', 'Delete', 'ImageBackgroundRemove', 'RemoveCircle'],
+ 'telephone': ['CallCenter', 'DevicePhone'],
+ 'tick': ['CheckBox'],
+ 'time': ['Clock', 'ClockPending', 'FolderClock'],
+ 'trash': ['Delete'],
+ 'unlock': ['FolderOpen', 'LockOpen', 'OpenIn'],
+ 'up': ['TextIncrease'],
+ 'versus': ['Compare'],
+ 'vertical': ['ChartBarVert'],
+ 'video': ['MovieCamera'],
+ 'volume': ['AudioWave'],
+ 'vs': ['Compare'],
+ 'warning': ['AlertDiamond', 'AlertTriangle', 'CloudStateError'],
+ 'watch': ['Clock', 'ClockPending', 'FolderClock'],
+ 'wifi': ['SocialNetwork'],
+ 'wireless': ['SocialNetwork'],
+ 'write': ['CalendarEdit', 'Edit', 'EditNo', 'PenBrush', 'UserEdit']
+};
diff --git a/packages/dev/s2-docs/src/illustrationAliases.js b/packages/dev/s2-docs/src/illustrationAliases.js
new file mode 100644
index 00000000000..2c329cbc7ea
--- /dev/null
+++ b/packages/dev/s2-docs/src/illustrationAliases.js
@@ -0,0 +1,155 @@
+// Maps common terms to potentially relevant S2 illustrations.
+export const illustrationAliases = {
+ 'again': ['Redo'],
+ 'alert': ['Warning'],
+ 'announcement': ['MegaphonePromote', 'MegaphonePromoteExpressive'],
+ 'applications': ['Apps'],
+ 'audio': ['Microphone', 'MicrophoneOff', 'Volume', 'VolumeOff', 'VolumeOne'],
+ 'award': ['Trophy'],
+ 'badge': ['Ribbon'],
+ 'bag': ['ShoppingCart'],
+ 'banner': ['Flag', 'FlagCheckmark', 'FlagCross'],
+ 'basket': ['ShoppingCart'],
+ 'bookmark': ['Star'],
+ 'call': ['Phone'],
+ 'caret': ['ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp'],
+ 'cart': ['ShoppingBag'],
+ 'caution': ['AlertNotice', 'FileAlert', 'Warning'],
+ 'chain': ['Link'],
+ 'chat': ['CommentText', 'NoComment', 'Prompt', 'Conversationbubbles'],
+ 'chevron': ['ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp'],
+ 'cog': ['GearSetting'],
+ 'computer': ['Desktop', 'Laptop', 'Server'],
+ 'confirm': ['Check'],
+ 'convert': ['Transform'],
+ 'cut': ['Crop'],
+ 'date': ['Calendar'],
+ 'delete': ['Trash'],
+ 'device': ['Tablet'],
+ 'diagram': ['ChartAreaStack', 'GraphBarChart', 'PieChart'],
+ 'directory': ['FolderClose', 'FolderOpen', 'FolderShared'],
+ 'dismiss': ['Close', 'FolderClose', 'LockClose', 'MailClose'],
+ 'document': ['FileAlert', 'FileImage', 'FileText', 'FileVideo', 'FileZip', 'NoFile', 'NoSharedFile'],
+ 'earth': ['Globe', 'GlobeGrid'],
+ 'edit': ['Pencil'],
+ 'email': ['MailClose', 'MailOpen'],
+ 'emoticon': ['Emoji160'],
+ 'envelope': ['MailClose', 'MailOpen'],
+ 'error': ['Bug'],
+ 'extension': ['Plugin'],
+ 'favorite': ['Heart', 'Star'],
+ 'file': ['Document'],
+ 'film': ['FileVideo', 'MovieCamera', 'Video', 'Exposure'],
+ 'find': ['NoSearchResults', 'Search'],
+ 'flag': ['ReportAbuse'],
+ 'flash': ['Bolt'],
+ 'funnel': ['Filter', 'Filters', 'NoFilter'],
+ 'gem': ['Diamond'],
+ 'glitter': ['Sparkles'],
+ 'graph': ['ChartAreaStack', 'GraphBarChart', 'PieChart'],
+ 'graphics': ['VectorDraw'],
+ 'hold': ['Pause'],
+ 'host': ['Server'],
+ 'house': ['Home'],
+ 'hue': ['Color'],
+ 'idea': ['Lightbulb', 'LightbulbRays'],
+ 'info': ['Data', 'DataAnalytics'],
+ 'information': ['Data', 'DataAnalytics'],
+ 'insect': ['Bug'],
+ 'internet': ['Browser', 'BrowserError', 'BrowserNotCompatible'],
+ 'issue': ['BrowserError', 'CloudStateError', 'Error'],
+ 'jewel': ['Diamond'],
+ 'label': ['Tag'],
+ 'lamp': ['Lightbulb', 'LightbulbRays'],
+ 'launch': ['Rocket'],
+ 'learning': ['Education'],
+ 'letters': ['CommentText', 'FileText', 'Text'],
+ 'lightning': ['Bolt'],
+ 'loudspeaker': ['MegaphonePromote', 'MegaphonePromoteExpressive'],
+ 'love': ['Heart'],
+ 'magnify': ['NoSearchResults', 'Search'],
+ 'map': ['Location'],
+ 'marker': ['Flag', 'FlagCheckmark', 'FlagCross', 'Pin'],
+ 'measure': ['Ruler'],
+ 'melody': ['MusicNote'],
+ 'message': ['CommentText', 'NoComment', 'Chatbubble', 'Conversationbubbles'],
+ 'money': ['Wallet'],
+ 'motion': ['Animation'],
+ 'mouse': ['Cursor'],
+ 'move': ['Translate'],
+ 'movie': ['FileVideo', 'Video'],
+ 'music': ['AudioWave'],
+ 'network': ['Cloud', 'CloudStateDisconnected', 'CloudStateError', 'CloudUpload'],
+ 'none': ['NoBrands', 'NoComment', 'NoComments', 'NoElements', 'NoFile', 'NoFilter', 'NoImage', 'NoLibraries', 'NoLibrariesBrands', 'NoReviewLinks', 'NoSearchResults', 'NoSharedFile'],
+ 'not': ['NoBrands', 'NoComment', 'NoComments', 'NoElements', 'NoFile', 'NoFilter', 'NoImage', 'NoLibraries', 'NoLibrariesBrands', 'NoReviewLinks', 'NoSearchResults', 'NoSharedFile'],
+ 'notification': ['Bell'],
+ 'online': ['Cloud', 'CloudStateDisconnected', 'CloudStateError', 'CloudUpload'],
+ 'pad': ['Tablet'],
+ 'page': ['Document'],
+ 'paint': ['Brush'],
+ 'palm': ['Hand'],
+ 'partition': ['Segmentation'],
+ 'person': ['User', 'UserAvatar', 'UserGroup'],
+ 'photo': ['AIGenerateImage', 'Camera', 'FileImage', 'Image', 'ImageStack', 'MovieCamera', 'NoImage', 'Exposure'],
+ 'picture': ['AIGenerateImage', 'Camera', 'FileImage', 'Image', 'ImageStack', 'MovieCamera', 'NoImage', 'Exposure'],
+ 'pin': ['Location'],
+ 'place': ['Location'],
+ 'pointer': ['Cursor'],
+ 'portfolio': ['Briefcase'],
+ 'post': ['CloudUpload', 'DropToUpload', 'Upload', 'Paperairplane'],
+ 'present': ['Gift'],
+ 'problem': ['BrowserError', 'CloudStateError', 'Error'],
+ 'profile': ['UserAvatar'],
+ 'purse': ['Wallet'],
+ 'question': ['HelpCircle', 'Prompt'],
+ 'quick': ['SpeedFast'],
+ 'reduce': ['Minimize'],
+ 'refresh': ['Update'],
+ 'remove': ['Trash'],
+ 'repeat': ['Redo'],
+ 'sack': ['ShoppingBag'],
+ 'safe': ['LockClose', 'LockOpen'],
+ 'save': ['Download'],
+ 'savings': ['PiggyBank'],
+ 'schedule': ['Calendar'],
+ 'script': ['CodeBrackets'],
+ 'seal': ['StampClone'],
+ 'secure': ['LockClose', 'LockOpen'],
+ 'security': ['LockClose', 'LockOpen'],
+ 'send': ['CloudUpload', 'DropToUpload', 'EmptyStateExport', 'ExportTo', 'Upload', 'Paperairplane'],
+ 'settings': ['GearSetting'],
+ 'share': ['EmptyStateExport', 'ExportTo', 'Paperairplane'],
+ 'shift': ['Translate'],
+ 'shop': ['Market'],
+ 'slice': ['Segmentation'],
+ 'smiley': ['Emoji160'],
+ 'song': ['MusicNote'],
+ 'sound': ['AudioWave', 'Microphone', 'MicrophoneOff', 'Volume', 'VolumeOff', 'VolumeOne'],
+ 'spaceship': ['Rocket'],
+ 'spin': ['RotateCCW', 'RotateCW'],
+ 'stars': ['Sparkles'],
+ 'start': ['Play', 'PlayTriangle'],
+ 'stop': ['Close', 'FolderClose', 'LockClose', 'MailClose', 'Pause'],
+ 'store': ['Market'],
+ 'study': ['Education'],
+ 'support': ['HelpCircle'],
+ 'tag': ['Mention'],
+ 'telephone': ['Phone'],
+ 'tick': ['Check'],
+ 'time': ['Clock'],
+ 'timer': ['Stopwatch'],
+ 'toggle': ['Switch'],
+ 'tote': ['ShoppingBag'],
+ 'trim': ['Crop'],
+ 'trolley': ['ShoppingCart'],
+ 'turn': ['RotateCCW', 'RotateCW'],
+ 'undo': ['Revert'],
+ 'url': ['Link'],
+ 'video': ['MovieCamera', 'Filmstrip', 'Play', 'PlayTriangle'],
+ 'volume': ['AudioWave'],
+ 'warning': ['AlertNotice', 'FileAlert'],
+ 'watch': ['Clock'],
+ 'web': ['Browser', 'BrowserError', 'BrowserNotCompatible'],
+ 'world': ['Globe', 'GlobeGrid'],
+ 'write': ['Pencil']
+};
diff --git a/packages/react-aria-components/docs/ComboBoxAnatomy.svg b/packages/react-aria-components/docs/ComboBoxAnatomy.svg
index e84b856e360..5814f2f7d23 100644
--- a/packages/react-aria-components/docs/ComboBoxAnatomy.svg
+++ b/packages/react-aria-components/docs/ComboBoxAnatomy.svg
@@ -12,8 +12,8 @@
- Label
- Help text
+ Label
+ Help text
@@ -33,15 +33,15 @@
- Label
+ Label
- Input
+ Input
- Label
+ Label
@@ -58,12 +58,12 @@
- Op
+ Op
Help text (description or error message)
+or error message)" transform="translate(543 150)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Help text (description or error message)
@@ -71,14 +71,14 @@ or error message)" transform="translate(543 150)" fill="var(--anatomy-gray-700)"
- Op
+ Op
- Button
+ Button
@@ -91,10 +91,10 @@ or error message)" transform="translate(543 150)" fill="var(--anatomy-gray-700)"
- Option 1
- Option 2
+ Option 1
+ Option 2
- Item
+ Item
@@ -102,20 +102,20 @@ or error message)" transform="translate(543 150)" fill="var(--anatomy-gray-700)"
- Item label
+ Item label
- Description
- Description
- Option 3
- Description
+ Description
+ Description
+ Option 3
+ Description
- Item description
+ Item description
- SECTION TITLE
+ SECTION TITLE
-
+
@@ -124,14 +124,14 @@ or error message)" transform="translate(543 150)" fill="var(--anatomy-gray-700)"
- Section
+ Section
- Popover
+ Popover
- ListBox
+ ListBox
diff --git a/packages/react-aria-components/docs/DisclosureAnatomy.svg b/packages/react-aria-components/docs/DisclosureAnatomy.svg
index 0a0f10c9950..1c4430e4568 100644
--- a/packages/react-aria-components/docs/DisclosureAnatomy.svg
+++ b/packages/react-aria-components/docs/DisclosureAnatomy.svg
@@ -1,7 +1,7 @@
- Landscape
+ Landscape
@@ -11,9 +11,9 @@
- Button
- Landscape content
- Panel
+ Button
+ Landscape content
+ Panel
diff --git a/packages/react-aria-components/docs/DisclosureGroupAnatomy.svg b/packages/react-aria-components/docs/DisclosureGroupAnatomy.svg
index 63c7dc984c8..eb74aa7bc35 100644
--- a/packages/react-aria-components/docs/DisclosureGroupAnatomy.svg
+++ b/packages/react-aria-components/docs/DisclosureGroupAnatomy.svg
@@ -5,8 +5,8 @@
- Recent
- Abstract
+ Recent
+ Abstract
@@ -16,10 +16,10 @@
- Button
+ Button
Lorem ipsum dolor sit amet, consectetur adipiscing elit
- Panel
+consectetur adipiscing elit" transform="translate(120.791 96)" fill="var(--anatomy-gray-900)" font-size="14" font-family="var(--anatomy-font)" font-weight="400">Lorem ipsum dolor sit amet, consectetur adipiscing elit
+ Panel
@@ -28,5 +28,5 @@ consectetur adipiscing elit" transform="translate(120.791 96)" fill="var(--anato
- Group
+ Group
diff --git a/packages/react-aria-components/docs/GridListAnatomy.svg b/packages/react-aria-components/docs/GridListAnatomy.svg
index eb67513b883..d46fe9b74e7 100644
--- a/packages/react-aria-components/docs/GridListAnatomy.svg
+++ b/packages/react-aria-components/docs/GridListAnatomy.svg
@@ -6,7 +6,7 @@
- Documents
+ Documents
@@ -51,7 +51,7 @@
- Item
+ Item
@@ -111,7 +111,7 @@
Selection checkbox
+checkbox" transform="translate(330 -344.5)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Selection checkbox
@@ -120,7 +120,7 @@ checkbox" transform="translate(330 -344.5)" fill="var(--anatomy-gray-700)" font-
Drag button
+button" transform="translate(345 -344.5)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Drag button
@@ -133,25 +133,25 @@ button" transform="translate(345 -344.5)" fill="var(--anatomy-gray-700)" font-si
- 12 items
+ 12 items
- Onboarding
- PDF
+ Onboarding
+ PDF
- Budget
- XLS
+ Budget
+ XLS
- Sales Pitch
- PPT
+ Sales Pitch
+ PPT
@@ -167,7 +167,7 @@ button" transform="translate(345 -344.5)" fill="var(--anatomy-gray-700)" font-si
Drag button
+button" transform="translate(345 -344.5)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Drag button
diff --git a/packages/react-aria-components/docs/ListBoxAnatomy.svg b/packages/react-aria-components/docs/ListBoxAnatomy.svg
index 6328f7c7388..0a733fc042a 100644
--- a/packages/react-aria-components/docs/ListBoxAnatomy.svg
+++ b/packages/react-aria-components/docs/ListBoxAnatomy.svg
@@ -8,10 +8,10 @@
- Option 1
- Option 2
+ Option 1
+ Option 2
- Item
+ Item
@@ -19,20 +19,20 @@
- Item label
+ Item label
- Description
- Description
- Option 3
- Description
+ Description
+ Description
+ Option 3
+ Description
- Item description
+ Item description
- SECTION TITLE
+ SECTION TITLE
-
+
@@ -41,6 +41,6 @@
- Section
+ Section
diff --git a/packages/react-aria-components/docs/MenuAnatomy.svg b/packages/react-aria-components/docs/MenuAnatomy.svg
index 067c4b03d60..dc856721b4a 100644
--- a/packages/react-aria-components/docs/MenuAnatomy.svg
+++ b/packages/react-aria-components/docs/MenuAnatomy.svg
@@ -21,49 +21,49 @@
-
+
Option 1
-
+
Option 2
-
+
Menu item
-
+
Menu item keyboard shortcut
-
+
Menu item label
-
+
Description
-
+
Description
-
+
Option 3
-
+
Description
-
+
Menu item description
-
+
Menu
-
+
SECTION TITLE
-
+
Section header
@@ -73,19 +73,19 @@
-
+
Section
⌘
- K
+ K
-
+
Menu item description
- Popover
+ Popover
@@ -108,12 +108,12 @@
-
+
More Actions
-
+
Menu Trigger
diff --git a/packages/react-aria-components/docs/SelectAnatomy.svg b/packages/react-aria-components/docs/SelectAnatomy.svg
index 0aecc9879eb..3b866c6bac2 100644
--- a/packages/react-aria-components/docs/SelectAnatomy.svg
+++ b/packages/react-aria-components/docs/SelectAnatomy.svg
@@ -19,8 +19,8 @@
- Option 1
- Option 1
+ Option 1
+ Option 1
@@ -29,18 +29,18 @@
- Label
- Label
+ Label
+ Label
- Button
+ Button
- Label
+ Label
- Label
+ Label
@@ -54,10 +54,10 @@
- Option 1
- Option 2
+ Option 1
+ Option 2
- Item
+ Item
@@ -65,20 +65,20 @@
- Item label
+ Item label
- Description
- Description
- Option 3
- Description
+ Description
+ Description
+ Option 3
+ Description
- Item description
+ Item description
- SECTION TITLE
+ SECTION TITLE
-
+
@@ -87,25 +87,25 @@
- Section
+ Section
- Popover
+ Popover
- ListBox
+ ListBox
- Value
+ Value
- Help text
+ Help text
Help text (description or error message)
+or error message)" transform="translate(521 211.5)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Help text (description or error message)
diff --git a/packages/react-aria-components/docs/TableAnatomy.svg b/packages/react-aria-components/docs/TableAnatomy.svg
index ba4fafef4e9..8550fbc83c5 100644
--- a/packages/react-aria-components/docs/TableAnatomy.svg
+++ b/packages/react-aria-components/docs/TableAnatomy.svg
@@ -2,29 +2,29 @@
- Column
+ Column
- Size
+ Size
- 214 KB
+ 214 KB
- 120 KB
- 88 KB
- 24 KB
- Proposal
- Budget
- Welcome
- Onboarding
- File name
+ 120 KB
+ 88 KB
+ 24 KB
+ Proposal
+ Budget
+ Welcome
+ Onboarding
+ File name
- Cell
+ Cell
@@ -74,7 +74,7 @@
Select all checkbox
+checkbox" transform="translate(402 -355)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Select all checkbox
@@ -86,7 +86,7 @@ checkbox" transform="translate(402 -355)" fill="var(--anatomy-gray-700)" font-si
- Table body
+ Table body
@@ -95,7 +95,7 @@ checkbox" transform="translate(402 -355)" fill="var(--anatomy-gray-700)" font-si
-
+
@@ -106,7 +106,7 @@ checkbox" transform="translate(402 -355)" fill="var(--anatomy-gray-700)" font-si
- Row
+ Row
@@ -166,7 +166,7 @@ checkbox" transform="translate(402 -355)" fill="var(--anatomy-gray-700)" font-si
Selection checkbox
+checkbox" transform="translate(330 -344.5)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Selection checkbox
@@ -175,7 +175,7 @@ checkbox" transform="translate(330 -344.5)" fill="var(--anatomy-gray-700)" font-
Drag button
+button" transform="translate(345 -344.5)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Drag button
@@ -187,7 +187,7 @@ button" transform="translate(345 -344.5)" fill="var(--anatomy-gray-700)" font-si
Column resizer
+resizer" transform="translate(412 -355)" fill="var(--anatomy-gray-700)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Column resizer
diff --git a/packages/react-aria-components/docs/Tree.mdx b/packages/react-aria-components/docs/Tree.mdx
index 85cd1ef2c96..f27ad710d5a 100644
--- a/packages/react-aria-components/docs/Tree.mdx
+++ b/packages/react-aria-components/docs/Tree.mdx
@@ -668,7 +668,7 @@ Items may also have an action specified by directly applying `onAction` on the `
Tree items may also be links to another page or website. This can be achieved by passing the `href` prop to the `` component. Links behave the same way as described above for item actions depending on the `selectionMode` and `selectionBehavior`.
```tsx example
-
+
({
async load({signal, cursor}) {
if (cursor) {
diff --git a/packages/react-aria-components/docs/TreeAnatomy.svg b/packages/react-aria-components/docs/TreeAnatomy.svg
index 2b4e528c745..9616c3d6146 100644
--- a/packages/react-aria-components/docs/TreeAnatomy.svg
+++ b/packages/react-aria-components/docs/TreeAnatomy.svg
@@ -13,7 +13,7 @@
- Documents
+ Documents
@@ -58,8 +58,8 @@
- TreeItem
- Checkbox (optional)
+ TreeItem
+ Checkbox (optional)
@@ -67,25 +67,25 @@
- 12 items
+ 12 items
- Onboarding
- PDF
+ Onboarding
+ PDF
- Budget
- XLS
+ Budget
+ XLS
- Sales Pitch
- PPT
+ Sales Pitch
+ PPT
@@ -100,7 +100,7 @@
Collapse and expand button
+expand button" transform="translate(274 124.892)" fill="var(--anatomy-gray-800)" font-size="13" font-family="var(--anatomy-font)" font-style="italic">Collapse and expand button
@@ -118,7 +118,7 @@ expand button" transform="translate(274 124.892)" fill="var(--anatomy-gray-800)"
- Tree
+ Tree
diff --git a/packages/react-aria-components/src/ProgressBar.tsx b/packages/react-aria-components/src/ProgressBar.tsx
index 58e073fc1ea..a11bdd580f3 100644
--- a/packages/react-aria-components/src/ProgressBar.tsx
+++ b/packages/react-aria-components/src/ProgressBar.tsx
@@ -24,7 +24,7 @@ export interface ProgressBarRenderProps {
/**
* The value as a percentage between the minimum and maximum.
*/
- percentage?: number,
+ percentage: number | undefined,
/**
* A formatted version of the value.
* @selector [aria-valuetext]
diff --git a/packages/react-aria-components/src/Tree.tsx b/packages/react-aria-components/src/Tree.tsx
index 701ad3fc921..232a4956459 100644
--- a/packages/react-aria-components/src/Tree.tsx
+++ b/packages/react-aria-components/src/Tree.tsx
@@ -13,9 +13,9 @@
import {AriaTreeItemOptions, AriaTreeProps, DraggableItemResult, DropIndicatorAria, DropIndicatorProps, DroppableCollectionResult, FocusScope, ListKeyboardDelegate, mergeProps, useCollator, useFocusRing, useGridListSelectionCheckbox, useHover, useId, useLocale, useTree, useTreeItem, useVisuallyHidden} from 'react-aria';
import {ButtonContext} from './Button';
import {CheckboxContext} from './RSPContexts';
+import {ChildrenOrFunction, ContextValue, DEFAULT_SLOT, Provider, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
import {Collection, CollectionBuilder, CollectionNode, createBranchComponent, createLeafComponent, LoaderNode, useCachedChildren} from '@react-aria/collections';
import {CollectionProps, CollectionRendererContext, DefaultCollectionRenderer, ItemRenderProps} from './Collection';
-import {ContextValue, DEFAULT_SLOT, Provider, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
import {DisabledBehavior, DragPreviewRenderer, Expandable, forwardRefType, GlobalDOMAttributes, HoverEvents, Key, LinkDOMProps, MultipleSelection, PressEvents, RefObject, SelectionMode} from '@react-types/shared';
import {DragAndDropContext, DropIndicatorContext, useDndPersistedKeys, useRenderDropIndicator} from './DragAndDrop';
import {DragAndDropHooks} from './useDragAndDrop';
@@ -720,7 +720,7 @@ export interface TreeLoadMoreItemProps extends Omit ReactNode),
+ children?: ChildrenOrFunction,
/**
* Whether or not the loading spinner should be rendered or not.
*/
diff --git a/packages/react-aria-components/src/utils.tsx b/packages/react-aria-components/src/utils.tsx
index 221aa5f518e..f0bad80ae4d 100644
--- a/packages/react-aria-components/src/utils.tsx
+++ b/packages/react-aria-components/src/utils.tsx
@@ -73,7 +73,7 @@ export interface StyleRenderProps {
style?: StyleOrFunction
}
-type ChildrenOrFunction = ReactNode | ((values: T & {defaultChildren: ReactNode | undefined}) => ReactNode);
+export type ChildrenOrFunction = ReactNode | ((values: T & {defaultChildren: ReactNode | undefined}) => ReactNode);
export interface RenderProps extends StyleRenderProps {
/** The children of the component. A function may be provided to alter the children based on component state. */
diff --git a/starters/docs/src/Autocomplete.tsx b/starters/docs/src/Autocomplete.tsx
index b8626002efb..286cce2089f 100644
--- a/starters/docs/src/Autocomplete.tsx
+++ b/starters/docs/src/Autocomplete.tsx
@@ -17,10 +17,11 @@ export interface AutocompleteProps
items?: Iterable;
children: React.ReactNode | ((item: T) => React.ReactNode);
onAction?: (id: Key) => void;
+ renderEmptyState?: () => React.ReactNode
}
export function Autocomplete(
- { label, placeholder, items, children, onAction, ...props }:
+ { label, placeholder, items, children, onAction, renderEmptyState, ...props }:
AutocompleteProps
) {
let { contains } = useFilter({ sensitivity: 'base' });
@@ -29,7 +30,7 @@ export function Autocomplete(
-
+
{children}
diff --git a/starters/docs/src/Breadcrumbs.css b/starters/docs/src/Breadcrumbs.css
index 0964ebba054..951d9aa6b38 100644
--- a/starters/docs/src/Breadcrumbs.css
+++ b/starters/docs/src/Breadcrumbs.css
@@ -9,11 +9,9 @@
font-size: 18px;
color: var(--text-color);
- .react-aria-Breadcrumb:not(:last-child)::after {
- content: '›';
- content: '›' / '';
- alt: ' ';
- padding: 0 5px;
+ .react-aria-Breadcrumb {
+ display: flex;
+ align-items: center;
}
.react-aria-Link {
diff --git a/starters/docs/src/Breadcrumbs.tsx b/starters/docs/src/Breadcrumbs.tsx
index 54caf382379..6121ab3c79b 100644
--- a/starters/docs/src/Breadcrumbs.tsx
+++ b/starters/docs/src/Breadcrumbs.tsx
@@ -1,11 +1,19 @@
'use client';
-import {Breadcrumbs as RACBreadcrumbs, BreadcrumbsProps, Breadcrumb as RACBreadcrumb, BreadcrumbProps} from 'react-aria-components';
+import {Breadcrumbs as RACBreadcrumbs, BreadcrumbsProps, Breadcrumb as RACBreadcrumb, BreadcrumbProps, LinkProps, Link} from 'react-aria-components';
+import {ChevronRight} from 'lucide-react';
import './Breadcrumbs.css';
export function Breadcrumbs
(props: BreadcrumbsProps) {
return ;
}
-export function Breadcrumb(props: BreadcrumbProps) {
- return ;
+export function Breadcrumb(props: BreadcrumbProps & Omit) {
+ return (
+
+ {({isCurrent}) => (<>
+
+ {!isCurrent && }
+ >)}
+
+ );
}
diff --git a/starters/docs/src/Button.tsx b/starters/docs/src/Button.tsx
index 3520c7223ad..e976a2b7c04 100644
--- a/starters/docs/src/Button.tsx
+++ b/starters/docs/src/Button.tsx
@@ -1,7 +1,19 @@
'use client';
-import {Button as RACButton, ButtonProps} from 'react-aria-components';
+import {Button as RACButton, ButtonProps, composeRenderProps} from 'react-aria-components';
+import {ProgressCircle} from './ProgressCircle';
import './Button.css';
export function Button(props: ButtonProps) {
- return ;
+ return (
+
+ {composeRenderProps(props.children, (children, {isPending}) => (
+ <>
+ {!isPending && children}
+ {isPending && (
+
+ )}
+ >
+ ))}
+
+ );
}
diff --git a/starters/docs/src/Calendar.css b/starters/docs/src/Calendar.css
index 5fac2f2e809..08aad0b450e 100644
--- a/starters/docs/src/Calendar.css
+++ b/starters/docs/src/Calendar.css
@@ -18,7 +18,8 @@
}
}
- .react-aria-Button {
+ .react-aria-Button[slot=previous],
+ .react-aria-Button[slot=next] {
width: 1.75rem;
height: 1.75rem;
padding: 0;
diff --git a/starters/docs/src/ComboBox.tsx b/starters/docs/src/ComboBox.tsx
index e064a6c657a..c9ad4ea8221 100644
--- a/starters/docs/src/ComboBox.tsx
+++ b/starters/docs/src/ComboBox.tsx
@@ -28,18 +28,20 @@ export function ComboBox(
return (
(
- {label}
-
-
-
-
- {description && {description} }
- {errorMessage}
-
-
- {children}
-
-
+ {({isInvalid}) => (<>
+ {label}
+
+
+
+
+ {description && !isInvalid && {description} }
+ {errorMessage}
+
+
+ {children}
+
+
+ >)}
)
);
diff --git a/starters/docs/src/DateField.css b/starters/docs/src/DateField.css
index c45e77b6ee1..b7de2feec2f 100644
--- a/starters/docs/src/DateField.css
+++ b/starters/docs/src/DateField.css
@@ -21,6 +21,17 @@
outline: 2px solid var(--focus-ring-color);
outline-offset: -1px;
}
+
+ &[data-disabled] {
+ border-color: var(--border-color-disabled);
+ color: var(--text-color-disabled);
+ }
+}
+
+.react-aria-DateField[data-disabled] {
+ .react-aria-DateSegment {
+ color: var(--text-color-disabled);
+ }
}
.react-aria-DateSegment {
diff --git a/starters/docs/src/DatePicker.tsx b/starters/docs/src/DatePicker.tsx
index 0b421fcf0f2..6eded1646ee 100644
--- a/starters/docs/src/DatePicker.tsx
+++ b/starters/docs/src/DatePicker.tsx
@@ -16,15 +16,14 @@ import {ChevronDown} from 'lucide-react';
import './DatePicker.css';
-export interface DatePickerProps
- extends AriaDatePickerProps {
+export interface DatePickerProps extends AriaDatePickerProps {
label?: string;
description?: string;
errorMessage?: string | ((validation: ValidationResult) => string);
}
export function DatePicker(
- { label, description, errorMessage, firstDayOfWeek, ...props }:
+ { label, description, errorMessage, ...props }:
DatePickerProps
) {
return (
@@ -40,7 +39,7 @@ export function DatePicker(
{description && {description} }
{errorMessage}
-
+
)
diff --git a/starters/docs/src/DateRangePicker.css b/starters/docs/src/DateRangePicker.css
index ded736141e1..971af2700a4 100644
--- a/starters/docs/src/DateRangePicker.css
+++ b/starters/docs/src/DateRangePicker.css
@@ -47,7 +47,9 @@
min-width: unset;
padding: unset;
border: unset;
- outline: unset;
+ &[data-focus-within] {
+ outline: unset;
+ }
}
&[data-invalid] {
diff --git a/starters/docs/src/DateRangePicker.tsx b/starters/docs/src/DateRangePicker.tsx
index f0be03f7d55..9de0ab7e10c 100644
--- a/starters/docs/src/DateRangePicker.tsx
+++ b/starters/docs/src/DateRangePicker.tsx
@@ -23,7 +23,7 @@ export interface DateRangePickerProps
}
export function DateRangePicker(
- { label, description, errorMessage, firstDayOfWeek, ...props }:
+ { label, description, errorMessage, ...props }:
DateRangePickerProps
) {
return (
@@ -43,7 +43,7 @@ export function DateRangePicker(
{description && {description} }
{errorMessage}
-
+
)
diff --git a/starters/docs/src/Disclosure.css b/starters/docs/src/Disclosure.css
index 63a9481be8c..f42aa703aff 100644
--- a/starters/docs/src/Disclosure.css
+++ b/starters/docs/src/Disclosure.css
@@ -1,6 +1,13 @@
@import "./theme.css";
.react-aria-Disclosure {
+ width: 100%;
+
+ .react-aria-Heading {
+ margin: 0;
+ padding: 0.5em 0;
+ }
+
.react-aria-Button[slot=trigger] {
background: none;
border: none;
diff --git a/starters/docs/src/Disclosure.tsx b/starters/docs/src/Disclosure.tsx
index bbed0753e1c..559b4de8a6e 100644
--- a/starters/docs/src/Disclosure.tsx
+++ b/starters/docs/src/Disclosure.tsx
@@ -2,33 +2,34 @@
import {
Button,
Disclosure as AriaDisclosure,
- DisclosurePanel,
- DisclosureProps as AriaDisclosureProps,
+ DisclosurePanel as AriaDisclosurePanel,
+ DisclosureProps,
+ DisclosurePanelProps,
+ HeadingProps,
} from 'react-aria-components';
import {Heading} from './Content';
import {ChevronRight} from 'lucide-react';
-
import './Disclosure.css';
-export interface DisclosureProps extends Omit {
- title?: string;
- children?: React.ReactNode;
+export function Disclosure(props: DisclosureProps) {
+ return ;
+}
+
+export function DisclosureHeader({children, ...props}: HeadingProps) {
+ return (
+
+
+
+ {children}
+
+
+ );
}
-export function Disclosure({ title, children, ...props }: DisclosureProps) {
+export function DisclosurePanel(props: DisclosurePanelProps) {
return (
- (
-
-
-
-
- {title}
-
-
-
- {children}
-
-
- )
+
+ {props.children}
+
);
}
diff --git a/starters/docs/src/DisclosureGroup.css b/starters/docs/src/DisclosureGroup.css
index 1f5989a0fef..f5460549745 100644
--- a/starters/docs/src/DisclosureGroup.css
+++ b/starters/docs/src/DisclosureGroup.css
@@ -1 +1,5 @@
@import "./theme.css";
+
+.react-aria-DisclosureGroup {
+ width: 100%;
+}
diff --git a/starters/docs/src/DropZone.css b/starters/docs/src/DropZone.css
new file mode 100644
index 00000000000..ce4030d364f
--- /dev/null
+++ b/starters/docs/src/DropZone.css
@@ -0,0 +1,33 @@
+@import "./theme.css";
+
+.react-aria-DropZone {
+ color: var(--text-color);
+ background: var(--overlay-background);
+ border: 1px solid var(--border-color);
+ forced-color-adjust: none;
+ border-radius: 4px;
+ appearance: none;
+ vertical-align: middle;
+ font-size: 1rem;
+ line-height: 1.5;
+ text-align: center;
+ margin: 0;
+ outline: none;
+ padding: 24px 12px;
+ width: 30%;
+ min-height: 96px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-wrap: balance;
+
+ &[data-focus-visible],
+ &[data-drop-target] {
+ outline: 2px solid var(--focus-ring-color);
+ outline-offset: -1px;
+ }
+
+ &[data-drop-target] {
+ background: var(--highlight-overlay);
+ }
+}
diff --git a/starters/docs/src/DropZone.tsx b/starters/docs/src/DropZone.tsx
new file mode 100644
index 00000000000..fe5fc449db3
--- /dev/null
+++ b/starters/docs/src/DropZone.tsx
@@ -0,0 +1,7 @@
+'use client';
+import {DropZoneProps, DropZone as RACDropZone} from 'react-aria-components';
+import './DropZone.css'
+
+export function DropZone(props: DropZoneProps) {
+ return ;
+}
diff --git a/starters/docs/src/Form.css b/starters/docs/src/Form.css
index 67c76dbf179..c319c6172b5 100644
--- a/starters/docs/src/Form.css
+++ b/starters/docs/src/Form.css
@@ -15,7 +15,7 @@
max-width: 250px;
outline: none;
- &:focus-visible {
+ &:focus {
outline: 2px solid var(--focus-ring-color);
outline-offset: 2px;
}
diff --git a/starters/docs/src/GridList.css b/starters/docs/src/GridList.css
index 65babe75fed..5aece571555 100644
--- a/starters/docs/src/GridList.css
+++ b/starters/docs/src/GridList.css
@@ -185,3 +185,11 @@
margin-bottom: -2px;
}
}
+
+.react-aria-GridListLoadingIndicator {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 24px;
+ width: 100%;
+}
diff --git a/starters/docs/src/InputGroup.css b/starters/docs/src/InputGroup.css
new file mode 100644
index 00000000000..3ee8563f912
--- /dev/null
+++ b/starters/docs/src/InputGroup.css
@@ -0,0 +1,54 @@
+@import "./theme.css";
+
+.input-group {
+ .react-aria-Group {
+ display: flex;
+ align-items: center;
+ width: fit-content;
+ border-radius: 6px;
+ border: 1px solid var(--border-color);
+ background: var(--field-background);
+ overflow: hidden;
+ transition: all 200ms;
+
+ &[data-hovered] {
+ border-color: var(--border-color-hover);
+ }
+
+ &[data-focus-within] {
+ outline: 2px solid var(--focus-ring-color);
+ outline-offset: -1px;
+ }
+
+ &[data-invalid] {
+ border-color: var(--invalid-color);
+ }
+
+ &[data-disabled] {
+ border-color: var(--border-color-disabled);
+ color: var(--text-color-disabled);
+ }
+ }
+
+ .react-aria-Input {
+ padding: 0.286rem;
+ margin: 0;
+ font-size: 1rem;
+ color: var(--text-color);
+ outline: none;
+ border: none;
+ background: transparent;
+
+ &:disabled {
+ color: var(--text-color-disabled);
+ &::placeholder {
+ color: var(--text-color-disabled);
+ }
+ }
+
+ &::placeholder {
+ color: var(--text-color-placeholder);
+ opacity: 1;
+ }
+ }
+}
diff --git a/starters/docs/src/InputGroup.tsx b/starters/docs/src/InputGroup.tsx
new file mode 100644
index 00000000000..e6cb88d102a
--- /dev/null
+++ b/starters/docs/src/InputGroup.tsx
@@ -0,0 +1,24 @@
+'use client';
+import {composeRenderProps, Group, GroupProps, InputContext} from 'react-aria-components';
+import {useId} from 'react';
+import './InputGroup.css';
+
+interface InputGroupProps extends GroupProps {
+ label?: string
+}
+
+export function InputGroup(props: InputGroupProps) {
+ let id = useId();
+ return (
+
+ {props.label && {props.label} }
+
+ {composeRenderProps(props.children, (children, renderProps) => (
+
+ {children}
+
+ ))}
+
+
+ );
+}
diff --git a/starters/docs/src/ListBox.css b/starters/docs/src/ListBox.css
index 738c071e905..62043da1b33 100644
--- a/starters/docs/src/ListBox.css
+++ b/starters/docs/src/ListBox.css
@@ -29,6 +29,7 @@
.react-aria-Header {
font-size: 1.000125rem;
font-weight: bold;
+ font-variation-settings: initial;
padding: 0 0.6247499999999999rem;
}
@@ -206,3 +207,11 @@
.react-aria-DropIndicator[data-drop-target] {
outline: 1px solid var(--highlight-background);
}
+
+.react-aria-ListBoxLoadingIndicator {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 24px;
+ width: 100%;
+}
diff --git a/starters/docs/src/ListBox.tsx b/starters/docs/src/ListBox.tsx
index 4a448121676..d077c1a81da 100644
--- a/starters/docs/src/ListBox.tsx
+++ b/starters/docs/src/ListBox.tsx
@@ -2,8 +2,10 @@
import {
ListBox as AriaListBox,
ListBoxItem as AriaListBoxItem,
+ ListBoxSection as AriaListBoxSection,
ListBoxItemProps,
- ListBoxProps
+ ListBoxProps,
+ ListBoxSectionProps
} from 'react-aria-components';
import './ListBox.css';
@@ -23,3 +25,7 @@ export function ListBox(
export function ListBoxItem(props: ListBoxItemProps) {
return ;
}
+
+export function ListBoxSection(props: ListBoxSectionProps) {
+ return ;
+}
diff --git a/starters/docs/src/Menu.css b/starters/docs/src/Menu.css
index b93d0e72cf4..1ac8a5924d7 100644
--- a/starters/docs/src/Menu.css
+++ b/starters/docs/src/Menu.css
@@ -77,6 +77,12 @@
}
}
+.react-aria-Separator {
+ margin: 6px 8px;
+ border: 0;
+ border-top: 1px solid var(--border-color);
+}
+
.react-aria-MenuItem {
[slot=label] {
font-weight: bold;
diff --git a/starters/docs/src/Modal.css b/starters/docs/src/Modal.css
index f3170ad58c9..b3467c8a304 100644
--- a/starters/docs/src/Modal.css
+++ b/starters/docs/src/Modal.css
@@ -11,6 +11,8 @@
align-items: center;
justify-content: center;
z-index: 100;
+ font-family: system-ui;
+ font-size: 0.875rem;
&[data-entering] {
animation: modal-fade 200ms;
diff --git a/starters/docs/src/Popover.css b/starters/docs/src/Popover.css
index 40ecd53fff6..b28417b9dfc 100644
--- a/starters/docs/src/Popover.css
+++ b/starters/docs/src/Popover.css
@@ -12,6 +12,9 @@
outline: none;
max-width: 250px;
transition: transform 200ms, opacity 200ms;
+ font-family: system-ui;
+ font-size: 0.875rem;
+ padding: 8px;
.react-aria-OverlayArrow svg {
display: block;
@@ -70,3 +73,8 @@
}
}
}
+
+/* Extra padding for custom trigger example content */
+.react-aria-Popover :where(p, div) {
+ margin: 0;
+}
diff --git a/starters/docs/src/ProgressBar.tsx b/starters/docs/src/ProgressBar.tsx
index d9c6b53d7a0..1862f0869f5 100644
--- a/starters/docs/src/ProgressBar.tsx
+++ b/starters/docs/src/ProgressBar.tsx
@@ -14,12 +14,12 @@ export function ProgressBar({ label, ...props }: ProgressBarProps) {
return (
(
- {({ percentage, valueText }) => (
+ {({ percentage, valueText, isIndeterminate }) => (
<>
{label}
{valueText}
>
)}
diff --git a/starters/docs/src/ProgressCircle.tsx b/starters/docs/src/ProgressCircle.tsx
new file mode 100644
index 00000000000..c03a60175c0
--- /dev/null
+++ b/starters/docs/src/ProgressCircle.tsx
@@ -0,0 +1,65 @@
+'use client';
+import {composeRenderProps, ProgressBar} from 'react-aria-components';
+import type {ProgressBarProps} from 'react-aria-components';
+
+export interface ProgressCircleProps extends ProgressBarProps {
+ size?: number
+}
+
+export function ProgressCircle(props: ProgressCircleProps) {
+ // SVG strokes are centered, so subtract half the stroke width from the radius to create an inner stroke.
+ let strokeWidth = 4;
+ let radius = `calc(50% - ${strokeWidth / 2}px)`;
+
+ return (
+ ({
+ ...style,
+ width: props.size || 16,
+ height: props.size || 16
+ }))}>
+ {({percentage, isIndeterminate}) => (
+ <>
+
+
+
+ {isIndeterminate &&
+
+ }
+
+
+ >
+ )}
+
+ );
+}
diff --git a/starters/docs/src/RadioGroup.css b/starters/docs/src/RadioGroup.css
index 1d0ec4b619b..1c047bfba09 100644
--- a/starters/docs/src/RadioGroup.css
+++ b/starters/docs/src/RadioGroup.css
@@ -9,11 +9,6 @@
[slot=description] {
font-size: 12px;
}
-
- &[data-orientation=horizontal] {
- flex-direction: row;
- align-items: center;
- }
}
.react-aria-Radio {
@@ -76,3 +71,16 @@
}
}
}
+
+.react-aria-RadioGroup .radio-items {
+ display: flex;
+ gap: 8px;
+}
+
+.react-aria-RadioGroup[data-orientation=vertical] .radio-items {
+ flex-direction: column;
+}
+
+.react-aria-RadioGroup[data-orientation=horizontal] .radio-items {
+ flex-direction: row;
+}
diff --git a/starters/docs/src/RadioGroup.tsx b/starters/docs/src/RadioGroup.tsx
index b006648446c..ef9af5ec468 100644
--- a/starters/docs/src/RadioGroup.tsx
+++ b/starters/docs/src/RadioGroup.tsx
@@ -30,7 +30,9 @@ export function RadioGroup(
(
{label}
- {children}
+
+ {children}
+
{description && {description} }
{errorMessage}
diff --git a/starters/docs/src/RangeCalendar.css b/starters/docs/src/RangeCalendar.css
index d11169787a5..9535523e0f0 100644
--- a/starters/docs/src/RangeCalendar.css
+++ b/starters/docs/src/RangeCalendar.css
@@ -18,7 +18,8 @@
}
}
- .react-aria-Button {
+ .react-aria-Button[slot=previous],
+ .react-aria-Button[slot=next] {
width: 1.75rem;
height: 1.75rem;
padding: 0;
diff --git a/starters/docs/src/Sheet.css b/starters/docs/src/Sheet.css
new file mode 100644
index 00000000000..f45ac22f247
--- /dev/null
+++ b/starters/docs/src/Sheet.css
@@ -0,0 +1,58 @@
+.sheet-overlay {
+ position: fixed;
+ inset: 0;
+ background: rgba(0 0 0 / .3);
+ backdrop-filter: blur(10px);
+
+ &[data-entering] {
+ animation: sheet-blur 300ms;
+ }
+
+ &[data-exiting] {
+ animation: sheet-blur 300ms reverse ease-in;
+ }
+}
+
+.sheet {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ width: 300px;
+ background: var(--overlay-background);
+ outline: none;
+ border-left: 1px solid var(--border-color);
+ box-shadow: -8px 0 20px rgba(0 0 0 / 0.1);
+ font-family: system-ui;
+ font-size: 0.875rem;
+
+ &[data-entering] {
+ animation: sheet-slide 300ms;
+ }
+
+ &[data-exiting] {
+ animation: sheet-slide 300ms reverse ease-in;
+ }
+}
+
+@keyframes sheet-blur {
+ from {
+ background: rgba(0 0 0 / 0);
+ backdrop-filter: blur(0);
+ }
+
+ to {
+ background: rgba(0 0 0 / .3);
+ backdrop-filter: blur(10px);
+ }
+}
+
+@keyframes sheet-slide {
+ from {
+ transform: translateX(100%);
+ }
+
+ to {
+ transform: translateX(0);
+ }
+}
diff --git a/starters/docs/src/Sheet.tsx b/starters/docs/src/Sheet.tsx
new file mode 100644
index 00000000000..9ee5ad30701
--- /dev/null
+++ b/starters/docs/src/Sheet.tsx
@@ -0,0 +1,18 @@
+'use client';
+import {Modal, ModalOverlay, ModalOverlayProps, composeRenderProps} from 'react-aria-components';
+import {Dialog} from './Dialog';
+import './Sheet.css';
+
+export function Sheet(props: ModalOverlayProps) {
+ return (
+
+ {composeRenderProps(props.children, children => (
+
+
+ {children}
+
+
+ ))}
+
+ );
+}
diff --git a/starters/docs/src/Table.css b/starters/docs/src/Table.css
index 714d6837926..e4f1483d6e4 100644
--- a/starters/docs/src/Table.css
+++ b/starters/docs/src/Table.css
@@ -13,6 +13,10 @@
word-break: break-word;
forced-color-adjust: none;
+ &div {
+ padding: 0;
+ }
+
&[data-focus-visible] {
outline: 2px solid var(--focus-ring-color);
outline-offset: -1px;
@@ -76,6 +80,13 @@
padding: 4px 8px;
text-align: left;
outline: none;
+ box-sizing: border-box;
+
+ &div {
+ display: flex;
+ align-items: center;
+ height: 100%;
+ }
&[data-focus-visible] {
outline: 2px solid var(--focus-ring-color);
@@ -107,6 +118,10 @@
--radius-top: 0px;
}
}
+
+ .react-aria-ProgressBar {
+ margin: auto;
+ }
}
:where(.react-aria-Row) .react-aria-Checkbox {
@@ -124,6 +139,7 @@
.column-header {
display: flex;
align-items: center;
+ font-weight: bold;
}
.sort-indicator {
@@ -269,3 +285,8 @@
object-fit: cover;
display: block;
}
+
+.react-aria-TableLoadingIndicator {
+ height: 24px;
+ position: relative;
+}
diff --git a/starters/docs/src/Table.tsx b/starters/docs/src/Table.tsx
index d588b03ea77..365268e0de2 100644
--- a/starters/docs/src/Table.tsx
+++ b/starters/docs/src/Table.tsx
@@ -46,17 +46,17 @@ export function Column(
}
export function TableHeader(
- { columns, children }: TableHeaderProps
+ { columns, children, ...otherProps }: TableHeaderProps
) {
let { selectionBehavior, selectionMode, allowsDragging } = useTableOptions();
return (
(
-
+
{/* Add extra columns for drag and drop and selection. */}
{allowsDragging && }
{selectionBehavior === 'toggle' && (
-
+
{selectionMode === 'multiple' && }
)}
diff --git a/starters/docs/src/Toolbar.css b/starters/docs/src/Toolbar.css
index c855122167a..c93ac925e2f 100644
--- a/starters/docs/src/Toolbar.css
+++ b/starters/docs/src/Toolbar.css
@@ -18,10 +18,6 @@
display: contents;
}
- .react-aria-ToggleButton {
- width: 32px;
- }
-
.react-aria-Separator {
align-self: stretch;
background-color: var(--border-color);
diff --git a/starters/docs/src/Toolbar.tsx b/starters/docs/src/Toolbar.tsx
index 472fed91cc7..35413a78131 100644
--- a/starters/docs/src/Toolbar.tsx
+++ b/starters/docs/src/Toolbar.tsx
@@ -1,7 +1,11 @@
'use client';
-import {Toolbar as RACToolbar, ToolbarProps} from 'react-aria-components';
+import {Toolbar as RACToolbar, ToggleButtonGroupContext, ToolbarProps} from 'react-aria-components';
import './Toolbar.css';
export function Toolbar(props: ToolbarProps) {
- return ;
+ return (
+
+
+
+ );
}
diff --git a/starters/docs/src/Tooltip.css b/starters/docs/src/Tooltip.css
index 05ef852f0f1..78897d98c97 100644
--- a/starters/docs/src/Tooltip.css
+++ b/starters/docs/src/Tooltip.css
@@ -12,6 +12,8 @@
/* fixes FF gap */
transform: translate3d(0, 0, 0);
transition: transform 200ms, opacity 200ms;
+ font-family: system-ui;
+ font-size: 0.875rem;
&[data-entering],
&[data-exiting] {
diff --git a/starters/docs/src/Tree.css b/starters/docs/src/Tree.css
index 5ce2891da93..1257bea9d8d 100644
--- a/starters/docs/src/Tree.css
+++ b/starters/docs/src/Tree.css
@@ -135,6 +135,13 @@
}
}
+.react-aria-TreeLoader {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 28px;
+}
+
.react-aria-TreeItem[data-href] {
cursor: pointer;
}
diff --git a/starters/docs/stories/Disclosure.stories.tsx b/starters/docs/stories/Disclosure.stories.tsx
index d3e0513c63e..6a377992da2 100644
--- a/starters/docs/stories/Disclosure.stories.tsx
+++ b/starters/docs/stories/Disclosure.stories.tsx
@@ -1,4 +1,4 @@
-import {Disclosure} from '../src/Disclosure';
+import {Disclosure, DisclosureHeader, DisclosurePanel} from '../src/Disclosure';
import type {Meta, StoryFn} from '@storybook/react';
@@ -14,9 +14,9 @@ export default meta;
type Story = StoryFn;
export const Example: Story = (args) => (
- Details on managing your account
+
+ Manage your account
+ Details on managing your account
+
);
-Example.args = {
- title: 'Manage your account'
-};
diff --git a/starters/tailwind/src/Breadcrumbs.tsx b/starters/tailwind/src/Breadcrumbs.tsx
index ed8bee6bd03..508f2dcb6b3 100644
--- a/starters/tailwind/src/Breadcrumbs.tsx
+++ b/starters/tailwind/src/Breadcrumbs.tsx
@@ -13,8 +13,10 @@ export function Breadcrumbs(props: BreadcrumbsProps) {
export function Breadcrumb(props: BreadcrumbProps & Omit) {
return (
-
- {props.href && }
+ {({isCurrent}) => (<>
+
+ {!isCurrent && }
+ >)}
);
}
diff --git a/starters/tailwind/src/Button.tsx b/starters/tailwind/src/Button.tsx
index 5a425f96d31..02ac8fffba6 100644
--- a/starters/tailwind/src/Button.tsx
+++ b/starters/tailwind/src/Button.tsx
@@ -11,7 +11,7 @@ export interface ButtonProps extends RACButtonProps {
let button = tv({
extend: focusRing,
- base: 'px-5 py-2 text-sm text-center transition rounded-lg border border-black/10 dark:border-white/10 shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] dark:shadow-none cursor-default',
+ base: 'relative border-0 px-5 py-2 text-sm text-center transition rounded-lg border border-black/10 dark:border-white/10 shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] dark:shadow-none cursor-default',
variants: {
variant: {
primary: 'bg-blue-600 hover:bg-blue-700 pressed:bg-blue-800 text-white',
@@ -21,6 +21,9 @@ let button = tv({
},
isDisabled: {
true: 'bg-gray-100 dark:bg-zinc-800 text-gray-300 dark:text-zinc-600 forced-colors:text-[GrayText] border-black/5 dark:border-white/5'
+ },
+ isPending: {
+ true: 'text-transparent'
}
},
defaultVariants: {
@@ -35,6 +38,21 @@ export function Button(props: ButtonProps) {
className={composeRenderProps(
props.className,
(className, renderProps) => button({...renderProps, variant: props.variant, className})
- )} />
+ )}
+ >
+ {composeRenderProps(props.children, (children, {isPending}) => (
+ <>
+ {children}
+ {isPending && (
+
+
+
+
+
+
+ )}
+ >
+ ))}
+
);
}
diff --git a/starters/tailwind/src/Calendar.tsx b/starters/tailwind/src/Calendar.tsx
index 7942d450406..a95e1fa8582 100644
--- a/starters/tailwind/src/Calendar.tsx
+++ b/starters/tailwind/src/Calendar.tsx
@@ -61,7 +61,7 @@ export function CalendarHeader() {
{direction === 'rtl' ? : }
-
+
{direction === 'rtl' ? : }
diff --git a/starters/tailwind/src/Checkbox.tsx b/starters/tailwind/src/Checkbox.tsx
index 10d8709957f..ef2cfde5cf5 100644
--- a/starters/tailwind/src/Checkbox.tsx
+++ b/starters/tailwind/src/Checkbox.tsx
@@ -36,7 +36,7 @@ const checkboxStyles = tv({
const boxStyles = tv({
extend: focusRing,
- base: 'w-5 h-5 shrink-0 rounded-sm flex items-center justify-center border-2 transition',
+ base: 'w-5 h-5 box-border shrink-0 rounded-sm flex items-center justify-center border-2 transition',
variants: {
isSelected: {
false: 'bg-white dark:bg-zinc-900 border-(--color) [--color:var(--color-gray-400)] dark:[--color:var(--color-zinc-400)] group-pressed:[--color:var(--color-gray-500)] dark:group-pressed:[--color:var(--color-zinc-300)]',
diff --git a/starters/tailwind/src/ColorPicker.tsx b/starters/tailwind/src/ColorPicker.tsx
index 68787a1d22f..30391f433d7 100644
--- a/starters/tailwind/src/ColorPicker.tsx
+++ b/starters/tailwind/src/ColorPicker.tsx
@@ -12,7 +12,7 @@ import { focusRing } from './utils';
const buttonStyles = tv({
extend: focusRing,
- base: 'flex gap-2 items-center cursor-default rounded-xs text-sm text-gray-800 dark:text-gray-200'
+ base: 'border-0 bg-transparent flex gap-2 items-center cursor-default rounded-xs text-sm text-gray-800 dark:text-gray-200'
});
export interface ColorPickerProps extends AriaColorPickerProps {
diff --git a/starters/tailwind/src/ColorSwatch.tsx b/starters/tailwind/src/ColorSwatch.tsx
index 2f589b0030f..bfd40bc022b 100644
--- a/starters/tailwind/src/ColorSwatch.tsx
+++ b/starters/tailwind/src/ColorSwatch.tsx
@@ -7,7 +7,7 @@ export function ColorSwatch(props: ColorSwatchProps) {
return (
({
background: `linear-gradient(${color}, ${color}),
repeating-conic-gradient(#CCC 0% 25%, white 0% 50%) 50% / 16px 16px`
diff --git a/starters/tailwind/src/ColorSwatchPicker.tsx b/starters/tailwind/src/ColorSwatchPicker.tsx
index 438c036acb6..90f1bac7813 100644
--- a/starters/tailwind/src/ColorSwatchPicker.tsx
+++ b/starters/tailwind/src/ColorSwatchPicker.tsx
@@ -4,17 +4,28 @@ import {
ColorSwatchPicker as AriaColorSwatchPicker,
ColorSwatchPickerItem as AriaColorSwatchPickerItem,
ColorSwatchPickerItemProps,
- ColorSwatchPickerProps
+ ColorSwatchPickerProps,
+ composeRenderProps
} from 'react-aria-components';
import {ColorSwatch} from './ColorSwatch';
-import {composeTailwindRenderProps, focusRing} from './utils';
+import {focusRing} from './utils';
import {tv} from 'tailwind-variants';
+const pickerStyles = tv({
+ base: 'flex gap-1',
+ variants: {
+ layout: {
+ stack: 'flex-col',
+ grid: 'flex-wrap'
+ }
+ }
+})
+
export function ColorSwatchPicker(
{ children, ...props }: Omit
) {
return (
-
+ pickerStyles({...renderProps, className}))}>
{children}
);
@@ -30,7 +41,7 @@ export function ColorSwatchPickerItem(props: ColorSwatchPickerItemProps) {
{({isSelected}) => <>
- {isSelected &&
}
+ {isSelected &&
}
>}
);
diff --git a/starters/tailwind/src/Disclosure.tsx b/starters/tailwind/src/Disclosure.tsx
index f330065f291..ea67f0ce46a 100644
--- a/starters/tailwind/src/Disclosure.tsx
+++ b/starters/tailwind/src/Disclosure.tsx
@@ -28,7 +28,7 @@ const disclosure = tv({
const disclosureButton = tv({
extend: focusRing,
- base: "rounded-lg flex gap-2 items-center w-full text-start p-2 cursor-default",
+ base: "bg-transparent border-0 rounded-lg flex gap-2 items-center w-full text-start p-2 cursor-default",
variants: {
isDisabled: {
true: 'text-gray-300 dark:text-zinc-600 forced-colors:text-[GrayText]'
@@ -75,7 +75,7 @@ export function DisclosureHeader({ children }: DisclosureHeaderProps) {
let { isExpanded } = useContext(DisclosureStateContext)!;
let isInGroup = useContext(DisclosureGroupStateContext) !== null;
return (
-
+
disclosureButton({ ...renderProps, isInGroup })}
diff --git a/starters/tailwind/src/DropZone.tsx b/starters/tailwind/src/DropZone.tsx
new file mode 100644
index 00000000000..5de07a64a8b
--- /dev/null
+++ b/starters/tailwind/src/DropZone.tsx
@@ -0,0 +1,24 @@
+'use client';
+import React from "react";
+import {composeRenderProps, DropZoneProps, DropZone as RACDropZone} from 'react-aria-components';
+import { tv } from "tailwind-variants";
+
+const dropZone = tv({
+ base: "flex items-center justify-center p-8 min-h-24 w-[30%] text-base text-balance text-center rounded border border-1 border-gray-300 dark:border-zinc-800 bg-white dark:bg-zinc-900",
+ variants: {
+ isFocusVisible: {
+ true: "outline outline-2 -outline-offset-1 outline-blue-600 dark:outline-blue-500 forced-colors:outline-[Highlight]"
+ },
+ isDropTarget: {
+ true: "bg-blue-200 dark:bg-blue-800 outline outline-2 -outline-offset-1 outline-blue-600 dark:outline-blue-500 forced-colors:outline-[Highlight]",
+ }
+ }
+});
+
+export function DropZone(props: DropZoneProps) {
+ return (
+ dropZone({ ...renderProps, className }))} />
+ );
+}
diff --git a/starters/tailwind/src/Field.tsx b/starters/tailwind/src/Field.tsx
index 80930ed7ef6..0ac3136cdc8 100644
--- a/starters/tailwind/src/Field.tsx
+++ b/starters/tailwind/src/Field.tsx
@@ -34,7 +34,7 @@ export const fieldBorderStyles = tv({
export const fieldGroupStyles = tv({
extend: focusRing,
- base: 'group flex items-center h-9 bg-white dark:bg-zinc-900 forced-colors:bg-[Field] border-2 rounded-lg overflow-hidden',
+ base: 'group flex items-center h-9 box-border bg-white dark:bg-zinc-900 forced-colors:bg-[Field] border-2 rounded-lg overflow-hidden',
variants: fieldBorderStyles.variants
});
@@ -43,5 +43,5 @@ export function FieldGroup(props: GroupProps) {
}
export function Input(props: InputProps) {
- return
+ return
}
diff --git a/starters/tailwind/src/Modal.tsx b/starters/tailwind/src/Modal.tsx
index 32d904779f7..dc0d660da21 100644
--- a/starters/tailwind/src/Modal.tsx
+++ b/starters/tailwind/src/Modal.tsx
@@ -16,7 +16,7 @@ const overlayStyles = tv({
});
const modalStyles = tv({
- base: 'w-full max-w-md max-h-full rounded-2xl bg-white dark:bg-zinc-800/70 dark:backdrop-blur-2xl dark:backdrop-saturate-200 forced-colors:bg-[Canvas] text-left align-middle text-slate-700 dark:text-zinc-300 shadow-2xl bg-clip-padding border border-black/10 dark:border-white/10',
+ base: 'font-sans w-full max-w-md max-h-full rounded-2xl bg-white dark:bg-zinc-800/70 dark:backdrop-blur-2xl dark:backdrop-saturate-200 forced-colors:bg-[Canvas] text-left align-middle text-slate-700 dark:text-zinc-300 shadow-2xl bg-clip-padding border border-black/10 dark:border-white/10',
variants: {
isEntering: {
true: 'animate-in zoom-in-105 ease-out duration-200'
diff --git a/starters/tailwind/src/NumberField.tsx b/starters/tailwind/src/NumberField.tsx
index fae91b461a7..0387a8bad6f 100644
--- a/starters/tailwind/src/NumberField.tsx
+++ b/starters/tailwind/src/NumberField.tsx
@@ -44,5 +44,5 @@ export function NumberField(
}
function StepperButton(props: ButtonProps) {
- return
+ return
}
diff --git a/starters/tailwind/src/Popover.tsx b/starters/tailwind/src/Popover.tsx
index b67935aa3b9..ed4b6b73c4a 100644
--- a/starters/tailwind/src/Popover.tsx
+++ b/starters/tailwind/src/Popover.tsx
@@ -16,7 +16,7 @@ export interface PopoverProps extends Omit {
}
const styles = tv({
- base: 'bg-white dark:bg-zinc-900/70 dark:backdrop-blur-2xl dark:backdrop-saturate-200 forced-colors:bg-[Canvas] shadow-2xl rounded-xl bg-clip-padding border border-black/10 dark:border-white/[15%] text-slate-700 dark:text-zinc-300',
+ base: 'font-sans bg-white dark:bg-zinc-900/70 dark:backdrop-blur-2xl dark:backdrop-saturate-200 forced-colors:bg-[Canvas] shadow-2xl rounded-xl bg-clip-padding border border-black/10 dark:border-white/[15%] text-slate-700 dark:text-zinc-300 outline-0',
variants: {
isEntering: {
true: 'animate-in fade-in placement-bottom:slide-in-from-top-1 placement-top:slide-in-from-bottom-1 placement-left:slide-in-from-right-1 placement-right:slide-in-from-left-1 ease-out duration-200'
diff --git a/starters/tailwind/src/RadioGroup.tsx b/starters/tailwind/src/RadioGroup.tsx
index 3ecf33ad67e..adef9e501cf 100644
--- a/starters/tailwind/src/RadioGroup.tsx
+++ b/starters/tailwind/src/RadioGroup.tsx
@@ -27,7 +27,7 @@ export function RadioGroup(props: RadioGroupProps) {
const styles = tv({
extend: focusRing,
- base: 'w-5 h-5 rounded-full border-2 bg-white dark:bg-zinc-900 transition-all',
+ base: 'w-5 h-5 box-border rounded-full border-2 bg-white dark:bg-zinc-900 transition-all',
variants: {
isSelected: {
false: 'border-gray-400 dark:border-zinc-400 group-pressed:border-gray-500 dark:group-pressed:border-zinc-300',
diff --git a/starters/tailwind/src/Switch.tsx b/starters/tailwind/src/Switch.tsx
index d44b031e3a0..363afb6dc47 100644
--- a/starters/tailwind/src/Switch.tsx
+++ b/starters/tailwind/src/Switch.tsx
@@ -13,7 +13,7 @@ export interface SwitchProps extends Omit {
const track = tv({
extend: focusRing,
- base: 'flex h-4 w-7 px-px items-center shrink-0 cursor-default rounded-full transition duration-200 ease-in-out shadow-inner border border-transparent',
+ base: 'flex h-4 w-7 box-border px-px items-center shrink-0 cursor-default rounded-full transition duration-200 ease-in-out shadow-inner border border-transparent',
variants: {
isSelected: {
false: 'bg-gray-400 dark:bg-zinc-400 group-pressed:bg-gray-500 dark:group-pressed:bg-zinc-300',
diff --git a/starters/tailwind/src/Table.tsx b/starters/tailwind/src/Table.tsx
index aabf131abf6..bd49e2528ee 100644
--- a/starters/tailwind/src/Table.tsx
+++ b/starters/tailwind/src/Table.tsx
@@ -27,7 +27,7 @@ import { composeTailwindRenderProps, focusRing } from './utils';
export function Table(props: TableProps) {
return (
-
+
);
@@ -79,7 +79,7 @@ export function TableHeader(props: TableHeaderProps) {
{/* Add extra columns for drag and drop and selection. */}
{allowsDragging && }
{selectionBehavior === 'toggle' && (
-
+
{selectionMode === 'multiple' && }
)}
diff --git a/starters/tailwind/src/Tabs.tsx b/starters/tailwind/src/Tabs.tsx
index 1d8b0c5c5df..c4632272c03 100644
--- a/starters/tailwind/src/Tabs.tsx
+++ b/starters/tailwind/src/Tabs.tsx
@@ -19,7 +19,7 @@ const tabsStyles = tv({
variants: {
orientation: {
horizontal: 'flex-col',
- vertical: 'flex-row w-[800px]'
+ vertical: 'flex-row'
}
}
});
diff --git a/starters/tailwind/src/Tree.tsx b/starters/tailwind/src/Tree.tsx
index 4f3758e3418..7c9b833daf9 100644
--- a/starters/tailwind/src/Tree.tsx
+++ b/starters/tailwind/src/Tree.tsx
@@ -5,7 +5,7 @@ import {
TreeItem as AriaTreeItem,
TreeItemContent as AriaTreeItemContent,
Button,
- TreeItemProps,
+ TreeItemProps as AriaTreeItemProps,
TreeItemContentProps as AriaTreeItemContentProps,
TreeProps
} from 'react-aria-components';
@@ -16,7 +16,7 @@ import { composeTailwindRenderProps, focusRing } from './utils';
const itemStyles = tv({
extend: focusRing,
- base: 'relative flex group gap-3 cursor-default select-none py-2 px-3 text-sm text-gray-900 dark:text-zinc-200 border-y dark:border-y-zinc-700 border-transparent first:border-t-0 last:border-b-0 -mb-px last:mb-0 -outline-offset-2',
+ base: 'relative w-48 flex group gap-3 cursor-default select-none py-2 px-3 text-sm text-gray-900 dark:text-zinc-200 bg-white dark:bg-zinc-900 border-y dark:border-y-zinc-700 border-transparent first:border-t-0 last:border-b-0 -mb-px last:mb-0 -outline-offset-2',
variants: {
isSelected: {
false: 'hover:bg-gray-100 dark:hover:bg-zinc-700/60',
@@ -38,18 +38,9 @@ export function Tree(
);
}
-export function TreeItem(props: TreeItemProps) {
- return (
-
- )
-}
-interface TreeItemContentProps extends Omit {
- children: React.ReactNode;
-}
-
const expandButton = tv({
extend: focusRing,
- base: "shrink-0 w-8 h-8 rounded-lg flex items-center justify-center text-start cursor-default",
+ base: "border-0 p-0 bg-transparent shrink-0 w-8 h-8 rounded-lg flex items-center justify-center text-start cursor-default",
variants: {
isDisabled: {
true: 'text-gray-300 dark:text-zinc-600 forced-colors:text-[GrayText]'
@@ -69,23 +60,30 @@ const chevron = tv({
}
});
-export function TreeItemContent({ children, ...props }: TreeItemContentProps) {
+export interface TreeItemProps extends Partial {
+ title: string;
+}
+
+export function TreeItem(props: TreeItemProps) {
return (
-
- {({ selectionMode, selectionBehavior, hasChildItems, isExpanded, isDisabled }) => (
-
- {selectionMode === 'multiple' && selectionBehavior === 'toggle' && (
-
- )}
-
- {hasChildItems ? (
-
-
-
- ) :
}
- {children}
-
- )}
-
- );
+
+
+ {({ selectionMode, selectionBehavior, hasChildItems, isExpanded, isDisabled }) => (
+
+ {selectionMode === 'multiple' && selectionBehavior === 'toggle' && (
+
+ )}
+
+ {hasChildItems ? (
+
+
+
+ ) :
}
+ {props.title}
+
+ )}
+
+ {props.children}
+
+ )
}
diff --git a/starters/tailwind/stories/Tree.stories.tsx b/starters/tailwind/stories/Tree.stories.tsx
index 29e5f807647..9dbbf1d8920 100644
--- a/starters/tailwind/stories/Tree.stories.tsx
+++ b/starters/tailwind/stories/Tree.stories.tsx
@@ -1,5 +1,5 @@
import { Meta } from '@storybook/react';
-import { Tree, TreeItem, TreeItemContent } from '../src/Tree';
+import { Tree, TreeItem } from '../src/Tree';
import React from 'react';
const meta: Meta = {
@@ -14,35 +14,14 @@ export default meta;
export const Example = (args: any) => (
-
-
- Documents
-
-
-
- Project
-
-
-
- Weekly Report
-
-
+
+
+
-
-
- Photos
-
-
-
- Image 1
-
-
-
-
- Image 2
-
-
+
+
+
);
diff --git a/yarn.config.cjs b/yarn.config.cjs
index c5867615303..2ae1ddeedab 100644
--- a/yarn.config.cjs
+++ b/yarn.config.cjs
@@ -189,6 +189,7 @@ function enforceCSS({Yarn}) {
&& !name.startsWith('@react-spectrum/s2-docs')
&& !name.startsWith('@react-spectrum/test-utils')
&& name.startsWith('@react-spectrum')
+ && !name.startsWith('@react-spectrum/mcp')
&& workspace.pkg.dependencies?.has('@adobe/spectrum-css-temp')) {
workspace.set('targets', {
diff --git a/yarn.lock b/yarn.lock
index e61d9c86e08..bb797e2767c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4005,6 +4005,26 @@ __metadata:
languageName: node
linkType: hard
+"@modelcontextprotocol/sdk@npm:^1.17.3":
+ version: 1.17.3
+ resolution: "@modelcontextprotocol/sdk@npm:1.17.3"
+ dependencies:
+ ajv: "npm:^6.12.6"
+ content-type: "npm:^1.0.5"
+ cors: "npm:^2.8.5"
+ cross-spawn: "npm:^7.0.5"
+ eventsource: "npm:^3.0.2"
+ eventsource-parser: "npm:^3.0.0"
+ express: "npm:^5.0.1"
+ express-rate-limit: "npm:^7.5.0"
+ pkce-challenge: "npm:^5.0.0"
+ raw-body: "npm:^3.0.0"
+ zod: "npm:^3.23.8"
+ zod-to-json-schema: "npm:^3.24.1"
+ checksum: 10c0/23df0949724279eaa620f2780e3c731dcf746311f3175e3cba602643aacf9ee6dbcf99daeab3fa848296fe9ac971456fc031c79c1b55870dd019baf0263fd080
+ languageName: node
+ linkType: hard
+
"@mrmlnc/readdir-enhanced@npm:^2.2.1":
version: 2.2.1
resolution: "@mrmlnc/readdir-enhanced@npm:2.2.1"
@@ -7176,6 +7196,21 @@ __metadata:
languageName: unknown
linkType: soft
+"@react-spectrum/mcp@workspace:packages/dev/mcp":
+ version: 0.0.0-use.local
+ resolution: "@react-spectrum/mcp@workspace:packages/dev/mcp"
+ dependencies:
+ "@adobe/spectrum-css-temp": "npm:3.0.0-alpha.1"
+ "@modelcontextprotocol/sdk": "npm:^1.17.3"
+ "@swc/helpers": "npm:^0.5.0"
+ fast-glob: "npm:^3.3.3"
+ typescript: "npm:^5.8.2"
+ zod: "npm:^3.23.8"
+ bin:
+ mcp: dist/index.js
+ languageName: unknown
+ linkType: soft
+
"@react-spectrum/menu@npm:^3.22.6, @react-spectrum/menu@workspace:packages/@react-spectrum/menu":
version: 0.0.0-use.local
resolution: "@react-spectrum/menu@workspace:packages/@react-spectrum/menu"
@@ -7392,6 +7427,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@react-spectrum/s2-docs@workspace:packages/dev/s2-docs"
dependencies:
+ "@parcel/plugin": "npm:^2.15.4"
"@parcel/rsc": "npm:^2.15.4"
"@react-aria/focus": "npm:^3.20.4"
"@react-aria/i18n": "npm:^3.12.10"
@@ -7404,6 +7440,7 @@ __metadata:
fast-glob: "npm:^3.3.3"
globals-docs: "npm:^2.4.1"
gray-matter: "npm:^4.0.3"
+ json5: "npm:^2.2.3"
lz-string: "npm:^1.5.0"
markdown-to-jsx: "npm:^6.11.0"
react: "npm:^19"
@@ -7414,7 +7451,7 @@ __metadata:
remark-mdx: "npm:^3.1.0"
remark-parse: "npm:^11.0.0"
remark-stringify: "npm:^11.0.0"
- satori: "npm:^0.15.2"
+ satori: "npm:^0.16.1"
sharp: "npm:^0.33.5"
tree-sitter-highlight: "npm:^1.0.1"
ts-morph: "npm:^26.0.0"
@@ -11292,6 +11329,16 @@ __metadata:
languageName: node
linkType: hard
+"accepts@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "accepts@npm:2.0.0"
+ dependencies:
+ mime-types: "npm:^3.0.0"
+ negotiator: "npm:^1.0.0"
+ checksum: 10c0/98374742097e140891546076215f90c32644feacf652db48412329de4c2a529178a81aa500fbb13dd3e6cbf6e68d829037b123ac037fc9a08bcec4b87b358eef
+ languageName: node
+ linkType: hard
+
"accepts@npm:~1.3.8":
version: 1.3.8
resolution: "accepts@npm:1.3.8"
@@ -11415,7 +11462,7 @@ __metadata:
languageName: node
linkType: hard
-"ajv@npm:^6.12.3, ajv@npm:^6.12.4":
+"ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.6":
version: 6.12.6
resolution: "ajv@npm:6.12.6"
dependencies:
@@ -12609,6 +12656,23 @@ __metadata:
languageName: node
linkType: hard
+"body-parser@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "body-parser@npm:2.2.0"
+ dependencies:
+ bytes: "npm:^3.1.2"
+ content-type: "npm:^1.0.5"
+ debug: "npm:^4.4.0"
+ http-errors: "npm:^2.0.0"
+ iconv-lite: "npm:^0.6.3"
+ on-finished: "npm:^2.4.1"
+ qs: "npm:^6.14.0"
+ raw-body: "npm:^3.0.0"
+ type-is: "npm:^2.0.0"
+ checksum: 10c0/a9ded39e71ac9668e2211afa72e82ff86cc5ef94de1250b7d1ba9cc299e4150408aaa5f1e8b03dd4578472a3ce6d1caa2a23b27a6c18e526e48b4595174c116c
+ languageName: node
+ linkType: hard
+
"boolbase@npm:^1.0.0":
version: 1.0.0
resolution: "boolbase@npm:1.0.0"
@@ -12813,7 +12877,7 @@ __metadata:
languageName: node
linkType: hard
-"bytes@npm:3.1.2":
+"bytes@npm:3.1.2, bytes@npm:^3.1.2":
version: 3.1.2
resolution: "bytes@npm:3.1.2"
checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e
@@ -12926,6 +12990,16 @@ __metadata:
languageName: node
linkType: hard
+"call-bound@npm:^1.0.2":
+ version: 1.0.4
+ resolution: "call-bound@npm:1.0.4"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.2"
+ get-intrinsic: "npm:^1.3.0"
+ checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644
+ languageName: node
+ linkType: hard
+
"call-me-maybe@npm:^1.0.1":
version: 1.0.1
resolution: "call-me-maybe@npm:1.0.1"
@@ -13891,7 +13965,16 @@ __metadata:
languageName: node
linkType: hard
-"content-type@npm:~1.0.4, content-type@npm:~1.0.5":
+"content-disposition@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "content-disposition@npm:1.0.0"
+ dependencies:
+ safe-buffer: "npm:5.2.1"
+ checksum: 10c0/c7b1ba0cea2829da0352ebc1b7f14787c73884bc707c8bc2271d9e3bf447b372270d09f5d3980dc5037c749ceef56b9a13fccd0b0001c87c3f12579967e4dd27
+ languageName: node
+ linkType: hard
+
+"content-type@npm:^1.0.5, content-type@npm:~1.0.4, content-type@npm:~1.0.5":
version: 1.0.5
resolution: "content-type@npm:1.0.5"
checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af
@@ -14024,6 +14107,13 @@ __metadata:
languageName: node
linkType: hard
+"cookie-signature@npm:^1.2.1":
+ version: 1.2.2
+ resolution: "cookie-signature@npm:1.2.2"
+ checksum: 10c0/54e05df1a293b3ce81589b27dddc445f462f6fa6812147c033350cd3561a42bc14481674e05ed14c7bd0ce1e8bb3dc0e40851bad75415733711294ddce0b7bc6
+ languageName: node
+ linkType: hard
+
"cookie@npm:0.7.1":
version: 0.7.1
resolution: "cookie@npm:0.7.1"
@@ -14031,6 +14121,13 @@ __metadata:
languageName: node
linkType: hard
+"cookie@npm:^0.7.1":
+ version: 0.7.2
+ resolution: "cookie@npm:0.7.2"
+ checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2
+ languageName: node
+ linkType: hard
+
"copy-concurrently@npm:^1.0.0":
version: 1.0.5
resolution: "copy-concurrently@npm:1.0.5"
@@ -14092,7 +14189,7 @@ __metadata:
languageName: node
linkType: hard
-"cors@npm:2.8.5":
+"cors@npm:2.8.5, cors@npm:^2.8.5":
version: 2.8.5
resolution: "cors@npm:2.8.5"
dependencies:
@@ -14234,6 +14331,17 @@ __metadata:
languageName: node
linkType: hard
+"cross-spawn@npm:^7.0.5":
+ version: 7.0.6
+ resolution: "cross-spawn@npm:7.0.6"
+ dependencies:
+ path-key: "npm:^3.1.0"
+ shebang-command: "npm:^2.0.0"
+ which: "npm:^2.0.1"
+ checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1
+ languageName: node
+ linkType: hard
+
"crypt@npm:~0.0.1":
version: 0.0.2
resolution: "crypt@npm:0.0.2"
@@ -14609,6 +14717,18 @@ __metadata:
languageName: node
linkType: hard
+"debug@npm:^4.3.5, debug@npm:^4.4.0":
+ version: 4.4.1
+ resolution: "debug@npm:4.4.1"
+ dependencies:
+ ms: "npm:^2.1.3"
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55
+ languageName: node
+ linkType: hard
+
"debuglog@npm:^1.0.1":
version: 1.0.1
resolution: "debuglog@npm:1.0.1"
@@ -14849,7 +14969,7 @@ __metadata:
languageName: node
linkType: hard
-"depd@npm:2.0.0":
+"depd@npm:2.0.0, depd@npm:^2.0.0":
version: 2.0.0
resolution: "depd@npm:2.0.0"
checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c
@@ -15341,6 +15461,13 @@ __metadata:
languageName: node
linkType: hard
+"encodeurl@npm:^2.0.0, encodeurl@npm:~2.0.0":
+ version: 2.0.0
+ resolution: "encodeurl@npm:2.0.0"
+ checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb
+ languageName: node
+ linkType: hard
+
"encodeurl@npm:~1.0.2":
version: 1.0.2
resolution: "encodeurl@npm:1.0.2"
@@ -15348,13 +15475,6 @@ __metadata:
languageName: node
linkType: hard
-"encodeurl@npm:~2.0.0":
- version: 2.0.0
- resolution: "encodeurl@npm:2.0.0"
- checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb
- languageName: node
- linkType: hard
-
"encoding@npm:^0.1.11, encoding@npm:^0.1.13":
version: 0.1.13
resolution: "encoding@npm:0.1.13"
@@ -16158,7 +16278,7 @@ __metadata:
languageName: node
linkType: hard
-"etag@npm:~1.8.1":
+"etag@npm:^1.8.1, etag@npm:~1.8.1":
version: 1.8.1
resolution: "etag@npm:1.8.1"
checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84
@@ -16208,6 +16328,22 @@ __metadata:
languageName: node
linkType: hard
+"eventsource-parser@npm:^3.0.0, eventsource-parser@npm:^3.0.1":
+ version: 3.0.5
+ resolution: "eventsource-parser@npm:3.0.5"
+ checksum: 10c0/5cb75e3f84ff1cfa1cee6199d4fd430c4544855ab03e953ddbe5927e7b31bc2af3933ab8aba6440ba160ed2c48972b6c317f27b8a1d0764c7b12e34e249de631
+ languageName: node
+ linkType: hard
+
+"eventsource@npm:^3.0.2":
+ version: 3.0.7
+ resolution: "eventsource@npm:3.0.7"
+ dependencies:
+ eventsource-parser: "npm:^3.0.1"
+ checksum: 10c0/c48a73c38f300e33e9f11375d4ee969f25cbb0519608a12378a38068055ae8b55b6e0e8a49c3f91c784068434efe1d9f01eb49b6315b04b0da9157879ce2f67d
+ languageName: node
+ linkType: hard
+
"execa@npm:^0.7.0":
version: 0.7.0
resolution: "execa@npm:0.7.0"
@@ -16347,6 +16483,15 @@ __metadata:
languageName: node
linkType: hard
+"express-rate-limit@npm:^7.5.0":
+ version: 7.5.1
+ resolution: "express-rate-limit@npm:7.5.1"
+ peerDependencies:
+ express: ">= 4.11"
+ checksum: 10c0/b07de84d700a2c07c4bf2f040e7558ed5a1f660f03ed5f30bf8ff7b51e98ba7a85215640e70fc48cbbb9151066ea51239d9a1b41febc9b84d98c7915b0186161
+ languageName: node
+ linkType: hard
+
"express@npm:4.21.2":
version: 4.21.2
resolution: "express@npm:4.21.2"
@@ -16386,6 +16531,41 @@ __metadata:
languageName: node
linkType: hard
+"express@npm:^5.0.1":
+ version: 5.1.0
+ resolution: "express@npm:5.1.0"
+ dependencies:
+ accepts: "npm:^2.0.0"
+ body-parser: "npm:^2.2.0"
+ content-disposition: "npm:^1.0.0"
+ content-type: "npm:^1.0.5"
+ cookie: "npm:^0.7.1"
+ cookie-signature: "npm:^1.2.1"
+ debug: "npm:^4.4.0"
+ encodeurl: "npm:^2.0.0"
+ escape-html: "npm:^1.0.3"
+ etag: "npm:^1.8.1"
+ finalhandler: "npm:^2.1.0"
+ fresh: "npm:^2.0.0"
+ http-errors: "npm:^2.0.0"
+ merge-descriptors: "npm:^2.0.0"
+ mime-types: "npm:^3.0.0"
+ on-finished: "npm:^2.4.1"
+ once: "npm:^1.4.0"
+ parseurl: "npm:^1.3.3"
+ proxy-addr: "npm:^2.0.7"
+ qs: "npm:^6.14.0"
+ range-parser: "npm:^1.2.1"
+ router: "npm:^2.2.0"
+ send: "npm:^1.1.0"
+ serve-static: "npm:^2.2.0"
+ statuses: "npm:^2.0.1"
+ type-is: "npm:^2.0.1"
+ vary: "npm:^1.1.2"
+ checksum: 10c0/80ce7c53c5f56887d759b94c3f2283e2e51066c98d4b72a4cc1338e832b77f1e54f30d0239cc10815a0f849bdb753e6a284d2fa48d4ab56faf9c501f55d751d6
+ languageName: node
+ linkType: hard
+
"extend-shallow@npm:^2.0.1":
version: 2.0.1
resolution: "extend-shallow@npm:2.0.1"
@@ -16699,6 +16879,20 @@ __metadata:
languageName: node
linkType: hard
+"finalhandler@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "finalhandler@npm:2.1.0"
+ dependencies:
+ debug: "npm:^4.4.0"
+ encodeurl: "npm:^2.0.0"
+ escape-html: "npm:^1.0.3"
+ on-finished: "npm:^2.4.1"
+ parseurl: "npm:^1.3.3"
+ statuses: "npm:^2.0.1"
+ checksum: 10c0/da0bbca6d03873472ee890564eb2183f4ed377f25f3628a0fc9d16dac40bed7b150a0d82ebb77356e4c6d97d2796ad2dba22948b951dddee2c8768b0d1b9fb1f
+ languageName: node
+ linkType: hard
+
"find-cache-dir@npm:^0.1.1":
version: 0.1.1
resolution: "find-cache-dir@npm:0.1.1"
@@ -17097,6 +17291,13 @@ __metadata:
languageName: node
linkType: hard
+"fresh@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "fresh@npm:2.0.0"
+ checksum: 10c0/0557548194cb9a809a435bf92bcfbc20c89e8b5eb38861b73ced36750437251e39a111fc3a18b98531be9dd91fe1411e4969f229dc579ec0251ce6c5d4900bbc
+ languageName: node
+ linkType: hard
+
"from2@npm:^2.1.0":
version: 2.3.0
resolution: "from2@npm:2.3.0"
@@ -17333,7 +17534,7 @@ __metadata:
languageName: node
linkType: hard
-"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.6":
+"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0":
version: 1.3.0
resolution: "get-intrinsic@npm:1.3.0"
dependencies:
@@ -18461,7 +18662,7 @@ __metadata:
languageName: node
linkType: hard
-"http-errors@npm:2.0.0":
+"http-errors@npm:2.0.0, http-errors@npm:^2.0.0":
version: 2.0.0
resolution: "http-errors@npm:2.0.0"
dependencies:
@@ -19549,6 +19750,13 @@ __metadata:
languageName: node
linkType: hard
+"is-promise@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "is-promise@npm:4.0.0"
+ checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503
+ languageName: node
+ linkType: hard
+
"is-pure-object@npm:^1.0.0":
version: 1.0.1
resolution: "is-pure-object@npm:1.0.1"
@@ -22509,6 +22717,13 @@ __metadata:
languageName: node
linkType: hard
+"media-typer@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "media-typer@npm:1.1.0"
+ checksum: 10c0/7b4baa40b25964bb90e2121ee489ec38642127e48d0cc2b6baa442688d3fde6262bfdca86d6bbf6ba708784afcac168c06840c71facac70e390f5f759ac121b9
+ languageName: node
+ linkType: hard
+
"mem@npm:^1.1.0":
version: 1.1.0
resolution: "mem@npm:1.1.0"
@@ -22569,6 +22784,13 @@ __metadata:
languageName: node
linkType: hard
+"merge-descriptors@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "merge-descriptors@npm:2.0.0"
+ checksum: 10c0/95389b7ced3f9b36fbdcf32eb946dc3dd1774c2fdf164609e55b18d03aa499b12bd3aae3a76c1c7185b96279e9803525550d3eb292b5224866060a288f335cb3
+ languageName: node
+ linkType: hard
+
"merge-source-map@npm:^1.0.2":
version: 1.1.0
resolution: "merge-source-map@npm:1.1.0"
@@ -23081,6 +23303,13 @@ __metadata:
languageName: node
linkType: hard
+"mime-db@npm:^1.54.0":
+ version: 1.54.0
+ resolution: "mime-db@npm:1.54.0"
+ checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284
+ languageName: node
+ linkType: hard
+
"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34":
version: 2.1.35
resolution: "mime-types@npm:2.1.35"
@@ -23090,6 +23319,15 @@ __metadata:
languageName: node
linkType: hard
+"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "mime-types@npm:3.0.1"
+ dependencies:
+ mime-db: "npm:^1.54.0"
+ checksum: 10c0/bd8c20d3694548089cf229016124f8f40e6a60bbb600161ae13e45f793a2d5bb40f96bbc61f275836696179c77c1d6bf4967b2a75e0a8ad40fe31f4ed5be4da5
+ languageName: node
+ linkType: hard
+
"mime@npm:*, mime@npm:3.0.0, mime@npm:^3.0.0":
version: 3.0.0
resolution: "mime@npm:3.0.0"
@@ -23665,6 +23903,13 @@ __metadata:
languageName: node
linkType: hard
+"negotiator@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "negotiator@npm:1.0.0"
+ checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b
+ languageName: node
+ linkType: hard
+
"neo-async@npm:^2.5.0, neo-async@npm:^2.6.2":
version: 2.6.2
resolution: "neo-async@npm:2.6.2"
@@ -24249,6 +24494,13 @@ __metadata:
languageName: node
linkType: hard
+"object-inspect@npm:^1.13.3":
+ version: 1.13.4
+ resolution: "object-inspect@npm:1.13.4"
+ checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692
+ languageName: node
+ linkType: hard
+
"object-is@npm:^1.1.5":
version: 1.1.5
resolution: "object-is@npm:1.1.5"
@@ -24397,7 +24649,7 @@ __metadata:
languageName: node
linkType: hard
-"on-finished@npm:2.4.1":
+"on-finished@npm:2.4.1, on-finished@npm:^2.4.1":
version: 2.4.1
resolution: "on-finished@npm:2.4.1"
dependencies:
@@ -25126,7 +25378,7 @@ __metadata:
languageName: node
linkType: hard
-"parseurl@npm:~1.3.3":
+"parseurl@npm:^1.3.3, parseurl@npm:~1.3.3":
version: 1.3.3
resolution: "parseurl@npm:1.3.3"
checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5
@@ -25296,6 +25548,13 @@ __metadata:
languageName: node
linkType: hard
+"path-to-regexp@npm:^8.0.0":
+ version: 8.2.0
+ resolution: "path-to-regexp@npm:8.2.0"
+ checksum: 10c0/ef7d0a887b603c0a142fad16ccebdcdc42910f0b14830517c724466ad676107476bba2fe9fffd28fd4c141391ccd42ea426f32bb44c2c82ecaefe10c37b90f5a
+ languageName: node
+ linkType: hard
+
"path-type@npm:^1.0.0":
version: 1.1.0
resolution: "path-type@npm:1.1.0"
@@ -25479,6 +25738,13 @@ __metadata:
languageName: node
linkType: hard
+"pkce-challenge@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "pkce-challenge@npm:5.0.0"
+ checksum: 10c0/c6706d627fdbb6f22bf8cc5d60d96d6b6a7bb481399b336a3d3f4e9bfba3e167a2c32f8ec0b5e74be686a0ba3bcc9894865d4c2dd1b91cea4c05dba1f28602c3
+ languageName: node
+ linkType: hard
+
"pkg-dir@npm:^1.0.0":
version: 1.0.0
resolution: "pkg-dir@npm:1.0.0"
@@ -25846,7 +26112,7 @@ __metadata:
languageName: node
linkType: hard
-"proxy-addr@npm:~2.0.7":
+"proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7":
version: 2.0.7
resolution: "proxy-addr@npm:2.0.7"
dependencies:
@@ -25954,6 +26220,15 @@ __metadata:
languageName: node
linkType: hard
+"qs@npm:^6.14.0":
+ version: 6.14.0
+ resolution: "qs@npm:6.14.0"
+ dependencies:
+ side-channel: "npm:^1.1.0"
+ checksum: 10c0/8ea5d91bf34f440598ee389d4a7d95820e3b837d3fd9f433871f7924801becaa0cd3b3b4628d49a7784d06a8aea9bc4554d2b6d8d584e2d221dc06238a42909c
+ languageName: node
+ linkType: hard
+
"qs@npm:~6.5.2":
version: 6.5.2
resolution: "qs@npm:6.5.2"
@@ -26015,7 +26290,7 @@ __metadata:
languageName: node
linkType: hard
-"range-parser@npm:~1.2.1":
+"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1":
version: 1.2.1
resolution: "range-parser@npm:1.2.1"
checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0
@@ -26034,6 +26309,18 @@ __metadata:
languageName: node
linkType: hard
+"raw-body@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "raw-body@npm:3.0.0"
+ dependencies:
+ bytes: "npm:3.1.2"
+ http-errors: "npm:2.0.0"
+ iconv-lite: "npm:0.6.3"
+ unpipe: "npm:1.0.0"
+ checksum: 10c0/f8daf4b724064a4811d118745a781ca0fb4676298b8adadfd6591155549cfea0a067523cf7dd3baeb1265fecc9ce5dfb2fc788c12c66b85202a336593ece0f87
+ languageName: node
+ linkType: hard
+
"rc@npm:^1.0.1, rc@npm:^1.1.6":
version: 1.2.8
resolution: "rc@npm:1.2.8"
@@ -26236,13 +26523,13 @@ __metadata:
languageName: node
linkType: hard
-"react-server-dom-parcel@npm:^19.1.0":
- version: 19.1.0
- resolution: "react-server-dom-parcel@npm:19.1.0"
+"react-server-dom-parcel@npm:canary":
+ version: 19.2.0-canary-bdb4a96f-20250801
+ resolution: "react-server-dom-parcel@npm:19.2.0-canary-bdb4a96f-20250801"
peerDependencies:
- react: ^19.1.0
- react-dom: ^19.1.0
- checksum: 10c0/82f4822e427308474118a705419b057cf325018078e3c3d622070fdb85a566835f9a902ee367bd94c8ccde35947086614ce6c9319074368be90651fbd2c3696f
+ react: 19.2.0-canary-bdb4a96f-20250801
+ react-dom: 19.2.0-canary-bdb4a96f-20250801
+ checksum: 10c0/987567a4773091ede967ecd86a188d7dcd56a4337dfcff5cfb2f5a5b5fa284ec2514bb684f43bda1b13f23bd05f7b5d110169880f9f6b62fab1a153293e2ae5c
languageName: node
linkType: hard
@@ -27355,6 +27642,19 @@ __metadata:
languageName: node
linkType: hard
+"router@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "router@npm:2.2.0"
+ dependencies:
+ debug: "npm:^4.4.0"
+ depd: "npm:^2.0.0"
+ is-promise: "npm:^4.0.0"
+ parseurl: "npm:^1.3.3"
+ path-to-regexp: "npm:^8.0.0"
+ checksum: 10c0/3279de7450c8eae2f6e095e9edacbdeec0abb5cb7249c6e719faa0db2dba43574b4fff5892d9220631c9abaff52dd3cad648cfea2aaace845e1a071915ac8867
+ languageName: node
+ linkType: hard
+
"rsc-html-stream@npm:^0.0.6":
version: 0.0.6
resolution: "rsc-html-stream@npm:0.0.6"
@@ -27496,9 +27796,9 @@ __metadata:
languageName: node
linkType: hard
-"satori@npm:^0.15.2":
- version: 0.15.2
- resolution: "satori@npm:0.15.2"
+"satori@npm:^0.16.1":
+ version: 0.16.1
+ resolution: "satori@npm:0.16.1"
dependencies:
"@shuding/opentype.js": "npm:1.4.0-beta.0"
css-background-parser: "npm:^0.1.0"
@@ -27510,8 +27810,8 @@ __metadata:
linebreak: "npm:^1.1.0"
parse-css-color: "npm:^0.2.1"
postcss-value-parser: "npm:^4.2.0"
- yoga-wasm-web: "npm:^0.3.3"
- checksum: 10c0/9fc2c120837858c95e23f89d40b6f322c2b4fa0166eb8ca021f147a9b5e1917e45e0758863c888599586f818b82b0b3501cc418592f8c0b48283c9976664bab3
+ yoga-layout: "npm:^3.2.1"
+ checksum: 10c0/b8f562fd93799291918eed4e9fe72ce38eb0747f35e31099cd87c7fa5754b8559f81e093542d25cf6a6945f8191639176a6d6b7c69e9923a0fbd3fce5a99f74e
languageName: node
linkType: hard
@@ -27659,6 +27959,25 @@ __metadata:
languageName: node
linkType: hard
+"send@npm:^1.1.0, send@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "send@npm:1.2.0"
+ dependencies:
+ debug: "npm:^4.3.5"
+ encodeurl: "npm:^2.0.0"
+ escape-html: "npm:^1.0.3"
+ etag: "npm:^1.8.1"
+ fresh: "npm:^2.0.0"
+ http-errors: "npm:^2.0.0"
+ mime-types: "npm:^3.0.1"
+ ms: "npm:^2.1.3"
+ on-finished: "npm:^2.4.1"
+ range-parser: "npm:^1.2.1"
+ statuses: "npm:^2.0.1"
+ checksum: 10c0/531bcfb5616948d3468d95a1fd0adaeb0c20818ba4a500f439b800ca2117971489e02074ce32796fd64a6772ea3e7235fe0583d8241dbd37a053dc3378eff9a5
+ languageName: node
+ linkType: hard
+
"sentence-case@npm:^2.1.0":
version: 2.1.1
resolution: "sentence-case@npm:2.1.1"
@@ -27688,6 +28007,18 @@ __metadata:
languageName: node
linkType: hard
+"serve-static@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "serve-static@npm:2.2.0"
+ dependencies:
+ encodeurl: "npm:^2.0.0"
+ escape-html: "npm:^1.0.3"
+ parseurl: "npm:^1.3.3"
+ send: "npm:^1.2.0"
+ checksum: 10c0/30e2ed1dbff1984836cfd0c65abf5d3f3f83bcd696c99d2d3c97edbd4e2a3ff4d3f87108a7d713640d290a7b6fe6c15ddcbc61165ab2eaad48ea8d3b52c7f913
+ languageName: node
+ linkType: hard
+
"set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0":
version: 2.0.0
resolution: "set-blocking@npm:2.0.0"
@@ -27850,6 +28181,41 @@ __metadata:
languageName: node
linkType: hard
+"side-channel-list@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "side-channel-list@npm:1.0.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ object-inspect: "npm:^1.13.3"
+ checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d
+ languageName: node
+ linkType: hard
+
+"side-channel-map@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "side-channel-map@npm:1.0.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.5"
+ object-inspect: "npm:^1.13.3"
+ checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672
+ languageName: node
+ linkType: hard
+
+"side-channel-weakmap@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "side-channel-weakmap@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.5"
+ object-inspect: "npm:^1.13.3"
+ side-channel-map: "npm:^1.0.1"
+ checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185
+ languageName: node
+ linkType: hard
+
"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6":
version: 1.0.6
resolution: "side-channel@npm:1.0.6"
@@ -27862,6 +28228,19 @@ __metadata:
languageName: node
linkType: hard
+"side-channel@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "side-channel@npm:1.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ object-inspect: "npm:^1.13.3"
+ side-channel-list: "npm:^1.0.0"
+ side-channel-map: "npm:^1.0.1"
+ side-channel-weakmap: "npm:^1.0.2"
+ checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6
+ languageName: node
+ linkType: hard
+
"sigmund@npm:~1.0.0":
version: 1.0.1
resolution: "sigmund@npm:1.0.1"
@@ -28411,6 +28790,13 @@ __metadata:
languageName: node
linkType: hard
+"statuses@npm:^2.0.1":
+ version: 2.0.2
+ resolution: "statuses@npm:2.0.2"
+ checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f
+ languageName: node
+ linkType: hard
+
"steno@npm:^0.4.1":
version: 0.4.4
resolution: "steno@npm:0.4.4"
@@ -29875,6 +30261,17 @@ __metadata:
languageName: node
linkType: hard
+"type-is@npm:^2.0.0, type-is@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "type-is@npm:2.0.1"
+ dependencies:
+ content-type: "npm:^1.0.5"
+ media-typer: "npm:^1.1.0"
+ mime-types: "npm:^3.0.0"
+ checksum: 10c0/7f7ec0a060b16880bdad36824ab37c26019454b67d73e8a465ed5a3587440fbe158bc765f0da68344498235c877e7dbbb1600beccc94628ed05599d667951b99
+ languageName: node
+ linkType: hard
+
"type-is@npm:~1.6.18":
version: 1.6.18
resolution: "type-is@npm:1.6.18"
@@ -30747,7 +31144,7 @@ __metadata:
languageName: node
linkType: hard
-"vary@npm:^1, vary@npm:~1.1.2":
+"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2":
version: 1.1.2
resolution: "vary@npm:1.1.2"
checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f
@@ -31807,10 +32204,26 @@ __metadata:
languageName: node
linkType: hard
-"yoga-wasm-web@npm:^0.3.3":
- version: 0.3.3
- resolution: "yoga-wasm-web@npm:0.3.3"
- checksum: 10c0/d46ae3a436409e89eb0ea3b8c7624dafaf2c846d9038fdf8aa0cc839f73a2577b679bdc22997596177de74c580a6cdc3206c98fd2acd91b66f85462d9d9d260a
+"yoga-layout@npm:^3.2.1":
+ version: 3.2.1
+ resolution: "yoga-layout@npm:3.2.1"
+ checksum: 10c0/9001e51be993c85e03757e5a04a2b61b8b30c9e5a7865d0156ca87a6431a3b717d51eb4990bfe588189fcfeac688dd9c3de707bbd50d1c344a84e63974cc54a8
+ languageName: node
+ linkType: hard
+
+"zod-to-json-schema@npm:^3.24.1":
+ version: 3.24.6
+ resolution: "zod-to-json-schema@npm:3.24.6"
+ peerDependencies:
+ zod: ^3.24.1
+ checksum: 10c0/b907ab6d057100bd25a37e5545bf5f0efa5902cd84d3c3ec05c2e51541431a47bd9bf1e5e151a244273409b45f5986d55b26e5d207f98abc5200702f733eb368
+ languageName: node
+ linkType: hard
+
+"zod@npm:^3.23.8":
+ version: 3.25.76
+ resolution: "zod@npm:3.25.76"
+ checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c
languageName: node
linkType: hard