Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/c8r/gen

Compositor JSX static site generator
https://github.com/c8r/gen

compositor iso jsx lab react static-site-generator

Last synced: 3 months ago
JSON representation

Compositor JSX static site generator

Awesome Lists containing this project

README

        

# Gen

Compositor JSX static site generator

```sh
npm i @compositor/gen -g
```

- Build static sites with [Lab][lab] components and [Iso][iso] JSX files
- Exports static HTML and inlined CSS
- Handles multiple routes
- Export CSS using styled-components, glamorous, and more
- Use Lab components and themes in markdown
- Pass props data via front-matter

## Usage

Export a static site:

```sh
gen . --out-dir dist
```

Run in development mode:

```sh
gen . --dev
```

### How it works

Given a folder structure like the following:

```
dist/
src/
about.jsx
index.jsx
lab.json
theme.json
```

Running `gen src --out-dir dist` will create HTML files:

```
dist/
about/
index.html
index.html
```

### Files

Gen will load `theme.json` and `lab.json` files in the target directory and import Lab components.
Any files ending with `.jsx` or `.md` will be used to create pages.
Markdown and JSX files can include [front-matter][front-matter] for setting page-level attributes,
such as title and description, and also be passed to the page component as props.

**Example JSX file**

```jsx
---
title: Hello World
description: This is a demo page
---

{props.title}

```

### Front Matter Options

All front matter is passed to the JSX file as a `props` object.
Additionally, page-level metadata can be set using the following properties:

- `title` page title
- `description` page description
- `og` object of open graph data
- `twitter` object of Twitter card data
- `stylesheets` array of stylesheet URLs to add as links in the head
- `scripts` array of JavaScript strings to include before the closing body tag

### Layouts

When rendering markdown files, Gen will look for a `layout` property in front-matter. If a JSX file with the same name is found, it will be used as a page layout component, passing the rendered markdown content as children.

**Example markdown file**

```md
---
title: About
layout: default-layout
---

# About
```

**Example JSX layout file**

```jsx
---
---

{props.children}

```

### CLI options

- `--out-dir`, `-d`: output directory
- `--dev`, `-D`: run as development server
- `--open`, `-o`: open development server in default browser
- `--port`, `-p`: set port for development server

---

[Made by Compositor](https://compositor.io/)
|
[MIT License](LICENSE.md)

[lab]: https://compositor.io/lab/
[iso]: https://compositor.io/iso/
[front-matter]: https://jekyllrb.com/docs/frontmatter/
[open-formats]: https://compositor.io/blog/open-formats/