Compare commits

..

202 Commits

Author SHA1 Message Date
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
github-actions[bot]
8df9a3e9c3 Version Packages 2021-07-02 13:42:36 +02:00
Benny Powers
1b9559f2a5 feat(cli): add async before11ty hook (#183) 2021-07-02 11:58:54 +02:00
github-actions[bot]
8eede4b16b Version Packages 2021-06-30 15:24:07 +02:00
Thomas Allmer
2294ccf4a2 chore: only release patch versions 2021-06-30 15:20:51 +02:00
Benny Powers
3b1a0cf26a feat(cli): expose checkLinks options 2021-06-30 15:18:36 +02:00
Benny Powers
cf442215a9 feat: add slack invite 2021-06-30 15:02:33 +02:00
Thomas Allmer
41049f3908 chore: fix launch tests 2021-06-30 14:36:54 +02:00
Thomas Allmer
2b5c61d19c feat: no responsive images for svgs & option to define ignores 2021-06-30 14:36:54 +02:00
Jorge del Casar
f5d349e256 feat(launch): load used fonts from google fonts 2021-06-28 21:00:13 +02:00
Jorge del Casar
ce0b00e7a1 fix(cli): don't transform external images
Fix #141
2021-06-28 20:59:28 +02:00
github-actions[bot]
83286a99de Version Packages 2021-06-22 18:42:00 +02:00
Thijs Louisse
6cabdba5f6 feat(rocket): upgrade to lit2 2021-06-22 18:27:19 +02:00
github-actions[bot]
f5f2d69d0c Version Packages 2021-06-22 15:00:26 +02:00
Thomas Allmer
795a3613af fix(cli): service worker url respects pathPrefix 2021-06-22 14:57:52 +02:00
github-actions[bot]
bcf8f4fe83 Version Packages 2021-06-21 16:25:40 +02:00
Thomas Allmer
5330740cb3 fix(cli): replace images to be responsive from the bottom up 2021-06-21 16:20:48 +02:00
Thomas Allmer
2edd61beaa chore: remove image hashes from tests 2021-06-21 15:56:41 +02:00
github-actions[bot]
2a5fc08f35 Version Packages 2021-06-21 14:37:07 +02:00
Thomas Allmer
43a7ca10c3 fix(cli): responsive images need to respect pathPrefix 2021-06-21 14:35:51 +02:00
github-actions[bot]
da39fa72f3 Version Packages 2021-06-16 09:08:08 +02:00
Thomas Allmer
a0e8edfbb9 fix(check-html-links): ignore not http schema urls 2021-06-16 09:04:05 +02:00
Thomas Allmer
50434293bb fix(check-html-links): ignore tel links 2021-06-16 09:04:05 +02:00
Thomas Allmer
f08f92615b fix(check-html-links): add missing slash dependency 2021-06-16 09:04:05 +02:00
Thomas Allmer
1949b1e1cb fix(check-html-links): ignore html encoded mailto links 2021-06-16 09:04:05 +02:00
github-actions[bot]
340bf8e653 Version Packages 2021-06-11 17:56:06 +02:00
Thomas Allmer
eae200708d feat: update to mdjs version with lit 2 and render to light dom 2021-06-11 17:52:15 +02:00
github-actions[bot]
f707f636fa Version Packages 2021-06-11 13:15:48 +02:00
Thomas Allmer
814b5d29ad feat: render mdjs stories to light dom 2021-06-11 13:03:24 +02:00
Thomas Allmer
e1e96acceb feat: update mdjs to lit 2021-06-11 13:03:24 +02:00
github-actions[bot]
7543a129cf Version Packages 2021-06-08 22:28:18 +02:00
Thomas Allmer
60e85a17a7 fix: support picture tags with <source srset="..."> 2021-06-08 08:56:43 +02:00
github-actions[bot]
fd8f97859a Version Packages 2021-05-30 15:30:38 +02:00
Thomas Allmer
56fdb0cbd4 fix(plugins-manager): fix types for optional parameters 2021-05-30 15:27:44 +02:00
github-actions[bot]
e6d9c74510 Version Packages 2021-05-28 09:13:38 +02:00
Maarten Stolte
c338696482 chore: add changeset 2021-05-28 09:10:47 +02:00
Maarten Stolte
2ff4b4c542 chore: updated yarn.lock 2021-05-28 09:10:47 +02:00
Maarten Stolte
ba64b45ebf fix: update puppeteer to support M1 2021-05-28 09:10:47 +02:00
Maarten Stolte
e437e02cb9 fix(cli): Update eleventy-img to get M1 support 2021-05-28 09:10:47 +02:00
Thomas Allmer
ce9b12edd4 fix(mdjs-core): support importing via es module 2021-05-28 09:05:25 +02:00
github-actions[bot]
d034f799c0 Version Packages 2021-05-17 21:56:56 +02:00
Thomas Allmer
8bba4a88c8 feat: support for generating responsive images 2021-05-17 21:52:02 +02:00
github-actions[bot]
c7261aa2b0 Version Packages 2021-05-04 21:26:53 +02:00
Thomas Allmer
690075d335 chore: fix typo on service worker page 2021-05-04 07:19:47 +02:00
Thomas Allmer
2724f073fc feat: adopt a service worker flow with more control 2021-05-04 06:55:33 +02:00
github-actions[bot]
d08692c7f3 Version Packages 2021-04-29 12:35:04 +02:00
Thomas Allmer
2b7f1ee719 fix: support pathprefix in cli, launch, mdjs, search 2021-04-29 12:30:47 +02:00
github-actions[bot]
3802778be4 Version Packages 2021-04-29 08:30:57 +02:00
Thomas Allmer
26f4a1ebff chore: align versions 2021-04-29 00:35:26 +02:00
Thomas Allmer
81edf45fe2 fix: drastically reduce the amount of js files in build output 2021-04-29 00:35:26 +02:00
github-actions[bot]
c5a1d7e8d1 Version Packages 2021-04-24 17:12:15 +02:00
Thomas Allmer
74dd8d1bcc fix(mdjs-preview): autoheight will not grow bigger than the current size height 2021-04-24 17:05:20 +02:00
Thomas Allmer
72f631ac86 chore: add releases 2021-04-23 13:06:44 +02:00
Thomas Allmer
fafb99b0fa feat(mdjs-preview): add a copy code button 2021-04-23 13:06:44 +02:00
Thomas Allmer
f5769b9aa9 fix(mdjs-preview): improve customization capabilities 2021-04-23 13:06:44 +02:00
Konstantinos Norgias
12d9cc3b44 fix: configure simulator themes & platforms 2021-04-23 11:37:34 +02:00
Konstantinos Norgias
ef9b373aa1 style: add color theming with css custom props 2021-04-23 11:37:34 +02:00
Konstantinos Norgias
560234d663 fix: default no render empty themes and platforms 2021-04-23 11:37:34 +02:00
Konstantinos Norgias
024514e901 style: add simulator css vars 2021-04-23 11:37:34 +02:00
Mathieu Puech
66c2d781e6 fix: windows path issue when using rocket lint 2021-04-23 11:18:53 +02:00
github-actions[bot]
14721d1e0f Version Packages 2021-04-20 12:58:41 +02:00
Thomas Allmer
0f6709ac4b fix(mdjs-preview): initial setting should come from the element 2021-04-20 12:55:32 +02:00
Thomas Allmer
ed86ff2346 fix(cli): do not set data-localize-lang in the simulator iframe html tag 2021-04-20 12:55:32 +02:00
Mathieu Puech
c675820163 fix: windows path issue avoid filtering of index section of collections 2021-04-20 12:28:19 +02:00
Konstantinos Norgias
f4a0ab559f fix: add changeset & update drawer 2021-04-20 12:27:12 +02:00
Konstantinos Norgias
a8cdaebab1 fix(simulator): document shadowRoot n/a in iframe 2021-04-20 12:27:12 +02:00
github-actions[bot]
22393dd172 Version Packages 2021-04-20 06:50:18 +02:00
Thomas Allmer
a6fdb31f1e fix(mdjs-preview): do not restory empty values 2021-04-19 23:55:52 +02:00
Thomas Allmer
dd15d4fc65 chore: fix tests 2021-04-19 23:55:52 +02:00
Thomas Allmer
edb1abf82b feat(mdjs-preview): rework preview and add a simulation mode 2021-04-19 23:55:52 +02:00
Thomas Allmer
0b6411661e chore: update lion dependencies for drawer and search 2021-04-19 23:55:52 +02:00
Thomas Allmer
604a80e6cb feat(mdjs-story): force /define entrypoint 2021-04-19 23:55:52 +02:00
Thomas Allmer
fe6a929f1e feat(mdjs-core): keep the original code block and wrap it for preview story 2021-04-19 23:55:52 +02:00
Thomas Allmer
2267e728cf feat(eleventy-plugin-mdjs-unified): write mdjs javascript to file instead of inline 2021-04-19 23:55:52 +02:00
Thomas Allmer
abc8a02b72 fix(cli): supporting an absolute path for the rootDir 2021-04-19 23:55:52 +02:00
Thomas Allmer
2270887faf chore: format package.json 2021-04-19 23:55:52 +02:00
Thomas Allmer
bad4686506 feat(building-rollup): preserve export names & attributes on script tags, 2021-04-19 23:55:52 +02:00
Thomas Allmer
818caad7cb Create chilled-turkeys-help.md 2021-04-04 18:01:06 +02:00
Konstantinos Norgias
672b7e893e chore: generalize label & add alt when no img 2021-04-04 18:01:06 +02:00
Thomas Allmer
a8e66d84f4 feat(mdjs-core): extract mdjsSetupCode function which support a highlightCode fn 2021-04-04 18:00:26 +02:00
github-actions[bot]
e9090d64b9 Version Packages 2021-04-01 20:01:47 +02:00
Benny Powers
728a205b7b chore: add changeset 2021-04-01 19:44:43 +02:00
Benny Powers
67ba29d45a feat(navigation): add no-redirects attribute
By default, the sidebar nav redirects clicks on category headings to
their first child.

To disable those redirects, override
`_includes/_joiningBlocks/_layoutSidebar/sidebar/20-navigation.njk`
and add the `no-redirects` attribute to the `<rocket-navigation>`
element.
2021-04-01 19:44:43 +02:00
github-actions[bot]
758caffdf9 Version Packages 2021-03-25 07:14:15 +01:00
qa46hx
302227e8a9 feat(search): add variable for border-radius of SearchCombobox 2021-03-24 23:20:56 +01:00
Thomas Allmer
04a31220fb chore: align versions across the mono repo 2021-03-15 21:03:07 +01:00
Benny Powers
d44a23af0c Merge pull request #83 from modernweb-dev/changeset-release/main
Version Packages
2021-03-07 10:14:39 +02:00
github-actions[bot]
18a79589c2 Version Packages 2021-03-06 19:28:35 +00:00
Thomas Allmer
b7727b0e10 chore: add rocket nav upgrade to cli 2021-03-06 20:26:44 +01:00
Thomas Allmer
5edc40fed5 feat(cli): make sure each instance has its own eleventy config 2021-03-06 19:58:09 +01:00
Amin Yahyaabadi
be0d0b3ca1 fix: add missing main entry to the packages (#81)
This allows the tools to work properly. For example, eslint-plugin-import, TypeScript LSP hyperclick, and many other tools rely on main.
2021-03-06 19:10:49 +01:00
Thomas Allmer
ef8ebb0098 feat(eleventy-rocket-nav): support dynamically created content 2021-03-06 19:05:00 +01:00
djlauk
2fa61e1377 chore: tiny fixes to the README (#74) 2021-02-23 21:45:41 +01:00
Matsuuu
b23e37f38e feat(search): Precache search results to service worker 2021-02-23 21:44:53 +01:00
Matsuuu
cf45e32702 feat(search): Add ellipsis as prefix when truncating 2021-02-23 21:44:53 +01:00
Matsuuu
b5965c6c37 feat(search): Set cursor to pointer on result hover 2021-02-23 21:44:53 +01:00
Matsuuu
e39cc45d23 fix(search): Center search icon 2021-02-23 21:44:53 +01:00
Matsuuu
f0434cb12c feat(search): Add feedback when no results found 2021-02-23 21:44:53 +01:00
Matsuuu
c87caaed2d feat: Allow overlay query modification in Drawer (#73) 2021-02-23 21:31:12 +01:00
Thomas Allmer
04af7ecf53 chore: align dependency versions 2021-02-23 20:39:37 +01:00
github-actions[bot]
98d6aad12a Version Packages 2021-02-05 13:30:10 +01:00
Thomas Allmer
ee6b404aaa fix: mdjs element pass on shadowRoot to story function 2021-02-05 13:26:42 +01:00
Thomas Allmer
8ba8939c67 chore: use test-helper everywhere 2021-02-04 20:48:08 +01:00
Thomas Allmer
8e095b792e fix(cli): watching user preset files to trigger updates automatically 2021-02-04 19:56:56 +01:00
github-actions[bot]
b58ac27658 Version Packages 2021-02-04 09:51:19 +01:00
Thomas Allmer
f44a0f4fd4 fix(cli): rewrite dynamic imports with "`" 2021-02-04 09:45:35 +01:00
Thomas Allmer
750418bb51 fix: use class node api of check-html-links in rocket 2021-02-03 23:17:29 +01:00
Guillaume Grossetie
bc2698c1ba resolves #54 introduce a ignoreLinkPatterns option 2021-02-03 20:43:02 +01:00
Thomas Allmer
74f7ddf478 fix: create social media images only during build 2021-02-03 20:39:16 +01:00
github-actions[bot]
b5fa7ad9af Version Packages 2021-02-01 19:59:49 +01:00
Jorge del Casar
e3abdd956a chore: rename meta plugin to joiningBlocks 2021-02-01 13:20:02 +01:00
Thomas Allmer
8bdc326e38 chore: add changeset and docs 2021-02-01 13:20:02 +01:00
Thomas Allmer
806fcc0556 chore: go back to inline scripts for now 2021-02-01 13:20:02 +01:00
Thomas Allmer
e7d7945259 feat: default layout for index files with open menu button 2021-02-01 13:20:02 +01:00
Thomas Allmer
502347aa8d chore: remove previous/next link for now 2021-02-01 13:20:02 +01:00
Thomas Allmer
26b558c118 fix: mobile navigation 2021-02-01 13:20:02 +01:00
Thomas Allmer
8eec69f918 feat: big refactor to introduce _joiningBlocks 2021-02-01 13:20:02 +01:00
Thomas Allmer
078cff26fe fix(cli): template merge order by numbers, add tests, docs 2021-02-01 13:20:02 +01:00
Jorge del Casar
8896c0655b feat: dynamic partial includes 2021-02-01 13:20:02 +01:00
Stephen Wade
43ef209bad chore: Docs updates (#53)
* chore: fix Eleventy spelling
* chore: misc CONTRIBUTING.md updates
* chore: fix GitHub capitalization
* chore: fix HTML capitalization
* chore: fix JavaScript capitalization
* chore: misc README.md updates
* chore: update slack.md to match modernweb-dev/web
* chore: misc docs/about updates
* chore: misc docs/blog updates
* chore: misc docs/docs updates
* chore: fix mdjs capitalization
* chore: fix Markdown capitalization
* chore: fix Rocket capitalization
* chore: fix apostrophes
* chore: fix TypeScript capitalization
* chore: consistently capitalize headings
* chore: misc docs/guides updates
* chore: misc packages/building-rollup updates
* chore: misc packages/check-html-links updates
* chore: misc packages/cli updates
* chore: misc packages/plugins-manager updates
* chore: misc packages/search updates
* chore: fix tests
* chore: fix lints
2021-01-31 11:00:53 +01:00
github-actions[bot]
f2a4b80f1e Version Packages 2021-01-28 09:10:39 +01:00
Thomas Allmer
f343c5030a fix(check-html-links): read and parse with the same increased highWaterMark 2021-01-28 09:02:56 +01:00
Thomas Allmer
a7b0dbbce0 chore: add blog introducing check-html-links 2021-01-27 19:58:49 +01:00
Jorge del Casar
eeb51c830c chore: build packages on setup 2021-01-25 16:08:57 +01:00
github-actions[bot]
b968badf43 Version Packages 2021-01-21 19:54:12 +01:00
Thomas Allmer
c92769a145 fix(cli): processing of links/assets urls needs to be utf8 safe 2021-01-21 19:48:23 +01:00
Thomas Allmer
562e91fc43 fix(cli): make sure there is no <?xml in the logo code 2021-01-21 16:46:39 +01:00
502 changed files with 13242 additions and 3117 deletions

View File

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

View File

@@ -4,27 +4,27 @@
> Please note that this project is released with a [Contributor Code of Conduct](./CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. > Please note that this project is released with a [Contributor Code of Conduct](./CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
First, create a fork of the [modernweb-dev/rocket](https://github.com/modernweb-dev/rocket) repo by hitting the `fork` button on the GitHub page. First, create a fork of the [modernweb-dev/rocket](https://github.com/modernweb-dev/rocket) repository by hitting the `fork` button on the GitHub page.
Next, clone our repository onto your computer with this command (replacing YOUR_USERNAME with your actual GitHub username) Next, clone our repository onto your computer.
```sh ```sh
git clone git@github.com:modernweb-dev/rocket.git git clone git@github.com:modernweb-dev/rocket.git
``` ```
Once cloning is complete, change directory to the repo. Once cloning is complete, change directory to the repository.
```sh ```sh
cd rocket cd rocket
``` ```
Now add your fork as a remote Now add your fork as a remote (replacing YOUR_USERNAME with your GitHub username).
```sh ```sh
git remote add fork git@github.com:<YOUR_NAME>/rocket.git git remote add fork git@github.com:<YOUR_USERNAME>/rocket.git
``` ```
Create a new local branch Create a new local branch.
```sh ```sh
git checkout -b my-awesome-fix git checkout -b my-awesome-fix
@@ -32,7 +32,7 @@ git checkout -b my-awesome-fix
## Preparing Your Local Environment for Development ## Preparing Your Local Environment for Development
Now that you have cloned the repository, ensure you have [yarn](https://classic.yarnpkg.com/lang/en/) installed run the following commands to set up the development environment. Now that you have cloned the repository, ensure you have [yarn](https://classic.yarnpkg.com/lang/en/) installed, then run the following commands to set up the development environment.
```sh ```sh
yarn install yarn install
@@ -42,25 +42,25 @@ This will download and install all packages needed.
## Making Your Changes ## Making Your Changes
Make your changes to the project. Commits are linted using precommit hooks, meaning that any code that raises linting error cannot be committed. In order to help avoid that, we recommend using an IDE or editor with an eslint plugin in order to streamline the development process. Plugins are available for all the popular editors. For more information see [ESLint Integrations](https://eslint.org/docs/user-guide/integrations) Make your changes to the project. Commits are linted using precommit hooks, meaning that any code that raises a linting error cannot be committed. In order to help avoid that, we recommend using an IDE or editor with an ESLint plugin in order to streamline the development process. Plugins are available for all the popular editors. For more information see [ESLint Integrations](https://eslint.org/docs/user-guide/integrations)
### Compiling the typescript code ### Compiling the TypeScript Code
If you're making cross-package changes, you need to compile the typescript code. We recommend executing `tsc:watch` from the root of the package and keeping that running while you make your changes. If you're making cross-package changes, you need to compile the TypeScript code. We recommend executing `tsc:watch` from the root of the package and keeping that running while you make your changes.
### Running tests ### Running Tests
To run the tests of a package, it's recommended to `cd` into the package directory and then using `yarn test` to run them. This way you're only running tests of that specific package. To run the tests of a package, it's recommended to `cd` into the package directory and then using `yarn test` to run them. This way you're only running tests of that specific package.
### Integration testing ### Integration Testing
To see how your changes integrate with everything together you can use the `test-runner` package. There are different commands in this package which you can execute to trigger different scenarios in the test runner. To see how your changes integrate with everything together you can use the `test-runner` package. There are different commands in this package which you can execute to trigger different scenarios in the test runner.
## Adding new packages ## Adding New Packages
For all projects the tsconfig/jsconfig configuration files are auto generated. You need to add an entry to the [./workspace-packages.ts](./workspace-packages.ts) to let it generate a config for you. After adding an entry, run `yarn update-package-configs` to generate the files for you. For all projects the tsconfig/jsconfig configuration files are auto generated. You need to add an entry to the [./workspace-packages.ts](./workspace-packages.ts) to let it generate a config for you. After adding an entry, run `yarn update-package-configs` to generate the files for you.
## Create a Changeset ## Creating a Changeset
If you made changes for which you want to trigger a release, you need to create a changeset. If you made changes for which you want to trigger a release, you need to create a changeset.
This documents your intent to release, and allows you to specify a message that will be put into the changelog(s) of the package(s). This documents your intent to release, and allows you to specify a message that will be put into the changelog(s) of the package(s).

View File

@@ -1,4 +1,4 @@
> This project is in it's BETA phase > This project is in its BETA phase
<p align="center"> <p align="center">
<img <img
@@ -19,6 +19,11 @@
src="https://img.shields.io/badge/twitter-@modern_web_dev-1DA1F3?style=flat-square" src="https://img.shields.io/badge/twitter-@modern_web_dev-1DA1F3?style=flat-square"
alt="Follow @modern_web_dev on Twitter" alt="Follow @modern_web_dev on Twitter"
/></a> /></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>
<p align="center"> <p align="center">
@@ -33,7 +38,7 @@
**The modern web setup for static sites with a sprinkle of JavaScript!** **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://www.11ty.dev/">Eleventy</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. - **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.. - **Small:** No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed..
@@ -41,12 +46,12 @@
<a href="https://rocket.modern-web.dev/guides/"><strong>Explore the Rocket Guides&nbsp;&nbsp;▶</strong></a> <a href="https://rocket.modern-web.dev/guides/"><strong>Explore the Rocket Guides&nbsp;&nbsp;▶</strong></a>
</p> </p>
## The goal for Rocket ## The Goal for Rocket
> Our goal is to provide developers with a meta framework for static websites with a spricle of JavaScript. > Our goal is to provide developers with a meta framework for static websites with a sprinkle of JavaScript.
Get a site up and running in no time and focus on the content. Get a site up and running in no time and focus on the content.
You can still tweak every details of every underlying tool that get's used. 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). Rocket is part of the [Modern Web Family](https://twitter.com/modern_web_dev).
@@ -54,7 +59,7 @@ Rocket is part of the [Modern Web Family](https://twitter.com/modern_web_dev).
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). 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).
If you are interested in helping contribute to Modern Web, please take a look at our [Contributing Guide](https://github.com/modernweb-dev/rocket/blob/main/CONTRIBUTING.md). Also, feel free to drop into [slack](https://rocket.modern-web.dev/discover/slack/) and say hi. 👋 If you are interested in helping contribute to Modern Web, please take a look at our [Contributing Guide](https://github.com/modernweb-dev/rocket/blob/main/CONTRIBUTING.md). Also, feel free to drop into [slack](https://rocket.modern-web.dev/about/slack/) and say hi. 👋
### Financial Contributors ### Financial Contributors

1
docs/.eleventyignore Normal file
View File

@@ -0,0 +1 @@
*.docs.md

View File

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

View File

@@ -0,0 +1 @@
<svg id="n" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#c12127;}.cls-2{fill:#fff;}</style></defs><title>n</title><path class="cls-1" d="M0,16V0H16V16ZM3,3V13H8V5h3v8h2V3Z"/><path class="cls-2" d="M3,3H13V13H11V5H8v8H3Z"/></svg>

After

Width:  |  Height:  |  Size: 287 B

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="76.58987244897958 44 164.00775510204068 164" width="160.01" height="160"><defs><path d="M237.6 95L187.6 95L187.6 45L237.6 45L237.6 95Z" id="arNRoK435"></path><path d="M182.59 95L132.59 95L132.59 45L182.59 45L182.59 95Z" id="a3H2WU7Px"></path><path d="M127.59 95L77.59 95L77.59 45L127.59 45L127.59 95Z" id="b1DInM56vl"></path><path d="M237.6 150L187.6 150L187.6 100L237.6 100L237.6 150Z" id="a7LFlgQIwu"></path><path d="M182.59 150L132.59 150L132.59 100L182.59 100L182.59 150Z" id="amwLiZcuo"></path><path d="M182.59 205L132.59 205L132.59 155L182.59 155L182.59 205Z" id="f3Peu5RWan"></path><path d="M237.6 205L187.6 205L187.6 155L237.6 155L237.6 205Z" id="a6DXBfqPa"></path><path d="M127.59 205L77.59 205L77.59 155L127.59 155L127.59 205Z" id="c1GWSTH1z7"></path></defs><g><g><use xlink:href="#arNRoK435" opacity="1" fill="#f9ad00" fill-opacity="1"></use></g><g><use xlink:href="#a3H2WU7Px" opacity="1" fill="#f9ad00" fill-opacity="1"></use></g><g><use xlink:href="#b1DInM56vl" opacity="1" fill="#f9ad00" fill-opacity="1"></use></g><g><use xlink:href="#a7LFlgQIwu" opacity="1" fill="#f9ad00" fill-opacity="1"></use></g><g><use xlink:href="#amwLiZcuo" opacity="1" fill="#4e4e4e" fill-opacity="1"></use></g><g><use xlink:href="#f3Peu5RWan" opacity="1" fill="#4e4e4e" fill-opacity="1"></use></g><g><use xlink:href="#a6DXBfqPa" opacity="1" fill="#4e4e4e" fill-opacity="1"></use></g><g><use xlink:href="#c1GWSTH1z7" opacity="1" fill="#4e4e4e" fill-opacity="1"></use></g></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 518 518"><style>.st0{fill:#2c8ebb}.st1{fill:#fff}</style><path class="st0" d="M259 0c143 0 259 116 259 259S402 518 259 518 0 402 0 259 116 0 259 0z"/><path class="st1" d="M435.2 337.5c-1.8-14.2-13.8-24-29.2-23.8-23 .3-42.3 12.2-55.1 20.1-5 3.1-9.3 5.4-13 7.1.8-11.6.1-26.8-5.9-43.5-7.3-20-17.1-32.3-24.1-39.4 8.1-11.8 19.2-29 24.4-55.6 4.5-22.7 3.1-58-7.2-77.8-2.1-4-5.6-6.9-10-8.1-1.8-.5-5.2-1.5-11.9.4C293.1 96 289.6 93.8 286.9 92c-5.6-3.6-12.2-4.4-18.4-2.1-8.3 3-15.4 11-22.1 25.2-1 2.1-1.9 4.1-2.7 6.1-12.7.9-32.7 5.5-49.6 23.8-2.1 2.3-6.2 4-10.5 5.6h.1c-8.8 3.1-12.8 10.3-17.7 23.3-6.8 18.2.2 36.1 7.1 47.7-9.4 8.4-21.9 21.8-28.5 37.5-8.2 19.4-9.1 38.4-8.8 48.7-7 7.4-17.8 21.3-19 36.9-1.6 21.8 6.3 36.6 9.8 42 1 1.6 2.1 2.9 3.3 4.2-.4 2.7-.5 5.6.1 8.6 1.3 7 5.7 12.7 12.4 16.3 13.2 7 31.6 10 45.8 2.9 5.1 5.4 14.4 10.6 31.3 10.6h1c4.3 0 58.9-2.9 74.8-6.8 7.1-1.7 12-4.7 15.2-7.4 10.2-3.2 38.4-12.8 65-30 18.8-12.2 25.3-14.8 39.3-18.2 13.6-3.3 22.1-15.7 20.4-29.4zm-23.8 14.7c-16 3.8-24.1 7.3-43.9 20.2-30.9 20-64.7 29.3-64.7 29.3s-2.8 4.2-10.9 6.1c-14 3.4-66.7 6.3-71.5 6.4-12.9.1-20.8-3.3-23-8.6-6.7-16 9.6-23 9.6-23s-3.6-2.2-5.7-4.2c-1.9-1.9-3.9-5.7-4.5-4.3-2.5 6.1-3.8 21-10.5 27.7-9.2 9.3-26.6 6.2-36.9.8-11.3-6 .8-20.1.8-20.1s-6.1 3.6-11-3.8c-4.4-6.8-8.5-18.4-7.4-32.7 1.2-16.3 19.4-32.1 19.4-32.1s-3.2-24.1 7.3-48.8c9.5-22.5 35.1-40.6 35.1-40.6s-21.5-23.8-13.5-45.2c5.2-14 7.3-13.9 9-14.5 6-2.3 11.8-4.8 16.1-9.5 21.5-23.2 48.9-18.8 48.9-18.8s13-39.5 25-31.8c3.7 2.4 17 32 17 32s14.2-8.3 15.8-5.2c8.6 16.7 9.6 48.6 5.8 68-6.4 32-22.4 49.2-28.8 60-1.5 2.5 17.2 10.4 29 43.1 10.9 29.9 1.2 55 2.9 57.8.3.5.4.7.4.7s12.5 1 37.6-14.5c13.4-8.3 29.3-17.6 47.4-17.8 17.5-.3 18.4 20.2 5.2 23.4z"/></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

10
docs/_assets/body.css Normal file
View File

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

View File

@@ -1,21 +1,51 @@
body[layout='home'] .markdown-body .call-to-action:nth-of-type(2) { :not(rocket-navigation):not(:defined) {
opacity: 0;
}
rocket-navigation,
header {
font-family: 'Montserrat', sans-serif;
}
code-tabs[collection="package-managers"] {
--code-tabs-icon-height: 18px;
}
.call-to-action {
background: var(--button-one) !important;
text-shadow: none !important;
border-radius: 5px !important;
padding-top: 15px !important;
padding-bottom: 15px !important;
border: none !important;
}
.call-to-action:hover,
.call-to-action:focus,
.call-to-action:active {
background: var(--button-one-hover) !important;
}
.call-to-action:nth-child(2) {
background: var(--button-two) !important;
}
.call-to-action:nth-child(2):hover,
.call-to-action:nth-child(2):focus,
.call-to-action:nth-child(2):active {
background: var(--button-two-hover) !important;
}
body[layout^='layout-home'] .markdown-body .call-to-action:nth-of-type(2) {
--primary-color: #222; --primary-color: #222;
--primary-color-lighter: #333; --primary-color-lighter: #333;
--primary-color-darker: #000; --primary-color-darker: #000;
} }
@media screen and (min-width: 1024px) { @media screen and (min-width: 1024px) {
body[layout='home'][home-layout='background'] .page-background { body[layout='layout-home-background'] .page-background {
top: -210px; top: -210px;
right: -463px; right: -463px;
transform: rotate(45deg); transform: rotate(45deg);
} }
} }
rocket-navigation {
font-family: 'Montserrat', sans-serif;
}
header {
font-family: 'Montserrat', sans-serif;
}

141
docs/_assets/theme.css Normal file
View File

@@ -0,0 +1,141 @@
html {
--button-one-hover: #436eff;
--button-one: #2758ff;
--button-two-hover: #444;
--button-two: black;
--contrast-color-dark: #1d3557;
--contrast-color-light: #fff;
--footer-background: rgba(0, 0, 0, 0.02);
--header-color: white;
--markdown-link-color: #2758ff;
--markdown-syntax-background-color: #f9f9f9;
--markdown-table-row-odd-background-color: #efefef;
--owc-active-color: #2758ff;
--owc-hover-color: #436eff;
--page-background: white;
--primary-color-accent: #cee5f6;
--primary-color-darker: #1a5285;
--primary-color-lighter: #449ad7;
--primary-color: rgb(44, 62, 80);
--primary-lines-color: #ccc;
--primary-text-color: #2c3e50;
--primary-text-inverse-color: #eee;
--switch-unselected-color: #808080;
--switch-selected-color: #42b983;
}
@media (prefers-color-scheme: dark) {
html {
--header-color: #2f3136;
--footer-background: rgba(255, 255, 255, 0.1);
--page-background: #36393e;
--text-color: #eee;
--primary-text-color: #eee;
--primary-color: white;
--primary-color-lighter: #449ad7;
--primary-color-darker: #1a5285;
--primary-color-accent: #cee5f6;
--contrast-color-light: #fff;
--contrast-color-dark: #1d3557;
--primary-lines-color: #333;
--owc-active-color: #41ffb0;
--owc-hover-color: #6dffc2;
--button-one: #9b03fe;
--button-one-hover: #a724ff;
--button-two: black;
--button-two-hover: rgb(36, 36, 36);
--rocket-search-background-color: #4a4d52;
--rocket-search-highlight-color: #41ffb0;
--rocket-search-hover-background-color: #6b717a;
--rocket-search-fill-color: #fff;
--primary-text-inverse-color: #2c3e50;
--switch-unselected-color: #808080;
--switch-selected-color: #42b983;
/* Markdown */
--markdown-octicon-link: var(--primary-text-color);
--markdown-link-color: #41ffb0;
--markdown-divider-color: #e1e4e8;
--markdown-blockquote-border-color: #dfe2e5;
--markdown-blockquote-color: #90aac7;
--markdown-kbd-background-color: #fafbfc;
--markdown-kbd-border-color: #c6cbd1;
--markdown-kbd-border-bottom-color: #959da5;
--markdown-kbd-color: #444d56;
--markdown-heading-color-6: #6a737d;
--markdown-table-background-color: var(--markdown-syntax-background-color);
--markdown-table-row-odd-background-color: var(--markdown-kbd-color);
--markdown-table-border-color: transparent;
--markdown-code-background-color: rgba(27, 31, 35, 0.05);
--markdown-pre-background-color: rgb(49, 49, 49);
/* syntax */
--markdown-syntax-color: #f8f8f2;
--markdown-syntax-background-color: #2e3440;
--markdown-syntax-atrule-color: #88c0d0;
--markdown-syntax-attr-name-color: #a3be8c;
--markdown-syntax-attr-value-color: #88c0d0;
--markdown-syntax-builtin-color: #a3be8c;
--markdown-syntax-boolean-color: #81a1c1;
--markdown-syntax-class-name-color: #88c0d0;
--markdown-syntax-constant-color: #81a1c1;
--markdown-syntax-char-color: #a3be8c;
--markdown-syntax-deleted-color: #81a1c1;
--markdown-syntax-entity-color: #81a1c1;
--markdown-syntax-function-color: #88c0d0;
--markdown-syntax-inserted-color: #a3be8c;
--markdown-syntax-keyword-color: #81a1c1;
--markdown-syntax-number-color: #b48ead;
--markdown-syntax-operator-color: #81a1c1;
--markdown-syntax-property-color: #81a1c1;
--markdown-syntax-punctuation-color: #81a1c1;
--markdown-syntax-regex-color: #81a1c1;
--markdown-syntax-important-color: #81a1c1;
--markdown-syntax-selector-color: #a3be8c;
--markdown-syntax-symbol-color: #81a1c1;
--markdown-syntax-string-color: #a3be8c;
--markdown-syntax-tag-color: #81a1c1;
--markdown-syntax-url-color: #81a1c1;
--markdown-syntax-variable-color: #81a1c1;
--markdown-syntax-hotkey-selector-color: #d73a49;
--markdown-syntax-keyword-color: #22863a;
--markdown-syntax-background-color: rgb(27, 29, 35);
--markdown-syntax-atrule-color: rgb(198, 120, 221);
--markdown-syntax-attr-name-color: rgb(198, 120, 221);
--markdown-syntax-boolean-color: rgb(209, 154, 102);
--markdown-syntax-class-name-color: rgb(97, 175, 239);
--markdown-syntax-constant-color: rgb(220, 220, 170);
--markdown-syntax-entity-color: rgb(220, 220, 170);
--markdown-syntax-function-color: rgb(97, 175, 239);
--markdown-syntax-inserted-color: rgb(220, 220, 170);
--markdown-syntax-keyword-color: rgb(198, 120, 221);
--markdown-syntax-number-color: rgb(220, 220, 170);
--markdown-syntax-operator-color: rgb(220, 220, 170);
--markdown-syntax-property-color: rgb(220, 220, 170);
--markdown-syntax-punctuation-color: white;
--markdown-syntax-regex-color: rgb(209, 154, 102);
--markdown-syntax-selector-color: rgb(86, 156, 214);
--markdown-syntax-symbol-color: rgb(220, 220, 170);
--markdown-syntax-tag-color: rgb(86, 156, 214);
--markdown-syntax-url-color: rgb(220, 220, 170);
--markdown-syntax-variable-color: rgb(220, 220, 170);
}
.string {
color: rgb(152, 195, 121);
}
.comment {
color: #7d7d7d;
}
.language-css {
--markdown-syntax-string-color: #81a1c1;
}
}
body[layout='home'] .markdown-body .call-to-action:nth-of-type(2) {
--primary-color: #222;
--primary-color-lighter: #333;
--primary-color-darker: #000;
}

View File

@@ -16,7 +16,7 @@
"name": "Follow", "name": "Follow",
"children": [ "children": [
{ {
"text": "Github", "text": "GitHub",
"href": "https://github.com/modernweb-dev/rocket" "href": "https://github.com/modernweb-dev/rocket"
}, },
{ {

View File

@@ -3,12 +3,17 @@ module.exports = async function () {
dir: 'ltr', dir: 'ltr',
lang: 'en', lang: 'en',
name: 'Rocket', name: 'Rocket',
description: 'Rocket is the way to build fast static websites with a sprinkle of javascript', description: 'Rocket is the way to build fast static websites with a sprinkle of JavaScript',
socialLinks: [ socialLinks: [
{ {
name: 'GitHub', name: 'GitHub',
url: 'https://github.com/modernweb-dev/rocket', 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', gitSiteUrl: 'https://github.com/modernweb-dev/rocket',
gitBranch: 'main', gitBranch: 'main',

View File

@@ -0,0 +1 @@
<link rel="stylesheet" href="{{ '/_assets/theme.css' | asset | url }}">

View File

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

View File

@@ -1,5 +1,5 @@
# Slack # Slack
You can also find us on the Polymer slack in the [#open-wc](https://slack.com/share/IUQNUPWUF/awabyN8iYH4dXX6aGpu16ES9/enQtOTc2Nzc2ODEyOTY3LWM5ZGExNGFiMmM4NDY2YWI2MzYwOGY5ZTNlZjk4OGU4NTFhMGJjNmVhNGI4MzVlNTMwNGRiNGIxNjc4MGJhNDg) channel. 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. You can join the Polymer Slack by visiting [https://www.polymer-project.org/slack-invite](https://www.polymer-project.org/slack-invite).

View File

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

View File

@@ -1,6 +1,5 @@
--- ---
title: Rocket Blog layout: layout-blog-overview
layout: blog
eleventyNavigation: eleventyNavigation:
key: Blog key: Blog
order: 30 order: 30
@@ -11,4 +10,6 @@ pagination:
alias: posts alias: posts
--- ---
# Rocket Blog
Discover articles from the core team and contributors about Rocket, tips and tricks included! Discover articles from the core team and contributors about Rocket, tips and tricks included!

View File

@@ -0,0 +1,12 @@
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

@@ -0,0 +1,206 @@
---
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
---
**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)**
In my developer career, I have put live multiple websites and honestly often within a few days, there was always this one issue raised. "This link on xxx is broken". 🤦‍♂️
Often these things happen as somewhere a page got moved or renamed and not every location got updated.
It's really hard to catch especially if you have a dynamic page like with WordPress or an SPA. And for users, there is nothing worse than landing on your documentation only to find a 404 staring back at them.
Luckily, with the rise of SSG (Static Site Generators), this problem becomes easier to tackle and can be solved in large part. The reason for that is that with all HTML rendered upfront as static files we can read all of them and check every link.
## Evaluation and the Decision for a New Tool
Of course, I am not the first one to come up with that idea and there are multiple tools available on the market already.
However, when checking existing solutions I found out that most of them didn't satisfy me in at least one way 😅. Things I noticed: slow to execute, deprecated, large dependency tree, confusing output for the user, ...
Reviewing these tools I decided to create my own, with the following requirements :
- Blazing fast
- User-focused output
- Few dependencies, to keep it lean
- Preferably in the Node.js ecosystem
## Focusing on Useful Output
Most tools evaluated check files individually and report on their findings individually. That means if you have a broken link in your header or footer, you will get one line (or even multiple lines) of an error message(s) for EVERY page.
I tested this on the [11ty-website](https://github.com/11ty/11ty-website) and there are currently 516 broken links in 501 files. However, **the source of those 516 broken links is just 13 missing pages/resources**.
In my implementation, I decided to switch from an "Error in File Focused" method to a "Missing File Focused". Let's see this with examples
### Error in File Focused
This is what a lot of current existing solutions implement. Here is part of the output that is being produced:
```
[...]
authors/ryzokuken/index.html
target does not exist --- authors/ryzokuken/index.html --> /speedlify/
authors/alex_kaul/index.html
target does not exist --- authors/alex_kaul/index.html --> /speedlify/
docs/config/index.html
target does not exist --- docs/config/index.html --> /speedlify/
hash does not exist --- docs/config/index.html --> /docs/copy/#disabling-passthrough-file-copy
authors/cramforce/index.html
target does not exist --- authors/cramforce/index.html --> /speedlify/
authors/accudio/index.html
target does not exist --- authors/accudio/index.html --> /speedlify/
[...]
```
We get ~2000 lines of errors for `/speedlify/` as it's not found ~500 times. In the middle of those errors, we also see some other broken links.
Because the reporting is focusing first on the files, and then on the actual error **it is difficult to know where most errors originate from**.
### Missing File Focused
Let us turn that around and focus on missing references indeed. Here is the output for the same input website :
```
[...]
1. missing reference target _site/speedlify/index.html
from _site/404.html:1942:13 via href="/speedlify/"
from _site/authors/_amorgunov/index.html:2031:13 via href="/speedlify/"
from _site/authors/_coolcut/index.html:2031:13 via href="/speedlify/"
... 495 more references to this target
2. missing id="disabling-passthrough-file-copy" in _site/docs/copy/index.html
from _site/docs/config/index.html:2527:267 via href="/docs/copy/#disabling-passthrough-file-copy"
3. missing reference target _site/authors/dkruythoff/github.com/dkruythoff/darius-codes
from _site/authors/dkruythoff/index.html:2102:234 via href="github.com/dkruythoff/darius-codes"
[...]
```
We get one 5 line error for `/speedlify/` and it tells us it's missing 495 times + 3 examples usages.
Afterward, we find very clearly more missing references and where they occurred.
### A Clear Winner
Comparing those two outputs makes it pretty clear to me that `Missing File Focused` will make more sense if there is a chance that some links will be broken everywhere. My implementation focuses on missing links in its output. This is crucial because it allows developers to know where to focus their efforts first to get the biggest wins.
## Focusing on Speed
Speed is always nice to have but in this case, it's probably vital. I need this to be fast so that I can run it potentially on every save. Speed is also very important in case the tool runs in a CI for example. For projects with extensive documentation, we don't want to hog the CI only to check for documentation.
Luckily HTML is an awesome language to analyze as it's declarative, which means you can read and analyze it at the same time. This may even mean that the HTML is already processed by the time the file is done reading.
With this knowledge I was hopeful - but reality didn't deliver 😅. The only tool that could keep up with the speed I needed was implemented in [Go](https://golang.org/).
It seems that most tools use sophisticated parsers meant to create full syntax trees of your HTML.
In reality for link checking all you need to know are the _id_ and the _href_ attributes.
I have been using [sax-wasm](https://github.com/justinwilaby/sax-wasm) in a few situations before and I knew it supported streaming. I knew that way it could be FAST 🤞!
How fast are we talking about though?
As a rule of thumb, I decided that the analysis should be finished within 1s for a small site (up to 200 pages).
The main reason is already listed above: To not disturb during writing/development as it will run on every save.
For medium sites (200 - 1000 pages), it's reasonable if it takes a little longer - let's aim for less than 5 seconds. This will probably be a breaking point where you execute it only on-demand and in the CI instead of executing it on every save.
Results are gatherd on January 26, 2021:
| Website | Pages | Duration |
| ----------- | ----- | -------- |
| open-wc.org | 90 | ~0.4s |
| 11ty.dev | 501 | ~2.5s |
| web.dev | 830 | ~3.7s |
| eslint.org | 3475 | ~12.4s |
## Being Part of the Node.js Ecosystem
My daily workflow is hugely dominated by JavaScript, so it was only natural to want to stay in the same environment if I could reach my earlier requirements with it.
On top of this, the end goal is to integrate it within a bigger WIP system called [Rocket](https://github.com/modernweb-dev/rocket) which is node-based so therefore it will need to at least support Node.js. Having it standalone (usable via `npx`) also makes it more versatile and easier to maintain/test.
## Focusing on a Small Dependency Tree
The JavaScript and Node.js ecosystem is very active and constantly shifting. Lots of changes/improvements happen all the time. It's often hard to keep up. Therefore having a small dependency tree is something to always thrive for because it will reduce the maintenance burden down the line. And as an added benefit, it makes it smaller and easily embeddable as less stuff has to go down the wire. Lean is king 👑.
## Solution
As already mentioned I went on and implement a link checker myself 😅. So far it fits all my requirements so I call it a success 🎉! You can find it [on npm](https://www.npmjs.com/package/check-html-links).
I called it `check-html-links` and its slogan is "no more broken links or assets".
The features so far are:
- extracts every attribute value of id, href, src, srcset
- use a Wasm parser (sax-wasm)
- streams the HTML for performance
- check if file or id within file exist
- focus on missing references/sources
## Usage
It checks your final HTML output so you need to execute it after your Static Site Generator.
```
npx check-html-links _site
```
## GitHub Action Usage
[Julien](https://twitter.com/jlengrand) created a GitHub action available for the tool, so you can easily plug it in your existing CI. You can find it [on the GitHub Marketplace](https://github.com/marketplace/actions/check-html-links-action).
Here is a complete example workflow that will check the result of the folder `_site` in the root of your repository on each push:
```yml
on: [push]
jobs:
check_html_links_job:
runs-on: ubuntu-latest
name: A job to test check-html-links-action
steps:
- uses: actions/checkout@v2
- name: check-html-links-action step
id: check-links
uses: modernweb-dev/check-html-links-action@v1
with:
doc-folder: '_site_'
```
## Comparison
Checking the output of the [11ty-website](https://github.com/11ty/11ty-website) with 13 missing reference targets (used by 516 links) while checking 501 files. (on January 17, 2021)
| Tool | Lines printed | Duration | Lang | Dependency Tree |
| ---------------- | ------------- | -------- | ---- | --------------- |
| check-html-links | 38 | ~2.5s | node | 19 |
| link-checker | 3000+ | ~11s | node | 106 |
| hyperlink | 68 | 4m 20s | node | 481 |
| htmltest | 1000+ | ~0.7s | GO | - |
## Future
The basic functionality is finished and it's reasonabley fast.
Topic to work on:
- Allow to ignore folders (potentially via a cli parameter)
- Support for `<base href="/">`
- Big Sites Speed improvements (potentially running multiple parsers in parallel for 1000+ pages)
- Speed improvements by introducing a "permanent cache" for the parse result (if file did not change, parse result will not change - we still check all links)
- Memory consumption check (see if there is room for improvements)
- Improve node api
- Check external links
## Acknowledgements
Thank you for following along on my journey on creating `check-html-links`. You can find the code on [GitHub](https://github.com/modernweb-dev/rocket/tree/main/packages/check-html-links).
Follow us on [Twitter](https://twitter.com/modern_web_dev), or follow me on my personal [Twitter](https://twitter.com/dakmor).
Thanks to [Julien](https://twitter.com/jlengrand) for feedback and helping turn my scribbles to a followable story.
If you think my open source work is valuable then I would like you to check out my personal [GitHub Sponsor Page](https://github.com/sponsors/daKmoR). Or you can support our whole group via the [Modern Web Open Collective](https://opencollective.com/modern-web).
---
<span>Photo by <a href="https://unsplash.com/@mihaiteslariu0?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Teslariu Mihai</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></span>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,16 +0,0 @@
---
title: Introducing rocket - effective static content with some javascript
published: true
description: Write Interactive Demos Using Markdown and JavaScript
tags: [markdown, javascript, webcomponents, demos]
cover_image: /blog/introducing-rocket/images/blog-header.jpg
socialMediaImage: /blog/introducing-rocket/images/social-media-image.jpg
---
Welcome to the next level of content creation.
## Here comes the navigation
Stuff
## Another anchor

View File

@@ -0,0 +1,40 @@
# 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.js` (or your theme config file)
<!-- prettier-ignore-start -->
```js copy
import { addPlugin } from 'plugins-manager';
/** @type {import('@rocket/cli').RocketCliOptions} */
export default ({
setupEleventyComputedConfig: [
addPlugin({ name: 'greeting', plugin: data => `Welcome to the ${data.title} page.` }),
],
});
```
<!-- prettier-ignore-end -->
Now you can use {% raw %}{{ greeting }}{% endraw %} everywhere,
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

@@ -0,0 +1,314 @@
# Configuration >> Images ||40
Rocket does handle content images automatically by
- producing multiple sizes so users download images that are meant for their resolution
- outputting multiple formats so the device can choose the best image format it supports
And the best thing about is you don't need to do anything.
## Usage
If you are using markdown images you are good to go.
```md
![My Image](path/to/image.jpg)
```
will result in
```html
<picture>
<source
type="image/avif"
srcset="/images/5f03d82-300.avif 300w, /images/5f03d82-820.avif 820w"
sizes="(min-width: 1024px) 820px, calc(100vw - 20px)"
/>
<source
type="image/jpeg"
srcset="/images/5f03d82-300.jpeg 300w, /images/5f03d82-820.jpeg 820w"
sizes="(min-width: 1024px) 820px, calc(100vw - 20px)"
/>
<img
alt="My Image"
rocket-image="responsive"
src="/images/5f03d82-300.jpeg"
width="300"
height="158"
loading="lazy"
decoding="async"
/>
</picture>
```
## Benefits
The main benefit is that we can serve the correct size and optimal image format depending on the browser capabilities leading to optimal loading times on different systems.
- Smaller images for smaller screens
When providing `srcset` and `sizes` the browser can decide which image makes the most sense to download.
This will lead to much faster websites especially on mobile where smaller images can be served.
If you wanna know more check out [The anatomy of responsive images](https://jakearchibald.com/2015/anatomy-of-responsive-images/).
- Serve the best/smallest image format the browser understands
There are currently ~3 formats you may want to consider `avif`, `webp` and `jpg`. The improvements are huge [webp is ~30% and avif ~50%](https://www.ctrl.blog/entry/webp-avif-comparison.html) smaller then the original jpg.
## Adding a caption
If you want to describe your image in more detail you can add a caption
```md
![My Image](path/to/image.jpg 'My caption text')
```
will result in
```html
<figure>
<picture>
<!-- picture code the same as above -->
</picture>
<figcaption>My caption text</figcaption>
</figure>
```
## Adjusting options
Under the hood it is using [11ty/image](https://www.11ty.dev/docs/plugins/image/) and all it's options are available.
<inline-notification type="tip">
If you are using a layout preset like `@rocket/launch` then you probably don't want to touch/change these options as the preset will set it for you accordion to its layout needs.
The default preset for regular markdown content is available as `responsive`.
</inline-notification>
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
responsive: {
widths: [300, 820],
formats: ['avif', 'jpeg'],
sizes: '(min-width: 1024px) 820px, calc(100vw - 20px)',
},
},
});
```
<!-- prettier-ignore-end -->
## Ignoring Images
Files ending in `.svg` or that include `rocket-ignore.` will remain untouched.
For example
```md
![Logo stays svg](logo.svg)
![Ignore by file name](my-image.rocket-unresponsive.jpg)
![My Image Alternative Text](my-image.jpeg)
```
becomes
```html
<img src="logo.svg" alt="Logo stays svg" rocket-image="responsive" />
<img src="my-image.rocket-unresponsive.jpg" alt="Ignore by file name" rocket-image="responsive" />
<picture>[...] </picture>
```
### Adjusting ignore function
The default ignore function looks like this
```js
/**
* The default responsive ignore function will ignore files
* - ending in `.svg`
* - containing `rocket-unresponsive.`
*
* @param {object} opts
* @param {string} opts.src
* @param {string} opts.title
* @param {string} opts.alt
* @param {{name: string, value: string}[]} opts.attributes
* @returns {boolean}
*/
function ignore({ src }) {
return src.endsWith('svg') || src.includes('rocket-unresponsive.');
}
```
and you can adjust it by setting it via the `imagePreset`.
For this example we want to also ignore `.jpeg` files.
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
responsive: {
// ...
ignore: ({ src }) =>
src.endsWith('.jpeg') || src.endsWith('svg') || src.includes('rocket-unresponsive.'),
},
},
});
```
<!-- prettier-ignore-end -->
With that setting we get the following behavior
```md
![Logo stays svg](logo.svg)
![Ignore by file name](my-image.rocket-unresponsive.jpg)
![My Image Alternative Text](my-image.jpeg)
```
becomes
```html
<img src="logo.svg" alt="Logo stays svg" rocket-image="responsive" />
<img src="my-image.rocket-unresponsive.jpg" alt="Ignore by file name" rocket-image="responsive" />
<img src="my-image.jpeg" alt="My Image Alternative Text" rocket-image="responsive" />
```
## Defining your own presets
You can add your own image preset like so
<!-- prettier-ignore-start -->
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
'my-image-preset': {
widths: [30, 60],
formats: ['avif', 'jpeg'],
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.
```html
<img src="./path/to/image.jpg" alt="my alt" rocket-image="my-image-preset" />
```
## How does it work?
1. Each markdown image `![my image](path/to/image.jpg)` gets rendered as `<img src="path/to/image.jpg" alt="my image" rocket-image="responsive">`
2. We parse the html output and process every image which has `rocket-image`
3. Get the image preset settings from the name e.g. `rocket-image="my-image-preset"` reads `imagePreset['my-image-preset']`
4. Pass the settings onto `@11ty/image` to generate the image sizes and formats
5. With the metadata we render the html
## Default Formats
An [image file format](https://en.wikipedia.org/wiki/Image_file_formats) is a way of storing common image formats. Each format varies in capabilities like compression algorithm, availability, progressive rendering, encode and decode time, ...
Ultimately newer formats are usually smaller while retaining image quality which leads to faster websites.
By default, we generate `avif` and `jpg` because
- we only want to generate two versions to limit CI time and html size
- `avif` is significantly smaller than `webp`
- `avif` is available in
- Chrome since August 2020
- Firefox since June 2021
- `jpg` as a fallback for Edge, Safari, IE11
- `webp` would only help a small percentage of Edge & Safari on macOS 11 (Big Sur) users
This leads to the following situation:
- Chrome, Firefox gets the small `avif`
- Edge, Safari, IE11 gets the bigger `jpg`
To learn more about `avif` take a look at [AVIF has landed](https://jakearchibald.com/2020/avif-has-landed/).
If you want to add `webp` (or replace `avif` with it) you can do so by setting the formats
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
imagePresets: {
responsive: {
formats: ['avif', 'webp', 'jpeg'],
},
},
});
```
<!-- prettier-ignore-end -->
## Default widths
In order to understand the need for having a single image in multiple resolutions we need to understand the our website is served to many different environments and each may come with its own specific device pixel ratio (DPR). The device pixel ratio is the ratio between physical pixels and logical pixels. For instance, the Galaxy S20 report a device pixel ratio of 3, because the physical linear resolution is triple the logical linear resolution.
Physical resolution: 1440 x 3200
Logical resolution: 480 x 1067
And 1440 / 480 = 3.
By default, we generate the following widths `600`, `900` and `1640` because
- we only want to generate a small amount of widths to limit CI time and service worker cache size
- `600` is good for mobile with DRP 2
- `900` is good for mobile with DRP 3 and desktop with DPR of 1
- `1640` is good for desktop with DPR of 2
If you want to add more widths you can add them to `widths`.
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
/** @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">
As an end user in most cases you don't want to mess with this as a layout preset should set this for you. If you are building your own layout preset then be sure to set `widths` and `sizes` via `adjustImagePresets`
```js
export function myPreset() {
return {
adjustImagePresets: imagePresets => ({
...imagePresets,
responsive: {
...imagePresets.responsive,
widths: [600, 900, 1640],
sizes: '(min-width: 1024px) 820px, calc(100vw - 40px)',
},
}),
};
}
```
</inline-notification>
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```

View File

@@ -1,47 +1,53 @@
# Configuration >> Overview ||10 # Configuration >> Overview || 10
The configuration file is `rocket.config.js` or `rocket.config.mjs`. The configuration file is `rocket.config.js` or `rocket.config.mjs`.
The config files consists of the following parts: The config files consist of the following parts:
<!-- prettier-ignore-start -->
```js ```js
import { rocketLaunch } from '@rocket/launch'; import { rocketLaunch } from '@rocket/launch';
export default { /** @type {import('rocket/cli').RocketCliConfig} */
export default ({
presets: [rocketLaunch()], presets: [rocketLaunch()],
emptyOutputDir: true, emptyOutputDir: true,
pathPrefix: 'subfolder-only-for-build', pathPrefix: 'subfolder-only-for-build',
}; });
``` ```
<!-- prettier-ignore-end -->
Rocket is primarily build around plugins for each of it's systems. 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. New plugins can be added and all default plugins can be adjusted or even removed by using the following functions.
<!-- prettier-ignore-start -->
```js ```js
export default { /** @type {import('rocket/cli').RocketCliConfig} */
// add remark/unified plugin to the markdown processing (e.g. enable special code blocks) export default ({
// add remark/unified plugin to the Markdown processing (e.g. enable special code blocks)
setupUnifiedPlugins: [], 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) // 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: [], setupDevAndBuildPlugins: [],
// add a plugin to the web dev server (will not be wrapped) (e.g. esbuild for typescript) // add a plugin to the web dev server (will not be wrapped) (e.g. esbuild for TypeScript)
setupDevPlugins: [], setupDevPlugins: [],
// add a plugin to the rollup build (e.g. optimization steps) // add a plugin to the rollup build (e.g. optimization steps)
setupBuildPlugins: [], setupBuildPlugins: [],
// add a plugin to eleventy (e.g. a filter packs) // add a plugin to Eleventy (e.g. a filter packs)
setupEleventyPlugins: [], setupEleventyPlugins: [],
// add a computedConfig to eleventy (e.g. site wide default variables like socialMediaImage) // add a computedConfig to Eleventy (e.g. site wide default variables like socialMediaImage)
setupEleventyComputedConfig: [], setupEleventyComputedConfig: [],
// add a plugin to the cli (e.g. a new command like "rocket my-command") // add a plugin to the cli (e.g. a new command like "rocket my-command")
setupCliPlugins: [], setupCliPlugins: [],
}; });
``` ```
<!-- prettier-ignore-end -->
## Adding Rollup Plugins ## Adding Rollup Plugins
@@ -51,38 +57,110 @@ For some projects you might want to enable non-standard behaviors like importing
import data from './data.json'; 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. 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 `setupDevAndBuildPlugins`, which will automatically add the plugin for you to both Rollup and dev-server:
<!-- prettier-ignore-start -->
```js ```js
import json from '@rollup/plugin-json'; import json from '@rollup/plugin-json';
import { addPlugin } from 'plugins-manager'; import { addPlugin } from 'plugins-manager';
/** @type {Partial<import("@rocket/cli").RocketCliOptions>} */ /** @type {import('@rocket/cli').RocketCliOptions} */
const config = { export default ({
setupDevAndBuildPlugins: [ setupDevAndBuildPlugins: [
addPlugin({ name: 'json', plugin: json, location: 'top', options: { my: 'settings' } }), addPlugin({ name: 'json', plugin: json, location: 'top', options: { my: 'settings' } }),
], ],
}; });
export default config;
``` ```
<!-- prettier-ignore-end -->
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. 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.
For the Dev Server the plugins are automatically wrapped by `@web/dev-server-rollup`. Note that [not all rollup plugins](https://modern-web.dev/docs/dev-server/plugins/rollup/#compatibility-with-rollup-plugins) will work with the dev-server. For the Dev Server the plugins are automatically wrapped by `@web/dev-server-rollup`. Note that [not all Rollup plugins](https://modern-web.dev/docs/dev-server/plugins/rollup/#compatibility-with-rollup-plugins) will work with the dev-server.
## Modifying Options of Plugins ## Modifying Options of Plugins
All plugins which are either default or are added via a preset can still be adjusted by using `adjustPluginOptions`. All plugins which are either default or are added via a preset can still be adjusted by using `adjustPluginOptions`.
<!-- prettier-ignore-start -->
```js ```js
import { adjustPluginOptions } from 'plugins-manager'; import { adjustPluginOptions } from 'plugins-manager';
/** @type {Partial<import("@rocket/cli").RocketCliOptions>} */ /** @type {import('@rocket/cli').RocketCliOptions} */
const config = { export default ({
setupDevAndBuildPlugins: [adjustPluginOptions('json', { my: 'overwrite settings' })], setupDevAndBuildPlugins: [adjustPluginOptions('json', { my: 'overwrite settings' })],
}; });
export default config;
``` ```
<!-- prettier-ignore-end -->
## Lifecycle
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.
<!-- prettier-ignore-start -->
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
async before11ty() {
await copyDataFiles();
},
});
```
<!-- prettier-ignore-end -->
## Advanced
Sometimes you need even more control over specific settings.
### Rollup
For example if you wanna add an `acron` plugin to rollup
<!-- prettier-ignore-start -->
```js
import { importAssertions } from 'acorn-import-assertions';
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
rollup: config => ({
...config,
acornInjectPlugins: [importAssertions],
}),
});
```
<!-- prettier-ignore-end -->
### Eleventy
For example to add custom filter you can access the eleventy config directly
<!-- prettier-ignore-start -->
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
eleventy: eleventyConfig => {
eleventyConfig.addFilter('value', value => `prefix${value}`);
},
});
```
<!-- prettier-ignore-end -->
You even have access to the full rocketConfig if you for example want to create filters that behave differently during start/build.
<!-- prettier-ignore-start -->
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
eleventy: (config, rocketConfig) => {
config.addFilter('conditional-resolve', value => {
if (rocketConfig.command === 'build') {
return `build:${value}`;
}
if (rocketConfig.command === 'start') {
return `start:${value}`;
}
});
},
});
```
<!-- prettier-ignore-end -->

View File

@@ -0,0 +1,48 @@
# Configuration >> Service Worker ||30
Rocket does come with a default service worker that will
- cache already visited pages
- cache assets of visited pages (up to 100 files then it replaces older entries)
- reload the page if a newer html page version is available on service worker activation
## Adjusting the file name
Changing the service worker file name can be quite a hassle so you can adjust generate file name via a config.
👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
serviceWorkerName: 'my-service-worker-name.js',
});
```
<!-- prettier-ignore-end -->
## Meet the Service Worker
The default service worker will work for many scenarios however your needs my vary.
To enable different service worker strategies you can replace the default service worker code by providing a file at `_assets/service-worker.js`.
This file will be auto transformed and generated in the root of the website using the defined `serviceWorkerName`.
For inspiration, you can take a look at the default config.
[https://github.com/modernweb-dev/rocket/blob/main/packages/cli/preset/\_assets/service-worker.js](https://github.com/modernweb-dev/rocket/blob/main/packages/cli/preset/_assets/service-worker.js)
Be sure to check out [workbox](https://developers.google.com/web/tools/workbox) for more service worker magic.
And if you wanna have a 30 minutes crash course we highly recommend the talk [Service Workers For The Rest Of Us](https://vimeo.com/362260166) by [Philip Walton](https://twitter.com/philwalton).
## Registration
The registration happens via another file that you can also overwrite at `_assets/scripts/registerServiceWorker.js`.
Below you find the default implementation.
<!-- prettier-ignore-start -->
```js
{{ '/_assets/scripts/registerServiceWorker.js' | asset | toAbsPath | inlineFilePath; }}
```
<!-- prettier-ignore-end -->

View File

@@ -1,41 +0,0 @@
# Configuration >> setupEleventyComputedConfig ||20
If you want to add data that depends on other data then you can do it via [11ty'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` everyhwere. (a filter might be a better choise 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 everywhere {{ greeting }}.
{% endraw %}
And it will 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 },
];
```

View File

@@ -1,6 +1,6 @@
# Eleventy Plugins >> Markdown JavaScript (Mdjs) # Eleventy Plugins >> Markdown JavaScript (mdjs)
Use mdjs in your 11ty site. Use mdjs in your Eleventy site.
## Setup ## Setup
@@ -8,7 +8,7 @@ Use mdjs in your 11ty site.
npm install @rocket/eleventy-plugin-mdjs npm install @rocket/eleventy-plugin-mdjs
``` ```
Create an 11ty config file `.eleventy.js` Create an Eleventy config file `.eleventy.js`
```js ```js
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs'); const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
@@ -18,7 +18,7 @@ module.exports = function (eleventyConfig) {
}; };
``` ```
## Configure a unified or remark plugin with mdjs ## 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. By providing a `setupUnifiedPlugins` function as an option to `eleventy-plugin-mdjs` you can set options for all unified/remark plugins.
@@ -43,12 +43,12 @@ module.exports = function (eleventyConfig) {
}; };
``` ```
## Add a unified or remark plugin ## 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. 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. 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. Examples on how to insert a plugin right after creating the Markdown AST.
```js ```js
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs'); const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');

View File

@@ -7,6 +7,25 @@ eleventyNavigation:
Here you will find all the details for each of the packages/systems we offer. Here you will find all the details for each of the packages/systems we offer.
You should check out: ## Contents
- [@rocket/launch](./presets/launch.md) which is our default preset - [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,69 @@
class DemoElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.platform = 'the web';
this.language = 'en-US';
this.theme = 'light';
this.observer = new MutationObserver(this.updateData);
}
updateData = () => {
this.platform = document.documentElement.getAttribute('platform') || 'the web';
this.language = document.documentElement.getAttribute('data-lang') || 'en-US';
this.theme = document.documentElement.getAttribute('theme') || 'light';
this.requestUpdate();
};
connectedCallback() {
this.updateData();
this.observer.observe(document.documentElement, { attributes: true });
}
requestUpdate() {
this.shadowRoot.innerHTML = this.render();
}
render() {
return `
<style>
:host {
display: block;
background: var(--demo-background-color);
color: var(--demo-color);
padding: 10px;
}
:host[platform~="web"] {
border-bottom: 2px solid #333;
}
@media screen and (min-width: 640px) {
.about {
display: flex;
}
.about ul {
width: 50%;
}
}
</style>
<p>Hello I am DemoElement 👋</p>
<div class="about">
<ul>
<li>My purpose is to demonstrate how an element can adopt to different environments</li>
<li>I like <strong>${this.platform}</strong></li>
</ul>
<ul>
<li>My mother languages is <strong>${this.language}</strong></li>
<li>I feel very comfortable in the <strong>${this.theme}</strong></li>
</ul>
</div>
`;
}
}
customElements.define('demo-element', DemoElement);

View File

@@ -1,6 +1,12 @@
# Markdown JavaScript >> Overview || 10 # Markdown JavaScript >> Overview || 10
Markdown JavaScript (Mdjs) is a format that allows you to use JavaScript with Markdown, to create interactive demos. It does so by "annotating" JavaScript that should be executed in Markdown. ```js script
import '@mdjs/mdjs-story/define';
import '@mdjs/mdjs-preview/define';
import { html } from '@mdjs/mdjs-story';
```
Markdown JavaScript (mdjs) is a format that allows you to use JavaScript with Markdown, to create interactive demos. It does so by "annotating" JavaScript that should be executed in Markdown.
To annotate we use a code block with `js script`. To annotate we use a code block with `js script`.
@@ -13,9 +19,9 @@ To annotate we use a code block with `js script`.
## Web Components ## Web Components
One very good use case for that can be web components. One very good use case for that can be web components.
HTML already works in markdown so all you need is to load a web components definition file. HTML already works in Markdown so all you need is to load a web components definition file.
You could even do so within the same markdown file. You could even do so within the same Markdown file.
````md ````md
## This is my-card ## This is my-card
@@ -52,27 +58,18 @@ customElements.define('my-el', MyEl);
## Demo Support (Story) ## Demo Support (Story)
mdjs comes with some additional helpers you can choose to import via mdjs comes with some additional helpers you can choose to import:
````md ````md
```js script ```js script
import '@mdjs/mdjs-story/mdjs-story.js'; import '@mdjs/mdjs-story/define';
import '@mdjs/mdjs-preview/mdjs-preview.js'; import '@mdjs/mdjs-preview/define';
``` ```
```` ````
once loaded you can use them like so. Once loaded you can use them like so:
````md ### Story
```js script
import '@mdjs/mdjs-story/mdjs-story.js';
import '@mdjs/mdjs-preview/mdjs-preview.js';
```
````
once loaded you can use them like so.
### story
The code snippet will actually get executed at that place and you will have a live demo The code snippet will actually get executed at that place and you will have a live demo
@@ -88,7 +85,7 @@ export const JsStory = () => html` <demo-wc-card>JS Story</demo-wc-card> `;
``` ```
```` ````
#### full code support #### Full Code Support
````md ````md
```js story ```js story
@@ -101,7 +98,7 @@ export const JsStory = () => {
``` ```
```` ````
### preview story ### Preview Story
Will become a live demo wrapped in a container with a show code button. Will become a live demo wrapped in a container with a show code button.
@@ -119,12 +116,6 @@ export const JsPreviewStory = () => html` <demo-wc-card>JS Preview Story</demo-w
Here is a live example from [demo-wc-card](https://www.npmjs.com/package/demo-wc-card). Here is a live example from [demo-wc-card](https://www.npmjs.com/package/demo-wc-card).
```js script
import '@mdjs/mdjs-story/mdjs-story.js';
import '@mdjs/mdjs-preview/mdjs-preview.js';
import { html } from 'lit-html';
```
```js preview-story ```js preview-story
import 'demo-wc-card/demo-wc-card.js'; import 'demo-wc-card/demo-wc-card.js';
export const header = () => { export const header = () => {
@@ -132,42 +123,79 @@ 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 ## Supported Systems
### es-dev-server
Preview your mdjs readme with live demos and auto reload.
- Add to your `package.json`:
```json
"scripts": {
"start": "es-dev-server",
}
```
- Create a `es-dev-server.config.js` in the root of your repo.
```js
const { mdjsTransformer } = require('@mdjs/core');
module.exports = {
nodeResolve: true,
open: 'README.md',
watch: true,
responseTransformers: [mdjsTransformer],
};
```
### Storybook ### Storybook
Please check out [@open-wc/demoing-storybook](https://open-wc.org/demoing/) for a fully integrated setup. Please check out [@open-wc/demoing-storybook](https://open-wc.org/demoing/) for a fully integrated setup.
It includes [storybook-addon-markdown-docs](https://open-wc.org/demoing/storybook-addon-markdown-docs.html) which uses mdjs under the hood. It includes [storybook-addon-markdown-docs](https://open-wc.org/demoing/storybook-addon-markdown-docs.html) which uses mdjs under the hood.
### Chrome Extension (currently only for Github) ### Chrome Extension (currently only for GitHub)
See live demos directly inside github page, markdown files, issues, pull requests... See live demos directly inside GitHub pages, Markdown files, issues, pull requests...
Please check out [mdjs-viewer](https://github.com/open-wc/mdjs-viewer). Please check out [mdjs-viewer](https://github.com/open-wc/mdjs-viewer).
@@ -179,7 +207,7 @@ mdjs offers two more "basic" integrations
#### `mdjsDocPage` #### `mdjsDocPage`
Creates a full blown html page by passing in the markdown. Creates a full blown HTML page by passing in the Markdown.
```js ```js
const { mdjsDocPage } = require('@mdjs/core'); const { mdjsDocPage } = require('@mdjs/core');
@@ -197,7 +225,7 @@ const page = await mdjsDocPage(markdownString);
#### `mdjsProcess` #### `mdjsProcess`
Pass in multiple markdown documents and you get back all the jsCode and rendered html. Pass in multiple Markdown documents and you get back all the JavaScript code and rendered HTML.
```js ```js
const { mdjsProcess } = require('@mdjs/core'); const { mdjsProcess } = require('@mdjs/core');

View File

@@ -2,18 +2,230 @@
You can showcase live running code by annotating a code block with `js preview-story`. You can showcase live running code by annotating a code block with `js preview-story`.
````md ## Features
```js preview-story
import { html } from 'lit-html';
export const foo = () => html` <p>my html</p> `; - Shows components inside the page as they are
- You can enable “Simulation Mode” to break them out
- Simulation mode renders in an iframe to supporting media queries and isolated Simulation settings
- Simulation Settings
- Style (windows, mac, android, iOS)
- Size (small, medium, large, Galaxy S5, iPhone X, iPad …)
- Automatic Height
- Theme (light, dark)
- Language (en, nl, …)
- Settings are ”global” for all Simulators (e.g. changing one will change all)
- Settings can be remembered for other pages / return visits
```js script
import { html } from '@mdjs/mdjs-preview';
import './assets/demo-element.js';
```
## JavaScript Story
````md
```js script
import { html } from '@mdjs/mdjs-preview';
import './assets/demo-element.js';
```
```js preview-story
export const foo = () => html`<demo-element></demo-element>`;
``` ```
```` ````
will result in will result in
```js preview-story ```js preview-story
import { html } from 'lit-html'; export const foo = () => html` <demo-element></demo-element> `;
```
export const foo = () => html` <p>my html</p> `;
```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
```html preview-story
<demo-element></demo-element>
```
````
will result in
```html preview-story
<demo-element></demo-element>
```
## Setup Simulation Mode
For simulation mode we need a dedicated html file that will be used as an iframe target while loading stories.
The fastest way to create such a file is to use the `layout-simulator` layout.
Create a file `docs/simulator.md` with the following content.
```md
---
layout: layout-simulator
eleventyExcludeFromCollections: true
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
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
setupUnifiedPlugins: [
adjustPluginOptions('mdjsSetupCode', {
simulationSettings: { simulatorUrl: '/simulator/' },
}),
],
});
```
<!-- prettier-ignore-end -->
<inline-notification type="tip">
You can freely choose the path for the "simulator" by creating the md file in a different folder and adjusting the path in the config.
</inline-notification>
## Simulator states
To simulate these stats that usually come from the device itself we put those infos on the document tag.
We can simulate the following settings
1. `platform`
Adopting styles and behavior depending on which device platform you are.
```html
<html platform="web"></html>
<html platform="android"></html>
<html platform="ios"></html>
<!-- potentially later -->
<html platform="web-windows"></html>
<html platform="web-mac"></html>
```
2. `theme`
Adjust your styles based on a theme - light/dark are the default but you can add as many as you want.
```html
<html theme="light"></html>
<html theme="dark"></html>
```
3. `language`
Best to relay on `data-lang` as `lang` often gets changes by translations services which may interfere with your translation loading system.
```html
<html lang="en-US" data-lang="en-US"></html>
<html lang="de-DE" data-lang="de-DE"></html>
```
If you want to react to such document changes you can use an [MutationObserver](https://developer.mozilla.org/de/docs/Web/API/MutationObserver).
For a vanilla web component it could look something like this:
```js
class DemoElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.platform = 'the web';
this.language = 'en-US';
this.theme = 'light';
this.observer = new MutationObserver(this.updateData);
}
updateData = () => {
this.platform = document.documentElement.getAttribute('platform') || 'the web';
this.language = document.documentElement.getAttribute('data-lang') || 'en-US';
this.theme = document.documentElement.getAttribute('theme') || 'light';
this.requestUpdate();
};
connectedCallback() {
this.updateData();
this.observer.observe(document.documentElement, { attributes: true });
}
requestUpdate() {
this.shadowRoot.innerHTML = this.render();
}
render() {
return `
...
`;
}
}
customElements.define('demo-element', DemoElement);
```
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
``` ```

View File

@@ -2,10 +2,16 @@
You can showcase live running code by annotating a code block with `js story`. You can showcase live running code by annotating a code block with `js story`.
````md ```js script
```js story import { html } from '@mdjs/mdjs-story';
import { html } from 'lit-html'; ```
````md
```js script
import { html } from '@mdjs/mdjs-story';
```
```js story
export const foo = () => html` <p>my html</p> `; export const foo = () => html` <p>my html</p> `;
``` ```
```` ````
@@ -13,7 +19,5 @@ export const foo = () => html` <p>my html</p> `;
will result in will result in
```js story ```js story
import { html } from 'lit-html';
export const foo = () => html` <p>my html</p> `; export const foo = () => html` <p>my html</p> `;
``` ```

View File

@@ -1,21 +1,36 @@
# Presets >> Blog ||30 # Presets >> Blog || 40
Enable writing blog posts within your rocket site Enable writing blog posts within your Rocket site.
## Installation ## Installation
```bash <code-tabs collection="package-managers" default-tab="npm" align="end">
```bash tab npm
npm i @rocket/blog npm i @rocket/blog
``` ```
```bash tab yarn
yarn add @rocket/blog
```
```bash tab pnpm
pnpm add @rocket/blog
```
</code-tabs>
## Usage ## Usage
👉 `rocket.config.mjs` 👉 `rocket.config.js`
<!-- prettier-ignore-start -->
```js ```js
import { rocketBlog } from '@rocket/blog'; import { rocketBlog } from '@rocket/blog';
export default { /** @type {import('rocket/cli').RocketCliConfig} */
export default ({
presets: [rocketBlog()], presets: [rocketBlog()],
}; });
``` ```
<!-- prettier-ignore-end -->

View File

@@ -0,0 +1,102 @@
# Presets >> Joining Blocks || 10
The template system allows for a very granular control of how individual parts will be merged, overwritten or reorderd.
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 %}
{% endfor %}
</footer>
```
{% endraw %}
This will now render all templates within `_includes/_joiningBlocks/footer/*`.
## Adding content without overriding
Let's assume we have a preset with the following files
👉 `_includes/_joiningBlocks/footer/10-first.njk`
```html
<p>first</p>
```
👉 `_includes/_joiningBlocks/footer/20-second.njk`
```html
<p>second</p>
```
And it produces this in your website
```html
<footer>
<p>first</p>
<p>second</p>
</footer>
```
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
<p>in-between</p>
```
the final output will be
```html
<footer>
<p>first</p>
<p>in-between</p>
<p>second</p>
</footer>
```
## Overriding Content
Now if you want to overwrite you can use the same filename.
👉 `docs/_includes/_joiningBlocks/footer/10-first.njk`
```html
<p>updated first</p>
```
the final output will be
```html
<footer>
<p>updated first</p>
<p>second</p>
</footer>
```
## Reordering and Overriding
Sometimes you wanna reorder when you overwrite as well
👉 `docs/_includes/_joiningBlocks/footer/30-first.njk`
```html
<p>first</p>
```
the final output will be
```html
<footer>
<p>second</p>
<p>first</p>
</footer>
```
Note: Reordering always requires you to overwrite as well.

View File

@@ -1,119 +0,0 @@
# Presets >> Launch ||10
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

@@ -0,0 +1,7 @@
---
layout: layout-api
package: '@rocket/launch'
module: inline-notification/index.js
---
# Presets >> Launch >> Custom Elements || 20

View File

@@ -0,0 +1,3 @@
# Presets >> Launch || 20
- [Preset](./preset/)

View File

@@ -0,0 +1,145 @@
---
alerts:
- type: tip
content: Take a tip from me
- type: warning
content: Be *sure* about this...
- type: danger
content: You **really** shouldn't!
---
# Presets >> Launch >> Preset || 10
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`
<!-- prettier-ignore-start -->
```js
import { rocketLaunch } from '@rocket/launch';
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
presets: [rocketLaunch()],
});
```
<!-- prettier-ignore-end -->
## Data
The launch preset configures [11ty data](https://www.11ty.dev/docs/data/) using a few overridable files:
- `site.cjs`: Responsible for most of the site-wide config
- `rocketLaunch.json`: configures the homepage layout
- `footer.json`: Configures the content of the footer
## 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:
<!-- prettier-ignore-start -->
~~~markdown
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```
~~~
<!-- prettier-ignore-end -->
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>
<code-tabs id="inline-notifications" default-tab="tip">
{%for alert in alerts%}
<code-tab data-label="{{ alert.type }}" data-id="{{ alert.type }}" no-copy>
```md copy
<inline-notification type="{{ alert.type }}">
{{ alert.content | safe }}
</inline-notification>
```
<inline-notification type="{{ alert.type }}">
{{ alert.content | safe }}
</inline-notification>
</code-tab>
{%endfor%}
</code-tabs>
### Modify the Title
The notification title defautls 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

@@ -1,19 +0,0 @@
# Presets >> Search ||20
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

@@ -0,0 +1,9 @@
---
layout: layout-api
package: '@rocket/search'
modules:
- src/RocketSearch.js
- src/RocketSearchCombobox.js
---
# Presets >> Search >> Custom Elements || 20

View File

@@ -0,0 +1,3 @@
# Presets >> Search || 10
- [Preset](./preset/)

View File

@@ -0,0 +1,36 @@
# Presets >> Search >> Preset || 10
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`
<!-- prettier-ignore-start -->
```js
import { rocketSearch } from '@rocket/search';
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
presets: [rocketSearch()],
});
```
<!-- prettier-ignore-end -->

View File

@@ -1,6 +1,16 @@
# Tools >> Check Html Links ||30 # Tools >> Check HTML Links ||30
A fast checker for broken links/references in html. ```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```
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.
</inline-notification>
## Features ## Features
@@ -8,7 +18,7 @@ A fast checker for broken links/references in html.
- Focuses on the broken reference targets and groups references to it - Focuses on the broken reference targets and groups references to it
- Fast (can process 500-1000 documents in ~2-3 seconds) - Fast (can process 500-1000 documents in ~2-3 seconds)
- Has only 3 dependencies (and 19 in the full tree) - Has only 3 dependencies (and 19 in the full tree)
- Uses [sax-wasm](https://github.com/justinwilaby/sax-wasm) for parsing streamed html - Uses [sax-wasm](https://github.com/justinwilaby/sax-wasm) for parsing streamed HTML
## Installation ## Installation
@@ -16,17 +26,32 @@ A fast checker for broken links/references in html.
npm i -D check-html-links npm i -D check-html-links
``` ```
## Usage ## CLI flags
``` | Name | Type | Description |
| ------------------- | ------- | --------------------------------------------------------------------------------------------------- |
| root-dir | string | the root directory to serve files from. Defaults to the current working directory |
| ignore-link-pattern | string | do not check links matching the pattern |
| continue-on-error | boolean | if present it will not exit with an error code - useful while writing or for temporary passing a ci |
## Usage Examples
```bash
# check a folder _site
npx check-html-links _site npx check-html-links _site
# ignore all links like <a href="/users/123">
npx check-html-links _site --ignore-link-pattern "/users/*" "/users/**/*"
# ignore all links like <a href="/users/123"> & <a href="/users/123/details">
npx check-html-links _site --ignore-link-pattern "/users/*" "/users/**/*"
``` ```
## Example Output ## Example Output
![Test Run Screenshot](./images/check-html-links-screenshot.png) ![Test Run Screenshot](./images/check-html-links-screenshot.png)
## Comparision ## Comparison
Checking the output of [11ty-website](https://github.com/11ty/11ty-website) with 13 missing reference targets (used by 516 links) while checking 501 files. (on January 17, 2021) Checking the output of [11ty-website](https://github.com/11ty/11ty-website) with 13 missing reference targets (used by 516 links) while checking 501 files. (on January 17, 2021)

View File

@@ -3,16 +3,125 @@
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). 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. 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 ## Problem
Many plugin systems require you to either execute a plugin function like in `rollup`. Many plugin systems require you to either execute a plugin function like in `rollup`.
<!-- prettier-ignore-start -->
```js ```js
import json from '@rollup/plugin-json'; import json from '@rollup/plugin-json';
export default {
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
plugins: [json({ preferConst: true })], plugins: [json({ preferConst: true })],
}; });
``` ```
<!-- prettier-ignore-end -->
or add it in a special way like in `eleventy` or add it in a special way like in `eleventy`
@@ -34,7 +143,7 @@ var processor = unified().use(markdown).use(toc, { maxDepth: 2 });
// ... // ...
``` ```
## Problem statement ## 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. > 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.
@@ -42,20 +151,16 @@ This means if you wish to define default plugins and allow your user to override
## Solution ## Solution
The plugins manager let's you orchestrate a set of "meta plugins" which are defined by The plugins manager lets you orchestrate a set of "meta plugins" which are defined by
- name - plugin (class or function)
- plugin - it's options
- options
```js ```js
import beep from '@rollup/plugin-beep'; import beep from '@rollup/plugin-beep';
import url from '@rollup/plugin-url'; import url from '@rollup/plugin-url';
let metaPlugins = [ let metaPlugins = [{ plugin: beep }, { plugin: url, options: { limit: 10000 } }];
{ name: 'beep', plugin: beep },
{ name: 'url', plugin: url, options: { limit: 10000 } },
];
``` ```
This array can be modified by adding/removing or adjusting options. This array can be modified by adding/removing or adjusting options.
@@ -90,16 +195,13 @@ export default {
### Adding Helpers ### 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. 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 ```js
import { addPlugin, adjustPluginOptions } from 'plugins-manager'; import { addPlugin, adjustPluginOptions } from 'plugins-manager';
const systemSetupFunctions = [ const systemSetupFunctions = [addPlugin(first), addPlugin(second)];
addPlugin({ name: 'first', plugin: first }), const userSetupFunctions = [adjustPluginOptions(first, { my: 'options' })];
addPlugin({ name: 'second', plugin: second }),
];
const userSetupFunctions = [adjustPluginOptions('first', { my: 'options' })];
``` ```
Arrays of functions can by merged like so Arrays of functions can by merged like so
@@ -111,9 +213,9 @@ const finalSetupFunctions = [...systemSetupFunctions, ...userSetupFunctions];
and then converted to the final output. and then converted to the final output.
```js ```js
import { metaPluginsToRollupPlugins } from 'plugins-manager'; import { applyPlugins } from 'plugins-manager';
const plugins = metaPluginsToRollupPlugins(finalSetupFunctions, metaPlugins); const plugins = applyPlugins(finalSetupFunctions, metaPlugins);
``` ```
## Adding a Plugin ## Adding a Plugin
@@ -129,18 +231,27 @@ By default it adds at the bottom.
import json from '@rollup/plugin-json'; import json from '@rollup/plugin-json';
import { addPlugin } from 'plugins-manager'; import { addPlugin } from 'plugins-manager';
const userSetupFunctions = [ const userSetupFunctions = [addPlugin(json, { preferConst: true })];
addPlugin({ name: 'json', plugin: json, options: { preferConst: true } }),
];
``` ```
Example usage: Example usage:
```js ```js
addPlugin({ name: 'json', plugin: json }); // Add at the bottom (default) addPlugin(json); // Add at the bottom (default)
addPlugin({ name: 'json', plugin: json, location: 'top' }); // Add at the top/beginning of the array addPlugin(json, {}, { location: 'top' }); // Add at the top/beginning of the array
addPlugin({ name: 'json', plugin: json, location: 'beep' }); // Add after (default) plugin 'beep' addPlugin(json, {}, { location: beep }); // Add after (default) plugin 'beep'
addPlugin({ name: 'json', plugin: json, location: 'beep', how: 'before' }); // Add before 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 Plugin Options
@@ -150,12 +261,14 @@ Adjusting options means to either
- flatly merge objects (e.g. only the first level will be preserved) - flatly merge objects (e.g. only the first level will be preserved)
- calling a function to do the merge yourself - calling a function to do the merge yourself
- setting the raw value (if not an object or function) - 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 ```js
import json from '@rollup/plugin-json';
import { adjustPluginOptions } from 'plugins-manager'; import { adjustPluginOptions } from 'plugins-manager';
const userSetupFunctions = [ const userSetupFunctions = [
adjustPluginOptions('json', { preferConst: false, anotherOption: 'format' }), adjustPluginOptions(json, { preferConst: false, anotherOption: 'format' }),
]; ];
``` ```
@@ -163,37 +276,54 @@ Example usage:
```js ```js
// given // given
addPlugin({ addPlugin(json, {
name: 'json', other: {
plugin: json, nested: 'other.nested',
options: { nested2: 'other.nested2',
other: {
nested: 'other.nested',
nested2: 'other.nested2',
},
main: true,
}, },
main: true,
}); });
// merge objects flately // merge objects flately
adjustPluginOptions('json', { other: { nested: '--overwritten--' } }); adjustPluginOptions(json, { other: { nested: '--overwritten--' } });
// resulting options = { other: { nested: '--overwritten--' }, main: true } // resulting options = { other: { nested: '--overwritten--' }, main: true }
// NOTE: nested2 is removed // NOTE: nested2 is removed
// merge via function // merge via function
adjustPluginOptions('json', config => ({ other: { ...config.other, nested: '--overwritten--' } })); adjustPluginOptions(json, config => ({ other: { ...config.other, nested: '--overwritten--' } }));
// resulting options = { other: { nested: '--overwritten--', nested2: 'other.nested2' }, main: true } // resulting options = { other: { nested: '--overwritten--', nested2: 'other.nested2' }, main: true }
// merge via function to override full options // merge via function to override full options
adjustPluginOptions('json', config => ({ only: 'this' })); adjustPluginOptions(json, config => ({ only: 'this' }));
// resulting options = { only: 'this' } // resulting options = { only: 'this' }
// setting a raw value // setting a raw value
adjustPluginOptions('json', false); adjustPluginOptions(json, false);
// resulting options = false // resulting options = false
``` ```
## Converting metaPlugins to an actual plugin 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 To execute all setup function you can use this little helper
@@ -223,25 +353,9 @@ Rollup has a more specific helper that handles
Note: if you provide `config.plugins` then it will return that directly ignoring `setupPlugins` Note: if you provide `config.plugins` then it will return that directly ignoring `setupPlugins`
```js ```js
import { metaConfigToRollupConfig } from 'plugins-manager'; import { applyPlugins } from 'plugins-manager';
const finalConfig = metaConfigToRollupConfig(currentConfig, defaultMetaPlugins); const finalConfig = applyPlugins(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 Eleventy

View File

@@ -1,15 +1,14 @@
# Tools >> Rollup Config ||20 # Tools >> Rollup Config ||20
Rollup configuration to help you get started building modern web applications. 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. You write modern JavaScript using the latest browser features. Rollup will optimize your code for production and ensure it runs on all supported browsers.
## Features ## Features
- Set HTML or JS as input and/or output - Set HTML or JavaScript as input and/or output
- Optimized for browsers which support modules - Optimized for browsers which support modules
- Loads polyfills using feature detection - Loads polyfills using feature detection
- Generates a service worker - Minifies JavaScript
- Minifies JS
- Minifies lit-html templates - Minifies lit-html templates
## Setup ## Setup
@@ -25,7 +24,7 @@ You write modern javascript using the latest browser-features, rollup will optim
```js ```js
import { createSpaConfig } from '@rocket/building-rollup'; import { createSpaConfig } from '@rocket/building-rollup';
// use `import { createBasicConfig }` to do regular JS to JS bundling // use `import { createBasicConfig }` to do regular JS to JS bundling
// use `import { createMpaConfig }` to bundle multiple html files // use `import { createMpaConfig }` to bundle multiple HTML files
export default createSpaConfig({ export default createSpaConfig({
input: 'index.html', input: 'index.html',
@@ -54,7 +53,7 @@ Our config sets you up with good defaults for most projects. Additionally you ca
We use the [plugins-manager](./plugins-manager.md) for it. We use the [plugins-manager](./plugins-manager.md) for it.
### Customizing the babel config ### Customizing the Babel Config
You can define custom babel plugins to be loaded by adding a `.babelrc` or `babel.config.js` to your project. See [babeljs config](https://babeljs.io/docs/en/configuration) for more information. You can define custom babel plugins to be loaded by adding a `.babelrc` or `babel.config.js` to your project. See [babeljs config](https://babeljs.io/docs/en/configuration) for more information.
@@ -66,9 +65,9 @@ For example to add support for class properties:
} }
``` ```
### Customizing default plugins ### Customizing Default Plugins
Our config creators install a number of rollup plugins by default: Our config creators install a number of Rollup plugins by default:
Basic, SPA and MPA plugins: Basic, SPA and MPA plugins:

View File

@@ -16,23 +16,23 @@ export default /** @type {Partial<import('@rocket/cli').RocketCliOptions>} */ ({
}); });
``` ```
The Plugins Manager helps you register and execute your plugins across the various Rocket components - rollup, dev-server, eleventy, and markdown. It replaces the specific registration/execution call in a given plugin system by an intent to use that plugin. The Plugins Manager helps you register and execute your plugins across the various Rocket components - Rollup, Web Dev Server, Eleventy, and Markdown. It replaces the specific registration/execution call in a given plugin system by an intent to use that plugin.
## Adding Remark/Unified Plugins ## 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 ```js
import emoji from 'remark-emoji'; import emoji from 'remark-emoji';
import { addPlugin } from 'plugins-manager'; import { addPlugin } from 'plugins-manager';
/** @type {Partial<import('@rocket/cli').RocketCliOptions>} */ /** @type {Partial<import('@rocket/cli').RocketCliOptions>} */
const config = { export default ({
setupUnifiedPlugins: [addPlugin({ location: 'markdown', name: 'emoji', plugin: emoji })], 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> 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})`. While for the rehype AST you should use `addPlugin({ location: 'remark2rehype', name: 'my-plugin', plugin: MyPlugin})`.

View File

@@ -8,9 +8,9 @@ It can help to examine each new page and menu carefully, to come to terms with t
</inline-notification> </inline-notification>
## Add a section ## Add a Section
In most cases you will have multiple sections in your website and each of those sections will come with it's own sidebar navigation. 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.md`.
@@ -38,7 +38,7 @@ Don't worry if this isn't how you would have styled or placed your menu bar or s
It might be more practical to stay below 5 sections. It might be more practical to stay below 5 sections.
## Adding a category ## Adding a Category
Often each section will have multiple categories. Often each section will have multiple categories.
@@ -54,7 +54,7 @@ mkdir docs/guides/first-pages/
# First Pages # First Pages
``` ```
## Adding a page to a category ## Adding a Page to a Category
👉 `docs/guides/first-pages/getting-started.md` 👉 `docs/guides/first-pages/getting-started.md`
@@ -64,14 +64,14 @@ mkdir docs/guides/first-pages/
This is how you get started. This is how you get started.
``` ```
## Headings as anchor and menu items ## Headings as Anchor and Menu Items
_**Within**_ any page, you can still add links to your navigation! _**Within**_ any page, you can still add links to your navigation!
Note that md text prefixed with one or two # signs also becomes and anchor in the page and a link in the sidebar navigation when the page is open. Note that Markdown text prefixed with one or two # signs also becomes an anchor in the page and a link in the sidebar navigation when the page is open.
```md ```md
## Headings as anchor and menu items ## Headings as Anchor and Menu Items
_**Within**_ any page, you can still add links to your navigation! _**Within**_ any page, you can still add links to your navigation!
``` ```
@@ -80,6 +80,6 @@ _**Within**_ any page, you can still add links to your navigation!
import '@rocket/launch/inline-notification/inline-notification.js'; import '@rocket/launch/inline-notification/inline-notification.js';
``` ```
## Example as a reference ## Example as a Reference
If implicit navigation, derived from content, is a bit too much to grasp in one sitting, feel free to examine the **docs** folder in [the rocket codebase behind the pages you are reading](https://github.com/modernweb-dev/rocket) for more examples. If implicit navigation, derived from content, is a bit too much to grasp in one sitting, feel free to examine the **docs** folder in [the rocket codebase behind the pages you are reading](https://github.com/modernweb-dev/rocket) for more examples.

View File

@@ -1,6 +1,6 @@
# First Pages >> Getting Started ||10 # First Pages >> Getting Started ||10
Rocket is has the following prerequisits: Rocket has the following prerequisites:
- [Node 14+](https://nodejs.org/en/) - [Node 14+](https://nodejs.org/en/)
@@ -10,94 +10,160 @@ Make sure they are installed before proceeding.
The fastest way to get started is by using an existing preset like the launch preset. The fastest way to get started is by using an existing preset like the launch preset.
1. Start with an empty new folder ### Step 1. Initialize the Project Package
``` Start by creating an empty folder for your project
mkdir my-project
cd my-project
npm init -y
```
2. Install dependencies ```bash copy
mkdir my-project
``` cd my-project
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 it's 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 pathes 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. 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:
- `.gitignore` containing rocket's build artifacts
- `rocket.config.js` containing a minimal rocket config
- `docs/.eleventyignore` required to allow you to [override templates](/guides/presets/overriding/)
- `docs/index.md` your first page
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">
<!-- prettier-ignore-start -->
```js tab rocket.config.js
import { rocketLaunch } from '@rocket/launch';
/** @type {import('rocket/cli').RocketCliConfig} */
export default ({
presets: [rocketLaunch()],
});
```
<!-- prettier-ignore-end -->
```md tab docs/index.md
# Welcome to Your Rocket Site
Add your markdown content here.
```
<!-- prettier-ignore-start -->
```html tab docs/.eleventyignore
_assets
_includes
_data
```
```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/
```
<!-- prettier-ignore-end -->
</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. 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.
## Start up: ## Startup
👉 `package.json`
Add `"start": "rocket start"` to your package.json
```json
"scripts": {
"start": "rocket start"
}
```
Now you can launch your site locally with Now you can launch your site locally with
```bash <code-tabs collection="package-managers" default-tab="npm" align="end">
npm run start
```bash tab npm
npm start
``` ```
```bash tab yarn
yarn start
```
```bash tab pnpm
pnpx start
```
</code-tabs>
## Taking Inventory Before Adding Pages: ## Taking Inventory Before Adding Pages:
We're about to add both content and navigation at the same time. We're about to add both content and navigation at the same time.
@@ -107,11 +173,16 @@ It can be helpful to take an inventory, before we start, to separate basic setup
- We built the project with basic npm commands - We built the project with basic npm commands
- Added a couple required files manually - Added a couple required files manually
- Adjusted package.json - Adjusted package.json
- **doc/index.md** to seed the content - **docs/index.md** to seed the content
- Launches with `npm start` - 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. 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.
## Next Steps
- [Adding Pages](../adding-pages/)
- [Using Presets](../../presets/getting-started/)
```js script ```js script
import '@rocket/launch/inline-notification/inline-notification.js'; import '@rocket/launch/inline-notification/inline-notification.js';
``` ```

View File

@@ -0,0 +1,29 @@
# 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,6 +1,6 @@
# First Pages >> Linking ||20 # First Pages >> Linking ||20
Standard markdown applies and you can link via Standard Markdown applies. You can link like this:
```md ```md
[visible label](./path/to/other-file.md) [visible label](./path/to/other-file.md)

View File

@@ -1,4 +1,4 @@
# First Pages >> Managing sidebar ||30 # First Pages >> Managing sidebar || 30
The sidebar will show all the content of the current section. The sidebar will show all the content of the current section.
@@ -21,7 +21,7 @@ Will be ordered as `First`, `Second`,
## How it works ## How it works
Internally `# Foo >> Bar >> Baz ||20` get's converted to. Internally `# Foo >> Bar >> Baz ||20` gets converted to.
``` ```
--- ---
@@ -33,10 +33,11 @@ eleventyNavigation:
--- ---
``` ```
<!--
You can also look at this live playground: You can also look at this live playground:
```js story ```js story
import { html } from 'lit-html'; import { html } from '@mdjs/mdjs-preview';
export const headlineConverter = () => html` export const headlineConverter = () => html`
<p> <p>
@@ -45,5 +46,12 @@ export const headlineConverter = () => html`
</p> </p>
`; `;
``` ```
-->
How it then works is very similar to https://www.11ty.dev/docs/plugins/navigation/ 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 +1,5 @@
# First Pages >> Urls ||100 # First Pages >> URLs ||50
Urls will be represented by the folder structure... URLs will be represented by the folder structure.
You can use a frontmatter with permalink to override You can use front matter with a [permalink](https://www.11ty.dev/docs/permalinks/) to override.

View File

@@ -1,25 +1,49 @@
# First Pages >> Use JavaScript ||40 # First Pages >> Use JavaScript || 40
You can use `js script` to execute javascript (type = module) 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.
```` <!-- prettier-ignore-start -->
~~~markdown
```js script ```js script
console.log('foo'); const message = 'Hello, World!';
console.log(message);
``` ```
```` ~~~
<!-- prettier-ignore-end -->
This can be useful for importing web components and using them in markdown 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:
<!-- prettier-ignore-start -->
~~~markdown
```js script ```js script
import 'magic-reveal/magic-reveal.js'; import 'magic-reveal/magic-reveal.js';
```
<magic-reveal> <magic-reveal>
This text will get magically revealed. I can **still** use markdown as long as between the opening/closing tag there is an empty line. 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> </magic-reveal>
``` ~~~
```` <!-- prettier-ignore-end -->
or you can use `js story`, `js preview-story`, ... ## 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`.
<!-- prettier-ignore-start -->
~~~markdown
```js story
import { html } from '@mdjs/mdjs-preview';
export const StoryPreview = () => html`
<p>Use stories in Rocket!</p>
`;
```
~~~
<!-- prettier-ignore-end -->

View File

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

View File

@@ -1,51 +1,54 @@
# Go Live >> Overview ||10 # Go Live >> Overview || 10
A few things are usually needed before going live "for real". A few things are usually needed before going live "for real".
## Add a not found page ## Add a Not Found Page
When a user enters a url that does not exists then a "famous" 404 page not found error occures. When a user enters a URL that does not exist, a "famous" 404 Page Not Found error occurs.
Many servers are configured to handle this automatically and to serve a 404.html page instead. Many servers are configured to handle this automatically and to serve a 404.html page instead.
The [Rocket Lauch Preset](../../docs/presets/launch.md) ships a default 404 template you can use. The [Rocket Launch preset](../../docs/presets/launch.md) ships a default 404 template you can use.
To enable it you need to creating 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` 👉 `docs/404.md`
``` ```markdown copy
--- ---
layout: 404.njk layout: layout-404
permalink: 404.html permalink: 404.html
--- ---
``` ```
## Add a sitemap 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. A sitemap can be used to inform search engines or services about the pages your site has.
You can create one by adding this file You can create one by adding this file:
👉 `docs/sitemap.njk` 👉 `docs/sitemap.njk`
{% raw %} ```markdown copy
```
--- ---
layout: pure-content.njk layout: layout-raw
permalink: /sitemap.xml permalink: /sitemap.xml
eleventyExcludeFromCollections: true eleventyExcludeFromCollections: true
--- ---
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <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> <url>
<loc>{{ rocketConfig.absoluteBaseUrl }}{{ page.url | url }}</loc> <loc>{{ rocketConfig.absoluteBaseUrl }}{{ page.url | url }}</loc>
<lastmod>{{ page.date.toISOString() }}</lastmod> <lastmod>{{ page.date.toISOString() }}</lastmod>
<changefreq>{{ page.data.changeFreq if page.data.changeFreq else "monthly" }}</changefreq> <changefreq>{{ page.data.changeFreq if page.data.changeFreq else "monthly" }}</changefreq>
</url> </url>
{% endfor %} {%- endif -%}
{% endfor %}{% endraw %}
</urlset> </urlset>
``` ```
{% endraw %}

View File

@@ -1,27 +1,27 @@
# Go Live >> Social Media ||20 # Go Live >> Social Media || 20
Having a nice preview image for social media can be very helpful. 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. 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 It will look like this but with your logo:
<img src="{{ socialMediaImage }}" width="1200" height="630" alt="Social Media Image of this page" style="border: 1px solid #000" /> <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. 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. 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.
## Setting it via frontMatter ## Setting it via Front Matter
You can create your own image and link it with something like this You can create your own image and link it with something like this
``` ```markdown copy
--- ---
socialMediaImage: path/to/my/image.png socialMediaImage: path/to/my/image.png
--- ---
``` ```
## Providing your own text ## Providing Your Own Text
Sometimes extracting the title + title of parent is not enough but you still want to use the "default image". Sometimes extracting the title + title of parent is not enough but you still want to use the "default image".
@@ -29,7 +29,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. In there you can use the default `createSocialImage` but provide your own values.
```js ```js copy
const { createSocialImage } = require('@rocket/cli'); const { createSocialImage } = require('@rocket/cli');
module.exports = async function () { module.exports = async function () {
@@ -39,7 +39,7 @@ module.exports = async function () {
subTitle2: 'in 5 Minutes', subTitle2: 'in 5 Minutes',
footer: 'Rocket Guides', footer: 'Rocket Guides',
// you can also override the svg only for this page by providing // you can also override the svg only for this page by providing
// createSocialImageSvg: async () => '<svg>...</svg>' // createSocialImageSvg: async () => '{%raw%}<svg>...</svg>{%endraw%}'
}); });
return { return {
socialMediaImage, socialMediaImage,
@@ -47,18 +47,19 @@ module.exports = async function () {
}; };
``` ```
## Override the default image ## Override the Default Image
Often you want to have a unique style for your social media images. 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. 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'; import { adjustPluginOptions } from 'plugins-manager';
/** @type {Partial<import("@rocket/cli").RocketCliOptions>} */ /** @type {import('@rocket/cli').RocketCliOptions} */
const config = { export default ({
setupEleventyComputedConfig: [ setupEleventyComputedConfig: [
adjustPluginOptions('socialMediaImage', { adjustPluginOptions('socialMediaImage', {
createSocialImageSvg: async ({ createSocialImageSvg: async ({
@@ -69,22 +70,24 @@ const config = {
logo = '', logo = '',
}) => { }) => {
let svgStr = ` let svgStr = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" style="fill: #ecedef;">
<defs></defs> <defs/>
<rect width="100%" height="100%" fill="#ddd" /> <rect width="100%" height="100%" fill="#38393e"/>
<circle cx="1000" cy="230" r="530" fill="#efefef"></circle> <g transform="matrix(0.45, 0, 0, 0.45, 300, 60)">${logo}</g>
<rect width="100%" height="100%" style="fill:none; stroke-width:20; stroke:red;" /> <g style="
<g transform="matrix(0.6, 0, 0, 0.6, 580, 100)">${logo}</g> font-size: 70px;
<text x="70" y="200" font-family="'Bitstream Vera Sans','Helvetica',sans-serif" font-weight="700" font-size="80"> text-anchor: middle;
${title} font-family: 'Bitstream Vera Sans','Helvetica',sans-serif;
</text> font-weight: 700;
<text x="70" y="320" font-family="'Bitstream Vera Sans','Helvetica',sans-serif" font-weight="700" font-size="60"> ">
${subTitle} <text x="50%" y="470">
</text> ${title}
<text x="70" y="420" font-family="'Bitstream Vera Sans','Helvetica',sans-serif" font-weight="700" font-size="60"> </text>
${subTitle2} <text x="50%" y="520" style="font-size: 30px;">
</text> ${subTitle}
<text x="70" y="560" fill="gray" font-size="40"> </text>
</g>
<text x="10" y="620" style="font-size: 30px; fill: gray;">
${footer} ${footer}
</text> </text>
</svg> </svg>
@@ -93,37 +96,69 @@ const config = {
}, },
}), }),
], ],
}; });
export default config;
``` ```
<!-- prettier-ignore-end -->
## Using an svg file as a src with nunjucks ## 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 using a template system 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` ```js tab rocket.config.js
{% raw %}
```js
import { adjustPluginOptions } from 'plugins-manager'; import { adjustPluginOptions } from 'plugins-manager';
/** @type {Partial<import("@rocket/cli").RocketCliOptions>} */ /** @type {import('@rocket/cli').RocketCliOptions} */
const config = { export default ({
setupEleventyComputedConfig: [ setupEleventyComputedConfig: [
adjustPluginOptions('socialMediaImage', { adjustPluginOptions('socialMediaImage', {
createSocialImageSvg: async (args = {}) => { createSocialImageSvg: async (args = {}) => {
// inside of the svg you can use {{ title }} const svgBuffer = await fs.promises.readFile('/path/to/your/template.svg');
const svgBuffer = await fs.promises.readFile('/path/to/your/svg/file');
const svg = logoBuffer.toString(); const svg = logoBuffer.toString();
return nunjucks.renderString(svg, args); 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
<!-- 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
<!-- prettier-ignore-start -->
```js copy
export default ({
createSocialMediaImages: true,
});
```
<!-- prettier-ignore-end -->

View File

@@ -5,4 +5,19 @@ eleventyNavigation:
order: 10 order: 10
--- ---
Rocket is a fundamentally straight forward way to generate static pages while still allowing to sprinkle in some JavaScript where needed. 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,106 +0,0 @@
# Presets >> Create your own || 90
A preset is 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

@@ -0,0 +1,54 @@
# Presets >> Create your Own >> Getting Started || 10
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 copy
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 we could override the full `layout.css` by adding it like so
👉 `fire-theme/layout.css`
```css copy
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`
<!-- prettier-ignore-start -->
```js copy
import { rocketLaunch } from '@rocket/launch';
import { fireTheme } from 'path/to/fire-theme/fireTheme.js';
/** @type {import('@rocket/cli').RocketCliOptions} */
export default ({
presets: [rocketLaunch(), fireTheme()],
});
```
<!-- prettier-ignore-end -->

View File

@@ -0,0 +1,22 @@
# Presets >> Create your Own >> Hooks || 20
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.
<!-- prettier-ignore-start -->
```js
/** @type {import('@rocket/cli').RocketPreset} */
export default ({
async before11ty() {
await copyDataFiles();
},
});
```
<!-- prettier-ignore-end -->
## Preset Interface
The full preset interface is copied below for your reference.
```ts
{% include ../../../../packages/cli/types/preset.d.ts %}
```

View File

@@ -0,0 +1,7 @@
# Presets >> Create your Own || 40
## Contents
- [Getting Started](./getting-started/)
- [Hooks](./hooks/)
- [Publishing your Preset](./publishing/)

View File

@@ -0,0 +1,60 @@
# Presets >> Create your Own >> Publishing || 100
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
- use the convention `rocket-preset-${name}`
- for this example we use `rocket-preset-fire-theme`.
2. Create a new folder `fire-theme`
3. Create a folder `fire-theme/preset` copy `fireTheme.js` from [above](../getting-started/) into `preset/fireTheme.js`
4. Add a 👉 `package.json`
```json copy
{
"name": "rocket-preset-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 copy
export { fireTheme } from './preset/fireTheme.js';
```
<!-- prettier-ignore-start -->
6. Add a 👉 `README.md`
~~~markdown copy
# 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';
/** @type {import('@rocket/cli').RocketCliOptions} */
export default ({
presets: [rocketLaunch(), fireTheme()],
});
```
~~~
<!-- prettier-ignore-end -->

View File

@@ -1,7 +1,36 @@
# Presets >> Getting Started ||10 # Presets >> Getting Started || 10
Presets are ... 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... You can use a preset via the config by adding it to the `presets` array
You can load multiple presets. <!-- 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

@@ -1 +1,6 @@
# Presets || 20 # Presets || 20
- [Getting Started](./getting-started/)
- [Overriding](./overriding/)
- [Using Templates](./using-templates/)
- [Create Your Own](./create-your-own/getting-started/)

View File

@@ -4,4 +4,23 @@ 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`. 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` ... 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

@@ -1,3 +1,71 @@
# Presets >> Using templates ||30 # Presets >> Using templates ||30
Most presetse have specific entry files you can override... 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`
<inline-notification type="tip">
File names without an order/number in front are considered with the order number `10 000` so the generally end up at the bottom. If you need something even below unordered items you can use numbers that are greater then `10 000`.
_Note: For unordered files there is no guarantee of any order._
</inline-notification>
## 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)
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
```

View File

@@ -1,6 +1,6 @@
--- ---
title: Rocket title: Rocket
layout: home.njk layout: layout-home-background
slogan: The modern web setup for static sites with a sprinkle of JavaScript. slogan: The modern web setup for static sites with a sprinkle of JavaScript.
callToActionItems: callToActionItems:
- text: Follow Guides - text: Follow Guides
@@ -12,11 +12,11 @@ reasons:
- header: Small - header: Small
text: No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed. text: No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed.
- header: Pre-Rendered - header: Pre-Rendered
text: Statically generated content means less javascript to ship and process. text: Statically generated content means less JavaScript to ship and process.
- header: Zero Configuration - header: Zero Configuration
text: Automatic code splitting, filesystem based routing, and javascript in markdown. text: Automatic code splitting, filesystem based routing, and JavaScript in Markdown.
- header: Meta Framework - 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>.' 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 - header: Powerful Default Template
text: Provide content and you are ready to go. text: Provide content and you are ready to go.
- header: Ready for Production - header: Ready for Production

5
docs/simulator.md Normal file
View File

@@ -0,0 +1,5 @@
---
layout: layout-simulator
eleventyExcludeFromCollections: true
excludeFromSearch: true
---

View File

@@ -1,5 +1,5 @@
--- ---
layout: pure-content.njk layout: layout-raw
permalink: /sitemap.xml permalink: /sitemap.xml
eleventyExcludeFromCollections: true eleventyExcludeFromCollections: true
--- ---

4
netlify.toml Normal file
View File

@@ -0,0 +1,4 @@
[[headers]]
for = "/*"
[headers.values]
Content-Security-Policy = "default-src 'self'; script-src 'self' www.googletagmanager.com 'sha256-W6Gq+BvrdAAMbF8E7WHA7UPQxuUOfJM8E9mpKD0oihA=' 'sha256-vFU+IJ5dUUukI5Varwy49dN2d89DmFj7UNewqQv88sw='; style-src 'self' 'unsafe-inline' fonts.googleapis.com; font-src 'self' data: fonts.gstatic.com;"

View File

@@ -8,16 +8,18 @@
}, },
"type": "module", "type": "module",
"scripts": { "scripts": {
"analyze": "run-s analyze:* format:*",
"analyze:analyze": "node scripts/workspaces-scripts-bin.mjs analyze",
"build": "npm run build:packages && npm run build:site", "build": "npm run build:packages && npm run build:site",
"build:packages": "node scripts/workspaces-scripts-bin.mjs build:package", "build:packages": "node scripts/workspaces-scripts-bin.mjs build:package",
"build:site": "npm run rocket:build", "build:site": "run-s analyze:* rocket:build",
"changeset": "changeset", "changeset": "changeset",
"debug": "web-test-runner --watch --config web-test-runner-chrome.config.mjs", "debug": "web-test-runner --watch --config web-test-runner-chrome.config.mjs",
"debug:firefox": "web-test-runner --watch --config web-test-runner-firefox.config.mjs", "debug:firefox": "web-test-runner --watch --config web-test-runner-firefox.config.mjs",
"debug:webkit": "web-test-runner --watch --config web-test-runner-webkit.config.mjs", "debug:webkit": "web-test-runner --watch --config web-test-runner-webkit.config.mjs",
"format": "npm run format:eslint && npm run format:prettier", "format": "run-s format:*",
"format:eslint": "eslint --ext .ts,.js,.mjs,.cjs . --fix", "format:eslint": "eslint --ext .ts,.js,.mjs,.cjs . --fix",
"format:prettier": "node node_modules/prettier/bin-prettier.js \"**/*.{ts,js,mjs,cjs,md}\" \"**/package.json\" --write --ignore-path .eslintignore", "format:prettier": "node node_modules/prettier/bin-prettier.js \"**/*.{ts,js,mjs,cjs,md}\" \"**/!(expected)/package.json\" --write --ignore-path .eslintignore",
"lint": "run-p lint:*", "lint": "run-p lint:*",
"lint:eslint": "eslint --ext .ts,.js,.mjs,.cjs .", "lint:eslint": "eslint --ext .ts,.js,.mjs,.cjs .",
"lint:prettier": "node node_modules/prettier/bin-prettier.js \"**/*.{ts,js,mjs,cjs,md}\" --check --ignore-path .eslintignore", "lint:prettier": "node node_modules/prettier/bin-prettier.js \"**/*.{ts,js,mjs,cjs,md}\" --check --ignore-path .eslintignore",
@@ -28,10 +30,11 @@
"release": "changeset publish && yarn format", "release": "changeset publish && yarn format",
"rocket:build": "node packages/cli/src/cli.js build", "rocket:build": "node packages/cli/src/cli.js build",
"search": "node packages/cli/src/cli.js search", "search": "node packages/cli/src/cli.js search",
"setup": "npm run setup:ts-configs", "setup": "npm run setup:ts-configs && npm run build:packages",
"setup:patches": "npx patch-package", "setup:patches": "npx patch-package",
"setup:ts-configs": "node scripts/generate-ts-configs.mjs", "setup:ts-configs": "node scripts/generate-ts-configs.mjs",
"start": "node packages/cli/src/cli.js start", "xprestart": "yarn analyze",
"start": "node --trace-warnings packages/cli/src/cli.js start",
"test": "yarn test:node && yarn test:web", "test": "yarn test:node && yarn test:web",
"test:node": "mocha \"packages/*/test-node/**/*.test.{ts,js,mjs,cjs}\" --timeout 5000 --reporter dot --exit", "test:node": "mocha \"packages/*/test-node/**/*.test.{ts,js,mjs,cjs}\" --timeout 5000 --reporter dot --exit",
"test:web": "web-test-runner", "test:web": "web-test-runner",
@@ -45,7 +48,8 @@
}, },
"devDependencies": { "devDependencies": {
"@changesets/cli": "^2.12.0", "@changesets/cli": "^2.12.0",
"@open-wc/testing": "^2.5.32", "@custom-elements-manifest/analyzer": "^0.4.12",
"@open-wc/testing": "^3.0.0-next.1",
"@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-commonjs": "^17.0.0",
"@rollup/plugin-json": "^4.1.0", "@rollup/plugin-json": "^4.1.0",
"@rollup/plugin-typescript": "^8.1.0", "@rollup/plugin-typescript": "^8.1.0",
@@ -58,12 +62,13 @@
"@typescript-eslint/parser": "^4.13.0", "@typescript-eslint/parser": "^4.13.0",
"@web/test-runner": "^0.12.2", "@web/test-runner": "^0.12.2",
"@web/test-runner-commands": "^0.4.0", "@web/test-runner-commands": "^0.4.0",
"@web/test-runner-playwright": "^0.8.0", "@web/test-runner-playwright": "^0.8.8",
"cem-plugin-readme": "^0.1.3",
"chai": "^4.2.0", "chai": "^4.2.0",
"concurrently": "^5.3.0", "concurrently": "^5.3.0",
"copyfiles": "^2.4.1", "copyfiles": "^2.4.1",
"deepmerge": "^4.2.2", "deepmerge": "^4.2.2",
"esbuild": "^0.8.31", "esbuild": "^0.12.15",
"eslint": "^7.17.0", "eslint": "^7.17.0",
"eslint-config-prettier": "^7.1.0", "eslint-config-prettier": "^7.1.0",
"hanbi": "^0.4.1", "hanbi": "^0.4.1",
@@ -75,14 +80,17 @@
"onchange": "^7.1.0", "onchange": "^7.1.0",
"prettier": "^2.2.1", "prettier": "^2.2.1",
"prettier-plugin-package": "^1.3.0", "prettier-plugin-package": "^1.3.0",
"puppeteer": "^5.5.0", "publish-docs": "^0.1.2",
"puppeteer": "^9.0.0",
"remark-emoji": "^2.1.0", "remark-emoji": "^2.1.0",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"rocket-preset-code-tabs": "^0.2.6",
"rocket-preset-custom-elements-manifest": "^0.1.7",
"rollup": "^2.36.1", "rollup": "^2.36.1",
"rollup-plugin-terser": "^7.0.2", "rollup-plugin-terser": "^7.0.2",
"sinon": "^9.2.3", "sinon": "^9.2.3",
"ts-node": "^9.1.1", "ts-node": "^9.1.1",
"typescript": "^4.1.3" "typescript": "^4.3.2"
}, },
"eslintConfig": { "eslintConfig": {
"parser": "@typescript-eslint/parser", "parser": "@typescript-eslint/parser",

View File

@@ -1,5 +1,61 @@
# @rocket/blog # @rocket/blog
## 0.4.0
### Minor Changes
- 70bb7a1: BREAKING CHANGE: Update to latest plugins manager to get type safe options
There is no longer a name string as a key for a plugin. It is identified by it's function/class. You will need to adjust your code if you are adding or adjusting plugins.
```diff
- addPlugin({ name: 'my-plugin', plugin: myPlugin, options: { myFlag: true }, location: 'top' });
+ addPlugin(myPlugin, { myFlag: true }, { location: 'top' });
- adjustPluginOptions('my-plugin', { myFlag: true });
+ adjustPluginOptions(myPlugin, { myFlag: true });
```
For more details please see the [Changelog](https://github.com/modernweb-dev/rocket/blob/main/packages/plugins-manager/CHANGELOG.md#030) of the plugins-manager package.
### Patch Changes
- Updated dependencies [70bb7a1]
- Updated dependencies [70bb7a1]
- Updated dependencies [70bb7a1]
- Updated dependencies [70bb7a1]
- Updated dependencies [70bb7a1]
- Updated dependencies [70bb7a1]
- plugins-manager@0.3.0
## 0.3.3
### Patch Changes
- e1089c5: add title to blog page
## 0.3.2
### Patch Changes
- 00f4a91: alignment + spacings for article grids
## 0.3.1
### Patch Changes
- a5661b8: Updates dependencies
## 0.3.0
### Minor Changes
- 8bdc326: Adopt to new layout system
BREAKING CHANGE:
- Renamed `blog` to `layout-blog-overview`
- Renamed `post` to `layout-blog-details`
## 0.2.0 ## 0.2.0
### Minor Changes ### Minor Changes

View File

@@ -1,5 +1,5 @@
# Blog Preset for Rocket # Blog Preset for Rocket
Add blog posts to your rocket site. Add blog posts to your Rocket site.
For docs please see our homepage [https://rocket.modern-web.dev/docs/presets/blog/](https://rocket.modern-web.dev/docs/presets/blog/). For docs please see our homepage [https://rocket.modern-web.dev/docs/presets/blog/](https://rocket.modern-web.dev/docs/presets/blog/).

View File

@@ -1,6 +1,6 @@
{ {
"name": "@rocket/blog", "name": "@rocket/blog",
"version": "0.2.0", "version": "0.4.0",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
@@ -38,6 +38,6 @@
"testing" "testing"
], ],
"dependencies": { "dependencies": {
"plugins-manager": "^0.2.0" "plugins-manager": "^0.3.0"
} }
} }

View File

@@ -1,10 +1,10 @@
/** BLOG OVERVIEW **************************************************************************/ /** BLOG OVERVIEW **************************************************************************/
body[layout='blog-details'] rocket-navigation > ul > li.current::before { body[layout='layout-blog-details'] rocket-navigation > ul > li.current::before {
display: none; display: none;
} }
body[layout='blog-details'] #sidebar-nav li.anchor a:hover::before { body[layout='layout-blog-details'] #sidebar-nav li.anchor a:hover::before {
display: none; display: none;
} }
@@ -20,6 +20,8 @@ body[layout='blog-details'] #sidebar-nav li.anchor a:hover::before {
flex-wrap: wrap; flex-wrap: wrap;
margin: calc(-1 * var(--gap)) 0 0 calc(-1 * var(--gap)); margin: calc(-1 * var(--gap)) 0 0 calc(-1 * var(--gap));
width: calc(100% + var(--gap)); width: calc(100% + var(--gap));
align-items: flex-start;
} }
.articles article { .articles article {
@@ -32,6 +34,12 @@ body[layout='blog-details'] #sidebar-nav li.anchor a:hover::before {
.articles article h2 { .articles article h2 {
margin: 0; margin: 0;
border: none; border: none;
padding-top: 1rem;
}
.articles article .thumbnail {
display: block;
height: 200px;
} }
.articles article .read { .articles article .read {
@@ -48,8 +56,7 @@ body[layout='blog-details'] #sidebar-nav li.anchor a:hover::before {
} }
@media screen and (min-width: 1024px) { @media screen and (min-width: 1024px) {
body[layout='blog-details'] #sidebar { body[layout='layout-blog-details'] #sidebar {
display: block; display: block;
} }
} }

View File

@@ -0,0 +1,6 @@
{% if title %}
<h1>{{title}}</h1>
{% endif %}
{% if cover_image %}
<img src="{{ cover_image | url }}" alt="">
{% endif %}

View File

@@ -0,0 +1 @@
{% include 'partials/_shared/blog-content-footer.njk' %}

View File

@@ -0,0 +1 @@
{% include 'partials/_shared/logoLink.njk' %}

View File

@@ -0,0 +1,25 @@
<rocket-navigation>
<ul>
<li class="current">
<h3>Headings</h3>
{{ collections[section] | rocketPageAnchors({ title: title }) | rocketNavToHtml({
listItemClass: "menu-item",
activeListItemClass: "current",
activeKey: eleventyNavigation.key
}) | safe }}
</li>
</ul>
<div class="sidebar-tags">
<h3>Date</h3>
<div>{{ page.date.toDateString() }}</div>
</div>
<div class="sidebar-tags">
<h3>Tags</h3>
<div class="tags">
{% for tag in tags %}
<span class="tag">{{tag}}</span>
{% endfor %}
</div>
</div>
{% include 'partials/mobile-sidebar-bottom.njk' %}
</rocket-navigation>

View File

@@ -0,0 +1,19 @@
<div class="articles">
{% for post in posts %}
{% if post.data.published %}
<article>
{% if post.data.cover_image %}
<a href="{{ post.url | url }}" class="thumbnail" style="background-image: url({{ post.data.cover_image | url }});">
</a>
{% endif %}
<div class="content">
<h2>
<a href="{{ post.url | url }}">{{ post.data.title }}</a>
</h2>
<p>{{ post.data.description }}</p>
<a class="read" href="{{ post.url | url }}">...read more</a>
</div>
</article>
{% endif %}
{% endfor %}
</div>

View File

@@ -0,0 +1,9 @@
<link rel="stylesheet" href="{{ '/_assets/rocket-blog.css' | asset | url }}">
{%- if layout == 'layout-blog-overview' -%}
<style>
.articles article .thumbnail {
background-size: cover;
background-position: center;
}
</style>
{%- endif -%}

View File

@@ -1,57 +0,0 @@
{% extends 'with-index.njk' %}
{% block headContent %}
{{ super() }}
<link rel="stylesheet" href="{{ '/_assets/blog.css' | asset | url }}">
{% endblock %}
{% block bodyTag %}
<body layout="blog-details">
{% endblock bodyTag %}
{% block sidebar %}
<rocket-drawer id="sidebar">
<nav slot="content" id="sidebar-nav">
{% include 'partials/logoLink.njk' %}
<rocket-navigation>
<ul>
<li class="current">
<h3>Headings</h3>
{{ collections[section] | rocketPageAnchors({ title: title }) | rocketNavToHtml({
listItemClass: "menu-item",
activeListItemClass: "current",
activeKey: eleventyNavigation.key
}) | safe }}
</li>
</ul>
<div class="sidebar-tags">
<h3>Date</h3>
<div>{{ page.date.toDateString() }}</div>
</div>
<div class="sidebar-tags">
<h3>Tags</h3>
<div class="tags">
{% for tag in tags %}
<span class="tag">{{tag}}</span>
{% endfor %}
</div>
</div>
{% include 'partials/mobile-sidebar-bottom.njk' %}
</rocket-navigation>
</nav>
</rocket-drawer>
{% endblock sidebar %}
{% block main %}
<main class="markdown-body">
{% if cover_image %}
<img src="{{ cover_image | url }}" alt="">
{% endif %}
{% include 'partials/addTitleHeadline.njk' %}
{{ content | safe }}
{% include 'partials/previousNext.njk' %}
{% include 'partials/blog-content-footer.njk' %}
</main>
{% endblock main %}

View File

@@ -1,37 +0,0 @@
{% extends 'home.njk' %}
{% block headContent %}
{{ super() }}
<link rel="stylesheet" href="{{ '/_assets/blog.css' | asset | url }}">
{% endblock %}
{% block bodyTag %}
<body layout="blog-overview">
{% endblock bodyTag %}
{% block main %}
<main class="markdown-body">
{% include 'partials/addTitleHeadline.njk' %}
{{ content | safe }}
<div class="articles">
{% for post in posts %}
{% if post.data.published %}
<article>
{% if post.data.cover_image %}
<a href="{{ post.url | url }}">
<img src="{{ post.data.cover_image | url }}" alt="">
</a>
{% endif %}
<div class="content">
<h2>
<a href="{{ post.url | url }}">{{ post.data.title }}</a>
</h2>
<p>{{ post.data.description }}</p>
<a class="read" href="{{ post.url | url }}">...read more</a>
</div>
</article>
{% endif %}
{% endfor %}
</div>
</main>
{% endblock main %}

View File

@@ -0,0 +1,11 @@
{% extends 'layout-sidebar.njk' %}
{% block sidebar %}
{% include 'partials/_layoutBlogDetails/sidebar.njk' %}
{% endblock sidebar %}
{% block content %}
<main class="markdown-body">
{% include 'partials/_layoutBlogDetails/content.njk' %}
</main>
{% endblock content %}

View File

@@ -0,0 +1,5 @@
{% extends 'layout-home.njk' %}
{% block content %}
{% include 'partials/_layoutBlogOverview/content.njk' %}
{% endblock content %}

View File

@@ -0,0 +1,5 @@
<main class="markdown-body">
{% for blockName, blockPath in _joiningBlocks._layoutBlogDetails.content %}
{% include blockPath %}
{% endfor %}
</main>

View File

@@ -0,0 +1,7 @@
<rocket-drawer id="sidebar">
<nav slot="content" id="sidebar-nav">
{% for blockName, blockPath in _joiningBlocks._layoutBlogDetails.sidebar %}
{% include blockPath %}
{% endfor %}
</nav>
</rocket-drawer>

View File

@@ -0,0 +1,5 @@
<main class="markdown-body">
{% for blockName, blockPath in _joiningBlocks._layoutBlogOverview.content %}
{% include blockPath %}
{% endfor %}
</main>

View File

@@ -13,9 +13,6 @@ export function rocketBlog({ section = SECTION, postCollection = POST_COLLECTION
const eleventyPluginRocketBlog = { const eleventyPluginRocketBlog = {
configFunction: eleventyConfig => { configFunction: eleventyConfig => {
eleventyConfig.addLayoutAlias('blog', 'blog-overview.njk');
eleventyConfig.addLayoutAlias('post', 'blog-details.njk');
eleventyConfig.addCollection('posts', collection => { eleventyConfig.addCollection('posts', collection => {
/* /*
// It's not working beacuse it's a paginated collection. // It's not working beacuse it's a paginated collection.
@@ -41,7 +38,7 @@ export function rocketBlog({ section = SECTION, postCollection = POST_COLLECTION
const posts = eleventyConfig.collections[section](collection); const posts = eleventyConfig.collections[section](collection);
posts.forEach(page => { posts.forEach(page => {
page.data.layout = 'post'; page.data.layout = 'layout-blog-details';
}); });
return posts; return posts;
}); });
@@ -50,6 +47,6 @@ export function rocketBlog({ section = SECTION, postCollection = POST_COLLECTION
return { return {
path: path.resolve(__dirname), path: path.resolve(__dirname),
setupEleventyPlugins: [addPlugin({ name: 'rocket-blog', plugin: eleventyPluginRocketBlog })], setupEleventyPlugins: [addPlugin(eleventyPluginRocketBlog)],
}; };
} }

View File

@@ -1,5 +1,46 @@
# @rocket/building-rollup # @rocket/building-rollup
## 0.4.0
### Minor Changes
- 70bb7a1: BREAKING CHANGE: Update to latest plugins manager to get type safe options
There is no longer a name string as a key for a plugin. It is identified by it's function/class. You will need to adjust your code if you are adding or adjusting plugins.
```diff
- addPlugin({ name: 'my-plugin', plugin: myPlugin, options: { myFlag: true }, location: 'top' });
+ addPlugin(myPlugin, { myFlag: true }, { location: 'top' });
- adjustPluginOptions('my-plugin', { myFlag: true });
+ adjustPluginOptions(myPlugin, { myFlag: true });
```
For more details please see the [Changelog](https://github.com/modernweb-dev/rocket/blob/main/packages/plugins-manager/CHANGELOG.md#030) of the plugins-manager package.
## 0.3.1
### Patch Changes
- 60e85a1: Support `picture` tags by handling `source` tags with `srcset` attributes in the rollup asset gathering build phase.
## 0.3.0
### Minor Changes
- 2724f07: Stop auto generating a service worker from a template. Setup your own and then bundle via `createServiceWorkerConfig`.
## 0.2.0
### Minor Changes
- bad4686: Preserve attributes on script tags. Preserve export names.
## 0.1.3
### Patch Changes
- be0d0b3: fix: add missing main entry to the packages
## 0.1.2 ## 0.1.2
### Patch Changes ### Patch Changes

View File

@@ -1,6 +1,6 @@
# Building Rollup # Building Rollup
Rollup configuration to help you get started building modern web applications. 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. You write modern JavaScript using the latest browser features. Rollup will optimize your code for production and ensure it runs on all supported browsers.
For docs please see our homepage [https://rocket.modern-web.dev/docs/building/rollup-config/](https://rocket.modern-web.dev/docs/building/rollup-config/). For docs please see our homepage [https://rocket.modern-web.dev/docs/building/rollup-config/](https://rocket.modern-web.dev/docs/building/rollup-config/).

View File

@@ -2,7 +2,7 @@
import { LitElement, html, css } from 'lit-element'; import { LitElement, html, css } from 'lit-element';
import './demo-component.js'; import './demo-component.js';
// partial css trips up the minifier // partial CSS trips up the minifier
const fontSize = css` const fontSize = css`
16 16
`; `;

View File

@@ -1,6 +1,6 @@
import { LitElement, html, customElement } from 'lit-element'; import { LitElement, html, customElement } from 'lit-element';
const msg: string = 'Typescript demo works'; const msg: string = 'TypeScript demo works';
@customElement('demo-app') @customElement('demo-app')
class DemoApp extends LitElement { class DemoApp extends LitElement {

View File

@@ -6,3 +6,7 @@
export { createBasicConfig, createBasicMetaConfig } from './src/createBasicConfig.js'; export { createBasicConfig, createBasicMetaConfig } from './src/createBasicConfig.js';
export { createSpaConfig, createSpaMetaConfig } from './src/createSpaConfig.js'; export { createSpaConfig, createSpaMetaConfig } from './src/createSpaConfig.js';
export { createMpaConfig, createMpaMetaConfig } from './src/createMpaConfig.js'; export { createMpaConfig, createMpaMetaConfig } from './src/createMpaConfig.js';
export {
createServiceWorkerConfig,
createServiceWorkerMetaConfig,
} from './src/createServiceWorkerConfig.js';

View File

@@ -1,6 +1,6 @@
{ {
"name": "@rocket/building-rollup", "name": "@rocket/building-rollup",
"version": "0.1.2", "version": "0.4.0",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
@@ -13,6 +13,7 @@
}, },
"author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)", "author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)",
"homepage": "https://rocket.modern-web.dev/docs/tools/building-rollup/", "homepage": "https://rocket.modern-web.dev/docs/tools/building-rollup/",
"main": "./index.js",
"type": "module", "type": "module",
"exports": { "exports": {
".": "./index.js" ".": "./index.js"
@@ -54,11 +55,16 @@
"@babel/preset-env": "^7.12.11", "@babel/preset-env": "^7.12.11",
"@rollup/plugin-babel": "^5.2.2", "@rollup/plugin-babel": "^5.2.2",
"@rollup/plugin-node-resolve": "^11.0.1", "@rollup/plugin-node-resolve": "^11.0.1",
"@web/rollup-plugin-html": "^1.4.0", "@rollup/plugin-replace": "^2.4.2",
"@web/rollup-plugin-html": "^1.8.0",
"@web/rollup-plugin-import-meta-assets": "^1.0.4", "@web/rollup-plugin-import-meta-assets": "^1.0.4",
"@web/rollup-plugin-polyfills-loader": "^1.0.3", "@web/rollup-plugin-polyfills-loader": "^1.1.0",
"browserslist": "^4.16.1", "browserslist": "^4.16.1",
"rollup-plugin-terser": "^7.0.2", "rollup-plugin-terser": "^7.0.2",
"rollup-plugin-workbox": "^6.1.0" "workbox-broadcast-update": "^6.1.5",
"workbox-cacheable-response": "^6.1.5",
"workbox-expiration": "^6.1.5",
"workbox-routing": "^6.1.5",
"workbox-strategies": "^6.1.5"
} }
} }

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