Compare commits

..

104 Commits

Author SHA1 Message Date
Thomas Allmer
2ac51803db chore: converted 2022-02-20 01:25:50 +01:00
Thomas Allmer
79312ccb8d chore: dynamic port while testing 2022-02-20 00:41:54 +01:00
Thomas Allmer
6d1a2933fa wip 2022-02-20 00:06:06 +01:00
Thomas Allmer
ba82d317fc chore: stuff 2022-02-20 00:05:06 +01:00
Thomas Allmer
3b14db0f9a chore: format 2022-02-18 14:38:50 +01:00
Thomas Allmer
93d9944ae5 chore: more types 2022-02-18 14:36:56 +01:00
Thomas Allmer
4fd8388750 chore: more types & remove setGlobalOptions 2022-02-14 11:13:44 +01:00
Thomas Allmer
8e1301ed64 chore: use stable typescript 2022-02-13 22:31:00 +01:00
Thomas Allmer
936b9500b3 chore: all typed 2022-02-13 21:52:54 +01:00
Thomas Allmer
41e132001b chore: cli types 2022-02-12 21:08:36 +01:00
Thomas Allmer
c4c9ee687f chore: types types types 2022-02-11 09:25:58 +01:00
Thomas Allmer
b59179864f chore: replace diary with node native logging 2022-02-10 21:36:25 +01:00
Thomas Allmer
9c6fb114b7 chore: more types 2022-02-10 21:14:52 +01:00
Thomas Allmer
c5039d501e chore: types 2022-02-09 13:36:34 +01:00
Thomas Allmer
4d511f7a62 chore: render error page 2022-02-08 21:47:04 +01:00
Thomas Allmer
463dc82d60 chore: more alpha releases 2022-02-07 13:03:16 +01:00
Thomas Allmer
ab1bbf166f feat: engine 2022-02-02 23:08:30 +01:00
github-actions[bot]
08181194e2 Version Packages 2022-01-31 13:45:06 +01:00
Thomas Allmer
97cb38ccb8 fix(mdjs-core): add missing slash dependency 2022-01-31 13:43:36 +01:00
github-actions[bot]
26d3de1444 Version Packages 2022-01-30 11:48:03 +01:00
Thomas Allmer
1f141058c1 fix(drawer): add export map with /define side effect import 2022-01-30 11:45:47 +01:00
github-actions[bot]
08574c9b31 Version Packages 2022-01-05 09:34:58 +01:00
gvangeest
e81b77f236 fix(mdjs-preview): separate preview and viewer theme styling 2022-01-03 18:36:09 +01:00
qa46hx
456b8e78f0 fix(mdjs-preview): add css variable to border-color of viewer 2021-12-05 13:30:28 +01:00
github-actions[bot]
0d7ea015af Version Packages 2021-11-16 18:48:20 +01:00
Thomas Allmer
445b02872f fix: update to latest lit, @open-wc, @lion packages 2021-11-16 17:07:53 +01:00
Thomas Allmer
1a599db3ed chore: lock file maintainance 2021-11-16 08:05:37 +01:00
Thomas Allmer
6b6bed5391 chore: update remark-html 2021-11-16 08:05:37 +01:00
github-actions[bot]
30eb822151 Version Packages 2021-11-11 10:11:42 +01:00
Thomas Allmer
15a82c0e4d fix: improve mdjs preview iframe security 2021-11-11 10:05:51 +01:00
github-actions[bot]
0197bee621 Version Packages 2021-10-15 19:25:11 +02:00
Thomas Allmer
5c6b9c91eb feat(mdjs-preview): Move platform and sizes settings above preview 2021-10-15 12:33:30 +02:00
Thomas Allmer
6221e5f9ea feat: mdjs support for story-code blocks 2021-10-15 12:33:30 +02:00
Jorge del Casar
06741ed729 chore: update playwright 2021-10-11 19:23:33 +02:00
Thomas Allmer
23c164c822 chore: reduce test output noise 2021-10-03 22:06:22 +02:00
github-actions[bot]
c2a76c3f53 Version Packages 2021-10-03 17:15:38 +02:00
Thomas Allmer
70bb7a128e feat: update all packages to use new plugins-manager api 2021-10-03 17:10:18 +02:00
Thomas Allmer
3c342473d7 feat(plugin-manager): new type safe API
Co-authored-by: Benny Powers <web@bennypowers.com>
2021-10-03 17:10:18 +02:00
Thomas Allmer
9e0579ab19 chore: version linting considering valid semver 2021-09-13 15:22:52 +02:00
Thomas Allmer
de202da0a5 chore: reenable all tests 2021-09-13 15:22:52 +02:00
github-actions[bot]
509a8d9115 Version Packages 2021-09-13 13:33:26 +02:00
Mathieu Puech
42418f2c00 fix: disable service worker for local development 2021-09-13 13:29:05 +02:00
Benny Powers
cadd8588b0 fix(blog): conditionally apply blog overview styles 2021-09-13 12:36:51 +02:00
Benny Powers
aabe011427 Update 30-articles.njk 2021-09-13 12:36:51 +02:00
qa46hx
e1089c5701 fix(blog): add title to blog page 2021-09-13 12:36:38 +02:00
Benny Powers
9f10386eb2 fix: hide 404 page from sitemap.xml 2021-08-10 23:57:52 +02:00
qa46hx
0987a41620 fix(mdjs-viewer): fix styling mdjs-viewer 2021-08-10 23:55:09 +02:00
Thomas Allmer
7301a0f354 feat(cli): enable conditional eleventy config 2021-08-01 16:49:20 +02:00
Thomas Allmer
5ac6aa6693 fix(cli): set the encoding of the simulator to utf8 2021-07-27 21:03:51 +02:00
github-actions[bot]
9f1633cccc Version Packages 2021-07-27 12:54:55 +02:00
Thijs Louisse
00f4a91550 fix(blog): alignment + spacings for article grids 2021-07-27 12:51:30 +02:00
Jorge del Casar
eb62dd9fd5 fix: use semver to lint versions 2021-07-21 20:42:22 +02:00
github-actions[bot]
bb07267289 Version Packages 2021-07-21 16:36:44 +02:00
Thomas Allmer
738941afdd feat(cli): add rollup config function to rocket config 2021-07-21 15:57:31 +02:00
github-actions[bot]
ef086c7aa3 Version Packages 2021-07-19 19:32:13 +02:00
Thijs Louisse
3d22fbb72e fix: make markdown css not conflict with lion components 2021-07-19 16:23:52 +02:00
Jorge del Casar
adf0f1d88f fix(cli): use openEnd to insert responsive image 2021-07-19 15:23:00 +02:00
Benny Powers
4145031162 docs: update code-tabs 2021-07-18 14:57:10 +03:00
Benny Powers
ac58953527 docs: nicer dark mode 2021-07-15 09:34:36 +02:00
Benny Powers
7dc3e0f9b0 docs: dark mode 2021-07-15 09:34:36 +02:00
Benny Powers
305a657ff5 docs: generated manifests 2021-07-15 09:34:36 +02:00
Thomas Allmer
8585e2ad66 chore: add open in vs code to readme 2021-07-15 08:56:18 +02:00
github-actions[bot]
4585675b00 Version Packages 2021-07-13 19:45:32 +02:00
Jorge del Casar
39f4fa7050 chore: update dependencies 2021-07-13 19:24:26 +02:00
github-actions[bot]
ccdd4d077e Version Packages 2021-07-11 17:02:49 +03:00
Benny Powers
a5661b85c2 chore: update dependencies 2021-07-11 17:01:27 +03:00
github-actions[bot]
99b12c7c9e Version Packages 2021-07-11 16:03:49 +03:00
Benny Powers
61bb700c3e fix(plugins-manager): dist types 2021-07-11 16:00:10 +03:00
github-actions[bot]
aa93c2ad89 Version Packages 2021-07-11 14:57:17 +03:00
Benny Powers
8e9c0a3106 chore: prettier 2021-07-11 14:48:06 +03:00
Benny Powers
1c68a95c3c docs: generated READMEs 2021-07-11 14:48:06 +03:00
Benny Powers
c1876da2ff docs: improve guides 2021-07-11 14:48:06 +03:00
Thomas Allmer
3dde0ab096 chore: fix link on launch preset page 2021-07-11 14:48:06 +03:00
Benny Powers
09caa4bcef docs: improve guides 2021-07-11 14:48:06 +03:00
Benny Powers
ddc89e05bb fix(cli): fix setup array types 2021-07-11 14:48:06 +03:00
Benny Powers
7e70d8a327 fix(cli): improve types 2021-07-11 14:48:06 +03:00
Benny Powers
fc8b3a2944 feat(plugins-manager): further improve types 2021-07-11 14:48:06 +03:00
Benny Powers
ee20047305 fix(launch): add inline notification styles for noscript users 2021-07-11 14:48:06 +03:00
Benny Powers
48dcdd7d6d fix(search): hide search for noscript 2021-07-11 14:48:06 +03:00
Benny Powers
03e15051be docs: fix for noscript parser bug 2021-07-11 14:48:06 +03:00
Benny Powers
312d5bec81 docs: style code tabs and markdown tables 2021-07-11 14:48:06 +03:00
Benny Powers
e31e8be75b docs: improve docs for presets 2021-07-11 14:48:06 +03:00
Benny Powers
9978ea7eda fix: improve typings for plugins-manager 2021-07-11 14:48:06 +03:00
Benny Powers
d91e46b867 feat: bootstrap command
also adds code tabs and updates documentation
2021-07-11 14:48:06 +03:00
Benny Powers
174217180b chore: update deps 2021-07-11 14:48:06 +03:00
Konnor Rogers
f6aa1872c2 docs: tiny typo! 2021-07-08 10:24:11 +03:00
Abdón Rodríguez Davila
f5a6cbfb97 Fix inline-notification script import 2021-07-07 18:07:56 +03:00
github-actions[bot]
989758ce03 Version Packages 2021-07-07 15:33:15 +02:00
Thomas Allmer
fbcedde7a0 fix(mdjs-preview): use a scoped registry for the internal accordion element 2021-07-07 15:14:32 +02:00
github-actions[bot]
d72427d889 Version Packages 2021-07-06 12:34:03 +02:00
Jorge del Casar
b7d5cbacf3 fix(launch): remove footer extra comma
Close #197
2021-07-06 11:44:13 +02:00
Benny Powers
8d8c756607 Merge pull request #198 from danihuge/patch-5
Fix typos
2021-07-05 14:01:09 +03:00
Dani Garcia
3750c4e7a2 Fix typos 2021-07-05 12:59:25 +02:00
Benny Powers
5c3eda35a9 Merge pull request #191 from modernweb-dev/changeset-release/main
Version Packages
2021-07-04 22:57:22 +03:00
github-actions[bot]
6910d50bf5 Version Packages 2021-07-04 19:47:35 +00:00
Dani Garcia
a2dc8656db chore: improve wording in getting-started.md (#196) 2021-07-04 21:46:26 +02:00
Benny Powers
e778cd8a3c Update 30-collection-header.njk
fixes #189
2021-07-04 21:45:21 +02:00
Thomas Allmer
9e3c2f52d9 fix(launch): create help & feedback link only if site.helpUrl is defined 2021-07-04 18:21:19 +02:00
Thomas Allmer
579e8e72a2 fix(cli): Unordered joiningBlocks should generally end up at the end 2021-07-04 16:50:11 +02:00
Thomas Allmer
06ae8693b2 docs: add info that a server needs to handle the 404.html file 2021-07-04 16:50:07 +02:00
Thomas Allmer
cee2b7b04c fix(launch): fix font variables 2021-07-04 16:49:40 +02:00
Thomas Allmer
9625b94d39 fix(launch): remove footer urls that require user creation 2021-07-04 16:48:44 +02:00
Benny Powers
1f79d7a047 feat(launch): move font-family to variables 2021-07-04 12:00:31 +02:00
Benny Powers
bf99541951 fix(cli): copy all static assets on build 2021-07-04 12:00:14 +02:00
996 changed files with 24272 additions and 11241 deletions

View File

@@ -10,3 +10,5 @@ _site
_site-dev
__output
__output-dev
docs/_merged*

6
.gitignore vendored
View File

@@ -1,6 +1,5 @@
## editors
/.idea
/.vscode
## system files
.DS_Store
@@ -28,9 +27,7 @@ stats.html
*.tsbuildinfo
## Rocket ignore files (need to be the full relative path to the folders)
docs/_merged_data/
docs/_merged_assets/
docs/_merged_includes/
*-mdjs-generated.js
_site
_site-dev
@@ -40,3 +37,4 @@ _merged_assets
_merged_includes
__output
__output-dev
docs_backup

7
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"dbaeumer.vscode-eslint"
]
}

34
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,34 @@
// A launch configuration that compiles the extension and then opens it inside a new window
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{
"version": "0.2.0",
"configurations": [
{
"name": "Run Web Dev Server Extension",
"type": "extensionHost",
"request": "launch",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}/packages/vscode-rocket"
],
"outFiles": [
"${workspaceFolder}/packages/vscode-rocket/out/**/*.js"
],
"preLaunchTask": "Compile vscode-rocket"
},
{
"name": "Extension Tests",
"type": "extensionHost",
"request": "launch",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
],
"outFiles": [
"${workspaceFolder}/out/test/**/*.js"
],
"preLaunchTask": "${defaultBuildTask}"
}
]
}

10
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,10 @@
{
"gitdoc.enabled": false,
"typescript.tsdk": "node_modules/typescript/lib",
"files.exclude": {
"**/*-mdjs-generated.js": true,
},
"search.exclude": {
"**/*-mdjs-generated.js": true,
}
}

29
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,29 @@
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "watch",
"problemMatcher": "$tsc-watch",
"isBackground": true,
"presentation": {
"reveal": "never"
},
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Compile vscode-rocket",
"type": "npm",
"script": "compile",
"path": "packages/vscode-rocket/",
"group": "build",
"problemMatcher": [],
"detail": "tsc -p ./"
}
]
}

View File

@@ -19,6 +19,11 @@
src="https://img.shields.io/badge/twitter-@modern_web_dev-1DA1F3?style=flat-square"
alt="Follow @modern_web_dev on Twitter"
/></a>
<a href="https://open.vscode.dev/modernweb-dev/rocket"
><img
src="https://open.vscode.dev/badges/open-in-vscode.svg"
alt="Open in VS Code"
/></a>
</p>
<p align="center">
@@ -33,7 +38,7 @@
**The modern web setup for static sites with a sprinkle of JavaScript!**
- **Meta Framework:** Build on top of giants like <a href="https://www.11ty.dev/">Eleventy</a>, <a href="https://rollupjs.org/">Rollup</a>, and <a href="https://www.modern-web.dev/">Modern Web</a>.
- **Meta Framework:** Build on top of giants like <a href="https://lit.dev/">Lit</a>, <a href="https://rollupjs.org/">Rollup</a> and <a href="https://www.modern-web.dev/">Modern Web</a>.
- **Powerful Default Template:** Provide content and you are ready to go.
- **Small:** No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed..
@@ -50,6 +55,16 @@ You can still tweak every detail of every underlying tool that gets used.
Rocket is part of the [Modern Web Family](https://twitter.com/modern_web_dev).
## Quick Start
```
mkdir test-rocket
cd test-rocket
npm init -y
npm i @rocket/cli@alpha @rocket/launch@alpha @11ty/eleventy-cache-assets typescript
npx rocket init
```
## 🤝 Contributing
We are always looking for contributors of all skill levels! If you're looking to ease your way into the project, try out a [good first issue](https://github.com/modernweb-dev/rocket/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22).

41
TODO.md Normal file
View File

@@ -0,0 +1,41 @@
## Features
- Rename "options.docsDir" to "options.inputDir"
- recursive rendering of lit / html / and markdown
- convert `<meta name="menu:link.text" content="Docs" />` to `export const menuLinkText = 'Docs';`
- "import" markdown with frontmatter
- export const mdCleanup = false; => to not clean up auto generated md files for this page
- add helper for layouts
- Add "menuExclude" => to actually exclude the menu item
## Bugs
- write to `_site-dev` instead of `_site` while using `rocket start`
- nested `recursive.data.js` do not overwrite the parent data
- rocketGeneratedMdInJs => converted-md-source
- rocketGeneratedFromMd => converted-md
- support <!-- asdf --> in markdown
- ssr render can just be a string concat
## Error Handling
- make error nice for "needs function export default () => html` instead of just export default html`"
- make error nice for parent page not found in index => auto generate page? 🤔
## Examples
- docs site, blog (simple), blog (complex), minimal
- add stackblitz/codesandbox examples
- Example: export variable and use it in rendering
- Example: fetch data from an api and display it
- Example: usage of image
## later
- support `@change` in markdown
- support "hey ${foo.map(f => `${f} + 1`)}"
## consider
- Replace magic "resolve:pkg/foo.css" with a directive `${resolve()}`?

View File

@@ -0,0 +1,177 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/10--first-pages/10--getting-started.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Getting Started
Rocket has the following prerequisites:
- [Node 14+](https://nodejs.org/en/)
Make sure they are installed before proceeding.
## Setup
The fastest way to get started is by using an existing preset like the launch preset.
### Step 1. Initialize the Project Package
Start by creating an empty folder for your project
```bash copy
mkdir my-project
cd my-project
```
Then initialize a package.json file
<code-tabs collection="package-managers" default-tab="npm" align="end">
```bash tab npm
npm init -y
```
```bash tab yarn
yarn init -y
```
```bash tab pnpm
pnpm init -y
```
</code-tabs>
### Step 2. Install dependencies
<code-tabs collection="package-managers" default-tab="npm" align="end">
```bash tab npm
npm install --save-dev @rocket/cli @rocket/launch
```
```bash tab yarn
yarn add -D @rocket/cli @rocket/launch
```
```bash tab pnpm
pnpm add -D @rocket/cli @rocket/launch
```
</code-tabs>
### Step 3. Bootstrap the project
<code-tabs collection="package-managers" default-tab="npm" align="end">
```bash tab npm
npx rocket bootstrap
```
```bash tab yarn
yarn rocket bootstrap
```
```bash tab pnpm
pnpx rocket bootstrap
```
</code-tabs>
The `bootstrap` command creates four files in your repo:
- `rocket.config.js` containing a minimal rocket config
- `docs/index.md` your first page
- `.gitignore` containing rocket's build artifacts
- `.vscode/settings.json` hide build artifacts in your vscode
It also set the package `type` to `"module"` and adds a `start` and `docs` package scripts.
<inline-notification type="warning">
If you don't want to use the `module` package type, make sure to rename the generated config file to `rocket.config.mjs`.
</inline-notification>
<details><summary>Default Files Contents</summary>
<code-tabs default-tab="rocket.config.js">
```js tab rocket.config.js
import { rocketLaunch } from '@rocket/launch';
/** @type {import('rocket/cli').RocketCliConfig} */
export default {
presets: [rocketLaunch()],
};
```
```md tab docs/index.md
# Welcome to Your Rocket Site
Add your markdown content here.
```
```html tab .gitignore
## Rocket ignore files (need to be the full relative path to the folders) docs/_merged_data/
docs/_merged_assets/ docs/_merged_includes/
```
</code-tabs>
</details>
## Add your First Page
Bootstrap created the file `docs/index.md`. Open it in your editor and change it to suit your needs.
<small>NOTE: This tutorial assumes you are familiar with Markdown, for page authoring.</small>
```md
# Welcome to Your Rocket Site
Add your markdown content here.
```
Please note that the heading - text prefixed with `#` or `##` - is not optional for each page in this tutorial. Everything below that first line is optional Markdown text.
## Startup
Now you can launch your site locally with
<code-tabs collection="package-managers" default-tab="npm" align="end">
```bash tab npm
npm start
```
```bash tab yarn
yarn start
```
```bash tab pnpm
pnpx start
```
</code-tabs>
## Taking Inventory Before Adding Pages:
We're about to add both content and navigation at the same time.
It can be helpful to take an inventory, before we start, to separate basic setup from the creation of content and navigation.
- We built the project with basic npm commands
- Added a couple required files manually
- Adjusted package.json
- **docs/index.md** to seed the content
- Launches with `npm start`
That's all it takes to get a new super-fast and powerful site, complete with a service worker, default styling, navigation, and ready to deploy as a plain old static files.
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```

View File

@@ -1,4 +1,12 @@
# First Pages >> Adding Pages ||12
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/10--first-pages/20--adding-pages.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Adding Pages
<inline-notification type="warning">
@@ -12,13 +20,13 @@ It can help to examine each new page and menu carefully, to come to terms with t
In most cases you will have multiple sections in your website and each of those sections will come with its own sidebar navigation.
To create a section you need to create a folder with an `index.md`.
To create a section you need to create a folder with an `index.rocket.md`.
```bash
mkdir docs/guides
```
👉 `docs/guides/index.md`
👉 `docs/guides/index.rocket.md`
```md
# Guides
@@ -42,13 +50,13 @@ It might be more practical to stay below 5 sections.
Often each section will have multiple categories.
To create a category you need to create a folder with an `index.md`.
To create a category you need to create a folder with an `index.rocket.md`.
```bash
mkdir docs/guides/first-pages/
```
👉 `docs/guides/first-pages/index.md`
👉 `docs/guides/first-pages/index.rocket.md`
```md
# First Pages
@@ -56,10 +64,10 @@ mkdir docs/guides/first-pages/
## Adding a Page to a Category
👉 `docs/guides/first-pages/getting-started.md`
👉 `docs/guides/first-pages/getting-started.rocket.md`
```md
# First Pages >> Getting Started
# Getting Started
This is how you get started.
```

View File

@@ -0,0 +1,49 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/10--first-pages/30--use-javascript.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Use JavaScript
If you would like to add JavaScript to a page, you can do it inline using the `script` markdown directive. The script you write runs on the page as a module.
````markdown
```js script
const message = 'Hello, World!';
console.log(message);
```
````
Adding the above will log `Hello, World!` to the console without adding a global `message` variable.
This can be useful for importing web components and using them in Markdown. Imagine you had some `magic-reveal` element that you wanted to use on a page:
````markdown
```js script
import 'magic-reveal/magic-reveal.js';
```
<magic-reveal>
This text will get magically revealed.
I can **still** use Markdown as long as there is an empty line
between the opening/closing tags and my text.
</magic-reveal>
````
## Component Story Format
You can also add storybook-style CSF (v2 only) stories to a page using `js story` or `js preview-story`, just make sure to import `html` from `@mdjs/mdjs-preview` instead of from `lit` or `lit-html`.
````markdown
```js story
import { html } from '@mdjs/mdjs-preview';
export const StoryPreview = () => html` <p>Use stories in Rocket!</p> `;
```
````

View File

@@ -0,0 +1,9 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/10--first-pages/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () => html`<h1>First Pages</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -0,0 +1,44 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/20--presets/10--getting-started.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Getting Started
Presets are partial rocket configs that combine any number of plugins to add specific features. Rocket is built on these presets, like `rocketLaunch`, `rocketBlog`, and `rocketSearch`
You can use a preset via the config by adding it to the `presets` array
<!-- prettier-ignore-start -->
```js copy
import { rocketLaunch } from '@rocket/launch';
import { rocketBlog } from '@rocket/blog';
import { rocketSearch } from '@rocket/search';
/** @type {import('@rocket/cli').RocketCliOptions} */
export default ({
presets: [rocketLaunch(), rocketBlog(), rocketSearch()],
});
```
<!-- prettier-ignore-end -->
## Community Presets
There are a number of community-made presets available:
<!--
-- Thank you for your interest in rocket. To add your preset,
-- follow the format below. Please add your preset in alphabetical order.
-->
- [rocket-preset-code-tabs](https://www.npmjs.com/package/rocket-preset-code-tabs) - Add tab elements for code blocks
- [rocket-preset-custom-elements-manifest](https://www.npmjs.com/package/rocket-preset-custom-elements-manifest) - Documents code generation for JavaScript libraries, particularly custom elements.
- [rocket-preset-markdown-directive](https://www.npmjs.com/package/rocket-preset-markdown-directive) - Add your own custom md code block directives
- [rocket-preset-playground-elements](https://www.npmjs.com/package/rocket-preset-playground-elements) - Live code editors that run in-browser
- [rocket-preset-slide-decks](https://www.npmjs.com/package/rocket-preset-slide-decks) - Slide decks in Markdown and HTML
- [rocket-preset-webcomponents-dev](https://www.npmjs.com/package/rocket-preset-webcomponents-dev) - Live code editors that run on webcomponents.dev
> Want your plugin listed here? Please [create a PR](https://github.com/modernweb-dev/rocket/edit/main/docs/guides/presets/getting-started.md)!

View File

@@ -0,0 +1,34 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/20--presets/20--overriding.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Overriding
All loaded presets will be combined but you can override each file.
Take a look at `docs/_merged_includes` and override what you want to override by placing the same filename into `_includes`.
For example, to override the css files loaded in the `<head>`,
```bash
cp docs/_merged_includes/_joiningBlocks/head/40-stylesheets.njk \
docs/_includes/_joiningBlocks/head/40-stylesheets.njk
```
then edit the file to suit your needs.
Also works for `_assets`, `_data` ...
<inline-notification type="warning">
If you don't [add `.eleventyignore`](/guides/first-pages/getting-started/#setup), you may receive error messages when running `rocket build`.
</inline-notification>
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```

View File

@@ -0,0 +1,11 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/20--presets/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () => html`
<h1>Presets</h1>
<meta name="menu:exclude" content="true" />
`;

View File

@@ -1,4 +1,12 @@
# Configuration >> Getting Started ||10
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/30--configuration/10--getting-started.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Getting Started
The main config file is `rocket.config.js` or `rocket.config.mjs`.
@@ -20,19 +28,19 @@ The Plugins Manager helps you register and execute your plugins across the vario
## Adding Remark/Unified Plugins
If you want to a plugin to the Markdown processing you can use `setupUnifiedPlugins`.
If you want to add a plugin to the Markdown processing you can use `setupUnifiedPlugins`.
<!-- prettier-ignore-start -->
```js
import emoji from 'remark-emoji';
import { addPlugin } from 'plugins-manager';
/** @type {Partial<import('@rocket/cli').RocketCliOptions>} */
const config = {
export default ({
setupUnifiedPlugins: [addPlugin({ location: 'markdown', name: 'emoji', plugin: emoji })],
};
export default config;
});
```
<!-- prettier-ignore-end -->
For plugins that should handle the Markdown <abbr title="Abstract Syntax Tree">AST</abbr> you should use `addPlugin({ location: 'markdown', name: 'my-plugin', plugin: MyPlugin})`. <br>
While for the rehype AST you should use `addPlugin({ location: 'remark2rehype', name: 'my-plugin', plugin: MyPlugin})`.

View File

@@ -0,0 +1,9 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/30--configuration/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () => html`<h1>Configuration</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -1,4 +1,12 @@
# Go Live >> Overview ||10
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/40--go-live/10--overview.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Overview
A few things are usually needed before going live "for real".
@@ -9,17 +17,21 @@ Many servers are configured to handle this automatically and to serve a 404.html
The [Rocket Launch preset](../../docs/presets/launch.md) ships a default 404 template you can use.
To enable it, you need to create a 404.md and use the 404 layout.
To enable it, you need to create a `404.md` and use the 404 layout.
👉 `docs/404.md`
```
```markdown copy
---
layout: layout-404
permalink: 404.html
---
```
This results in a `404.html` page, which will do nothing by itself. But many hosting services like netlify or firebase, for example will redirect 404s to this `404.html` by default.
If the hosting provider doesn't already do this, then you may be able to accomplish it via some settings for example by using a `.htaccess` file in case of an apache server.
## Add a Sitemap
A sitemap can be used to inform search engines or services about the pages your site has.
@@ -28,24 +40,23 @@ You can create one by adding this file:
👉 `docs/sitemap.njk`
{% raw %}
```
```markdown copy
---
layout: layout-raw
permalink: /sitemap.xml
eleventyExcludeFromCollections: true
---
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% for page in collections.all %}
{% raw %}{% for page in collections.all %}
{%- if page.url !== '/404.html' -%}
<url>
<loc>{{ rocketConfig.absoluteBaseUrl }}{{ page.url | url }}</loc>
<lastmod>{{ page.date.toISOString() }}</lastmod>
<changefreq>{{ page.data.changeFreq if page.data.changeFreq else "monthly" }}</changefreq>
</url>
{% endfor %}
{%- endif -%}
{% endfor %}{% endraw %}
</urlset>
```
{% endraw %}

View File

@@ -1,12 +1,18 @@
# Go Live >> Social Media ||20
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/40--go-live/20--social-media.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Social Media
Having a nice preview image for social media can be very helpful.
For that reason Rocket creates those automatically with the title, parent title, section and your logo.
It will look like this but with your logo:
<img src="{{ socialMediaImage | url }}" width="1200" height="630" alt="Social Media Image of this page" style="border: 1px solid #000" />
There are multiple ways you can modify it.
Note: If your logo has an `<?xml>` tag it will throw an error as it will be inlined into this SVG and nested XML tags are not allowed.
@@ -15,7 +21,7 @@ Note: If your logo has an `<?xml>` tag it will throw an error as it will be inli
You can create your own image and link it with something like this
```
```markdown copy
---
socialMediaImage: path/to/my/image.png
---
@@ -29,7 +35,7 @@ You can create an `11tydata.cjs` file next to your page. If your page is `docs/g
In there you can use the default `createSocialImage` but provide your own values.
```js
```js copy
const { createSocialImage } = require('@rocket/cli');
module.exports = async function () {
@@ -39,7 +45,7 @@ module.exports = async function () {
subTitle2: 'in 5 Minutes',
footer: 'Rocket Guides',
// you can also override the svg only for this page by providing
// createSocialImageSvg: async () => '<svg>...</svg>'
// createSocialImageSvg: async () => '{%raw%}<svg>...</svg>{%endraw%}'
});
return {
socialMediaImage,
@@ -52,13 +58,14 @@ module.exports = async function () {
Often you want to have a unique style for your social media images.
For that you can provide your own function which returns a string of an SVG to render the image.
👉 `rocket.config.mjs`
👉 `rocket.config.js`
```js
<!-- prettier-ignore-start -->
```js copy
import { adjustPluginOptions } from 'plugins-manager';
/** @type {Partial<import("@rocket/cli").RocketCliOptions>} */
const config = {
/** @type {import('@rocket/cli').RocketCliOptions} */
export default ({
setupEleventyComputedConfig: [
adjustPluginOptions('socialMediaImage', {
createSocialImageSvg: async ({
@@ -95,59 +102,69 @@ const config = {
},
}),
],
};
export default config;
});
```
<!-- prettier-ignore-end -->
## Using an SVG File as a src with Nunjucks
If you have multiple variations it may be easier to save them as SVG files and use a template system.
WARNING: Untested example
<!-- prettier-ignore-start -->
<code-tabs default-tab="rocket.config.js">
👉 `rocket.config.mjs`
{% raw %}
```js
```js tab rocket.config.js
import { adjustPluginOptions } from 'plugins-manager';
/** @type {Partial<import("@rocket/cli").RocketCliOptions>} */
const config = {
/** @type {import('@rocket/cli').RocketCliOptions} */
export default ({
setupEleventyComputedConfig: [
adjustPluginOptions('socialMediaImage', {
createSocialImageSvg: async (args = {}) => {
// inside of the svg you can use {{ title }}
const svgBuffer = await fs.promises.readFile('/path/to/your/svg/file');
const svgBuffer = await fs.promises.readFile('/path/to/your/template.svg');
const svg = logoBuffer.toString();
return nunjucks.renderString(svg, args);
},
}),
],
};
{% endraw %}
});
```
```svg tab /path/to/your/template.svg
{%raw%}<svg xmlns="http://www.w3.org/2000/svg" fill="#e63946" viewBox="0 0 511.998 511.998">
<text font-family="'Open Sans', sans-serif" font-size="39" transform="translate(422.99 408.53)">
<tspan x="-89.26" y="12.25">{{ title }}</tspan>
</text>
<path d="M98.649 430.256c-46.365 28.67-71.17 30.939-78.916 23.51-7.75-7.433-6.519-32.307 20.182-79.832 24.953-44.412 65.374-96.693 113.818-147.211l-11.279-10.817c-49.33 51.442-90.583 104.845-116.163 150.373-19.228 34.22-37.848 79.134-17.375 98.766 5.84 5.6 13.599 7.935 22.484 7.935 22.269 0 51.606-14.677 75.469-29.432 44.416-27.464 96.044-70.919 145.373-122.362l-11.279-10.817c-48.446 50.519-98.987 93.095-142.314 119.887zM254.734 294.95l-18.47-17.71 10.816-11.281 18.47 17.71zM285.516 324.473l-18.47-17.71 10.816-11.28 18.47 17.71zM315.543 317.807l-73.886-70.847 10.816-11.28 73.886 70.846zM500.916 41.287c-7.769 1.59-76.412 16.062-93.897 34.294l-50.728 52.899-114.703-3.629-39.198 40.876 79.28 40.569-21.755 22.687 72.848 69.858 21.755-22.687 43.857 77.51 39.197-40.876-8.433-114.451 50.727-52.899c17.485-18.234 29.067-87.422 30.331-95.251l1.801-11.169-11.082 2.269zM228.209 161.383l19.842-20.692 93.688 2.964-48.775 50.864-64.755-33.136zm173.423 166.303l-35.822-63.308 48.776-50.865 6.886 93.482-19.84 20.691zm-69.334-50.943l-50.287-48.223L412.89 92.037l50.288 48.223-130.88 136.483zm140.711-148.707l-48.316-46.334c14.54-8.427 44.787-17.217 68.076-22.632-4.433 23.497-11.949 54.085-19.76 68.966z"/>
<path d="M326.335 257.25l-24.628-23.614 10.816-11.28 24.628 23.615zM431.385 134.414l-11.808 12.315-11.28-10.816 11.808-12.315zM401.838 165.183l-11.28-10.816 11.807-12.314 11.28 10.816zM384.121 183.66l-11.28-10.816 11.807-12.314 11.28 10.816zM175.19 184.515l11.051 11.05-23.582 23.582-11.05-11.05zM190.903 168.796l11.05 11.052-7.863 7.86-11.05-11.052z"/>
</svg>{%endraw%}
```
</code-tabs>
<!-- prettier-ignore-end -->
## Enabling / Disabling
Generating images from SVG is quite fast but it can still add that's why by default during `rocket start` there will be no social media images created.
If you with so create them also during start you can
```js
const config = {
<!-- prettier-ignore-start -->
```js copy
export default ({
start: {
createSocialMediaImages: true,
},
};
});
```
<!-- prettier-ignore-end -->
Similarly, if you never want to create social media images even during build then you can globally disable it via
```js
const config = {
<!-- prettier-ignore-start -->
```js copy
export default ({
createSocialMediaImages: true,
};
});
```
<!-- prettier-ignore-end -->

View File

@@ -0,0 +1,9 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/40--go-live/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () => html`<h1>Go Live</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -0,0 +1,28 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '10--guides/index.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Learning Rocket
<meta name="menu:link.text" content="Guides">
Rocket helps you generate static pages from Markdown files while giving you the flexibility to sprinkle in some JavaScript where needed.
- [First Pages](./first-pages/getting-started/) Learn how to bootstrap and run a Rocket site
- [Adding Pages](./first-pages/adding-pages/) Create your own content pages
- [Linking](./first-pages/link-to-other-pages/) Link between yuor markdown pages
- [Managing Sidebar](./first-pages/manage-sidebar/) Customize your site's navigation
- [Use JavaScript](./first-pages/use-javascript/) Write inline scripts in markdown
- [URLs](./first-pages/urls/) Customize your pages' permalinks
- [Layouts](./first-pages/layouts/) Give your page a custom layout
- [Presets](./presets/getting-started/) Customize Rocket with config presets
- [Overriding](./presets/overriding/) Override preset templates
- [Using Templates](./presets/using-templates/) Make use of preset templates
- [Create Your Own](./presets/create-your-own/getting-started/) Write and publish your own presets
- [Configuration](./configuration/getting-started/) Make Rocket your own
- [Go Live](./go-live/overview/) Publish your site
- [Social Media](./go-live/social-media/) Generate social images

View File

@@ -1,4 +1,12 @@
# Configuration >> Overview || 10
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/10--configuration/10--overview.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Overview
The configuration file is `rocket.config.js` or `rocket.config.mjs`.
@@ -7,6 +15,7 @@ The config files consist of the following parts:
```js
import { rocketLaunch } from '@rocket/launch';
/** @type {import('rocket/cli').RocketCliConfig} */
export default {
presets: [rocketLaunch()],
emptyOutputDir: true,
@@ -19,25 +28,17 @@ Rocket is primarily build around plugins for each of its systems.
New plugins can be added and all default plugins can be adjusted or even removed by using the following functions.
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default {
// add remark/unified plugin to the Markdown processing (e.g. enable special code blocks)
setupUnifiedPlugins: [],
// add a rollup plugins to the web dev server (will be wrapped with @web/dev-server-rollup) AND the rollup build (e.g. enable json importing)
setupDevAndBuildPlugins: [],
setupDevServerAndBuildPlugins: [],
// add a plugin to the web dev server (will not be wrapped) (e.g. esbuild for TypeScript)
setupDevPlugins: [],
setupDevServerPlugins: [],
// add a plugin to the rollup build (e.g. optimization steps)
setupBuildPlugins: [],
// add a plugin to Eleventy (e.g. a filter packs)
setupEleventyPlugins: [],
// add a computedConfig to Eleventy (e.g. site wide default variables like socialMediaImage)
setupEleventyComputedConfig: [],
// add a plugin to the cli (e.g. a new command like "rocket my-command")
setupCliPlugins: [],
};
@@ -53,20 +54,18 @@ import data from './data.json';
You can accomplish this with Rollup and dev server plugins. Make sure to add both the dev-server plugin as well as the Rollup plugin, so that the behaviors is the same during development as it is in the production build.
For these cases you can use `setupDevAndBuildPlugins`, which will automatically add the plugin for you to both Rollup and dev-server:
For these cases you can use `setupDevServerAndBuildPlugins`, which will automatically add the plugin for you to both Rollup and dev-server:
```js
import json from '@rollup/plugin-json';
import { addPlugin } from 'plugins-manager';
/** @type {Partial<import("@rocket/cli").RocketCliOptions>} */
const config = {
setupDevAndBuildPlugins: [
/** @type {import('@rocket/cli').RocketCliOptions} */
export default {
setupDevServerAndBuildPlugins: [
addPlugin({ name: 'json', plugin: json, location: 'top', options: { my: 'settings' } }),
],
};
export default config;
```
This will add the Rollup plugin `json` with the id `json` at the top of the plugin list of Rollup and the dev server. It needs to be at the top so further plugins down the line can work with JSON imports.
@@ -79,22 +78,28 @@ All plugins which are either default or are added via a preset can still be adju
```js
import { adjustPluginOptions } from 'plugins-manager';
/** @type {Partial<import("@rocket/cli").RocketCliOptions>} */
const config = {
setupDevAndBuildPlugins: [adjustPluginOptions('json', { my: 'overwrite settings' })],
/** @type {import('@rocket/cli').RocketCliOptions} */
export default {
setupDevServerAndBuildPlugins: [adjustPluginOptions('json', { my: 'overwrite settings' })],
};
export default config;
```
## Lifecycle
## Advanced
You can hook into the rocket lifecycle by specifying a function for `before11ty`. This function runs before 11ty calls it's write method. If it is an async function, Rocket will await it's promise.
Sometimes you need even more control over specific settings.
### Rollup
For example if you wanna add an `acron` plugin to rollup
```js
import { importAssertions } from 'acorn-import-assertions';
/** @type {import('rocket/cli').RocketCliConfig} */
export default {
async before11ty() {
await copyDataFiles();
},
rollup: config => ({
...config,
acornInjectPlugins: [importAssertions],
}),
};
```

View File

@@ -1,4 +1,12 @@
# Configuration >> Service Worker ||30
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/10--configuration/20--service-worker.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Service Worker
Rocket does come with a default service worker that will
@@ -13,6 +21,7 @@ Changing the service worker file name can be quite a hassle so you can adjust ge
👉 `rocket.config.js`
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default {
serviceWorkerName: 'my-service-worker-name.js',
};

View File

@@ -1,4 +1,12 @@
# Configuration >> Images ||40
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/10--configuration/30--images.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Images
Rocket does handle content images automatically by
@@ -88,8 +96,10 @@ The default preset for regular markdown content is available as `responsive`.
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
export default {
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
responsive: {
widths: [300, 820],
@@ -97,8 +107,9 @@ export default {
sizes: '(min-width: 1024px) 820px, calc(100vw - 20px)',
},
},
};
});
```
<!-- prettier-ignore-end -->
## Ignoring Images
@@ -148,8 +159,10 @@ For this example we want to also ignore `.jpeg` files.
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
export default {
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
responsive: {
// ...
@@ -157,8 +170,9 @@ export default {
src.endsWith('.jpeg') || src.endsWith('svg') || src.includes('rocket-unresponsive.'),
},
},
};
});
```
<!-- prettier-ignore-end -->
With that setting we get the following behavior
@@ -180,8 +194,10 @@ becomes
You can add your own image preset like so
<!-- prettier-ignore-start -->
```js
export default {
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
'my-image-preset': {
widths: [30, 60],
@@ -189,8 +205,9 @@ export default {
sizes: '(min-width: 1024px) 30px, 60px',
},
},
};
});
```
<!-- prettier-ignore-end -->
Once that `imagePreset` is defined you can use it by adding it to any `img` tag.
@@ -232,15 +249,18 @@ If you want to add `webp` (or replace `avif` with it) you can do so by setting t
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
export default {
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
responsive: {
formats: ['avif', 'webp', 'jpeg'],
},
},
};
});
```
<!-- prettier-ignore-end -->
## Default widths
@@ -262,16 +282,19 @@ If you want to add more widths you can add them to `widths`.
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
export default {
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
responsive: {
widths: [300, 600, 900, 1200, 1640],
sizes: '(min-width: 1024px) 820px, calc(100vw - 20px)',
},
},
};
});
```
<!-- prettier-ignore-end -->
<inline-notification type="tip">

View File

@@ -0,0 +1,10 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/10--configuration/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () =>
html`<h1>Configuration</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -1,4 +1,12 @@
# Presets >> Joining Blocks ||10
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/20--presets/10--joining-blocks.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Joining Blocks
The template system allows for a very granular control of how individual parts will be merged, overwritten or reorderd.
@@ -6,7 +14,7 @@ As a preset you may want to add this to your layout.
{% raw %}
```
```jinja2
<footer id="main-footer">
{% for blockName, blockPath in _joiningBlocks.footer %}
{% include blockPath %}
@@ -22,11 +30,15 @@ This will now render all templates within `_includes/_joiningBlocks/footer/*`.
Let's assume we have a preset with the following files
```html
<!-- usedPreset/_includes/_joiningBlocks/footer/10-first.njk -->
<p>first</p>
👉 `_includes/_joiningBlocks/footer/10-first.njk`
<!-- usedPreset/_includes/_joiningBlocks/footer/20-second.njk -->
```html
<p>first</p>
```
👉 `_includes/_joiningBlocks/footer/20-second.njk`
```html
<p>second</p>
```
@@ -41,8 +53,9 @@ And it produces this in your website
Now we can add a file which will insert content without needing to overwrite any of the preset file.
👉 `docs/_includes/_joiningBlocks/footer/15-in-between.njk`
```html
<!-- docs/_includes/_joiningBlocks/footer/15-in-between.njk -->
<p>in-between</p>
```
@@ -60,8 +73,9 @@ the final output will be
Now if you want to overwrite you can use the same filename.
👉 `docs/_includes/_joiningBlocks/footer/10-first.njk`
```html
<!-- docs/_includes/_joiningBlocks/footer/10-first.njk -->
<p>updated first</p>
```
@@ -78,8 +92,9 @@ the final output will be
Sometimes you wanna reorder when you overwrite as well
👉 `docs/_includes/_joiningBlocks/footer/30-first.njk`
```html
<!-- docs/_includes/_joiningBlocks/footer/30-first.njk -->
<p>first</p>
```

View File

@@ -0,0 +1,10 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/20--presets/20--launch/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () =>
html`<h1>Launch</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -0,0 +1,155 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/20--presets/20--launch/overview.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
```js server
import { html } from 'lit-html';
```
# Overview
Rocket comes with a preset you will love. Simple, responsive and behaving like native, it sure is going to be a hit among your users.
## Installation
Install `@rocket/launch` from the NPM repository using your favourite package manager.
<code-tabs collection="package-managers" default-tab="npm" align="end">
```bash tab npm
npm i @rocket/launch
```
```bash tab yarn
yarn add @rocket/launch
```
```bash tab pnpm
pnpm add @rocket/launch
```
</code-tabs>
## Usage
👉 `rocket.config.js`
```js
import { rocketLaunch } from '@rocket/launch';
/** @type {import('rocket/cli').RocketCliConfig} */
export default {
presets: [rocketLaunch()],
};
```
## Data
You can define your own data for the available Layouts.
## Inline Notification
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```
Launch ships with `<inline-notification>`, a custom element that applies some styles similar to "info boxes". The element works for `<noscript>` users as well, as long as you don't [override](/guides/presets/overriding/) the default `noscript.css` file.
To add an inline notification you need to remember to import the element definition:
````md
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```
````
Then you can add your notification to the page. If you want to write the notification's content using markdown, just pad the opening and closing tags with empty lines.
There are three varieties of `<inline-notification>`, "tip", "warning", and "danger"
<style>
#inline-notifications::part(tab) {
text-transform: capitalize;
}
#inline-notifications code-tab::part(content) {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 6px;
}
#inline-notifications code-copy::part(copy-button) {
position: absolute;
top: 10px;
border-radius: 6px;
border: 1px solid var(--primary-lines-color);
}
</style>
<inline-notification type="tip">
Take a tip from me
</inline-notification>
```md
<inline-notification type="tip">
Take a tip from me
</inline-notification>
```
<inline-notification type="warning">
Be _sure_ about this...
</inline-notification>
```md
<inline-notification type="warning">
Be _sure_ about this...
</inline-notification>
```
<inline-notification type="danger">
You **really** shouldn't!
</inline-notification>
```md
<inline-notification type="danger">
You **really** shouldn't!
</inline-notification>
```
### Modify the Title
The notification title defaults to it's type. You can write a custom title with the `title` attribute.
<inline-notification type="tip" title="success">
I am a success message
</inline-notification>
```md
<inline-notification type="tip" title="success">
I am a success message
</inline-notification>
```
<inline-notification type="warning">
The `title` attribute does not change the title for `<noscript>` users, so don't include any critical information in it.
</inline-notification>

View File

@@ -0,0 +1,10 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/20--presets/30--search/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () =>
html`<h1>Search</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -0,0 +1,42 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/20--presets/30--search/overview.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Overview
Add a search for all your static content.
## Installation
<code-tabs collection="package-managers" default-tab="npm" align="end">
```bash tab npm
npm i @rocket/search
```
```bash tab yarn
yarn add @rocket/search
```
```bash tab pnpm
pnpm add @rocket/search
```
</code-tabs>
## Usage
👉 `rocket.config.js`
```js
import { rocketSearch } from '@rocket/search';
/** @type {import('rocket/cli').RocketCliConfig} */
export default {
presets: [rocketSearch()],
};
```

View File

@@ -0,0 +1,42 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/20--presets/40--blog.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Blog
Enable writing blog posts within your Rocket site.
## Installation
<code-tabs collection="package-managers" default-tab="npm" align="end">
```bash tab npm
npm i @rocket/blog
```
```bash tab yarn
yarn add @rocket/blog
```
```bash tab pnpm
pnpm add @rocket/blog
```
</code-tabs>
## Usage
👉 `rocket.config.js`
```js
import { rocketBlog } from '@rocket/blog';
/** @type {import('rocket/cli').RocketCliConfig} */
export default {
presets: [rocketBlog()],
};
```

View File

@@ -0,0 +1,10 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/20--presets/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () =>
html`<h1>Presets</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -1,4 +1,12 @@
# Markdown JavaScript >> Overview || 10
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/30--markdown-javascript/10--overview.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Overview
```js script
import '@mdjs/mdjs-story/define';
@@ -123,6 +131,68 @@ export const header = () => {
};
```
```js story-code
// not defined for android
```
```js story-code
// not defined for ios
```
#### Story Code
If your preview is followed by a code blocks marked as `story-code` then those will be shown when switching between multiple platforms
````md
```js preview-story
// will be visible when platform web is selected
export const JsPreviewStory = () => html` <demo-wc-card>JS Preview Story</demo-wc-card> `;
```
```xml story-code
<!-- will be visible when platform android is selected -->
<Button
android:id="@+id/demoWcCard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android Code"
style="@style/Widget.FooComponents.Demo.Wc.Card"
/>
```
```swift story-code
// will be visible when platform ios is selected
import DemoWc.Card
let card = DemoWcButton()
```
````
See it in action by opening up the code block and switching platforms
```js preview-story
// will be visible when platform web is selected
export const JsPreviewStory = () => html` <demo-wc-card>JS Preview Story</demo-wc-card> `;
```
```xml story-code
<!-- will be visible when platform android is selected -->
<Button
android:id="@+id/demoWcCard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android Code"
style="@style/Widget.FooComponents.Demo.Wc.Card"
/>
```
```swift story-code
// will be visible when platform ios is selected
import DemoWc.Card
let card = DemoWcButton()
```
## Supported Systems
### Storybook

View File

@@ -1,4 +1,12 @@
# Markdown JavaScript >> Preview ||20
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/30--markdown-javascript/20--preview.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Preview
You can showcase live running code by annotating a code block with `js preview-story`.
@@ -40,6 +48,68 @@ will result in
export const foo = () => html` <demo-element></demo-element> `;
```
```js story-code
// not defined for android
```
```js story-code
// not defined for ios
```
#### Story Code
If your preview is followed by a code blocks marked as `story-code` then those will be shown when switching between multiple platforms
````md
```js preview-story
// will be visible when platform web is selected
export const JsPreviewStory = () => html` <demo-element></demo-element> `;
```
```xml story-code
<!-- will be visible when platform android is selected -->
<Button
android:id="@+id/demoElement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android Code"
style="@style/Widget.Demo.Element"
/>
```
```swift story-code
// will be visible when platform ios is selected
import Demo.Element
let card = DemoElement()
```
````
See it in action by opening up the code block and switching platforms
```js preview-story
// will be visible when platform web is selected
export const JsPreviewStory = () => html` <demo-element></demo-element> `;
```
```xml story-code
<!-- will be visible when platform android is selected -->
<Button
android:id="@+id/demoElement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android Code"
style="@style/Widget.Demo.Element"
/>
```
```swift story-code
// will be visible when platform ios is selected
import Demo.Element
let card = DemoElement()
```
## HTML Story
````md
@@ -72,15 +142,18 @@ excludeFromSearch: true
Once you have that you need to configure it for the story renderer by setting it in your `rocket.config.js`.
<!-- prettier-ignore-start -->
```js
export default {
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
setupUnifiedPlugins: [
adjustPluginOptions('mdjsSetupCode', {
simulationSettings: { simulatorUrl: '/simulator/' },
}),
],
};
});
```
<!-- prettier-ignore-end -->
<inline-notification type="tip">

View File

@@ -0,0 +1,31 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/30--markdown-javascript/30--story.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Story
You can showcase live running code by annotating a code block with `js story`.
```js script
import { html } from '@mdjs/mdjs-story';
```
````md
```js script
import { html } from '@mdjs/mdjs-story';
```
```js story
export const foo = () => html` <p>my html</p> `;
```
````
will result in
```js story
export const foo = () => html` <p>my html</p> `;
```

View File

@@ -0,0 +1,10 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/30--markdown-javascript/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () =>
html`<h1>Markdown Javascript</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -0,0 +1,391 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/50--tools/10--plugins-manager.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Plugins Manager
The Plugins Manager replaces the specific registration/execution (with options) in a given plugin system by an intend to use a plugin (with these options).
This allows your users to adjust the options before actually applying the plugins.
## Setup
1. Install npm package
```bash
npm i plugins-manager
```
2. Change your public API from an array of plugin "instances" to an array of setup functions
```diff
import myPlugin from 'my-plugin';
+ import { addPlugin } from 'plugins-manager';
export default {
- plugins: [myPlugin],
+ setupPlugins: [addPlugin(myPlugin)]
}
```
3. Convert setup function to plugins
```js
import { applyPlugins } from 'plugins-manager';
const finalConfig = applyPlugins(config); // "converts" setupPlugins to plugins
// work with plugins or pass it on to another tool
const bundle = await rollup(finalConfig);
```
## Usage
As you users in most cases you will need to either add or adjust a given plugin in a config file.
👉 `my-tool.config.js`
```js
import { addPlugin, adjustPluginOptions } from 'plugins-manager';
import json from '@rollup/plugin-json';
import { nodeResolve } from '@rollup/plugin-node-resolve';
export default {
setupPlugins: [
// add a new plugin with optional plugin options
addPlugin(json, {
/* ... */
}),
// adjust the options of a plugin that is already registered
adjustPluginOptions(nodeResolve, {
/* ... */
}),
],
};
```
## Plugins can be functions or classes
### Function Plugins
```js
function myPlugin({ lastName: 'initial-second' }) {
// ...
}
export default {
setupPlugins: [addPlugin(myPlugin)],
};
// function parameters are type safe
addPlugin(myPlugin, { lastName: 'new name' }); // ts ok
addPlugin(myPlugin, { otherProp: 'new name' }); // ts error
```
### Class Plugins
The options are passed to the constructor.
```js
/**
* @typedef {object} MyClassOptions
* @property {string} lastName
*/
class MyClass {
/** @type {MyClassOptions} */
options = {
lastName: 'initial-second',
};
/**
* @param {Partial<MyClassOptions>} options
*/
constructor(options = {}) {
this.options = { ...this.options, ...options };
}
// ...
}
export default {
setupPlugins: [addPlugin(MyClass)],
};
// constructor parameters are type safe
addPlugin(MyClass, { lastName: 'new name' }); // ts ok
addPlugin(MyClass, { otherProp: 'new name' }); // ts error
```
## Problem
Many plugin systems require you to either execute a plugin function like in `rollup`.
<!-- prettier-ignore-start -->
```js
import json from '@rollup/plugin-json';
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
plugins: [json({ preferConst: true })],
});
```
<!-- prettier-ignore-end -->
or add it in a special way like in `eleventy`
```js
const pluginSyntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight');
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(pluginSyntaxHighlight, { templateFormats: ['md'] });
};
```
or `unified/remark`.
```js
var unified = require('unified');
var markdown = require('remark-parse');
var toc = require('remark-toc');
var processor = unified().use(markdown).use(toc, { maxDepth: 2 });
// ...
```
## Problem Statement
> Executing or adding a plugin in a special way is a one time process. You can not transparently later change the options of the given plugin.
This means if you wish to define default plugins and allow your user to override all of the settings it's "impossible".
## Solution
The plugins manager lets you orchestrate a set of "meta plugins" which are defined by
- plugin (class or function)
- it's options
```js
import beep from '@rollup/plugin-beep';
import url from '@rollup/plugin-url';
let metaPlugins = [{ plugin: beep }, { plugin: url, options: { limit: 10000 } }];
```
This array can be modified by adding/removing or adjusting options.
```js
// raw add
metaPlugins.push({
// another plugin
});
// raw adjust
metaPlugins[1].options.limit = 20000;
```
And then you can convert it into the specific format that can be assigned to your system in question.
```js
// execute plugins for rollup
const plugins = metaPlugins.map(pluginObj => {
if (pluginObj.options) {
return pluginObj.plugin(pluginObj.options);
} else {
return pluginObj.plugin();
}
});
// rollup.config.js
export default {
plugins,
};
```
### Adding Helpers
Doing array manipulations is kinda error-prone so we encourage to use an array of setup function. Where as each setup function can either add a new plugin (with a unique name) or adjust an already existing plugin.
```js
import { addPlugin, adjustPluginOptions } from 'plugins-manager';
const systemSetupFunctions = [addPlugin(first), addPlugin(second)];
const userSetupFunctions = [adjustPluginOptions(first, { my: 'options' })];
```
Arrays of functions can by merged like so
```js
const finalSetupFunctions = [...systemSetupFunctions, ...userSetupFunctions];
```
and then converted to the final output.
```js
import { applyPlugins } from 'plugins-manager';
const plugins = applyPlugins(finalSetupFunctions, metaPlugins);
```
## Adding a Plugin
This makes sure that
- the name is unique
- you can add at at `top`, `bottom` and `after/before` a given other plugin
By default it adds at the bottom.
```js
import json from '@rollup/plugin-json';
import { addPlugin } from 'plugins-manager';
const userSetupFunctions = [addPlugin(json, { preferConst: true })];
```
Example usage:
```js
addPlugin(json); // Add at the bottom (default)
addPlugin(json, {}, { location: 'top' }); // Add at the top/beginning of the array
addPlugin(json, {}, { location: beep }); // Add after (default) plugin 'beep'
addPlugin(json, {}, { location: beep, how: 'before' }); // Add before plugin 'beep'
```
This is type safe and typescript will throw an error if you pass the wrong type.
```js
function myPlugin({ myFlag = false } = {}) {
// ...
}
addPlugin(myPlugin, { myFlag: true }); // ts ok
addPlugin(myPlugin, { notExisting: true }); // ts error
```
## Adjusting Plugin Options
Adjusting options means to either
- flatly merge objects (e.g. only the first level will be preserved)
- calling a function to do the merge yourself
- setting the raw value (if not an object or function)
- you need to have a reference to the plugin (which is used to auto complete the available options via typescript)
```js
import json from '@rollup/plugin-json';
import { adjustPluginOptions } from 'plugins-manager';
const userSetupFunctions = [
adjustPluginOptions(json, { preferConst: false, anotherOption: 'format' }),
];
```
Example usage:
```js
// given
addPlugin(json, {
other: {
nested: 'other.nested',
nested2: 'other.nested2',
},
main: true,
});
// merge objects flately
adjustPluginOptions(json, { other: { nested: '--overwritten--' } });
// resulting options = { other: { nested: '--overwritten--' }, main: true }
// NOTE: nested2 is removed
// merge via function
adjustPluginOptions(json, config => ({ other: { ...config.other, nested: '--overwritten--' } }));
// resulting options = { other: { nested: '--overwritten--', nested2: 'other.nested2' }, main: true }
// merge via function to override full options
adjustPluginOptions(json, config => ({ only: 'this' }));
// resulting options = { only: 'this' }
// setting a raw value
adjustPluginOptions(json, false);
// resulting options = false
```
This is type safe and typescript will throw an error if you pass the wrong type.
```js
function myPlugin({ myFlag = false } = {}) {
// ...
}
adjustPluginOptions(myPlugin, { myFlag: true }); // ts ok
adjustPluginOptions(myPlugin, { notExisting: true }); // ts error
```
## Remove Plugin
Sometimes you would like to remove a default plugin from the config.
```js
export default {
setupPlugins: [removePlugin(json)],
};
```
## Converting metaPlugins to an Actual Plugin
To execute all setup function you can use this little helper
```js
const finalMetaPlugins = executeSetupFunctions(finalSetupFunctions, metaPlugins);
```
And then you can convert it into your format.
For Rollup you would execute the plugin with the options if there are any.
```js
const plugins = finalMetaPlugins.map(pluginObj => {
if (pluginObj.options) {
return pluginObj.plugin(pluginObj.options);
} else {
return pluginObj.plugin();
}
});
```
**Examples**
Rollup has a more specific helper that handles
- `config.setupPlugins`
Note: if you provide `config.plugins` then it will return that directly ignoring `setupPlugins`
```js
import { applyPlugins } from 'plugins-manager';
const finalConfig = applyPlugins(currentConfig, defaultMetaPlugins);
```
Eleventy
```js
module.exports = eleventyConfig => {
for (const pluginObj of metaPlugins) {
if (pluginObj.options) {
eleventyConfig.addPlugin(pluginObj.plugin, pluginObj.options);
} else {
eleventyConfig.addPlugin(pluginObj.plugin);
}
}
};
```
Unified/Remark
```js
const parser = unified();
for (const pluginObj of metaPlugins) {
parser.use(pluginObj.plugin, pluginObj.options);
}
```

View File

@@ -1,4 +1,12 @@
# Tools >> Rollup Config ||20
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/50--tools/20--rollup-config.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Rollup Config
Rollup configuration to help you get started building modern web applications.
You write modern JavaScript using the latest browser features. Rollup will optimize your code for production and ensure it runs on all supported browsers.

View File

@@ -1,6 +1,14 @@
# Tools >> Check HTML Links ||30
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/50--tools/30--check-html-links.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
```js
# Check HTML Links
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```
@@ -8,7 +16,7 @@ A fast checker for broken links/references in HTML.
<inline-notification type="tip">
Read the [Introducing Check HTMl Links - no more bad links](../../blog/introducing-check-html-links.md) Blog post to find out how it came to be and how it works.
Read the [Introducing Check HTML Links - no more bad links](../../blog/introducing-check-html-links.md) Blog post to find out how it came to be and how it works.
</inline-notification>

View File

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 214 KiB

View File

@@ -0,0 +1,10 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/50--tools/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () =>
html`<h1>Tools</h1>
<meta name="menu:exclude" content="true" />`;

View File

@@ -0,0 +1,36 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '20--docs/index.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
<meta name="menu:link.text" content="Docs" />
# Documentation
Here you will find all the details for each of the packages/systems we offer.
## Contents
- [Configuration](./configuration/)
- [Overview](./configuration/overview/)
- [Computed Config](./configuration/computed-config/)
- [Service Worker](./configuration/service-worker/)
- [Images](./configuration/images/)
- [Presets](./presets/)
- [Joining Blocks](./presets/joining-blocks/)
- [`@rocket/launch`](./presets/launch/)
- [`@rocket/search`](./presets/search/)
- [`@rocket/blog`](./presets/blog/)
- [Markdown JavaScript](./markdown-javascript/)
- [Overview](./markdown-javascript/overview/)
- [Preview](./markdown-javascript/preview/)
- [Story](./markdown-javascript/story/)
- [Eleventy Plugins](./eleventy-plugins/)
- [Markdown JavaScript (mdjs)](./eleventy-plugins/mdjs-unified/)
- [Tools](./tools/)
- [Plugins Manager](./tools/plugins-manager/)
- [Rollup Config](./tools/rollup-config/)
- [Check HTML Links ](./tools/check-html-links/)

View File

@@ -0,0 +1,15 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '30--blog/index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
export default () => html`
<h1>Rocket Blog</h1>
<meta name="menu:link.text" content="Blog" />
<p>
Discover articles from the core team and contributors about Rocket, tips and tricks included!
</p>
`;

View File

@@ -1,10 +1,16 @@
---
title: Introducing Check HTMl Links - no more bad links
published: true
description: A fast link checker for static HTML
tags: [html, javascript, webdev, node]
cover_image: https://dev-to-uploads.s3.amazonaws.com/i/an9z6f4hdll2jlne43u3.jpg
---
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '30--blog/introducing-check-html-links.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
export const tags = ['html', 'javascript', 'webdev', 'node'];
export const subTitle = 'A fast link checker for static HTML';
// cover_image: https://dev-to-uploads.s3.amazonaws.com/i/an9z6f4hdll2jlne43u3.jpg
```
# Introducing Check HTML Links - no more bad links
**TL;DR : I created a standalone tool that can help you fix all the broken links in your websites/documentation. You can check it out [on npm as check-html-links](https://www.npmjs.com/package/check-html-links)**

11
docs/404.html.rocket.js Normal file
View File

@@ -0,0 +1,11 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = '404.html.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu } from './recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu };
/* END - Rocket auto generated - do not touch */
import { Layout404 } from '@rocket/launch';
export const layout = new Layout404();
export default () => '';

View File

@@ -1,4 +0,0 @@
---
layout: layout-404
permalink: 404.html
---

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,10 +0,0 @@
html {
--demo-background-color: #eee;
--demo-color: #222;
}
html[theme="dark"] body {
background: #333;
--demo-background-color: #888;
--demo-color: #eee;
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,33 +0,0 @@
<svg fill="#e63946" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 511.998 511.998" xml:space="preserve">
<g>
<path d="M98.649,430.256c-46.365,28.67-71.17,30.939-78.916,23.51c-7.75-7.433-6.519-32.307,20.182-79.832
c24.953-44.412,65.374-96.693,113.818-147.211l-11.279-10.817C93.124,267.348,51.871,320.751,26.291,366.279
c-19.228,34.22-37.848,79.134-17.375,98.766c5.84,5.6,13.599,7.935,22.484,7.935c22.269,0,51.606-14.677,75.469-29.432
c44.416-27.464,96.044-70.919,145.373-122.362l-11.279-10.817C192.517,360.888,141.976,403.464,98.649,430.256z"/>
<rect x="238.112" y="272.64" transform="matrix(-0.7218 -0.6921 0.6921 -0.7218 237.9094 656.5383)" width="25.589" height="15.628"/>
<rect x="268.895" y="302.163" transform="matrix(-0.7218 -0.6921 0.6921 -0.7218 270.4774 728.6761)" width="25.589" height="15.628"/>
<rect x="232.827" y="268.929" transform="matrix(-0.7218 -0.6921 0.6921 -0.7218 297.4719 673.0591)" width="102.364" height="15.628"/>
<path d="M500.916,41.287c-7.769,1.59-76.412,16.062-93.897,34.294l-50.728,52.899l-114.703-3.629l-39.198,40.876l79.28,40.569
l-21.755,22.687l72.848,69.858l21.755-22.687l43.857,77.51l39.197-40.876l-8.433-114.451l50.727-52.899
c17.485-18.234,29.067-87.422,30.331-95.251l1.801-11.169L500.916,41.287z M228.209,161.383l19.842-20.692l93.688,2.964
l-48.775,50.864L228.209,161.383z M401.632,327.686l-35.822-63.308l48.776-50.865l6.886,93.482L401.632,327.686z
M332.298,276.743l-50.287-48.223L412.89,92.037l50.288,48.223L332.298,276.743z M473.009,128.036l-48.316-46.334
c14.54-8.427,44.787-17.217,68.076-22.632C488.336,82.567,480.82,113.155,473.009,128.036z"/>
<rect x="302.369" y="231.988" transform="matrix(-0.7218 -0.6921 0.6921 -0.7218 384.0262 633.9694)" width="34.12" height="15.628"/>
<rect x="411.311" y="127.35" transform="matrix(-0.6921 0.7218 -0.7218 -0.6921 807.9747 -74.331)" width="17.061" height="15.628"/>
<rect x="394.288" y="145.087" transform="matrix(-0.7218 -0.6921 0.6921 -0.7218 586.0206 542.7934)" width="15.628" height="17.06"/>
<rect x="376.571" y="163.565" transform="matrix(-0.7218 -0.6921 0.6921 -0.7218 542.7271 562.3462)" width="15.628" height="17.06"/>
<rect x="161.111" y="185.158" transform="matrix(0.7071 0.7071 -0.7071 0.7071 192.1943 -60.3323)" width="15.628" height="33.35"/>
<rect x="184.683" y="172.695" transform="matrix(0.707 0.7072 -0.7072 0.707 182.4625 -83.9076)" width="15.628" height="11.118"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -1,21 +0,0 @@
body[layout^='layout-home'] .markdown-body .call-to-action:nth-of-type(2) {
--primary-color: #222;
--primary-color-lighter: #333;
--primary-color-darker: #000;
}
@media screen and (min-width: 1024px) {
body[layout='layout-home-background'] .page-background {
top: -210px;
right: -463px;
transform: rotate(45deg);
}
}
rocket-navigation {
font-family: 'Montserrat', sans-serif;
}
header {
font-family: 'Montserrat', sans-serif;
}

View File

@@ -1,29 +0,0 @@
{
"name": "Rocket",
"short_name": "rocket",
"theme_color": "#e63946",
"background_color": "#1d3557",
"display": "standalone",
"orientation": "portrait",
"Scope": "/",
"start_url": "/",
"icons": [
{
"src": "../_merged_assets/_static/icons/android-chrome-192x192.png",
"sizes": "128x128",
"type": "image/png"
},
{
"src": "../_merged_assets/_static/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
},
{
"src": "../_merged_assets/_static/icons/maskable-icon.jpg",
"sizes": "1024x1024",
"type": "image/jpg",
"purpose": "any maskable"
}
],
"splash_pages": null
}

View File

@@ -1,45 +0,0 @@
[
{
"name": "Discover",
"children": [
{
"text": "Blog",
"href": "/blog/"
},
{
"text": "Help and Feedback",
"href": "https://github.com/modernweb-dev/rocket/issues"
}
]
},
{
"name": "Follow",
"children": [
{
"text": "GitHub",
"href": "https://github.com/modernweb-dev/rocket"
},
{
"text": "Twitter",
"href": "https://twitter.com/modern_web_dev"
},
{
"text": "Slack",
"href": "/about/slack/"
}
]
},
{
"name": "Support",
"children": [
{
"text": "Sponsor",
"href": "/about/sponsor/"
},
{
"text": "Contribute",
"href": "https://github.com/modernweb-dev/rocket/blob/main/CONTRIBUTING.md"
}
]
}
]

View File

@@ -1,4 +0,0 @@
{
"homeLayout": "background",
"newsletter": false
}

View File

@@ -1,28 +0,0 @@
module.exports = async function () {
return {
dir: 'ltr',
lang: 'en',
name: 'Rocket',
description: 'Rocket is the way to build fast static websites with a sprinkle of JavaScript',
socialLinks: [
{
name: 'GitHub',
url: 'https://github.com/modernweb-dev/rocket',
},
{
name: 'Slack',
url:
'https://join.slack.com/t/lit-and-friends/shared_invite/zt-llwznvsy-LZwT13R66gOgnrg12PUGqw',
},
],
gitSiteUrl: 'https://github.com/modernweb-dev/rocket',
gitBranch: 'main',
helpUrl: 'https://github.com/modernweb-dev/rocket/issues',
logoAlt: 'Rocket Logo',
iconColorMaskIcon: '#3f93ce',
iconColorMsapplicationTileColor: '#1d3557',
iconColorThemeColor: '#1d3557',
socialMediaImage: '/_assets/social-media-image.jpg',
// analytics: 'UA-131782693-2', // modern web key
};
};

View File

@@ -1,3 +0,0 @@
<meta name="twitter:creator" content="@modern_web_dev" />
<link rel="stylesheet" href="{{ '/_assets/body.css' | asset | url }}" mdjs-use>

View File

@@ -0,0 +1,11 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = 'about/index.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
<meta name="menu:exclude" content="true" />
# About

View File

@@ -1,5 +0,0 @@
# Slack
You can also find us on the Polymer Slack in the [#open-wc](https://polymer.slack.com/archives/CE6D9DN05) channel.
You can join the Polymer Slack by visiting [https://www.polymer-project.org/slack-invite](https://www.polymer-project.org/slack-invite).

View File

@@ -0,0 +1,13 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = 'about/slack.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Slack
You can also find us on the Polymer Slack in the [#open-wc](https://polymer.slack.com/archives/CE6D9DN05) channel.
You can join the Polymer Slack by visiting [https://www.polymer-project.org/slack-invite](https://www.polymer-project.org/slack-invite).

View File

@@ -1,9 +0,0 @@
---
title: Sponsor
eleventyNavigation:
key: Sponsor
---
We currently can only accept sponsoring in the form of services or contributions.
If you are interested in monetary sponsoring please [let us know](mailto:hello@modern-web.dev).

View File

@@ -0,0 +1,13 @@
```js server
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = 'about/sponsor.rocket.md';
import { pageTree, setupUnifiedPlugins, footerMenu, layout } from '../recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu, layout };
/* END - Rocket auto generated - do not touch */
```
# Sponsor
We currently can only accept sponsoring in the form of services or contributions.
If you are interested in monetary sponsoring please [let us know](mailto:hello@modern-web.dev).

View File

@@ -1,15 +0,0 @@
---
layout: layout-blog-overview
eleventyNavigation:
key: Blog
order: 30
pagination:
data: collections.blog
size: 10
reverse: true
alias: posts
---
# Rocket Blog
Discover articles from the core team and contributors about Rocket, tips and tricks included!

View File

@@ -1,12 +0,0 @@
const { createSocialImage } = require('@rocket/cli');
module.exports = async function () {
const socialMediaImage = await createSocialImage({
title: 'Introducing',
subTitle: 'check-html-links',
footer: 'Rocket Blog',
});
return {
socialMediaImage,
};
};

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#1d3557</TileColor>
</tile>
</msapplication>
</browserconfig>

View File

@@ -1,42 +0,0 @@
# Configuration >> Computed Config ||20
If you want to add data that depends on other data then you can do it via [Eleventy's computed data](https://www.11ty.dev/docs/data-computed/).
Rocket exposes it via `setupEleventyComputedConfig`.
## Set Your Own Data
Let's say you want to add a `Welcome to the contact page` everywhere. (A filter might be a better choice, but it's a good example of the concept.)
👉 `rocket.config.mjs` (or your theme config file)
```js
import { addPlugin } from 'plugins-manager';
/** @type {Partial<import("../../../types/main").RocketCliOptions>} */
const config = {
setupEleventyComputedConfig: [
addPlugin({ name: 'greeting', plugin: data => `Welcome to the ${data.title} page.` }),
],
};
export default config;
```
{% raw %}
Now you can use {{ greeting }} everywhere.
{% endraw %}
And it will be correctly replaced with a Welcome and the page title.
## Default Available Configs
```js
[
{ name: 'titleMeta', plugin: titleMetaPlugin },
{ name: 'title', plugin: titlePlugin },
{ name: 'eleventyNavigation', plugin: eleventyNavigationPlugin },
{ name: 'section', plugin: sectionPlugin },
{ name: 'socialMediaImage', plugin: socialMediaImagePlugin },
{ name: 'templateBlocks', plugin: templateBlocksPlugin, options: rocketConfig },
];
```

View File

@@ -1 +0,0 @@
# Configuration ||10

View File

@@ -1 +0,0 @@
# Eleventy Plugins ||40

View File

@@ -1,94 +0,0 @@
# Eleventy Plugins >> Markdown JavaScript (mdjs)
Use mdjs in your Eleventy site.
## Setup
```
npm install @rocket/eleventy-plugin-mdjs
```
Create an Eleventy config file `.eleventy.js`
```js
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(pluginMdjs);
};
```
## Configure a unified or remark Plugin with mdjs
By providing a `setupUnifiedPlugins` function as an option to `eleventy-plugin-mdjs` you can set options for all unified/remark plugins.
We do use [plugins-manager](../tools/plugins-manager.md).
This example adds a CSS class to the `htmlHeading` plugin so heading links can be selected in CSS.
```js
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
const { adjustPluginOptions } = require('plugins-manager');
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(pluginMdjs, {
setupUnifiedPlugins: [
adjustPluginOptions('htmlHeading', {
properties: {
className: ['anchor'],
},
}),
],
});
};
```
## Add a unified or remark Plugin
The order of plugins is important in unified as each plugin processes the content and passes on its result.
Some plugins do work with the Markdown AST and some with the rehype (e.g. HTML) AST. In order to get access to the correct AST the plugin needs to be in a specific location in the processing order.
Examples on how to insert a plugin right after creating the Markdown AST.
```js
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
const { addPlugin } = require('plugins-manager');
const { myRemarkPlugin } = require('./my-remark-plugin.js');
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(pluginMdjs, {
setupUnifiedPlugins: [
addPlugin({ name: 'my-remark-plugin', plugin: myRemarkPlugin, location: 'markdown' }),
],
});
};
```
Examples on how to insert a plugin right after creating the rehype AST.
```js
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
const { addPlugin } = require('plugins-manager');
const { myRehypePlugin } = require('./my-rehype-plugin.js');
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(pluginMdjs, {
setupUnifiedPlugins: [
addPlugin({ name: 'my-rehype-plugin', plugin: myRehypePlugin, location: 'remark2rehype' }),
],
});
};
```
You can also add both
```js
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(pluginMdjs, {
setupUnifiedPlugins: [
addPlugin({ name: 'my-remark-plugin', plugin: myRemarkPlugin, location: 'markdown' }),
addPlugin({ name: 'my-rehype-plugin', plugin: myRehypePlugin, location: 'remark2rehype' }),
],
});
};
```

View File

@@ -1,12 +0,0 @@
---
title: Documentation
eleventyNavigation:
key: Docs
order: 20
---
Here you will find all the details for each of the packages/systems we offer.
You should check out:
- [@rocket/launch](./presets/launch.md) which is our default preset

View File

@@ -1 +0,0 @@
# Markdown JavaScript ||30

View File

@@ -1,23 +0,0 @@
# Markdown JavaScript >> Story ||30
You can showcase live running code by annotating a code block with `js story`.
```js script
import { html } from '@mdjs/mdjs-story';
```
````md
```js script
import { html } from '@mdjs/mdjs-story';
```
```js story
export const foo = () => html` <p>my html</p> `;
```
````
will result in
```js story
export const foo = () => html` <p>my html</p> `;
```

View File

@@ -1,21 +0,0 @@
# Presets >> Blog ||40
Enable writing blog posts within your Rocket site.
## Installation
```bash
npm i @rocket/blog
```
## Usage
👉 `rocket.config.mjs`
```js
import { rocketBlog } from '@rocket/blog';
export default {
presets: [rocketBlog()],
};
```

View File

@@ -1,5 +0,0 @@
---
excludeFromSearch: true
---
# Presets ||20

View File

@@ -1,119 +0,0 @@
# Presets >> Launch ||20
Rocket comes with a preset you will love. Simple, responsive and behaving like native, it sure is going to be a hit among your users.
## Installation
```bash
npm i @rocket/launch
```
👉 `rocket.config.mjs`
```js
import { rocketLaunch } from '@rocket/launch';
export default {
presets: [rocketLaunch()],
};
```
## Data
Most data comes from `site.cjs`.
There is also a specific `rocketLaunch.json`.
The footer data comes from `footer.json`
## Inline Notification
Notification are web components that bring in some styles.
To use them in Markdown you need to write the HTML tag and have it separated by an empty line.
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```
First you need to import the script
````
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```
````
### Tip
<inline-notification type="tip">
I am a tip
</inline-notification>
**Usage**
```md
<inline-notification type="tip">
I am a tip
</inline-notification>
```
### Modify the Title
To override the title you can provide a property success.
<inline-notification type="tip" title="success">
I am a success message
</inline-notification>
**Usage**
```md
<inline-notification type="tip" title="success">
I am a success message
</inline-notification>
```
### Warning
<inline-notification type="warning">
I am a warning
</inline-notification>
**Usage**
```md
<inline-notification type="warning">
I am a warning
</inline-notification>
```
### Danger
<inline-notification type="danger">
I am a dangerous message
</inline-notification>
**Usage**
```md
<inline-notification type="danger">
I am a dangerous message
</inline-notification>
```

View File

@@ -1,19 +0,0 @@
# Presets >> Search ||30
Add a search for all your static content.
## Installation
```bash
npm i @rocket/search
```
👉 `rocket.config.mjs`
```js
import { rocketSearch } from '@rocket/search';
export default {
presets: [rocketSearch()],
};
```

View File

@@ -1 +0,0 @@
# Tools ||50

View File

@@ -1,269 +0,0 @@
# Tools >> Plugins Manager ||10
The Plugins Manager replaces the specific registration/execution (with options) in a given plugin system by an intend to use a plugin (with these options).
This allows your users to adjust the options before actually applying the plugins.
## Problem
Many plugin systems require you to either execute a plugin function like in `rollup`.
```js
import json from '@rollup/plugin-json';
export default {
plugins: [json({ preferConst: true })],
};
```
or add it in a special way like in `eleventy`
```js
const pluginSyntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight');
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(pluginSyntaxHighlight, { templateFormats: ['md'] });
};
```
or `unified/remark`.
```js
var unified = require('unified');
var markdown = require('remark-parse');
var toc = require('remark-toc');
var processor = unified().use(markdown).use(toc, { maxDepth: 2 });
// ...
```
## Problem Statement
> Executing or adding a plugin in a special way is a one time process. You can not transparently later change the options of the given plugin.
This means if you wish to define default plugins and allow your user to override all of the settings it's "impossible".
## Solution
The plugins manager lets you orchestrate a set of "meta plugins" which are defined by
- name
- plugin
- options
```js
import beep from '@rollup/plugin-beep';
import url from '@rollup/plugin-url';
let metaPlugins = [
{ name: 'beep', plugin: beep },
{ name: 'url', plugin: url, options: { limit: 10000 } },
];
```
This array can be modified by adding/removing or adjusting options.
```js
// raw add
metaPlugins.push({
// another plugin
});
// raw adjust
metaPlugins[1].options.limit = 20000;
```
And then you can convert it into the specific format that can be assigned to your system in question.
```js
// execute plugins for rollup
const plugins = metaPlugins.map(pluginObj => {
if (pluginObj.options) {
return pluginObj.plugin(pluginObj.options);
} else {
return pluginObj.plugin();
}
});
// rollup.config.js
export default {
plugins,
};
```
### Adding Helpers
Doing array manipulations is kinda error-prone so we offer encourage to use an array of setup function. Where as each setup function can either add a new plugin (with a unique name) or adjust an already existing plugin.
```js
import { addPlugin, adjustPluginOptions } from 'plugins-manager';
const systemSetupFunctions = [
addPlugin({ name: 'first', plugin: first }),
addPlugin({ name: 'second', plugin: second }),
];
const userSetupFunctions = [adjustPluginOptions('first', { my: 'options' })];
```
Arrays of functions can by merged like so
```js
const finalSetupFunctions = [...systemSetupFunctions, ...userSetupFunctions];
```
and then converted to the final output.
```js
import { metaPluginsToRollupPlugins } from 'plugins-manager';
const plugins = metaPluginsToRollupPlugins(finalSetupFunctions, metaPlugins);
```
## Adding a Plugin
This makes sure that
- the name is unique
- you can add at at `top`, `bottom` and `after/before` a given other plugin
By default it adds at the bottom.
```js
import json from '@rollup/plugin-json';
import { addPlugin } from 'plugins-manager';
const userSetupFunctions = [
addPlugin({ name: 'json', plugin: json, options: { preferConst: true } }),
];
```
Example usage:
```js
addPlugin({ name: 'json', plugin: json }); // Add at the bottom (default)
addPlugin({ name: 'json', plugin: json, location: 'top' }); // Add at the top/beginning of the array
addPlugin({ name: 'json', plugin: json, location: 'beep' }); // Add after (default) plugin 'beep'
addPlugin({ name: 'json', plugin: json, location: 'beep', how: 'before' }); // Add before plugin 'beep'
```
## Adjusting Plugin Options
Adjusting options means to either
- flatly merge objects (e.g. only the first level will be preserved)
- calling a function to do the merge yourself
- setting the raw value (if not an object or function)
```js
import { adjustPluginOptions } from 'plugins-manager';
const userSetupFunctions = [
adjustPluginOptions('json', { preferConst: false, anotherOption: 'format' }),
];
```
Example usage:
```js
// given
addPlugin({
name: 'json',
plugin: json,
options: {
other: {
nested: 'other.nested',
nested2: 'other.nested2',
},
main: true,
},
});
// merge objects flately
adjustPluginOptions('json', { other: { nested: '--overwritten--' } });
// resulting options = { other: { nested: '--overwritten--' }, main: true }
// NOTE: nested2 is removed
// merge via function
adjustPluginOptions('json', config => ({ other: { ...config.other, nested: '--overwritten--' } }));
// resulting options = { other: { nested: '--overwritten--', nested2: 'other.nested2' }, main: true }
// merge via function to override full options
adjustPluginOptions('json', config => ({ only: 'this' }));
// resulting options = { only: 'this' }
// setting a raw value
adjustPluginOptions('json', false);
// resulting options = false
```
## Converting metaPlugins to an Actual Plugin
To execute all setup function you can use this little helper
```js
const finalMetaPlugins = executeSetupFunctions(finalSetupFunctions, metaPlugins);
```
And then you can convert it into your format.
For Rollup you would execute the plugin with the options if there are any.
```js
const plugins = finalMetaPlugins.map(pluginObj => {
if (pluginObj.options) {
return pluginObj.plugin(pluginObj.options);
} else {
return pluginObj.plugin();
}
});
```
**Examples**
Rollup has a more specific helper that handles
- `config.setupPlugins`
Note: if you provide `config.plugins` then it will return that directly ignoring `setupPlugins`
```js
import { metaConfigToRollupConfig } from 'plugins-manager';
const finalConfig = metaConfigToRollupConfig(currentConfig, defaultMetaPlugins);
```
Web Dev Server has a more specific helper that handles
- `config.setupPlugins`
- `config.setupRollupPlugins`
Note: if you provide `config.plugins` then it will return that directly ignoring `setupPlugins` and `setupRollupPlugins`
```js
import { metaConfigToWebDevServerConfig } from 'plugins-manager';
import { fromRollup } from '@web/dev-server-rollup';
const finalConfig = metaConfigToWebDevServerConfig(currentConfig, defaultMetaPlugins, {
rollupWrapperFunction: fromRollup,
});
```
Eleventy
```js
module.exports = eleventyConfig => {
for (const pluginObj of metaPlugins) {
if (pluginObj.options) {
eleventyConfig.addPlugin(pluginObj.plugin, pluginObj.options);
} else {
eleventyConfig.addPlugin(pluginObj.plugin);
}
}
};
```
Unified/Remark
```js
const parser = unified();
for (const pluginObj of metaPlugins) {
parser.use(pluginObj.plugin, pluginObj.options);
}
```

View File

@@ -1 +0,0 @@
# Configuration ||30

View File

@@ -1,117 +0,0 @@
# First Pages >> Getting Started ||10
Rocket has the following prerequisites:
- [Node 14+](https://nodejs.org/en/)
Make sure they are installed before proceeding.
## Setup
The fastest way to get started is by using an existing preset like the launch preset.
1. Start with an empty new folder
```
mkdir my-project
cd my-project
npm init -y
```
2. Install dependencies
```
npm install --save-dev @rocket/cli @rocket/launch
```
3. Add to your .gitignore
```
## Rocket ignore files (need to be the full relative path to the folders)
docs/_merged_data/
docs/_merged_assets/
docs/_merged_includes/
```
<inline-notification type="danger">
You may be tempted to skip the step above, because you're not ready to commit to git yet!
Rocket uses the .gitignore file to manage its requirements. If you skip this step, Rocket will fail to deploy!
</inline-notification>
4. Create a `rocket.config.mjs` (or `.js` if you have type: "module" in you package.json)
```js
import { rocketLaunch } from '@rocket/launch';
export default {
presets: [rocketLaunch()],
};
```
5. (optionally) Create a file `.eleventyignore` (this file will be needed once you start customizing presets)
```
node_modules/**
/docs/_assets
/docs/_includes
/docs/_data
```
<inline-notification type="warning" title="note">
All further paths are relative to your project root (my-project in this case).
</inline-notification>
## Add your First Page
👉 `docs/index.md`
```md
# Welcome to Your Rocket Site
Text here, like any Markdown file.
```
This tutorial assumes you are familiar with Markdown, for page authoring.
Please note that the heading - text prefixed with `#` or `##` - is not optional for each page in this tutorial. Everything below that first line is optional Markdown text.
## Startup:
👉 `package.json`
Add `"start": "rocket start"` to your package.json
```json
"scripts": {
"start": "rocket start"
}
```
Now you can launch your site locally with
```bash
npm run start
```
## Taking Inventory Before Adding Pages:
We're about to add both content and navigation at the same time.
It can be helpful to take an inventory, before we start, to separate basic setup from the creation of content and navigation.
- We built the project with basic npm commands
- Added a couple required files manually
- Adjusted package.json
- **doc/index.md** to seed the content
- Launches with `npm start`
That's all it takes to get a new super-fast and powerful site, complete with a service worker, default styling, navigation, and ready to deploy as a plain old static files.
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```

View File

@@ -1 +0,0 @@
# First Pages ||10

View File

@@ -1,29 +0,0 @@
# First Pages >> Layouts ||60
The following templates are always available:
- `layout-raw` No html or any wrapping (use it for xml, json, ... outputs)
- `layout-default` For content
- `layout-index` Extends content and adds an "Open Navigation" button for mobile
Layout Default has the following Joining Blocks:
- `head` For the html `<head>`
- `header` Within the top `<header>`
- `content` Html within the main content section
- `footer` Within to bottom `<footer>`
- `bottom` Add the end of the body
## Launch Preset
On top of the above it adds the following templates
- `layout-404` A space not found page
- `layout-home` Frontpage with center logo below text
- `layout-home-background` Frontpage with left text and background image on the right
- `layout-sidebar` Left sidebar, right content
- `layout-index` Extends layout-sidebar
And the following changes
- Sets `layout-sidebar` as the default layout

View File

@@ -1,7 +0,0 @@
# First Pages >> Linking ||20
Standard Markdown applies. You can link like this:
```md
[visible label](./path/to/other-file.md)
```

View File

@@ -1,55 +0,0 @@
# First Pages >> Managing sidebar ||30
The sidebar will show all the content of the current section.
## Nesting Pages
You nest by adding `>>` between parent and child.
## Sorting Pages
You can sort by adding `||xx` at the end.
e.g.
```
# Second || 20
# First || 10
```
Will be ordered as `First`, `Second`,
## How it works
Internally `# Foo >> Bar >> Baz ||20` gets converted to.
```
---
title: Bar: Baz
eleventyNavigation:
key: Foo >> Bar >> Baz
parent: Foo >> Bar
order: 20
---
```
You can also look at this live playground:
```js story
import { html } from 'lit-html';
export const headlineConverter = () => html`
<p>
<strong style="color: red;">TODO: </strong>I will become a web component that has an input and
out that live udpates
</p>
`;
```
How it then works is very similar to https://www.11ty.dev/docs/plugins/navigation/
## Sidebar redirects
By default, the sidebar nav redirects clicks on category headings to the first child page in that category.
To disable those redirects, override `_includes/_joiningBlocks/_layoutSidebar/sidebar/20-navigation.njk` and add the `no-redirects` attribute to the `<rocket-navigation>` element.

View File

@@ -1,5 +0,0 @@
# First Pages >> URLs ||50
URLs will be represented by the folder structure.
You can use front matter with a [permalink](https://www.11ty.dev/docs/permalinks/) to override.

View File

@@ -1,25 +0,0 @@
# First Pages >> Use JavaScript ||40
You can use `js script` to execute JavaScript (`type="module"`).
````
```js script
console.log('foo');
```
````
This can be useful for importing web components and using them in Markdown.
````
```js script
import 'magic-reveal/magic-reveal.js';
<magic-reveal>
This text will get magically revealed. I can **still** use Markdown as long as there is an empty line between the opening/closing tags and my text.
</magic-reveal>
```
````
or you can use `js story`, `js preview-story`, ...

View File

@@ -1 +0,0 @@
# Go Live ||40

View File

@@ -1,13 +0,0 @@
const { createSocialImage } = require('@rocket/cli');
module.exports = async function () {
const socialMediaImage = await createSocialImage({
title: 'Learning Rocket',
subTitle: 'Have a website',
subTitle2: 'in 5 Minutes',
footer: 'Rocket Guides',
});
return {
socialMediaImage,
};
};

View File

@@ -1,8 +0,0 @@
---
title: Learning Rocket
eleventyNavigation:
key: Guides
order: 10
---
Rocket is a fundamentally straight forward way to generate static pages while still allowing to sprinkle in some JavaScript where needed.

View File

@@ -1,106 +0,0 @@
# Presets >> Create your own || 90
A preset is a setup function and a folder including `_assets`, `_data` and `_includes` (all optional).
To play around with a preset you can create a folder `fire-theme`.
You then create the setup function for it with only one property called `path` which will allow Rocket to properly resolve it.
## Create a Preset Config File
👉 `fire-theme/fireTheme.js`
```js
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
export function fireTheme() {
return {
path: path.resolve(__dirname),
};
}
```
Once you have that you can start filling in content you need.
For example a we could override the full `layout.css` by adding a it like so
👉 `fire-theme/layout.css`
```css
body {
background: hotpink;
}
```
Once you have that you can add it to your Rocket config.
NOTE: The order of presets is important, as for example in this case we take everything from `rocketLaunch` but later override via `fireTheme`.
👉 `rocket-config.js`
```js
import { rocketLaunch } from '@rocket/launch';
import { fireTheme } from 'path/to/fire-theme/fireTheme.js';
export default {
presets: [rocketLaunch(), fireTheme()],
};
```
## Publish a Preset
If you would like to publish a preset to use it on multiple websites or share it with your friends you can do like so.
1. Pick a name for the package => for this example we take `fire-theme`.
2. Create a new folder `fire-theme`
3. Create a folder `fire-theme/preset` copy `fireTheme.js` from [above](#create-a-preset-config-file) into `preset/fireTheme.js`
4. Add a 👉 `package.json`
```json
{
"name": "fire-theme",
"version": "0.3.0",
"description": "Fire Theme for Rocket",
"license": "MIT",
"type": "module",
"exports": {
".": "./index.js",
"./preset/": "./preset/"
},
"files": ["*.js", "preset"],
"keywords": ["rocket", "preset"]
}
```
5. Add a 👉 `index.js`
```js
export { fireTheme } from './preset/fireTheme.js';
```
6. Add a 👉 `README.md`
````
# FireTheme
This is a theme/preset for [Rocket](https://rocket.modern-web.dev/).
## Installation
```
npm i -D fire-theme
```
Add it to your 👉 `rocket.config.js`
```js
import { fireTheme } from 'fire-theme';
export default {
presets: [fireTheme()],
};
```
````

View File

@@ -1,7 +0,0 @@
# Presets >> Getting Started ||10
Presets are ...
You can use a preset via the config...
You can load multiple presets.

View File

@@ -1 +0,0 @@
# Presets || 20

View File

@@ -1,11 +0,0 @@
# Presets >> Create your own > Options || 10
Your preset can hook into the rocket lifecycle by specifying a function for `before11ty`. This function runs before 11ty calls it's write method. If it is an async function, Rocket will await it's promise.
```js
export default {
async before11ty() {
await copyDataFiles();
},
};
```

View File

@@ -1,7 +0,0 @@
# Presets >> Overriding ||20
All loaded presets will be combined but you can override each file.
Take a look at `docs/_merged_includes` and override what you want to override by placing the same filename into `_includes`.
Also works for `_assets`, `_data` ...

View File

@@ -1,59 +0,0 @@
# Presets >> Using templates ||30
The template system allows for very granular control of how individual parts will be merged, overwritten, or reordered.
On top of the [Overriding](./overriding.md) you can do with the presets alone templates have another superpower and that is automatically joining of parts.
It is generally preferred to use `Joining Blocks` before overriding.
## Adding html to the html head
Often you will want to load some more fonts or an additional CSS file. You can do so by adding a file to the head Joining Block.
👉 `docs/_includes/_joiningBlocks/head/additional-styles.njk`
```html
<link rel="stylesheet" href="{{ '/_assets/additional-styles.css' | asset | url }}" />
```
This will add the html at the bottom of the head.
## Adding JavaScript to the bottom of the body
For executing a script you can use the `bottom` Joining Block.
👉 `docs/_includes/_joiningBlocks/bottom/my-script.njk`
```html
<script>
console.log('hello world');
</script>
```
If you look into `docs/_merged_includes/_joiningBlocks/bottom/` you will see a few scripts
- `10-init-navigation.njk`
- `180-service-worker-update.njk`
- `190-google-analytics.njk`
- `my-script.njk`
## Controlling the order
In the html `<head>` order is usually not that important but when adding script it does.
If you look into the dom then you see that its order matches with the file system order.
Now if you want to move your script in-between `init-nagivation` and `service-worker-update` then you can rename your file to
👉 `docs/_includes/_joiningBlocks/bottom/20-my-script.njk`
which brings the order to
- `10-init-navigation.njk`
- `20-my-script.njk`
- `180-service-worker-update.njk`
- `190-google-analytics.njk`
## More information
For more details please see the [Joining Blocks Docs](../../docs/presets/joining-blocks.md)

View File

@@ -1,13 +0,0 @@
const { createSocialImage } = require('@rocket/cli');
module.exports = async function () {
const socialMediaImage = await createSocialImage({
title: 'Rocket',
subTitle: 'Static sites with',
subTitle2: 'a sprinkle of JavaScript.',
footer: 'A Modern Web Product',
});
return {
socialMediaImage,
};
};

View File

@@ -1,24 +0,0 @@
---
title: Rocket
layout: layout-home-background
slogan: The modern web setup for static sites with a sprinkle of JavaScript.
callToActionItems:
- text: Follow Guides
href: /guides/
- text: Browse Docs
href: /docs/
reasonHeader: Why Rocket?
reasons:
- header: Small
text: No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed.
- header: Pre-Rendered
text: Statically generated content means less JavaScript to ship and process.
- header: Zero Configuration
text: Automatic code splitting, filesystem based routing, and JavaScript in Markdown.
- header: Meta Framework
text: 'Build on top of giants like <a href="https://www.11ty.dev/">Eleventy</a>, <a href="https://rollupjs.org/">Rollup</a>, and <a href="https://www.modern-web.dev/">Modern Web</a>.'
- header: Powerful Default Template
text: Provide content and you are ready to go.
- header: Ready for Production
text: Optimized for a smaller build size, faster dev compilation and dozens of other improvements.
---

50
docs/index.rocket.js Normal file
View File

@@ -0,0 +1,50 @@
/* START - Rocket auto generated - do not touch */
export const sourceRelativeFilePath = 'index.rocket.js';
import { pageTree, setupUnifiedPlugins, footerMenu } from './recursive.data.js';
export { pageTree, setupUnifiedPlugins, footerMenu };
/* END - Rocket auto generated - do not touch */
import { html } from 'lit-html';
import { LayoutHome } from '@rocket/launch';
export const layout = new LayoutHome({
pageTree,
footerMenu,
slogan: 'The modern web setup for static sites with a sprinkle of JavaScript.',
callToActionItems: [
{ text: 'Follow Guides', href: '/guides/' },
{ text: 'Browse Docs', href: '/docs/' },
],
background: '/home-background.svg',
reasonHeader: 'Why Rocket?',
reasons: [
{
header: 'Small',
text:
'No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed.',
},
{
header: 'Pre-Rendered',
text: 'Statically generated content means less JavaScript to ship and process.',
},
{
header: 'Zero Configuration',
text: 'Automatic code splitting, filesystem based routing, and JavaScript in Markdown.',
},
{
header: 'Meta Framework',
text: html`Build on top of giants like <a href="https://www.11ty.dev/">Eleventy</a>,
<a href="https://rollupjs.org/">Rollup</a>, and
<a href="https://www.modern-web.dev/">Modern Web</a>.`,
},
{ header: 'Powerful Default Template', text: 'Provide content and you are ready to go.' },
{
header: 'Ready for Production',
text:
'Optimized for a smaller build size, faster dev compilation and dozens of other improvements.',
},
],
});
export default () => '';

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More