From 3663ed655d2a17248a4d5085a9201b9fd08ce7cc Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 26 Sep 2025 20:42:24 +0530 Subject: [PATCH] added few more docs --- .github/workflows/lighthouse-report.yml | 3 - .../markdown-features/example-file.docx | Bin 0 -> 36902 bytes .../markdown-feature-plugins.mdx | 227 ++++++++++++ .../markdown-features-admonitions.mdx | 269 ++++++++++++++ .../markdown-features-assets.mdx | 205 +++++++++++ .../markdown-features-code-blocks.mdx | 344 ++++++++++++++++++ .../markdown-features-diagrams.mdx | 156 ++++++++ .../markdown-features-head-metadata.mdx | 101 +++++ .../markdown-features-links.mdx | 96 +++++ .../markdown-features-math-equations.mdx | 201 ++++++++++ .../markdown-features-toc.mdx | 195 ++++++++++ sidebars.js | 9 + src/theme/MDXComponents.js | 4 + 13 files changed, 1807 insertions(+), 3 deletions(-) create mode 100644 docs/guides/markdown-features/example-file.docx create mode 100644 docs/guides/markdown-features/markdown-feature-plugins.mdx create mode 100644 docs/guides/markdown-features/markdown-features-admonitions.mdx create mode 100644 docs/guides/markdown-features/markdown-features-assets.mdx create mode 100644 docs/guides/markdown-features/markdown-features-code-blocks.mdx create mode 100644 docs/guides/markdown-features/markdown-features-diagrams.mdx create mode 100644 docs/guides/markdown-features/markdown-features-head-metadata.mdx create mode 100644 docs/guides/markdown-features/markdown-features-links.mdx create mode 100644 docs/guides/markdown-features/markdown-features-math-equations.mdx create mode 100644 docs/guides/markdown-features/markdown-features-toc.mdx diff --git a/.github/workflows/lighthouse-report.yml b/.github/workflows/lighthouse-report.yml index d12e957f5..fed473359 100644 --- a/.github/workflows/lighthouse-report.yml +++ b/.github/workflows/lighthouse-report.yml @@ -41,10 +41,7 @@ jobs: urls: | http://localhost:3000 http://localhost:3000/docs - http://localhost:3000/docs/category/javascript http://localhost:3000/courses - http://localhost:3000/courses/category/reactjs - http://localhost:3000/blog http://localhost:3000/showcase http://localhost:3000/community http://localhost:3000/docs/tags diff --git a/docs/guides/markdown-features/example-file.docx b/docs/guides/markdown-features/example-file.docx new file mode 100644 index 0000000000000000000000000000000000000000..8f3766b210a334d101d4578e6b1a7518e3b1c4b0 GIT binary patch literal 36902 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 Ddxg2F literal 0 HcmV?d00001 diff --git a/docs/guides/markdown-features/markdown-feature-plugins.mdx b/docs/guides/markdown-features/markdown-feature-plugins.mdx new file mode 100644 index 000000000..1e0b37df0 --- /dev/null +++ b/docs/guides/markdown-features/markdown-feature-plugins.mdx @@ -0,0 +1,227 @@ +--- +id: plugins +description: Using MDX plugins to expand Markdown functionality in CodeHarborHub +slug: /markdown-features/plugins +--- + +# MDX Plugins + +CodeHarborHub uses [MDX](https://mdxjs.com/) to power its documentation. Sometimes, you may want to extend or tweak Markdown syntax. For example: + +- Embed a YouTube video using image-like syntax: `![](https://youtu.be/example)` +- Style standalone links as social cards +- Automatically prepend a copyright notice to every page + +The answer is: **create an MDX plugin!** +MDX supports a powerful [plugin system](https://mdxjs.com/advanced/plugins/) to customize how Markdown is parsed and transformed into JSX. + +There are three common plugin use-cases: + +- Use existing [Remark plugins](https://github.com/remarkjs/remark/blob/main/doc/plugins.md#list-of-plugins) or [Rehype plugins](https://github.com/rehypejs/rehype/blob/main/doc/plugins.md#list-of-plugins) +- Transform elements produced by MDX syntax +- Introduce **new syntax** to MDX + + + +## How MDX Plugins Work + +When Markdown is compiled, it goes through two intermediate steps: + +1. **Markdown AST (MDAST)** +2. **Hypertext AST (HAST)** +3. JSX Output + +Plugins operate on these ASTs: + +* **[Remark](https://github.com/remarkjs/remark/)** → processes the Markdown AST +* **[Rehype](https://github.com/rehypejs/rehype/)** → processes the Hypertext AST + +:::tip +Use plugins to introduce shorter syntax for frequently used JSX elements. +For example, CodeHarborHub’s [admonition blocks](./markdown-features-admonitions.mdx) are powered by a Remark plugin. +::: + + + +## Default Plugins + +Docusaurus automatically injects a set of default Remark plugins during Markdown processing. +These handle tasks such as: + +- Generating a **Table of Contents** +- Adding **anchor links** to each heading +- Transforming images and links to `require()` calls + +These built-in plugins are great examples to inspire your own custom plugins. + + + +## Installing Plugins + +An MDX plugin is usually an **npm package**, so install it like any other dependency. + +Example: adding math support: + +```bash npm2yarn +npm install --save remark-math@5 rehype-katex@6 +``` + +
+ Remark vs Rehype in action + +* `remark-math` extracts `$...$` math expressions from Markdown and transforms them into a JSX placeholder. +* `rehype-katex` then takes those placeholders and renders them into KaTeX-powered HTML. +
+ +:::warning +Many official Remark/Rehype plugins are **ES Modules only**. Docusaurus supports ESM, but we recommend using an **ESM config file** for easier imports. +::: + + + +## Adding Plugins to `docusaurus.config.js` + +Once installed, import and add the plugin to your config: + +```js title="docusaurus.config.js" +// highlight-start +import remarkMath from 'remark-math'; +import rehypeKatex from 'rehype-katex'; +// highlight-end + +export default { + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + remarkPlugins: [remarkMath], + rehypePlugins: [rehypeKatex], + }, + }, + ], + ], +}; +``` + +Using **CommonJS**? Dynamic imports make it work: + +```js title="docusaurus.config.js" +module.exports = async function createConfigAsync() { + return { + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + remarkPlugins: [(await import('remark-math')).default], + rehypePlugins: [(await import('rehype-katex')).default], + }, + }, + ], + ], + }; +}; +``` + +--- + +## Configuring Plugins + +Some plugins accept custom options. Use `[plugin, options]` syntax: + +```js title="docusaurus.config.js" +import rehypeKatex from 'rehype-katex'; + +export default { + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + rehypePlugins: [ + [rehypeKatex, {strict: false}], + ], + }, + }, + ], + ], +}; +``` + +Check the plugin’s documentation for available options. + + + +## Creating Your Own Plugin + +If no existing plugin fits your needs, you can create one. A plugin is a function that operates on the AST. + +Example: prefix every `h2` heading with `Section X.` + +```js title="src/remark/section-prefix.js" +import {visit} from 'unist-util-visit'; + +const plugin = () => { + return async (ast) => { + let count = 1; + visit(ast, 'heading', (node) => { + if (node.depth === 2 && node.children.length > 0) { + node.children.unshift({ + type: 'text', + value: `Section ${count}. `, + }); + count++; + } + }); + }; +}; + +export default plugin; +``` + +Import and register it: + +```js title="docusaurus.config.js" +import sectionPrefix from './src/remark/section-prefix'; + +export default { + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + remarkPlugins: [sectionPrefix], + }, + }, + ], + ], +}; +``` + +:::tip +The `transformer` function receives a second parameter, [`vfile`](https://github.com/vfile/vfile), which provides metadata like the current Markdown file’s path. +::: + + + +## Processing Order + +By default, Docusaurus runs its internal plugins **before** your custom plugins. If you need to run your plugin first: + +```js title="docusaurus.config.js" +export default { + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + beforeDefaultRemarkPlugins: [sectionPrefix], + }, + }, + ], + ], +}; +``` + +This ensures your transformations (like heading prefixes) are included in generated tables of contents. \ No newline at end of file diff --git a/docs/guides/markdown-features/markdown-features-admonitions.mdx b/docs/guides/markdown-features/markdown-features-admonitions.mdx new file mode 100644 index 000000000..f17881d3a --- /dev/null +++ b/docs/guides/markdown-features/markdown-features-admonitions.mdx @@ -0,0 +1,269 @@ +--- +id: admonitions +title: Admonitions +description: Add tips, notes, and warnings to your CodeHarborHub Markdown docs with styled callouts +slug: /guides/markdown-features/admonitions +--- + +Admonitions let you highlight **important information** in your docs using a simple Markdown syntax. + +They render as colorful callout boxes like **Tips**, **Notes**, **Warnings**, etc. + + + +## Basic Syntax + +Wrap your text with 3 colons and specify a type: + +```md +:::note + +This is a note block with **Markdown** support. + +::: +``` + + + +:::note + +This is a note block with **Markdown** support. + +::: + + + +Supported types: `note`, `tip`, `info`, `warning`, `danger` + +--- + +## Examples + +```md +:::tip +Great for best practices or quick advice. +::: + +:::info +Use to provide additional context. +::: + +:::warning +Warn users of potential issues. +::: + +:::danger +Critical alerts or breaking changes. +::: +``` + + + +:::tip +Great for best practices or quick advice. +::: + +:::info +Use to provide additional context. +::: + +:::warning +Warn users of potential issues. +::: + +:::danger +Critical alerts or breaking changes. +::: + + + + + +## Adding a Custom Title + +You can provide a **custom title** (with Markdown too): + +```md +:::note[Your **Custom** _Title_] + +This callout uses a custom title. + +::: +``` + + + +:::note[Your **Custom** _Title_] + +This callout uses a custom title. + +::: + + + + + +## Nested Admonitions + +Admonitions can be nested for layered messages. +Use more colons `:` for each parent level: + +```md +::::info Outer + +Outer content + +:::warning Inner +Inner content +::: + +:::: +``` + + + +::::info Outer + +Outer content + +:::warning Inner +Inner content +::: + +:::: + + + +--- + +## Using MDX Inside + +Admonitions fully support **MDX components**. + +```mdx +:::tip[Tabbed Example] + + + React example 🚀 + Vue example 🌿 + + +::: +``` + + + +:::tip[Tabbed Example] + + + React example 🚀 + Vue example 🌿 + + +::: + + + + + +## Using in JSX + +Outside Markdown, use the React component directly: + +```jsx title="MyPage.jsx" +import Admonition from '@theme/Admonition'; + +export default function MyPage() { + return ( + + You can use Admonitions directly in JSX too! + + ); +} +``` + + + + You can use Admonitions directly in JSX too! + + + +--- + +## Customizing Admonitions + +### Custom Icons or Styling + +You can override default icons by **swizzling** the Admonition theme component: + +```jsx title="src/theme/Admonition.js" +import React from 'react'; +import Admonition from '@theme-original/Admonition'; +import MyIcon from '@site/static/img/custom-icon.svg'; + +export default function AdmonitionWrapper(props) { + if (props.type === 'info') { + return } {...props} />; + } + return ; +} +``` + +### Add New Types + +Add a new keyword in `docusaurus.config.js`: + +```js title="docusaurus.config.js" +export default { + presets: [ + [ + 'classic', + { + docs: { + admonitions: { + keywords: ['my-callout'], + extendDefaults: true, + }, + }, + }, + ], + ], +}; +``` + +Then create a custom renderer: + +```jsx title="src/theme/Admonition/Types.js" +import React from 'react'; +import DefaultTypes from '@theme-original/Admonition/Types'; + +function MyCallout(props) { + return ( +
+

{props.title || '⚡ My Callout'}

+ {props.children} +
+ ); +} + +export default { + ...DefaultTypes, + 'my-callout': MyCallout, +}; +``` + +Now you can use: + +```md +:::my-callout[Custom Callout] +This is a completely custom admonition. +::: +``` + + + +## Best Practices + +* Always leave **blank lines** inside admonitions to avoid Prettier formatting issues. +* Use **icons and concise titles** to improve readability. +* Keep admonitions focused—avoid stuffing too much content. \ No newline at end of file diff --git a/docs/guides/markdown-features/markdown-features-assets.mdx b/docs/guides/markdown-features/markdown-features-assets.mdx new file mode 100644 index 000000000..fb751b30b --- /dev/null +++ b/docs/guides/markdown-features/markdown-features-assets.mdx @@ -0,0 +1,205 @@ +--- +id: assets +description: Handling assets in Markdown for CodeHarborHub docs +slug: /markdown-features/assets +--- + +# Assets in Markdown + +In CodeHarborHub documentation, you may need to include **images**, **files**, or **SVGs** inside Markdown (`.md` / `.mdx`) files. + +Docusaurus provides several ways to handle these assets while keeping everything **organized** and **optimized**. + +A common practice is to **co-locate** assets next to the Markdown file that uses them: + +``` +/docs/guides/markdown-features/markdown-features-assets.mdx +/docs/guides/markdown-features/assets/example-banner.png +/docs/guides/markdown-features/assets/example-file.docx +``` + +This keeps docs self-contained and easy to maintain. + + + +## Images {#images} + +You can display images using **three different methods**: + + + + +### 1. Simple Markdown Syntax + +The easiest way to add an image: + +```md +![Example banner](./assets/example-banner.jpg) +``` + +This works for most cases and Docusaurus will automatically process the file. + + + + +### 2. Using `require()` in JSX + +If you need to use JSX for extra control (like `className` or styles): + +```jsx +Example banner +``` + + + + +### 3. Using ES `import` + +Recommended when importing at the top of the file: + +```jsx +import banner from './assets/example-banner.jpg'; + +Example banner; +``` + + + + +All three methods display the same image: + + + ![Example banner](/img/codeharborhub-social-card.jpg) + + + + +## Downloadable Files {#files} + +You can also link downloadable files (like `.docx`, `.pdf`, `.zip`) directly. + +**Markdown link syntax** (recommended): + +```md +[Download the example doc](./assets/example-file.docx) +``` + +**JSX with `require()`** (for dynamic attributes): + +```jsx +
+ Download this docx + +``` + + +[Download the example doc](./example-file.docx) + + + + +## Inline SVGs {#inline-svgs} + +Docusaurus supports importing **SVGs as React components**. +This allows you to style or animate parts of the SVG using CSS. + +```jsx +import MyIcon from './assets/logo.svg'; + +; +``` + +For example, you can change the SVG color based on the current theme: + +```css +[data-theme='light'] .customSvg [fill='#000'] { + fill: #1e90ff; +} +[data-theme='dark'] .customSvg [fill='#000'] { + fill: #00fa9a; +} +``` + + + +## Themed Images {#themed-images} + +For sites that support **light/dark mode**, you may want different images per theme. +Use the `ThemedImage` component to automatically swap images. + +```jsx +import useBaseUrl from '@docusaurus/useBaseUrl'; +import ThemedImage from '@theme/ThemedImage'; + + +``` + +This ensures the correct image is loaded depending on the current theme. + +### GitHub-style Theme Switching + +You can also replicate GitHub’s approach using path fragments: + +```md +![Light mode](/img/codeharborhub-light.svg#gh-light-mode-only) +![Dark mode](/img/codeharborhub-dark.svg#gh-dark-mode-only) +``` + +Add this CSS to hide/show based on theme: + +```css title="src/css/custom.css" +[data-theme='light'] img[src$='#gh-dark-mode-only'], +[data-theme='dark'] img[src$='#gh-light-mode-only'] { + display: none; +} +``` + + + +## Static Assets {#static-assets} + +If you use **absolute paths** (`/img/...`), Docusaurus treats them as **static assets**. + +Example: + +```md +![Static asset](/img/nav-logo.jpg) +``` + +Docusaurus will look for this image inside the `static/` directory: + +``` +/static/img/nav-logo.jpg +``` + +Benefits of using static assets: + +1. **Automatic Base URL Handling** – works even when deploying to a subpath. +2. **Cache Optimization** – images are processed by Webpack and get a unique hash for better caching. + +If you need a raw URL (without build processing), +use the `pathname://` protocol: + +```md +![Raw image](pathname:///img/nav-logo.jpg) +``` + +This generates a direct `` tag. + +--- + +## Best Practices {#best-practices} + +* Keep assets **close to the docs** that use them for easier maintenance. +* Prefer **Markdown syntax** for most links/images for cleaner code. +* Use `ThemedImage` or `inline SVGs` when working with **dark/light mode**. +* Use **static assets** for site-wide shared files like logos and large downloads. \ No newline at end of file diff --git a/docs/guides/markdown-features/markdown-features-code-blocks.mdx b/docs/guides/markdown-features/markdown-features-code-blocks.mdx new file mode 100644 index 000000000..6ae22e15a --- /dev/null +++ b/docs/guides/markdown-features/markdown-features-code-blocks.mdx @@ -0,0 +1,344 @@ +--- +id: code-blocks +title: Code Blocks in Markdown +description: "Learn how to use, style, and supercharge code blocks in CodeHarborHub’s Markdown with syntax highlighting, line numbers, live editing, and more." +slug: /guides/markdown-features/code-blocks +--- + +import CodeBlock from "@theme/CodeBlock"; + +Code blocks are the **heart of technical documentation**. + +In CodeHarborHub (powered by Docusaurus & MDX), code blocks are **super-powered**. You can add syntax highlighting, titles, live editors, and even interactive tabs. + +This guide shows you **everything you can do with code blocks**, with real examples. + + + +## Basic Code Block + +Wrap your code with three backticks (\`\`\`) and specify the language for syntax highlighting. + +````md +```js +console.log("Hello CodeHarborHub!"); +``` +```` + + + +```js +console.log("Hello CodeHarborHub!"); +``` + + + +✅ **Tip:** Always specify the language (like `js`, `python`, `html`) for better highlighting. + + + +## Adding a Title + +Give your readers context by adding a title to your code block. + +````md +```jsx title="/src/components/Greeting.js" +export default function Greeting() { + return

Hello World!

; +} +``` +```` + + + +```jsx title="/src/components/Greeting.js" +export default function Greeting() { + return

Hello World!

; +} +``` + +
+ + + +## Syntax Highlighting & Themes + +CodeHarborHub uses [Prism](https://prismjs.com/) for beautiful syntax highlighting. + +You can customize the theme in `docusaurus.config.js`: + +```js title="docusaurus.config.js" +import { themes as prismThemes } from "prism-react-renderer"; + +export default { + themeConfig: { + prism: { + theme: prismThemes.dracula, // Dark & vibrant + }, + }, +}; +``` + +Supported languages include JavaScript, Python, Java, C++, and many more. +To add extra languages (like PowerShell or Rust): + +```js title="docusaurus.config.js" +export default { + themeConfig: { + prism: { + additionalLanguages: ["powershell", "rust"], + }, + }, +}; +``` + +Restart the dev server to see the changes. + + + +## Highlighting Lines + +Highlight key lines to draw attention. + +**With magic comments:** + +````mdx +```js +function importantCode() { + // highlight-next-line + return "⚡ This line is important!"; +} +``` +```` + + + +```js +function importantCode() { + // highlight-next-line + return "⚡ This line is important!"; +} +``` + + + +**With meta string:** + +````md +```js {2} +function importantCode() { + return "⚡ This line is important!"; +} +``` +```` + + + +## Line Numbers + +Add line numbers for easier references. + +````md +```jsx showLineNumbers +function Example() { + return

Line numbers are enabled!

; +} +``` +```` + + + +```jsx showLineNumbers +function Example() { + return

Line numbers are enabled!

; +} +``` + +
+ +You can even start counting from a specific number: + +````md +```jsx showLineNumbers=5 +function Example() { + return

Starts from 5!

; +} +``` +```` + + + +## Live Code Editor + +Want readers to experiment directly? +Turn any code block into a **live playground** using `live`. + +Install the plugin first: + +```bash npm2yarn +npm install --save @docusaurus/theme-live-codeblock +``` + +Enable it in `docusaurus.config.js`: + +```js +export default { + themes: ["@docusaurus/theme-live-codeblock"], +}; +``` + +Now create a live block: + +````md +```jsx live +function Counter() { + const [count, setCount] = React.useState(0); + return ; +} +``` +```` + + + +```jsx live +function Counter() { + const [count, setCount] = React.useState(0); + return ; +} +``` + + + +**Users can edit the code and see instant results!** + +--- + +## Multi-Language Tabs + +Show the same example in multiple languages using `` and ``. + +````mdx +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + + + + +```js +console.log("Hello from JavaScript!"); +``` + + + + +```python +print("Hello from Python!") +``` + + + +```` + + + + + +```js +console.log("Hello from JavaScript!"); +``` + + + + +```python +print("Hello from Python!") +``` + + + + + + + +## Advanced Tricks + +### Custom Magic Comments + +Create your own highlight styles. + +```js title="docusaurus.config.js" +export default { + themeConfig: { + prism: { + magicComments: [ + { + className: "code-block-error-line", + line: "This will error", + }, + ], + }, + }, +}; +``` + +Then style it in CSS: + +```css title="src/css/custom.css" +.code-block-error-line { + background: #ff000020; + border-left: 3px solid #ff000080; +} +``` + +### Interactive Imports + +For live blocks, add custom components to the live scope: + +```bash npm2yarn +npm run swizzle @docusaurus/theme-live-codeblock ReactLiveScope -- --eject +``` + +Then modify `src/theme/ReactLiveScope/index.js`: + +```js +import React from "react"; + +const FancyButton = (props) => ( +