Skip to content

Commit 797e8af

Browse files
committed
feat: partial hydration
1 parent a29e794 commit 797e8af

15 files changed

Lines changed: 233 additions & 58 deletions

File tree

package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
"prettier": "3.8.5"
6262
},
6363
"dependencies": {
64+
"@11ty/is-land": "^5.0.1",
6465
"@actions/core": "^3.0.0",
6566
"@fontsource-variable/open-sans": "^5.3.0",
6667
"@fontsource/ibm-plex-mono": "^5.3.0",

src/generators/web/__tests__/generate.test.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ describe('web generate', () => {
187187
/export const server = false;/
188188
);
189189

190+
assert.match(entries.get('fs.jsx'), /registerIsland\("content"/);
191+
190192
await Promise.all(
191193
[...pages].map(async ([fileName, html]) => {
192194
const path = join(output, fileName);

src/generators/web/ui/components/Banner.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ArrowUpRightIcon } from '@heroicons/react/24/outline';
22
import Banner from '@node-core/ui-components/Common/Banner';
33

44
import useBanners from '../hooks/useBanners.mjs';
5+
import withIsland from '../islands/withIsland.jsx';
56

67
import { remoteConfigUrl, version } from '#theme/config';
78

@@ -29,4 +30,4 @@ const Banners = () => {
2930
);
3031
};
3132

32-
export default Banners;
33+
export default withIsland(Banners, { name: 'Banner', on: { idle: true } });

src/generators/web/ui/components/Layout/index.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import TableOfContents from '@node-core/ui-components/Common/TableOfContents';
22
import Article from '@node-core/ui-components/Containers/Article';
33

4+
import Content from '../../islands/Content.jsx';
45
import Banner from '../Banner';
56

6-
import { server } from '#theme/config';
77
import Footer from '#theme/Footer';
88
import MetaBar from '#theme/Metabar';
99
import NavBar from '#theme/Navigation';
@@ -20,15 +20,17 @@ import SideBar from '#theme/Sidebar';
2020
*/
2121
export default ({ metadata, headings, readingTime, children }) => (
2222
<>
23-
{!server && <Banner />}
23+
<Banner />
2424
<NavBar metadata={metadata} />
2525
<Article>
2626
<SideBar metadata={metadata} />
2727
<div>
2828
<div>
2929
<TableOfContents headings={headings} summaryTitle="On this page" />
3030
<br />
31-
<main>{children}</main>
31+
<main>
32+
<Content>{children}</Content>
33+
</main>
3234
</div>
3335
<MetaBar
3436
metadata={metadata}
Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,30 @@
1-
import ThemeToggle from '@node-core/ui-components/Common/ThemeToggle';
21
import NavBar from '@node-core/ui-components/Containers/NavBar';
32
import styles from '@node-core/ui-components/Containers/NavBar/index.module.css';
43
import GitHubIcon from '@node-core/ui-components/Icons/Social/GitHub';
54

65
import SearchBox from './SearchBox';
7-
import { useTheme } from '../hooks/useTheme.mjs';
6+
import ThemeToggle from './ThemeToggle.jsx';
87

98
import { repository, showSearchBox } from '#theme/config';
109
import Logo from '#theme/Logo';
1110

1211
/**
1312
* NavBar component that displays the headings, search, etc.
1413
*/
15-
export default ({ metadata }) => {
16-
const [themePreference, setThemePreference] = useTheme();
17-
18-
return (
19-
<NavBar
20-
Logo={Logo}
21-
sidebarItemTogglerAriaLabel="Toggle navigation menu"
22-
navItems={[]}
14+
export default ({ metadata }) => (
15+
<NavBar
16+
Logo={Logo}
17+
sidebarItemTogglerAriaLabel="Toggle navigation menu"
18+
navItems={[]}
19+
>
20+
{showSearchBox && <SearchBox pathname={metadata.path} />}
21+
<ThemeToggle />
22+
<a
23+
href={`https://github.com/${repository}`}
24+
aria-label={`View ${repository} on GitHub`}
25+
className={styles.ghIconWrapper}
2326
>
24-
{showSearchBox && <SearchBox pathname={metadata.path} />}
25-
<ThemeToggle
26-
onChange={setThemePreference}
27-
currentTheme={themePreference}
28-
/>
29-
<a
30-
href={`https://github.com/${repository}`}
31-
aria-label={`View ${repository} on GitHub`}
32-
className={styles.ghIconWrapper}
33-
>
34-
<GitHubIcon />
35-
</a>
36-
</NavBar>
37-
);
38-
};
27+
<GitHubIcon />
28+
</a>
29+
</NavBar>
30+
);

src/generators/web/ui/components/SearchBox/index.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import SearchHit from '@node-core/ui-components/Common/Search/Results/Hit';
99

1010
import styles from './index.module.css';
1111
import useOrama from '../../hooks/useOrama.mjs';
12+
import withIsland from '../../islands/withIsland.jsx';
1213
import { relativeOrAbsolute } from '../../utils/relativeOrAbsolute.mjs';
1314

1415
const SearchBox = ({ pathname }) => {
@@ -59,4 +60,7 @@ const SearchBox = ({ pathname }) => {
5960
);
6061
};
6162

62-
export default SearchBox;
63+
export default withIsland(SearchBox, {
64+
name: 'SearchBox',
65+
on: { interaction: 'pointerover,focusin,touchstart' },
66+
});

src/generators/web/ui/components/SideBar/index.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Select from '@node-core/ui-components/Common/Select';
22
import SideBar from '@node-core/ui-components/Containers/Sidebar';
33

44
import styles from './index.module.css';
5+
import withIsland from '../../islands/withIsland.jsx';
56
import { relativeOrAbsolute } from '../../utils/relativeOrAbsolute.mjs';
67

78
import { project, version, versions, pages } from '#theme/config';
@@ -23,7 +24,7 @@ const redirect = url => (window.location.href = url);
2324
* Sidebar component for MDX documentation with version selection and page navigation
2425
* @param {{ metadata: import('../../types').SerializedMetadata }} props
2526
*/
26-
export default ({ metadata }) => {
27+
const Sidebar = ({ metadata }) => {
2728
const introducedMajor = getMajorVersion(
2829
metadata.added ?? metadata.introduced_in
2930
);
@@ -65,3 +66,5 @@ export default ({ metadata }) => {
6566
</SideBar>
6667
);
6768
};
69+
70+
export default withIsland(Sidebar, { name: 'SideBar', on: { idle: true } });
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import ThemeToggle from '@node-core/ui-components/Common/ThemeToggle';
2+
3+
import { useTheme } from '../hooks/useTheme.mjs';
4+
import withIsland from '../islands/withIsland.jsx';
5+
6+
/**
7+
* Theme switcher.
8+
*/
9+
const Toggle = () => {
10+
const [themePreference, setThemePreference] = useTheme();
11+
12+
return (
13+
<ThemeToggle onChange={setThemePreference} currentTheme={themePreference} />
14+
);
15+
};
16+
17+
export default withIsland(Toggle, {
18+
name: 'ThemeToggle',
19+
on: { idle: true },
20+
});

src/generators/web/ui/index.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,20 @@
1010
--font-ibm-plex-mono: 'IBM Plex Mono', monospace;
1111
}
1212

13+
is-land {
14+
display: contents;
15+
}
16+
17+
/* TODO(@avivkeller): make this component's CSS more agnostic */
18+
is-land[data-component='SideBar'] {
19+
display: flex;
20+
flex-direction: column;
21+
22+
> aside {
23+
flex: 1 0 auto;
24+
}
25+
}
26+
1327
main {
1428
/* Code should inherit its font size */
1529
code {

0 commit comments

Comments
 (0)