Skip to content

Commit

Permalink
feat(live-codeblock): add support for noInline to interactive code bl…
Browse files Browse the repository at this point in the history
…ocks (#7514)

Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com>
  • Loading branch information
jpdriver and slorber committed Jun 2, 2022
1 parent 6afc902 commit f25ee0c
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
Expand Up @@ -5,6 +5,9 @@
* LICENSE file in the root directory of this source tree.
*/

/// <reference types="@docusaurus/theme-classic" />
/// <reference types="@docusaurus/module-type-aliases" />

declare module '@docusaurus/theme-live-codeblock' {
export type ThemeConfig = {
liveCodeBlock: {
Expand All @@ -14,9 +17,12 @@ declare module '@docusaurus/theme-live-codeblock' {
}

declare module '@theme/Playground' {
import type {Props as BaseProps} from '@theme/CodeBlock';
import type {LiveProviderProps} from 'react-live';

export interface Props extends LiveProviderProps {
type CodeBlockProps = Omit<BaseProps, 'className' | 'language' | 'title'>;

export interface Props extends CodeBlockProps, LiveProviderProps {
children: string;
}
export default function Playground(props: LiveProviderProps): JSX.Element;
Expand Down
Expand Up @@ -93,11 +93,14 @@ export default function Playground({
} = themeConfig as ThemeConfig;
const prismTheme = usePrismTheme();

const noInline = props.metastring?.includes('noInline') ?? false;

return (
<div className={styles.playgroundContainer}>
{/* @ts-expect-error: type incompatibility with refs */}
<LiveProvider
code={children.replace(/\n$/, '')}
noInline={noInline}
transformCode={transformCode ?? ((code) => `${code};`)}
theme={prismTheme}
{...props}>
Expand Down
Expand Up @@ -569,6 +569,42 @@ function MyPlayground(props) {
</BrowserWindow>
```

### Imperative Rendering (noInline)

The `noInline` option should be used to avoid errors when your code spans multiple components or variables.

````md
```jsx live noInline
const project = 'Docusaurus';

const Greeting = () => <p>Hello {project}!</p>;

render(<Greeting />);
```
````

Unlike an ordinary interactive code block, when using `noInline` React Live won't wrap your code in an inline function to render it.

You will need to explicitly call `render()` at the end of your code to display the output.

````mdx-code-block
<BrowserWindow>
```jsx live noInline
const project = "Docusaurus";
const Greeting = () => (
<p>Hello {project}!</p>
);
render(
<Greeting />
);
```
</BrowserWindow>
````

## Using JSX markup in code blocks {#using-jsx-markup}

Code block in Markdown always preserves its content as plain text, meaning you can't do something like:
Expand Down

0 comments on commit f25ee0c

Please sign in to comment.