Skip to content

Commit c72dc04

Browse files
ovflowdcanerakdas
andauthored
feat: add learn content to the node.js website (nodejs#6064)
* feat: sidenav support recursive items * feat: added learn layout * feat: added learn navigation * feat: added new translation ids * feat: mark docs as archive * chore: improved styles, use grid system * feat: added learn pages, removed duplicated/outdated guides * chore: added images * meta: crowdin no translations for learn * chore: updated redirects * meta: no need of package-name for private package * Apply suggestions from code review Co-authored-by: canerakdas <[email protected]> Signed-off-by: Claudio W <[email protected]> * style: use flexboxes * chore: self-code-review and adjustments --------- Signed-off-by: Claudio W <[email protected]> Co-authored-by: canerakdas <[email protected]>
1 parent ea22870 commit c72dc04

File tree

70 files changed

+3390
-1394
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+3390
-1394
lines changed

components/SideNavigation.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,25 @@ const SideNavigation: FC<SideNavigationProps> = ({
2121

2222
const sideNavigationItems = getSideNavigation(navigationKey, context);
2323

24-
const getLinkClassName = (href: string) =>
25-
classNames({ active: isCurrentLocaleRoute(href) });
24+
const getLinkClasses = (href: string, level: number) =>
25+
classNames({ active: isCurrentLocaleRoute(href), level });
2626

2727
return (
2828
<nav aria-label="secondary">
2929
<ul>
30-
{sideNavigationItems.map((item, key) => (
31-
<li key={key} className={getLinkClassName(item.link)}>
30+
{sideNavigationItems.map(item => (
31+
<li key={item.key} className={getLinkClasses(item.link, item.level)}>
3232
<LocalizedLink href={item.link}>{item.text}</LocalizedLink>
33+
34+
{item.items.length > 0 && (
35+
<ul>
36+
{item.items.map(({ link, level, text, key }) => (
37+
<li key={key} className={getLinkClasses(link, level)}>
38+
<LocalizedLink href={link}>{text}</LocalizedLink>
39+
</li>
40+
))}
41+
</ul>
42+
)}
3343
</li>
3444
))}
3545
</ul>

crowdin.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ files:
88
content_segmentation: 0
99
ignore:
1010
- /pages/en/blog/**/*.md
11+
- /pages/en/learn/**/*.md
1112
- /pages/en/docs/guides/**/*.md
1213
- /pages/en/download/index.md
1314
- /pages/en/download/current.md
@@ -22,6 +23,7 @@ files:
2223
content_segmentation: 0
2324
ignore:
2425
- /pages/en/blog/**/*.mdx
26+
- /pages/en/learn/**/*.mdx
2527
- /pages/en/docs/guides/**/*.mdx
2628
languages_mapping:
2729
two_letters_code:

hooks/useNavigation.tsx

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ import type { NavigationEntry, NavigationKeys } from '@/types';
66
// Translation Context for FormattedMessage
77
type Context = Record<string, Record<string, string | JSX.Element | undefined>>;
88

9+
// These are mapped navigation entries. Navigation Entries can have sub-entries
10+
type MappedItems = {
11+
text: JSX.Element;
12+
link: string;
13+
key: string;
14+
level: number;
15+
items: MappedItems[];
16+
};
17+
918
// Provides Context replacement for variables within the Link. This is also something that is not going
1019
// to happen in the future with `nodejs/nodejs.dev` codebase
1120
const replaceLinkWithContext = (
@@ -24,8 +33,9 @@ const replaceLinkWithContext = (
2433
export const useNavigation = () => {
2534
const mapNavigationEntries = (
2635
entries: Record<string, NavigationEntry>,
27-
context?: Context
28-
) => {
36+
context?: Context,
37+
level = 0
38+
): MappedItems[] => {
2939
const getContext = (key: string) => (context && context[key]) || {};
3040

3141
const getFormattedMessage = (translationId: string, key: string) => (
@@ -35,20 +45,23 @@ export const useNavigation = () => {
3545
return Object.entries(entries).map(([key, item]) => ({
3646
text: getFormattedMessage(item.translationId, key),
3747
link: replaceLinkWithContext(item.link, getContext(key)),
48+
items: item.items
49+
? mapNavigationEntries(item.items, context, level + 1)
50+
: [],
51+
level,
3852
key: key,
3953
}));
4054
};
4155

4256
return {
4357
navigationItems: mapNavigationEntries(siteNavigation),
44-
getSideNavigation: (section: NavigationKeys, context?: Context) =>
45-
mapNavigationEntries(
46-
// We need the parent and their items when making a side navigation
47-
{
48-
[section]: siteNavigation[section],
49-
...siteNavigation[section].items,
50-
},
58+
getSideNavigation: (section: NavigationKeys, context?: Context) => {
59+
const { items, translationId, link } = siteNavigation[section];
60+
61+
return mapNavigationEntries(
62+
{ [section]: { translationId, link }, ...items },
5163
context
52-
),
64+
);
65+
},
5366
};
5467
};

i18n/locales/ar.json

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"components.navigation.docs.links.es6": "ES6 and beyond",
1919
"components.navigation.docs.links.apiLts": "{fullLtsNodeVersion} API {spanLts}",
2020
"components.navigation.docs.links.apiCurrent": "{fullCurrentNodeVersion} API",
21-
"components.navigation.docs.links.guides": "Guides",
21+
"components.navigation.docs.links.guides": "Guides {spanGuides}",
2222
"components.navigation.docs.links.dependencies": "Dependencies",
2323
"components.navigation.getInvolved.links.collabSummit": "Collab Summit",
2424
"components.navigation.getInvolved.links.contribute": "Contribute",
@@ -69,9 +69,42 @@
6969
"components.common.card.announcement": "Announcements",
7070
"components.common.card.release": "Releases",
7171
"components.common.card.vulnerability": "Vulnerabilities",
72-
"components.home.homeDownloadButton.download": "Download {version} {isLts, select, true {lts} other {current}}",
72+
"components.home.homeDownloadButton.download": "{version} {isLts, select, true {LTS} other {Current}}",
7373
"components.home.homeDownloadButton.tagline": "{isLts, select, true {Recommended For Most Users} other {Latest Features}}",
7474
"components.home.homeDownloadButton.changelog": "Changelog",
7575
"components.home.homeDownloadButton.otherDownloads": "Other Downloads",
76-
"components.home.homeDownloadButton.apiDocs": "API Docs"
76+
"components.home.homeDownloadButton.apiDocs": "API Docs",
77+
"components.header.links.learn": "Learn",
78+
"components.header.links.learn.gettingStarted": "Getting Started",
79+
"components.header.links.learn.gettingStarted.introductionToNodejs": "Introduction to Node.js",
80+
"components.header.links.learn.gettingStarted.howToInstallNodejs": "How to install Node.js",
81+
"components.header.links.learn.gettingStarted.howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?",
82+
"components.header.links.learn.gettingStarted.differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser",
83+
"components.header.links.learn.gettingStarted.theV8JavascriptEngine": "The V8 JavaScript Engine",
84+
"components.header.links.learn.gettingStarted.anIntroductionToTheNpmPackageManager": "An introduction to the NPM package manager",
85+
"components.header.links.learn.gettingStarted.ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond",
86+
"components.header.links.learn.gettingStarted.nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production",
87+
"components.header.links.learn.gettingStarted.nodejsWithTypescript": "Node.js with TypeScript",
88+
"components.header.links.learn.gettingStarted.nodejsWithWebassembly": "Node.js with WebAssembly",
89+
"components.header.links.learn.asynchronousWork": "Asynchronous Work",
90+
"components.header.links.learn.asynchronousWork.asynchronousFlowControl": "Asynchronous flow control",
91+
"components.header.links.learn.asynchronousWork.overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking",
92+
"components.header.links.learn.asynchronousWork.javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks",
93+
"components.header.links.learn.asynchronousWork.discoverJavaScriptTimers": "Discover JavaScript Timers",
94+
"components.header.links.learn.asynchronousWork.understandingProcessnexttick": "Understanding process.nextTick()",
95+
"components.header.links.learn.asynchronousWork.understandingSetimmediate": "Understanding setImmediate()",
96+
"components.header.links.learn.asynchronousWork.theNodejsEventEmitter": "The Node.js Event emitter",
97+
"components.header.links.learn.manipulatingFiles": "Manipulating Files",
98+
"components.header.links.learn.manipulatingFiles.nodejsFileStats": "Node.js file stats",
99+
"components.header.links.learn.manipulatingFiles.nodejsFilePaths": "Node.js File Paths",
100+
"components.header.links.learn.manipulatingFiles.workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js",
101+
"components.header.links.learn.manipulatingFiles.readingFilesWithNodejs": "Reading files with Node.js",
102+
"components.header.links.learn.manipulatingFiles.writingFilesWithNodejs": "Writing files with Node.js",
103+
"components.header.links.learn.manipulatingFiles.workingWithFoldersInNodejs": "Working with folders in Node.js",
104+
"components.header.links.learn.commandLine": "Command Line",
105+
"components.header.links.learn.commandLine.runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line",
106+
"components.header.links.learn.commandLine.howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js",
107+
"components.header.links.learn.commandLine.howToUseTheNodejsRepl": "How to use the Node.js REPL",
108+
"components.header.links.learn.commandLine.outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js",
109+
"components.header.links.learn.commandLine.acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js"
77110
}

i18n/locales/de.json

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"components.navigation.docs.links.es6": "ES6 and beyond",
1919
"components.navigation.docs.links.apiLts": "{fullLtsNodeVersion} API {spanLts}",
2020
"components.navigation.docs.links.apiCurrent": "{fullCurrentNodeVersion} API",
21-
"components.navigation.docs.links.guides": "Guides",
21+
"components.navigation.docs.links.guides": "Guides {spanGuides}",
2222
"components.navigation.docs.links.dependencies": "Dependencies",
2323
"components.navigation.getInvolved.links.collabSummit": "Collab Summit",
2424
"components.navigation.getInvolved.links.contribute": "Contribute",
@@ -69,9 +69,42 @@
6969
"components.common.card.announcement": "Announcements",
7070
"components.common.card.release": "Releases",
7171
"components.common.card.vulnerability": "Vulnerabilities",
72-
"components.home.homeDownloadButton.download": "Download {version} {isLts, select, true {lts} other {current}}",
72+
"components.home.homeDownloadButton.download": "{version} {isLts, select, true {LTS} other {Current}}",
7373
"components.home.homeDownloadButton.tagline": "{isLts, select, true {Recommended For Most Users} other {Latest Features}}",
7474
"components.home.homeDownloadButton.changelog": "Changelog",
7575
"components.home.homeDownloadButton.otherDownloads": "Other Downloads",
76-
"components.home.homeDownloadButton.apiDocs": "API Docs"
76+
"components.home.homeDownloadButton.apiDocs": "API Docs",
77+
"components.header.links.learn": "Learn",
78+
"components.header.links.learn.gettingStarted": "Getting Started",
79+
"components.header.links.learn.gettingStarted.introductionToNodejs": "Introduction to Node.js",
80+
"components.header.links.learn.gettingStarted.howToInstallNodejs": "How to install Node.js",
81+
"components.header.links.learn.gettingStarted.howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?",
82+
"components.header.links.learn.gettingStarted.differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser",
83+
"components.header.links.learn.gettingStarted.theV8JavascriptEngine": "The V8 JavaScript Engine",
84+
"components.header.links.learn.gettingStarted.anIntroductionToTheNpmPackageManager": "An introduction to the NPM package manager",
85+
"components.header.links.learn.gettingStarted.ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond",
86+
"components.header.links.learn.gettingStarted.nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production",
87+
"components.header.links.learn.gettingStarted.nodejsWithTypescript": "Node.js with TypeScript",
88+
"components.header.links.learn.gettingStarted.nodejsWithWebassembly": "Node.js with WebAssembly",
89+
"components.header.links.learn.asynchronousWork": "Asynchronous Work",
90+
"components.header.links.learn.asynchronousWork.asynchronousFlowControl": "Asynchronous flow control",
91+
"components.header.links.learn.asynchronousWork.overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking",
92+
"components.header.links.learn.asynchronousWork.javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks",
93+
"components.header.links.learn.asynchronousWork.discoverJavaScriptTimers": "Discover JavaScript Timers",
94+
"components.header.links.learn.asynchronousWork.understandingProcessnexttick": "Understanding process.nextTick()",
95+
"components.header.links.learn.asynchronousWork.understandingSetimmediate": "Understanding setImmediate()",
96+
"components.header.links.learn.asynchronousWork.theNodejsEventEmitter": "The Node.js Event emitter",
97+
"components.header.links.learn.manipulatingFiles": "Manipulating Files",
98+
"components.header.links.learn.manipulatingFiles.nodejsFileStats": "Node.js file stats",
99+
"components.header.links.learn.manipulatingFiles.nodejsFilePaths": "Node.js File Paths",
100+
"components.header.links.learn.manipulatingFiles.workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js",
101+
"components.header.links.learn.manipulatingFiles.readingFilesWithNodejs": "Reading files with Node.js",
102+
"components.header.links.learn.manipulatingFiles.writingFilesWithNodejs": "Writing files with Node.js",
103+
"components.header.links.learn.manipulatingFiles.workingWithFoldersInNodejs": "Working with folders in Node.js",
104+
"components.header.links.learn.commandLine": "Command Line",
105+
"components.header.links.learn.commandLine.runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line",
106+
"components.header.links.learn.commandLine.howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js",
107+
"components.header.links.learn.commandLine.howToUseTheNodejsRepl": "How to use the Node.js REPL",
108+
"components.header.links.learn.commandLine.outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js",
109+
"components.header.links.learn.commandLine.acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js"
77110
}

i18n/locales/en.json

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"components.navigation.docs.links.es6": "ES6 and beyond",
1919
"components.navigation.docs.links.apiLts": "{fullLtsNodeVersion} API {spanLts}",
2020
"components.navigation.docs.links.apiCurrent": "{fullCurrentNodeVersion} API",
21-
"components.navigation.docs.links.guides": "Guides",
21+
"components.navigation.docs.links.guides": "Guides {spanGuides}",
2222
"components.navigation.docs.links.dependencies": "Dependencies",
2323
"components.navigation.getInvolved.links.collabSummit": "Collab Summit",
2424
"components.navigation.getInvolved.links.contribute": "Contribute",
@@ -69,9 +69,42 @@
6969
"components.common.card.announcement": "Announcements",
7070
"components.common.card.release": "Releases",
7171
"components.common.card.vulnerability": "Vulnerabilities",
72-
"components.home.homeDownloadButton.download": "Download {version} {isLts, select, true {lts} other {current}}",
72+
"components.home.homeDownloadButton.download": "{version} {isLts, select, true {LTS} other {Current}}",
7373
"components.home.homeDownloadButton.tagline": "{isLts, select, true {Recommended For Most Users} other {Latest Features}}",
7474
"components.home.homeDownloadButton.changelog": "Changelog",
7575
"components.home.homeDownloadButton.otherDownloads": "Other Downloads",
76-
"components.home.homeDownloadButton.apiDocs": "API Docs"
76+
"components.home.homeDownloadButton.apiDocs": "API Docs",
77+
"components.header.links.learn": "Learn",
78+
"components.header.links.learn.gettingStarted": "Getting Started",
79+
"components.header.links.learn.gettingStarted.introductionToNodejs": "Introduction to Node.js",
80+
"components.header.links.learn.gettingStarted.howToInstallNodejs": "How to install Node.js",
81+
"components.header.links.learn.gettingStarted.howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?",
82+
"components.header.links.learn.gettingStarted.differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser",
83+
"components.header.links.learn.gettingStarted.theV8JavascriptEngine": "The V8 JavaScript Engine",
84+
"components.header.links.learn.gettingStarted.anIntroductionToTheNpmPackageManager": "An introduction to the NPM package manager",
85+
"components.header.links.learn.gettingStarted.ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond",
86+
"components.header.links.learn.gettingStarted.nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production",
87+
"components.header.links.learn.gettingStarted.nodejsWithTypescript": "Node.js with TypeScript",
88+
"components.header.links.learn.gettingStarted.nodejsWithWebassembly": "Node.js with WebAssembly",
89+
"components.header.links.learn.asynchronousWork": "Asynchronous Work",
90+
"components.header.links.learn.asynchronousWork.asynchronousFlowControl": "Asynchronous flow control",
91+
"components.header.links.learn.asynchronousWork.overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking",
92+
"components.header.links.learn.asynchronousWork.javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks",
93+
"components.header.links.learn.asynchronousWork.discoverJavaScriptTimers": "Discover JavaScript Timers",
94+
"components.header.links.learn.asynchronousWork.understandingProcessnexttick": "Understanding process.nextTick()",
95+
"components.header.links.learn.asynchronousWork.understandingSetimmediate": "Understanding setImmediate()",
96+
"components.header.links.learn.asynchronousWork.theNodejsEventEmitter": "The Node.js Event emitter",
97+
"components.header.links.learn.manipulatingFiles": "Manipulating Files",
98+
"components.header.links.learn.manipulatingFiles.nodejsFileStats": "Node.js file stats",
99+
"components.header.links.learn.manipulatingFiles.nodejsFilePaths": "Node.js File Paths",
100+
"components.header.links.learn.manipulatingFiles.workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js",
101+
"components.header.links.learn.manipulatingFiles.readingFilesWithNodejs": "Reading files with Node.js",
102+
"components.header.links.learn.manipulatingFiles.writingFilesWithNodejs": "Writing files with Node.js",
103+
"components.header.links.learn.manipulatingFiles.workingWithFoldersInNodejs": "Working with folders in Node.js",
104+
"components.header.links.learn.commandLine": "Command Line",
105+
"components.header.links.learn.commandLine.runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line",
106+
"components.header.links.learn.commandLine.howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js",
107+
"components.header.links.learn.commandLine.howToUseTheNodejsRepl": "How to use the Node.js REPL",
108+
"components.header.links.learn.commandLine.outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js",
109+
"components.header.links.learn.commandLine.acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js"
77110
}

0 commit comments

Comments
 (0)