diff --git a/packages/@react-spectrum/ai/src/HorizontalCard.tsx b/packages/@react-spectrum/ai/src/HorizontalCard.tsx
index bdbd2e80f9e..11b5828bbd6 100644
--- a/packages/@react-spectrum/ai/src/HorizontalCard.tsx
+++ b/packages/@react-spectrum/ai/src/HorizontalCard.tsx
@@ -28,6 +28,7 @@ import {DOMProps, DOMRef, GlobalDOMAttributes} from '@react-types/shared';
import {filterDOMProps} from 'react-aria/filterDOMProps';
import {FooterContext} from '@react-spectrum/s2/Footer';
import {GridListItem, GridListItemProps} from 'react-aria-components/GridList';
+import {IconContext} from '@react-spectrum/s2/Icon';
import {ImageContext} from '@react-spectrum/s2/Image';
import {ImageCoordinator} from '@react-spectrum/s2/ImageCoordinator';
import {inertValue} from 'react-aria/private/utils/inertValue';
@@ -312,7 +313,7 @@ const image = style({
pointerEvents: 'none'
});
-let title = style({
+let title = style<{size: 'XS' | 'S' | 'M' | 'L' | 'XL'; isBasic?: boolean}>({
font: 'title',
fontSize: {
size: {
@@ -323,11 +324,14 @@ let title = style({
XL: 'title-lg'
}
},
- lineClamp: 3,
+ lineClamp: {
+ default: 3,
+ isBasic: 1
+ },
gridArea: 'title'
});
-let description = style({
+let description = style<{size: 'XS' | 'S' | 'M' | 'L' | 'XL'; isBasic?: boolean}>({
font: 'body',
fontSize: {
size: {
@@ -338,7 +342,10 @@ let description = style({
XL: 'body'
}
},
- lineClamp: 3,
+ lineClamp: {
+ default: 3,
+ isBasic: 1
+ },
gridArea: 'description'
});
@@ -347,7 +354,7 @@ let content = style({
// By default, all elements are displayed in a stack.
// If an action menu is present, place it next to the title.
gridTemplateColumns: {
- default: ['1fr'],
+ default: ['minmax(0, 1fr)'],
':has([data-slot=menu])': ['minmax(0, 1fr)', 'auto']
},
gridTemplateAreas: {
@@ -356,6 +363,7 @@ let content = style({
},
columnGap: 4,
flexGrow: 1,
+ minWidth: 0,
alignItems: 'baseline',
alignContent: 'start',
rowGap: {
@@ -456,8 +464,8 @@ const Card = forwardRef(function Card(
{
slots: {
[DEFAULT_SLOT]: {},
- title: {styles: title({size})},
- description: {styles: description({size})}
+ title: {styles: title({size, isBasic})},
+ description: {styles: description({size, isBasic})}
}
}
],
@@ -802,6 +810,15 @@ export const HorizontalCard = forwardRef(function HorizontalCard(
);
});
+const iconThumbnailStyles = style({
+ position: 'relative',
+ alignSelf: 'center',
+ flexShrink: 0,
+ pointerEvents: 'none',
+ userSelect: 'none',
+ size: '--basic-thumb-size'
+});
+
export const BasicHorizontalCard = forwardRef(function BasicHorizontalCard(
props: BasicCardProps,
ref: DOMRef
@@ -840,6 +857,17 @@ export const BasicHorizontalCard = forwardRef(function BasicHorizontalCard(
}
}
],
+ [
+ IconContext,
+ {
+ slots: {
+ icon: {},
+ thumbnail: {
+ styles: iconThumbnailStyles
+ }
+ }
+ }
+ ],
[
FooterContext,
{
diff --git a/packages/@react-spectrum/ai/src/PromptField.tsx b/packages/@react-spectrum/ai/src/PromptField.tsx
index d48a7f04857..9356f696e64 100644
--- a/packages/@react-spectrum/ai/src/PromptField.tsx
+++ b/packages/@react-spectrum/ai/src/PromptField.tsx
@@ -37,11 +37,11 @@ import {
useRef,
useState
} from 'react';
-import {DOMRef} from '@react-types/shared';
+import {FocusableRef} from '@react-types/shared';
import {IconContext} from '@react-spectrum/s2';
import {Image, Text} from '@react-spectrum/s2/Card';
-import intlMessages from '../intl/*.json';
// @ts-ignore
+import intlMessages from '../intl/*.json';
import {isFileDropItem, useDrop} from 'react-aria-components/useDrop';
import {Link} from '@react-spectrum/s2/Link';
import {Menu, MenuItem, MenuItemProps, MenuTrigger} from '@react-spectrum/s2/Menu';
@@ -70,8 +70,8 @@ import {
} from 'react-aria-components/TokenField';
import {Tooltip, TooltipTrigger} from '@react-spectrum/s2/Tooltip';
import {useControlledState} from 'react-stately/useControlledState';
-import {useDOMRef} from './useDOMRef';
import {useEffectEvent} from 'react-aria/private/utils/useEffectEvent';
+import {useFocusableRef} from './useDOMRef';
import {useFocusWithin} from 'react-aria/useFocusWithin';
import {useKeyboard} from 'react-aria/useKeyboard';
import {useLocale} from 'react-aria/I18nProvider';
@@ -182,7 +182,7 @@ function matchMimeType(mimeType: string, acceptedMimeTypes: string[]): boolean {
export const PromptField = forwardRef(function PromptField(
props: PromptFieldProps,
- ref: DOMRef
+ ref: FocusableRef
) {
let {
children,
@@ -195,7 +195,10 @@ export const PromptField = forwardRef(function PromptField(
variant = 'balanced',
brandColor
} = props;
- let domRef = useDOMRef(ref);
+ // Not using RAC DropZone because it adds its own focusable button,
+ // and we want to avoid an extra tab. We support pasting files directly into the input.
+ let inputRef = useRef(null);
+ let domRef = useFocusableRef(ref, inputRef);
let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/ai');
let [prompt, setPrompt] = useControlledState(
props.value,
@@ -207,10 +210,6 @@ export const PromptField = forwardRef(function PromptField(
props.defaultAttachments ?? [],
props.onAttachmentsChange
);
-
- // Not using RAC DropZone because it adds its own focusable button,
- // and we want to avoid an extra tab. We support pasting files directly into the input.
- let inputRef = useRef(null);
let {dropProps, isDropTarget} = useDrop({
ref: inputRef,
hasDropButton: true,
@@ -342,6 +341,9 @@ export interface PromptTokenFieldProps {
pixelLoader?: Cell[] | Cell[][];
placeholder?: string;
onKeyDown?: (e: React.KeyboardEvent) => void;
+ // TODO: temp api for coworker so that the weird popover shrinking behavior
+ // doesn't appear when rendering near edge of page
+ menuWidth?: number;
}
export function PromptTokenField(props: PromptTokenFieldProps) {
@@ -351,6 +353,7 @@ export function PromptTokenField(props: PromptTokenFieldProps) {
children,
pixelLoader,
placeholder,
+ menuWidth,
onKeyDown: onKeyDownProp
} = props;
let {keyboardProps} = useKeyboard({onKeyDown: onKeyDownProp});
@@ -473,6 +476,7 @@ export function PromptTokenField(props: PromptTokenFieldProps) {
filterAnchor={filterAnchor}
items={useDeferredValue(items)}
isFocused={isFocused}
+ menuWidth={menuWidth}
/>
@@ -483,10 +487,12 @@ export interface PromptTokenFieldPopoverProps extends Omit