MCPcopy Create free account
hub / github.com/adobe/react-spectrum / Header

Function Header

packages/dev/s2-docs/src/Header.tsx:116–274  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

114}
115
116export default function Header() {
117 const {currentPage} = useRouter();
118 const [searchOpen, setSearchOpen] = useState(false);
119 const searchMenuId = useId();
120 let ref = useRef(null);
121 let iconRef = useRef<HTMLDivElement | null>(null);
122 let labelRef = useRef<HTMLDivElement | null>(null);
123 let searchRef = useRef<HTMLDivElement | null>(null);
124 let renderCallback = useRef<(() => void) | null>(null);
125
126 let openSearchMenu = async () => {
127 if (!document.startViewTransition) {
128 setSearchOpen(prev => !prev);
129 return;
130 }
131
132 // Preload SearchMenu so it is ready to render immediately.
133 await preloadSearchMenu();
134
135 // Don't transition the entire page.
136 document.documentElement.style.viewTransitionName = 'none';
137 iconRef.current!.style.viewTransitionName = 'search-menu-icon';
138 labelRef.current!.style.viewTransitionName = 'search-menu-label';
139 searchRef.current!.style.viewTransitionName = 'search-menu-search-field';
140 let viewTransition = document.startViewTransition(() => {
141 // Wait until next render. Using flushSync causes flickering.
142 return new Promise<void>(resolve => {
143 iconRef.current!.style.viewTransitionName = '';
144 labelRef.current!.style.viewTransitionName = '';
145 searchRef.current!.style.viewTransitionName = '';
146 renderCallback.current = resolve;
147 setSearchOpen(prev => !prev);
148 });
149 });
150
151 viewTransition.finished.then(() => {
152 document.documentElement.style.viewTransitionName = '';
153 });
154 };
155
156 let closeSearchMenu = () => {
157 if (!document.startViewTransition) {
158 setSearchOpen(false);
159 return;
160 }
161
162 document.documentElement.style.viewTransitionName = 'none';
163 let viewTransition = document.startViewTransition(() => {
164 return new Promise<void>(resolve => {
165 renderCallback.current = resolve;
166 setSearchOpen(false);
167 iconRef.current!.style.viewTransitionName = 'search-menu-icon';
168 labelRef.current!.style.viewTransitionName = 'search-menu-label';
169 searchRef.current!.style.viewTransitionName = 'search-menu-search-field';
170 });
171 });
172
173 viewTransition.finished.then(() => {

Callers

nothing calls this directly

Calls 8

useRouterFunction · 0.90
useIdFunction · 0.90
getLibraryFromPageFunction · 0.90
getBaseUrlFunction · 0.90
pressScaleFunction · 0.90
getButtonIconFunction · 0.85
getButtonTextFunction · 0.85
currentMethod · 0.45

Tested by

no test coverage detected