# LiveCodes > LiveCodes is a feature-rich, open-source, client-side code playground that supports React, Vue, Svelte, Solid, JavaScript, TypeScript, CSS, Sass, Tailwind CSS, Python, Go, Ruby, PHP, and 90+ languages/frameworks. A large number of starter templates are available to help you get started quickly. Projects can be saved, shared, exported (e.g. to GitHub Gists), deployed (e.g. to GitHub Pages), or embedded in web pages. A powerful yet easy-to-use SDK enables the creation of and communication with embedded playgrounds. With extensive language support and high configurability, LiveCodes can easily adapt to your needs. It offers excellent mobile support, featuring a responsive layout and a touch-friendly code editor. LiveCodes is an outstanding tool for learning, teaching, prototyping, sharing, and testing code. It can be easily self-hosted, if needed, on any static file server. LiveCodes is completely free for unlimited use, with no ads and no account required. Its MIT License also permits commercial use. - [Docs](https://livecodes.io/docs/llms.txt) - [Full Docs](https://livecodes.io/docs/llms-full.txt) - [README](https://raw.githubusercontent.com/live-codes/livecodes/refs/heads/develop/README.md) # LiveCodes A Code Playground That Just Works!
Demo: (console=full)
:::tip Setting the querystring `languages` only shows these languages. Selecting one language and setting console to `full` gives an environment similar to a REPL. ::: Demo: (Python - print to console)
Demo: (template=jest-react)
Demo:
You can import from React like that: ```js import { useState } from 'react'; ``` Demo:
This is identified as <strong>HTML</strong> code
```
The HTML editor is prefilled with: `This is identified as HTML code`
Please note that the code should be html-encoded to avoid interference with the HTML of the page.
:::
Example:
https://livecodes.io/?x=https://live-codes.github.io/livecodes-examples/prefill-from-code-blocks.html
Alternatively, custom CSS selectors can be specified using [query params](../configuration/query-params.html.md):
`?x={url}&{language}-selector={selector}`
The following example loads the content of the first element that matches the CSS selector `h3` as `html`:
https://livecodes.io/?html-selector=h3&x=https://live-codes.github.io/livecodes-examples/prefill-from-code-blocks.html
Of course, [embedded playgrounds](./embeds.html.md) can be prefilled with code from the same embedding page. This works well for documentation and educational websites.
[This is a demo](https://live-codes.github.io/livecodes-examples/prefill-from-code-blocks.html) for automatic extraction of code blocks to prefill editors by creating "Edit in LiveCodes" links. Also embedded editors are prefilled from the code blocks. ([View source](https://github.com/live-codes/livecodes-examples/blob/master/prefill-from-code-blocks.html))
## Import Raw Code
If the response text could not be parsed as DOM or no elements matched the CSS selectors, it is assumed to be raw code and the response text is loaded to editor. If the URL ends with an extension it is used to identify the language, otherwise it is assumed to be `html`.
Alternatively, the language of raw code can be specified using [query params](../configuration/query-params.html.md):
`?x={url}&raw={language}`
## Import from CodePen
Currently, CodePen API does not allow directly importing code from Pens. However, you can export any saved Pen as a [zip file](https://blog.codepen.io/documentation/exporting-pens/#export-zip-1) or [Github gist](https://blog.codepen.io/documentation/exporting-pens/#save-as-github-gist-2) and then import it to LiveCodes. The format that Codepen exports is well understood by LiveCodes. Most Pens can be imported with no or minimal changes.
**Note:** External resources (styles/scripts) are not exported with source code in zip file export of CodePen. However, export to GitHub gist does export these. So if a Pen with external resources exported as zip file is not imported properly, try exporting to GitHub gist or manually add the [external resources](./external-resources.html.md).
## Import Exported LiveCodes Projects
A [single project exported as JSON](./export.html.md)#exporting-a-single-project) can be imported in the same or a different device from the import screen under the tab "Import Project JSON". The JSON file can be supplied as a local file upload or from a URL.
Similarly, [multiple projects exported in bulk](./export.html.md)#exporting-multiple-projects) can be imported from the tab "Bulk Import".
## Related
- [Code prefill](./code-prefill.html.md)
- [Export](./export.html.md)
- [External resources](./external-resources.html.md)
- [Module resolution](./module-resolution.html.md)
- [Projects](./projects.html.md)
---
# Export
## Exporting A Single Project
Project export can be accessed from the Project menu → Export.

Any project can be exported to:
- **Project (JSON):** a JSON file containing project [configuration object](../configuration/configuration-object.html.md). This can be used to later [import](./import.html.md)#import-exported-livecodes-projects) that project on the same or a different device or to share a copy of the project with others.
- **Source (ZIP):** a zip file containing the project configuration file as JSON, in addition to the source code in separate files. This can be useful for opening the code in an external IDE.
- **Result (HTML):** [result page](./result.html.md) as a single html file. Can be used for the purpose of demo or deploy.
- **GitHub gist** (_requires login with [GitHub account](./github-integration.html.md)_): creates a **public** GitHub gist on the user's GitHub account containing the source code as separate files.
- **CodePen:** creates a [CodePen](https://codepen.io/) prefilled with the project code. If the used [languages/frameworks](./../languages/index.html.md) are not supported in CodePen (e.g. Astro, Svelte, Python, ...etc), the compiled code is exported so that it continues to work there. [Bare module imports](./module-resolution.html.md) are converted to esm imports, for example:
```js
```
becomes:
```js
import React from 'https://cdn.skypack.dev/react';
```
- **JSFiddle:** creates a [JSFiddle](https://jsfiddle.net/) prefilled with the project code. Exported code may be modified like with CodePen (see above).
## Exporting Multiple Projects
Multiple projects can be exported in bulk from the [Saved Projects](./projects.html.md) screen (Project menu → Open) using the button `Export All`.

This produces a JSON file containing an array of project configuration objects. They can be later imported in the same or a different device using the `Bulk Import` functionality in the [Import screen](./import.html.md)#import-exported-livecodes-projects).
All the currently visible projects will be exported. If projects are filtered (e.g. by language, tag or search query), only the shown projects are exported.
## Related
- [Projects](./projects.html.md)
- [Import](./import.html.md)
- [Backup/Restore](./backup-restore.html.md)
- [Sync](./sync.html.md)
- [Share](./share.html.md)
---
# Share
It is easy to share LiveCodes projects!
A URL is generated to load the shared project. This URL can be copied or shared to different social media.
The share screen can be accessed from the share icon at the top right or from the Project menu → Share.

By default, the generated URL encodes the project configuration in a base-64-encoded compressed query string. This step is generated locally in the browser without sending the code to any server. However, depending on the size of the project, the URL can be very long. The length of the URL is indicated in the share screen. [Try not to use very long URLs](https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers) to ensure cross-browser compatibility.
When requested by the user, short URLs can be generated. This requires sending the project configuration (**including source code**) to a server that saves the code and provides a short Id which can be used to retrieve the project.

:::caution
Generating a short URL for sharing requires sending the project configuration (**including source code**) to LiveCodes share service. **It cannot then be deleted**.
:::
:::info Note
The app hosted on [`https://livecodes.io`](https://livecodes.io) uses an API endpoint specifically provided to generate short URLs for LiveCodes share service. We will make every effort to keep that online and available for free use, so long as it is not abused. Please help keep it available by not abusing it and by [sponsoring the project](../sponsor.html.md).
Short URLs generated by LiveCodes share service are **private** by default and are not listed or indexed.
However, [**self-hosted apps**](./self-hosting.html.md) use the free service [dpaste](https://dpaste.com/) for short URLs which are [**deleted after 365 days**](https://dpaste.com/help). You may want to use a [custom service](../advanced/services.html.md) instead. LiveCodes [sponsors](../sponsor.html.md) (Bronze sponsors and above) get access to managed custom services.
:::
QR code can be generated for the share URL. This can then be scanned by any QR code scanner (e.g. mobile/tablet camera) to load the project on other devices without having to send the link. Please note that generating QR code also requires generating a short URL (code is sent to the share service - see above).

## Related
- [Export](./export.html.md)
- [Import](./import.html.md)
- [Deploy](./deploy.html.md)
- [Broadcast](./broadcast.html.md)
- [Backup / Restore](./backup-restore.html.md)
- [Sync](./sync.html.md)
- [Permanent URL](./permanent-url.html.md)
---
# Welcome Screen
---
# Recover Unsaved
---
# Code to Image
LiveCodes has a feature called "Code to Image" that allows converting the code in the code editor into nice-looking images (or code screenshots), that can be downloaded or shared.
This can be accessed from the camera icon in the toolbar below the editor. Clicking the icon will open the "Code to Image" screen and load the code in the editor.

Code can be modified in the "Code to Image" screen and then downloaded as image or shared.

There are many options to configure the image to be generated, including background color, border radius, image size, padding, shadow, window style, share URL, editor theme, opacity, code font, image format, etc.
There are multiple presets that can be used or the options can be manually configured.




---
# Display Modes
import LiveCodes from '../../src/components/LiveCodes.tsx';
The [configuration](../configuration/configuration-object.html.md) option [`mode`](../configuration/configuration-object.html.md)#mode), also available as [query param](../configuration/query-params.html.md), can be used to select different display modes.
The following display modes are supported:
## `full`
This is the default mode with toolbars, editor and result panes.
Example: https://livecodes.io/?template=react
Screenshot: (App in full mode)

Demo: (Embedded playground in full mode)
## Get Permanent URL
You can get the permanent URL for the app from the [About screen](pathname:///../?screen=about) (Help menu → About). By default, the code generated in the [Embed screen](./embeds.html.md)#app-embed-screen) uses permanent URL.
Alternatively, open the browser console of the standalone app (e.g. https://livecodes.io), and run this:
export const GetPermanentUrl = () => {
const { siteConfig } = useDocusaurusContext();
return (
# Hello World!
Open in playground
```
export const getPlaygroundUrlDemo = {
html: `# Hello World!
\nOpen in playground\n`,
};
`](../api/interfaces/Playground.md#getcode)
Gets the playground code (including source code, source language and compiled code) for each editor (`markup`, `style`, `script`), in addition to result page HTML.
```js
import { createPlayground } from 'livecodes';
createPlayground('#container').then(async (playground) => {
const code = await playground.getCode();
// source code, language and compiled code for the script editor
const { content, language, compiled } = code.script;
// result page HTML
const result = code.result;
});
```
### `show`
Type: [`(panel: 'editor' | 'markup' | 'style' | 'script' | 'console' | 'compiled' | 'tests' | 'result' | 'toggle-result', options?: { full?: boolean; line?: number; column?: number; zoom?: 1 | 0.5 | 0.25 }) => Promise`](../api/interfaces/Playground.md#show)
Shows the selected panel, which is either:
- Active Editor: `editor`
- Specific Editor: `markup`, `style` or `script`
- Tool: `console`, `compiled` or `tests`
- Result page: `result` or `toggle-result`
The second optional argument is an object:
- It may have the boolean property `full`, which If `true`, selected editor or result page will take the full vertical and horizontal space of the playground, while tools will take the full vertical and half the horizontal space, leaving some space for the active editor.
- The optional properties `line` and `column` allow scrolling to line/column number in the shown editor.
- The optional property `zoom` sets the result page [zoom level](../features/result.html.md)#result-page-zoom) (the selected panel must be `result`).
```js
import { createPlayground } from 'livecodes';
createPlayground('#container').then(async (playground) => {
const delay = (duration) =>
new Promise((resolve) => {
setTimeout(resolve, duration);
});
await playground.show('toggle-result');
await delay(2000);
await playground.show('style');
await delay(2000);
await playground.show('result', { full: true });
await delay(2000);
await playground.show('script');
await delay(2000);
await playground.show('result', { zoom: 0.5 });
await delay(2000);
await playground.show('console', { full: true });
});
```
### `runTests`
Type: [`() => Promise<{ results: TestResult[] }>`](../api/interfaces/Playground.md#runtests)
Runs project [tests](./../features/tests.html.md) (if present) and gets test results.
```js
import { createPlayground } from 'livecodes';
createPlayground('#container').then(async (playground) => {
const { results } = await playground.runTests();
});
```
### `watch`
Type: [docs](../api/interfaces/Playground.md#watch)
```ts
((event: 'load', fn: () => void) => { remove: () => void }) &
((event: 'ready', fn: (data: { config: Config }) => void) => { remove: () => void }) &
((event: 'code', fn: (data: { code: Code; config: Config }) => void) => { remove: () => void }) &
((event: 'console', fn: (data: { method: string; args: any[] }) => void) => { remove: () => void }) &
((event: 'tests', fn: (data: { results: TestResult[]; error?: string }) => void) => { remove: () => void }) &
((event: 'destroy', fn: () => void) => { remove: () => void });
```
Allows to watch for various playground events. It takes 2 arguments: event name and a callback function that will be called on every event.
In some events, the callback function will be called with an object that supplies relevant data to the callback function (e.g. code, console output, test results).
The `watch` method returns an object with a single method `remove`, which when called will remove the callback from watching further events.
```js
import { createPlayground } from 'livecodes';
createPlayground('#container').then((playground) => {
const codeWatcher = playground.watch('code', ({ code, config }) => {
// this will run on every code change
console.log('code:', code);
console.log('config:', config);
});
const consoleWatcher = playground.watch('console', ({ method, args }) => {
// this will run on every console output
console[method](...args);
});
const testsWatcher = playground.watch('tests', ({ results }) => {
// this will run when tests run
results.forEach((testResult) => {
console.log('status:', testResult.status); // "pass", "fail" or "skip"
console.log(testResult.errors); // array of errors as strings
});
});
// then later
codeWatcher.remove();
consoleWatcher.remove();
testsWatcher.remove();
// events are no longer watched
});
```
These are the events that can be watched and the description of their callback functions:
- `"load"`: Called when the playground first loads.
```ts
(
event: "load",
fn: () => void
) => { remove: () => void }
```
- `"ready"`: Called when a new project is loaded (including when [imported](../features/import.html.md)) and the playground is ready to run.
```ts
(
event: "ready",
fn: (data: { config: Config }) => void
) => { remove: () => void }
```
- `"code"`: Called when the playground "content" is changed (see [`getCode`](./js-ts.html.md)#getcode) and [`getConfig`](./js-ts.html.md)#getconfig)).
This includes changes in:
- Code (in editors)
- Editor languages
- [CSS processors](../features/css.html.md)#css-processors)
- [External resources](../features/external-resources.html.md)
- Project info (e.g. allows adding content in page head and attributes to `` element)
- [Custom settings](../advanced/custom-settings.html.md) (e.g. allows changing [import maps](../features/module-resolution.html.md)#custom-module-resolution))
- Project title
- [Test](../features/tests.html.md) code
```ts
(
event: "code",
fn: (data: { code: Code; config: Config }) => void
) => { remove: () => void }
```
- `"console"`: Called when the playground console gets new outputs. The callback method is passed an object with 2 properties: `"method"` (e.g. `"log"`, `"error"`, etc.) and `"args"` (the arguments passed to the method, as an array).
```ts
(
event: "console",
fn: (data: { method: string; args: any[] }) => void
) => { remove: () => void }
```
- `"tests"`: Called when tests run and test results are available (see [`runTests`](./js-ts.html.md)#runtests)).
```ts
(
event: "tests",
fn: (data: { results: TestResult[]; error?: string }) => void
) => { remove: () => void }
```
- `"destroy"`: Called when the playground is destroyed.
```ts
(
event: "destroy",
fn: () => void
) => { remove: () => void }
```
### `onChange`
**Deprecated**: Use [`watch`](#watch) method instead.
Type: [`(fn: ChangeHandler) => { remove: () => void }`](../api/interfaces/Playground.md#onchange)
Allows to watch the playground for changes. It takes a callback function that will be called on every change.
The callback function will be called with an object that has 2 properties: `code` and `config`, representing the current codes and configuration objects (see [`getCode`](#getcode) and [`getConfig`](#getconfig)).
The `onChange` method returns an object with a single method `remove`, which when called will remove the callback from watching changes.
```js
import { createPlayground } from 'livecodes';
createPlayground('#container').then((playground) => {
const watcher = playground.onChange(({ code, config }) => {
// this will run on every code change
console.log('code:', code);
console.log('config:', config);
});
// then later
watcher.remove();
// changes are no longer watched
});
```
### `exec`
Type: [`(command: APICommands, ...args: any[]) => Promise<{ output: any } | { error: string }>`](../api/interfaces/Playground.md#exec)
Execute custom commands, including:
- `"setBroadcastToken"`: Sets [broadcast `userToken`](../features/broadcast.html.md)#technical-details).
```js
// in browser console of full app (e.g. https://livecodes.io)
await livecodes.exec('setBroadcastToken', 'my-token');
```
- `"showVersion"`: Logs the current LiveCodes app version, SDK version, git commit SHA, [permanent app URL](../features/permanent-url.html.md) and SDK URL in the browser console.
```js
// in browser console of full app (e.g. https://livecodes.io)
await livecodes.exec('showVersion');
```
### `destroy`
Type: [`() => Promise`](../api/interfaces/Playground.md#destroy)
Destroys the playground instance, and removes event listeners. Further call to any SDK methods throws an error.
```js
import { createPlayground } from 'livecodes';
createPlayground('#container').then(async (playground) => {
await playground.destroy();
// playground destroyed
// any further SDK call throws an error
});
```
## Styles
### Default Styles
By default, the container element is styled when the SDK is initialized (including width, height, border, etc.). To disable default styles, set the container element attribute `data-default-styles` to `"false"` before initializing.
Example:
```html
```
### Height
By default, the playground container height is set to `"300px"`. To change the height, either disable the default styles and override them, or simply set the `data-height` attribute to a number (in pixels) or any valid CSS value (e.g. `"100%"` to take the full height of its parent element).
Example:
```html
```
## Demo
export const sdkDemo = {
js: `import { createPlayground } from "livecodes";\n\nconst params = {\n html: "Hello World!
",\n css: "h1 {color: blue;}",\n js: 'console.log("Hello, LiveCodes!")',\n console: "open",\n};\n\ncreatePlayground('#container', { params });\n`,
html: '',
};
## Related
- [React SDK](./react.html.md)
- [Vue SDK](./vue.html.md)
- [Using SDK in Svelte](./svelte.html.md)
- [Embedded Playgrounds](../features/embeds.html.md)
---
# React SDK
import LiveCodes from '../../src/components/LiveCodes.tsx';
The react SDK is a thin wrapper around the [JavaScript SDK](js-ts.html.md) to provide an easy to use react component, yet retaining the full power, by having access to the [SDK methods](js-ts.html.md)#sdk-methods).
It has a very simple [implementation](https://github.com/live-codes/livecodes/blob/develop/src/sdk/react.tsx) which you can easily modify in case you need.
## Installation
Please refer to the [SDK installation](./index.html.md)#installation) section.
## Usage
The react component is provided as the default export from `livecodes/react`.
```jsx title="JSX"
import LiveCodes from 'livecodes/react';
export const Playground = () => ;
```
### TypeScript Support
Prop types are exported as `Props` from `livecodes/react`.
```tsx title="TSX"
import LiveCodes, { type Props } from 'livecodes/react';
const options: Props = {
// embed options
};
export const Playground = () => ;
```
TypeScript types are [documented here](../api/globals.md).
### Props
All [embed options](js-ts.html.md)#embed-options) are available as props with the corresponding types.
Example:
```jsx title="JSX"
import LiveCodes from 'livecodes/react';
const config = {
markup: {
language: 'markdown',
content: '# Hello World!',
},
};
export const Playground = () => ;
```
In addition, the following props are also available:
- `className`
Type: `string`.
Class name(s) to add to playground container element.
Example:
```jsx title="JSX"
import LiveCodes from 'livecodes/react';
export const Playground = () => ;
```
- `height`
Type: `string`.
Sets the height of playground container element.
Example:
```jsx title="JSX"
import LiveCodes from 'livecodes/react';
export const Playground = () => ;
```
- `style`
Type: `Record`.
Defines styles to add to playground container element. Styles set here override the [default styles](js-ts.html.md)#default-styles).
Example:
```tsx title="JSX"
import LiveCodes from 'livecodes/react';
const style = {
margin: 'auto',
width: '80%',
};
export const Playground = () => ;
```
- `sdkReady`
Type: `(sdk: Playground) => void`.
A callback function, that is provided with an instance of the [JavaScript SDK](js-ts.html.md) representing the current playground. This allows making use of full capability of the SDK by calling [SDK methods](js-ts.html.md)#sdk-methods).
Example:
```tsx title="TSX"
import { useState } from 'react';
import LiveCodes from 'livecodes/react';
import type { Playground } from 'livecodes';
export const App = () => {
const [playground, setPlayground] = useState();
const onReady = (sdk: Playground) => {
setPlayground(sdk);
};
const run = async () => {
await playground?.run();
};
return (
<>
>
);
};
```
## Demo
export const reactSDKDemo = {
jsx: `import LiveCodes from "livecodes/react";\n\nconst App = () => {\n const params = {\n html: "Hello World!
",\n css: "h1 {color: blue;}",\n js: 'console.log("Hello, World!")',\n console: "open",\n };\n\n return ;\n};\n\nexport default App;\n`,
};
## Related
- [SDK Installation](./index.html.md)#installation)
- [JS/TS SDK](./js-ts.html.md)
- [Vue SDK](./vue.html.md)
- [Using SDK in Svelte](./svelte.html.md)
- [Embedded Playgrounds](../features/embeds.html.md)
---
# Vue SDK
import LiveCodes from '../../src/components/LiveCodes.tsx';
The vue SDK is a thin wrapper around the [JavaScript SDK](js-ts.html.md) to provide an easy to use vue component, yet retaining the full power, by having access to the [SDK methods](js-ts.html.md)#sdk-methods).
It has a very simple [implementation](https://github.com/live-codes/livecodes/blob/develop/src/sdk/vue.ts) which you can easily modify in case you need.
## Installation
Please refer to the [SDK installation](./index.html.md)#installation) section.
## Usage
The vue component is provided as the default export from `livecodes/vue`.
```html title="App.vue"
```
### TypeScript Support
Prop types are exported as `Props` from `livecodes/vue`.
```html title="App.vue"
```
TypeScript types are [documented here](../api/globals.md).
### Props
All [embed options](js-ts.html.md)#embed-options) are available as props with the corresponding types.
Example:
```html title="App.vue"
```
In addition, the following prop is also available:
- `height`
Type: `string`.
Sets the [height of playground container](js-ts.html.md)#height) element.
Example:
```html title="App.vue"
```
### Events
- `"sdkReady"`
Type: `(sdk: Playground) => void`.
When the playground initializes, the event `"sdkReady"` is emitted. The event handler function is provided with an instance of the [JavaScript SDK](js-ts.html.md) representing the current playground. This allows making use of full capability of the SDK by calling [SDK methods](js-ts.html.md)#sdk-methods).
Example:
```html title="App.vue"
```
### Styles
Styles can be applied to the component [as usual](https://vuejs.org/guide/essentials/class-and-style.html#binding-html-classes).
By default, a set of [default styles](js-ts.html.md)#default-styles) are applied to the playground container. Styles passed to the component override these default styles.
Example:
```html title="App.vue"
```
## Demo
export const vueSDKDemo = {
vue: `\n\n\n \n\n`,
};
## Related
- [SDK Installation](./index.html.md)#installation)
- [JS/TS SDK](./js-ts.html.md)
- [React SDK](./react.html.md)
- [Using SDK in Svelte](./svelte.html.md)
- [Embedded Playgrounds](../features/embeds.html.md)
---
# Svelte
import LiveCodes from '../../src/components/LiveCodes.tsx';
import RunInLiveCodes from '../../src/components/RunInLiveCodes.tsx';
The [JS/TS SDK](js-ts.html.md) can be used directly in Svelte components without the need for any wrappers.
## Installation
Please refer to the [SDK installation](./index.html.md)#installation) section.
## Usage
This is an example of using the LiveCodes JS SDK in a Svelte component:
```html title="Component.svelte"
```
export const svelteSDKDemo = {
svelte: `\x3Cscript>\n import { onMount } from 'svelte';\n import { createPlayground } from 'livecodes';\n\n // Embed Options\n const options = {\n params: {\n html: 'Hello World!
',\n css: 'h1 {color: blue;}',\n js: 'console.log("Hello, Svelte!")',\n console: 'open',\n },\n };\n\n let container;\n let playground = $state(null);\n onMount(() => {\n createPlayground(container, options).then((p) => {\n playground = p; // now the SDK is available\n });\n // cleanup when the component is destroyed\n return () => playground?.destroy();\n });\n\x3C/script>\n\n\n`,
};
[Embed options](./js-ts.html.md)#embed-options), [SDK methods](./js-ts.html.md)#sdk-methods) and [TypeScript types](./js-ts.html.md)#typescript-types) are available as described in the [JS/TS SDK documentations](./js-ts.html.md).
Alternatively, the SDK function [`createPlayground`](./js-ts.html.md)#createplayground) can be used as an [action](https://learn.svelte.dev/tutorial/actions).
Example:
```html title="Component.svelte"
```
However, it is recommended to cleanup when the node is unmounted, like that:
```html title="Component.svelte"
```
## Demo
## Related
- [SDK Installation](./index.html.md)#installation)
- [JS/TS SDK](./js-ts.html.md)
- [React SDK](./react.html.md)
- [Vue SDK](./vue.html.md)
- [Embedded Playgrounds](../features/embeds.html.md)
---
# Headless Mode
import LiveCodes from '../../src/components/LiveCodes.tsx';
The LiveCodes [SDK](../sdk/index.html.md) can be used to create playgrounds in headless mode. In this mode, no visible output is displayed in the embedding web page. However, all [SDK methods](../sdk/js-ts.html.md)#sdk-methods) are accessible (e.g. for [updating code](./js-ts.html.md)#setconfig), [getting compiled code](./js-ts.html.md)#getcode), console output, [result HTML](./js-ts.html.md)#getcode), [shareable URLs](./js-ts.html.md)#getshareurl), [formatting code](./js-ts.html.md)#format), [running tests](./js-ts.html.md)#runtests), etc).
This provides the power of leveraging the wide range of features and language support offered by LiveCodes, while retaining full control over the UI.
## Usage
To create a headless playground, set the [embed option](./js-ts.html.md)#embed-options) [`headless`](../sdk/js-ts.html.md)#headless) to `true`.
Please note that in headless mode, the first parameter (`container`) of the function [`createPlayground`](../sdk/js-ts.html.md)#createplayground) is optional and can be omitted.
Example:
```js
import { createPlayground } from 'livecodes';
createPlayground({
view: 'headless',
config: {
markup: {
language: 'markdown',
content: '# Hello World!',
},
},
}).then(async (playground) => {
const code = await playground.getCode();
console.log(code.markup.compiled); // "Hello World!
"
console.log(code.result); // (result page HTML)
});
```
## Examples
The following examples show how to use the headless mode to make a Markdown editor, an MDX editor and a Python interpreter.
:::tip
You may want to view the following playgrounds in full screen (using the full screen button in the top right of each playground).
:::
### Markdown Editor
In this demo, code changes are watched using the SDK method [`watch('code', callback)`](./js-ts.html.md)#watch). The callback function accepts an argument which is an object with the properties `code` and `config` (see [`getCode`](./js-ts.html.md)#getcode) and [`getConfig`](./js-ts.html.md)#getconfig)). The compiled code is obtained as `code.markup.compiled`.
export const mdDemo = { markup: { language: 'html', content: `\nLoading...\n\n\x3Cscript type="module">\n import { createPlayground } from "https://cdn.jsdelivr.net/npm/livecodes@0.2.0";\n import debounce from "https://jspm.dev/debounce";\n\n const initialCode = "# Hello, LiveCodes!\\n\\n";\n\n // the code editor\n const editor = CodeMirror.fromTextArea(document.getElementById("editor"), {\n lineNumbers: true,\n mode: "markdown",\n });\n editor.setSize("100%", 200);\n editor.setValue(initialCode);\n\n // the playground\n const options = {\n view: "headless",\n };\n\n const livecodes = await createPlayground(options);\n await livecodes.load();\n\n const compile = async () => {\n await livecodes.setConfig({\n autoupdate: false,\n markup: {\n language: "markdown",\n content: editor.doc.getValue(),\n },\n });\n };\n\n // watch for changes\n editor.on("change", debounce(compile, 1000));\n livecodes.watch("code", ({ code, config }) => {\n createSandbox(document.querySelector("#output"), code.markup.compiled);\n });\n\n await compile();\n\n // create a sandbox for safe execution of compiled code\n function createSandbox (container, html) {\n const iframe = document.createElement("iframe");\n iframe.src = "https://livecodes-sandbox.pages.dev/v7/";\n iframe.sandbox =\n "allow-same-origin allow-downloads allow-forms allow-modals allow-orientation-lock allow-pointer-lock allow-popups allow-presentation allow-scripts";\n iframe.onload = () => {\n iframe.contentWindow.postMessage({ html }, "*");\n };\n container.innerHTML = "";\n container.appendChild(iframe);\n return iframe;\n };\n\x3C/script>\n\n\n\x3Cscript src="https://unpkg.com/codemirror@5.65.15/lib/codemirror.js">\x3C/script>\n\x3Cscript src="https://unpkg.com/codemirror@5.65.15/mode/markdown/markdown.js">\x3C/script>\n\n\n` }}
### MDX Editor
In this demo, code changes are watched using the SDK method [`watch('code', callback)`](./js-ts.html.md)#watch). The callback function accepts an argument which is an object with the properties `code` and `config` (see [`getCode`](./js-ts.html.md)#getcode) and [`getConfig`](./js-ts.html.md)#getconfig)). The result HTML is obtained as `code.result`.
:::tip
If you do not want to run the result page in the headless playground and only want to get the generated result HTML, you can set the configuration option [`autoupdate](../configuration/configuration-object.html.md)#autoupdate) to `false`.
:::
export const mdxDemo = { markup: { language: 'html', content: `\nLoading...\n\n\x3Cscript type="module">\n import { createPlayground } from "https://cdn.jsdelivr.net/npm/livecodes@0.2.0";\n import debounce from "https://jspm.dev/debounce";\n\n const initialCode = \`import { useState, useEffect } from 'react';\n\nexport const Hello = ({name}) => {\n const [count, setCount] = useState(0);\n return (\n <>\n Hello, {name}!
\n You clicked {count} times.
\n \n >\n );\n};\n\n \n\n## MDX in short\n\n- ❤️ Powerful\n- 💻 Everything is a component\n- 🔧 Customizable\n- 📚 Markdown-based\n- 🔥 Blazingly blazing fast\n\n> from [mdxjs.com](https://mdxjs.com/)\n\`;\n\n // the code editor\n const editor = CodeMirror.fromTextArea(document.getElementById("editor"), {\n lineNumbers: true,\n mode: "markdown",\n });\n editor.setSize("100%", 200);\n editor.setValue(initialCode);\n\n // the playground\n const options = {\n view: "headless",\n config: { autoupdate: false },\n };\n\n const livecodes = await createPlayground(options);\n await livecodes.load();\n\n const compile = async () => {\n await livecodes.setConfig({\n autoupdate: false,\n markup: {\n language: "mdx",\n content: editor.doc.getValue(),\n },\n });\n };\n\n // watch for changes\n editor.on("change", debounce(compile, 1000));\n livecodes.watch("code", ({ code, config }) => {\n createSandbox(document.querySelector("#output"), code.result);\n });\n\n await compile();\n\n // create a sandbox for safe execution of compiled code\n function createSandbox (container, html) {\n const iframe = document.createElement("iframe");\n iframe.src = "https://livecodes-sandbox.pages.dev/v7/";\n iframe.sandbox =\n "allow-same-origin allow-downloads allow-forms allow-modals allow-orientation-lock allow-pointer-lock allow-popups allow-presentation allow-scripts";\n iframe.onload = () => {\n iframe.contentWindow.postMessage({ html }, "*");\n };\n container.innerHTML = "";\n container.appendChild(iframe);\n return iframe;\n };\n\x3C/script>\n\n\n\x3Cscript src="https://unpkg.com/codemirror@5.65.15/lib/codemirror.js">\x3C/script>\n\x3Cscript src="https://unpkg.com/codemirror@5.65.15/mode/markdown/markdown.js">\x3C/script>\n\n\n` }}
### Python Interpreter
In this demo, console output is obtained using the SDK method [`watch('code', callback)`](./js-ts.html.md)#watch). The callback function accepts an argument which is an object with the properties `method` and `args` indicating the console method and the arguments that were passed (as an array).
export const pyDemo = { markup: { language: 'html', content: `\nLoading...\n\n\x3Cscript type="module">\n import { createPlayground } from "https://cdn.jsdelivr.net/npm/livecodes@0.2.0";\n import debounce from "https://jspm.dev/debounce";\n\n const initialCode = \`def say_hello(name):\n return f"Hello, {name}!"\n\nprint(say_hello("LiveCodes"))\n\`;\n\n // the code editor\n const editor = CodeMirror.fromTextArea(document.getElementById("editor"), {\n lineNumbers: true,\n mode: "python",\n });\n editor.setSize("100%", 250);\n editor.setValue(initialCode);\n\n // the playground\n const options = {\n view: "headless",\n };\n\n const livecodes = await createPlayground(options);\n await livecodes.load();\n\n const run = async () => {\n await livecodes.setConfig({\n autoupdate: true,\n script: {\n language: "python",\n content: editor.doc.getValue(),\n },\n });\n };\n\n // watch for changes\n editor.on("change", debounce(run, 1000));\n livecodes.watch("console", ({ method, args }) => {\n const output = document.querySelector("#output");\n output.innerHTML = args.join("\\n");\n if (method === "error") {\n output.style.color = "red";\n } else {\n output.style.color = "unset";\n }\n });\n\n await run();\n\x3C/script>\n\n\n\x3Cscript src="https://unpkg.com/codemirror@5.65.15/lib/codemirror.js">\x3C/script>\n\x3Cscript src="https://unpkg.com/codemirror@5.65.15/mode/python/python.js">\x3C/script>\n\n\n` }}
---
# Advanced Topics {#advanced-topics-custom-content-top}
```mdx-code-block
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
item.docId !== 'languages/index')}/>
```
---
# Custom Settings
---
# Services
LiveCodes (being a client-side app) uses multiple services (for example for authentication, sharing, module resolution, etc).
These services are [defined here](https://github.com/live-codes/livecodes/tree/develop/src/livecodes/services).
Some of the services are not supported on [self-hosted](../features/self-hosting.html.md) deploys and are either replaced by other compatible services or require you to provide an alternative service.
Examples:
- The [share](../features/share.html.md) service in [self-hosted](../features/self-hosting.html.md) apps uses [dpaste](https://dpaste.com/) for short URLs, which are [**deleted after 365 days**](https://dpaste.com/help).
- [Firebase configuration](https://github.com/live-codes/livecodes/tree/develop/src/livecodes/services/firebase.ts) for authentication.
:::info
LiveCodes [sponsors](../sponsor.html.md) (Bronze sponsors and above) get access to managed custom services.
:::
If you [self-host](../features/self-hosting.html.md) your app and need to change any of these services, start by following the [guide described there](../features/self-hosting.html.md).
Then, edit the services you want (in [`src/livecodes/services`](https://github.com/live-codes/livecodes/tree/develop/src/livecodes/services)). The used services need to have the same interface.
The app then needs to be re-built using the command:
```shell
npm run build
```
The built app is in `build` directory. This can be hosted on any static file server.
---
# Languages
## Overview
The term "language" used in these documentations refer to any technology (in addition to web languages: HTML, CSS and JavaScript), that needs some form of transformation/compilation to run in the browser.
LiveCodes provides support for a wide range of languages, which include (but not limited to):
- Syntax used by web libraries/frameworks (e.g. JSX, TSX, Vue SFC, Svelte SFC, MDX, Astro).
- Languages that transpile to JavaScript (e.g. TypeScript, CoffeeScript, LiveScript, ReScript).
- Languages/frameworks that generate CSS (e.g. SCSS, Less, Stylus, Tailwind CSS, UnoCSS).
- CSS processors (e.g. PostCSS, Autoprefixer, Lightning CSS, CSS Modules, cssnano)
- Traditional programming languages (e.g. Python, Ruby, Go, PHP, C++, R, Lua, Scheme, Perl).
- Data manipulation/logic languages (e.g. SQL, Prolog).
- Authoring/templating languages (e.g Markdown, AsciiDoc, Pug, Handlebars, Haml).
- Low-code/visual editors (e.g. blockly, rich text editor).
- Modeling languages/diagram-as-code (e.g. Gnuplot, Graphviz, Mermaid, Vega, Plotly).
- Languages that target WebAssembly (e.g. AssemblyScript, WebAssembly Text Format)
- ... and others.
Below is the full list of supported languages with documentations for usage in LiveCodes.
## Language List
```mdx-code-block
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
item.docId !== 'languages/index')}/>
```
---
# art-template
[art-template](https://aui.github.io/art-template/) is a high performance JavaScript templating engine.
## Usage
There are 2 modes for rendering:
### Pre-rendered (Default)
The values of the expressions are evaluated and added to the template during compilation of the [result page](../features/result.html.md).
The values of all expressions should be supplied in advance using [custom settings](../advanced/custom-settings.html.md) to the property `template.data` which accepts an object of key-value pairs.
Example: This provides the value of the expression `name`
```json title="Custom Settings"
{
"template": {
"data": {
"name": "LiveCodes"
}
}
}
```
[Full example below](#pre-rendered)
### Dynamic
To use this mode, the property `template.prerender` in [custom settings](../advanced/custom-settings.html.md) should be set to `false`.
Example:
```json title="Custom Settings"
{
"template": {
"prerender": false
}
}
```
In this mode, in addition to values supplied in custom settings (see above), expressions can have values that are evaluated during the [result page](../features/result.html.md) runtime.
This can be achieved in JavaScript (or any [language](../languages/index.html.md) that compiles to it) by assigning `window.livecodes.templateData` to an object with the data.
Please note that template rendering occurs on [page load](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event), so the assignment must occur before that.
Example:
```js title="Script Editor (JS)"
window.livecodes.templateData = { name: 'LiveCodes' };
```
[Full example below](#dynamic-1)
## Language Info
### Name
`art-template`
### Extensions
`.art`, `.art-template`
### Editor
`markup`
## Compiler
The official [art-template compiler](https://www.npmjs.com/package/art-template).
### Version
`art-template`: v4.13.2
## Code Formatting
Using [Prettier](https://prettier.io/).
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `art-template` are passed as a JSON object to the [`compile`](https://aui.github.io/art-template/docs/api.html#compile-source-options) method during compile. Please check the [documentation](https://aui.github.io/art-template/docs/options.html) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
**Example:**
```json title="Custom Settings"
{
"art-template": {
"minimize": false
}
}
```
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
### Pre-rendered
export const config = {
markup: { language: 'art-template', content: 'Hello {{name}}!' },
customSettings: { template: { data: { name: 'LiveCodes' } } },
};
export const params = { compiled: 'open' };
### Dynamic
export const config2 = {
markup: { language: 'art-template', content: 'Hello {{name}}!' },
script: {
language: 'javascript',
content: 'window.livecodes.templateData = { name: "LiveCodes" };',
},
customSettings: { template: { prerender: false } },
activeEditor: 'script',
};
## Links
- [Official website](https://aui.github.io/art-template/)
- [Documentation](https://aui.github.io/art-template/docs/)
---
# AsciiDoc
import LiveCodes from '../../src/components/LiveCodes.tsx';
[AsciiDoc](https://asciidoc.org) is a plain text markup language for writing technical content. It’s packed with semantic elements and equipped with features to modularize and reuse content. AsciiDoc content can be composed using a text editor, managed in a version control system, and published to multiple output formats.
In LiveCodes, AsciiDoc is compiled to HTML using [Asciidoctor](https://asciidoctor.org/).
## Usage
### Demo
export const asciidocConfig = {
markup: {
language: 'asciidoc',
content: `= AsciiDoc Demo
== Features
* Simple
* Clean
* Dev-friendly
`,
},
}
## Language Info
### Name
`asciidoc`
### Extensions
`adoc`, `asc`
## Editor
`markup`
## Compiler
[Asciidoctor.js](https://docs.asciidoctor.org/asciidoctor.js/latest/)
### Version
Asciidoctor.js: `v2.2.8`
## Code Formatting
Not supported.
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `asciidoc` are passed as a JSON object to the [`convert()`](https://docs.asciidoctor.org/asciidoctor.js/latest/setup/quick-tour/#your-first-conversion) function during compile.
Please check the [documentation](https://docs.asciidoctor.org/asciidoctor.js/latest/processor/convert-options/) and [document attributes](https://docs.asciidoctor.org/asciidoc/latest/attributes/document-attributes-ref/) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
```json
{
"asciidoc": {
"attributes": {
"source-highlighter": "highlight.js",
"icons": "font"
}
}
}
```
## Limitations
- Some advanced extensions may not work (e.g. diagrams)
## Links
- [AsciiDoc](https://asciidoc.org)
- [Asciidoctor](https://asciidoctor.org/)
- [AsciiDoctor.js](https://docs.asciidoctor.org/asciidoctor.js/latest/)
---
# AssemblyScript
TODO...
---
# Astro
TODO...
---
# Autoprefixer
TODO...
---
# Babel
[Babel](https://babeljs.io/) is a toolchain that is mainly used to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments.
## Language Info
### Name
`babel`
### Extensions
`.es`, `.babel`
### Editor
`script`
## Compiler
The official [`@babel/standalone` compiler](https://babeljs.io/docs/babel-standalone).
### Version
`@babel/standalone`: v7.24.7
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `babel` are passed as a JSON object to the [`Babel.transform`](https://babeljs.io/docs/babel-standalone#api) method during compile. Please check the [documentation](https://babeljs.io/docs/babel-core/) for full reference.
By default, the following configuration is used:
```json
{
"babel": { "presets": [["env", { "modules": false }], "typescript", "react"] }
}
```
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
export const params = {
babel:
'export const numbers = [1, 2, 3].map((x) => x * 2);\n\nexport const Greet = (name: string) => <>Hello {name}!>;\n',
compiled: 'open',
};
## Links
- [Babel official website](https://babeljs.io/)
- [Babel documentation](https://babeljs.io/docs/)
---
# BBCode
[BBCode](https://www.bbcode.org/) ("Bulletin Board Code") is a lightweight markup language used to format messages in many Internet forum software.
## Language Info
### Name
`bbcode`
### Extensions
`.bbcode`, `.bb`
### Editor
`markup`
## Compiler
[BBob](https://github.com/JiLiZART/BBob).
### Version
`BBob`: v3.0.2
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
export const config = {markup: {language: 'bbcode', content: '[i]Text[/i]'}};
export const params = {compiled: 'open'};
## Links
- [bbcode.org](https://www.bbcode.org/)
- [BBCode guide](https://www.phpbb.com/community/help/bbcode)
- [BBCode on Wikipedia](https://en.wikipedia.org/wiki/BBCode)
---
# Blockly
TODO...
---
# Civet
TODO...
---
# Clio
TODO...
---
# ClojureScript
[ClojureScript](https://clojurescript.org/) is a robust, practical, and fast programming language with a set of useful features that together form a simple, coherent, and powerful tool.
ClojureScript is a compiler for [Clojure](https://clojure.org/) that targets
JavaScript.
In LiveCodes, it runs in the browser using
[Cherry](https://github.com/squint-cljs/cherry).
:::info Note
Lisp language family supported in LiveCodes includes [Common Lisp](./commonlisp.html.md), [Scheme](./scheme.html.md), [ClojureScript](./clojurescript.html.md) and [Fennel](./fennel.html.md).
:::
## Language Info
### Name
`clojurescript`
### Extensions
`cljs`, `cljc`, `clj`, `edn`, `clojure`
### Editor
`script`
## Compiler
[Cherry](https://github.com/squint-cljs/cherry)
If `JSX` is used (using `#jsx` reader tag - [example](https://github.com/squint-cljs/cherry/blob/60adcf6e3a8fb940a80c6a193599da0272fe3058/examples/jsx/pages/component.cljs)), it is also compiled ([JSX](./jsx.html.md)). See [example usage](#example-usage).
### Version
`cherry-cljs`: v0.2.18
## Code Formatting
Using [Parinfer](https://shaunlebron.github.io/parinfer/).
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
export const params = {
cljs: `(ns demo\n${' '};; you can use npm modules\n${' '}(:require ["canvas-confetti$default" :as confetti]))\n\n(let [el (js/document.getElementById "test")]\n${' '}(.addEventListener el "click"\n ${' '}(fn []\n ${' '}(confetti)\n${' '}(println "test"))))\n`,
html: '',
console: 'open',
};
Using React (with JSX):
## Starter Template
https://livecodes.io/?template=clojurescript
## Links
- [ClojureScript official website](https://clojurescript.org/)
- [Clojure official website](https://clojure.org/)
- [Cherry repo](https://github.com/squint-cljs/cherry)
---
# CoffeeScript
[CoffeeScript](https://coffeescript.org/) is a little language that compiles into JavaScript.
## Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
This example demonstrates usage in LiveCodes:
## Language Info
### Name
`coffeescript`
### Extensions
`.coffee`
### Aliases
`coffee`, `coffeescript`
### Editor
`script`
## Compiler
The official [CoffeeScript compiler](https://www.npmjs.com/package/coffeescript).
### Version
`coffeescript`: v2.7.0
## Starter Template
https://livecodes.io/?template=coffeescript
## Links
- [Official website](https://coffeescript.org/)
- [Language Reference](https://coffeescript.org/#language)
- [CoffeeScript on GitHub](https://github.com/jashkenas/coffeescript)
---
# Common Lisp
[Common Lisp](https://common-lisp.net/) is a dialect of the Lisp programming language.
In LiveCodes, Common Lisp code runs in the browser using [JSCL](https://github.com/jscl-project/jscl), a Common Lisp to JavaScript compiler.
:::info Note
Lisp language family supported in LiveCodes includes [Common Lisp](./commonlisp.html.md), [Scheme](./scheme.html.md), [ClojureScript](./clojurescript.html.md) and [Fennel](./fennel.html.md).
:::
## Usage
LiveCodes runs Common Lisp code in the browser. JSCL implements a subset of Common Lisp, but covers enough functionality to write practical code.
import LiveCodes from '../../src/components/LiveCodes.tsx';
This example demonstrates basic Common Lisp syntax and functionality:
### JS Interoperability
Please see [JSCL docs](https://github.com/jscl-project/jscl/wiki/JSCL-and-manipulations-with-JS-objects)
## Language Info
### Name
`commonlisp`
### Aliases/Extensions
`common-lisp`, `lisp`
### Editor
`script`
## Compiler
[JSCL](https://github.com/jscl-project/jscl) - Common Lisp to JavaScript compiler
## Code Formatting
Using [Parinfer](https://shaunlebron.github.io/parinfer/).
## Limitations
Since JSCL is a subset of Common Lisp, it doesn't implement all Common Lisp features. See the [JSCL documentation](https://github.com/jscl-project/jscl#status) for more information.
## Starter Template
https://livecodes.io/?template=commonlisp
## Links
- [Common Lisp](https://common-lisp.net/)
- [JSCL](https://github.com/jscl-project/jscl)
- [Common Lisp: A Gentle Introduction to Symbolic Computation](https://www.cs.cmu.edu/~dst/LispBook/)
- [Practical Common Lisp](http://www.gigamonkeys.com/book/)
---
# C/C++ (Wasm)
TODO...
---
# C++
TODO...
---
# C# (Wasm)
C# is a high-level, general-purpose, object-oriented programming language developed by Microsoft.
In LiveCodes, C# runs in the browser using Blazor WebAssembly with a WebAssembly-based .NET runtime.
## Usage
Demo:
import LiveCodes from '../../src/components/LiveCodes.tsx';
export const csharpConfig = {
activeEditor: 'script',
script: {
language: 'csharp-wasm',
content: `using System;
public class Program
{
public static void Main()
{
int[] sortedArray = { 1, 3, 5, 7, 9, 11, 13, 15 };
int itemToSearch = 7;
int result = BinarySearch(sortedArray, 0, sortedArray.Length - 1, itemToSearch);
if (result == -1)
{
Console.WriteLine("Result: Item not found in the array.");
}
else
{
Console.WriteLine($"Result: Item found at index -> {result}");
}
}
public static int BinarySearch(int[] arr, int left, int right, int item)
{
if (right >= left)
{
int mid = left + (right - left) / 2;
if (arr[mid] == item)
{
return mid;
}
if (arr[mid] > item)
{
return BinarySearch(arr, left, mid - 1, item);
}
return BinarySearch(arr, mid + 1, right, item);
}
return -1;
}
}`,
},
mode: 'simple',
editor: 'auto',
tools: {
status: 'full',
},
};
### Communication with JavaScript
The C# code runs in the context of the result page. A few helper properties and methods are available in the browser global `livecodes.csharp` object:
- `livecodes.csharp.input`: The initial standard input passed to the C# code.
- `livecodes.csharp.loaded`: A promise that resolves when the C# environment (Blazor WebAssembly) is fully loaded. Other helpers should be used after this promise resolves.
- `livecodes.csharp.output`: The standard output from the C# code execution.
- `livecodes.csharp.run`: A function that runs the C# code with new input. This function takes a string as input and returns a promise that resolves with an object containing the `output`, `error`, and `exitCode` properties.
Example:
## Language Info
### Name
`csharp-wasm`
### Aliases / Extensions
`cs`, `csharp`, `wasm.cs`, `cs-wasm`
### Editor
`script`
## Compiler
Blazor WebAssembly with .NET WebAssembly runtime.
### Version
.NET 9.0
## Code Formatting
using [Prettier](https://prettier.io/)
## Live Reload
By default, new code changes are sent to the result page for re-evaluation without a full page reload, avoiding the need to reinitialize the Blazor environment. This behavior can be disabled by adding the code comment `// __livecodes_reload__` to the C# code, which forces a full page reload.
This comment can be added in the `hiddenContent` property of the editor for embedded playgrounds.
## Example Usage
```csharp
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello, LiveCodes C#!");
}
}
```
## Starter Template
https://livecodes.io/?template=csharp-wasm
## Links
- [C#](https://learn.microsoft.com/en-us/dotnet/csharp/)
- [Blazor WebAssembly](https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor)
---
# CSS
TODO...
---
# CSS Modules
A [CSS Module](https://github.com/css-modules/css-modules) is a CSS file in which all class names and animation names are scoped locally by default.
The selector names are unique to avoid naming collision. They can then be imported as a JavaScript object.
## Usage
CSS Modules can be enabled from the style editor menu.
Selectors added to the style editor (using any language e.g. CSS, SCSS, Less, etc.) are transformed to unique selectors. The transformed classes are then accessible in the script editor as a JSON object, and are injected into the HTML elements.
**Example:**
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
```css
:global .page {
padding: 20px;
}
.text {
color: black;
font-family: sans-serif;
}
.small-text {
composes: text;
font-size: 20px;
}
.large-text {
composes: text;
font-size: 40px;
}
.large-text:hover {
color: red;
}
.title {
composes: large-text;
color: green;
}
```
```css
.page {
padding: 20px;
}
._text_1ygro_9 {
color: black;
font-family: sans-serif;
}
._small-text_1ygro_19 {
font-size: 20px;
}
._large-text_1ygro_29 {
font-size: 40px;
}
._large-text_1ygro_29:hover {
color: red;
}
._title_1ygro_47 {
color: green;
}
```
```json
{
"text": "_text_1ygro_9",
"small-text": "_small-text_1ygro_19 _text_1ygro_9",
"large-text": "_large-text_1ygro_29 _text_1ygro_9",
"title": "_title_1ygro_47 _large-text_1ygro_29 _text_1ygro_9",
"smallText": "_small-text_1ygro_19 _text_1ygro_9",
"largeText": "_large-text_1ygro_29 _text_1ygro_9"
}
```
```html
Page Title
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dolore earum blanditiis quidem non
beatae ipsam autem maiores ut et delectus unde repudiandae, repellendus aut. Aspernatur
similique facere facilis minima tempora.
```
```html
Page Title
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dolore earum blanditiis quidem non
beatae ipsam autem maiores ut et delectus unde repudiandae, repellendus aut. Aspernatur
similique facere facilis minima tempora.
```
In the script editor, the JSON object representing the transformed classes can be imported from the relative URLs `'./style.module.css'` or `'./styles.module.css'`.
[Default](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#default_import), [named](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#named_import) and [namespace](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#namespace_import) imports are supported. Class names are also available in camelCase (e.g `.large-text` becomes `largeText`). This can be changed by setting [`localsConvention`](https://github.com/madyankin/postcss-modules#localsconvention) in [custom settings](#custom-settings).
**Example:**
```js title="In script editor (using JS in this case):"
import classes from './style.module.css';
import { smallText } from './styles.module.css';
import * as allClasses from './styles.module.css';
console.log(classes.title);
// .small-text -> smallText
console.log(smallText);
// .large-text -> largeText
console.log(allClasses.largeText);
// bracket notation for class with dash
console.log(allClasses['large-text']);
```
For full example, see [example usage](#example-usage) below.
:::info
CSS Modules has to be enabled (from style editor menu), to be able to import classes in the script editor.
Importing a URL that does not include `.module` (e.g. `./style.css`) gets the processed CSS **string** as the module's default export.
The extension of the style editor language can also be used, in addition to `.css`. For example, when using SCSS, importing from any of the following URLs is the same:
- `./style.module.css`
- `./styles.module.css`
- `./style.module.scss`
- `./styles.module.scss`
:::
## Language Info
### Name
`cssmodules`
### Type
[Processor](../features/css.html.md)#css-processors)
### Editor
`style`
## Compiler
The CSS Modules processor is provided using [postcss-modules](https://github.com/madyankin/postcss-modules) as a [PostCSS](./postcss.html.md) plugin.
### Version
`postcss-modules`: v6.0.1
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `cssmodules` are passed as a JSON object to the `postcss-modules` plugin during compile. Please check the [documentation](https://github.com/madyankin/postcss-modules#usage) for full reference.
In addition, the following settings are available:
- `addClassesToHTML`
Type: `boolean`. Default: `true`.
The generated classes are injected into the HTML elements, so the styles are applied without having to assign them using JavaScript.
- `removeOriginalClasses`
Type: `boolean`. Default: `false`.
When enabled, the original classes are removed from HTML, keeping only the generated classes. Only applies if `addClassesToHTML` is enabled.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
**Example:**
```json
{
"cssmodules": {
"exportGlobals": true,
"localsConvention": "camelCaseOnly",
"addClassesToHTML": false
}
}
```
## Limitations
Currently, loading external sources in [`composes`](https://github.com/css-modules/css-modules#composing-from-other-files) is not supported.
```css
/* you cannot do this */
.title {
composes: title from 'https://example.com/styles.css';
}
```
If you get this working, [please create a pull request](https://github.com/live-codes/livecodes/pulls).
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
export const params = {
activeEditor: 'style',
html: '\n Page Title
\n Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dolore earum blanditiis quidem non beatae ipsam autem maiores ut et delectus unde repudiandae, repellendus aut. Aspernatur similique facere facilis minima tempora.
\n\n',
css: ':global .page {\n padding: 20px;\n}\n\n.text {\n color: black;\n font-family: sans-serif;\n}\n\n.small-text {\n composes: text;\n font-size: 20px;\n}\n\n.large-text {\n composes: text;\n font-size: 40px;\n}\n\n.large-text:hover {\n color: red;\n}\n\n.title {\n composes: large-text;\n color: green;\n}\n',
js: "import classes from './style.module.css';\n\ndocument.querySelector('h1').className = classes.title;\nconsole.log(classes);\n",
processors: 'cssmodules',
compiled: 'open',
};
## Links
- [CSS Modules](https://github.com/css-modules/css-modules)
- [postcss-modules](https://github.com/madyankin/postcss-modules)
- [PostCSS](https://postcss.org/)
---
# cssnano
TODO...
---
# Diagrams
import OpenCode from '../../src/components/OpenCode.tsx';
## Overview
Diagrams-as-code.
Allows using syntax for multiple visualization libraries inside HTML to produce diagrams.
The rendered diagrams are added to the [result page](../features/result.html.md) as either:
- SVG elements (which you can style with CSS or manipulate with JavaScript)
- HTML images (which you can right-click and save or open in a new window)
Diagrams from multiple libraries can be used in the same page. Only the libraries used will be loaded in the LiveCodes playground. The result page will have no libraries (only the output SVG or images).
Open starter template in LiveCodes
## Usage
This code: ( )
```html
```
produces this output:

Steps
#### 1. Add a diagram target:
The target element should have a `data-src` attribute.
It can be an HTML element (the SVG of the diagram will be embedded as a child element)
```html
```
becomes
```html
```
or an HTML image element (the diagram will be added to its `src` attribute as a [data URL](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs))
```html
```
becomes
```html
```
There can be more that one target element for the same diagram if they have the same `data-src` attribute.
```html
```
#### 2. Add a script element with the diagram syntax:
It should have:
- an attribute `type="application/diagram-{diagram type}"` that specifies the diagram type (e.g. `type="application/diagram-mermaid"`).
- a `data-output` attribute that matches the `data-src` attribute of the target element.
- the syntax of the diagram is the content of the script element or the content of a file linked by the `src` attribute.
```html
```
## Supported Libraries
### [Cytoscape](https://js.cytoscape.org/)
The diagram syntax is JSON representing [Cytoscape options](https://js.cytoscape.org/#getting-started/specifying-basic-options).
Please note that reference to JavaScript objects cannot be used.
e.g. do not use `{container: document.getElementById('cy')}`.
Example: ( )
```html
```
### [ELK](https://www.eclipse.org/elk/)
Diagram layout is produced using [elkjs](https://github.com/kieler/elkjs) and rendered using [elkjs-svg](https://github.com/EmilStenstrom/elkjs-svg).
The syntax used is [ELK JSON](https://www.eclipse.org/elk/documentation/tooldevelopers/graphdatastructure/jsonformat.html) format.
ELK text format is not supported! (You may use [this tool](https://rtsys.informatik.uni-kiel.de/elklive/conversion.html) to convert formats)
Example: ( )
```html
```
### [Gnuplot](http://www.gnuplot.info/)
using [gnuplot-JS](https://github.com/chhu/gnuplot-JS)
Instead of using `data-output` attribute in the [script element](#2-add-a-script-element-with-the-diagram-syntax), the statement `set output` is used in the diagram syntax (see highlighted lines below).
Data files are also specified in the diagram syntax (see highlighted lines below).
They are defined in script elements with the attribute `type="application/diagram-gnuplot-file"`. The file name is specified in `data-file` attribute and either have inline content or linked to with a `src` attribute.
Example: ( )
```html {4,22}
```
### [Graphviz](https://graphviz.org/)
using [@hpcc-js/wasm](https://github.com/hpcc-systems/hpcc-js-wasm)
The following [layout engines](https://graphviz.org/docs/layouts/) are supported:
- dot
- neato
- fdp
- sfdp
- circo
- twopi
- osage
- patchwork
By default, the `dot` layout engine is used. To use a different engine add the attribute `data-layout` to the [script element](#2-add-a-script-element-with-the-diagram-syntax) with the value of the required engine name, like this:
```html
```
Example: ( )
```html
```
### [Mermaid](https://mermaid-js.github.io/mermaid/)
Example: ( )
```html
```
### [Nomnoml](https://nomnoml.com/)
Example: ( )
```html
```
### [Pintora](https://pintorajs.vercel.app/)
[Pintora config](https://pintorajs.vercel.app/docs/configuration/config) object can be specified in [custom settings](../advanced/custom-settings.html.md), under the key `pintora`.
Example Custom Settings:
```json
{
"pintora": {
"themeConfig": {
"theme": "dark"
}
}
}
```
Example: ( )
```html
```
### [Plotly](https://plotly.com/graphing-libraries/)
The diagram syntax is a JSON object with `data` and `layout` properties (see [Plotly reference](https://plotly.com/javascript/reference/index/)).
Please note that the output is a non-interactive SVG element or image. The plotly library is not loaded in the result page, so any JavaScript functionality is not available.
Example: ( )
```html
```
### [Svgbob](https://github.com/ivanceras/svgbob)
Example: ( )
```html
```
### [Vega](https://vega.github.io/vega/)
The diagram syntax is [Vega JSON specification](https://vega.github.io/vega/docs/#specification).
Please note that the output is a non-interactive SVG element or image. The Vega library is not loaded in the result page, so any JavaScript functionality is not available.
Example: ( )
```html
```
### [VegaLite](https://vega.github.io/vega-lite/)
The diagram syntax is [Vega-Lite View JSON Specification](https://vega.github.io/vega-lite/docs/spec.html).
Please note that the output is a non-interactive SVG element or image. The Vega-Lite library is not loaded in the result page, so any JavaScript functionality is not available.
Example: ( )
```html
```
### [WaveDrom](https://wavedrom.com/)
The diagram syntax is [WaveJSON](https://wavedrom.com/tutorial.html) format.
Example: ( )
```html
```
---
# doT
[doT](https://olado.github.io/doT/): The fastest + concise javascript template engine for Node.js and browsers.
## Usage
There are 2 modes for rendering:
### Pre-rendered (Default)
The values of the expressions are evaluated and added to the template during compilation of the [result page](../features/result.html.md).
The values of all expressions should be supplied in advance using [custom settings](../advanced/custom-settings.html.md) to the property `template.data` which accepts an object of key-value pairs.
Example: This provides the value of the expression `name`
```json title="Custom Settings"
{
"template": {
"data": {
"name": "LiveCodes"
}
}
}
```
[Full example below](#pre-rendered)
### Dynamic
To use this mode, the property `template.prerender` in [custom settings](../advanced/custom-settings.html.md) should be set to `false`.
Example:
```json title="Custom Settings"
{
"template": {
"prerender": false
}
}
```
In this mode, in addition to values supplied in custom settings (see above), expressions can have values that are evaluated during the [result page](../features/result.html.md) runtime.
This can be achieved in JavaScript (or any [language](../languages/index.html.md) that compiles to it) by assigning `window.livecodes.templateData` to an object with the data.
Please note that template rendering occurs on [page load](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event), so the assignment must occur before that.
Example:
```js title="Script Editor (JS)"
window.livecodes.templateData = { name: 'LiveCodes' };
```
[Full example below](#dynamic-1)
## Language Info
### Name
`dot`
### Extension
`.dot`
### Editor
`markup`
## Compiler
The official [doT compiler](https://www.npmjs.com/package/dot).
### Version
`dot`: v1.1.3
## Code Formatting
Using [Prettier](https://prettier.io/).
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `dot` are passed as a JSON object to the `doT.template` method during compile. Please check the [documentation](https://olado.github.io/doT/index.html) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
**Example:**
```json title="Custom Settings"
{
"dot": {
"varname": "data"
}
}
```
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
### Pre-rendered
export const config = {
markup: { language: 'dot', content: 'Hello, {{= it.name }}!' },
customSettings: { template: { data: { name: 'LiveCodes' } } },
};
export const params = { compiled: 'open' };
### Dynamic
export const config2 = {
markup: { language: 'dot', content: 'Hello, {{= it.name }}!' },
script: {
language: 'javascript',
content: 'window.livecodes.templateData = { name: "LiveCodes" };',
},
customSettings: { template: { prerender: false } },
activeEditor: 'script',
};
## Links
- [Official website](https://olado.github.io/doT/)
---
# EJS
[Embedded JavaScript templating.](https://ejs.co/)
## Usage
There are 2 modes for rendering:
### Pre-rendered (Default)
The values of the expressions are evaluated and added to the template during compilation of the [result page](../features/result.html.md).
The values of all expressions should be supplied in advance using [custom settings](../advanced/custom-settings.html.md) to the property `template.data` which accepts an object of key-value pairs.
Example: This provides the value of the expression `name`
```json title="Custom Settings"
{
"template": {
"data": {
"name": "LiveCodes"
}
}
}
```
[Full example below](#pre-rendered)
### Dynamic
To use this mode, the property `template.prerender` in [custom settings](../advanced/custom-settings.html.md) should be set to `false`.
Example:
```json title="Custom Settings"
{
"template": {
"prerender": false
}
}
```
In this mode, in addition to values supplied in custom settings (see above), expressions can have values that are evaluated during the [result page](../features/result.html.md) runtime.
This can be achieved in JavaScript (or any [language](../languages/index.html.md) that compiles to it) by assigning `window.livecodes.templateData` to an object with the data.
Please note that template rendering occurs on [page load](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event), so the assignment must occur before that.
Example:
```js title="Script Editor (JS)"
window.livecodes.templateData = { name: 'LiveCodes' };
```
[Full example below](#dynamic-1)
## Language Info
### Name
`ejs`
### Extension
`.ejs`
### Editor
`markup`
## Compiler
The official [EJS compiler](https://www.npmjs.com/package/ejs).
### Version
`ejs`: v3.1.10
## Code Formatting
Using [Prettier](https://prettier.io/).
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `ejs` are passed as a JSON object to the [`compile`](https://ejs.co/#docs) method during compile. Please check the [documentation](https://ejs.co/#docs) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
**Example:**
```json title="Custom Settings"
{
"ejs": {
"delimiter": "%"
}
}
```
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
### Pre-rendered
export const config = {
markup: { language: 'ejs', content: 'Hello <%= name %>!' },
customSettings: { template: { data: { name: 'LiveCodes' } } },
};
export const params = { compiled: 'open' };
### Dynamic
export const config2 = {
markup: { language: 'ejs', content: 'Hello <%= name %>!' },
script: {
language: 'javascript',
content: 'window.livecodes.templateData = { name: "LiveCodes" };',
},
customSettings: { template: { prerender: false } },
activeEditor: 'script',
};
## Links
- [Official website](https://ejs.co/)
---
# Eta
[Eta](https://eta.js.org/) is an embedded JS template engine for Node, Deno, and the browser. Lighweight, fast, and pluggable. Written in TypeScript.
## Usage
There are 2 modes for rendering:
### Pre-rendered (Default)
The values of the expressions are evaluated and added to the template during compilation of the [result page](../features/result.html.md).
The values of all expressions should be supplied in advance using [custom settings](../advanced/custom-settings.html.md) to the property `template.data` which accepts an object of key-value pairs.
Example: This provides the value of the expression `name`
```json title="Custom Settings"
{
"template": {
"data": {
"name": "LiveCodes"
}
}
}
```
[Full example below](#pre-rendered)
### Dynamic
To use this mode, the property `template.prerender` in [custom settings](../advanced/custom-settings.html.md) should be set to `false`.
Example:
```json title="Custom Settings"
{
"template": {
"prerender": false
}
}
```
In this mode, in addition to values supplied in custom settings (see above), expressions can have values that are evaluated during the [result page](../features/result.html.md) runtime.
This can be achieved in JavaScript (or any [language](../languages/index.html.md) that compiles to it) by assigning `window.livecodes.templateData` to an object with the data.
Please note that template rendering occurs on [page load](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event), so the assignment must occur before that.
Example:
```js title="Script Editor (JS)"
window.livecodes.templateData = { name: 'LiveCodes' };
```
[Full example below](#dynamic-1)
## Language Info
### Name
`eta`
### Extension
`.eta`
### Editor
`markup`
## Compiler
The official [Eta compiler](https://www.npmjs.com/package/eta).
### Version
`eta`: v3.4.0
## Code Formatting
Using [Prettier](https://prettier.io/).
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `eta` are passed as a JSON object to the [`Eta.render`](https://eta.js.org/docs/api/rendering) method during compile. Please check the [documentation](https://eta.js.org/docs/api/configuration) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
**Example:**
```json title="Custom Settings"
{
"eta": {
"varName": "data"
}
}
```
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
### Pre-rendered
export const config = {markup: {language: 'eta', content: 'Hello <%= it.name %>!'}, customSettings: {"template": {"data": {"name": "LiveCodes"}}}};
export const params = {compiled: 'open'};
### Dynamic
export const config2 = {markup: {language: 'eta', content: 'Hello <%= it.name %>!'}, script: {language: 'javascript', content: 'window.livecodes.templateData = { name: "LiveCodes" };'}, customSettings: {"template": {"prerender": false}}, activeEditor: 'script'};
## Links
- [Official website](https://eta.js.org/)
- [Documentation](https://eta.js.org/docs/learn)
---
# Fennel
[Fennel](https://fennel-lang.org/) is a programming language that brings together the speed, simplicity, and reach of [Lua](https://www.lua.org/) with the flexibility of a [lisp syntax and macro system]().
Fennel code is compiled to Lua, which then runs in the browser using [Fengari](https://fengari.io/). See documentation for Lua language support in LiveCodes [here](./lua.html.md).
:::info Note
Lisp language family supported in LiveCodes includes [Common Lisp](./commonlisp.html.md), [Scheme](./scheme.html.md), [ClojureScript](./clojurescript.html.md) and [Fennel](./fennel.html.md).
:::
## Usage
JavaScript interoperability and DOM access is achieved using [`"js"` module](https://github.com/fengari-lua/fengari-interop).
import LiveCodes from '../../src/components/LiveCodes.tsx';
This example demonstrates usage, JavaScript interoperability and DOM access:
## Language Info
### Name
`fennel`
### Extension
`.fnl`
### Editor
`script`
## Compiler
[Fennel](https://fennel-lang.org/)
### Version
Fennel v1.3.0
## Code Formatting
Using [Parinfer](https://shaunlebron.github.io/parinfer/).
## Starter Template
https://livecodes.io/?template=fennel
## Links
- [Fennel](https://fennel-lang.org/)
- [Fennel tutorial](https://fennel-lang.org/tutorial)
- [Lua](https://www.lua.org/)
- [Fengari](https://fengari.io/)
- [lua](./lua.html.md) in LiveCodes
- [Common Lisp](./commonlisp.html.md) in LiveCodes
---
# Flow
TODO...
---
# Gleam
import LiveCodes from '../../src/components/LiveCodes.tsx';
[Gleam](https://gleam.run) is a friendly language for building type-safe systems that scale!
Gleam is a statically-typed functional programming language, which compiles to Erlang or JavaScript.
## Usage
LiveCodes compiles Gleam code to JavaScript using the WebAssembly (wasm) version of the [official Gleam compiler](https://github.com/gleam-lang/gleam). The compiled JavaScript code is then executed in the context of the [result page](../features/result.html.md).
The compiled JavaScript code can be inspected in the [Compiled Code Viewer](../features/compiled-code.html.md) in the [Tools Pane](../features/tools-pane.html.md) (below the result page). Console output is shown in the [integrated console](../features/console.html.md).
Please note that the compiler messages (e.g. errors and warnings) are shown in the browser console (not the integrated console).
### Standard Library
[Gleam's standard library](https://hexdocs.pm/gleam_stdlib/) in addition to the following packages are available for use and can be imported as usual with no additional configuration:
- [gleam/crypto](https://hexdocs.pm/gleam_crypto/)
- [gleam/erlang](https://hexdocs.pm/gleam_erlang/)
- [gleam/fetch](https://hexdocs.pm/gleam_fetch/)
- [gleam/http](https://hexdocs.pm/gleam_http/)
- [gleam/javascript](https://hexdocs.pm/gleam_javascript/)
- [gleam/json](https://hexdocs.pm/gleam_json/)
- [gleam/otp](https://hexdocs.pm/gleam_otp/)
Demo:
export const stdlibConfig = {
activeEditor: 'script',
script: {
language: 'gleam',
content: `import gleam/io\nimport gleam/string\n\npub fn main() {\n "hello world!"\n |> string.uppercase\n |> io.println\n}`,
},
tools: { status: 'open' },
};
### Custom Modules
Custom modules can be used in Gleam code. These modules have to be precompiled (to JavaScript) by the Gleam compiler. URLs to the compiled JavaScript code and either the Gleam source code or URLs to the Gleam source code are needed to be able to import custom modules.
This is an example for a repo with precompiled Gleam modules:
https://github.com/live-codes/gleam-precompiled
Please refer to [Gleam CLI docs](https://gleam.run/writing-gleam/command-line-reference/) for details about adding and building packages.
Note that the built code was committed to the repo by clearing out `.gitignore` file.
The built code can then by accessed from a [CDN that mirrors GitHub](https://www.jsdelivr.com/?docs=gh), like this:
`https://cdn.jsdelivr.net/gh/live-codes/gleam-precompiled@main/...`
Built modules can then be declared in [custom settings](../advanced/custom-settings.html.md) (Project menu → Custom Settings), under the `gleam` property, by adding a `modules` property.
The `modules` property is an object that has the module name as the key. The value is an object with the following properties:
- `srcUrl`: the URL to the Gleam source code of the module.
- `src`: optionally use this instead of `srcUrl` to specify the Gleam source code of the module.
- `compiledUrl`: the URL to the compiled JavaScript code of the module.
Example:
```json title="Custom Settings"
{
"gleam": {
"modules": {
"plinth/browser/document": {
"srcUrl": "https://cdn.jsdelivr.net/gh/live-codes/gleam-precompiled@v0.3.0/build/packages/plinth/src/plinth/browser/document.gleam",
"compiledUrl": "https://cdn.jsdelivr.net/gh/live-codes/gleam-precompiled@v0.3.0/build/dev/javascript/plinth/plinth/browser/document.mjs"
}
}
}
}
```
See the [demo below](#example-usage) ([open in LiveCodes](https://livecodes.io/?template=gleam)).
If `compiledUrl` property is not specified, the JavaScript module is imported from this URL pattern: `{module_name}.mjs` (example: `plinth/browser/document.mjs`).
This can then be [mapped (using import maps)](../features/module-resolution.html.md)#custom-module-resolution) in [custom settings](../advanced/custom-settings.html.md) (Project menu → Custom Settings) to the full URL of the compiled JavaScript code.
Example:
```json title="Custom Settings"
{
"gleam": {
"modules": {
"some_pkg/some_module": {
"srcUrl": "https://example.com/packages/some_pkg/some_module.gleam"
},
"another_pkg/another_module": {
"srcUrl": "https://example.com/packages/another_pkg/another_module.gleam"
}
}
},
"imports": {
// map a specific module
"some_pkg/some_module.mjs": "https://example.com/compiled/some_pkg/some_module.mjs",
// or map a whole directory
"another_pkg/": "https://example.com/compiled/another_pkg/"
}
}
```
### Externals
[External functions](https://tour.gleam.run/advanced-features/externals/) written in JavaScript can also be used. An external function has the `@external` attribute on it. It needs to specify a "relative" URL specifying the location of the external code. This URL is [mapped (using import maps)](../features/module-resolution.html.md)#custom-module-resolution) in [custom settings](../advanced/custom-settings.html.md) (Project menu → Custom Settings) to the full URL of the script that contains the code.
**Example:**
The following script is hosted on this URL:
https://cdn.jsdelivr.net/gh/live-codes/gleam-precompiled@v0.3.0/demo/greet.js
```js title="greet.js"
export const hello = (str) => `Hello, ${str}!`;
```
Use this in custom settings:
```json title="Custom Settings"
{
"imports": {
"my_pkg/greet.js": "https://cdn.jsdelivr.net/gh/live-codes/gleam-precompiled@v0.3.0/demo/greet.js"
}
}
```
`"my_pkg/greet.js"` can then be used in the `@external` attribute.
```js title="Gleam"
import gleam/io
// highlight-next-line
@external(javascript, "my_pkg/greet.js", "hello")
// highlight-next-line
pub fn hello(str: String) -> String
pub fn main() {
io.println(hello("from JavaScript"))
}
```
Demo:
export const externalsConfig = {
activeEditor: 'script',
script: {
language: 'gleam',
content:
'import gleam/io\n\n@external(javascript, "my_pkg/greet.js", "hello")\npub fn hello(str: String) -> String\n\npub fn main() {\n io.println(hello("from JavaScript"))\n}',
},
tools: { status: 'open' },
customSettings: {
imports: {
'my_pkg/greet.js':
'https://cdn.jsdelivr.net/gh/live-codes/gleam-precompiled@v0.3.0/demo/greet.js',
},
},
};
:::tip
[Data URLs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs) can be used to avoid having to host the external code online. LiveCodes enables [creating data URLs](../features/data-urls.html.md) easily.
Example:
The import map in the previous example can be rewritten like this:
```json title="Custom Settings"
{
"imports": {
"my_pkg/greet.js": "data:text/javascript;charset=UTF-8;base64,ZXhwb3J0IGNvbnN0IGhlbGxvID0gKHN0cikgPT4gYEhlbGxvLCAke3N0cn0hYDs="
}
}
```
:::
### NPM Modules
Modules published to [npm](https://www.npmjs.com/), [deno.land/x](https://deno.land/x) and [jsr.io](https://jsr.io/) can be imported as external functions. There is no need to specify import maps. The package/module name is prefixed with a modifier to specify the source (e.g. `npm:uuid` to import the [`uuid`](https://www.npmjs.com/package/uuid) npm module).
See list of supported CDNs and the respective modifiers in the section about [module resolution](../features/module-resolution.html.md)#cdn-providers).
Example:
```js
import gleam/io
// npm module (https://www.npmjs.com/package/uuid)
@external(javascript, "npm:uuid", "v4")
pub fn uuid() -> String
// jsr module (https://jsr.io/@kwhinnery/yassify)
@external(javascript, "jsr:@kwhinnery/yassify", "yassify")
pub fn yassify(str: String) -> String
pub fn main() {
io.println(uuid())
io.println(yassify("Hello, World!"))
}
```
Demo:
export const npmConfig = {
activeEditor: 'script',
script: {
language: 'gleam',
content:
'import gleam/io\n\n// npm module (https://www.npmjs.com/package/uuid)\n@external(javascript, "npm:uuid", "v4")\npub fn uuid() -> String\n\n// jsr module (https://jsr.io/@kwhinnery/yassify)\n@external(javascript, "jsr:@kwhinnery/yassify", "yassify")\npub fn yassify(str: String) -> String\n\npub fn main() {\n io.println(uuid())\n io.println(yassify("Hello, World!"))\n}\n',
},
tools: { status: 'open' },
};
### Example Usage
This is the Gleam starter template demonstrating the use of standard library, custom modules, external functions and npm modules.
## Language Info
### Name
`gleam`
### Extension
`.gleam`
### Editor
`script`
## Compiler
The wasm version of the [official Gleam compiler](https://github.com/gleam-lang/gleam).
### Version
`v1.3.0-rc1`
## Starter Template
https://livecodes.io/?template=gleam
## Links
- [Gleam](https://gleam.run)
- [Gleam documentation](https://gleam.run/documentation/)
- [Gleam language tour](https://tour.gleam.run/)
---
# Go (Golang)
TODO...
---
# Haml
[Haml](https://haml.info/) compiler for client side javascript view templates using [clientside-haml-js](https://github.com/uglyog/clientside-haml-js).
## Usage
There are 2 modes for rendering:
### Pre-rendered (Default)
The values of the expressions are evaluated and added to the template during compilation of the [result page](../features/result.html.md).
The values of all expressions should be supplied in advance using [custom settings](../advanced/custom-settings.html.md) to the property `template.data` which accepts an object of key-value pairs.
Example: This provides the value of the expression `name`
```json title="Custom Settings"
{
"template": {
"data": {
"name": "LiveCodes"
}
}
}
```
[Full example below](#pre-rendered)
### Dynamic
To use this mode, the property `template.prerender` in [custom settings](../advanced/custom-settings.html.md) should be set to `false`.
Example:
```json title="Custom Settings"
{
"template": {
"prerender": false
}
}
```
In this mode, in addition to values supplied in custom settings (see above), expressions can have values that are evaluated during the [result page](../features/result.html.md) runtime.
This can be achieved in JavaScript (or any [language](../languages/index.html.md) that compiles to it) by assigning `window.livecodes.templateData` to an object with the data.
Please note that template rendering occurs on [page load](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event), so the assignment must occur before that.
Example:
```js title="Script Editor (JS)"
window.livecodes.templateData = { name: 'LiveCodes' };
```
[Full example below](#dynamic-1)
## Language Info
### Name
`haml`
### Extension
`.haml`
### Editor
`markup`
## Compiler
[clientside-haml-js](https://github.com/uglyog/clientside-haml-js).
### Version
`clientside-haml-js`: v5.4
## Code Formatting
Not supported.
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `haml` are passed as a JSON object to the [`haml.compileHaml`](https://github.com/uglyog/clientside-haml-js#client-side-haml-api) method during compile. Please check the [documentation](https://github.com/uglyog/clientside-haml-js#client-side-haml-api) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
### Pre-rendered
export const config = {
markup: { language: 'haml', content: '%p Hello, #{name}!' },
customSettings: { template: { data: { name: 'LiveCodes' } } },
};
export const params = { compiled: 'open' };
### Dynamic
export const config2 = {
markup: { language: 'haml', content: '%p Hello, #{name}!' },
script: {
language: 'javascript',
content: 'window.livecodes.templateData = { name: "LiveCodes" };',
},
customSettings: { template: { prerender: false } },
activeEditor: 'script',
};
## Links
- [Haml](https://haml.info/)
- [clientside-haml-js](https://github.com/uglyog/clientside-haml-js)
---
# Handlebars
[Handlebars](https://handlebarsjs.com/): Minimal templating on steroids.
## Usage
There are 2 modes for rendering:
### Pre-rendered (Default)
The values of the expressions are evaluated and added to the template during compilation of the [result page](../features/result.html.md).
The values of all expressions should be supplied in advance using [custom settings](../advanced/custom-settings.html.md) to the property `template.data` which accepts an object of key-value pairs.
Example: This provides the value of the expression `name`
```json title="Custom Settings"
{
"template": {
"data": {
"name": "LiveCodes"
}
}
}
```
[Full example below](#pre-rendered)
### Dynamic
To use this mode, the property `template.prerender` in [custom settings](../advanced/custom-settings.html.md) should be set to `false`.
Example:
```json title="Custom Settings"
{
"template": {
"prerender": false
}
}
```
In this mode, in addition to values supplied in custom settings (see above), expressions can have values that are evaluated during the [result page](../features/result.html.md) runtime.
This can be achieved in JavaScript (or any [language](../languages/index.html.md) that compiles to it) by assigning `window.livecodes.templateData` to an object with the data.
Please note that template rendering occurs on [page load](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event), so the assignment must occur before that.
Example:
```js title="Script Editor (JS)"
window.livecodes.templateData = { name: 'LiveCodes' };
```
[Full example below](#dynamic-1)
## Language Info
### Name
`handlebars`
### Extensions
`.hbs`, `.handlebars`
### Editor
`markup`
## Compiler
The official [handlebars compiler](https://www.npmjs.com/package/handlebars).
### Version
`handlebars`: v4.7.8
## Code Formatting
Using [Prettier](https://prettier.io/).
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `handlebars` are passed as a JSON object to the [`compile`](https://handlebarsjs.com/api-reference/compilation.html#handlebars-compile-template-options) method during compile. Please check the [documentation](https://handlebarsjs.com/api-reference/compilation.html#handlebars-compile-template-options) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
**Example:**
```json title="Custom Settings"
{
"handlebars": {
"preventIndent": true
}
}
```
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
### Pre-rendered
export const config = {
markup: { language: 'handlebars', content: 'Hello {{name}}!' },
customSettings: { template: { data: { name: 'LiveCodes' } } },
};
export const params = { compiled: 'open' };
### Dynamic
export const config2 = {
markup: { language: 'handlebars', content: 'Hello {{name}}!' },
script: {
language: 'javascript',
content: 'window.livecodes.templateData = { name: "LiveCodes" };',
},
customSettings: { template: { prerender: false } },
activeEditor: 'script',
};
## Links
- [Official website](https://handlebarsjs.com/)
- [Language guide](https://handlebarsjs.com/guide/)
---
# HTML
import LiveCodes from '../../src/components/LiveCodes.tsx';
HTML (HyperText Markup Language) is the standard markup language for creating web pages and web applications. It defines the structure and content of web pages.
## Usage
HTML code in the [markup editor](../features/projects.html.md)#markup-editor) is added as is without compilation or processing to the body of the [result page](../features/result.html.md).
There is no need to add a full page structure (e.g. ``, ``, `` tags). This is already handled by LiveCodes.
(See [Result Page Structure](../features/result.html.md)#result-page-structure) for more details.)
If you need to add content to the `` section or `` attributes of the result page, you can add it in the [project info screen](https://livecodes.io/?screen=info).
### Demo
export const htmlOnlyConfig = {
markup: {
language: 'html',
content: `Hello, LiveCodes!
This is a paragraph in HTML.
- Simple
- Structured
- Semantic
`,
},
}
### Styles and JavaScript
Most of the time, you will want to add styles and scripts in the [respective editors](../features/projects.html.md).
However, you can of course still add them in ``, `\n`,
};
### Module Imports
npm modules can be imported as described in the section about [module resolution](../features/module-resolution.html.md), including bare module imports and importing from different CDNs. Stylesheets imported in the `script` block are added as `` tags in the page `head`.
Example:
export const importsDemo = {
svelte: `\n
You clicked {count} times.
`,
};
Module imports can be customized using import maps as described in [module resolution](../features/module-resolution.html.md)#custom-module-resolution) documentations.
### Multiple Components
Svelte is supported in both [markup](../features/projects.html.md)#markup-editor) and [script](../features/projects.html.md)#script-editor) editors.
This allows having a component in the markup editor that imports (and passes props to) a component in the script editor. The opposite is not supported.
This can be done using relative import of a file name in the same directory. Any file name will resolve to the component in the script editor,
e.g. `./script.svelte`, `./Component.svelte`, `./Counter.svelte`, etc.
export const multi = {
markup: {
language: 'svelte',
content: `
`,
},
script: {
language: 'svelte',
content: `
{count}
`,
},
style: {
language: 'css',
content: '@import "tailwindcss";\n',
},
processors: ['tailwindcss'],
}
Please note that LiveCodes [does not have the concept of a file system](../features/projects.html.md). However, you can configure [editor options](../configuration/configuration-object.html.md)#markup) like `title`, `order` and `hideTitle` to simulate multiple files, change editor order or even hide editors.
Example:
export const multiFiles = {
...multi,
markup: {
...multi.markup,
title: 'App.svelte',
},
script: {
...multi.script,
title: 'Counter.svelte',
},
style: {
...multi.style,
title: 'styles.css',
order: 3,
},
};
When both markup and script editors use Svelte, the component in the markup editor is used as the main component rendered in the [root element](#root-element).
To render the component in the script editor, it has to be imported and used by the main component.
### Importing External Components
External Svelte components can be imported. The import URL has to be an absolute URL ending with `.svelte` extension. Any bare or relative imports in the imported files are resolved and compiled recursively.
Example:
```html
```
### Root Element
To mount the application instance to a specific DOM element use `"livecodes-app"` as the element `id` in the HTML. Otherwise, if that element is not found, a new `div` element is added to `document.body` and is used to mount the instance.
Example:
export const customRoot = {
markup: {
language: 'html',
content: `Custom Root Element
...other page content
`,
},
script: {
language: 'svelte',
content: `\n
I'm a {name} component
`,
},
};
## Language Info
### Name
`svelte`
### Extensions
`.svelte`
### Editor
`script`, `markup`
## Compiler
The official [Svelte compiler](https://svelte.dev/docs/svelte/svelte-compiler).
### Version
`svelte`: v5.12.0
## Code Formatting
Using [Prettier](https://prettier.io/).
## Starter Template
https://livecodes.io/?template=svelte
## Links
- [Svelte](https://svelte.dev/)
- [Svelte documentations](https://svelte.dev/docs/svelte/overview)
---
# Tailwind CSS
TODO...
---
# Tcl
TODO...
---
# Teal
Teal is a typed dialect of [Lua](https://www.lua.org/).
Teal code is compiled to Lua, which then runs in the browser using [Fengari](https://fengari.io/). See documentation for Lua language support in LiveCodes [here](./lua.html.md).
## Usage
JavaScript interoperability and DOM access is achieved using [`"js"` module](https://github.com/fengari-lua/fengari-interop).
import LiveCodes from '../../src/components/LiveCodes.tsx';
This example demonstrates usage, JavaScript interoperability and DOM access:
## Language Info
### Name
`teal`
### Extension
`.tl`
### Editor
`script`
## Compiler
[Teal](https://github.com/teal-language/tl)
### Version
Teal v0.15.2
## Code Formatting
Using [`lua-fmt`](https://github.com/trixnz/lua-fmt).
## Starter Template
https://livecodes.io/?template=teal
## Links
- [Teal](https://github.com/teal-language/tl)
- [Teal documentation](https://github.com/teal-language/tl/tree/master/docs)
- [Teal tutorial](https://github.com/teal-language/tl/blob/master/docs/tutorial.html.md)
- [Lua](https://www.lua.org/)
- [Lua documentation](https://www.lua.org/docs.html)
- [Fengari](https://fengari.io/)
- [lua](./lua.html.md) in LiveCodes
- [lua-wasm](./lua-wasm.html.md) in LiveCodes
---
# Token CSS
TODO...
---
# TSX
TSX is a syntax that allows using TypeScript in JSX.
[JSX](https://react.dev/learn/writing-markup-with-jsx) is a syntax extension for JavaScript that allows writing HTML-like markup inside JavaScript.
It has been popularized by [React](https://react.dev/), and then adopted by many other libraries/frameworks.
By default, when running JSX/TSX in LiveCodes, [React](https://react.dev/) runtime is used.
However, other libraries like [Preact](https://preactjs.com/), [nano JSX](https://nanojsx.io/) and others can be used as well (see [Custom JSX Runtimes](./jsx.html.md)#custom-jsx-runtimes)).
Please note that [React compiler](https://react.dev/learn/react-compiler) is also available in LiveCodes and is [documented here](./react.html.md).
## Usage
For usage and examples, see documentation for [JSX](./jsx.html.md) and [TypeScript](./typescript.html.md) support in LiveCodes.
## Language Info
### Name
`tsx`
### Extension
`.tsx`
### Editor
`script`
## Compiler
[TypeScript compiler](./typescript.html.md)
## Code Formatting
Using [Prettier](https://prettier.io/).
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `tsx` are passed to the TypeScript compiler as [compiler options](https://www.typescriptlang.org/tsconfig#compilerOptions) while compiling TSX.
In addition, the option `disableAutoRender` can be set to `true` to disable [auto-rendering](./jsx#auto-rendering).
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
**Example:**
```json title="Custom Settings"
{
"tsx": {
"disableAutoRender": true,
"jsxFactory": "h",
"jsxFragmentFactory": "Fragment"
}
}
```
## Links
- [React](https://react.dev/)
- [JSX](https://react.dev/learn/writing-markup-with-jsx)
- [TypeScript](https://www.typescriptlang.org/)
---
# Twig
[Twig.js](https://github.com/twigjs/twig.js/) is a pure JavaScript implementation of the [Twig](https://twig.symfony.com/) PHP templating language.
## Usage
There are 2 modes for rendering:
### Pre-rendered (Default)
The values of the expressions are evaluated and added to the template during compilation of the [result page](../features/result.html.md).
The values of all expressions should be supplied in advance using [custom settings](../advanced/custom-settings.html.md) to the property `template.data` which accepts an object of key-value pairs.
Example: This provides the value of the expression `name`
```json title="Custom Settings"
{
"template": {
"data": {
"name": "LiveCodes"
}
}
}
```
[Full example below](#pre-rendered)
### Dynamic
To use this mode, the property `template.prerender` in [custom settings](../advanced/custom-settings.html.md) should be set to `false`.
Example:
```json title="Custom Settings"
{
"template": {
"prerender": false
}
}
```
In this mode, in addition to values supplied in custom settings (see above), expressions can have values that are evaluated during the [result page](../features/result.html.md) runtime.
This can be achieved in JavaScript (or any [language](../languages/index.html.md) that compiles to it) by assigning `window.livecodes.templateData` to an object with the data.
Please note that template rendering occurs on [page load](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event), so the assignment must occur before that.
Example:
```js title="Script Editor (JS)"
window.livecodes.templateData = { name: 'LiveCodes' };
```
[Full example below](#dynamic-1)
## Language Info
### Name
`twig`
### Extension
`.twig`
### Editor
`markup`
## Compiler
[Twig.js](https://www.npmjs.com/package/twig).
### Version
`twig`: v1.15.4
## Code Formatting
Using [Prettier](https://prettier.io/).
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `twig` are passed as a JSON object to the [`twig`](https://github.com/twigjs/twig.js/wiki#browser-usage) method during compile. Please check the [documentation](https://github.com/twigjs/twig.js/wiki#browser-usage) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
### Pre-rendered
export const config = {
markup: { language: 'twig', content: 'Hello, {{ name }}!' },
customSettings: { template: { data: { name: 'LiveCodes' } } },
};
export const params = { compiled: 'open' };
### Dynamic
export const config2 = {
markup: { language: 'twig', content: 'Hello, {{ name }}!' },
script: {
language: 'javascript',
content: 'window.livecodes.templateData = { name: "LiveCodes" };',
},
customSettings: { template: { prerender: false } },
activeEditor: 'script',
};
## Links
- [Twig](https://twig.symfony.com/)
- [Twig documentation](https://twig.symfony.com/doc/3.x/)
- [Twig.js](https://github.com/twigjs/twig.js/)
- [Twig.js documentation](https://github.com/twigjs/twig.js/wiki)
---
# TypeScript
TODO...
---
# UnoCSS
TODO...
---
# Vento
[Vento](https://vento.js.org/) is a template engine for Deno. It's inspired by other engines, such as [Nunjucks](./nunjucks.html.md), [Liquid](./liquid.html.md), [Eta](./eta.html.md), and [Mustache](./mustache.html.md).
## Usage
There are 2 modes for rendering:
### Pre-rendered (Default)
The values of the expressions are evaluated and added to the template during compilation of the [result page](../features/result.html.md).
The values of all expressions should be supplied in advance using [custom settings](../advanced/custom-settings.html.md) to the property `template.data` which accepts an object of key-value pairs.
Example: This provides the value of the expression `name`
```json title="Custom Settings"
{
"template": {
"data": {
"name": "LiveCodes"
}
}
}
```
[Full example below](#pre-rendered)
### Dynamic
To use this mode, the property `template.prerender` in [custom settings](../advanced/custom-settings.html.md) should be set to `false`.
Example:
```json title="Custom Settings"
{
"template": {
"prerender": false
}
}
```
In this mode, in addition to values supplied in custom settings (see above), expressions can have values that are evaluated during the [result page](../features/result.html.md) runtime.
This can be achieved in JavaScript (or any [language](../languages/index.html.md) that compiles to it) by assigning `window.livecodes.templateData` to an object with the data.
Please note that template rendering occurs on [page load](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event), so the assignment must occur before that.
Example:
```js title="Script Editor (JS)"
window.livecodes.templateData = { name: 'LiveCodes' };
```
[Full example below](#dynamic-1)
## Language Info
### Name
`vento`
### Extension
`.vto`
### Editor
`markup`
## Compiler
[Vento](https://vento.js.org/).
### Version
`ventojs`: v1.12.16
## Code Formatting
Using [Prettier](https://prettier.io/).
## Custom Settings
[Custom settings](../advanced/custom-settings.html.md) added to the property `vento` are passed as a JSON object to the [`vento()`](https://vento.js.org/getting-started/#usage) function during compile. Please check the [documentation](https://vento.js.org/configuration/) for full reference.
Please note that custom settings should be valid JSON (i.e. functions are not allowed).
## Example Usage
import LiveCodes from '../../src/components/LiveCodes.tsx';
### Pre-rendered
export const config = {
markup: { language: 'vento', content: 'Hello, {{ name }}!' },
customSettings: { template: { data: { name: 'LiveCodes' } } },
};
export const params = { compiled: 'open' };
### Dynamic
export const config2 = {
markup: { language: 'vento', content: 'Hello, {{ name }}!' },
script: {
language: 'javascript',
content: 'window.livecodes.templateData = { name: "LiveCodes" };',
},
customSettings: { template: { prerender: false } },
activeEditor: 'script',
};
## Links
- [Vento](https://vento.js.org/)
---
# Vue SFC
[Vue.js](https://vuejs.org/), The Progressive JavaScript Framework, is an approachable, performant and versatile framework for building web user interfaces.
This is the documentation for LiveCodes language support for Vue [Single-File Component (SFC)](https://vuejs.org/api/sfc-spec.html).
The support for Vue 2 SFC (the older, EOL version) is [documented separately](./vue2.html.md).
## Usage
Vue SFC can be used as documented in the [specs](https://vuejs.org/api/sfc-spec.html), including support for [Scoped CSS](https://vuejs.org/api/sfc-css-features.html#scoped-css), [CSS Modules](https://vuejs.org/api/sfc-css-features.html#css-modules), [pre-processors](https://vuejs.org/api/sfc-spec.html#pre-processors), [JSX](https://vuejs.org/guide/extras/render-function.html#jsx-tsx) and [`src` imports](https://vuejs.org/api/sfc-spec.html#src-imports). See below for usage.
### Demo
import LiveCodes from '../../src/components/LiveCodes.tsx';
import RunInLiveCodes from '../../src/components/RunInLiveCodes.tsx';
### Scoped CSS
> When a `\n\n\n hi\n`,
};
### CSS Modules
> A ``,
};
### CSS Frameworks
[CSS Frameworks](../features/css.html.md)#css-processors) supported in LiveCodes (e.g. [Tailwind CSS](./tailwindcss.html.md), [UnoCSS](./unocss.html.md), [WindiCSS](./windicss.html.md)) can detect class names added in Vue SFCs. Make sure that the required utility is enabled (from style editor menu or in `processors` property of [configuration object](../configuration/configuration-object.html.md)#processors)).
See [example below](#multiple-components).
### Languages and Pre-Processors
> Blocks can declare pre-processor languages using the `lang` attribute.
>
> — [docs](https://vuejs.org/api/sfc-spec.html#pre-processors)
Many of the [languages supported in LiveCodes](./index.html.md) can be used. The value of `lang` attribute can be the language name (specified in its documentation page) or any of its aliases (extensions).
export const processorsDemo = {
vue: `\nh1 {{ msg }}\n\n\n\n\n\n`,
};
### JSX
JSX can be used in render functions without needing any configuration.
export const jsxDemo = {
vue: `\n\n`,
};
### `src` Imports
The src attribute can be used to import an external file for a language block:
```html
```
The value of `src` attribute can be either:
- Absolute URL (e.g. `https://unpkg.com/todomvc-app-css/index.css`)
- Path in npm package (e.g. `todomvc-app-css/index.css`)
Relative paths (e.g. `./my-styles.css`) cannot be used (because there is no file system in LiveCodes).
The imported sources can use any of the supported languages/pre-processors (identified by the file extension or can be specified by `lang` attribute).
### Module Imports
npm modules can be imported as described in the section about [module resolution](../features/module-resolution.html.md), including bare module imports and importing from different CDNs. Stylesheets imported in the `script` block are added as `` tags in the page `head`.
Example:
export const importsDemo = {
vue: `\n\n\n \n You clicked {{ count }} times.
\n \n \n\n`,
};
Module imports can be customized using import maps as described in [module resolution](../features/module-resolution.html.md)#custom-module-resolution) documentations.
### Multiple Components
Vue is supported in both [markup](../features/projects.html.md)#markup-editor) and [script](../features/projects.html.md)#script-editor) editors.
This allows having a component in the markup editor that imports (and passes props to) a component in the script editor. The opposite is not supported.
This can be done using relative import of a file name in the same directory. Any file name will resolve to the component in the script editor,
e.g. `./script.vue`, `./Component.vue`, `./Counter.vue`, etc.
export const multi = {
markup: {
language: 'vue',
content: `
`,
},
script: {
language: 'vue',
content: `
{{ count }}
`,
},
style: {
language: 'css',
content: '@import "tailwindcss";\n',
},
processors: ['tailwindcss'],
}
Please note that LiveCodes [does not have the concept of a file system](../features/projects.html.md). However, you can configure [editor options](../configuration/configuration-object.html.md)#markup) like `title`, `order` and `hideTitle` to simulate multiple files, change editor order or even hide editors.
Example:
export const multiFiles = {
...multi,
markup: {
...multi.markup,
title: 'App.vue',
},
script: {
...multi.script,
title: 'Counter.vue',
},
style: {
...multi.style,
title: 'styles.css',
order: 3,
},
};
When both markup and script editors use Vue, the component in the markup editor is used as the main component rendered in the [root element](#root-element).
To render the component in the script editor, it has to be imported and used by the main component.
### Importing External SFCs
External Vue SFCs can be imported. The import URL has to be an absolute URL ending with `.vue` extension. Any bare or relative imports in the imported files are resolved and compiled recursively.
This is an example of importing a Vue SFC, which in turn imports other Vue SFCs (the imported components use Tailwind CSS, which is enabled in this project as a CSS preprocessor):
export const importExternal = {
activeEditor: 'script',
script: {
language: 'vue',
content: `
`
},
style: {
language: 'css',
content: '@import "tailwindcss";\n',
},
processors: ['tailwindcss'],
}
{
' - '
}
<>view source on GitHub>
Please note that extensionless imports are not supported. However, you may customize the import URL using import maps as described in [module resolution](../features/module-resolution.html.md)#custom-module-resolution) section.
Example:
```json title="Custom Settings"
{
"imports": {
"https://raw.githubusercontent.com/hatemhosny/vue3-samples/master/src/composable/useTodoList": "https://raw.githubusercontent.com/hatemhosny/vue3-samples/master/src/composable/useTodoList.js",
"https://raw.githubusercontent.com/hatemhosny/vue3-samples/master/src/composable/useMousePosition": "https://raw.githubusercontent.com/hatemhosny/vue3-samples/master/src/composable/useMousePosition.js"
}
}
```
export const importExternalWithImportMap = {
activeEditor: 'script',
script: {
language: 'vue',
content: `
`,
},
imports: {
"https://raw.githubusercontent.com/hatemhosny/vue3-samples/master/src/composable/useTodoList": "https://raw.githubusercontent.com/hatemhosny/vue3-samples/master/src/composable/useTodoList.js",
"https://raw.githubusercontent.com/hatemhosny/vue3-samples/master/src/composable/useMousePosition": "https://raw.githubusercontent.com/hatemhosny/vue3-samples/master/src/composable/useMousePosition.js"
}
};
{' '}
{' - '}
<>view source on GitHub>
### Importing Data URLs
You may want to import other SFCs without having to host them on a server.
These components can be encoded as [data URLs](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data) and imported as usual.
The data URL has to start with `data:text/vue` to be recognized as a Vue SFC. Any imports in the imported URLs (even if they are also data URLs) are resolved and compiled recursively.
:::info
The code in any code editor can be encoded as data URL from the LiveCodes UI using the "Copy code as data URL" button below the code editor.
:::
This is the previous demo that uses data URLs (with nested imports) instead of external URLs:
export const importDataUrls = {
activeEditor: 'script',
script: {
language: 'vue',
content: `
`
},
style: {
language: 'css',
content: '@import "tailwindcss";\n',
},
processors: ['tailwindcss'],
}
In the above demo, this component is imported:
```
data:text/vue;charset=UTF-8;base64,PHNjcmlwdCBzZXR1cCBsYW5nPSJ0cyI+DQppbXBvcnQgeyByZWYgfSBmcm9tICJ2dWUiOw0KaW1wb3J0IFByaW1hcnlCdXR0b24gZnJvbSAiZGF0YTp0ZXh0L3Z1ZTtjaGFyc2V0PVVURi04O2Jhc2U2NCxQSE5qY21sd2RDQnpaWFIxY0NCc1lXNW5QU0owY3lJK0RRcGtaV1pwYm1WUWNtOXdjeWg3RFFvZ0lIUnBkR3hsT2lCN0RRb2dJQ0FnZEhsd1pUb2dVM1J5YVc1bkxBMEtJQ0FnSUdSbFptRjFiSFE2SUNKQ2RYUjBiMjRpTEEwS0lDQjlMQTBLZlNrN0RRbzhMM05qY21sd2RENE5DZzBLUEhSbGJYQnNZWFJsUGcwS0lDQThZblYwZEc5dURRb2dJQ0FnWTJ4aGMzTTlJblJsZUhRdGJXUWdabTl1ZEMxdFpXUnBkVzBnWW1jdFozSmhlUzAxTURBZ2FHOTJaWEk2WW1jdFozSmhlUzAyTURBZ2RISmhibk5wZEdsdmJpQndlUzB4SUhCNExUUWdkR1Y0ZEMxM2FHbDBaU0J5YjNWdVpHVmtJR1J5YjNBdGMyaGhaRzkzTFhoc0lnMEtJQ0ErRFFvZ0lDQWdlM3NnZEdsMGJHVWdmWDBOQ2lBZ1BDOWlkWFIwYjI0K0RRbzhMM1JsYlhCc1lYUmxQZz09IjsNCmltcG9ydCBEYW5nZXJCdXR0b24gZnJvbSAiZGF0YTp0ZXh0L3Z1ZTtjaGFyc2V0PVVURi04O2Jhc2U2NCxQSE5qY21sd2RDQnpaWFIxY0NCc1lXNW5QU0owY3lJK0RRcGtaV1pwYm1WUWNtOXdjeWg3RFFvZ0lIUnBkR3hsT2lCN0RRb2dJQ0FnZEhsd1pUb2dVM1J5YVc1bkxBMEtJQ0FnSUdSbFptRjFiSFE2SUNKQ2RYUjBiMjRpTEEwS0lDQjlMQTBLZlNrN0RRbzhMM05qY21sd2RENE5DZzBLUEhSbGJYQnNZWFJsUGcwS0lDQThZblYwZEc5dURRb2dJQ0FnWTJ4aGMzTTlJblJsZUhRdGJXUWdabTl1ZEMxdFpXUnBkVzBnWW1jdGNtVmtMVFV3TUNCb2IzWmxjanBpWnkxeVpXUXROakF3SUhSeVlXNXphWFJwYjI0Z2NIa3RNU0J3ZUMwMElIUmxlSFF0ZDJocGRHVWdjbTkxYm1SbFpDQmtjbTl3TFhOb1lXUnZkeTE0YkNJTkNpQWdQZzBLSUNBZ0lIdDdJSFJwZEd4bElIMTlEUW9nSUR3dlluVjBkRzl1UGcwS1BDOTBaVzF3YkdGMFpUND0iOw0KDQpjb25zdCBjb3VudCA9IHJlZigwKTsNCjwvc2NyaXB0Pg0KDQo8dGVtcGxhdGU+DQogIDxkaXYgY2xhc3M9InctZnVsbCBtdC04IGZsZXgganVzdGlmeS1jZW50ZXIiPg0KICAgIDxzcGFuIHJlZj0iY291bnRlciIgY2xhc3M9InRleHQtM3hsIGZvbnQtYm9sZCI+e3sgY291bnQgfX08L3NwYW4+DQogIDwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJ3LWZ1bGwgbXQtNCBmbGV4IGZsZXgtcm93IHNwYWNlLXgtNCBqdXN0aWZ5LWNlbnRlciI+DQogICAgPHByaW1hcnktYnV0dG9uIHJlZj0iZGVjcmVtZW50QnV0dG9uIiB0aXRsZT0iLSIgQGNsaWNrPSJjb3VudC0tIiAvPg0KICAgIDxwcmltYXJ5LWJ1dHRvbiByZWY9ImluY3JlbWVudEJ1dHRvbiIgdGl0bGU9IisiIEBjbGljaz0iY291bnQrKyIgLz4NCiAgPC9kaXY+DQogIDxkaXYgY2xhc3M9InctZnVsbCBtdC00IGZsZXggZmxleC1yb3cgc3BhY2UteC00IGp1c3RpZnktY2VudGVyIj4NCiAgICA8ZGFuZ2VyLWJ1dHRvbiByZWY9InJlc2V0QnV0dG9uIiB0aXRsZT0iUmVzZXQiIEBjbGljaz0iY291bnQgPSAwIiAvPg0KICA8L2Rpdj4NCjwvdGVtcGxhdGU+
```
which imports these:
```
data:text/vue;charset=UTF-8;base64,PHNjcmlwdCBzZXR1cCBsYW5nPSJ0cyI+DQpkZWZpbmVQcm9wcyh7DQogIHRpdGxlOiB7DQogICAgdHlwZTogU3RyaW5nLA0KICAgIGRlZmF1bHQ6ICJCdXR0b24iLA0KICB9LA0KfSk7DQo8L3NjcmlwdD4NCg0KPHRlbXBsYXRlPg0KICA8YnV0dG9uDQogICAgY2xhc3M9InRleHQtbWQgZm9udC1tZWRpdW0gYmctZ3JheS01MDAgaG92ZXI6YmctZ3JheS02MDAgdHJhbnNpdGlvbiBweS0xIHB4LTQgdGV4dC13aGl0ZSByb3VuZGVkIGRyb3Atc2hhZG93LXhsIg0KICA+DQogICAge3sgdGl0bGUgfX0NCiAgPC9idXR0b24+DQo8L3RlbXBsYXRlPg==
```
```
data:text/vue;charset=UTF-8;base64,PHNjcmlwdCBzZXR1cCBsYW5nPSJ0cyI+DQpkZWZpbmVQcm9wcyh7DQogIHRpdGxlOiB7DQogICAgdHlwZTogU3RyaW5nLA0KICAgIGRlZmF1bHQ6ICJCdXR0b24iLA0KICB9LA0KfSk7DQo8L3NjcmlwdD4NCg0KPHRlbXBsYXRlPg0KICA8YnV0dG9uDQogICAgY2xhc3M9InRleHQtbWQgZm9udC1tZWRpdW0gYmctcmVkLTUwMCBob3ZlcjpiZy1yZWQtNjAwIHRyYW5zaXRpb24gcHktMSBweC00IHRleHQtd2hpdGUgcm91bmRlZCBkcm9wLXNoYWRvdy14bCINCiAgPg0KICAgIHt7IHRpdGxlIH19DQogIDwvYnV0dG9uPg0KPC90ZW1wbGF0ZT4=
```
### Root Element
To [mount](https://vuejs.org/api/application.html#app-mount) the application instance to a specific DOM element use `"livecodes-app"` as the element `id` in the HTML. Otherwise, if that element is not found, a new `div` element is added to `document.body` and is used to mount the instance.
Example:
export const customRoot = {
markup: {
language: 'html',
content: `Custom Root Element
...other page content
`,
},
script: {
language: 'vue',
content: `I'm a Vue SFC`,
},
};
## Language Info
### Name
`vue`
### Extensions
`.vue`, `.vue3`
### Editor
`script`, `markup`
## Compiler
The official [@vue/compiler-sfc](https://github.com/vuejs/core/tree/main/packages/compiler-sfc).
### Version
`@vue/compiler-sfc`: v3.5.13
## Code Formatting
Using [Prettier](https://prettier.io/).
## Limitations
Currently, Vue support has the following limitations:
- SSR is not supported.
- The [`defineProps()`](https://vuejs.org/guide/components/props#props-declaration) macro cannot infer props from TypeScript types not defined in the same file.
[PRs are welcome](https://github.com/live-codes/livecodes/issues/757).
## Starter Template
https://livecodes.io/?template=vue
## Links
- [Vue.js](https://vuejs.org/)
- [Vue SFC specs](https://vuejs.org/api/sfc-spec.html)
- [CSS Modules](https://github.com/css-modules/css-modules)
---
# Vue 2 SFC
[Vue.js](https://vuejs.org/), The Progressive JavaScript Framework, is an approachable, performant and versatile framework for building web user interfaces.
This is the documentation for LiveCodes language support for the older **Vue 2** [Single-File Component (SFC)](https://v2.vuejs.org/v2/guide/single-file-components.html). For the latest Vue SFC head to [Vue 3 SFC documentations](./vue.html.md).
:::caution
Please note that, officially, Vue 2 has reached [End of Life (EOL)](https://v2.vuejs.org/eol/) on December 31st, 2023.
:::
## Important Note
Vue 2 SFC language support in LiveCodes is different from that for Vue 3.
Unlike Vue 3, which uses the official SFC compiler ([@vue/compiler-sfc](https://github.com/vuejs/core/tree/main/packages/compiler-sfc)) to compile SFC to regular JavaScript which is then sent to the result page, Vue 2 SFC support uses [vue3-sfc-loader](https://github.com/FranckFreiburger/vue3-sfc-loader), which is loaded in the result page and the SFC is compiled on the fly in the end user's browser. This has a significant performance impact.
[vue3-sfc-loader](https://github.com/FranckFreiburger/vue3-sfc-loader) is currently at version 0.8.4, which is compatible with Vue 2 version 2.6.14.
Vue 2.7 is not supported.
## Usage
Vue 2 SFC support includes Scoped CSS, pre-processors, JSX and `src` imports.
## Language Info
### Name
`vue2`
### Extensions
`.vue2`
### Editor
`script`
## Compiler
[vue3-sfc-loader](https://github.com/FranckFreiburger/vue3-sfc-loader).
### Version
`vue3-sfc-loader`: v0.9.5, which is compatible with Vue v2.6.14
## Code Formatting
Using [Prettier](https://prettier.io/).
## Links
- [Vue 2 docs](https://v2.vuejs.org/)
- [Vue 2 SFC](https://v2.vuejs.org/v2/guide/single-file-components.html)
---
# WebAssembly Text
TODO...
---
# Windi CSS
TODO...
---
# Bookmarklet
LiveCodes allows [importing code](./features/import.html.md) from a [wide variety of sources](./features/import.html.md)#sources).
Instead of manually copy/pasting URLs to import, adding **"Edit in LiveCodes"** bookmarklet to the browser bookmarks bar can be a more convenient way. It opens LiveCodes in a new window and imports the current webpage URL.
## Add Bookmarklet
Drag this link to the browser bookmarks bar:
Edit in LiveCodes`,
}}
/>
or manually create a new bookmark in your browser and add this code as its URL:
```js
javascript:(()=>{window.open("https://livecodes.io/?x="+encodeURIComponent(location.href),"_blank");})();
```
## Example Usage
After adding the bookmarklet to your browser (see above), open this GitHub directory:
https://github.com/bradtraversy/50projects50days/tree/master/expanding-cards
Then click on the bookmarklet.
LiveCodes playground should open in a new window and [import](./features/import.html.md) the directory files (each file in the appropriate editor). It just works!
---
# GitHub Action ⚡
The [Preview in LiveCodes](https://github.com/live-codes/preview-in-livecodes) GitHub Action generates preview links to playgrounds for code changes in pull requests and posts them as pull request comments.
Once added to a repo, it runs when a pull request is created or updated. The new code is optionally built. The action posts in a pull request comment links to playgrounds that can use the new code.
**Screenshot:**

For usage and more information, see the [action docs](https://github.com/live-codes/preview-in-livecodes) on GitHub. Also check the [example repo](https://github.com/hatemhosny/preview-in-livecodes-demo) for a working demo.
---
# Markdown to LiveCodes
Markdown and MDX code blocks can be easily converted to interactive LiveCodes playgrounds.
The playgrounds can run any of the supported [languages](./languages/index.html.md) in LiveCodes, and can be customized to any of the [configuration options](./configuration/index.html.md).
A fenced code block in Markdown can be rendered as a LiveCodes playground by adding the `livecodes` parameter to the code block language meta.
This is provided as [plugins](#packages) for [markdown-it](https://github.com/markdown-it/markdown-it), [marked](https://github.com/markedjs/marked) and [remark](https://github.com/remarkjs/remark).
These plugins allow the seamless integration with most of the popular frameworks like Astro, Docusaurus, Next.js, Storybook, VitePress, etc. See the section "[Using with Frameworks](#using-with-frameworks)" for getting started.
## Demo
This is an example code block:
````md
```jsx
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
You clicked {count} times.
);
}
export default App;
```
````
The above code block is normally rendered like this:
```jsx
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
You clicked {count} times.
);
}
export default App;
```
The code block can instead be rendered as an interactive playground by adding the `livecodes` parameter to the code block language meta:
````md {1}
```jsx livecodes
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
You clicked {count} times.
);
}
export default App;
```
````
to be displayed like this:
```jsx livecodes
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
You clicked {count} times.
);
}
export default App;
```
The playground can be customized by setting [options](#options) that are applied to all code blocks or by [meta parameters](#meta-parameters) that are applied to individual code blocks.
Alternatively, the code block can be kept as it is, and a button or a link (**Edit in LiveCodes**) is appended, below the code block, that opens the code in a LiveCodes playground.
This is achieved by adding the `render=button` or `render=link` parameter to the code block language meta.
This displays a button:
````md {1}
```jsx livecodes render=button
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
You clicked {count} times.
);
}
export default App;
```
````
```jsx livecodes render=button
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
You clicked {count} times.
);
}
export default App;
```
While this displays a link:
````md {1}
```jsx livecodes render=link
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
You clicked {count} times.
);
}
export default App;
```
````
```jsx livecodes render=link
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
You clicked {count} times.
);
}
export default App;
```
## Packages
All the functionality described here can be achieved using *any* of the following packages:
- [`markdown-it-livecodes`](https://www.npmjs.com/package/markdown-it-livecodes): A [markdown-it](https://github.com/markdown-it/markdown-it) plugin.
- [`marked-livecodes`](https://www.npmjs.com/package/marked-livecodes): A [marked](https://github.com/markedjs/marked) plugin.
- [`remark-livecodes`](https://www.npmjs.com/package/remark-livecodes): A [remark](https://github.com/remarkjs/remark) plugin.
- [`gatsby-remark-livecodes`](https://www.npmjs.com/package/gatsby-remark-livecodes): A [gatsby](https://github.com/gatsbyjs/gatsby) plugin.
See the section "[Using with Frameworks](#using-with-frameworks)" for using the plugins with popular frameworks like Astro, Docusaurus, Next.js, Storybook, VitePress, etc.
## Usage
### markdown-it-livecodes
To use the `markdown-it-livecodes` plugin, first install it:
```bash
npm install markdown-it markdown-it-livecodes
```
Then it can be used like this:
````js
import markdownIt from "markdown-it";
import markdownItLivecodes from "markdown-it-livecodes";
const input = "```js livecodes \nconsole.log('Hello World!');\n```";
const output = markdownIt()
.use(markdownItLivecodes, {
/* options */
})
.render(input);
console.log(output); //
````
### marked-livecodes
To use the `marked-livecodes` plugin, first install it:
```bash
npm install marked marked-livecodes
```
Then it can be used like this:
````js
import marked from "marked";
import markedLivecodes from "marked-livecodes";
const input = "```js livecodes \nconsole.log('Hello World!');\n```";
const output = await marked
.use(markedLivecodes, {
/* options */
})
.parse(input);
console.log(output); //
````
### remark-livecodes
To use the `remark-livecodes` plugin, first install it:
```bash
npm install remark remark-livecodes
```
Then it can be used like this:
````js
import { remark } from "remark";
import remarkLivecodes from "remark-livecodes";
const input = "```js livecodes \nconsole.log('Hello World!');\n```";
const output = await remark()
.use(remarkLivecodes, {
/* options */
})
.process(input);
console.log(String(output)); //
````
### gatsby-remark-livecodes
See usage with [Gatsby](#gatsby).
## Options
Options can be passed to the plugins. These options apply to all code blocks.
These options include LiveCodes SDK [embed options](./sdk/js-ts.html.md)#embed-options) (except `headless`).
Example:
````js
const output = await remark()
.use(remarkLivecodes, {
// highlight-start
loading: "click",
params: {
console: "open"
theme: "light",
}
// highlight-end
})
.process(input);
````
In addition, the following options are also available:
- `render`: The render mode for the LiveCodes playgrounds. This can be one of the following:
- `playground` (default): Replaces the code block with an iframe that displays the LiveCodes playground. By default, [`"simple"` mode](./features/display-modes.html.md) is used, but this can be changed in [options](#options) or [meta parameters](#meta-parameters).
- `link`: Keeps the code block as it is, and appends a link (**Edit in LiveCodes**), below the code block, that opens the code in a LiveCodes playground.
- `button`: Keeps the code block as it is, and appends a button (Edit in LiveCodes), below the code block, that opens the code in a LiveCodes playground.
- `meta`: Keeps the code block as it is, and adds the URL of the playground to the `data-livecodes-url` attribute of the `` element. In addition, in `remark-livecodes` the URL is added to the AST (`node.data.livecodesUrl` and `node.data.hProperties.dataLivecodesUrl`). In `markdown-it-livecodes` the URL is added to `env.livecodesUrl`.
This can be used by other plugins (e.g. to display a custom run button overlying the code block).
- `height`: The height of the playground iframe.
- `className`: The class name to be applied to the iframe, link or button.
Note: If the class name of the button contains `"dark"` (e.g. `"dark-btn"`), the dark button will be used.
- `auto`: When set to `true`, it automatically enables the `livecodes` parameter for all code blocks without having to explicitly add it.
This is useful when you have a large number of code blocks and don't want to add the `livecodes` parameter to each code block.
To disable this for a specific code block, add the `livecodes=false` [meta parameter](#meta-parameters) to the code block.
## Meta Parameters
Individual code blocks can be configured using meta parameters. These are key/value pairs, separated by spaces, that are added after the language name.
Meta parameters of code blocks override the [options](#options) passed to the plugin.
Example:
````markdown {1}
```jsx livecodes render=button className=dark-btn console=open
import { useState, useEffect } from "react";
export default () => {
const [count, setCount] = useState(0);
useEffect(() => {
console.log("count:", count);
}, [count]);
return (
You clicked {count} times.
);
};
```
````
All LiveCodes [configuration query parameters](./configuration/query-params.html.md) can be used as code block meta parameters (e.g. ` ```js livecodes console=open theme=light`). See the [LiveCodes configuration docs](./configuration/configuration-object.html.md) for more information.
In addition, the following meta parameters are available:
- `livecodes`: Enables the LiveCodes playground for the code block. This can be omitted if the `auto` option is set to `true`. When `livecodes` is set to `false`, the code block is not handled by the plugin.
- `render`: The render mode. See the [Options](#options) section for more information.
- `height`: The height of the playground iframe.
- `className`: The class name for the playground iframe, link or button.
- `lang`: This overrides the language of the code block (e.g. ` ```jsx livecodes lang=react` or ` ```py livecodes lang=py-wasm`). See the [Languages](./languages/index.html.md) docs for more language information.
## Using with Frameworks
This guide shows how to use the suitable plugin in different frameworks.
### Astro
([demo](https://markdown-to-livecodes-astro.pages.dev/) - [code on GitHub](https://github.com/hatemhosny/markdown-to-livecodes-astro))
This is an example for adding the `remark-livecodes` plugin to `astro.config.mjs` file:
```js title="astro.config.js"
import { defineConfig } from "astro/config";
import mdx from "@astrojs/mdx";
import remarkLivecodes from "remark-livecodes";
export default defineConfig({
// ...
integrations: [mdx()],
markdown: {
remarkPlugins: [
[
remarkLivecodes,
{
/* options */
},
],
],
},
});
```
### Docusaurus
([demo](https://markdown-to-livecodes-docusaurus.pages.dev/) - [code on GitHub](https://github.com/hatemhosny/markdown-to-livecodes-docusaurus))
This is an example for adding the `remark-livecodes` plugin to `docusaurus.config.js` file:
```js title="docusaurus.config.js"
export default {
presets: [
[
'classic',
{
docs: {
// ...
remarkPlugins: [
[require('remark-livecodes'), { /* options */ }],
],
},
},
],
],
// ...
};
```
### Gatsby
([demo](https://markdown-to-livecodes-gatsby.pages.dev/markdown-to-livecodes/) - [code on GitHub](https://github.com/hatemhosny/markdown-to-livecodes-gatsby))
This is an example for adding the `gatsby-remark-livecodes` plugin to `gatsby-config.js` file:
```js title="gatsby-config.js"
module.exports = {
// ...
plugins: [
// ...
{
resolve: 'gatsby-transformer-remark',
options: {
plugins: [
{
resolve: 'gatsby-remark-livecodes',
options: { /* options */ },
},
],
},
},
],
};
```
### Next.js
([demo](https://markdown-to-livecodes-nextjs.pages.dev/mdx-page) - [code on GitHub](https://github.com/hatemhosny/markdown-to-livecodes-nextjs))
See [Next.js docs](https://nextjs.org/docs/app/guides/mdx) for using markdown and MDX in Next.js.
This is an example for adding the `remark-livecodes` plugin to `next.config.js` file:
```js title="next.config.js"
import createMDX from "@next/mdx";
const nextConfig = {
// ...
pageExtensions: ["js", "jsx", "md", "mdx", "ts", "tsx"],
};
const withMDX = createMDX({
options: {
remarkPlugins: [
['remark-livecodes', { /* other options */ }],
],
},
});
export default withMDX(nextConfig);
```
When using Turbopack for local development, check the guide for [using plugins with Turbopack](https://nextjs.org/docs/app/guides/mdx#using-plugins-with-turbopack).
### react-markdown
`react-markdown` is a React component to render markdown.
This is an example for using the `remark-livecodes` plugin with `react-markdown`:
```jsx title="App.jsx" livecodes render=button
import Markdown from 'react-markdown';
import remarkLivecodes from 'remark-livecodes';
const markdown =
'```jsx livecodes\nexport default () => Hello World
\n```';
export default () => (
{markdown}
);
```
### Storybook
([demo](https://markdown-to-livecodes-storybook.pages.dev/) - [code on GitHub](https://github.com/hatemhosny/markdown-to-livecodes-storybook))
This is an example for adding the `remark-livecodes` plugin to `storybook/main.js` file:
```js title="storybook/main.js"
import remarkLivecodes from "remark-livecodes";
export default {
// ...
addons: [
// ...
{
name: "@storybook/addon-docs",
options: {
mdxPluginOptions: {
mdxCompileOptions: {
remarkPlugins: [
[remarkLivecodes, { /* options */ }],
],
},
},
},
},
],
};
```
### VitePress
([demo](https://markdown-to-livecodes-vitepress.pages.dev/) - [code on GitHub](https://github.com/hatemhosny/markdown-to-livecodes-vitepress))
This is an example for adding the `markdown-it-livecodes` plugin to `vitepress.config.js` file:
```js title=".vitepress/config.js"
import { defineConfig } from "vitepress";
import markDownItLivecodes from "markdown-it-livecodes";
export default defineConfig({
// ...
markdown: {
config: (md) => {
md.use(markDownItLivecodes);
},
},
});
```
---
# Contribution
Contributions are always welcome, no matter how large or small. Before contributing,
please read the [code of conduct](https://github.com/live-codes/livecodes/blob/HEAD/CODE_OF_CONDUCT.html.md).
For code contribution, please refer to the [contribution guide](https://github.com/live-codes/livecodes/blob/HEAD/CONTRIBUTING.html.md)
.
For financial and in-kind contributions, please refer to the [sponsor page](./sponsor.html.md).
You can always support the project by [giving feedback](https://github.com/live-codes/livecodes/discussions), [reporting issues, suggesting features](https://github.com/live-codes/livecodes/issues) and spreading the word.
Thank you :)
---
# Credits
## Services
LiveCodes uses services that are generously provided by:
## Third Party Packages
Packages used by LiveCodes and their licenses are [listed here](https://github.com/live-codes/livecodes/blob/develop/vendor-licenses.html.md).
## Prior Art
Many of LiveCodes features/ideas were inspired by:
- [CodePen](https://codepen.io/)
- [JSFiddle](https://jsfiddle.net/)
- [JS Bin](https://jsbin.com/)
- [CodeSandbox](https://codesandbox.io/)
- [Replit](https://replit.com/)
- [VS Code](https://code.visualstudio.com/)
- [Monacode](https://github.com/lukejacksonn/monacode/)
Thank you ❤️
---
# License
LiveCodes is released under the permissive [MIT License](https://github.com/live-codes/livecodes/blob/develop/LICENSE) © [Hatem Hosny](https://github.com/hatemhosny).
Third party packages used in LiveCodes and their licenses are [listed here](https://github.com/live-codes/livecodes/blob/develop/vendor-licenses.html.md).
The source code is available on [GitHub](https://github.com/live-codes/livecodes).
Please consider [sponsoring LiveCodes](./sponsor.html.md) to support its maintenance and continued development.
---
import MailLink from '../src/components/MailLink.tsx';
# Sponsor LiveCodes
Thank you for considering becoming a sponsor of LiveCodes! 💚
LiveCodes is a feature-rich, open source code playground with a wide range of language support. With LiveCodes, learning, prototyping, experimenting, documenting, teaching, and sharing code is easier and more enjoyable than ever.
LiveCodes is free, with no limits for use, no ads and no account required. The MIT license allows anyone to use (including commercial use), modify, and distribute.
As a sponsor of LiveCodes, you will be supporting the ongoing development and maintenance of the project, as well as helping to ensure that it remains a valuable resource for the developer community. In return, you will receive recognition as a sponsor on the documentation website, GitHub repo and social media channels, as well as the opportunity to engage with our community of users and contributors.
There are several ways to support LiveCodes as a sponsor:
### Financial Contributions
LiveCodes relies on the support of sponsors like you to fund its ongoing development and maintenance. Your financial contribution will help to ensure that the project remains sustainable in the long term.
Payments can be done via:
- [GitHub Sponsors](https://github.com/sponsors/live-codes/)
- [PayPal](https://paypal.me/hatemhosni)
- [Ko-fi](https://ko-fi.com/hatemhosny)
Both monthly-recurring sponsorships and one-time donations are accepted. Recurring sponsorships are entitled to logo placements as specified in [Sponsorship Benefits](#sponsorship-benefits).
If you have questions, please reach out to .
### In-kind Contributions
Do you have a service or product that could be useful to the LiveCodes community? We welcome in-kind contributions that can help to support the project and its users.
In-kind contributors are recognized (logo and name) in the [credits](./credits.html.md) page and in the README of [live-codes/livecodes](https://github.com/live-codes/livecodes).
### Marketing and Promotion
Help us to spread the word about LiveCodes by sharing our content on your social media channels, writing blog posts about LiveCodes or by providing us with promotional opportunities.
### Sponsorship Benefits
#### ☕️ Backers (USD$5/mo):
- Name listed in the README of [live-codes/livecodes](https://github.com/live-codes/livecodes).
- Thank you 💚
Your support is really appreciated.
#### 🍹 Generous Backers (USD$25/mo):
- Name listed in the README of [live-codes/livecodes](https://github.com/live-codes/livecodes).
- Priority in feature requests.
#### 🥉 Bronze Sponsors (USD$100/mo):
- Access to a hosted (always-on) [broadcast API](./features/broadcast.html.md) and [custom services](./advanced/services.html.md).
- Small logo placement on the front page of [https://livecodes.io/docs](https://livecodes.io/docs).
- Small logo placement in [this page](#livecodes-sponsors).
- Small logo placement in the README of [live-codes/livecodes](https://github.com/live-codes/livecodes).
- Priority in feature requests.
#### 🥈 Silver Sponsors (USD$250/mo):
- Access to a hosted (always-on) [broadcast API](./features/broadcast.html.md) and [custom services](./advanced/services.html.md).
- Medium logo placement on the front page of [https://livecodes.io/docs](https://livecodes.io/docs).
- Logo placement in sidebar of all content pages.
- Medium logo placement in [this page](#livecodes-sponsors).
- Medium logo placement in the README of [live-codes/livecodes](https://github.com/live-codes/livecodes).
- Priority in feature requests.
#### 🥇 Gold Sponsors (USD$500/mo):
- Access to a hosted (always-on) [broadcast API](./features/broadcast.html.md) and [custom services](./advanced/services.html.md).
- Large logo placement on the front page of [https://livecodes.io/docs](https://livecodes.io/docs).
- Logo placement in sidebar of all content pages.
- Large logo placement in [this page](#livecodes-sponsors).
- Large logo placement in the README of [live-codes/livecodes](https://github.com/live-codes/livecodes).
- Priority in feature requests.
#### 🏆 Platinum Sponsors (USD$1,000/mo):
- Access to a hosted (always-on) [broadcast API](./features/broadcast.html.md) and [custom services](./advanced/services.html.md).
- Prominent logo placement on the front page of [https://livecodes.io/docs](https://livecodes.io/docs).
- Prominent logo placement in sidebar of all content pages.
- Prominent logo placement at the top of [this page](#).
- Prominent logo placement in the README of [live-codes/livecodes](https://github.com/live-codes/livecodes).
- Priority in feature requests.
#### 💎 Diamond Sponsors (USD$2,000/mo):
- **Custom build** of the playground with your **logo and brand**. The custom build is maintained and receives new updates.
- Access to a hosted (always-on) [broadcast API](./features/broadcast.html.md) and [custom services](./advanced/services.html.md).
- Prominent logo placement on the front page of [https://livecodes.io/docs](https://livecodes.io/docs).
- Prominent logo placement in sidebar of all content pages.
- Prominent logo placement at the top of [this page](#).
- Prominent logo placement in the README of [live-codes/livecodes](https://github.com/live-codes/livecodes).
- Priority in feature requests.
#### 🌟 Special Sponsors (> USD$2,000/mo):
.
If you are interested in becoming a sponsor of LiveCodes, please don't hesitate to . We would love to discuss the various sponsorship options available and find a way for you to get involved. Thank you for your support!
## LiveCodes Sponsors
Your logo here
---
# Contact {#contact-custom-content-none}
We would love to hear from you!
import ContactForm from '../src/components/ContactForm.tsx'
import MailLink from '../src/components/MailLink.tsx'
Or you can send us an email to:
- Info:
- Security:
- Sponsor:
For non-security-related code issues, please report them in the [repo issues](https://github.com/live-codes/livecodes/issues).
Please follow the twitter account: [@livecodes_io](https://twitter.com/livecodes_io).
---
# About us
LiveCodes is built and maintained by [Hatem Hosny](https://github.com/hatemhosny), and wonderful [contributors](https://github.com/live-codes/livecodes/graphs/contributors).
Feature requests and bug reports are received on the [GitHub repo](https://github.com/live-codes/livecodes/issues).
Contributions are most welcome. Please open an issue on the GitHub repo to discuss your potential contribution before submitting a pull request.
Reach out to us using this [contact form](./contact.html.md).
Please consider [sponsoring LiveCodes](./sponsor.html.md) to support its maintenance and continued development.
---
# Display Modes
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
---
# Display Mode: full
import LiveCodes from '../../../src/components/LiveCodes.tsx';
---
# Display Mode: editor
import LiveCodes from '../../../src/components/LiveCodes.tsx';
---
# Display Mode: codeblock
import LiveCodes from '../../../src/components/LiveCodes.tsx';
---
# Display Mode: result
import LiveCodes from '../../../src/components/LiveCodes.tsx';
---
# \_internal
## Index
### Interfaces
- [API](interfaces/API.md)
- [AppConfig](interfaces/AppConfig.md)
- [ContentConfig](interfaces/ContentConfig.md)
- [EditorConfig](interfaces/EditorConfig.md)
- [EditorPosition](interfaces/EditorPosition.md)
- [FormatterConfig](interfaces/FormatterConfig.md)
- [TestResult](interfaces/TestResult.md)
- [Types](interfaces/Types.md)
- [UserConfig](interfaces/UserConfig.md)
### Type Aliases
- [APICommands](type-aliases/APICommands.md)
- [AppLanguage](type-aliases/AppLanguage.md)
- [CDN](type-aliases/CDN.md)
- [CodejarTheme](type-aliases/CodejarTheme.md)
- [CodemirrorTheme](type-aliases/CodemirrorTheme.md)
- [CssPresetId](type-aliases/CssPresetId.md)
- [EditorId](type-aliases/EditorId.md)
- [EditorTheme](type-aliases/EditorTheme.md)
- [MonacoTheme](type-aliases/MonacoTheme.md)
- [Processor](type-aliases/Processor.md)
- [TemplateName](type-aliases/TemplateName.md)
- [Theme](type-aliases/Theme.md)
- [ToolsPaneStatus](type-aliases/ToolsPaneStatus.md)
- [WatchCode](type-aliases/WatchCode.md)
- [WatchConsole](type-aliases/WatchConsole.md)
- [WatchDestroy](type-aliases/WatchDestroy.md)
- [WatchLoad](type-aliases/WatchLoad.md)
- [WatchReady](type-aliases/WatchReady.md)
- [WatchTests](type-aliases/WatchTests.md)
---
# Interface: API
## Extended by
- [`Playground`](../../interfaces/Playground.md)
## Properties
### destroy()
> **destroy**: () => `Promise`\<`void`\>
Destroys the playground instance, and removes event listeners.
Further call to any SDK methods throws an error.
#### Returns
`Promise`\<`void`\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
await playground.destroy();
// playground destroyed
// any further SDK call throws an error
});
```
#### Defined in
[models.ts:211](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L211)
***
### exec()
> **exec**: (`command`, ...`args`) => `Promise`\<`object` \| `object`\>
Executes custom commands, including: `"setBroadcastToken"` and `"showVersion"`.
See [docs](https://livecodes.io/docs/sdk/js-ts#exec) for details.
#### Parameters
• **command**: [`APICommands`](../type-aliases/APICommands.md)
• ...**args**: `any`[]
#### Returns
`Promise`\<`object` \| `object`\>
#### Defined in
[models.ts:194](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L194)
***
### format()
> **format**: (`allEditors`?) => `Promise`\<`void`\>
Formats the code.
By default, the code in all editors (markup, style and script) is formatted.
To format only the active editor, the value `false` should be passed as an argument.
#### Parameters
• **allEditors?**: `boolean`
#### Returns
`Promise`\<`void`\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
await playground.format();
// code in editors is formatted
});
```
#### Defined in
[models.ts:31](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L31)
***
### getCode()
> **getCode**: () => `Promise`\<[`Code`](../../interfaces/Code.md)\>
Gets the playground code (including source code, source language and compiled code) for each editor (markup, style, script), in addition to result page HTML.
See [Code](https://livecodes.io/docs/api/interfaces/Code) for the structure of the returned object.
#### Returns
`Promise`\<[`Code`](../../interfaces/Code.md)\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const code = await playground.getCode();
// source code, language and compiled code for the script editor
const { content, language, compiled } = code.script;
// result page HTML
const result = code.result;
});
```
#### Defined in
[models.ts:105](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L105)
***
### getConfig()
> **getConfig**: (`contentOnly`?) => `Promise`\<[`Config`](../../interfaces/Config.md)\>
Gets a [configuration object](https://livecodes.io/docs/configuration/configuration-object) representing the playground state.
This can be used to restore state if passed as an [EmbedOptions](https://livecodes.io/docs/sdk/js-ts#embed-options) property when [creating playgrounds](https://livecodes.io/docs/sdk/js-ts/#createplayground),
or can be manipulated and loaded in run-time using [`setConfig`](https://livecodes.io/docs/sdk/js-ts#setconfig) method.
#### Parameters
• **contentOnly?**: `boolean`
#### Returns
`Promise`\<[`Config`](../../interfaces/Config.md)\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const config = await playground.getConfig();
});
```
#### Defined in
[models.ts:64](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L64)
***
### getShareUrl()
> **getShareUrl**: (`shortUrl`?) => `Promise`\<`string`\>
Gets a [share url](https://livecodes.io/docs/features/share) for the current project.
By default, the url has a long query string representing the compressed encoded config object.
If the argument `shortUrl` was set to `true`, a short url is generated.
#### Parameters
• **shortUrl?**: `boolean`
#### Returns
`Promise`\<`string`\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const longUrl = await playground.getShareUrl();
const shortUrl = await playground.getShareUrl(true);
});
```
#### Defined in
[models.ts:48](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L48)
***
### ~~onChange()~~
> **onChange**: (`fn`) => `object`
Runs a callback function when code changes.
#### Parameters
• **fn**
#### Returns
`object`
##### ~~remove()~~
> **remove**: () => `void`
###### Returns
`void`
#### Deprecated
Use [`watch`](https://livecodes.io/docs/sdk/js-ts#watch) method instead.
#### Defined in
[models.ts:142](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L142)
***
### run()
> **run**: () => `Promise`\<`void`\>
Runs the [result page](https://livecodes.io/docs/features/result) (after any required compilation for code).
#### Returns
`Promise`\<`void`\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
await playground.run();
// new result page is displayed
});
```
#### Defined in
[models.ts:14](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L14)
***
### runTests()
> **runTests**: () => `Promise`\<`object`\>
Runs project [tests](https://livecodes.io/docs/features/tests) (if present) and gets test results.
#### Returns
`Promise`\<`object`\>
##### results
> **results**: [`TestResult`](TestResult.md)[]
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const { results } = await playground.runTests();
});
```
#### Defined in
[models.ts:135](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L135)
***
### setConfig()
> **setConfig**: (`config`) => `Promise`\<[`Config`](../../interfaces/Config.md)\>
Loads a new project using the passed configuration object.
#### Parameters
• **config**: `Partial`\<[`Config`](../../interfaces/Config.md)\>
#### Returns
`Promise`\<[`Config`](../../interfaces/Config.md)\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const config = {
markup: {
language: "html",
content: "Hello World!",
},
};
const newConfig = await playground.setConfig(config);
// new project loaded
});
```
#### Defined in
[models.ts:84](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L84)
***
### show()
> **show**: (`panel`, `options`?) => `Promise`\<`void`\>
Shows the selected panel.
See [docs](https://livecodes.io/docs/sdk/js-ts#show) for details.
#### Parameters
• **panel**: `"result"` \| [`EditorId`](../type-aliases/EditorId.md) \| `"console"` \| `"compiled"` \| `"tests"` \| `"editor"` \| `"toggle-result"`
• **options?**
• **options.column?**: `number`
• **options.full?**: `boolean`
• **options.line?**: `number`
• **options.zoom?**: `1` \| `0.5` \| `0.25`
#### Returns
`Promise`\<`void`\>
#### Example
```ts
await playground.show("style");
await playground.show("toggle-result");
await playground.show("result", { full: true });
await playground.show("script");
await playground.show("result", { zoom: 0.5 });
await playground.show("console", { full: true });
```
#### Defined in
[models.ts:119](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L119)
***
### watch
> **watch**: [`WatchLoad`](../type-aliases/WatchLoad.md) & [`WatchReady`](../type-aliases/WatchReady.md) & [`WatchCode`](../type-aliases/WatchCode.md) & [`WatchConsole`](../type-aliases/WatchConsole.md) & [`WatchTests`](../type-aliases/WatchTests.md) & [`WatchDestroy`](../type-aliases/WatchDestroy.md)
Allows to watch for various playground events.
It takes 2 arguments: event name and a callback function that will be called on every event.
event name can be one of: `"load" | "ready" | "code" | "console" | "tests" | "destroy"`
In some events, the callback function will be called with an object that supplies relevant data to the callback function (e.g. code, console output, test results).
The watch method returns an object with a single method (`remove`), which when called will remove the callback from watching further events.
See [docs](https://livecodes.io/docs/sdk/js-ts#watch) for details.
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then((playground) => {
const codeWatcher = playground.watch("code", ({ code, config }) => {
// this will run on every code change
console.log("code:", code);
console.log("config:", config);
});
const consoleWatcher = playground.watch("console", ({ method, args }) => {
// this will run on every console output
console[method](...args);
});
const testsWatcher = playground.watch("tests", ({ results }) => {
// this will run when tests run
results.forEach((testResult) => {
console.log("status:", testResult.status); // "pass", "fail" or "skip"
console.log(testResult.errors); // array of errors as strings
});
});
// then later
codeWatcher.remove();
consoleWatcher.remove();
testsWatcher.remove();
// events are no longer watched
});
```
#### Defined in
[models.ts:187](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L187)
---
# Interface: AppConfig
These are properties that define how the app behaves.
## Extended by
- [`Config`](../../interfaces/Config.md)
## Properties
### allowLangChange
> **allowLangChange**: `boolean`
If `false`, the UI will not show the menu that allows changing editor language.
#### Default
```ts
true
```
#### Defined in
[models.ts:603](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L603)
***
### mode
> **mode**: `"focus"` \| `"full"` \| `"result"` \| `"editor"` \| `"lite"` \| `"simple"` \| `"codeblock"`
Sets the [display mode](https://livecodes.io/docs/features/display-modes).
#### Default
```ts
"full"
```
#### Defined in
[models.ts:615](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L615)
***
### readonly
> **readonly**: `boolean`
If `true`, editors are loaded in read-only mode, where the user is not allowed to change the code.
By default, when readonly is set to true, the light-weight code editor [CodeJar](https://livecodes.io/docs/features/editor-settings#code-editor) is used.
If you wish to use another editor, set the [editor](https://livecodes.io/docs/configuration/configuration-object#editor) property.
#### Default
```ts
false
```
#### Defined in
[models.ts:597](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L597)
***
### tools
> **tools**: `Partial`\<`object`\>
Sets enabled and active tools and status of [tools pane](https://livecodes.io/docs/features/tools-pane).
#### Type declaration
##### active
> **active**: `""` \| `"console"` \| `"compiled"` \| `"tests"`
##### enabled
> **enabled**: `"all"` \| (`"console"` \| `"compiled"` \| `"tests"`)[]
##### status
> **status**: [`ToolsPaneStatus`](../type-aliases/ToolsPaneStatus.md)
#### Default
```ts
{ enabled: "all", active: "", status: "" }
```
#### Example
```js
{
"tools": {
"enabled": ["console", "compiled"],
"active": "console",
"status": "open"
}
}
```
#### Defined in
[models.ts:631](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L631)
***
### view?
> `optional` **view**: `"split"` \| `"result"` \| `"editor"`
Sets the [default view](https://livecodes.io/docs/features/default-view) for the playground.
#### Default
```ts
"split"
```
#### Defined in
[models.ts:609](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L609)
***
### zoom
> **zoom**: `0.25` \| `0.5` \| `1`
Sets result page [zoom level](https://livecodes.io/docs/features/result#result-page-zoom).
#### Defined in
[models.ts:640](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L640)
---
# Interface: ContentConfig
The properties that define the content of the current [project](https://livecodes.io/docs/features/projects).
## Extended by
- [`Config`](../../interfaces/Config.md)
## Properties
### activeEditor
> **activeEditor**: `undefined` \| [`EditorId`](../type-aliases/EditorId.md)
Selects the active editor to show.
Defaults to the last used editor for user, otherwise `"markup"`
#### Defined in
[models.ts:455](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L455)
***
### cssPreset
> **cssPreset**: [`CssPresetId`](../type-aliases/CssPresetId.md)
[CSS Preset](https://livecodes.io/docs/features/external-resources#css-presets) to use.
#### Defined in
[models.ts:502](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L502)
***
### customSettings
> **customSettings**: `object`
Defines [custom settings](https://livecodes.io/docs/advanced/custom-settings) for the current project.
#### adoc
> **adoc**: `any`
#### app.svelte
> **svelte**: `any`
#### app.vue
> **vue**: `any`
#### art
> **art**: `any`
#### art-template
> **art-template**: `any`
#### as
> **as**: `any`
#### asc
> **asc**: `any`
#### asciidoc
> **asciidoc**: `any`
#### assemblyscript
> **assemblyscript**: `any`
#### astro
> **astro**: `any`
#### autoprefixer
> **autoprefixer**: `any`
#### babel
> **babel**: `any`
#### bb
> **bb**: `any`
#### bbcode
> **bbcode**: `any`
#### Binary
> **Binary**: `any`
#### blockly
> **blockly**: `any`
#### blockly.xml
> **xml**: `any`
#### c
> **c**: `any`
#### C
> **C**: `any`
#### c++
> **c++**: `any`
#### civet
> **civet**: `any`
#### clang
> **clang**: `any`
#### clang.cpp
> **cpp**: `any`
#### clio
> **clio**: `any`
#### clj
> **clj**: `any`
#### cljc
> **cljc**: `any`
#### cljs
> **cljs**: `any`
#### clojure
> **clojure**: `any`
#### clojurescript
> **clojurescript**: `any`
#### coffee
> **coffee**: `any`
#### coffeescript
> **coffeescript**: `any`
#### common-lisp
> **common-lisp**: `any`
#### commonlisp
> **commonlisp**: `any`
#### convertCommonjs?
> `optional` **convertCommonjs**: `boolean`
#### cp
> **cp**: `any`
#### cpp
> **cpp**: `any`
#### cpp-wasm
> **cpp-wasm**: `any`
#### cppm
> **cppm**: `any`
#### cppwasm
> **cppwasm**: `any`
#### cs
> **cs**: `any`
#### cs-wasm
> **cs-wasm**: `any`
#### csharp
> **csharp**: `any`
#### csharp-wasm
> **csharp-wasm**: `any`
#### css
> **css**: `any`
#### cssmodules
> **cssmodules**: `any`
#### cssnano
> **cssnano**: `any`
#### cwasm
> **cwasm**: `any`
#### cxx
> **cxx**: `any`
#### defaultCDN?
> `optional` **defaultCDN**: [`CDN`](../type-aliases/CDN.md)
#### diagram
> **diagram**: `any`
#### diagrams
> **diagrams**: `any`
#### dot
> **dot**: `any`
#### edn
> **edn**: `any`
#### ejs
> **ejs**: `any`
#### es
> **es**: `any`
#### eta
> **eta**: `any`
#### fennel
> **fennel**: `any`
#### flow
> **flow**: `any`
#### fnl
> **fnl**: `any`
#### gleam
> **gleam**: `any`
#### go
> **go**: `any`
#### golang
> **golang**: `any`
#### graph
> **graph**: `any`
#### h
> **h**: `any`
#### haml
> **haml**: `any`
#### handlebars
> **handlebars**: `any`
#### hbs
> **hbs**: `any`
#### hpp
> **hpp**: `any`
#### htm
> **htm**: `any`
#### html
> **html**: `any`
#### ii
> **ii**: `any`
#### imba
> **imba**: `any`
#### imports?
> `optional` **imports**: `Record`\<`string`, `string`\>
#### ixx
> **ixx**: `any`
#### jade
> **jade**: `any`
#### java
> **java**: `any`
#### javascript
> **javascript**: `any`
#### jinja
> **jinja**: `any`
#### jl
> **jl**: `any`
#### js
> **js**: `any`
#### json
> **json**: `any`
#### jsx
> **jsx**: `any`
#### julia
> **julia**: `any`
#### less
> **less**: `any`
#### lightningcss
> **lightningcss**: `any`
#### liquid
> **liquid**: `any`
#### liquidjs
> **liquidjs**: `any`
#### lisp
> **lisp**: `any`
#### livescript
> **livescript**: `any`
#### ls
> **ls**: `any`
#### lua
> **lua**: `any`
#### lua-wasm
> **lua-wasm**: `any`
#### luawasm
> **luawasm**: `any`
#### malina
> **malina**: `any`
#### malinajs
> **malinajs**: `any`
#### mapImports?
> `optional` **mapImports**: `boolean`
#### markdown
> **markdown**: `any`
#### md
> **md**: `any`
#### mdown
> **mdown**: `any`
#### mdx
> **mdx**: `any`
#### mjml
> **mjml**: `any`
#### mkdn
> **mkdn**: `any`
#### ml
> **ml**: `any`
#### mli
> **mli**: `any`
#### mustache
> **mustache**: `any`
#### njk
> **njk**: `any`
#### nunjucks
> **nunjucks**: `any`
#### ocaml
> **ocaml**: `any`
#### perl
> **perl**: `any`
#### pg
> **pg**: `any`
#### pg.sql
> **sql**: `any`
#### pglite
> **pglite**: `any`
#### pglite.sql
> **sql**: `any`
#### pgsql
> **pgsql**: `any`
#### pgsql.sql
> **sql**: `any`
#### php
> **php**: `any`
#### php-wasm
> **php-wasm**: `any`
#### phpwasm
> **phpwasm**: `any`
#### pintora
> **pintora**: `any`
#### pl
> **pl**: `any`
#### plt
> **plt**: `any`
#### pm
> **pm**: `any`
#### postcss
> **postcss**: `any`
#### postcssImportUrl
> **postcssImportUrl**: `any`
#### postcssPresetEnv
> **postcssPresetEnv**: `any`
#### postgre.sql
> **sql**: `any`
#### postgres
> **postgres**: `any`
#### postgresql
> **postgresql**: `any`
#### postgresql.sql
> **sql**: `any`
#### prolog
> **prolog**: `any`
#### prolog.pl
> **pl**: `any`
#### pug
> **pug**: `any`
#### purgecss
> **purgecss**: `any`
#### py
> **py**: `any`
#### py-wasm
> **py-wasm**: `any`
#### py3
> **py3**: `any`
#### pyodide
> **pyodide**: `any`
#### python
> **python**: `any`
#### python-wasm
> **python-wasm**: `any`
#### pythonwasm
> **pythonwasm**: `any`
#### pywasm
> **pywasm**: `any`
#### r
> **r**: `any`
#### r-wasm
> **r-wasm**: `any`
#### rb
> **rb**: `any`
#### re
> **re**: `any`
#### react
> **react**: `any`
#### react-jsx
> **react-jsx**: `any`
#### react-native
> **react-native**: `any`
#### react-native-tsx
> **react-native-tsx**: `any`
#### react-native.jsx
> **jsx**: `any`
#### react-native.tsx
> **tsx**: `any`
#### react-tsx
> **react-tsx**: `any`
#### react.jsx
> **jsx**: `any`
#### react.tsx
> **tsx**: `any`
#### reason
> **reason**: `any`
#### rei
> **rei**: `any`
#### res
> **res**: `any`
#### rescript
> **rescript**: `any`
#### resi
> **resi**: `any`
#### rich
> **rich**: `any`
#### richtext
> **richtext**: `any`
#### riot
> **riot**: `any`
#### riotjs
> **riotjs**: `any`
#### rlang
> **rlang**: `any`
#### rstats
> **rstats**: `any`
#### rte
> **rte**: `any`
#### rte.html
> **html**: `any`
#### ruby
> **ruby**: `any`
#### ruby-wasm
> **ruby-wasm**: `any`
#### rubywasm
> **rubywasm**: `any`
#### sass
> **sass**: `any`
#### scheme
> **scheme**: `any`
#### scm
> **scm**: `any`
#### scriptType?
> `optional` **scriptType**: `""` \| `"module"` \| `"text/liquid"` \| `"text/python"` \| `"text/r"` \| `"text/ruby-wasm"` \| `"text/x-uniter-php"` \| `"text/php-wasm"` \| `"text/cpp"` \| `"text/java"` \| `"text/csharp-wasm"` \| `"text/perl"` \| `"text/julia"` \| `"text/biwascheme"` \| `"text/commonlisp"` \| `"text/tcl"` \| `"text/prolog"` \| `"application/json"` \| `"application/lua"` \| `"text/fennel"` \| `"application/wasm-uint8"` \| `"application/javascript"` \| `"application/ecmascript"` \| `"text/javascript"` \| `"text/ecmascript"`
#### scss
> **scss**: `any`
#### solid
> **solid**: `any`
#### solid.jsx
> **jsx**: `any`
#### solid.tsx
> **tsx**: `any`
#### sql
> **sql**: `any`
#### sqlite
> **sqlite**: `any`
#### sqlite3
> **sqlite3**: `any`
#### stencil
> **stencil**: `any`
#### stencil.tsx
> **tsx**: `any`
#### styl
> **styl**: `any`
#### stylis
> **stylis**: `any`
#### stylus
> **stylus**: `any`
#### sucrase
> **sucrase**: `any`
#### svelte
> **svelte**: `any`
#### svelte-app
> **svelte-app**: `any`
#### tailwindcss
> **tailwindcss**: `any`
#### tcl
> **tcl**: `any`
#### teal
> **teal**: `any`
#### template?
> `optional` **template**: `object`
#### template.data?
> `optional` **data**: `any`
#### template.prerender?
> `optional` **prerender**: `boolean`
#### tl
> **tl**: `any`
#### tokencss
> **tokencss**: `any`
#### ts
> **ts**: `any`
#### tsx
> **tsx**: `any`
#### twig
> **twig**: `any`
#### types?
> `optional` **types**: [`Types`](Types.md)
#### typescript
> **typescript**: `any`
#### unocss
> **unocss**: `any`
#### vento
> **vento**: `any`
#### vto
> **vto**: `any`
#### vue
> **vue**: `any`
#### vue-app
> **vue-app**: `any`
#### vue2
> **vue2**: `any`
#### vue3
> **vue3**: `any`
#### wasm
> **wasm**: `any`
#### wasm.cpp
> **cpp**: `any`
#### wasm.cs
> **cs**: `any`
#### wasm.lua
> **lua**: `any`
#### wasm.php
> **php**: `any`
#### wasm.py
> **py**: `any`
#### wasm.rb
> **rb**: `any`
#### wast
> **wast**: `any`
#### wat
> **wat**: `any`
#### webassembly
> **webassembly**: `any`
#### windicss
> **windicss**: `any`
#### xht
> **xht**: `any`
#### xml
> **xml**: `any`
#### Defined in
[models.ts:514](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L514)
***
### description
> **description**: `string`
Project description. Used in [project](https://livecodes.io/docs/features/projects) search
and [result page](https://livecodes.io/docs/features/result) description meta tag.
#### Default
```ts
""
```
#### Defined in
[models.ts:425](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L425)
***
### head
> **head**: `string`
Content added to the [result page](https://livecodes.io/docs/features/result) `` element.
#### Default
```ts
'\n'
```
#### Defined in
[models.ts:431](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L431)
***
### htmlAttrs
> **htmlAttrs**: `string` \| `Record`\<`string`, `string`\>
Attributes added to the [result page](https://livecodes.io/docs/features/result) `` element.
It can be an object or a string.
#### Example
```ts
{ lang: "en", class: "dark" }
'lang="en" class="dark"'
```
#### Defined in
[models.ts:440](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L440)
***
### imports
> **imports**: `object`
Allows specifying custom [import maps](https://github.com/WICG/import-maps) for [module imports](https://livecodes.io/docs/features/module-resolution#custom-module-resolution).
**Example**
Setting `imports` like this:
```js
"imports": {
"moment": "https://cdn.jsdelivr.net/npm/moment@2.29.4/dist/moment.js"
}
```
results in the following import map:
```html
```
See docs for [Imports](https://livecodes.io/docs/configuration/configuration-object#imports)
and [Custom Module Resolution](https://livecodes.io/docs/features/module-resolution/#custom-module-resolution)
#### Index Signature
\[`key`: `string`\]: `string`
#### Defined in
[models.ts:540](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L540)
***
### languages
> **languages**: `undefined` \| (`"reason"` \| `"stylus"` \| `"r"` \| `"html"` \| `"ruby"` \| `"rb"` \| `"json"` \| `"teal"` \| `"solid"` \| `"flow"` \| `"dot"` \| `"as"` \| `"go"` \| `"htm"` \| `"markdown"` \| `"md"` \| `"mdown"` \| `"mkdn"` \| `"mdx"` \| `"astro"` \| `"pug"` \| `"jade"` \| `"haml"` \| `"asciidoc"` \| `"adoc"` \| `"asc"` \| `"mustache"` \| `"handlebars"` \| `"hbs"` \| `"ejs"` \| `"eta"` \| `"nunjucks"` \| `"njk"` \| `"liquid"` \| `"liquidjs"` \| `"twig"` \| `"vento"` \| `"vto"` \| `"art-template"` \| `"art"` \| `"jinja"` \| `"bbcode"` \| `"bb"` \| `"mjml"` \| `"diagrams"` \| `"diagram"` \| `"graph"` \| `"plt"` \| `"richtext"` \| `"rte"` \| `"rich"` \| `"rte.html"` \| `"css"` \| `"scss"` \| `"sass"` \| `"less"` \| `"styl"` \| `"stylis"` \| `"postcss"` \| `"javascript"` \| `"js"` \| `"babel"` \| `"es"` \| `"sucrase"` \| `"typescript"` \| `"ts"` \| `"jsx"` \| `"tsx"` \| `"react"` \| `"react-jsx"` \| `"react.jsx"` \| `"react-tsx"` \| `"react.tsx"` \| `"react-native"` \| `"react-native.jsx"` \| `"react-native-tsx"` \| `"react-native.tsx"` \| `"vue"` \| `"vue3"` \| `"vue2"` \| `"vue-app"` \| `"app.vue"` \| `"svelte"` \| `"svelte-app"` \| `"app.svelte"` \| `"stencil"` \| `"stencil.tsx"` \| `"solid.jsx"` \| `"solid.tsx"` \| `"riot"` \| `"riotjs"` \| `"malina"` \| `"malinajs"` \| `"xht"` \| `"coffeescript"` \| `"coffee"` \| `"livescript"` \| `"ls"` \| `"civet"` \| `"clio"` \| `"imba"` \| `"assemblyscript"` \| `"python"` \| `"py"` \| `"pyodide"` \| `"python-wasm"` \| `"py-wasm"` \| `"pythonwasm"` \| `"pywasm"` \| `"py3"` \| `"wasm.py"` \| `"rlang"` \| `"rstats"` \| `"r-wasm"` \| `"ruby-wasm"` \| `"wasm.rb"` \| `"rubywasm"` \| `"golang"` \| `"php"` \| `"php-wasm"` \| `"phpwasm"` \| `"wasm.php"` \| `"cpp"` \| `"c"` \| `"C"` \| `"cp"` \| `"cxx"` \| `"c++"` \| `"cppm"` \| `"ixx"` \| `"ii"` \| `"hpp"` \| `"h"` \| `"cpp-wasm"` \| `"cppwasm"` \| `"cwasm"` \| `"wasm.cpp"` \| `"clang"` \| `"clang.cpp"` \| `"java"` \| `"csharp"` \| `"csharp-wasm"` \| `"cs"` \| `"cs-wasm"` \| `"wasm.cs"` \| `"perl"` \| `"pl"` \| `"pm"` \| `"lua"` \| `"lua-wasm"` \| `"luawasm"` \| `"wasm.lua"` \| `"tl"` \| `"fennel"` \| `"fnl"` \| `"julia"` \| `"jl"` \| `"scheme"` \| `"scm"` \| `"commonlisp"` \| `"common-lisp"` \| `"lisp"` \| `"clojurescript"` \| `"clojure"` \| `"cljs"` \| `"clj"` \| `"cljc"` \| `"edn"` \| `"gleam"` \| `"rescript"` \| `"res"` \| `"resi"` \| `"re"` \| `"rei"` \| `"ocaml"` \| `"ml"` \| `"mli"` \| `"tcl"` \| `"wat"` \| `"wast"` \| `"webassembly"` \| `"wasm"` \| `"Binary"` \| `"sql"` \| `"sqlite"` \| `"sqlite3"` \| `"pg.sql"` \| `"pgsql.sql"` \| `"pgsql"` \| `"pg"` \| `"pglite"` \| `"pglite.sql"` \| `"postgresql"` \| `"postgres"` \| `"postgre.sql"` \| `"postgresql.sql"` \| `"prolog.pl"` \| `"prolog"` \| `"blockly"` \| `"blockly.xml"` \| `"xml"` \| `"pintora"` \| `"tailwindcss"` \| `"postcssImportUrl"` \| `"windicss"` \| `"unocss"` \| `"tokencss"` \| `"lightningcss"` \| `"autoprefixer"` \| `"postcssPresetEnv"` \| `"cssmodules"` \| `"purgecss"` \| `"cssnano"`)[]
List of enabled languages.
Defaults to all supported languages in full app and only current editor languages in [embeds](https://livecodes.io/docs/features/embeds).
#### Defined in
[models.ts:462](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L462)
***
### markup
> **markup**: `object`
An object that configures the language and content of the markup editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
#### content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### language
> **language**: [`Language`](../../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### position?
> `optional` **position**: [`EditorPosition`](EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### Default
```ts
{ language: "html", content: "" }
```
#### Defined in
[models.ts:470](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L470)
***
### processors
> **processors**: [`Processor`](../type-aliases/Processor.md)[]
List of enabled [CSS processors](https://livecodes.io/docs/features/css/#css-processors).
For the list of available processors, see [Processor](https://livecodes.io/docs/api/internal/type-aliases/Processor)
#### Defined in
[models.ts:509](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L509)
***
### script
> **script**: `object`
An object that configures the language and content of the script editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
#### content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### language
> **language**: [`Language`](../../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### position?
> `optional` **position**: [`EditorPosition`](EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### Default
```ts
{ language: "javascript", content: "" }
```
#### Defined in
[models.ts:486](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L486)
***
### scripts
> **scripts**: `string`[]
List of URLs for [external scripts](https://livecodes.io/docs/features/external-resources) to add to the [result page](https://livecodes.io/docs/features/result).
#### Defined in
[models.ts:496](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L496)
***
### style
> **style**: `object`
An object that configures the language and content of the style editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
#### content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### language
> **language**: [`Language`](../../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### position?
> `optional` **position**: [`EditorPosition`](EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### Default
```ts
{ language: "css", content: "" }
```
#### Defined in
[models.ts:478](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L478)
***
### stylesheets
> **stylesheets**: `string`[]
List of URLs for [external stylesheets](https://livecodes.io/docs/features/external-resources) to add to the [result page](https://livecodes.io/docs/features/result).
#### Defined in
[models.ts:491](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L491)
***
### tags
> **tags**: `string`[]
Project tags.
Used in [project](https://livecodes.io/docs/features/projects) filter and search.
#### Default
```ts
[]
```
#### Defined in
[models.ts:447](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L447)
***
### tests
> **tests**: `undefined` \| `object`
Configures the [language](https://livecodes.io/docs/features/tests#supported-languages)
and content of [tests](https://livecodes.io/docs/features/tests).
#### Defined in
[models.ts:576](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L576)
***
### title
> **title**: `string`
Project title.
This is used as [result page](https://livecodes.io/docs/features/result) title and title meta tag.
Also used in project search.
#### Default
```ts
"Untitled Project"
```
#### Defined in
[models.ts:418](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L418)
***
### types
> **types**: `object`
Allows providing custom TypeScript type declarations for better [editor intellisense](https://livecodes.io/docs/features/intellisense).
It is an object where each key represents module name and value represents the types.
See docs for [Types](https://livecodes.io/docs/configuration/configuration-object#types)
and [Custom Types](https://livecodes.io/docs/features/intellisense#custom-types)
#### Examples
```js
{
"types": {
"my-demo-lib": "https://my-custom-domain/my-type-declarations.d.ts"
}
}
```
```
{
"types": {
"my-demo-lib": {
"url": "https://my-custom-domain/types.d.ts",
"autoload": true,
"declareAsModule": true
}
}
```
#### Defined in
[models.ts:570](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L570)
***
### version
> `readonly` **version**: `string`
This is a read-only property which specifies the current LiveCodes version.
Version specified in [exported](https://livecodes.io/docs/features/export) projects allows automatically upgrading the project configuration when imported by an app with a newer version.
#### Defined in
[models.ts:583](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L583)
---
# Interface: EditorConfig
## Extended by
- [`UserConfig`](UserConfig.md)
## Properties
### closeBrackets
> **closeBrackets**: `boolean`
Use auto-complete to close brackets and quotes.
#### Default
```ts
true
```
#### Defined in
[models.ts:801](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L801)
***
### editor
> **editor**: `undefined` \| `"auto"` \| `"monaco"` \| `"codemirror"` \| `"codejar"`
Selects the [code editor](https://livecodes.io/docs/features/editor-settings#code-editor) to use.
If `undefined` (the default), Monaco editor is used on desktop,
CodeMirror is used on mobile and in `simple` mode,
while CodeJar is used in `codeblock` mode, in `lite` mode and in `readonly` playgrounds.
If set to `auto`, Monaco editor is used on desktop and CodeMirror is used on mobile regardless of other settings.
#### Default
```ts
undefined
```
#### Defined in
[models.ts:722](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L722)
***
### editorMode
> **editorMode**: `undefined` \| `"vim"` \| `"emacs"`
Sets [editor mode](https://livecodes.io/docs/features/editor-settings#editor-modes).
#### Defined in
[models.ts:812](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L812)
***
### editorTheme
> **editorTheme**: `undefined` \| `string` \| [`EditorTheme`](../type-aliases/EditorTheme.md)[]
Sets the [code editor](https://livecodes.io/docs/features/editor-settings) themes.
See docs for [editor themes](https://livecodes.io/docs/configuration/configuration-object#editortheme) for details.
#### Examples
```ts
"vs"
```
```ts
"monaco:twilight, codemirror:one-dark"
```
```ts
["vs@light"]
```
```ts
["vs@light", "vs-dark@dark"]
```
```ts
["monaco:vs@light", "codemirror:github-light@light", "dracula@dark"]
```
#### Defined in
[models.ts:748](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L748)
***
### emmet
> **emmet**: `boolean`
Enables [Emmet](https://livecodes.io/docs/features/editor-settings#emmet).
#### Default
```ts
true
```
#### Defined in
[models.ts:807](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L807)
***
### enableAI
> **enableAI**: `boolean`
If `true`, [AI code assistant](https://livecodes.io/docs/features/ai) is enabled.
#### Default
```ts
false
```
#### Defined in
[models.ts:818](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L818)
***
### foldRegions
> **foldRegions**: `boolean`
When set to `true`, regions marked by `#region` and `#endregion` comments are folded when the project is loaded.
#### Default
```ts
false
```
#### Defined in
[models.ts:795](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L795)
***
### fontFamily
> **fontFamily**: `undefined` \| `string`
Sets the [code editor](https://livecodes.io/docs/features/editor-settings) font family.
#### Defined in
[models.ts:753](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L753)
***
### fontSize
> **fontSize**: `undefined` \| `number`
Sets the font size.
If `undefined` (the default), the font size is set to 14 for the full app and 12 for [embeds](https://livecodes.io/docs/features/embeds).
#### Default
```ts
undefined
```
#### Defined in
[models.ts:761](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L761)
***
### lineNumbers
> **lineNumbers**: `boolean` \| `"relative"`
Show line numbers in [code editor](https://livecodes.io/docs/features/editor-settings).
#### Default
```ts
true
```
#### Defined in
[models.ts:783](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L783)
***
### tabSize
> **tabSize**: `number`
The number of spaces per indentation-level.
Also used in [code formatting](https://livecodes.io/docs/features/code-format).
#### Default
```ts
2
```
#### Defined in
[models.ts:777](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L777)
***
### theme
> **theme**: [`Theme`](../type-aliases/Theme.md)
Sets the app [theme](https://livecodes.io/docs/features/themes) to light/dark mode.
#### Default
```ts
"dark"
```
#### Defined in
[models.ts:728](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L728)
***
### themeColor
> **themeColor**: `undefined` \| `string`
Sets the app theme color.
If `undefined`, it is set to `"hsl(214, 40%, 50%)"`.
#### Default
```ts
undefined
```
#### Defined in
[models.ts:735](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L735)
***
### useTabs
> **useTabs**: `boolean`
If `true`, lines are indented with tabs instead of spaces.
Also used in [code formatting](https://livecodes.io/docs/features/code-format).
#### Default
```ts
false
```
#### Defined in
[models.ts:769](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L769)
***
### wordWrap
> **wordWrap**: `boolean`
Enables word-wrap for long lines.
#### Default
```ts
false
```
#### Defined in
[models.ts:789](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L789)
---
# Interface: EditorPosition
## Properties
### column?
> `optional` **column**: `number`
#### Defined in
[models.ts:1165](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1165)
***
### lineNumber
> **lineNumber**: `number`
#### Defined in
[models.ts:1164](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1164)
---
# Interface: FormatterConfig
## Extended by
- [`UserConfig`](UserConfig.md)
## Properties
### semicolons
> **semicolons**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use semi-colons.
#### Default
```ts
true
```
#### Defined in
[models.ts:838](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L838)
***
### singleQuote
> **singleQuote**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use single quotes instead of double quotes.
#### Default
```ts
false
```
#### Defined in
[models.ts:843](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L843)
***
### tabSize
> **tabSize**: `number`
The number of spaces per indentation-level.
#### Default
```ts
2
```
#### Defined in
[models.ts:832](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L832)
***
### trailingComma
> **trailingComma**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use [trailing commas](https://prettier.io/docs/en/options.html#trailing-commas).
#### Default
```ts
true
```
#### Defined in
[models.ts:849](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L849)
***
### useTabs
> **useTabs**: `boolean`
If `true`, lines are indented with tabs instead of spaces.
#### Default
```ts
false
```
#### Defined in
[models.ts:826](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L826)
---
# Interface: TestResult
## Properties
### duration
> **duration**: `number`
#### Defined in
[models.ts:1979](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1979)
***
### errors
> **errors**: `string`[]
#### Defined in
[models.ts:1980](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1980)
***
### status
> **status**: `"fail"` \| `"pass"` \| `"skip"`
#### Defined in
[models.ts:1981](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1981)
***
### testPath
> **testPath**: `string`[]
#### Defined in
[models.ts:1982](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1982)
---
# Interface: Types
## Indexable
\[`key`: `string`\]: `string` \| `object`
---
# Interface: UserConfig
## Extends
- [`EditorConfig`](EditorConfig.md).[`FormatterConfig`](FormatterConfig.md)
## Extended by
- [`Config`](../../interfaces/Config.md)
## Properties
### appLanguage
> **appLanguage**: `undefined` \| [`AppLanguage`](../type-aliases/AppLanguage.md)
Sets the app UI language used.
#### Defined in
[models.ts:707](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L707)
***
### autosave
> **autosave**: `boolean`
If `true`, the project is automatically saved on code change,
after time [delay](https://livecodes.io/docs/configuration/configuration-object#delay).
#### Default
```ts
false
```
#### Defined in
[models.ts:656](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L656)
***
### autotest
> **autotest**: `boolean`
If `true`, the project is watched for code changes which trigger tests to auto-run.
#### Default
```ts
false
```
#### Defined in
[models.ts:662](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L662)
***
### autoupdate
> **autoupdate**: `boolean`
If `true`, the result page is automatically updated on code change,
after time [delay](https://livecodes.io/docs/configuration/configuration-object#delay).
#### Default
```ts
true
```
#### Defined in
[models.ts:649](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L649)
***
### closeBrackets
> **closeBrackets**: `boolean`
Use auto-complete to close brackets and quotes.
#### Default
```ts
true
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`closeBrackets`](EditorConfig.md#closebrackets)
#### Defined in
[models.ts:801](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L801)
***
### delay
> **delay**: `number`
Time delay (in milliseconds) following code change,
after which the result page is updated (if [`autoupdate`](https://livecodes.io/docs/configuration/configuration-object#autoupdate) is `true`)
and/or the project is saved (if [`autosave`](https://livecodes.io/docs/configuration/configuration-object#autosave) is `true`).
#### Default
```ts
1500
```
#### Defined in
[models.ts:670](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L670)
***
### editor
> **editor**: `undefined` \| `"auto"` \| `"monaco"` \| `"codemirror"` \| `"codejar"`
Selects the [code editor](https://livecodes.io/docs/features/editor-settings#code-editor) to use.
If `undefined` (the default), Monaco editor is used on desktop,
CodeMirror is used on mobile and in `simple` mode,
while CodeJar is used in `codeblock` mode, in `lite` mode and in `readonly` playgrounds.
If set to `auto`, Monaco editor is used on desktop and CodeMirror is used on mobile regardless of other settings.
#### Default
```ts
undefined
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`editor`](EditorConfig.md#editor)
#### Defined in
[models.ts:722](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L722)
***
### editorMode
> **editorMode**: `undefined` \| `"vim"` \| `"emacs"`
Sets [editor mode](https://livecodes.io/docs/features/editor-settings#editor-modes).
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`editorMode`](EditorConfig.md#editormode)
#### Defined in
[models.ts:812](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L812)
***
### editorTheme
> **editorTheme**: `undefined` \| `string` \| [`EditorTheme`](../type-aliases/EditorTheme.md)[]
Sets the [code editor](https://livecodes.io/docs/features/editor-settings) themes.
See docs for [editor themes](https://livecodes.io/docs/configuration/configuration-object#editortheme) for details.
#### Examples
```ts
"vs"
```
```ts
"monaco:twilight, codemirror:one-dark"
```
```ts
["vs@light"]
```
```ts
["vs@light", "vs-dark@dark"]
```
```ts
["monaco:vs@light", "codemirror:github-light@light", "dracula@dark"]
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`editorTheme`](EditorConfig.md#editortheme)
#### Defined in
[models.ts:748](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L748)
***
### emmet
> **emmet**: `boolean`
Enables [Emmet](https://livecodes.io/docs/features/editor-settings#emmet).
#### Default
```ts
true
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`emmet`](EditorConfig.md#emmet)
#### Defined in
[models.ts:807](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L807)
***
### enableAI
> **enableAI**: `boolean`
If `true`, [AI code assistant](https://livecodes.io/docs/features/ai) is enabled.
#### Default
```ts
false
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`enableAI`](EditorConfig.md#enableai)
#### Defined in
[models.ts:818](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L818)
***
### foldRegions
> **foldRegions**: `boolean`
When set to `true`, regions marked by `#region` and `#endregion` comments are folded when the project is loaded.
#### Default
```ts
false
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`foldRegions`](EditorConfig.md#foldregions)
#### Defined in
[models.ts:795](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L795)
***
### fontFamily
> **fontFamily**: `undefined` \| `string`
Sets the [code editor](https://livecodes.io/docs/features/editor-settings) font family.
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`fontFamily`](EditorConfig.md#fontfamily)
#### Defined in
[models.ts:753](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L753)
***
### fontSize
> **fontSize**: `undefined` \| `number`
Sets the font size.
If `undefined` (the default), the font size is set to 14 for the full app and 12 for [embeds](https://livecodes.io/docs/features/embeds).
#### Default
```ts
undefined
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`fontSize`](EditorConfig.md#fontsize)
#### Defined in
[models.ts:761](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L761)
***
### formatOnsave
> **formatOnsave**: `boolean`
If `true`, the code is automatically [formatted](https://livecodes.io/docs/features/code-format) on saving the project.
#### Default
```ts
false
```
#### Defined in
[models.ts:676](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L676)
***
### layout
> **layout**: `undefined` \| `"horizontal"` \| `"vertical"` \| `"responsive"`
Sets the app layout to horizontal or vertical.
If set to `"responsive"` (the default) or `undefined`,
the layout is vertical in small screens when the playground height is larger than its width,
otherwise horizontal.
#### Default
```ts
"responsive"
```
#### Defined in
[models.ts:685](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L685)
***
### lineNumbers
> **lineNumbers**: `boolean` \| `"relative"`
Show line numbers in [code editor](https://livecodes.io/docs/features/editor-settings).
#### Default
```ts
true
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`lineNumbers`](EditorConfig.md#linenumbers)
#### Defined in
[models.ts:783](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L783)
***
### recoverUnsaved
> **recoverUnsaved**: `boolean`
Enables [recovering last unsaved project](https://livecodes.io/docs/features/recover) when the app is reopened.
#### Default
```ts
true
```
#### Defined in
[models.ts:691](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L691)
***
### semicolons
> **semicolons**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use semi-colons.
#### Default
```ts
true
```
#### Inherited from
[`FormatterConfig`](FormatterConfig.md).[`semicolons`](FormatterConfig.md#semicolons)
#### Defined in
[models.ts:838](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L838)
***
### showSpacing
> **showSpacing**: `boolean`
Enables [showing element spacing](https://livecodes.io/docs/features/result#show-spacings) in the result page.
#### Default
```ts
false
```
#### Defined in
[models.ts:697](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L697)
***
### singleQuote
> **singleQuote**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use single quotes instead of double quotes.
#### Default
```ts
false
```
#### Inherited from
[`FormatterConfig`](FormatterConfig.md).[`singleQuote`](FormatterConfig.md#singlequote)
#### Defined in
[models.ts:843](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L843)
***
### tabSize
> **tabSize**: `number`
The number of spaces per indentation-level.
Also used in [code formatting](https://livecodes.io/docs/features/code-format).
#### Default
```ts
2
```
#### Inherited from
[`FormatterConfig`](FormatterConfig.md).[`tabSize`](FormatterConfig.md#tabsize)
#### Defined in
[models.ts:777](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L777)
***
### theme
> **theme**: [`Theme`](../type-aliases/Theme.md)
Sets the app [theme](https://livecodes.io/docs/features/themes) to light/dark mode.
#### Default
```ts
"dark"
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`theme`](EditorConfig.md#theme)
#### Defined in
[models.ts:728](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L728)
***
### themeColor
> **themeColor**: `undefined` \| `string`
Sets the app theme color.
If `undefined`, it is set to `"hsl(214, 40%, 50%)"`.
#### Default
```ts
undefined
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`themeColor`](EditorConfig.md#themecolor)
#### Defined in
[models.ts:735](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L735)
***
### trailingComma
> **trailingComma**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use [trailing commas](https://prettier.io/docs/en/options.html#trailing-commas).
#### Default
```ts
true
```
#### Inherited from
[`FormatterConfig`](FormatterConfig.md).[`trailingComma`](FormatterConfig.md#trailingcomma)
#### Defined in
[models.ts:849](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L849)
***
### useTabs
> **useTabs**: `boolean`
If `true`, lines are indented with tabs instead of spaces.
Also used in [code formatting](https://livecodes.io/docs/features/code-format).
#### Default
```ts
false
```
#### Inherited from
[`FormatterConfig`](FormatterConfig.md).[`useTabs`](FormatterConfig.md#usetabs)
#### Defined in
[models.ts:769](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L769)
***
### welcome
> **welcome**: `boolean`
If `true`, the [welcome screen](https://livecodes.io/docs/features/welcome) is displayed when the app loads.
#### Defined in
[models.ts:702](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L702)
***
### wordWrap
> **wordWrap**: `boolean`
Enables word-wrap for long lines.
#### Default
```ts
false
```
#### Inherited from
[`EditorConfig`](EditorConfig.md).[`wordWrap`](EditorConfig.md#wordwrap)
#### Defined in
[models.ts:789](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L789)
---
# Type Alias: APICommands
> **APICommands**: `"setBroadcastToken"` \| `"showVersion"`
## Defined in
[models.ts:280](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L280)
---
# Type Alias: AppLanguage
> **AppLanguage**: `"auto"` \| `"ar"` \| `"de"` \| `"en"` \| `"es"` \| `"fr"` \| `"hi"` \| `"it"` \| `"ja"` \| `"pt"` \| `"ru"` \| `"ur"` \| `"zh-CN"`
## Defined in
[models.ts:1778](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1778)
---
# Type Alias: CDN
> **CDN**: `"jspm"` \| `"skypack"` \| `"jsdelivr"` \| `"fastly.jsdelivr"` \| `"gcore.jsdelivr"` \| `"testingcf.jsdelivr"` \| `"jsdelivr.b-cdn"` \| `"jsdelivr.gh"` \| `"fastly.jsdelivr.gh"` \| `"gcore.jsdelivr.gh"` \| `"testingcf.jsdelivr.gh"` \| `"jsdelivr.b-cdn.gh"` \| `"jsdelivr.esm"` \| `"fastly.jsdelivr.esm"` \| `"gcore.jsdelivr.esm"` \| `"testingcf.jsdelivr.esm"` \| `"jsdelivr.b-cdn.esm"` \| `"esm.run"` \| `"esm.sh"` \| `"esbuild"` \| `"bundle.run"` \| `"unpkg"` \| `"npmcdn"` \| `"statically"`
## Defined in
[models.ts:1861](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1861)
---
# Type Alias: CodejarTheme
> **CodejarTheme**: `"a11y-dark"` \| `"atom-dark"` \| `"base16-ateliersulphurpool-light"` \| `"catppuccin-latte"` \| `"catppuccin-frappe"` \| `"catppuccin-macchiato"` \| `"catppuccin-mocha"` \| `"cb"` \| `"coldark-cold"` \| `"coldark-dark"` \| `"coy"` \| `"coy-without-shadows"` \| `"darcula"` \| `"dark"` \| `"dracula"` \| `"duotone-dark"` \| `"duotone-earth"` \| `"duotone-forest"` \| `"duotone-light"` \| `"duotone-sea"` \| `"duotone-space"` \| `"funky"` \| `"ghcolors"` \| `"gruvbox-dark"` \| `"gruvbox-light"` \| `"holi-theme"` \| `"hopscotch"` \| `"laserwave"` \| `"lucario"` \| `"material-dark"` \| `"material-light"` \| `"material-oceanic"` \| `"monochrome"` \| `"monochrome-dark"` \| `"night-owl"` \| `"nord"` \| `"nord-2"` \| `"okaidia"` \| `"one-dark"` \| `"one-light"` \| `"pojoaque"` \| `"shades-of-purple"` \| `"solarized-dark-atom"` \| `"solarized-light"` \| `"synthwave84"` \| `"tomorrow"` \| `"twilight"` \| `"vs"` \| `"vsc-dark-plus"` \| `"xonokai"` \| `"z-touchs"`
## Defined in
[models.ts:1687](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1687)
---
# Type Alias: CodemirrorTheme
> **CodemirrorTheme**: `"amy"` \| `"aura"` \| `"ayu-light"` \| `"barf"` \| `"basic-light"` \| `"basic-dark"` \| `"bespin"` \| `"birds-of-paradise"` \| `"boys-and-girls"` \| `"catppuccin-latte"` \| `"catppuccin-frappe"` \| `"catppuccin-macchiato"` \| `"catppuccin-mocha"` \| `"clouds"` \| `"cm-light"` \| `"cobalt"` \| `"cool-glow"` \| `"dracula"` \| `"espresso"` \| `"github-dark"` \| `"github-light"` \| `"gruvbox-dark"` \| `"gruvbox-light"` \| `"material-dark"` \| `"material-light"` \| `"monochrome"` \| `"monochrome-dark"` \| `"noctis-lilac"` \| `"nord"` \| `"one-dark"` \| `"rose-pine-dawn"` \| `"smoothy"` \| `"solarized-light"` \| `"solarized-dark"` \| `"tokyo-night"` \| `"tokyo-night-day"` \| `"tokyo-night-storm"` \| `"tomorrow"`
## Defined in
[models.ts:1647](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1647)
---
# Type Alias: CssPresetId
> **CssPresetId**: `""` \| `"normalize.css"` \| `"reset-css"`
## Defined in
[models.ts:1269](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1269)
---
# Type Alias: EditorId
> **EditorId**: `"markup"` \| `"style"` \| `"script"`
## Defined in
[models.ts:1168](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1168)
---
# Type Alias: EditorTheme
> **EditorTheme**: [`MonacoTheme`](MonacoTheme.md) \| [`CodemirrorTheme`](CodemirrorTheme.md) \| [`CodejarTheme`](CodejarTheme.md) \| \`$\{MonacoTheme\}@$\{Theme\}\` \| \`$\{CodemirrorTheme\}@$\{Theme\}\` \| \`$\{CodejarTheme\}@$\{Theme\}\` \| \`monaco:$\{MonacoTheme\}\` \| \`codemirror:$\{CodemirrorTheme\}\` \| \`codejar:$\{CodejarTheme\}\` \| \`monaco:$\{MonacoTheme\}@$\{Theme\}\` \| \`codemirror:$\{CodemirrorTheme\}@$\{Theme\}\` \| \`codejar:$\{CodejarTheme\}@$\{Theme\}\`
## Defined in
[models.ts:1740](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1740)
---
# Type Alias: MonacoTheme
> **MonacoTheme**: `"active4d"` \| `"all-hallows-eve"` \| `"amy"` \| `"birds-of-paradise"` \| `"blackboard"` \| `"brilliance-black"` \| `"brilliance-dull"` \| `"catppuccin-latte"` \| `"catppuccin-frappe"` \| `"catppuccin-macchiato"` \| `"catppuccin-mocha"` \| `"chrome-devtools"` \| `"clouds-midnight"` \| `"clouds"` \| `"cobalt"` \| `"cobalt2"` \| `"custom-vs-light"` \| `"custom-vs-dark"` \| `"dawn"` \| `"dracula"` \| `"dreamweaver"` \| `"eiffel"` \| `"espresso-libre"` \| `"github"` \| `"github-dark"` \| `"github-light"` \| `"hc-black"` \| `"hc-light"` \| `"idle"` \| `"idlefingers"` \| `"iplastic"` \| `"katzenmilch"` \| `"krtheme"` \| `"kuroir"` \| `"lazy"` \| `"magicwb-amiga"` \| `"merbivore-soft"` \| `"merbivore"` \| `"monochrome"` \| `"monochrome-dark"` \| `"monokai"` \| `"monokai-bright"` \| `"monoindustrial"` \| `"night-owl"` \| `"nord"` \| `"oceanic-next"` \| `"pastels-on-dark"` \| `"slush-and-poppies"` \| `"solarized-dark"` \| `"solarized-light"` \| `"spacecadet"` \| `"sunburst"` \| `"textmate-mac-classic"` \| `"tomorrow"` \| `"tomorrow-night"` \| `"tomorrow-night-blue"` \| `"tomorrow-night-bright"` \| `"tomorrow-night-eighties"` \| `"twilight"` \| `"upstream-sunburst"` \| `"vibrant-ink"` \| `"vs"` \| `"vs-dark"` \| `"xcode-default"` \| `"zenburnesque"`
## Defined in
[models.ts:1580](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1580)
---
# Type Alias: Processor
> **Processor**: `"postcss"` \| `"postcssImportUrl"` \| `"tailwindcss"` \| `"windicss"` \| `"unocss"` \| `"tokencss"` \| `"lightningcss"` \| `"autoprefixer"` \| `"postcssPresetEnv"` \| `"cssmodules"` \| `"purgecss"` \| `"cssnano"`
## Defined in
[models.ts:1226](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1226)
---
# Type Alias: TemplateName
> **TemplateName**: `"blank"` \| `"javascript"` \| `"typescript"` \| `"react"` \| `"react-native"` \| `"vue2"` \| `"vue"` \| `"angular"` \| `"preact"` \| `"svelte"` \| `"solid"` \| `"lit"` \| `"stencil"` \| `"mdx"` \| `"astro"` \| `"riot"` \| `"malina"` \| `"jquery"` \| `"backbone"` \| `"knockout"` \| `"jest"` \| `"jest-react"` \| `"bootstrap"` \| `"tailwindcss"` \| `"shadcn-ui"` \| `"daisyui"` \| `"d3"` \| `"phaser"` \| `"coffeescript"` \| `"livescript"` \| `"civet"` \| `"clio"` \| `"imba"` \| `"rescript"` \| `"reason"` \| `"ocaml"` \| `"python"` \| `"pyodide"` \| `"python-wasm"` \| `"r"` \| `"ruby"` \| `"ruby-wasm"` \| `"go"` \| `"php"` \| `"php-wasm"` \| `"cpp"` \| `"clang"` \| `"cpp-wasm"` \| `"java"` \| `"csharp-wasm"` \| `"perl"` \| `"lua"` \| `"lua-wasm"` \| `"teal"` \| `"fennel"` \| `"julia"` \| `"scheme"` \| `"commonlisp"` \| `"clojurescript"` \| `"gleam"` \| `"tcl"` \| `"markdown"` \| `"assemblyscript"` \| `"wat"` \| `"sql"` \| `"postgresql"` \| `"prolog"` \| `"blockly"` \| `"diagrams"`
## Defined in
[models.ts:1376](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1376)
---
# Type Alias: Theme
> **Theme**: `"light"` \| `"dark"`
## Defined in
[models.ts:1926](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1926)
---
# Type Alias: ToolsPaneStatus
> **ToolsPaneStatus**: `"closed"` \| `"open"` \| `"full"` \| `"none"` \| `""`
## Defined in
[models.ts:1456](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1456)
---
# Type Alias: WatchCode()
> **WatchCode**: (`event`, `fn`) => `object`
Called when the playground "content" is changed (see [`getCode`](https://livecodes.io/docs/sdk/js-ts#getcode) and [`getConfig`](https://livecodes.io/docs/sdk/js-ts#getcode)).
This includes changes in:
- Code (in editors)
- Editor [languages](https://livecodes.io/docs/languages/)
- [CSS processors](https://livecodes.io/docs/features/css#css-processors)
- [External resources](https://livecodes.io/docs/features/external-resources)
- Project info (e.g. allows adding content in page head and attributes to `` element)
- [Custom settings](https://livecodes.io/docs/advanced/custom-settings) (e.g. allows changing [import maps](https://livecodes.io/docs/features/module-resolution#custom-module-resolution))
- Project title
- [Test](https://livecodes.io/docs/features/tests) code
## Parameters
• **event**: `"code"`
• **fn**
## Returns
`object`
### remove()
> **remove**: () => `void`
#### Returns
`void`
## Defined in
[models.ts:248](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L248)
---
# Type Alias: WatchConsole()
> **WatchConsole**: (`event`, `fn`) => `object`
## Parameters
• **event**: `"console"`
• **fn**
## Returns
`object`
### remove()
> **remove**: () => `void`
#### Returns
`void`
## Defined in
[models.ts:253](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L253)
---
# Type Alias: WatchDestroy()
> **WatchDestroy**: (`event`, `fn`) => `object`
## Parameters
• **event**: `"destroy"`
• **fn**
## Returns
`object`
### remove()
> **remove**: () => `void`
#### Returns
`void`
## Defined in
[models.ts:263](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L263)
---
# Type Alias: WatchLoad()
> **WatchLoad**: (`event`, `fn`) => `object`
Called when the playground first loads.
## Parameters
• **event**: `"load"`
• **fn**
## Returns
`object`
### remove()
> **remove**: () => `void`
#### Returns
`void`
## Defined in
[models.ts:225](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L225)
---
# Type Alias: WatchReady()
> **WatchReady**: (`event`, `fn`) => `object`
Called when a new project is loaded (including when [imported](https://livecodes.io/docs/features/import)) and the playground is ready to run.
## Parameters
• **event**: `"ready"`
• **fn**
## Returns
`object`
### remove()
> **remove**: () => `void`
#### Returns
`void`
## Defined in
[models.ts:230](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L230)
---
# Type Alias: WatchTests()
> **WatchTests**: (`event`, `fn`) => `object`
## Parameters
• **event**: `"tests"`
• **fn**
## Returns
`object`
### remove()
> **remove**: () => `void`
#### Returns
`void`
## Defined in
[models.ts:258](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L258)
---
# Interface: Code
An object that contains the language, content and compiled code for each of the 3 [code editors](https://livecodes.io/docs/features/projects)
and the [result page](https://livecodes.io/docs/features/result) HTML.
See [docs](https://livecodes.io/docs/api/interfaces/Code) for details.
## Properties
### markup
> **markup**: `object`
#### compiled
> **compiled**: `string`
#### content
> **content**: `string`
#### language
> **language**: [`Language`](../type-aliases/Language.md)
#### Defined in
[models.ts:1908](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1908)
***
### result
> **result**: `string`
#### Defined in
[models.ts:1923](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1923)
***
### script
> **script**: `object`
#### compiled
> **compiled**: `string`
#### content
> **content**: `string`
#### language
> **language**: [`Language`](../type-aliases/Language.md)
#### Defined in
[models.ts:1918](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1918)
***
### style
> **style**: `object`
#### compiled
> **compiled**: `string`
#### content
> **content**: `string`
#### language
> **language**: [`Language`](../type-aliases/Language.md)
#### Defined in
[models.ts:1913](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L1913)
---
# Interface: Config
The playground [configuration object](https://livecodes.io/docs/configuration/configuration-object).
It is an object that holds the configuration and state of the playground.
See [docs](https://livecodes.io/docs/configuration/configuration-object) for details.
## Extends
- [`ContentConfig`](../internal/interfaces/ContentConfig.md).[`AppConfig`](../internal/interfaces/AppConfig.md).[`UserConfig`](../internal/interfaces/UserConfig.md)
## Properties
### activeEditor
> **activeEditor**: `undefined` \| [`EditorId`](../internal/type-aliases/EditorId.md)
Selects the active editor to show.
Defaults to the last used editor for user, otherwise `"markup"`
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`activeEditor`](../internal/interfaces/ContentConfig.md#activeeditor)
#### Defined in
[models.ts:455](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L455)
***
### allowLangChange
> **allowLangChange**: `boolean`
If `false`, the UI will not show the menu that allows changing editor language.
#### Default
```ts
true
```
#### Inherited from
[`AppConfig`](../internal/interfaces/AppConfig.md).[`allowLangChange`](../internal/interfaces/AppConfig.md#allowlangchange)
#### Defined in
[models.ts:603](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L603)
***
### appLanguage
> **appLanguage**: `undefined` \| [`AppLanguage`](../internal/type-aliases/AppLanguage.md)
Sets the app UI language used.
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`appLanguage`](../internal/interfaces/UserConfig.md#applanguage)
#### Defined in
[models.ts:707](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L707)
***
### autosave
> **autosave**: `boolean`
If `true`, the project is automatically saved on code change,
after time [delay](https://livecodes.io/docs/configuration/configuration-object#delay).
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`autosave`](../internal/interfaces/UserConfig.md#autosave)
#### Defined in
[models.ts:656](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L656)
***
### autotest
> **autotest**: `boolean`
If `true`, the project is watched for code changes which trigger tests to auto-run.
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`autotest`](../internal/interfaces/UserConfig.md#autotest)
#### Defined in
[models.ts:662](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L662)
***
### autoupdate
> **autoupdate**: `boolean`
If `true`, the result page is automatically updated on code change,
after time [delay](https://livecodes.io/docs/configuration/configuration-object#delay).
#### Default
```ts
true
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`autoupdate`](../internal/interfaces/UserConfig.md#autoupdate)
#### Defined in
[models.ts:649](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L649)
***
### closeBrackets
> **closeBrackets**: `boolean`
Use auto-complete to close brackets and quotes.
#### Default
```ts
true
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`closeBrackets`](../internal/interfaces/UserConfig.md#closebrackets)
#### Defined in
[models.ts:801](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L801)
***
### cssPreset
> **cssPreset**: [`CssPresetId`](../internal/type-aliases/CssPresetId.md)
[CSS Preset](https://livecodes.io/docs/features/external-resources#css-presets) to use.
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`cssPreset`](../internal/interfaces/ContentConfig.md#csspreset)
#### Defined in
[models.ts:502](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L502)
***
### customSettings
> **customSettings**: `object`
Defines [custom settings](https://livecodes.io/docs/advanced/custom-settings) for the current project.
#### adoc
> **adoc**: `any`
#### app.svelte
> **svelte**: `any`
#### app.vue
> **vue**: `any`
#### art
> **art**: `any`
#### art-template
> **art-template**: `any`
#### as
> **as**: `any`
#### asc
> **asc**: `any`
#### asciidoc
> **asciidoc**: `any`
#### assemblyscript
> **assemblyscript**: `any`
#### astro
> **astro**: `any`
#### autoprefixer
> **autoprefixer**: `any`
#### babel
> **babel**: `any`
#### bb
> **bb**: `any`
#### bbcode
> **bbcode**: `any`
#### Binary
> **Binary**: `any`
#### blockly
> **blockly**: `any`
#### blockly.xml
> **xml**: `any`
#### c
> **c**: `any`
#### C
> **C**: `any`
#### c++
> **c++**: `any`
#### civet
> **civet**: `any`
#### clang
> **clang**: `any`
#### clang.cpp
> **cpp**: `any`
#### clio
> **clio**: `any`
#### clj
> **clj**: `any`
#### cljc
> **cljc**: `any`
#### cljs
> **cljs**: `any`
#### clojure
> **clojure**: `any`
#### clojurescript
> **clojurescript**: `any`
#### coffee
> **coffee**: `any`
#### coffeescript
> **coffeescript**: `any`
#### common-lisp
> **common-lisp**: `any`
#### commonlisp
> **commonlisp**: `any`
#### convertCommonjs?
> `optional` **convertCommonjs**: `boolean`
#### cp
> **cp**: `any`
#### cpp
> **cpp**: `any`
#### cpp-wasm
> **cpp-wasm**: `any`
#### cppm
> **cppm**: `any`
#### cppwasm
> **cppwasm**: `any`
#### cs
> **cs**: `any`
#### cs-wasm
> **cs-wasm**: `any`
#### csharp
> **csharp**: `any`
#### csharp-wasm
> **csharp-wasm**: `any`
#### css
> **css**: `any`
#### cssmodules
> **cssmodules**: `any`
#### cssnano
> **cssnano**: `any`
#### cwasm
> **cwasm**: `any`
#### cxx
> **cxx**: `any`
#### defaultCDN?
> `optional` **defaultCDN**: [`CDN`](../internal/type-aliases/CDN.md)
#### diagram
> **diagram**: `any`
#### diagrams
> **diagrams**: `any`
#### dot
> **dot**: `any`
#### edn
> **edn**: `any`
#### ejs
> **ejs**: `any`
#### es
> **es**: `any`
#### eta
> **eta**: `any`
#### fennel
> **fennel**: `any`
#### flow
> **flow**: `any`
#### fnl
> **fnl**: `any`
#### gleam
> **gleam**: `any`
#### go
> **go**: `any`
#### golang
> **golang**: `any`
#### graph
> **graph**: `any`
#### h
> **h**: `any`
#### haml
> **haml**: `any`
#### handlebars
> **handlebars**: `any`
#### hbs
> **hbs**: `any`
#### hpp
> **hpp**: `any`
#### htm
> **htm**: `any`
#### html
> **html**: `any`
#### ii
> **ii**: `any`
#### imba
> **imba**: `any`
#### imports?
> `optional` **imports**: `Record`\<`string`, `string`\>
#### ixx
> **ixx**: `any`
#### jade
> **jade**: `any`
#### java
> **java**: `any`
#### javascript
> **javascript**: `any`
#### jinja
> **jinja**: `any`
#### jl
> **jl**: `any`
#### js
> **js**: `any`
#### json
> **json**: `any`
#### jsx
> **jsx**: `any`
#### julia
> **julia**: `any`
#### less
> **less**: `any`
#### lightningcss
> **lightningcss**: `any`
#### liquid
> **liquid**: `any`
#### liquidjs
> **liquidjs**: `any`
#### lisp
> **lisp**: `any`
#### livescript
> **livescript**: `any`
#### ls
> **ls**: `any`
#### lua
> **lua**: `any`
#### lua-wasm
> **lua-wasm**: `any`
#### luawasm
> **luawasm**: `any`
#### malina
> **malina**: `any`
#### malinajs
> **malinajs**: `any`
#### mapImports?
> `optional` **mapImports**: `boolean`
#### markdown
> **markdown**: `any`
#### md
> **md**: `any`
#### mdown
> **mdown**: `any`
#### mdx
> **mdx**: `any`
#### mjml
> **mjml**: `any`
#### mkdn
> **mkdn**: `any`
#### ml
> **ml**: `any`
#### mli
> **mli**: `any`
#### mustache
> **mustache**: `any`
#### njk
> **njk**: `any`
#### nunjucks
> **nunjucks**: `any`
#### ocaml
> **ocaml**: `any`
#### perl
> **perl**: `any`
#### pg
> **pg**: `any`
#### pg.sql
> **sql**: `any`
#### pglite
> **pglite**: `any`
#### pglite.sql
> **sql**: `any`
#### pgsql
> **pgsql**: `any`
#### pgsql.sql
> **sql**: `any`
#### php
> **php**: `any`
#### php-wasm
> **php-wasm**: `any`
#### phpwasm
> **phpwasm**: `any`
#### pintora
> **pintora**: `any`
#### pl
> **pl**: `any`
#### plt
> **plt**: `any`
#### pm
> **pm**: `any`
#### postcss
> **postcss**: `any`
#### postcssImportUrl
> **postcssImportUrl**: `any`
#### postcssPresetEnv
> **postcssPresetEnv**: `any`
#### postgre.sql
> **sql**: `any`
#### postgres
> **postgres**: `any`
#### postgresql
> **postgresql**: `any`
#### postgresql.sql
> **sql**: `any`
#### prolog
> **prolog**: `any`
#### prolog.pl
> **pl**: `any`
#### pug
> **pug**: `any`
#### purgecss
> **purgecss**: `any`
#### py
> **py**: `any`
#### py-wasm
> **py-wasm**: `any`
#### py3
> **py3**: `any`
#### pyodide
> **pyodide**: `any`
#### python
> **python**: `any`
#### python-wasm
> **python-wasm**: `any`
#### pythonwasm
> **pythonwasm**: `any`
#### pywasm
> **pywasm**: `any`
#### r
> **r**: `any`
#### r-wasm
> **r-wasm**: `any`
#### rb
> **rb**: `any`
#### re
> **re**: `any`
#### react
> **react**: `any`
#### react-jsx
> **react-jsx**: `any`
#### react-native
> **react-native**: `any`
#### react-native-tsx
> **react-native-tsx**: `any`
#### react-native.jsx
> **jsx**: `any`
#### react-native.tsx
> **tsx**: `any`
#### react-tsx
> **react-tsx**: `any`
#### react.jsx
> **jsx**: `any`
#### react.tsx
> **tsx**: `any`
#### reason
> **reason**: `any`
#### rei
> **rei**: `any`
#### res
> **res**: `any`
#### rescript
> **rescript**: `any`
#### resi
> **resi**: `any`
#### rich
> **rich**: `any`
#### richtext
> **richtext**: `any`
#### riot
> **riot**: `any`
#### riotjs
> **riotjs**: `any`
#### rlang
> **rlang**: `any`
#### rstats
> **rstats**: `any`
#### rte
> **rte**: `any`
#### rte.html
> **html**: `any`
#### ruby
> **ruby**: `any`
#### ruby-wasm
> **ruby-wasm**: `any`
#### rubywasm
> **rubywasm**: `any`
#### sass
> **sass**: `any`
#### scheme
> **scheme**: `any`
#### scm
> **scm**: `any`
#### scriptType?
> `optional` **scriptType**: `""` \| `"module"` \| `"text/liquid"` \| `"text/python"` \| `"text/r"` \| `"text/ruby-wasm"` \| `"text/x-uniter-php"` \| `"text/php-wasm"` \| `"text/cpp"` \| `"text/java"` \| `"text/csharp-wasm"` \| `"text/perl"` \| `"text/julia"` \| `"text/biwascheme"` \| `"text/commonlisp"` \| `"text/tcl"` \| `"text/prolog"` \| `"application/json"` \| `"application/lua"` \| `"text/fennel"` \| `"application/wasm-uint8"` \| `"application/javascript"` \| `"application/ecmascript"` \| `"text/javascript"` \| `"text/ecmascript"`
#### scss
> **scss**: `any`
#### solid
> **solid**: `any`
#### solid.jsx
> **jsx**: `any`
#### solid.tsx
> **tsx**: `any`
#### sql
> **sql**: `any`
#### sqlite
> **sqlite**: `any`
#### sqlite3
> **sqlite3**: `any`
#### stencil
> **stencil**: `any`
#### stencil.tsx
> **tsx**: `any`
#### styl
> **styl**: `any`
#### stylis
> **stylis**: `any`
#### stylus
> **stylus**: `any`
#### sucrase
> **sucrase**: `any`
#### svelte
> **svelte**: `any`
#### svelte-app
> **svelte-app**: `any`
#### tailwindcss
> **tailwindcss**: `any`
#### tcl
> **tcl**: `any`
#### teal
> **teal**: `any`
#### template?
> `optional` **template**: `object`
#### template.data?
> `optional` **data**: `any`
#### template.prerender?
> `optional` **prerender**: `boolean`
#### tl
> **tl**: `any`
#### tokencss
> **tokencss**: `any`
#### ts
> **ts**: `any`
#### tsx
> **tsx**: `any`
#### twig
> **twig**: `any`
#### types?
> `optional` **types**: [`Types`](../internal/interfaces/Types.md)
#### typescript
> **typescript**: `any`
#### unocss
> **unocss**: `any`
#### vento
> **vento**: `any`
#### vto
> **vto**: `any`
#### vue
> **vue**: `any`
#### vue-app
> **vue-app**: `any`
#### vue2
> **vue2**: `any`
#### vue3
> **vue3**: `any`
#### wasm
> **wasm**: `any`
#### wasm.cpp
> **cpp**: `any`
#### wasm.cs
> **cs**: `any`
#### wasm.lua
> **lua**: `any`
#### wasm.php
> **php**: `any`
#### wasm.py
> **py**: `any`
#### wasm.rb
> **rb**: `any`
#### wast
> **wast**: `any`
#### wat
> **wat**: `any`
#### webassembly
> **webassembly**: `any`
#### windicss
> **windicss**: `any`
#### xht
> **xht**: `any`
#### xml
> **xml**: `any`
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`customSettings`](../internal/interfaces/ContentConfig.md#customsettings)
#### Defined in
[models.ts:514](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L514)
***
### delay
> **delay**: `number`
Time delay (in milliseconds) following code change,
after which the result page is updated (if [`autoupdate`](https://livecodes.io/docs/configuration/configuration-object#autoupdate) is `true`)
and/or the project is saved (if [`autosave`](https://livecodes.io/docs/configuration/configuration-object#autosave) is `true`).
#### Default
```ts
1500
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`delay`](../internal/interfaces/UserConfig.md#delay)
#### Defined in
[models.ts:670](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L670)
***
### description
> **description**: `string`
Project description. Used in [project](https://livecodes.io/docs/features/projects) search
and [result page](https://livecodes.io/docs/features/result) description meta tag.
#### Default
```ts
""
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`description`](../internal/interfaces/ContentConfig.md#description)
#### Defined in
[models.ts:425](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L425)
***
### editor
> **editor**: `undefined` \| `"auto"` \| `"monaco"` \| `"codemirror"` \| `"codejar"`
Selects the [code editor](https://livecodes.io/docs/features/editor-settings#code-editor) to use.
If `undefined` (the default), Monaco editor is used on desktop,
CodeMirror is used on mobile and in `simple` mode,
while CodeJar is used in `codeblock` mode, in `lite` mode and in `readonly` playgrounds.
If set to `auto`, Monaco editor is used on desktop and CodeMirror is used on mobile regardless of other settings.
#### Default
```ts
undefined
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`editor`](../internal/interfaces/UserConfig.md#editor)
#### Defined in
[models.ts:722](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L722)
***
### editorMode
> **editorMode**: `undefined` \| `"vim"` \| `"emacs"`
Sets [editor mode](https://livecodes.io/docs/features/editor-settings#editor-modes).
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`editorMode`](../internal/interfaces/UserConfig.md#editormode)
#### Defined in
[models.ts:812](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L812)
***
### editorTheme
> **editorTheme**: `undefined` \| `string` \| [`EditorTheme`](../internal/type-aliases/EditorTheme.md)[]
Sets the [code editor](https://livecodes.io/docs/features/editor-settings) themes.
See docs for [editor themes](https://livecodes.io/docs/configuration/configuration-object#editortheme) for details.
#### Examples
```ts
"vs"
```
```ts
"monaco:twilight, codemirror:one-dark"
```
```ts
["vs@light"]
```
```ts
["vs@light", "vs-dark@dark"]
```
```ts
["monaco:vs@light", "codemirror:github-light@light", "dracula@dark"]
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`editorTheme`](../internal/interfaces/UserConfig.md#editortheme)
#### Defined in
[models.ts:748](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L748)
***
### emmet
> **emmet**: `boolean`
Enables [Emmet](https://livecodes.io/docs/features/editor-settings#emmet).
#### Default
```ts
true
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`emmet`](../internal/interfaces/UserConfig.md#emmet)
#### Defined in
[models.ts:807](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L807)
***
### enableAI
> **enableAI**: `boolean`
If `true`, [AI code assistant](https://livecodes.io/docs/features/ai) is enabled.
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`enableAI`](../internal/interfaces/UserConfig.md#enableai)
#### Defined in
[models.ts:818](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L818)
***
### foldRegions
> **foldRegions**: `boolean`
When set to `true`, regions marked by `#region` and `#endregion` comments are folded when the project is loaded.
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`foldRegions`](../internal/interfaces/UserConfig.md#foldregions)
#### Defined in
[models.ts:795](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L795)
***
### fontFamily
> **fontFamily**: `undefined` \| `string`
Sets the [code editor](https://livecodes.io/docs/features/editor-settings) font family.
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`fontFamily`](../internal/interfaces/UserConfig.md#fontfamily)
#### Defined in
[models.ts:753](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L753)
***
### fontSize
> **fontSize**: `undefined` \| `number`
Sets the font size.
If `undefined` (the default), the font size is set to 14 for the full app and 12 for [embeds](https://livecodes.io/docs/features/embeds).
#### Default
```ts
undefined
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`fontSize`](../internal/interfaces/UserConfig.md#fontsize)
#### Defined in
[models.ts:761](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L761)
***
### formatOnsave
> **formatOnsave**: `boolean`
If `true`, the code is automatically [formatted](https://livecodes.io/docs/features/code-format) on saving the project.
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`formatOnsave`](../internal/interfaces/UserConfig.md#formatonsave)
#### Defined in
[models.ts:676](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L676)
***
### head
> **head**: `string`
Content added to the [result page](https://livecodes.io/docs/features/result) `` element.
#### Default
```ts
'\n'
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`head`](../internal/interfaces/ContentConfig.md#head)
#### Defined in
[models.ts:431](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L431)
***
### htmlAttrs
> **htmlAttrs**: `string` \| `Record`\<`string`, `string`\>
Attributes added to the [result page](https://livecodes.io/docs/features/result) `` element.
It can be an object or a string.
#### Example
```ts
{ lang: "en", class: "dark" }
'lang="en" class="dark"'
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`htmlAttrs`](../internal/interfaces/ContentConfig.md#htmlattrs)
#### Defined in
[models.ts:440](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L440)
***
### imports
> **imports**: `object`
Allows specifying custom [import maps](https://github.com/WICG/import-maps) for [module imports](https://livecodes.io/docs/features/module-resolution#custom-module-resolution).
**Example**
Setting `imports` like this:
```js
"imports": {
"moment": "https://cdn.jsdelivr.net/npm/moment@2.29.4/dist/moment.js"
}
```
results in the following import map:
```html
```
See docs for [Imports](https://livecodes.io/docs/configuration/configuration-object#imports)
and [Custom Module Resolution](https://livecodes.io/docs/features/module-resolution/#custom-module-resolution)
#### Index Signature
\[`key`: `string`\]: `string`
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`imports`](../internal/interfaces/ContentConfig.md#imports-1)
#### Defined in
[models.ts:540](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L540)
***
### languages
> **languages**: `undefined` \| (`"reason"` \| `"stylus"` \| `"r"` \| `"html"` \| `"ruby"` \| `"rb"` \| `"json"` \| `"teal"` \| `"solid"` \| `"flow"` \| `"dot"` \| `"as"` \| `"go"` \| `"htm"` \| `"markdown"` \| `"md"` \| `"mdown"` \| `"mkdn"` \| `"mdx"` \| `"astro"` \| `"pug"` \| `"jade"` \| `"haml"` \| `"asciidoc"` \| `"adoc"` \| `"asc"` \| `"mustache"` \| `"handlebars"` \| `"hbs"` \| `"ejs"` \| `"eta"` \| `"nunjucks"` \| `"njk"` \| `"liquid"` \| `"liquidjs"` \| `"twig"` \| `"vento"` \| `"vto"` \| `"art-template"` \| `"art"` \| `"jinja"` \| `"bbcode"` \| `"bb"` \| `"mjml"` \| `"diagrams"` \| `"diagram"` \| `"graph"` \| `"plt"` \| `"richtext"` \| `"rte"` \| `"rich"` \| `"rte.html"` \| `"css"` \| `"scss"` \| `"sass"` \| `"less"` \| `"styl"` \| `"stylis"` \| `"postcss"` \| `"javascript"` \| `"js"` \| `"babel"` \| `"es"` \| `"sucrase"` \| `"typescript"` \| `"ts"` \| `"jsx"` \| `"tsx"` \| `"react"` \| `"react-jsx"` \| `"react.jsx"` \| `"react-tsx"` \| `"react.tsx"` \| `"react-native"` \| `"react-native.jsx"` \| `"react-native-tsx"` \| `"react-native.tsx"` \| `"vue"` \| `"vue3"` \| `"vue2"` \| `"vue-app"` \| `"app.vue"` \| `"svelte"` \| `"svelte-app"` \| `"app.svelte"` \| `"stencil"` \| `"stencil.tsx"` \| `"solid.jsx"` \| `"solid.tsx"` \| `"riot"` \| `"riotjs"` \| `"malina"` \| `"malinajs"` \| `"xht"` \| `"coffeescript"` \| `"coffee"` \| `"livescript"` \| `"ls"` \| `"civet"` \| `"clio"` \| `"imba"` \| `"assemblyscript"` \| `"python"` \| `"py"` \| `"pyodide"` \| `"python-wasm"` \| `"py-wasm"` \| `"pythonwasm"` \| `"pywasm"` \| `"py3"` \| `"wasm.py"` \| `"rlang"` \| `"rstats"` \| `"r-wasm"` \| `"ruby-wasm"` \| `"wasm.rb"` \| `"rubywasm"` \| `"golang"` \| `"php"` \| `"php-wasm"` \| `"phpwasm"` \| `"wasm.php"` \| `"cpp"` \| `"c"` \| `"C"` \| `"cp"` \| `"cxx"` \| `"c++"` \| `"cppm"` \| `"ixx"` \| `"ii"` \| `"hpp"` \| `"h"` \| `"cpp-wasm"` \| `"cppwasm"` \| `"cwasm"` \| `"wasm.cpp"` \| `"clang"` \| `"clang.cpp"` \| `"java"` \| `"csharp"` \| `"csharp-wasm"` \| `"cs"` \| `"cs-wasm"` \| `"wasm.cs"` \| `"perl"` \| `"pl"` \| `"pm"` \| `"lua"` \| `"lua-wasm"` \| `"luawasm"` \| `"wasm.lua"` \| `"tl"` \| `"fennel"` \| `"fnl"` \| `"julia"` \| `"jl"` \| `"scheme"` \| `"scm"` \| `"commonlisp"` \| `"common-lisp"` \| `"lisp"` \| `"clojurescript"` \| `"clojure"` \| `"cljs"` \| `"clj"` \| `"cljc"` \| `"edn"` \| `"gleam"` \| `"rescript"` \| `"res"` \| `"resi"` \| `"re"` \| `"rei"` \| `"ocaml"` \| `"ml"` \| `"mli"` \| `"tcl"` \| `"wat"` \| `"wast"` \| `"webassembly"` \| `"wasm"` \| `"Binary"` \| `"sql"` \| `"sqlite"` \| `"sqlite3"` \| `"pg.sql"` \| `"pgsql.sql"` \| `"pgsql"` \| `"pg"` \| `"pglite"` \| `"pglite.sql"` \| `"postgresql"` \| `"postgres"` \| `"postgre.sql"` \| `"postgresql.sql"` \| `"prolog.pl"` \| `"prolog"` \| `"blockly"` \| `"blockly.xml"` \| `"xml"` \| `"pintora"` \| `"tailwindcss"` \| `"postcssImportUrl"` \| `"windicss"` \| `"unocss"` \| `"tokencss"` \| `"lightningcss"` \| `"autoprefixer"` \| `"postcssPresetEnv"` \| `"cssmodules"` \| `"purgecss"` \| `"cssnano"`)[]
List of enabled languages.
Defaults to all supported languages in full app and only current editor languages in [embeds](https://livecodes.io/docs/features/embeds).
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`languages`](../internal/interfaces/ContentConfig.md#languages)
#### Defined in
[models.ts:462](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L462)
***
### layout
> **layout**: `undefined` \| `"horizontal"` \| `"vertical"` \| `"responsive"`
Sets the app layout to horizontal or vertical.
If set to `"responsive"` (the default) or `undefined`,
the layout is vertical in small screens when the playground height is larger than its width,
otherwise horizontal.
#### Default
```ts
"responsive"
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`layout`](../internal/interfaces/UserConfig.md#layout)
#### Defined in
[models.ts:685](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L685)
***
### lineNumbers
> **lineNumbers**: `boolean` \| `"relative"`
Show line numbers in [code editor](https://livecodes.io/docs/features/editor-settings).
#### Default
```ts
true
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`lineNumbers`](../internal/interfaces/UserConfig.md#linenumbers)
#### Defined in
[models.ts:783](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L783)
***
### markup
> **markup**: `object`
An object that configures the language and content of the markup editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
#### content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### language
> **language**: [`Language`](../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### position?
> `optional` **position**: [`EditorPosition`](../internal/interfaces/EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### Default
```ts
{ language: "html", content: "" }
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`markup`](../internal/interfaces/ContentConfig.md#markup)
#### Defined in
[models.ts:470](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L470)
***
### mode
> **mode**: `"focus"` \| `"full"` \| `"result"` \| `"editor"` \| `"lite"` \| `"simple"` \| `"codeblock"`
Sets the [display mode](https://livecodes.io/docs/features/display-modes).
#### Default
```ts
"full"
```
#### Inherited from
[`AppConfig`](../internal/interfaces/AppConfig.md).[`mode`](../internal/interfaces/AppConfig.md#mode)
#### Defined in
[models.ts:615](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L615)
***
### processors
> **processors**: [`Processor`](../internal/type-aliases/Processor.md)[]
List of enabled [CSS processors](https://livecodes.io/docs/features/css/#css-processors).
For the list of available processors, see [Processor](https://livecodes.io/docs/api/internal/type-aliases/Processor)
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`processors`](../internal/interfaces/ContentConfig.md#processors)
#### Defined in
[models.ts:509](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L509)
***
### readonly
> **readonly**: `boolean`
If `true`, editors are loaded in read-only mode, where the user is not allowed to change the code.
By default, when readonly is set to true, the light-weight code editor [CodeJar](https://livecodes.io/docs/features/editor-settings#code-editor) is used.
If you wish to use another editor, set the [editor](https://livecodes.io/docs/configuration/configuration-object#editor) property.
#### Default
```ts
false
```
#### Inherited from
[`AppConfig`](../internal/interfaces/AppConfig.md).[`readonly`](../internal/interfaces/AppConfig.md#readonly)
#### Defined in
[models.ts:597](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L597)
***
### recoverUnsaved
> **recoverUnsaved**: `boolean`
Enables [recovering last unsaved project](https://livecodes.io/docs/features/recover) when the app is reopened.
#### Default
```ts
true
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`recoverUnsaved`](../internal/interfaces/UserConfig.md#recoverunsaved)
#### Defined in
[models.ts:691](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L691)
***
### script
> **script**: `object`
An object that configures the language and content of the script editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
#### content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### language
> **language**: [`Language`](../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### position?
> `optional` **position**: [`EditorPosition`](../internal/interfaces/EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### Default
```ts
{ language: "javascript", content: "" }
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`script`](../internal/interfaces/ContentConfig.md#script)
#### Defined in
[models.ts:486](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L486)
***
### scripts
> **scripts**: `string`[]
List of URLs for [external scripts](https://livecodes.io/docs/features/external-resources) to add to the [result page](https://livecodes.io/docs/features/result).
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`scripts`](../internal/interfaces/ContentConfig.md#scripts)
#### Defined in
[models.ts:496](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L496)
***
### semicolons
> **semicolons**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use semi-colons.
#### Default
```ts
true
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`semicolons`](../internal/interfaces/UserConfig.md#semicolons)
#### Defined in
[models.ts:838](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L838)
***
### showSpacing
> **showSpacing**: `boolean`
Enables [showing element spacing](https://livecodes.io/docs/features/result#show-spacings) in the result page.
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`showSpacing`](../internal/interfaces/UserConfig.md#showspacing)
#### Defined in
[models.ts:697](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L697)
***
### singleQuote
> **singleQuote**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use single quotes instead of double quotes.
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`singleQuote`](../internal/interfaces/UserConfig.md#singlequote)
#### Defined in
[models.ts:843](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L843)
***
### style
> **style**: `object`
An object that configures the language and content of the style editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
#### content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### language
> **language**: [`Language`](../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### position?
> `optional` **position**: [`EditorPosition`](../internal/interfaces/EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### Default
```ts
{ language: "css", content: "" }
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`style`](../internal/interfaces/ContentConfig.md#style)
#### Defined in
[models.ts:478](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L478)
***
### stylesheets
> **stylesheets**: `string`[]
List of URLs for [external stylesheets](https://livecodes.io/docs/features/external-resources) to add to the [result page](https://livecodes.io/docs/features/result).
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`stylesheets`](../internal/interfaces/ContentConfig.md#stylesheets)
#### Defined in
[models.ts:491](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L491)
***
### tabSize
> **tabSize**: `number`
The number of spaces per indentation-level.
Also used in [code formatting](https://livecodes.io/docs/features/code-format).
#### Default
```ts
2
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`tabSize`](../internal/interfaces/UserConfig.md#tabsize)
#### Defined in
[models.ts:777](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L777)
***
### tags
> **tags**: `string`[]
Project tags.
Used in [project](https://livecodes.io/docs/features/projects) filter and search.
#### Default
```ts
[]
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`tags`](../internal/interfaces/ContentConfig.md#tags)
#### Defined in
[models.ts:447](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L447)
***
### tests
> **tests**: `undefined` \| `object`
Configures the [language](https://livecodes.io/docs/features/tests#supported-languages)
and content of [tests](https://livecodes.io/docs/features/tests).
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`tests`](../internal/interfaces/ContentConfig.md#tests)
#### Defined in
[models.ts:576](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L576)
***
### theme
> **theme**: [`Theme`](../internal/type-aliases/Theme.md)
Sets the app [theme](https://livecodes.io/docs/features/themes) to light/dark mode.
#### Default
```ts
"dark"
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`theme`](../internal/interfaces/UserConfig.md#theme)
#### Defined in
[models.ts:728](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L728)
***
### themeColor
> **themeColor**: `undefined` \| `string`
Sets the app theme color.
If `undefined`, it is set to `"hsl(214, 40%, 50%)"`.
#### Default
```ts
undefined
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`themeColor`](../internal/interfaces/UserConfig.md#themecolor)
#### Defined in
[models.ts:735](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L735)
***
### title
> **title**: `string`
Project title.
This is used as [result page](https://livecodes.io/docs/features/result) title and title meta tag.
Also used in project search.
#### Default
```ts
"Untitled Project"
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`title`](../internal/interfaces/ContentConfig.md#title-3)
#### Defined in
[models.ts:418](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L418)
***
### tools
> **tools**: `Partial`\<`object`\>
Sets enabled and active tools and status of [tools pane](https://livecodes.io/docs/features/tools-pane).
#### Type declaration
##### active
> **active**: `""` \| `"console"` \| `"compiled"` \| `"tests"`
##### enabled
> **enabled**: `"all"` \| (`"console"` \| `"compiled"` \| `"tests"`)[]
##### status
> **status**: [`ToolsPaneStatus`](../internal/type-aliases/ToolsPaneStatus.md)
#### Default
```ts
{ enabled: "all", active: "", status: "" }
```
#### Example
```js
{
"tools": {
"enabled": ["console", "compiled"],
"active": "console",
"status": "open"
}
}
```
#### Inherited from
[`AppConfig`](../internal/interfaces/AppConfig.md).[`tools`](../internal/interfaces/AppConfig.md#tools)
#### Defined in
[models.ts:631](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L631)
***
### trailingComma
> **trailingComma**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use [trailing commas](https://prettier.io/docs/en/options.html#trailing-commas).
#### Default
```ts
true
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`trailingComma`](../internal/interfaces/UserConfig.md#trailingcomma)
#### Defined in
[models.ts:849](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L849)
***
### types
> **types**: `object`
Allows providing custom TypeScript type declarations for better [editor intellisense](https://livecodes.io/docs/features/intellisense).
It is an object where each key represents module name and value represents the types.
See docs for [Types](https://livecodes.io/docs/configuration/configuration-object#types)
and [Custom Types](https://livecodes.io/docs/features/intellisense#custom-types)
#### Examples
```js
{
"types": {
"my-demo-lib": "https://my-custom-domain/my-type-declarations.d.ts"
}
}
```
```
{
"types": {
"my-demo-lib": {
"url": "https://my-custom-domain/types.d.ts",
"autoload": true,
"declareAsModule": true
}
}
```
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`types`](../internal/interfaces/ContentConfig.md#types-1)
#### Defined in
[models.ts:570](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L570)
***
### useTabs
> **useTabs**: `boolean`
If `true`, lines are indented with tabs instead of spaces.
Also used in [code formatting](https://livecodes.io/docs/features/code-format).
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`useTabs`](../internal/interfaces/UserConfig.md#usetabs)
#### Defined in
[models.ts:769](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L769)
***
### version
> `readonly` **version**: `string`
This is a read-only property which specifies the current LiveCodes version.
Version specified in [exported](https://livecodes.io/docs/features/export) projects allows automatically upgrading the project configuration when imported by an app with a newer version.
#### Inherited from
[`ContentConfig`](../internal/interfaces/ContentConfig.md).[`version`](../internal/interfaces/ContentConfig.md#version)
#### Defined in
[models.ts:583](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L583)
***
### view?
> `optional` **view**: `"split"` \| `"result"` \| `"editor"`
Sets the [default view](https://livecodes.io/docs/features/default-view) for the playground.
#### Default
```ts
"split"
```
#### Inherited from
[`AppConfig`](../internal/interfaces/AppConfig.md).[`view`](../internal/interfaces/AppConfig.md#view)
#### Defined in
[models.ts:609](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L609)
***
### welcome
> **welcome**: `boolean`
If `true`, the [welcome screen](https://livecodes.io/docs/features/welcome) is displayed when the app loads.
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`welcome`](../internal/interfaces/UserConfig.md#welcome)
#### Defined in
[models.ts:702](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L702)
***
### wordWrap
> **wordWrap**: `boolean`
Enables word-wrap for long lines.
#### Default
```ts
false
```
#### Inherited from
[`UserConfig`](../internal/interfaces/UserConfig.md).[`wordWrap`](../internal/interfaces/UserConfig.md#wordwrap)
#### Defined in
[models.ts:789](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L789)
***
### zoom
> **zoom**: `0.25` \| `0.5` \| `1`
Sets result page [zoom level](https://livecodes.io/docs/features/result#result-page-zoom).
#### Inherited from
[`AppConfig`](../internal/interfaces/AppConfig.md).[`zoom`](../internal/interfaces/AppConfig.md#zoom)
#### Defined in
[models.ts:640](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L640)
---
# Interface: EmbedOptions
An object that represents the playground embed options.
See [docs](https://livecodes.io/docs/sdk/js-ts/#embed-options) for details.
## Properties
### appUrl?
> `optional` **appUrl**: `string`
Allows loading the playground from a custom URL
(e.g. a [self-hosted app](https://livecodes.io/docs/features/self-hosting) or a [permanent URL](https://livecodes.io/docs/features/permanent-url)).
If supplied with an invalid URL, an error is thrown.
#### Default
```ts
'https://livecodes.io'
```
#### Defined in
[models.ts:314](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L314)
***
### config?
> `optional` **config**: `string` \| `Partial`\<[`Config`](Config.md)\>
A [configuration object](https://livecodes.io/docs/configuration/configuration-object) or a URL to a JSON file representing a configuration object to load.
If supplied and is not an object or a valid URL, an error is thrown.
#### Default
```ts
{}
```
#### Defined in
[models.ts:346](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L346)
***
### headless?
> `optional` **headless**: `boolean`
If `true`, the playground is loaded in [headless mode](https://livecodes.io/docs/sdk/headless).
#### Default
```ts
false
```
#### Defined in
[models.ts:352](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L352)
***
### import?
> `optional` **import**: `string`
A resource to [import](https://livecodes.io/docs/features/import) (from any of the supported [sources](https://livecodes.io/docs/features/import#sources)).
#### Defined in
[models.ts:357](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L357)
***
### ~~lite?~~
> `optional` **lite**: `boolean`
#### Deprecated
Use `{ config: { mode: "lite" } }` instead
If `true`, the playground is loaded in [lite mode](https://livecodes.io/docs/features/lite).
#### Default
```ts
false
```
#### Defined in
[models.ts:367](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L367)
***
### loading?
> `optional` **loading**: `"click"` \| `"eager"` \| `"lazy"`
Sets how the playground loads:
- `"eager"`: The playground loads immediately.
- `"lazy"`: A playground embedded low down in the page will not load until the user scrolls so that it approaches the viewport.
- `"click"`: The playground does not load automatically. Instead, a "Click-to-load" screen is shown.
#### Default
```ts
"lazy"
```
#### Defined in
[models.ts:377](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L377)
***
### params?
> `optional` **params**: `object`
An object that represents the [URL Query parameters](https://livecodes.io/docs/configuration/query-params), that can be used to configure the playground.
These 2 snippets produce similar output:
```js
import { createPlayground } from 'livecodes';
// use config
createPlayground('#container', {
config: {
markup: {
language: 'markdown',
content: '# Hello World!',
},
},
});
// use params
createPlayground('#container', { params: { md: '# Hello World!' } });
```
#### active?
> `optional` **active**: `0` \| `2` \| `1` \| [`EditorId`](../internal/type-aliases/EditorId.md)
#### activeEditor?
> `optional` **activeEditor**: `0` \| `2` \| `1` \| [`EditorId`](../internal/type-aliases/EditorId.md)
#### adoc
> **adoc**: `undefined` \| `string`
#### adoc-selector
> **adoc-selector**: `undefined` \| `string`
#### allowLangChange?
> `optional` **allowLangChange**: `boolean`
If `false`, the UI will not show the menu that allows changing editor language.
##### Default
```ts
true
```
#### app.svelte
> **svelte**: `undefined` \| `string`
#### app.svelte-selector
> **svelte-selector**: `undefined` \| `string`
#### app.vue
> **vue**: `undefined` \| `string`
#### app.vue-selector
> **vue-selector**: `undefined` \| `string`
#### appLanguage?
> `optional` **appLanguage**: [`AppLanguage`](../internal/type-aliases/AppLanguage.md)
Sets the app UI language used.
#### appUrl?
> `optional` **appUrl**: `string`
Allows loading the playground from a custom URL
(e.g. a [self-hosted app](https://livecodes.io/docs/features/self-hosting) or a [permanent URL](https://livecodes.io/docs/features/permanent-url)).
If supplied with an invalid URL, an error is thrown.
##### Default
```ts
'https://livecodes.io'
```
#### art
> **art**: `undefined` \| `string`
#### art-selector
> **art-selector**: `undefined` \| `string`
#### art-template
> **art-template**: `undefined` \| `string`
#### art-template-selector
> **art-template-selector**: `undefined` \| `string`
#### as
> **as**: `undefined` \| `string`
#### as-selector
> **as-selector**: `undefined` \| `string`
#### asc
> **asc**: `undefined` \| `string`
#### asc-selector
> **asc-selector**: `undefined` \| `string`
#### asciidoc
> **asciidoc**: `undefined` \| `string`
#### asciidoc-selector
> **asciidoc-selector**: `undefined` \| `string`
#### assemblyscript
> **assemblyscript**: `undefined` \| `string`
#### assemblyscript-selector
> **assemblyscript-selector**: `undefined` \| `string`
#### astro
> **astro**: `undefined` \| `string`
#### astro-selector
> **astro-selector**: `undefined` \| `string`
#### autosave?
> `optional` **autosave**: `boolean`
If `true`, the project is automatically saved on code change,
after time [delay](https://livecodes.io/docs/configuration/configuration-object#delay).
##### Default
```ts
false
```
#### autotest?
> `optional` **autotest**: `boolean`
If `true`, the project is watched for code changes which trigger tests to auto-run.
##### Default
```ts
false
```
#### autoupdate?
> `optional` **autoupdate**: `boolean`
If `true`, the result page is automatically updated on code change,
after time [delay](https://livecodes.io/docs/configuration/configuration-object#delay).
##### Default
```ts
true
```
#### babel
> **babel**: `undefined` \| `string`
#### babel-selector
> **babel-selector**: `undefined` \| `string`
#### bb
> **bb**: `undefined` \| `string`
#### bb-selector
> **bb-selector**: `undefined` \| `string`
#### bbcode
> **bbcode**: `undefined` \| `string`
#### bbcode-selector
> **bbcode-selector**: `undefined` \| `string`
#### Binary
> **Binary**: `undefined` \| `string`
#### Binary-selector
> **Binary-selector**: `undefined` \| `string`
#### blockly
> **blockly**: `undefined` \| `string`
#### blockly-selector
> **blockly-selector**: `undefined` \| `string`
#### blockly.xml
> **xml**: `undefined` \| `string`
#### blockly.xml-selector
> **xml-selector**: `undefined` \| `string`
#### c
> **c**: `undefined` \| `string`
#### C
> **C**: `undefined` \| `string`
#### c-selector
> **c-selector**: `undefined` \| `string`
#### C-selector
> **C-selector**: `undefined` \| `string`
#### c++
> **c++**: `undefined` \| `string`
#### c++-selector
> **c++-selector**: `undefined` \| `string`
#### civet
> **civet**: `undefined` \| `string`
#### civet-selector
> **civet-selector**: `undefined` \| `string`
#### clang
> **clang**: `undefined` \| `string`
#### clang-selector
> **clang-selector**: `undefined` \| `string`
#### clang.cpp
> **cpp**: `undefined` \| `string`
#### clang.cpp-selector
> **cpp-selector**: `undefined` \| `string`
#### clio
> **clio**: `undefined` \| `string`
#### clio-selector
> **clio-selector**: `undefined` \| `string`
#### clj
> **clj**: `undefined` \| `string`
#### clj-selector
> **clj-selector**: `undefined` \| `string`
#### cljc
> **cljc**: `undefined` \| `string`
#### cljc-selector
> **cljc-selector**: `undefined` \| `string`
#### cljs
> **cljs**: `undefined` \| `string`
#### cljs-selector
> **cljs-selector**: `undefined` \| `string`
#### clojure
> **clojure**: `undefined` \| `string`
#### clojure-selector
> **clojure-selector**: `undefined` \| `string`
#### clojurescript
> **clojurescript**: `undefined` \| `string`
#### clojurescript-selector
> **clojurescript-selector**: `undefined` \| `string`
#### closeBrackets?
> `optional` **closeBrackets**: `boolean`
Use auto-complete to close brackets and quotes.
##### Default
```ts
true
```
#### coffee
> **coffee**: `undefined` \| `string`
#### coffee-selector
> **coffee-selector**: `undefined` \| `string`
#### coffeescript
> **coffeescript**: `undefined` \| `string`
#### coffeescript-selector
> **coffeescript-selector**: `undefined` \| `string`
#### common-lisp
> **common-lisp**: `undefined` \| `string`
#### common-lisp-selector
> **common-lisp-selector**: `undefined` \| `string`
#### commonlisp
> **commonlisp**: `undefined` \| `string`
#### commonlisp-selector
> **commonlisp-selector**: `undefined` \| `string`
#### compiled
> **compiled**: `undefined` \| `""` \| `"true"` \| `"none"` \| `"closed"` \| `"open"` \| `"full"`
#### config?
> `optional` **config**: `string` \| `Partial`\<[`Config`](Config.md)\> & `string`
A [configuration object](https://livecodes.io/docs/configuration/configuration-object) or a URL to a JSON file representing a configuration object to load.
If supplied and is not an object or a valid URL, an error is thrown.
##### Default
```ts
{}
```
#### console
> **console**: `undefined` \| `""` \| `"true"` \| `"none"` \| `"closed"` \| `"open"` \| `"full"`
#### cp
> **cp**: `undefined` \| `string`
#### cp-selector
> **cp-selector**: `undefined` \| `string`
#### cpp
> **cpp**: `undefined` \| `string`
#### cpp-selector
> **cpp-selector**: `undefined` \| `string`
#### cpp-wasm
> **cpp-wasm**: `undefined` \| `string`
#### cpp-wasm-selector
> **cpp-wasm-selector**: `undefined` \| `string`
#### cppm
> **cppm**: `undefined` \| `string`
#### cppm-selector
> **cppm-selector**: `undefined` \| `string`
#### cppwasm
> **cppwasm**: `undefined` \| `string`
#### cppwasm-selector
> **cppwasm-selector**: `undefined` \| `string`
#### cs
> **cs**: `undefined` \| `string`
#### cs-selector
> **cs-selector**: `undefined` \| `string`
#### cs-wasm
> **cs-wasm**: `undefined` \| `string`
#### cs-wasm-selector
> **cs-wasm-selector**: `undefined` \| `string`
#### csharp
> **csharp**: `undefined` \| `string`
#### csharp-selector
> **csharp-selector**: `undefined` \| `string`
#### csharp-wasm
> **csharp-wasm**: `undefined` \| `string`
#### csharp-wasm-selector
> **csharp-wasm-selector**: `undefined` \| `string`
#### css
> **css**: `undefined` \| `string`
#### css-selector
> **css-selector**: `undefined` \| `string`
#### cssPreset?
> `optional` **cssPreset**: [`CssPresetId`](../internal/type-aliases/CssPresetId.md)
[CSS Preset](https://livecodes.io/docs/features/external-resources#css-presets) to use.
#### customSettings?
> `optional` **customSettings**: `object`
Defines [custom settings](https://livecodes.io/docs/advanced/custom-settings) for the current project.
#### customSettings.adoc
> **adoc**: `any`
#### customSettings.app.svelte
> **svelte**: `any`
#### customSettings.app.vue
> **vue**: `any`
#### customSettings.art
> **art**: `any`
#### customSettings.art-template
> **art-template**: `any`
#### customSettings.as
> **as**: `any`
#### customSettings.asc
> **asc**: `any`
#### customSettings.asciidoc
> **asciidoc**: `any`
#### customSettings.assemblyscript
> **assemblyscript**: `any`
#### customSettings.astro
> **astro**: `any`
#### customSettings.autoprefixer
> **autoprefixer**: `any`
#### customSettings.babel
> **babel**: `any`
#### customSettings.bb
> **bb**: `any`
#### customSettings.bbcode
> **bbcode**: `any`
#### customSettings.Binary
> **Binary**: `any`
#### customSettings.blockly
> **blockly**: `any`
#### customSettings.blockly.xml
> **xml**: `any`
#### customSettings.c
> **c**: `any`
#### customSettings.C
> **C**: `any`
#### customSettings.c++
> **c++**: `any`
#### customSettings.civet
> **civet**: `any`
#### customSettings.clang
> **clang**: `any`
#### customSettings.clang.cpp
> **cpp**: `any`
#### customSettings.clio
> **clio**: `any`
#### customSettings.clj
> **clj**: `any`
#### customSettings.cljc
> **cljc**: `any`
#### customSettings.cljs
> **cljs**: `any`
#### customSettings.clojure
> **clojure**: `any`
#### customSettings.clojurescript
> **clojurescript**: `any`
#### customSettings.coffee
> **coffee**: `any`
#### customSettings.coffeescript
> **coffeescript**: `any`
#### customSettings.common-lisp
> **common-lisp**: `any`
#### customSettings.commonlisp
> **commonlisp**: `any`
#### customSettings.convertCommonjs?
> `optional` **convertCommonjs**: `boolean`
#### customSettings.cp
> **cp**: `any`
#### customSettings.cpp
> **cpp**: `any`
#### customSettings.cpp-wasm
> **cpp-wasm**: `any`
#### customSettings.cppm
> **cppm**: `any`
#### customSettings.cppwasm
> **cppwasm**: `any`
#### customSettings.cs
> **cs**: `any`
#### customSettings.cs-wasm
> **cs-wasm**: `any`
#### customSettings.csharp
> **csharp**: `any`
#### customSettings.csharp-wasm
> **csharp-wasm**: `any`
#### customSettings.css
> **css**: `any`
#### customSettings.cssmodules
> **cssmodules**: `any`
#### customSettings.cssnano
> **cssnano**: `any`
#### customSettings.cwasm
> **cwasm**: `any`
#### customSettings.cxx
> **cxx**: `any`
#### customSettings.defaultCDN?
> `optional` **defaultCDN**: [`CDN`](../internal/type-aliases/CDN.md)
#### customSettings.diagram
> **diagram**: `any`
#### customSettings.diagrams
> **diagrams**: `any`
#### customSettings.dot
> **dot**: `any`
#### customSettings.edn
> **edn**: `any`
#### customSettings.ejs
> **ejs**: `any`
#### customSettings.es
> **es**: `any`
#### customSettings.eta
> **eta**: `any`
#### customSettings.fennel
> **fennel**: `any`
#### customSettings.flow
> **flow**: `any`
#### customSettings.fnl
> **fnl**: `any`
#### customSettings.gleam
> **gleam**: `any`
#### customSettings.go
> **go**: `any`
#### customSettings.golang
> **golang**: `any`
#### customSettings.graph
> **graph**: `any`
#### customSettings.h
> **h**: `any`
#### customSettings.haml
> **haml**: `any`
#### customSettings.handlebars
> **handlebars**: `any`
#### customSettings.hbs
> **hbs**: `any`
#### customSettings.hpp
> **hpp**: `any`
#### customSettings.htm
> **htm**: `any`
#### customSettings.html
> **html**: `any`
#### customSettings.ii
> **ii**: `any`
#### customSettings.imba
> **imba**: `any`
#### customSettings.imports?
> `optional` **imports**: `Record`\<`string`, `string`\>
#### customSettings.ixx
> **ixx**: `any`
#### customSettings.jade
> **jade**: `any`
#### customSettings.java
> **java**: `any`
#### customSettings.javascript
> **javascript**: `any`
#### customSettings.jinja
> **jinja**: `any`
#### customSettings.jl
> **jl**: `any`
#### customSettings.js
> **js**: `any`
#### customSettings.json
> **json**: `any`
#### customSettings.jsx
> **jsx**: `any`
#### customSettings.julia
> **julia**: `any`
#### customSettings.less
> **less**: `any`
#### customSettings.lightningcss
> **lightningcss**: `any`
#### customSettings.liquid
> **liquid**: `any`
#### customSettings.liquidjs
> **liquidjs**: `any`
#### customSettings.lisp
> **lisp**: `any`
#### customSettings.livescript
> **livescript**: `any`
#### customSettings.ls
> **ls**: `any`
#### customSettings.lua
> **lua**: `any`
#### customSettings.lua-wasm
> **lua-wasm**: `any`
#### customSettings.luawasm
> **luawasm**: `any`
#### customSettings.malina
> **malina**: `any`
#### customSettings.malinajs
> **malinajs**: `any`
#### customSettings.mapImports?
> `optional` **mapImports**: `boolean`
#### customSettings.markdown
> **markdown**: `any`
#### customSettings.md
> **md**: `any`
#### customSettings.mdown
> **mdown**: `any`
#### customSettings.html.md)
> **mdx**: `any`
#### customSettings.mjml
> **mjml**: `any`
#### customSettings.mkdn
> **mkdn**: `any`
#### customSettings.ml
> **ml**: `any`
#### customSettings.mli
> **mli**: `any`
#### customSettings.mustache
> **mustache**: `any`
#### customSettings.njk
> **njk**: `any`
#### customSettings.nunjucks
> **nunjucks**: `any`
#### customSettings.ocaml
> **ocaml**: `any`
#### customSettings.perl
> **perl**: `any`
#### customSettings.pg
> **pg**: `any`
#### customSettings.pg.sql
> **sql**: `any`
#### customSettings.pglite
> **pglite**: `any`
#### customSettings.pglite.sql
> **sql**: `any`
#### customSettings.pgsql
> **pgsql**: `any`
#### customSettings.pgsql.sql
> **sql**: `any`
#### customSettings.php
> **php**: `any`
#### customSettings.php-wasm
> **php-wasm**: `any`
#### customSettings.phpwasm
> **phpwasm**: `any`
#### customSettings.pintora
> **pintora**: `any`
#### customSettings.pl
> **pl**: `any`
#### customSettings.plt
> **plt**: `any`
#### customSettings.pm
> **pm**: `any`
#### customSettings.postcss
> **postcss**: `any`
#### customSettings.postcssImportUrl
> **postcssImportUrl**: `any`
#### customSettings.postcssPresetEnv
> **postcssPresetEnv**: `any`
#### customSettings.postgre.sql
> **sql**: `any`
#### customSettings.postgres
> **postgres**: `any`
#### customSettings.postgresql
> **postgresql**: `any`
#### customSettings.postgresql.sql
> **sql**: `any`
#### customSettings.prolog
> **prolog**: `any`
#### customSettings.prolog.pl
> **pl**: `any`
#### customSettings.pug
> **pug**: `any`
#### customSettings.purgecss
> **purgecss**: `any`
#### customSettings.py
> **py**: `any`
#### customSettings.py-wasm
> **py-wasm**: `any`
#### customSettings.py3
> **py3**: `any`
#### customSettings.pyodide
> **pyodide**: `any`
#### customSettings.python
> **python**: `any`
#### customSettings.python-wasm
> **python-wasm**: `any`
#### customSettings.pythonwasm
> **pythonwasm**: `any`
#### customSettings.pywasm
> **pywasm**: `any`
#### customSettings.r
> **r**: `any`
#### customSettings.r-wasm
> **r-wasm**: `any`
#### customSettings.rb
> **rb**: `any`
#### customSettings.re
> **re**: `any`
#### customSettings.react
> **react**: `any`
#### customSettings.react-jsx
> **react-jsx**: `any`
#### customSettings.react-native
> **react-native**: `any`
#### customSettings.react-native-tsx
> **react-native-tsx**: `any`
#### customSettings.react-native.jsx
> **jsx**: `any`
#### customSettings.react-native.tsx
> **tsx**: `any`
#### customSettings.react-tsx
> **react-tsx**: `any`
#### customSettings.react.jsx
> **jsx**: `any`
#### customSettings.react.tsx
> **tsx**: `any`
#### customSettings.reason
> **reason**: `any`
#### customSettings.rei
> **rei**: `any`
#### customSettings.res
> **res**: `any`
#### customSettings.rescript
> **rescript**: `any`
#### customSettings.resi
> **resi**: `any`
#### customSettings.rich
> **rich**: `any`
#### customSettings.richtext
> **richtext**: `any`
#### customSettings.riot
> **riot**: `any`
#### customSettings.riotjs
> **riotjs**: `any`
#### customSettings.rlang
> **rlang**: `any`
#### customSettings.rstats
> **rstats**: `any`
#### customSettings.rte
> **rte**: `any`
#### customSettings.rte.html
> **html**: `any`
#### customSettings.ruby
> **ruby**: `any`
#### customSettings.ruby-wasm
> **ruby-wasm**: `any`
#### customSettings.rubywasm
> **rubywasm**: `any`
#### customSettings.sass
> **sass**: `any`
#### customSettings.scheme
> **scheme**: `any`
#### customSettings.scm
> **scm**: `any`
#### customSettings.scriptType?
> `optional` **scriptType**: `""` \| `"module"` \| `"text/liquid"` \| `"text/python"` \| `"text/r"` \| `"text/ruby-wasm"` \| `"text/x-uniter-php"` \| `"text/php-wasm"` \| `"text/cpp"` \| `"text/java"` \| `"text/csharp-wasm"` \| `"text/perl"` \| `"text/julia"` \| `"text/biwascheme"` \| `"text/commonlisp"` \| `"text/tcl"` \| `"text/prolog"` \| `"application/json"` \| `"application/lua"` \| `"text/fennel"` \| `"application/wasm-uint8"` \| `"application/javascript"` \| `"application/ecmascript"` \| `"text/javascript"` \| `"text/ecmascript"`
#### customSettings.scss
> **scss**: `any`
#### customSettings.solid
> **solid**: `any`
#### customSettings.solid.jsx
> **jsx**: `any`
#### customSettings.solid.tsx
> **tsx**: `any`
#### customSettings.sql
> **sql**: `any`
#### customSettings.sqlite
> **sqlite**: `any`
#### customSettings.sqlite3
> **sqlite3**: `any`
#### customSettings.stencil
> **stencil**: `any`
#### customSettings.stencil.tsx
> **tsx**: `any`
#### customSettings.styl
> **styl**: `any`
#### customSettings.stylis
> **stylis**: `any`
#### customSettings.stylus
> **stylus**: `any`
#### customSettings.sucrase
> **sucrase**: `any`
#### customSettings.svelte
> **svelte**: `any`
#### customSettings.svelte-app
> **svelte-app**: `any`
#### customSettings.tailwindcss
> **tailwindcss**: `any`
#### customSettings.tcl
> **tcl**: `any`
#### customSettings.teal
> **teal**: `any`
#### customSettings.template?
> `optional` **template**: `object`
#### customSettings.template.data?
> `optional` **data**: `any`
#### customSettings.template.prerender?
> `optional` **prerender**: `boolean`
#### customSettings.tl
> **tl**: `any`
#### customSettings.tokencss
> **tokencss**: `any`
#### customSettings.ts
> **ts**: `any`
#### customSettings.tsx
> **tsx**: `any`
#### customSettings.twig
> **twig**: `any`
#### customSettings.types?
> `optional` **types**: [`Types`](../internal/interfaces/Types.md)
#### customSettings.typescript
> **typescript**: `any`
#### customSettings.unocss
> **unocss**: `any`
#### customSettings.vento
> **vento**: `any`
#### customSettings.vto
> **vto**: `any`
#### customSettings.vue
> **vue**: `any`
#### customSettings.vue-app
> **vue-app**: `any`
#### customSettings.vue2
> **vue2**: `any`
#### customSettings.vue3
> **vue3**: `any`
#### customSettings.wasm
> **wasm**: `any`
#### customSettings.wasm.cpp
> **cpp**: `any`
#### customSettings.wasm.cs
> **cs**: `any`
#### customSettings.wasm.lua
> **lua**: `any`
#### customSettings.wasm.php
> **php**: `any`
#### customSettings.wasm.py
> **py**: `any`
#### customSettings.wasm.rb
> **rb**: `any`
#### customSettings.wast
> **wast**: `any`
#### customSettings.wat
> **wat**: `any`
#### customSettings.webassembly
> **webassembly**: `any`
#### customSettings.windicss
> **windicss**: `any`
#### customSettings.xht
> **xht**: `any`
#### customSettings.xml
> **xml**: `any`
#### cwasm
> **cwasm**: `undefined` \| `string`
#### cwasm-selector
> **cwasm-selector**: `undefined` \| `string`
#### cxx
> **cxx**: `undefined` \| `string`
#### cxx-selector
> **cxx-selector**: `undefined` \| `string`
#### delay?
> `optional` **delay**: `number`
Time delay (in milliseconds) following code change,
after which the result page is updated (if [`autoupdate`](https://livecodes.io/docs/configuration/configuration-object#autoupdate) is `true`)
and/or the project is saved (if [`autosave`](https://livecodes.io/docs/configuration/configuration-object#autosave) is `true`).
##### Default
```ts
1500
```
#### description?
> `optional` **description**: `string`
Project description. Used in [project](https://livecodes.io/docs/features/projects) search
and [result page](https://livecodes.io/docs/features/result) description meta tag.
##### Default
```ts
""
```
#### diagram
> **diagram**: `undefined` \| `string`
#### diagram-selector
> **diagram-selector**: `undefined` \| `string`
#### diagrams
> **diagrams**: `undefined` \| `string`
#### diagrams-selector
> **diagrams-selector**: `undefined` \| `string`
#### disableAI?
> `optional` **disableAI**: `boolean`
#### dot
> **dot**: `undefined` \| `string`
#### dot-selector
> **dot-selector**: `undefined` \| `string`
#### editor?
> `optional` **editor**: `"auto"` \| `"monaco"` \| `"codemirror"` \| `"codejar"`
Selects the [code editor](https://livecodes.io/docs/features/editor-settings#code-editor) to use.
If `undefined` (the default), Monaco editor is used on desktop,
CodeMirror is used on mobile and in `simple` mode,
while CodeJar is used in `codeblock` mode, in `lite` mode and in `readonly` playgrounds.
If set to `auto`, Monaco editor is used on desktop and CodeMirror is used on mobile regardless of other settings.
##### Default
```ts
undefined
```
#### editorMode?
> `optional` **editorMode**: `"vim"` \| `"emacs"`
Sets [editor mode](https://livecodes.io/docs/features/editor-settings#editor-modes).
#### editorTheme?
> `optional` **editorTheme**: `string` \| [`EditorTheme`](../internal/type-aliases/EditorTheme.md)[]
Sets the [code editor](https://livecodes.io/docs/features/editor-settings) themes.
See docs for [editor themes](https://livecodes.io/docs/configuration/configuration-object#editortheme) for details.
##### Examples
```ts
"vs"
```
```ts
"monaco:twilight, codemirror:one-dark"
```
```ts
["vs@light"]
```
```ts
["vs@light", "vs-dark@dark"]
```
```ts
["monaco:vs@light", "codemirror:github-light@light", "dracula@dark"]
```
#### edn
> **edn**: `undefined` \| `string`
#### edn-selector
> **edn-selector**: `undefined` \| `string`
#### ejs
> **ejs**: `undefined` \| `string`
#### ejs-selector
> **ejs-selector**: `undefined` \| `string`
#### embed?
> `optional` **embed**: `boolean`
#### emmet?
> `optional` **emmet**: `boolean`
Enables [Emmet](https://livecodes.io/docs/features/editor-settings#emmet).
##### Default
```ts
true
```
#### enableAI?
> `optional` **enableAI**: `boolean`
If `true`, [AI code assistant](https://livecodes.io/docs/features/ai) is enabled.
##### Default
```ts
false
```
#### es
> **es**: `undefined` \| `string`
#### es-selector
> **es-selector**: `undefined` \| `string`
#### eta
> **eta**: `undefined` \| `string`
#### eta-selector
> **eta-selector**: `undefined` \| `string`
#### fennel
> **fennel**: `undefined` \| `string`
#### fennel-selector
> **fennel-selector**: `undefined` \| `string`
#### files?
> `optional` **files**: `string`
#### flow
> **flow**: `undefined` \| `string`
#### flow-selector
> **flow-selector**: `undefined` \| `string`
#### fnl
> **fnl**: `undefined` \| `string`
#### fnl-selector
> **fnl-selector**: `undefined` \| `string`
#### foldRegions?
> `optional` **foldRegions**: `boolean`
When set to `true`, regions marked by `#region` and `#endregion` comments are folded when the project is loaded.
##### Default
```ts
false
```
#### fontFamily?
> `optional` **fontFamily**: `string`
Sets the [code editor](https://livecodes.io/docs/features/editor-settings) font family.
#### fontSize?
> `optional` **fontSize**: `number`
Sets the font size.
If `undefined` (the default), the font size is set to 14 for the full app and 12 for [embeds](https://livecodes.io/docs/features/embeds).
##### Default
```ts
undefined
```
#### formatOnsave?
> `optional` **formatOnsave**: `boolean`
If `true`, the code is automatically [formatted](https://livecodes.io/docs/features/code-format) on saving the project.
##### Default
```ts
false
```
#### gleam
> **gleam**: `undefined` \| `string`
#### gleam-selector
> **gleam-selector**: `undefined` \| `string`
#### go
> **go**: `undefined` \| `string`
#### go-selector
> **go-selector**: `undefined` \| `string`
#### golang
> **golang**: `undefined` \| `string`
#### golang-selector
> **golang-selector**: `undefined` \| `string`
#### graph
> **graph**: `undefined` \| `string`
#### graph-selector
> **graph-selector**: `undefined` \| `string`
#### h
> **h**: `undefined` \| `string`
#### h-selector
> **h-selector**: `undefined` \| `string`
#### haml
> **haml**: `undefined` \| `string`
#### haml-selector
> **haml-selector**: `undefined` \| `string`
#### handlebars
> **handlebars**: `undefined` \| `string`
#### handlebars-selector
> **handlebars-selector**: `undefined` \| `string`
#### hbs
> **hbs**: `undefined` \| `string`
#### hbs-selector
> **hbs-selector**: `undefined` \| `string`
#### head?
> `optional` **head**: `string`
Content added to the [result page](https://livecodes.io/docs/features/result) `` element.
##### Default
```ts
'\n'
```
#### headless?
> `optional` **headless**: `boolean`
If `true`, the playground is loaded in [headless mode](https://livecodes.io/docs/sdk/headless).
##### Default
```ts
false
```
#### hpp
> **hpp**: `undefined` \| `string`
#### hpp-selector
> **hpp-selector**: `undefined` \| `string`
#### htm
> **htm**: `undefined` \| `string`
#### htm-selector
> **htm-selector**: `undefined` \| `string`
#### html
> **html**: `undefined` \| `string`
#### html-selector
> **html-selector**: `undefined` \| `string`
#### htmlAttrs?
> `optional` **htmlAttrs**: `string` \| `Record`\<`string`, `string`\>
Attributes added to the [result page](https://livecodes.io/docs/features/result) `` element.
It can be an object or a string.
##### Example
```ts
{ lang: "en", class: "dark" }
'lang="en" class="dark"'
```
#### ii
> **ii**: `undefined` \| `string`
#### ii-selector
> **ii-selector**: `undefined` \| `string`
#### imba
> **imba**: `undefined` \| `string`
#### imba-selector
> **imba-selector**: `undefined` \| `string`
#### import?
> `optional` **import**: `string`
A resource to [import](https://livecodes.io/docs/features/import) (from any of the supported [sources](https://livecodes.io/docs/features/import#sources)).
#### imports?
> `optional` **imports**: `object`
Allows specifying custom [import maps](https://github.com/WICG/import-maps) for [module imports](https://livecodes.io/docs/features/module-resolution#custom-module-resolution).
**Example**
Setting `imports` like this:
```js
"imports": {
"moment": "https://cdn.jsdelivr.net/npm/moment@2.29.4/dist/moment.js"
}
```
results in the following import map:
```html
```
See docs for [Imports](https://livecodes.io/docs/configuration/configuration-object#imports)
and [Custom Module Resolution](https://livecodes.io/docs/features/module-resolution/#custom-module-resolution)
##### Index Signature
\[`key`: `string`\]: `string`
#### ixx
> **ixx**: `undefined` \| `string`
#### ixx-selector
> **ixx-selector**: `undefined` \| `string`
#### jade
> **jade**: `undefined` \| `string`
#### jade-selector
> **jade-selector**: `undefined` \| `string`
#### java
> **java**: `undefined` \| `string`
#### java-selector
> **java-selector**: `undefined` \| `string`
#### javascript
> **javascript**: `undefined` \| `string`
#### javascript-selector
> **javascript-selector**: `undefined` \| `string`
#### jinja
> **jinja**: `undefined` \| `string`
#### jinja-selector
> **jinja-selector**: `undefined` \| `string`
#### jl
> **jl**: `undefined` \| `string`
#### jl-selector
> **jl-selector**: `undefined` \| `string`
#### js
> **js**: `undefined` \| `string`
#### js-selector
> **js-selector**: `undefined` \| `string`
#### json
> **json**: `undefined` \| `string`
#### json-selector
> **json-selector**: `undefined` \| `string`
#### jsx
> **jsx**: `undefined` \| `string`
#### jsx-selector
> **jsx-selector**: `undefined` \| `string`
#### julia
> **julia**: `undefined` \| `string`
#### julia-selector
> **julia-selector**: `undefined` \| `string`
#### lang?
> `optional` **lang**: [`Language`](../type-aliases/Language.md)
#### language?
> `optional` **language**: [`Language`](../type-aliases/Language.md)
#### languages?
> `optional` **languages**: `string`
#### layout?
> `optional` **layout**: `"horizontal"` \| `"vertical"` \| `"responsive"`
Sets the app layout to horizontal or vertical.
If set to `"responsive"` (the default) or `undefined`,
the layout is vertical in small screens when the playground height is larger than its width,
otherwise horizontal.
##### Default
```ts
"responsive"
```
#### less
> **less**: `undefined` \| `string`
#### less-selector
> **less-selector**: `undefined` \| `string`
#### lineNumbers?
> `optional` **lineNumbers**: `boolean` \| `"relative"`
Show line numbers in [code editor](https://livecodes.io/docs/features/editor-settings).
##### Default
```ts
true
```
#### liquid
> **liquid**: `undefined` \| `string`
#### liquid-selector
> **liquid-selector**: `undefined` \| `string`
#### liquidjs
> **liquidjs**: `undefined` \| `string`
#### liquidjs-selector
> **liquidjs-selector**: `undefined` \| `string`
#### lisp
> **lisp**: `undefined` \| `string`
#### lisp-selector
> **lisp-selector**: `undefined` \| `string`
#### ~~lite?~~
> `optional` **lite**: `boolean`
##### Deprecated
Use `{ config: { mode: "lite" } }` instead
If `true`, the playground is loaded in [lite mode](https://livecodes.io/docs/features/lite).
##### Default
```ts
false
```
#### livescript
> **livescript**: `undefined` \| `string`
#### livescript-selector
> **livescript-selector**: `undefined` \| `string`
#### loading?
> `optional` **loading**: `"click"` \| `"eager"` \| `"lazy"`
Sets how the playground loads:
- `"eager"`: The playground loads immediately.
- `"lazy"`: A playground embedded low down in the page will not load until the user scrolls so that it approaches the viewport.
- `"click"`: The playground does not load automatically. Instead, a "Click-to-load" screen is shown.
##### Default
```ts
"lazy"
```
#### ls
> **ls**: `undefined` \| `string`
#### ls-selector
> **ls-selector**: `undefined` \| `string`
#### lua
> **lua**: `undefined` \| `string`
#### lua-selector
> **lua-selector**: `undefined` \| `string`
#### lua-wasm
> **lua-wasm**: `undefined` \| `string`
#### lua-wasm-selector
> **lua-wasm-selector**: `undefined` \| `string`
#### luawasm
> **luawasm**: `undefined` \| `string`
#### luawasm-selector
> **luawasm-selector**: `undefined` \| `string`
#### malina
> **malina**: `undefined` \| `string`
#### malina-selector
> **malina-selector**: `undefined` \| `string`
#### malinajs
> **malinajs**: `undefined` \| `string`
#### malinajs-selector
> **malinajs-selector**: `undefined` \| `string`
#### markdown
> **markdown**: `undefined` \| `string`
#### markdown-selector
> **markdown-selector**: `undefined` \| `string`
#### markup?
> `optional` **markup**: `object`
An object that configures the language and content of the markup editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
##### Default
```ts
{ language: "html", content: "" }
```
#### markup.content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### markup.contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### markup.foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### markup.hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### markup.hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### markup.hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### markup.language
> **language**: [`Language`](../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### markup.order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### markup.position?
> `optional` **position**: [`EditorPosition`](../internal/interfaces/EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### markup.selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### markup.title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### md
> **md**: `undefined` \| `string`
#### md-selector
> **md-selector**: `undefined` \| `string`
#### mdown
> **mdown**: `undefined` \| `string`
#### mdown-selector
> **mdown-selector**: `undefined` \| `string`
#### mdx
> **mdx**: `undefined` \| `string`
#### mdx-selector
> **mdx-selector**: `undefined` \| `string`
#### mjml
> **mjml**: `undefined` \| `string`
#### mjml-selector
> **mjml-selector**: `undefined` \| `string`
#### mkdn
> **mkdn**: `undefined` \| `string`
#### mkdn-selector
> **mkdn-selector**: `undefined` \| `string`
#### ml
> **ml**: `undefined` \| `string`
#### ml-selector
> **ml-selector**: `undefined` \| `string`
#### mli
> **mli**: `undefined` \| `string`
#### mli-selector
> **mli-selector**: `undefined` \| `string`
#### mode?
> `optional` **mode**: `"focus"` \| `"full"` \| `"result"` \| `"editor"` \| `"lite"` \| `"simple"` \| `"codeblock"`
Sets the [display mode](https://livecodes.io/docs/features/display-modes).
##### Default
```ts
"full"
```
#### mustache
> **mustache**: `undefined` \| `string`
#### mustache-selector
> **mustache-selector**: `undefined` \| `string`
#### new?
> `optional` **new**: `""`
#### njk
> **njk**: `undefined` \| `string`
#### njk-selector
> **njk-selector**: `undefined` \| `string`
#### no-defaults?
> `optional` **no-defaults**: `boolean`
#### nunjucks
> **nunjucks**: `undefined` \| `string`
#### nunjucks-selector
> **nunjucks-selector**: `undefined` \| `string`
#### ocaml
> **ocaml**: `undefined` \| `string`
#### ocaml-selector
> **ocaml-selector**: `undefined` \| `string`
#### params?
> `optional` **params**: \{ appUrl?: string \| undefined; params?: ... \| undefined; config?: string \| (Partial\ & string) \| undefined; headless?: boolean \| undefined; import?: string \| undefined; ... 475 more ...; compiled?: "" \| ... 5 more ... \| undefined; \} \| undefined
An object that represents the [URL Query parameters](https://livecodes.io/docs/configuration/query-params), that can be used to configure the playground.
These 2 snippets produce similar output:
```js
import { createPlayground } from 'livecodes';
// use config
createPlayground('#container', {
config: {
markup: {
language: 'markdown',
content: '# Hello World!',
},
},
});
// use params
createPlayground('#container', { params: { md: '# Hello World!' } });
```
#### perl
> **perl**: `undefined` \| `string`
#### perl-selector
> **perl-selector**: `undefined` \| `string`
#### pg
> **pg**: `undefined` \| `string`
#### pg-selector
> **pg-selector**: `undefined` \| `string`
#### pg.sql
> **sql**: `undefined` \| `string`
#### pg.sql-selector
> **sql-selector**: `undefined` \| `string`
#### pglite
> **pglite**: `undefined` \| `string`
#### pglite-selector
> **pglite-selector**: `undefined` \| `string`
#### pglite.sql
> **sql**: `undefined` \| `string`
#### pglite.sql-selector
> **sql-selector**: `undefined` \| `string`
#### pgsql
> **pgsql**: `undefined` \| `string`
#### pgsql-selector
> **pgsql-selector**: `undefined` \| `string`
#### pgsql.sql
> **sql**: `undefined` \| `string`
#### pgsql.sql-selector
> **sql-selector**: `undefined` \| `string`
#### php
> **php**: `undefined` \| `string`
#### php-selector
> **php-selector**: `undefined` \| `string`
#### php-wasm
> **php-wasm**: `undefined` \| `string`
#### php-wasm-selector
> **php-wasm-selector**: `undefined` \| `string`
#### phpwasm
> **phpwasm**: `undefined` \| `string`
#### phpwasm-selector
> **phpwasm-selector**: `undefined` \| `string`
#### pintora
> **pintora**: `undefined` \| `string`
#### pintora-selector
> **pintora-selector**: `undefined` \| `string`
#### pl
> **pl**: `undefined` \| `string`
#### pl-selector
> **pl-selector**: `undefined` \| `string`
#### plt
> **plt**: `undefined` \| `string`
#### plt-selector
> **plt-selector**: `undefined` \| `string`
#### pm
> **pm**: `undefined` \| `string`
#### pm-selector
> **pm-selector**: `undefined` \| `string`
#### postcss
> **postcss**: `undefined` \| `string`
#### postcss-selector
> **postcss-selector**: `undefined` \| `string`
#### postgre.sql
> **sql**: `undefined` \| `string`
#### postgre.sql-selector
> **sql-selector**: `undefined` \| `string`
#### postgres
> **postgres**: `undefined` \| `string`
#### postgres-selector
> **postgres-selector**: `undefined` \| `string`
#### postgresql
> **postgresql**: `undefined` \| `string`
#### postgresql-selector
> **postgresql-selector**: `undefined` \| `string`
#### postgresql.sql
> **sql**: `undefined` \| `string`
#### postgresql.sql-selector
> **sql-selector**: `undefined` \| `string`
#### preview?
> `optional` **preview**: `boolean`
#### processors?
> `optional` **processors**: `string`
#### prolog
> **prolog**: `undefined` \| `string`
#### prolog-selector
> **prolog-selector**: `undefined` \| `string`
#### prolog.pl
> **pl**: `undefined` \| `string`
#### prolog.pl-selector
> **pl-selector**: `undefined` \| `string`
#### pug
> **pug**: `undefined` \| `string`
#### pug-selector
> **pug-selector**: `undefined` \| `string`
#### py
> **py**: `undefined` \| `string`
#### py-selector
> **py-selector**: `undefined` \| `string`
#### py-wasm
> **py-wasm**: `undefined` \| `string`
#### py-wasm-selector
> **py-wasm-selector**: `undefined` \| `string`
#### py3
> **py3**: `undefined` \| `string`
#### py3-selector
> **py3-selector**: `undefined` \| `string`
#### pyodide
> **pyodide**: `undefined` \| `string`
#### pyodide-selector
> **pyodide-selector**: `undefined` \| `string`
#### python
> **python**: `undefined` \| `string`
#### python-selector
> **python-selector**: `undefined` \| `string`
#### python-wasm
> **python-wasm**: `undefined` \| `string`
#### python-wasm-selector
> **python-wasm-selector**: `undefined` \| `string`
#### pythonwasm
> **pythonwasm**: `undefined` \| `string`
#### pythonwasm-selector
> **pythonwasm-selector**: `undefined` \| `string`
#### pywasm
> **pywasm**: `undefined` \| `string`
#### pywasm-selector
> **pywasm-selector**: `undefined` \| `string`
#### r
> **r**: `undefined` \| `string`
#### r-selector
> **r-selector**: `undefined` \| `string`
#### r-wasm
> **r-wasm**: `undefined` \| `string`
#### r-wasm-selector
> **r-wasm-selector**: `undefined` \| `string`
#### raw?
> `optional` **raw**: [`Language`](../type-aliases/Language.md)
#### rb
> **rb**: `undefined` \| `string`
#### rb-selector
> **rb-selector**: `undefined` \| `string`
#### re
> **re**: `undefined` \| `string`
#### re-selector
> **re-selector**: `undefined` \| `string`
#### react
> **react**: `undefined` \| `string`
#### react-jsx
> **react-jsx**: `undefined` \| `string`
#### react-jsx-selector
> **react-jsx-selector**: `undefined` \| `string`
#### react-native
> **react-native**: `undefined` \| `string`
#### react-native-selector
> **react-native-selector**: `undefined` \| `string`
#### react-native-tsx
> **react-native-tsx**: `undefined` \| `string`
#### react-native-tsx-selector
> **react-native-tsx-selector**: `undefined` \| `string`
#### react-native.jsx
> **jsx**: `undefined` \| `string`
#### react-native.jsx-selector
> **jsx-selector**: `undefined` \| `string`
#### react-native.tsx
> **tsx**: `undefined` \| `string`
#### react-native.tsx-selector
> **tsx-selector**: `undefined` \| `string`
#### react-selector
> **react-selector**: `undefined` \| `string`
#### react-tsx
> **react-tsx**: `undefined` \| `string`
#### react-tsx-selector
> **react-tsx-selector**: `undefined` \| `string`
#### react.jsx
> **jsx**: `undefined` \| `string`
#### react.jsx-selector
> **jsx-selector**: `undefined` \| `string`
#### react.tsx
> **tsx**: `undefined` \| `string`
#### react.tsx-selector
> **tsx-selector**: `undefined` \| `string`
#### readonly?
> `optional` **readonly**: `boolean`
If `true`, editors are loaded in read-only mode, where the user is not allowed to change the code.
By default, when readonly is set to true, the light-weight code editor [CodeJar](https://livecodes.io/docs/features/editor-settings#code-editor) is used.
If you wish to use another editor, set the [editor](https://livecodes.io/docs/configuration/configuration-object#editor) property.
##### Default
```ts
false
```
#### reason
> **reason**: `undefined` \| `string`
#### reason-selector
> **reason-selector**: `undefined` \| `string`
#### recoverUnsaved?
> `optional` **recoverUnsaved**: `boolean`
Enables [recovering last unsaved project](https://livecodes.io/docs/features/recover) when the app is reopened.
##### Default
```ts
true
```
#### rei
> **rei**: `undefined` \| `string`
#### rei-selector
> **rei-selector**: `undefined` \| `string`
#### res
> **res**: `undefined` \| `string`
#### res-selector
> **res-selector**: `undefined` \| `string`
#### rescript
> **rescript**: `undefined` \| `string`
#### rescript-selector
> **rescript-selector**: `undefined` \| `string`
#### resi
> **resi**: `undefined` \| `string`
#### resi-selector
> **resi-selector**: `undefined` \| `string`
#### rich
> **rich**: `undefined` \| `string`
#### rich-selector
> **rich-selector**: `undefined` \| `string`
#### richtext
> **richtext**: `undefined` \| `string`
#### richtext-selector
> **richtext-selector**: `undefined` \| `string`
#### riot
> **riot**: `undefined` \| `string`
#### riot-selector
> **riot-selector**: `undefined` \| `string`
#### riotjs
> **riotjs**: `undefined` \| `string`
#### riotjs-selector
> **riotjs-selector**: `undefined` \| `string`
#### rlang
> **rlang**: `undefined` \| `string`
#### rlang-selector
> **rlang-selector**: `undefined` \| `string`
#### rstats
> **rstats**: `undefined` \| `string`
#### rstats-selector
> **rstats-selector**: `undefined` \| `string`
#### rte
> **rte**: `undefined` \| `string`
#### rte-selector
> **rte-selector**: `undefined` \| `string`
#### rte.html
> **html**: `undefined` \| `string`
#### rte.html-selector
> **html-selector**: `undefined` \| `string`
#### ruby
> **ruby**: `undefined` \| `string`
#### ruby-selector
> **ruby-selector**: `undefined` \| `string`
#### ruby-wasm
> **ruby-wasm**: `undefined` \| `string`
#### ruby-wasm-selector
> **ruby-wasm-selector**: `undefined` \| `string`
#### rubywasm
> **rubywasm**: `undefined` \| `string`
#### rubywasm-selector
> **rubywasm-selector**: `undefined` \| `string`
#### sass
> **sass**: `undefined` \| `string`
#### sass-selector
> **sass-selector**: `undefined` \| `string`
#### scheme
> **scheme**: `undefined` \| `string`
#### scheme-selector
> **scheme-selector**: `undefined` \| `string`
#### scm
> **scm**: `undefined` \| `string`
#### scm-selector
> **scm-selector**: `undefined` \| `string`
#### screen?
> `optional` **screen**: `"new"` \| `"open"` \| `"embed"` \| `"sync"` \| `"about"` \| `"welcome"` \| `"add-snippet"` \| `"login"` \| `"info"` \| `"assets"` \| `"add-asset"` \| `"snippets"` \| `"import"` \| `"resources"` \| `"share"` \| `"deploy"` \| `"backup"` \| `"broadcast"` \| `"custom-settings"` \| `"editor-settings"` \| `"code-to-image"` \| `"test-editor"` \| `"keyboard-shortcuts"`
#### script?
> `optional` **script**: `object`
An object that configures the language and content of the script editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
##### Default
```ts
{ language: "javascript", content: "" }
```
#### script.content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### script.contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### script.foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### script.hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### script.hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### script.hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### script.language
> **language**: [`Language`](../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### script.order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### script.position?
> `optional` **position**: [`EditorPosition`](../internal/interfaces/EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### script.selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### script.title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### scripts?
> `optional` **scripts**: `string`
#### scrollPosition?
> `optional` **scrollPosition**: `boolean`
#### scss
> **scss**: `undefined` \| `string`
#### scss-selector
> **scss-selector**: `undefined` \| `string`
#### sdkVersion?
> `optional` **sdkVersion**: `string`
#### semicolons?
> `optional` **semicolons**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use semi-colons.
##### Default
```ts
true
```
#### showSpacing?
> `optional` **showSpacing**: `boolean`
Enables [showing element spacing](https://livecodes.io/docs/features/result#show-spacings) in the result page.
##### Default
```ts
false
```
#### singleQuote?
> `optional` **singleQuote**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use single quotes instead of double quotes.
##### Default
```ts
false
```
#### solid
> **solid**: `undefined` \| `string`
#### solid-selector
> **solid-selector**: `undefined` \| `string`
#### solid.jsx
> **jsx**: `undefined` \| `string`
#### solid.jsx-selector
> **jsx-selector**: `undefined` \| `string`
#### solid.tsx
> **tsx**: `undefined` \| `string`
#### solid.tsx-selector
> **tsx-selector**: `undefined` \| `string`
#### sql
> **sql**: `undefined` \| `string`
#### sql-selector
> **sql-selector**: `undefined` \| `string`
#### sqlite
> **sqlite**: `undefined` \| `string`
#### sqlite-selector
> **sqlite-selector**: `undefined` \| `string`
#### sqlite3
> **sqlite3**: `undefined` \| `string`
#### sqlite3-selector
> **sqlite3-selector**: `undefined` \| `string`
#### stencil
> **stencil**: `undefined` \| `string`
#### stencil-selector
> **stencil-selector**: `undefined` \| `string`
#### stencil.tsx
> **tsx**: `undefined` \| `string`
#### stencil.tsx-selector
> **tsx-selector**: `undefined` \| `string`
#### styl
> **styl**: `undefined` \| `string`
#### styl-selector
> **styl-selector**: `undefined` \| `string`
#### style?
> `optional` **style**: `object`
An object that configures the language and content of the style editor.
See [docs](https://livecodes.io/docs/configuration/configuration-object/#markup) for details.
##### Default
```ts
{ language: "css", content: "" }
```
#### style.content?
> `optional` **content**: `string`
The initial content of the code editor.
##### Default
```ts
""
```
#### style.contentUrl?
> `optional` **contentUrl**: `string`
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
#### style.foldedLines?
> `optional` **foldedLines**: `object`[]
Lines that get folded when the editor loads.
This can be used for less relevant content.
##### Example
```ts
[{ from: 5, to: 8 }, { from: 15, to: 20 }]
```
#### style.hiddenContent?
> `optional` **hiddenContent**: `string`
Hidden content that gets evaluated without being visible in the code editor.
This can be useful in embedded playgrounds (e.g. for adding helper functions, utilities or tests)
#### style.hiddenContentUrl?
> `optional` **hiddenContentUrl**: `string`
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
#### style.hideTitle?
> `optional` **hideTitle**: `boolean`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
#### style.language
> **language**: [`Language`](../type-aliases/Language.md)
A language name, extension or alias (as defined in [language documentations](https://livecodes.io/docs/languages/)).
For the list of supported values, see [Language](https://livecodes.io/docs/api/type-aliases/Language)
#### style.order?
> `optional` **order**: `number`
The order of the editor in the UI.
##### Default
```ts
0
```
#### style.position?
> `optional` **position**: [`EditorPosition`](../internal/interfaces/EditorPosition.md)
The initial position of the cursor in the code editor.
##### Example
```ts
{lineNumber: 5, column: 10}
```
#### style.selector?
> `optional` **selector**: `string`
A CSS selector to load content from [DOM import](https://livecodes.io/docs/features/import#import-code-from-dom).
#### style.title?
> `optional` **title**: `string`
If set, this is used as the title of the editor in the UI,
overriding the default title set to the language name
(e.g. `"Python"` can be used instead of `"Py (Wasm)"`).
#### stylesheets?
> `optional` **stylesheets**: `string`
#### stylis
> **stylis**: `undefined` \| `string`
#### stylis-selector
> **stylis-selector**: `undefined` \| `string`
#### stylus
> **stylus**: `undefined` \| `string`
#### stylus-selector
> **stylus-selector**: `undefined` \| `string`
#### sucrase
> **sucrase**: `undefined` \| `string`
#### sucrase-selector
> **sucrase-selector**: `undefined` \| `string`
#### svelte
> **svelte**: `undefined` \| `string`
#### svelte-app
> **svelte-app**: `undefined` \| `string`
#### svelte-app-selector
> **svelte-app-selector**: `undefined` \| `string`
#### svelte-selector
> **svelte-selector**: `undefined` \| `string`
#### tabSize?
> `optional` **tabSize**: `number`
The number of spaces per indentation-level.
Also used in [code formatting](https://livecodes.io/docs/features/code-format).
##### Default
```ts
2
```
#### tags?
> `optional` **tags**: `string` \| `string`[]
#### tcl
> **tcl**: `undefined` \| `string`
#### tcl-selector
> **tcl-selector**: `undefined` \| `string`
#### teal
> **teal**: `undefined` \| `string`
#### teal-selector
> **teal-selector**: `undefined` \| `string`
#### template?
> `optional` **template**: [`TemplateName`](../internal/type-aliases/TemplateName.md)
A [starter template](https://livecodes.io/docs/features/templates) to load.
Allowed valued can be found [here](https://livecodes.io/docs/api/internal/type-aliases/TemplateName).
#### tests?
> `optional` **tests**: (\{ language?: Language \| undefined; content?: string \| undefined; contentUrl?: string \| undefined; hiddenContent?: string \| undefined; hiddenContentUrl?: string \| undefined; ... 5 more ...; position?: EditorPosition \| undefined; \} \| undefined) & ("" \| ... 4 more ... \| "full")
Configures the [language](https://livecodes.io/docs/features/tests#supported-languages)
and content of [tests](https://livecodes.io/docs/features/tests).
#### theme?
> `optional` **theme**: [`Theme`](../internal/type-aliases/Theme.md)
Sets the app [theme](https://livecodes.io/docs/features/themes) to light/dark mode.
##### Default
```ts
"dark"
```
#### themeColor?
> `optional` **themeColor**: `string`
Sets the app theme color.
If `undefined`, it is set to `"hsl(214, 40%, 50%)"`.
##### Default
```ts
undefined
```
#### title?
> `optional` **title**: `string`
Project title.
This is used as [result page](https://livecodes.io/docs/features/result) title and title meta tag.
Also used in project search.
##### Default
```ts
"Untitled Project"
```
#### tl
> **tl**: `undefined` \| `string`
#### tl-selector
> **tl-selector**: `undefined` \| `string`
#### tools?
> `optional` **tools**: `"none"` \| `"closed"` \| `"open"` \| `"full"` \| `"console"` \| `"compiled"` \| `"tests"` \| "console\|undefined" \| "console\|" \| "console\|none" \| "console\|closed" \| "console\|open" \| "console\|full" \| "compiled\|undefined" \| "compiled\|" \| "compiled\|none" \| "compiled\|closed" \| "compiled\|open" \| "compiled\|full" \| "tests\|undefined" \| "tests\|" \| "tests\|none" \| "tests\|closed" \| "tests\|open" \| "tests\|full" \| "console,console\|undefined" \| "console,console\|" \| "console,console\|none" \| "console,console\|closed" \| "console,console\|open" \| "console,console\|full" \| "console,compiled\|undefined" \| "console,compiled\|" \| "console,compiled\|none" \| "console,compiled\|closed" \| "console,compiled\|open" \| "console,compiled\|full" \| "console,tests\|undefined" \| "console,tests\|" \| "console,tests\|none" \| "console,tests\|closed" \| "console,tests\|open" \| "console,tests\|full" \| "compiled,console\|undefined" \| "compiled,console\|" \| "compiled,console\|none" \| "compiled,console\|closed" \| "compiled,console\|open" \| "compiled,console\|full" \| "compiled,compiled\|undefined" \| "compiled,compiled\|" \| "compiled,compiled\|none" \| "compiled,compiled\|closed" \| "compiled,compiled\|open" \| "compiled,compiled\|full" \| "compiled,tests\|undefined" \| "compiled,tests\|" \| "compiled,tests\|none" \| "compiled,tests\|closed" \| "compiled,tests\|open" \| "compiled,tests\|full" \| "tests,console\|undefined" \| "tests,console\|" \| "tests,console\|none" \| "tests,console\|closed" \| "tests,console\|open" \| "tests,console\|full" \| "tests,compiled\|undefined" \| "tests,compiled\|" \| "tests,compiled\|none" \| "tests,compiled\|closed" \| "tests,compiled\|open" \| "tests,compiled\|full" \| "tests,tests\|undefined" \| "tests,tests\|" \| "tests,tests\|none" \| "tests,tests\|closed" \| "tests,tests\|open" \| "tests,tests\|full" \| "console,console,console\|undefined" \| "console,console,console\|" \| "console,console,console\|none" \| "console,console,console\|closed" \| "console,console,console\|open" \| "console,console,console\|full" \| "console,console,compiled\|undefined" \| "console,console,compiled\|" \| "console,console,compiled\|none" \| "console,console,compiled\|closed" \| "console,console,compiled\|open" \| "console,console,compiled\|full" \| "console,console,tests\|undefined" \| "console,console,tests\|" \| "console,console,tests\|none" \| "console,console,tests\|closed" \| "console,console,tests\|open" \| "console,console,tests\|full" \| "console,compiled,console\|undefined" \| "console,compiled,console\|" \| "console,compiled,console\|none" \| "console,compiled,console\|closed" \| "console,compiled,console\|open" \| "console,compiled,console\|full" \| "console,compiled,compiled\|undefined" \| "console,compiled,compiled\|" \| "console,compiled,compiled\|none" \| "console,compiled,compiled\|closed" \| "console,compiled,compiled\|open" \| "console,compiled,compiled\|full" \| "console,compiled,tests\|undefined" \| "console,compiled,tests\|" \| "console,compiled,tests\|none" \| "console,compiled,tests\|closed" \| "console,compiled,tests\|open" \| "console,compiled,tests\|full" \| "console,tests,console\|undefined" \| "console,tests,console\|" \| "console,tests,console\|none" \| "console,tests,console\|closed" \| "console,tests,console\|open" \| "console,tests,console\|full" \| "console,tests,compiled\|undefined" \| "console,tests,compiled\|" \| "console,tests,compiled\|none" \| "console,tests,compiled\|closed" \| "console,tests,compiled\|open" \| "console,tests,compiled\|full" \| "console,tests,tests\|undefined" \| "console,tests,tests\|" \| "console,tests,tests\|none" \| "console,tests,tests\|closed" \| "console,tests,tests\|open" \| "console,tests,tests\|full" \| "compiled,console,console\|undefined" \| "compiled,console,console\|" \| "compiled,console,console\|none" \| "compiled,console,console\|closed" \| "compiled,console,console\|open" \| "compiled,console,console\|full" \| "compiled,console,compiled\|undefined" \| "compiled,console,compiled\|" \| "compiled,console,compiled\|none" \| "compiled,console,compiled\|closed" \| "compiled,console,compiled\|open" \| "compiled,console,compiled\|full" \| "compiled,console,tests\|undefined" \| "compiled,console,tests\|" \| "compiled,console,tests\|none" \| "compiled,console,tests\|closed" \| "compiled,console,tests\|open" \| "compiled,console,tests\|full" \| "compiled,compiled,console\|undefined" \| "compiled,compiled,console\|" \| "compiled,compiled,console\|none" \| "compiled,compiled,console\|closed" \| "compiled,compiled,console\|open" \| "compiled,compiled,console\|full" \| "compiled,compiled,compiled\|undefined" \| "compiled,compiled,compiled\|" \| "compiled,compiled,compiled\|none" \| "compiled,compiled,compiled\|closed" \| "compiled,compiled,compiled\|open" \| "compiled,compiled,compiled\|full" \| "compiled,compiled,tests\|undefined" \| "compiled,compiled,tests\|" \| "compiled,compiled,tests\|none" \| "compiled,compiled,tests\|closed" \| "compiled,compiled,tests\|open" \| "compiled,compiled,tests\|full" \| "compiled,tests,console\|undefined" \| "compiled,tests,console\|" \| "compiled,tests,console\|none" \| "compiled,tests,console\|closed" \| "compiled,tests,console\|open" \| "compiled,tests,console\|full" \| "compiled,tests,compiled\|undefined" \| "compiled,tests,compiled\|" \| "compiled,tests,compiled\|none" \| "compiled,tests,compiled\|closed" \| "compiled,tests,compiled\|open" \| "compiled,tests,compiled\|full" \| "compiled,tests,tests\|undefined" \| "compiled,tests,tests\|" \| "compiled,tests,tests\|none" \| "compiled,tests,tests\|closed" \| "compiled,tests,tests\|open" \| "compiled,tests,tests\|full" \| "tests,console,console\|undefined" \| "tests,console,console\|" \| "tests,console,console\|none" \| "tests,console,console\|closed" \| "tests,console,console\|open" \| "tests,console,console\|full" \| "tests,console,compiled\|undefined" \| "tests,console,compiled\|" \| "tests,console,compiled\|none" \| "tests,console,compiled\|closed" \| "tests,console,compiled\|open" \| "tests,console,compiled\|full" \| "tests,console,tests\|undefined" \| "tests,console,tests\|" \| "tests,console,tests\|none" \| "tests,console,tests\|closed" \| "tests,console,tests\|open" \| "tests,console,tests\|full" \| "tests,compiled,console\|undefined" \| "tests,compiled,console\|" \| "tests,compiled,console\|none" \| "tests,compiled,console\|closed" \| "tests,compiled,console\|open" \| "tests,compiled,console\|full" \| "tests,compiled,compiled\|undefined" \| "tests,compiled,compiled\|" \| "tests,compiled,compiled\|none" \| "tests,compiled,compiled\|closed" \| "tests,compiled,compiled\|open" \| "tests,compiled,compiled\|full" \| "tests,compiled,tests\|undefined" \| "tests,compiled,tests\|" \| "tests,compiled,tests\|none" \| "tests,compiled,tests\|closed" \| "tests,compiled,tests\|open" \| "tests,compiled,tests\|full" \| "tests,tests,console\|undefined" \| "tests,tests,console\|" \| "tests,tests,console\|none" \| "tests,tests,console\|closed" \| "tests,tests,console\|open" \| "tests,tests,console\|full" \| "tests,tests,compiled\|undefined" \| "tests,tests,compiled\|" \| "tests,tests,compiled\|none" \| "tests,tests,compiled\|closed" \| "tests,tests,compiled\|open" \| "tests,tests,compiled\|full" \| "tests,tests,tests\|undefined" \| "tests,tests,tests\|" \| "tests,tests,tests\|none" \| "tests,tests,tests\|closed" \| "tests,tests,tests\|open" \| "tests,tests,tests\|full"
#### trailingComma?
> `optional` **trailingComma**: `boolean`
Configures Prettier [code formatter](https://livecodes.io/docs/features/code-format) to use [trailing commas](https://prettier.io/docs/en/options.html#trailing-commas).
##### Default
```ts
true
```
#### ts
> **ts**: `undefined` \| `string`
#### ts-selector
> **ts-selector**: `undefined` \| `string`
#### tsx
> **tsx**: `undefined` \| `string`
#### tsx-selector
> **tsx-selector**: `undefined` \| `string`
#### twig
> **twig**: `undefined` \| `string`
#### twig-selector
> **twig-selector**: `undefined` \| `string`
#### types?
> `optional` **types**: `object`
Allows providing custom TypeScript type declarations for better [editor intellisense](https://livecodes.io/docs/features/intellisense).
It is an object where each key represents module name and value represents the types.
See docs for [Types](https://livecodes.io/docs/configuration/configuration-object#types)
and [Custom Types](https://livecodes.io/docs/features/intellisense#custom-types)
##### Examples
```js
{
"types": {
"my-demo-lib": "https://my-custom-domain/my-type-declarations.d.ts"
}
}
```
```
{
"types": {
"my-demo-lib": {
"url": "https://my-custom-domain/types.d.ts",
"autoload": true,
"declareAsModule": true
}
}
```
#### typescript
> **typescript**: `undefined` \| `string`
#### typescript-selector
> **typescript-selector**: `undefined` \| `string`
#### useTabs?
> `optional` **useTabs**: `boolean`
If `true`, lines are indented with tabs instead of spaces.
Also used in [code formatting](https://livecodes.io/docs/features/code-format).
##### Default
```ts
false
```
#### vento
> **vento**: `undefined` \| `string`
#### vento-selector
> **vento-selector**: `undefined` \| `string`
#### version?
> `readonly` `optional` **version**: `string`
This is a read-only property which specifies the current LiveCodes version.
Version specified in [exported](https://livecodes.io/docs/features/export) projects allows automatically upgrading the project configuration when imported by an app with a newer version.
#### ~~view?~~
> `optional` **view**: `"split"` \| `"result"` \| `"editor"`
##### Deprecated
The `view` option has been moved to `config.view`.
For headless mode use `headless: true`.
The [default view](https://livecodes.io/docs/features/default-view) for the playground.
When set to `"headless"`, the playground is loaded in [headless mode](https://livecodes.io/docs/sdk/headless).
##### Default
```ts
"split"
```
#### vto
> **vto**: `undefined` \| `string`
#### vto-selector
> **vto-selector**: `undefined` \| `string`
#### vue
> **vue**: `undefined` \| `string`
#### vue-app
> **vue-app**: `undefined` \| `string`
#### vue-app-selector
> **vue-app-selector**: `undefined` \| `string`
#### vue-selector
> **vue-selector**: `undefined` \| `string`
#### vue2
> **vue2**: `undefined` \| `string`
#### vue2-selector
> **vue2-selector**: `undefined` \| `string`
#### vue3
> **vue3**: `undefined` \| `string`
#### vue3-selector
> **vue3-selector**: `undefined` \| `string`
#### wasm
> **wasm**: `undefined` \| `string`
#### wasm-selector
> **wasm-selector**: `undefined` \| `string`
#### wasm.cpp
> **cpp**: `undefined` \| `string`
#### wasm.cpp-selector
> **cpp-selector**: `undefined` \| `string`
#### wasm.cs
> **cs**: `undefined` \| `string`
#### wasm.cs-selector
> **cs-selector**: `undefined` \| `string`
#### wasm.lua
> **lua**: `undefined` \| `string`
#### wasm.lua-selector
> **lua-selector**: `undefined` \| `string`
#### wasm.php
> **php**: `undefined` \| `string`
#### wasm.php-selector
> **php-selector**: `undefined` \| `string`
#### wasm.py
> **py**: `undefined` \| `string`
#### wasm.py-selector
> **py-selector**: `undefined` \| `string`
#### wasm.rb
> **rb**: `undefined` \| `string`
#### wasm.rb-selector
> **rb-selector**: `undefined` \| `string`
#### wast
> **wast**: `undefined` \| `string`
#### wast-selector
> **wast-selector**: `undefined` \| `string`
#### wat
> **wat**: `undefined` \| `string`
#### wat-selector
> **wat-selector**: `undefined` \| `string`
#### webassembly
> **webassembly**: `undefined` \| `string`
#### webassembly-selector
> **webassembly-selector**: `undefined` \| `string`
#### welcome?
> `optional` **welcome**: `boolean`
If `true`, the [welcome screen](https://livecodes.io/docs/features/welcome) is displayed when the app loads.
#### wordWrap?
> `optional` **wordWrap**: `boolean`
Enables word-wrap for long lines.
##### Default
```ts
false
```
#### x?
> `optional` **x**: `string`
#### xht
> **xht**: `undefined` \| `string`
#### xht-selector
> **xht-selector**: `undefined` \| `string`
#### xml
> **xml**: `undefined` \| `string`
#### xml-selector
> **xml-selector**: `undefined` \| `string`
#### zoom?
> `optional` **zoom**: `1` \| `0.5` \| `0.25`
Sets result page [zoom level](https://livecodes.io/docs/features/result#result-page-zoom).
#### Defined in
[models.ts:338](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L338)
***
### template?
> `optional` **template**: [`TemplateName`](../internal/type-aliases/TemplateName.md)
A [starter template](https://livecodes.io/docs/features/templates) to load.
Allowed valued can be found [here](https://livecodes.io/docs/api/internal/type-aliases/TemplateName).
#### Defined in
[models.ts:383](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L383)
***
### ~~view?~~
> `optional` **view**: `"split"` \| `"result"` \| `"editor"` \| `"headless"`
#### Deprecated
The `view` option has been moved to `config.view`.
For headless mode use `headless: true`.
The [default view](https://livecodes.io/docs/features/default-view) for the playground.
When set to `"headless"`, the playground is loaded in [headless mode](https://livecodes.io/docs/sdk/headless).
#### Default
```ts
"split"
```
#### Defined in
[models.ts:396](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L396)
---
# Interface: Playground
An object that represents the LiveCodes playground instance.
The object exposes multiple [methods](https://livecodes.io/docs/sdk/js-ts/#sdk-methods) that can be used to interact with the playground.
See [docs](https://livecodes.io/docs/sdk/js-ts) for details.
## Extends
- [`API`](../internal/interfaces/API.md)
## Properties
### destroy()
> **destroy**: () => `Promise`\<`void`\>
Destroys the playground instance, and removes event listeners.
Further call to any SDK methods throws an error.
#### Returns
`Promise`\<`void`\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
await playground.destroy();
// playground destroyed
// any further SDK call throws an error
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`destroy`](../internal/interfaces/API.md#destroy)
#### Defined in
[models.ts:211](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L211)
***
### exec()
> **exec**: (`command`, ...`args`) => `Promise`\<`object` \| `object`\>
Executes custom commands, including: `"setBroadcastToken"` and `"showVersion"`.
See [docs](https://livecodes.io/docs/sdk/js-ts#exec) for details.
#### Parameters
• **command**: [`APICommands`](../internal/type-aliases/APICommands.md)
• ...**args**: `any`[]
#### Returns
`Promise`\<`object` \| `object`\>
#### Inherited from
[`API`](../internal/interfaces/API.md).[`exec`](../internal/interfaces/API.md#exec)
#### Defined in
[models.ts:194](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L194)
***
### format()
> **format**: (`allEditors`?) => `Promise`\<`void`\>
Formats the code.
By default, the code in all editors (markup, style and script) is formatted.
To format only the active editor, the value `false` should be passed as an argument.
#### Parameters
• **allEditors?**: `boolean`
#### Returns
`Promise`\<`void`\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
await playground.format();
// code in editors is formatted
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`format`](../internal/interfaces/API.md#format)
#### Defined in
[models.ts:31](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L31)
***
### getCode()
> **getCode**: () => `Promise`\<[`Code`](Code.md)\>
Gets the playground code (including source code, source language and compiled code) for each editor (markup, style, script), in addition to result page HTML.
See [Code](https://livecodes.io/docs/api/interfaces/Code) for the structure of the returned object.
#### Returns
`Promise`\<[`Code`](Code.md)\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const code = await playground.getCode();
// source code, language and compiled code for the script editor
const { content, language, compiled } = code.script;
// result page HTML
const result = code.result;
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`getCode`](../internal/interfaces/API.md#getcode)
#### Defined in
[models.ts:105](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L105)
***
### getConfig()
> **getConfig**: (`contentOnly`?) => `Promise`\<[`Config`](Config.md)\>
Gets a [configuration object](https://livecodes.io/docs/configuration/configuration-object) representing the playground state.
This can be used to restore state if passed as an [EmbedOptions](https://livecodes.io/docs/sdk/js-ts#embed-options) property when [creating playgrounds](https://livecodes.io/docs/sdk/js-ts/#createplayground),
or can be manipulated and loaded in run-time using [`setConfig`](https://livecodes.io/docs/sdk/js-ts#setconfig) method.
#### Parameters
• **contentOnly?**: `boolean`
#### Returns
`Promise`\<[`Config`](Config.md)\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const config = await playground.getConfig();
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`getConfig`](../internal/interfaces/API.md#getconfig)
#### Defined in
[models.ts:64](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L64)
***
### getShareUrl()
> **getShareUrl**: (`shortUrl`?) => `Promise`\<`string`\>
Gets a [share url](https://livecodes.io/docs/features/share) for the current project.
By default, the url has a long query string representing the compressed encoded config object.
If the argument `shortUrl` was set to `true`, a short url is generated.
#### Parameters
• **shortUrl?**: `boolean`
#### Returns
`Promise`\<`string`\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const longUrl = await playground.getShareUrl();
const shortUrl = await playground.getShareUrl(true);
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`getShareUrl`](../internal/interfaces/API.md#getshareurl)
#### Defined in
[models.ts:48](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L48)
***
### load()
> **load**: () => `Promise`\<`void`\>
Loads the playground, if not already loaded.
When the embed option [loading](https://livecodes.io/docs/sdk/js-ts#loading) is set to `"click"`, the playground is not loaded automatically.
Instead, a screen is shown with "Click to load" button. Calling the SDK method `load()` allows loading the playground.
If the playground was not loaded, calling any other method will load the playground first before executing.
#### Returns
`Promise`\<`void`\>
#### Defined in
[models.ts:298](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L298)
***
### ~~onChange()~~
> **onChange**: (`fn`) => `object`
Runs a callback function when code changes.
#### Parameters
• **fn**
#### Returns
`object`
##### ~~remove()~~
> **remove**: () => `void`
###### Returns
`void`
#### Deprecated
Use [`watch`](https://livecodes.io/docs/sdk/js-ts#watch) method instead.
#### Inherited from
[`API`](../internal/interfaces/API.md).[`onChange`](../internal/interfaces/API.md#onchange)
#### Defined in
[models.ts:142](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L142)
***
### run()
> **run**: () => `Promise`\<`void`\>
Runs the [result page](https://livecodes.io/docs/features/result) (after any required compilation for code).
#### Returns
`Promise`\<`void`\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
await playground.run();
// new result page is displayed
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`run`](../internal/interfaces/API.md#run)
#### Defined in
[models.ts:14](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L14)
***
### runTests()
> **runTests**: () => `Promise`\<`object`\>
Runs project [tests](https://livecodes.io/docs/features/tests) (if present) and gets test results.
#### Returns
`Promise`\<`object`\>
##### results
> **results**: [`TestResult`](../internal/interfaces/TestResult.md)[]
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const { results } = await playground.runTests();
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`runTests`](../internal/interfaces/API.md#runtests)
#### Defined in
[models.ts:135](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L135)
***
### setConfig()
> **setConfig**: (`config`) => `Promise`\<[`Config`](Config.md)\>
Loads a new project using the passed configuration object.
#### Parameters
• **config**: `Partial`\<[`Config`](Config.md)\>
#### Returns
`Promise`\<[`Config`](Config.md)\>
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then(async (playground) => {
const config = {
markup: {
language: "html",
content: "Hello World!",
},
};
const newConfig = await playground.setConfig(config);
// new project loaded
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`setConfig`](../internal/interfaces/API.md#setconfig)
#### Defined in
[models.ts:84](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L84)
***
### show()
> **show**: (`panel`, `options`?) => `Promise`\<`void`\>
Shows the selected panel.
See [docs](https://livecodes.io/docs/sdk/js-ts#show) for details.
#### Parameters
• **panel**: `"result"` \| [`EditorId`](../internal/type-aliases/EditorId.md) \| `"console"` \| `"compiled"` \| `"tests"` \| `"editor"` \| `"toggle-result"`
• **options?**
• **options.column?**: `number`
• **options.full?**: `boolean`
• **options.line?**: `number`
• **options.zoom?**: `1` \| `0.5` \| `0.25`
#### Returns
`Promise`\<`void`\>
#### Example
```ts
await playground.show("style");
await playground.show("toggle-result");
await playground.show("result", { full: true });
await playground.show("script");
await playground.show("result", { zoom: 0.5 });
await playground.show("console", { full: true });
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`show`](../internal/interfaces/API.md#show)
#### Defined in
[models.ts:119](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L119)
***
### watch
> **watch**: [`WatchLoad`](../internal/type-aliases/WatchLoad.md) & [`WatchReady`](../internal/type-aliases/WatchReady.md) & [`WatchCode`](../internal/type-aliases/WatchCode.md) & [`WatchConsole`](../internal/type-aliases/WatchConsole.md) & [`WatchTests`](../internal/type-aliases/WatchTests.md) & [`WatchDestroy`](../internal/type-aliases/WatchDestroy.md)
Allows to watch for various playground events.
It takes 2 arguments: event name and a callback function that will be called on every event.
event name can be one of: `"load" | "ready" | "code" | "console" | "tests" | "destroy"`
In some events, the callback function will be called with an object that supplies relevant data to the callback function (e.g. code, console output, test results).
The watch method returns an object with a single method (`remove`), which when called will remove the callback from watching further events.
See [docs](https://livecodes.io/docs/sdk/js-ts#watch) for details.
#### Example
```ts
import { createPlayground } from "livecodes";
createPlayground("#container").then((playground) => {
const codeWatcher = playground.watch("code", ({ code, config }) => {
// this will run on every code change
console.log("code:", code);
console.log("config:", config);
});
const consoleWatcher = playground.watch("console", ({ method, args }) => {
// this will run on every console output
console[method](...args);
});
const testsWatcher = playground.watch("tests", ({ results }) => {
// this will run when tests run
results.forEach((testResult) => {
console.log("status:", testResult.status); // "pass", "fail" or "skip"
console.log(testResult.errors); // array of errors as strings
});
});
// then later
codeWatcher.remove();
consoleWatcher.remove();
testsWatcher.remove();
// events are no longer watched
});
```
#### Inherited from
[`API`](../internal/interfaces/API.md).[`watch`](../internal/interfaces/API.md#watch)
#### Defined in
[models.ts:187](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L187)
---
# Type Alias: Language
> **Language**: `"html"` \| `"htm"` \| `"markdown"` \| `"md"` \| `"mdown"` \| `"mkdn"` \| `"mdx"` \| `"astro"` \| `"pug"` \| `"jade"` \| `"haml"` \| `"asciidoc"` \| `"adoc"` \| `"asc"` \| `"mustache"` \| `"handlebars"` \| `"hbs"` \| `"ejs"` \| `"eta"` \| `"nunjucks"` \| `"njk"` \| `"liquid"` \| `"liquidjs"` \| `"dot"` \| `"twig"` \| `"vento"` \| `"vto"` \| `"art-template"` \| `"art"` \| `"jinja"` \| `"bbcode"` \| `"bb"` \| `"mjml"` \| `"diagrams"` \| `"diagram"` \| `"graph"` \| `"plt"` \| `"richtext"` \| `"rte"` \| `"rich"` \| `"rte.html"` \| `"css"` \| `"scss"` \| `"sass"` \| `"less"` \| `"stylus"` \| `"styl"` \| `"stylis"` \| `"postcss"` \| `"javascript"` \| `"js"` \| `"json"` \| `"babel"` \| `"es"` \| `"sucrase"` \| `"typescript"` \| `"flow"` \| `"ts"` \| `"jsx"` \| `"tsx"` \| `"react"` \| `"react-jsx"` \| `"react.jsx"` \| `"react-tsx"` \| `"react.tsx"` \| `"react-native"` \| `"react-native.jsx"` \| `"react-native-tsx"` \| `"react-native.tsx"` \| `"vue"` \| `"vue3"` \| `"vue2"` \| `"vue-app"` \| `"app.vue"` \| `"svelte"` \| `"svelte-app"` \| `"app.svelte"` \| `"stencil"` \| `"stencil.tsx"` \| `"solid"` \| `"solid.jsx"` \| `"solid.tsx"` \| `"riot"` \| `"riotjs"` \| `"malina"` \| `"malinajs"` \| `"xht"` \| `"coffeescript"` \| `"coffee"` \| `"livescript"` \| `"ls"` \| `"civet"` \| `"clio"` \| `"imba"` \| `"assemblyscript"` \| `"as"` \| `"python"` \| `"py"` \| `"pyodide"` \| `"python-wasm"` \| `"py-wasm"` \| `"pythonwasm"` \| `"pywasm"` \| `"py3"` \| `"wasm.py"` \| `"r"` \| `"rlang"` \| `"rstats"` \| `"r-wasm"` \| `"ruby"` \| `"rb"` \| `"ruby-wasm"` \| `"wasm.rb"` \| `"rubywasm"` \| `"go"` \| `"golang"` \| `"php"` \| `"php-wasm"` \| `"phpwasm"` \| `"wasm.php"` \| `"cpp"` \| `"c"` \| `"C"` \| `"cp"` \| `"cxx"` \| `"c++"` \| `"cppm"` \| `"ixx"` \| `"ii"` \| `"hpp"` \| `"h"` \| `"cpp-wasm"` \| `"cppwasm"` \| `"cwasm"` \| `"wasm.cpp"` \| `"clang"` \| `"clang.cpp"` \| `"java"` \| `"csharp"` \| `"csharp-wasm"` \| `"cs"` \| `"cs-wasm"` \| `"wasm.cs"` \| `"perl"` \| `"pl"` \| `"pm"` \| `"lua"` \| `"lua-wasm"` \| `"luawasm"` \| `"wasm.lua"` \| `"teal"` \| `"tl"` \| `"fennel"` \| `"fnl"` \| `"julia"` \| `"jl"` \| `"scheme"` \| `"scm"` \| `"commonlisp"` \| `"common-lisp"` \| `"lisp"` \| `"clojurescript"` \| `"clojure"` \| `"cljs"` \| `"clj"` \| `"cljc"` \| `"edn"` \| `"gleam"` \| `"rescript"` \| `"res"` \| `"resi"` \| `"reason"` \| `"re"` \| `"rei"` \| `"ocaml"` \| `"ml"` \| `"mli"` \| `"tcl"` \| `"wat"` \| `"wast"` \| `"webassembly"` \| `"wasm"` \| `"Binary"` \| `"sql"` \| `"sqlite"` \| `"sqlite3"` \| `"pg.sql"` \| `"pgsql.sql"` \| `"pgsql"` \| `"pg"` \| `"pglite"` \| `"pglite.sql"` \| `"postgresql"` \| `"postgres"` \| `"postgre.sql"` \| `"postgresql.sql"` \| `"prolog.pl"` \| `"prolog"` \| `"blockly"` \| `"blockly.xml"` \| `"xml"` \| `"pintora"`
Language name, alias or extension.
## Defined in
[models.ts:884](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/models.ts#L884)
---
# Function: createPlayground()
## createPlayground(container, options)
> **createPlayground**(`container`, `options`?): `Promise`\<[`Playground`](../interfaces/Playground.md)\>
Creates a LiveCodes playground.
### Parameters
• **container**: `string` \| `HTMLElement`
`HTMLElement` or a string representing a CSS selector. This is the container where the playground is rendered.
If not found, an error is thrown (except in [headless mode](https://livecodes.io/docs/sdk/headless), in which this parameter is optional and can be omitted).
• **options?**: [`EmbedOptions`](../interfaces/EmbedOptions.md)
The [embed options](https://livecodes.io/docs/sdk/js-ts#embed-options) for the playground (optional).
### Returns
`Promise`\<[`Playground`](../interfaces/Playground.md)\>
- A promise that resolves to a [`Playground`](https://livecodes.io/docs/api/interfaces/Playground/) object which exposes many [SDK methods](https://livecodes.io/docs/sdk/js-ts/#sdk-methods) that can be used to interact with the playground.
### Defined in
[index.ts:26](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/index.ts#L26)
## createPlayground(options)
> **createPlayground**(`options`): `Promise`\<[`Playground`](../interfaces/Playground.md)\>
### Parameters
• **options**: [`EmbedOptions`](../interfaces/EmbedOptions.md) & `object`
### Returns
`Promise`\<[`Playground`](../interfaces/Playground.md)\>
### Defined in
[index.ts:30](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/index.ts#L30)
---
# Function: getPlaygroundUrl()
> **getPlaygroundUrl**(`options`): `string`
Gets the URL to a LiveCodes playground (as a string) from the provided [options](https://livecodes.io/docs/sdk/js-ts#embed-options).
This can be useful for providing links to run code in playgrounds.
## Parameters
• **options**: [`EmbedOptions`](../interfaces/EmbedOptions.md) = `{}`
The [options](https://livecodes.io/docs/sdk/js-ts#embed-options) for the playground.
## Returns
`string`
- The URL of the playground (as a string).
large objects like config and params are store in the url hash params while the rest are in the search params
unless config is a string in which case it is stored in searchParams
## Defined in
[index.ts:391](https://github.com/live-codes/livecodes/blob/20eb9b8331593156d8ae65b1f7d55b1d35bf7b33/src/sdk/index.ts#L391)