Skip to content

Commit cf7c154

Browse files
authored
docs: S2 docs layout + general improvements (#9159)
* close SearchMenu on client navigation * add footer * made Nav and ToC widths static * fix min-height issue on mobile * show Toast if route can't load * add toast for clipboard copy failures * fix React insertion effect * improve markdown menu * add skeleton loading for client routing * copy update * remote extra startTransitions and use use hook * improve skeleton loading and optimistic render link selection + ToC * add delay to showing skeleton * fix getPageInfo logic * try fixing getPageInfo again * try fixing normalizePathname on build * add prefetch onPressStart * revert optimistic UI and show error toast if fetch fails * fix skeleton title * don't clear targetPathname until new navigation * move prefetch to a global pointerover listener * close search menu when navigation starts * show skeleton loading immediately when navigation starts * re-use tag group in SearchMenu and MobileSearchMenu * fix and extract out search logic * remove blog and releases index pages from search * reduce size of icons in dnd blog post example * fix Forms password example * centralize search logic * add escapeKeyBehavior="none" to tag groups * fix toc scroll mask * simplify pathname logic * remove promises from prefetch cache once resolved * use useOptimistic * use fetchRSC promise as loading source * avoid navigation race conditions * prefetch on focus (same as pointerover) * function for checking if client link * fix search results sorting for All tag * add message to currentAbortController.abort * lint
1 parent 61ce8a7 commit cf7c154

24 files changed

+1506
-591
lines changed

packages/dev/s2-docs/pages/react-aria/blog/DragBetweenListsExample.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ function BidirectionalDnDListBox(props) {
8585
style={{width: 300, height: 300, overflow: 'auto'}}>
8686
{item => (
8787
<ListBoxItem textValue={item.name} style={{display: 'flex', alignItems: 'center', gap: 8, flexDirection: 'row', justifyContent: 'flex-start'}}>
88-
{item.type === 'folder' ? <Folder /> : <File />}
88+
{item.type === 'folder' ? <Folder size={16} /> : <File size={16} />}
8989
<span>{item.name}</span>
9090
</ListBoxItem>
9191
)}

packages/dev/s2-docs/pages/react-aria/blog/index.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default Layout;
1414

1515
export const section = 'Blog';
1616
export const title = 'Blog';
17-
17+
export const hideFromSearch = true;
1818
export const tags = ['blog', 'articles', 'posts'];
1919

2020
# Blog

packages/dev/s2-docs/pages/react-aria/releases/index.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default Layout;
1414
export const section = 'Releases';
1515
export const tags = ['changelog', 'versions', 'updates'];
1616
export const title = 'Releases';
17+
export const hideFromSearch = true;
1718

1819
# Releases
1920

packages/dev/s2-docs/pages/s2/forms.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ function Example() {
240240

241241
return (
242242
<TextField
243+
type="password"
243244
label="Password"
244245
placeholder="Choose a password"
245246
/*- begin highlight -*/

packages/dev/s2-docs/pages/s2/releases/index.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default Layout;
1414
export const section = 'Releases';
1515
export const tags = ['changelog', 'versions', 'updates'];
1616
export const title = 'Releases';
17+
export const hideFromSearch = true;
1718

1819
# Releases
1920

packages/dev/s2-docs/src/CodePlatter.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import {ActionButton, ActionButtonGroup, Button, ButtonGroup, Content, createIcon, Dialog, DialogContainer, Heading, Link, Menu, MenuItem, MenuTrigger, Text, Tooltip, TooltipTrigger} from '@react-spectrum/s2';
3+
import {ActionButton, ActionButtonGroup, Button, ButtonGroup, Content, createIcon, Dialog, DialogContainer, Heading, Link, Menu, MenuItem, MenuTrigger, Text, UNSTABLE_ToastQueue as ToastQueue, Tooltip, TooltipTrigger} from '@react-spectrum/s2';
44
import {CopyButton} from './CopyButton';
55
import {createCodeSandbox, getCodeSandboxFiles} from './CodeSandbox';
66
import {createStackBlitz} from './StackBlitz';
@@ -120,7 +120,9 @@ export function CodePlatter({children, type, showCoachMark}: CodePlatterProps) {
120120
if (node instanceof HTMLHeadingElement && node.id) {
121121
url.hash = '#' + node.id;
122122
}
123-
navigator.clipboard.writeText(url.toString());
123+
navigator.clipboard.writeText(url.toString()).catch(() => {
124+
ToastQueue.negative('Failed to copy link.');
125+
});
124126
}}>
125127
<LinkIcon />
126128
<Text slot="label">Copy link</Text>
@@ -300,7 +302,9 @@ function ShadcnDialog({registryUrl}) {
300302
<Button
301303
variant="accent"
302304
onPress={() => {
303-
navigator.clipboard.writeText(preRef.current!.textContent!);
305+
navigator.clipboard.writeText(preRef.current!.textContent!).catch(() => {
306+
ToastQueue.negative('Failed to copy command. Please try again.');
307+
});
304308
close();
305309
}}>
306310
Copy and close

packages/dev/s2-docs/src/CopyButton.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import {ActionButton, Tooltip, TooltipTrigger} from '@react-spectrum/s2';
3+
import {ActionButton, UNSTABLE_ToastQueue as ToastQueue, Tooltip, TooltipTrigger} from '@react-spectrum/s2';
44
import CheckmarkCircle from '@react-spectrum/s2/icons/CheckmarkCircle';
55
import Copy from '@react-spectrum/s2/icons/Copy';
66
import React, {useEffect, useRef, useState} from 'react';
@@ -44,7 +44,7 @@ export function CopyButton({text, getText, ariaLabel = 'Copy', tooltip = 'Copy',
4444
setIsCopied(true);
4545
timeout.current = setTimeout(() => setIsCopied(false), 2000);
4646
}).catch(() => {
47-
// noop
47+
ToastQueue.negative('Failed to copy.');
4848
});
4949
};
5050

packages/dev/s2-docs/src/Header.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import BetaApp from '@react-spectrum/s2/icons/BetaApp';
66
import {flushSync} from 'react-dom';
77
import {getLibraryFromPage, getLibraryIcon, getLibraryLabel} from './library';
88
import GithubLogo from './icons/GithubLogo';
9-
import {MarkdownMenu} from './MarkdownMenu';
109
// @ts-ignore
1110
import {PageProps} from '@parcel/rsc';
1211
import React, {CSSProperties, useId, useState} from 'react';
@@ -115,7 +114,6 @@ export default function Header(props: PageProps) {
115114
<BetaApp />
116115
<Text>Beta Preview</Text>
117116
</Badge>
118-
<MarkdownMenu url={currentPage.url} />
119117
<ActionButton aria-label="React Spectrum GitHub repo" size="L" isQuiet onPress={() => window.open('https://github.com/adobe/react-spectrum', '_blank', 'noopener,noreferrer')}>
120118
<GithubLogo />
121119
</ActionButton>

packages/dev/s2-docs/src/IconSearchView.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import {Autocomplete, GridLayout, ListBox, ListBoxItem, Size, useFilter, Virtualizer} from 'react-aria-components';
55
import CheckmarkCircle from '@react-spectrum/s2/icons/CheckmarkCircle';
66
import Close from '@react-spectrum/s2/icons/Close';
7-
import {Content, Heading, IllustratedMessage, pressScale, SearchField, Skeleton, Text} from '@react-spectrum/s2';
7+
import {Content, Heading, IllustratedMessage, pressScale, SearchField, Skeleton, Text, UNSTABLE_ToastQueue as ToastQueue} from '@react-spectrum/s2';
88
import {focusRing, iconStyle, style} from '@react-spectrum/s2/style' with {type: 'macro'};
99
import {iconAliases} from './iconAliases.js';
1010
// @ts-ignore
@@ -50,7 +50,7 @@ export function useCopyImport() {
5050
setCopiedId(id);
5151
timeout.current = setTimeout(() => setCopiedId(null), 2000);
5252
}).catch(() => {
53-
// noop
53+
ToastQueue.negative('Failed to copy import statement.');
5454
});
5555
}, []);
5656

@@ -124,16 +124,17 @@ const itemStyle = style({
124124
});
125125

126126
interface IconSearchViewProps {
127-
filteredItems: typeof iconList
127+
filteredItems: typeof iconList,
128+
listBoxClassName?: string
128129
}
129130

130-
export function IconSearchView({filteredItems}: IconSearchViewProps) {
131+
export function IconSearchView({filteredItems, listBoxClassName}: IconSearchViewProps) {
131132
let {copiedId, handleCopyImport} = useCopyImport();
132133

133134
return (
134135
<>
135136
<CopyInfoMessage />
136-
<IconListBox items={filteredItems} copiedId={copiedId} onAction={handleCopyImport} />
137+
<IconListBox items={filteredItems} copiedId={copiedId} onAction={handleCopyImport} listBoxClassName={listBoxClassName} />
137138
</>
138139
);
139140
}
@@ -218,7 +219,7 @@ export function IconSearchSkeleton() {
218219
<ListBox
219220
items={mockItems}
220221
layout="grid"
221-
className={style({width: '100%', scrollPaddingY: 4, overflow: 'auto'})}>
222+
className={style({flexGrow: 1, overflow: 'auto', width: '100%', scrollPaddingY: 4})}>
222223
{(item) => <SkeletonIconItem item={item} />}
223224
</ListBox>
224225
</Virtualizer>

packages/dev/s2-docs/src/IllustrationCards.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use client';
22

33
import {Autocomplete, GridLayout, ListBox, ListBoxItem, Size, useFilter, Virtualizer} from 'react-aria-components';
4-
import {Content, Heading, IllustratedMessage, pressScale, ProgressCircle, Radio, RadioGroup, SearchField, SegmentedControl, SegmentedControlItem, Text} from '@react-spectrum/s2';
4+
import {Content, Heading, IllustratedMessage, pressScale, ProgressCircle, Radio, RadioGroup, SearchField, SegmentedControl, SegmentedControlItem, Text, UNSTABLE_ToastQueue as ToastQueue} from '@react-spectrum/s2';
55
import {focusRing, style} from '@react-spectrum/s2/style' with {type: 'macro'};
66
// @ts-ignore
77
import Gradient from '@react-spectrum/s2/icons/Gradient';
@@ -100,7 +100,7 @@ let handleCopyImport = (id: string, variant: string, gradientStyle: string) => {
100100
navigator.clipboard.writeText(importText).then(() => {
101101
// noop
102102
}).catch(() => {
103-
// noop
103+
ToastQueue.negative('Failed to copy import statement.');
104104
});
105105
};
106106

0 commit comments

Comments
 (0)