diff --git a/packages/dev/s2-docs/src/ColorSearchView.tsx b/packages/dev/s2-docs/src/ColorSearchView.tsx index 27ba1334063..a19b193f925 100644 --- a/packages/dev/s2-docs/src/ColorSearchView.tsx +++ b/packages/dev/s2-docs/src/ColorSearchView.tsx @@ -6,7 +6,7 @@ import CheckmarkCircle from '@react-spectrum/s2/icons/CheckmarkCircle'; import {colorSwatch, getColorScale} from './color.macro' with {type: 'macro'}; import {focusRing, iconStyle, style} from '@react-spectrum/s2/style' with {type: 'macro'}; import {Header, ListBox, ListBoxItem, ListBoxSection} from 'react-aria-components'; -import InfoCircle from '@react-spectrum/s2/icons/InfoCircle'; +import {InfoMessage} from './colorSearchData'; // eslint-disable-next-line monorepo/no-internal-import import NoSearchResults from '@react-spectrum/s2/illustrations/linear/NoSearchResults'; import React, {useCallback, useEffect, useRef, useState} from 'react'; @@ -19,7 +19,7 @@ const itemStyle = style({ justifyContent: 'center', alignItems: 'center', gap: 8, - padding: 8, + paddingY: 8, backgroundColor: { default: 'gray-50', isHovered: 'gray-100', @@ -47,13 +47,6 @@ const swatchStyle = style({ forcedColorAdjust: 'none' }); -const listBoxStyle = style({ - width: 'full', - display: 'flex', - flexDirection: 'column', - gap: 24 -}); - const sectionStyle = style({ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(100px, 1fr))', @@ -199,20 +192,6 @@ const scaleSwatches: Record = { }; -export function CopyInfoMessage() { - return ( -
-
- - Press a color to copy its name. -
- - See styling for more information. - -
- ); -} - interface ColorSearchViewProps { filteredItems: Array<{ id: string, @@ -268,8 +247,8 @@ export function ColorSearchView({filteredItems, exactMatches = new Set(), closes } return ( -
- + <> + Press a color to copy its name. See styling for more information. { @@ -282,7 +261,15 @@ export function ColorSearchView({filteredItems, exactMatches = new Set(), closes } }} layout="grid" - className={listBoxStyle} + className={style({ + width: 'full', + display: 'flex', + flexDirection: 'column', + gap: 24, + flexGrow: 1, + overflow: 'auto', + scrollPaddingY: 4 + })} dependencies={[copiedId, exactMatches, closestMatches]} items={sections}> {section => ( @@ -300,7 +287,7 @@ export function ColorSearchView({filteredItems, exactMatches = new Set(), closes )} -
+ ); } diff --git a/packages/dev/s2-docs/src/IconSearchView.tsx b/packages/dev/s2-docs/src/IconSearchView.tsx index ab1ad77364d..4a226bfbd27 100644 --- a/packages/dev/s2-docs/src/IconSearchView.tsx +++ b/packages/dev/s2-docs/src/IconSearchView.tsx @@ -4,12 +4,12 @@ import {Autocomplete, GridLayout, ListBox, ListBoxItem, Size, useFilter, Virtualizer} from 'react-aria-components'; import CheckmarkCircle from '@react-spectrum/s2/icons/CheckmarkCircle'; import Close from '@react-spectrum/s2/icons/Close'; -import {Content, Heading, IllustratedMessage, pressScale, SearchField, Skeleton, Text, ToastQueue} from '@react-spectrum/s2'; +import {Content, Heading, IllustratedMessage, Link, pressScale, SearchField, Skeleton, Text, ToastQueue} from '@react-spectrum/s2'; import {focusRing, iconStyle, style} from '@react-spectrum/s2/style' with {type: 'macro'}; import {iconAliases} from './iconAliases.js'; // @ts-ignore import icons from '/packages/@react-spectrum/s2/s2wf-icons/*.svg'; -import InfoCircle from '@react-spectrum/s2/icons/InfoCircle'; +import {InfoMessage} from './colorSearchData'; // eslint-disable-next-line monorepo/no-internal-import import NoSearchResults from '@react-spectrum/s2/illustrations/linear/NoSearchResults'; import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; @@ -19,14 +19,19 @@ export const iconList = Object.keys(icons).map(name => ({id: name.replace(/^S2_I export function useIconFilter() { let {contains} = useFilter({sensitivity: 'base'}); return useCallback((textValue: string, inputValue: string) => { + const trimmedInput = inputValue.trim(); + // If input is empty after trimming, show all items + if (!trimmedInput) { + return true; + } // Check for alias matches for (const alias of Object.keys(iconAliases)) { - if (contains(alias, inputValue) && iconAliases[alias].includes(textValue)) { + if (contains(alias, trimmedInput) && iconAliases[alias].includes(textValue)) { return true; } } // Also compare for substrings in the icon's actual name - return textValue != null && contains(textValue, inputValue); + return textValue != null && contains(textValue, trimmedInput); }, [contains]); } @@ -57,15 +62,6 @@ export function useCopyImport() { return {copiedId, handleCopyImport}; } -function CopyInfoMessage() { - return ( -
- - Press an item to copy its import statement -
- ); -} - interface IconListBoxProps { items: typeof iconList, copiedId: string | null, @@ -133,7 +129,7 @@ export function IconSearchView({filteredItems, listBoxClassName}: IconSearchView return ( <> - + Press an item to copy its import statement. See Icons for more information. ); @@ -236,7 +232,7 @@ export function IconsPageSearch() {
- + Press an item to copy its import statement. See Icons for more information. { + const trimmedInput = inputValue.trim(); + // If input is empty after trimming, show all items + if (!trimmedInput) { + return true; + } // Check if input matches an alias that maps to this illustration name for (const alias of Object.keys(illustrationAliases)) { - if (contains(alias, inputValue) && illustrationAliases[alias].includes(textValue)) { + if (contains(alias, trimmedInput) && illustrationAliases[alias].includes(textValue)) { return true; } } // Also compare for substrings in the illustration's actual name - return textValue != null && contains(textValue, inputValue); + return textValue != null && contains(textValue, trimmedInput); }, [contains]); return ( @@ -80,7 +85,7 @@ export function IllustrationCards() { Generic 2 )} - + Press an item to copy its import statement. See Illustrations for more information. }> @@ -97,14 +102,6 @@ function Loading() { ); } -function CopyInfoMessage() { - return ( -
- - Press an item to copy its import statement -
- ); -} function useCopyImport(variant: string, gradientStyle: string) { let [copiedId, setCopiedId] = useState(null); diff --git a/packages/dev/s2-docs/src/MobileSearchMenu.tsx b/packages/dev/s2-docs/src/MobileSearchMenu.tsx index 5cf646d8be4..501f7d71a5e 100644 --- a/packages/dev/s2-docs/src/MobileSearchMenu.tsx +++ b/packages/dev/s2-docs/src/MobileSearchMenu.tsx @@ -328,7 +328,6 @@ function MobileNav({initialTag}: {initialTag?: string}) { selectedTagId={selectedSection} onSectionSelectionChange={handleTagSelectionChange} onResourceSelectionChange={handleTagSelectionChange} - isMobile wrapperClassName={style({paddingTop: 0})} contentClassName={style({display: 'flex', flexDirection: 'row', alignItems: 'center', gap: 8, marginX: 0})} />
@@ -356,19 +355,12 @@ function MobileNav({initialTag}: {initialTag?: string}) { )} {!showIcons && isColorsSelected && library.id === 'react-spectrum' && ( -
- }> - - -
+ }> + + )} {!showIcons && (!isColorsSelected || library.id !== 'react-spectrum') && ( - - { - preloadComponentImages(sections.find(s => s.id === tag)?.children?.map(c => c.name) || []); - }} /> +
+ { + preloadComponentImages(sections.find(s => s.id === tag)?.children?.map(c => c.name) || []); + }} /> +
{isIconsSelected ? (
}> @@ -195,7 +196,7 @@ export function SearchMenu(props: SearchMenuProps) {
) : null} {selectedTagId === 'colors' && ( -
+
}> diff --git a/packages/dev/s2-docs/src/SearchTagGroups.tsx b/packages/dev/s2-docs/src/SearchTagGroups.tsx index 521d0335d1d..62cf17bfd6e 100644 --- a/packages/dev/s2-docs/src/SearchTagGroups.tsx +++ b/packages/dev/s2-docs/src/SearchTagGroups.tsx @@ -18,7 +18,6 @@ interface SearchTagGroupsProps { selectedTagId: string | undefined, onSectionSelectionChange: (keys: Iterable) => void, onResourceSelectionChange?: (keys: Iterable) => void, - isMobile?: boolean, wrapperClassName?: string, contentClassName?: string, onHover?: (id: Key) => void @@ -30,7 +29,6 @@ export function SearchTagGroups({ selectedTagId, onSectionSelectionChange, onResourceSelectionChange, - isMobile = false, wrapperClassName, contentClassName, onHover @@ -58,7 +56,7 @@ export function SearchTagGroups({ onSelectionChange={onSectionSelectionChange} aria-label="Sections" items={sectionTags} - UNSAFE_style={isMobile ? {whiteSpace: 'nowrap'} : undefined}> + UNSAFE_style={{whiteSpace: 'nowrap'}}> {(tag) => ( onHover?.(tag.id)} onPressStart={() => onHover?.(tag.id)}> {tag.name} @@ -79,7 +77,7 @@ export function SearchTagGroups({ onSelectionChange={onResourceSelectionChange} aria-label="Resources" items={resourceTags} - UNSAFE_style={isMobile ? {whiteSpace: 'nowrap'} : undefined}> + UNSAFE_style={{whiteSpace: 'nowrap'}}> {(tag) => ( {tag.name} diff --git a/packages/dev/s2-docs/src/colorSearchData.tsx b/packages/dev/s2-docs/src/colorSearchData.tsx index 2200a33ffb7..a5d798e3114 100644 --- a/packages/dev/s2-docs/src/colorSearchData.tsx +++ b/packages/dev/s2-docs/src/colorSearchData.tsx @@ -1,11 +1,11 @@ 'use client'; -import {CopyInfoMessage} from './ColorSearchView'; import {getColorHexMap} from './color.macro' with {type: 'macro'}; import {Header, ListBox, ListBoxItem, ListBoxSection} from 'react-aria-components'; +import {iconStyle, style} from '@react-spectrum/s2/style' with {type: 'macro'}; +import InfoCircle from '@react-spectrum/s2/icons/InfoCircle'; +import {Link, Skeleton, Text} from '@react-spectrum/s2'; import React, {useMemo, useRef} from 'react'; -import {Skeleton, Text} from '@react-spectrum/s2'; -import {style} from '@react-spectrum/s2/style' with {type: 'macro'}; export const colorHexMaps = getColorHexMap(); @@ -148,6 +148,22 @@ const headerStyle = style({ marginBottom: 4 }); +interface InfoMessageProps { + /** The content to display in the message. */ + children: React.ReactNode +} + +export function InfoMessage({children}: InfoMessageProps) { + return ( +
+ + + {children} + +
+ ); +} + function SkeletonColorItem({item}: {item: {id: string}}) { const ref = useRef(null); return ( @@ -204,7 +220,7 @@ export function ColorSearchSkeleton() { return (
- + Press a color to copy its name. See styling for more information.