test run
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
_pagex
|
||||||
|
.idea
|
||||||
21
.gitlab-ci.yml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
image: node:24-alpine
|
||||||
|
|
||||||
|
variables:
|
||||||
|
GIT_SUBMODULE_STRATEGY: recursive
|
||||||
|
GIT_SUBMODULE_FORCE_HTTPS: "true"
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- npm ci
|
||||||
|
pages:
|
||||||
|
script:
|
||||||
|
# Add brotli for compression
|
||||||
|
- apk add --no-cache brotli
|
||||||
|
# Build app
|
||||||
|
- npm run build
|
||||||
|
# Optimize output files via gzip & brotli
|
||||||
|
- find dist -type f -regex '.*\.\(htm\|html\|xml\|txt\|text\|js\|css\|svg\|woff2\)$' -exec gzip -f -k {} \;
|
||||||
|
- find dist -type f -regex '.*\.\(htm\|html\|xml\|txt\|text\|js\|css\|svg\|woff2\)$' -exec brotli -f -k {} \;
|
||||||
|
pages:
|
||||||
|
publish: dist
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
|
||||||
18
.gitmodules
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
[submodule "webfont"]
|
||||||
|
path = webfont
|
||||||
|
url = ../webfont
|
||||||
|
[submodule "pagex"]
|
||||||
|
path = pagex
|
||||||
|
url = ../pagex
|
||||||
|
[submodule "voidcannon"]
|
||||||
|
path = voidcannon
|
||||||
|
url = ../voidcannon
|
||||||
|
[submodule "webicons"]
|
||||||
|
path = webicons
|
||||||
|
url = ../webicons
|
||||||
|
[submodule "gm3"]
|
||||||
|
path = gm3
|
||||||
|
url = ../gm3
|
||||||
|
[submodule "pagex_commons"]
|
||||||
|
path = pagex_commons
|
||||||
|
url = ../pagex_commons
|
||||||
1
gm3
Submodule
3908
package-lock.json
generated
Normal file
19
package.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name": "blog",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"scripts": {
|
||||||
|
"build": "cd voidcannon&&npm run generate-icon-font&&cd ../pagex&&npm run build ../",
|
||||||
|
"dev": "cd voidcannon&&npm run generate-full-icon-font&&cd ../pagex&&npm run dev ../"
|
||||||
|
},
|
||||||
|
"type": "module",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"gm3": "file:gm3",
|
||||||
|
"pagex": "file:pagex",
|
||||||
|
"pagex_commons": "file:pagex_commons",
|
||||||
|
"voidcannon": "file:voidcannon",
|
||||||
|
"webfont": "file:webfont",
|
||||||
|
"webicons": "file:webicons"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
pagex
Submodule
23
pagex.config.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import {PagexTemplateType} from "pagex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: "voidcannon",
|
||||||
|
site_config: {
|
||||||
|
title: "voidcannon-dev"
|
||||||
|
},
|
||||||
|
base: process.env.CI_PAGES_URL ? new URL(process.env.CI_PAGES_URL).pathname + (new URL(process.env.CI_PAGES_URL).pathname.endsWith("/") ? "":"/") : "/blog" + "/" || "",
|
||||||
|
output: {
|
||||||
|
path: "dist"
|
||||||
|
},
|
||||||
|
pagex_content: {
|
||||||
|
content: "./src/",
|
||||||
|
templates: "./voidcannon/src/",
|
||||||
|
client: {
|
||||||
|
components: "./voidcannon/src/client/components.js",
|
||||||
|
entrypoint: "./voidcannon/src/client/index.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
templates: {
|
||||||
|
[PagexTemplateType.BASE_PAGE]: "frames/Page.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
pagex_commons
Submodule
50
src/content/articles/playground-gm3/playground-gm3.pagex.js
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
import {VoidcannonHeaderLayoutType, VoidcannonHeaderType, VoidcannonContentType} from "voidcannon";
|
||||||
|
|
||||||
|
import bignutty from "../../authors/bignutty.pagex.js";
|
||||||
|
|
||||||
|
import testCollection from "../../collections/test.pagex.js";
|
||||||
|
import featuredCollection from "../../collections/_featured.pagex.js";
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.ARTICLE,
|
||||||
|
content: {
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN,
|
||||||
|
path: "../playground/content.md"
|
||||||
|
},
|
||||||
|
id: "playground-gm3",
|
||||||
|
title: "Playground Test Article (gm3 base theme)",
|
||||||
|
created_at: 1757861297516,
|
||||||
|
header: {
|
||||||
|
type: VoidcannonHeaderType.IMMERSIVE,
|
||||||
|
layout: VoidcannonHeaderLayoutType.TEXT,
|
||||||
|
label: "Article Title (gm3)",
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "../playground/assets/header/background.png"
|
||||||
|
},
|
||||||
|
immersive_content: {
|
||||||
|
left: {
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "../playground/assets/header/immersive_left/full.png"
|
||||||
|
},
|
||||||
|
outer: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "../playground/assets/header/immersive_left/outer_v2.png"
|
||||||
|
},
|
||||||
|
inner: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "../playground/assets/header/immersive_left/base_v2.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
color: "#c7f718"
|
||||||
|
},
|
||||||
|
authors: [bignutty],
|
||||||
|
collections: [
|
||||||
|
testCollection.id,
|
||||||
|
featuredCollection.id
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 56 KiB |
BIN
src/content/articles/playground-p3/assets/header/logo_p3.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
70
src/content/articles/playground-p3/content.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# Persona 3 Reload
|
||||||
|
|
||||||
|
this is sample text (p3)
|
||||||
|
|
||||||
|
[playground](./playground) [playground-partial](./playground-partial) [p3](./playground-p3) [totk](./playground-totk)
|
||||||
|
|
||||||
|
## Custom Emoji :p3smile:
|
||||||
|
|
||||||
|
- :p3smile: :p3worried: :p3surprised:
|
||||||
|
- :p3arrowup: :p3heart: :p3brokenheart: :p3burger: :p3camera: :p3cat: :p3dog: :p3cloud: :p3cup: :p3moon: :p3fullmoon: :p3pill: :p3rainbow: :p3snowman: :p3star: :p3sun: :p3thumbsup: :p3umbrella: :p3yen:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import {VoidcannonHeaderLayoutType, VoidcannonHeaderType, VoidcannonContentType} from "voidcannon";
|
||||||
|
|
||||||
|
import bignutty from "../../authors/bignutty.pagex.js";
|
||||||
|
|
||||||
|
import testCollection from "../../collections/test.pagex.js";
|
||||||
|
import featuredCollection from "../../collections/_featured.pagex.js";
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.ARTICLE,
|
||||||
|
content: {
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN,
|
||||||
|
path: "./content.md"
|
||||||
|
},
|
||||||
|
id: "playground-p3",
|
||||||
|
title: "Playground P3 Test Article",
|
||||||
|
theme: {
|
||||||
|
colors: {
|
||||||
|
light: "#0eb1f4",
|
||||||
|
dark: "#0eb1f4",
|
||||||
|
},
|
||||||
|
variant: "Content",
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
type: VoidcannonHeaderType.IMMERSIVE,
|
||||||
|
layout: VoidcannonHeaderLayoutType.LOGO,
|
||||||
|
position: "100% 100%",
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/background_p3.png"
|
||||||
|
},
|
||||||
|
logo: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/logo_p3.png"
|
||||||
|
},
|
||||||
|
immersive_content: {
|
||||||
|
left: {
|
||||||
|
outer: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_left/outer_p3.png"
|
||||||
|
},
|
||||||
|
inner: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_left/base_p3.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
color: "#0eb1f4"
|
||||||
|
},
|
||||||
|
authors: [bignutty],
|
||||||
|
collections: [
|
||||||
|
testCollection.id,
|
||||||
|
"rest",
|
||||||
|
featuredCollection.id
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
60
src/content/articles/playground-p3/playground-p3.pagex.js
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import {VoidcannonHeaderLayoutType, VoidcannonHeaderType, VoidcannonContentType} from "voidcannon";
|
||||||
|
|
||||||
|
import bignutty from "../../authors/bignutty.pagex.js";
|
||||||
|
|
||||||
|
import videogamesCollection from "../../collections/videogames.pagex.js";
|
||||||
|
import testCollection from "../../collections/test.pagex.js";
|
||||||
|
import featuredCollection from "../../collections/_featured.pagex.js";
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";
|
||||||
|
import {ThemeVariants} from "pagex_commons";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.ARTICLE,
|
||||||
|
content: {
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN,
|
||||||
|
path: "./content.md"
|
||||||
|
},
|
||||||
|
id: "playground-p3",
|
||||||
|
title: "Playground P3 Test Article",
|
||||||
|
created_at: 1757861297516,
|
||||||
|
theme: {
|
||||||
|
colors: {
|
||||||
|
light: "#0eb1f4",
|
||||||
|
dark: "#0eb1f4",
|
||||||
|
},
|
||||||
|
variant: ThemeVariants.VIBRANT,
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
type: VoidcannonHeaderType.IMMERSIVE,
|
||||||
|
layout: VoidcannonHeaderLayoutType.LOGO,
|
||||||
|
position: "100% 100%",
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/background_p3.png"
|
||||||
|
},
|
||||||
|
logo: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/logo_p3.png"
|
||||||
|
},
|
||||||
|
immersive_content: {
|
||||||
|
left: {
|
||||||
|
outer: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_left/outer_p3.png"
|
||||||
|
},
|
||||||
|
inner: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_left/base_p3.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
color: "#0eb1f4"
|
||||||
|
},
|
||||||
|
authors: [bignutty],
|
||||||
|
collections: [
|
||||||
|
videogamesCollection.id,
|
||||||
|
testCollection.id,
|
||||||
|
featuredCollection.id
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
import {
|
||||||
|
VoidcannonHeaderLayoutType,
|
||||||
|
VoidcannonHeaderType,
|
||||||
|
VoidcannonContentType,
|
||||||
|
VoidcannonEmojiStyle
|
||||||
|
} from "voidcannon";
|
||||||
|
|
||||||
|
import bignutty from "../../authors/bignutty.pagex.js";
|
||||||
|
|
||||||
|
import testCollection from "../../collections/test.pagex.js";
|
||||||
|
import featuredCollection from "../../collections/_featured.pagex.js";
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.ARTICLE,
|
||||||
|
content: {
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN,
|
||||||
|
path: "../playground/content.md"
|
||||||
|
},
|
||||||
|
id: "playground-partial",
|
||||||
|
title: "Playground Test Article (partial)",
|
||||||
|
created_at: 0,
|
||||||
|
theme: {
|
||||||
|
emoji_style: VoidcannonEmojiStyle.FLUENT_FLAT,
|
||||||
|
partial: true,
|
||||||
|
colors: {
|
||||||
|
light: "#c7f718",
|
||||||
|
dark: "#c7f718",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
type: VoidcannonHeaderType.IMMERSIVE,
|
||||||
|
layout: VoidcannonHeaderLayoutType.TEXT,
|
||||||
|
label: "Article Title :catsmile:",
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "../playground/assets/header/background.png"
|
||||||
|
},
|
||||||
|
immersive_content: {
|
||||||
|
left: {
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "../playground/assets/header/immersive_left/full.png"
|
||||||
|
},
|
||||||
|
outer: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "../playground/assets/header/immersive_left/outer_v2.png"
|
||||||
|
},
|
||||||
|
inner: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "../playground/assets/header/immersive_left/base_v2.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
color: "#c7f718"
|
||||||
|
},
|
||||||
|
authors: [bignutty.id],
|
||||||
|
collections: [
|
||||||
|
testCollection.id,
|
||||||
|
featuredCollection.id
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 879 KiB |
|
After Width: | Height: | Size: 261 KiB |
|
After Width: | Height: | Size: 90 KiB |
BIN
src/content/articles/playground-totk/assets/header/logo.png
Normal file
|
After Width: | Height: | Size: 1001 KiB |
72
src/content/articles/playground-totk/content.md
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
# The Legend of Zelda: Tears of the Kingdom
|
||||||
|
|
||||||
|
this is sample text (totk)
|
||||||
|
|
||||||
|
[playground](./playground) [playground-partial](./playground-partial) [p3](./playground-p3) [totk](./playground-totk)
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
console.log('hewwo') // [!code --]
|
||||||
|
console.log('hello') // [!code ++]
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
import {VoidcannonHeaderLayoutType, VoidcannonHeaderType, VoidcannonContentType} from "voidcannon";
|
||||||
|
|
||||||
|
import bignutty from "../../authors/bignutty.pagex.js";
|
||||||
|
|
||||||
|
import testCollection from "../../collections/test.pagex.js";
|
||||||
|
import featuredCollection from "../../collections/_featured.pagex.js";// [!code error]
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";// [!code warning]
|
||||||
|
|
||||||
|
export default { // [!code highlight]
|
||||||
|
type: VoidcannonContentType.ARTICLE, // [!code highlight]
|
||||||
|
content: { // [!code highlight]
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN, // [!code highlight]
|
||||||
|
path: "./content.md"
|
||||||
|
},
|
||||||
|
id: "playground-totk",
|
||||||
|
title: "Playground Totk Test Article",
|
||||||
|
theme: { // [!code --]
|
||||||
|
partial: true, // [!code --]
|
||||||
|
colors: { // [!code --]
|
||||||
|
light: "#4dc294", // [!code --]
|
||||||
|
dark: "#4dc294", // [!code --]
|
||||||
|
} // [!code --]
|
||||||
|
}, // [!code --]
|
||||||
|
theme: { // [!code ++]
|
||||||
|
partial: true, // [!code ++]
|
||||||
|
colors: { // [!code ++]
|
||||||
|
light: "#4dc294", // [!code ++]
|
||||||
|
dark: "#4dc294", // [!code ++]
|
||||||
|
} // [!code ++]
|
||||||
|
}, // [!code ++]
|
||||||
|
header: {
|
||||||
|
type: VoidcannonHeaderType.IMMERSIVE,
|
||||||
|
layout: VoidcannonHeaderLayoutType.EMPTY,
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/background_totk.png"
|
||||||
|
},
|
||||||
|
immersive_content: {
|
||||||
|
right: {
|
||||||
|
outer: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_right/outer.png"
|
||||||
|
},
|
||||||
|
inner: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_right/inner.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
color: "#4dc294"
|
||||||
|
},
|
||||||
|
authors: [bignutty],
|
||||||
|
collections: [
|
||||||
|
testCollection.id,
|
||||||
|
"rest",
|
||||||
|
featuredCollection.id
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
import {VoidcannonHeaderLayoutType, VoidcannonHeaderType, VoidcannonContentType} from "voidcannon";
|
||||||
|
|
||||||
|
import bignutty from "../../authors/bignutty.pagex.js";
|
||||||
|
|
||||||
|
import videogamesCollection from "../../collections/videogames.pagex.js";
|
||||||
|
import testCollection from "../../collections/test.pagex.js";
|
||||||
|
import featuredCollection from "../../collections/_featured.pagex.js";
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.ARTICLE,
|
||||||
|
content: {
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN,
|
||||||
|
path: "./content.md"
|
||||||
|
},
|
||||||
|
id: "playground-totk",
|
||||||
|
title: "Playground Totk Test Article",
|
||||||
|
created_at: 1757861297516,
|
||||||
|
updated_at: 1757861297516,
|
||||||
|
theme: {
|
||||||
|
// partial: true,
|
||||||
|
colors: {
|
||||||
|
light: "#4dc294",
|
||||||
|
dark: "#4dc294",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
type: VoidcannonHeaderType.IMMERSIVE,
|
||||||
|
layout: VoidcannonHeaderLayoutType.EMPTY,
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/background_totk.png"
|
||||||
|
},
|
||||||
|
immersive_content: {
|
||||||
|
right: {
|
||||||
|
outer: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_right/outer.png"
|
||||||
|
},
|
||||||
|
inner: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_right/inner.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
color: "#4dc294"
|
||||||
|
},
|
||||||
|
authors: [bignutty],
|
||||||
|
collections: [
|
||||||
|
videogamesCollection.id,
|
||||||
|
testCollection.id,
|
||||||
|
featuredCollection.id
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
src/content/articles/playground/assets/Cat_using_computer.jpg
Normal file
|
After Width: | Height: | Size: 625 KiB |
BIN
src/content/articles/playground/assets/feature/feature_lower.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
src/content/articles/playground/assets/feature/feature_upper.png
Normal file
|
After Width: | Height: | Size: 441 KiB |
BIN
src/content/articles/playground/assets/header/background.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 542 KiB |
|
After Width: | Height: | Size: 584 KiB |
|
After Width: | Height: | Size: 18 KiB |
510
src/content/articles/playground/content.md
Normal file
@@ -0,0 +1,510 @@
|
|||||||
|
# Pagex Playground Article
|
||||||
|
|
||||||
|
this is sample text (playground)
|
||||||
|
|
||||||
|
## Test Articles
|
||||||
|
- [playground](./playground)
|
||||||
|
- - [playground (partially themed)](./playground-partial)
|
||||||
|
- - [playground (no theme)](./playground-gm3)
|
||||||
|
- [p3](./playground-p3)
|
||||||
|
- [totk](./playground-totk)
|
||||||
|
|
||||||
|
<voidcannon-theme-switcher></voidcannon-theme-switcher>
|
||||||
|
|
||||||
|
# Markdown Test Document
|
||||||
|
|
||||||
|
This document is designed to test all aspects of the pagex markdown renderer.
|
||||||
|
|
||||||
|
To modify the test document, make changes in `/src/content/articles/playground/content.md`.
|
||||||
|
|
||||||
|
## Custom Elements
|
||||||
|
|
||||||
|
Voidcannon provides a set of custom html elements that can be used within the standard markdown html syntax.
|
||||||
|
|
||||||
|
### <voidcannon-carousel>
|
||||||
|
|
||||||
|
`<voidcannon-carousel>` turns any content into a carousel. Carousels are not server-rendered.
|
||||||
|
|
||||||
|
<voidcannon-carousel>
|
||||||
|
<voidcannon-slide>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-slide>
|
||||||
|
<voidcannon-slide>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-slide>
|
||||||
|
<voidcannon-slide>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-slide>
|
||||||
|
</voidcannon-carousel>
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
<voidcannon-carousel>
|
||||||
|
<voidcannon-slide>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-slide>
|
||||||
|
<voidcannon-slide>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-slide>
|
||||||
|
<voidcannon-slide>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-slide>
|
||||||
|
</voidcannon-carousel>
|
||||||
|
```
|
||||||
|
|
||||||
|
### <voidcannon-slide>, <voidcannon-harness>
|
||||||
|
|
||||||
|
The `<voidcannon-slide>` and `<voidcannon-harness>` custom elements allow for slotting content.
|
||||||
|
|
||||||
|
#### <voidcannon-slide>
|
||||||
|
|
||||||
|
Intended for use within carousels in order to create holding containers for slides. Automatically scales images to use
|
||||||
|
up all available visual carousel space. Will probably be replaced in favor of harness some day.
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
<voidcannon-slide>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-slide>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### <voidcannon-harness>
|
||||||
|
|
||||||
|
Makes content take up more space horizontally in the article layout. Intended for big elements like images
|
||||||
|
or important sections that should get more highlighting or emphasis. (Carousels use this style by default without
|
||||||
|
needing a harness element)
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
<voidcannon-harness>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-harness>
|
||||||
|
```
|
||||||
|
|
||||||
|
### <voidcannon-cta>
|
||||||
|
|
||||||
|
Call-to-action that emphasizes an action or acts as a callout/hint.
|
||||||
|
Can accept a button.
|
||||||
|
|
||||||
|
<voidcannon-cta layout="button">
|
||||||
|
<md-icon slot="icon">brightness_alert</md-icon>
|
||||||
|
Big Warning!
|
||||||
|
<md-text-button slot="button">Go to Warner</md-text-button>
|
||||||
|
</voidcannon-cta>
|
||||||
|
|
||||||
|
```html
|
||||||
|
<voidcannon-cta layout="button">
|
||||||
|
<md-icon slot="icon">brightness_alert</md-icon>
|
||||||
|
Big Warning!
|
||||||
|
<md-text-button slot="button">Go to Warner</md-text-button>
|
||||||
|
</voidcannon-cta>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Other Custom Elements
|
||||||
|
|
||||||
|
The voidcannon frontend imports various other internal and external custom elements that can be server-rendered.
|
||||||
|
|
||||||
|
### @material/web
|
||||||
|
|
||||||
|
<md-filled-button>Buttons</md-filled-button>
|
||||||
|
<md-icon-button><md-icon>warning</md-icon></md-icon-button>
|
||||||
|
<md-icon>breaking_news</md-icon>
|
||||||
|
|
||||||
|
> Voidcannon ships a stripped down version of Material Symbols in production builds.
|
||||||
|
>
|
||||||
|
> If an icon doesn't display properly in `<md-icon>` or `<wf-icon>` components, make
|
||||||
|
> sure the icon is included in `voidcannon/scripts/generate-icon-font.js`.
|
||||||
|
|
||||||
|
### gm3 (p1)
|
||||||
|
|
||||||
|
<gm3-loading-indicator></gm3-loading-indicator>
|
||||||
|
<gm3-loading-indicator contained></gm3-loading-indicator>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
To get an exhaustive list, check `voidcannon/src/client/components.js`. Client-only components are under
|
||||||
|
`voidcannon/src/client/components_client.js`.
|
||||||
|
|
||||||
|
## Headings
|
||||||
|
|
||||||
|
* # H1 Heading
|
||||||
|
* ## H2 Heading
|
||||||
|
* ### H3 Heading
|
||||||
|
* #### H4 Heading
|
||||||
|
* ##### H5 Heading
|
||||||
|
* ###### H6 Heading
|
||||||
|
|
||||||
|
> The first `h1` in an article is considered to be the "article title" and gets
|
||||||
|
different styling (size increase, smaller gap above).
|
||||||
|
|
||||||
|
## Emphasis
|
||||||
|
|
||||||
|
* **Bold text**
|
||||||
|
* *Italic text*
|
||||||
|
* ***Bold and italic text***
|
||||||
|
* ~~Strikethrough text~~
|
||||||
|
* <u>Underlined text</u> (if supported)
|
||||||
|
|
||||||
|
## Lists
|
||||||
|
|
||||||
|
### Unordered Lists
|
||||||
|
|
||||||
|
* Item 1
|
||||||
|
* Item 2
|
||||||
|
* Subitem 1
|
||||||
|
* Subitem 2
|
||||||
|
* Item 3
|
||||||
|
|
||||||
|
### Ordered Lists
|
||||||
|
|
||||||
|
1. First item
|
||||||
|
2. Second item
|
||||||
|
1. Subitem 1
|
||||||
|
2. Subitem 2
|
||||||
|
3. Third item
|
||||||
|
|
||||||
|
## Emojis
|
||||||
|
|
||||||
|
# 🦭
|
||||||
|
big seal
|
||||||
|
|
||||||
|
My favourite animals are the seal 🦭 and the otter 🦦. My favourite emoji is the skateboard 🛹 joycat 😹
|
||||||
|
|
||||||
|
🌈 ✨🤩💫☪🐟♏🦂🦀🦁🐍🐐🌃🍋🟩
|
||||||
|
- 🏃🏾♀️➡️
|
||||||
|
- 👨🏻❤️👨🏻
|
||||||
|
- 🧑🏼❤️🧑🏾
|
||||||
|
-
|
||||||
|
- 🇩🇪
|
||||||
|
|
||||||
|
Supports discord-style shorthands
|
||||||
|
- :tada: (`:tada:`)
|
||||||
|
- :heart_hands::skin-tone-1: (`:heart_hands::skin-tone-1:`)
|
||||||
|
- :couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone: (`:couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone:`)
|
||||||
|
- :person_in_motorized_wheelchair_facing_right_medium_light_skin_tone: (`:person_in_motorized_wheelchair_facing_right_medium_light_skin_tone:`)
|
||||||
|
- :regional_indicator_b::regional_indicator_i::regional_indicator_g::regional_indicator_n::regional_indicator_u::regional_indicator_t::regional_indicator_t::regional_indicator_y:
|
||||||
|
- :flag_de: :rainbow_flag:
|
||||||
|
- :face_with_bags_under_eyes: :splatter: :root_vegetable:
|
||||||
|
|
||||||
|
Supports discord custom emoji
|
||||||
|
- <:meowblob:1245470561296187504>
|
||||||
|
- <:catsmile:1271230456188375111>Love<:catsmile:1271230456188375111>:heart:
|
||||||
|
- webp-only animated emoji <a:cubus:1402437389095534623>
|
||||||
|
|
||||||
|
Custom emoji (Persona 3 Reload)
|
||||||
|
- :p3smile: :p3worried: :p3surprised:
|
||||||
|
- :p3arrowup: :p3heart: :p3brokenheart: :p3burger: :p3camera: :p3cat: :p3dog: :p3cloud: :p3cup: :p3moon: :p3fullmoon: :p3pill: :p3rainbow: :p3snowman: :p3star: :p3sun: :p3thumbsup: :p3umbrella: :p3yen:
|
||||||
|
|
||||||
|
### Task Lists
|
||||||
|
|
||||||
|
* [ ] Unchecked task
|
||||||
|
* [x] Checked task
|
||||||
|
* [ ] Another unchecked task
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
* [Inline link](https://www.example.com)
|
||||||
|
* [Link with title](https://www.example.com "Example.com")
|
||||||
|
* <https://www.example.com> (Autolink)
|
||||||
|
|
||||||
|
## Images
|
||||||
|
|
||||||
|
The custom `<voidcannon-harness>` element can be used to render full-width sections.
|
||||||
|
Images will automatically stretch to fill the available width.
|
||||||
|
|
||||||
|
<voidcannon-harness>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</voidcannon-harness>
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Code
|
||||||
|
|
||||||
|
### Inline Code
|
||||||
|
|
||||||
|
* `print("Hello, world!")`
|
||||||
|
|
||||||
|
### Code Blocks
|
||||||
|
|
||||||
|
```python
|
||||||
|
def greet(name):
|
||||||
|
print(f"Hello, {name}!")
|
||||||
|
|
||||||
|
greet("World")
|
||||||
|
```
|
||||||
|
|
||||||
|
This codeblock is expandable to save on space.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import {
|
||||||
|
VoidcannonContentType,
|
||||||
|
VoidcannonSectionType
|
||||||
|
} from "voidcannon";
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";
|
||||||
|
import CollectionContentTransformer from "voidcannon/src/transformers/CollectionContent.transformer.js";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.EDITORIAL,
|
||||||
|
id: "index",
|
||||||
|
name: "Voidcannon Home",
|
||||||
|
description: "Voidcannon Home",
|
||||||
|
color: null,
|
||||||
|
sections: [
|
||||||
|
{
|
||||||
|
type: VoidcannonSectionType.CAROUSEL,
|
||||||
|
content: {
|
||||||
|
_transform: CollectionContentTransformer.id,
|
||||||
|
collection_id: "featured"
|
||||||
|
},
|
||||||
|
label: "Featured Articles",
|
||||||
|
target: "collections/featured"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: VoidcannonSectionType.EDITORIAL,
|
||||||
|
content: {
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN,
|
||||||
|
path: "./content.md"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: VoidcannonSectionType.CONTENT_GRID,
|
||||||
|
content: {
|
||||||
|
_transform: CollectionContentTransformer.id,
|
||||||
|
collection_id: "recent"
|
||||||
|
},
|
||||||
|
label: "Recent Articles"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
function sayHello(name) {
|
||||||
|
console.log("Hello, " + name + "!");
|
||||||
|
}
|
||||||
|
|
||||||
|
sayHello("World");
|
||||||
|
|
||||||
|
function foo(name) {
|
||||||
|
console.log("Hello, " + name + "!");
|
||||||
|
}
|
||||||
|
|
||||||
|
foo("bar");
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
No language specified
|
||||||
|
This is a plain code block.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Advanced Formatting
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Additions and Removals
|
||||||
|
|
||||||
|
Helo// [!code --]
|
||||||
|
Helo// [!code --]
|
||||||
|
Helo// [!code --]
|
||||||
|
Hello// [!code ++]
|
||||||
|
Hello// [!code ++]
|
||||||
|
Hello// [!code ++]
|
||||||
|
|
||||||
|
// Errors and Warnings
|
||||||
|
guh()
|
||||||
|
pluh()// [!code warning]
|
||||||
|
pluhey()// [!code error]
|
||||||
|
|
||||||
|
// Highlighting
|
||||||
|
// [!code highlight:5]
|
||||||
|
dong.expand();
|
||||||
|
// This is a large highlighted section
|
||||||
|
const a = "b";
|
||||||
|
console.log("a" + a);
|
||||||
|
function b(c) {return d;}
|
||||||
|
```
|
||||||
|
|
||||||
|
```diff
|
||||||
|
diff --git a/pages/resources/integration.mdx b/pages/resources/integration.mdx
|
||||||
|
index 21d48f59..49445b53 100644
|
||||||
|
--- a/pages/resources/integration.mdx
|
||||||
|
+++ b/pages/resources/integration.mdx
|
||||||
|
@@ -110,19 +110,22 @@ Integrations represent a connection between a service and a guild. This may incl
|
||||||
|
|
||||||
|
###### GIF Media Format
|
||||||
|
|
||||||
|
-| Value | Description |
|
||||||
|
-| --------- | ------------------------------------ |
|
||||||
|
-| mp4 | MP4 video |
|
||||||
|
-| tinymp4 | MP4 video in a smaller size |
|
||||||
|
-| nanomp4 | MP4 video in a very small size |
|
||||||
|
-| loopedmp4 | MP4 video that loops (same as `mp4`) |
|
||||||
|
-| webm | WebM video |
|
||||||
|
-| tinywebm | WebM video in a smaller size |
|
||||||
|
-| nanowebm | WebM video in a very small size |
|
||||||
|
-| gif | GIF image |
|
||||||
|
-| mediumgif | GIF image in a medium size |
|
||||||
|
-| tinygif | GIF image in a smaller size |
|
||||||
|
-| nanogif | GIF image in a very small size |
|
||||||
|
+| Value | Description | Description | Description |
|
||||||
|
+| --------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
|
||||||
|
+| mp4 | MP4 video | MP4 video | MP4 video |
|
||||||
|
+| tinymp4 | MP4 video in a smaller size | MP4 video in a smaller size | MP4 video in a smaller size |
|
||||||
|
+| nanomp4 | MP4 video in a very small size | MP4 video in a very small size | MP4 video in a very small size |
|
||||||
|
+| loopedmp4 | MP4 video that loops (same as `mp4`) | MP4 video that loops (same as `mp4`) | MP4 video that loops (same as `mp4`) |
|
||||||
|
+| webm | WebM video | WebM video | WebM video |
|
||||||
|
+| tinywebm | WebM video in a smaller size | WebM video in a smaller size | WebM video in a smaller size |
|
||||||
|
+| nanowebm | WebM video in a very small size | WebM video in a very small size | WebM video in a very small size |
|
||||||
|
+| gif | GIF image | GIF image | GIF image |
|
||||||
|
+| mediumgif | GIF image in a medium size | GIF image in a medium size | GIF image in a medium size |
|
||||||
|
+| tinygif | GIF image in a smaller size | GIF image in a smaller size | GIF image in a smaller size |
|
||||||
|
+| nanogif | GIF image in a very small size | GIF image in a very small size | GIF image in a very small size |
|
||||||
|
+| webp | Animated WebP image | Animated WebP image | Animated WebP image |
|
||||||
|
+| tinywebp | Animated WebP image in a smaller size | Animated WebP image in a smaller size | Animated WebP image in a smaller size |
|
||||||
|
+| nanowebp | Animated WebP image in a very small size | Animated WebP image in a very small size | Animated WebP image in a very small size |
|
||||||
|
|
||||||
|
###### Example GIF
|
||||||
|
|
||||||
|
@@ -337,15 +340,17 @@ Returns a list of [GIF](#gif-structure) objects based on the provided query.
|
||||||
|
|
||||||
|
###### Query String Parameters
|
||||||
|
|
||||||
|
-| Field | Type | Description |
|
||||||
|
-| ------------- | ------- | ----------------------------------------------------- |
|
||||||
|
-| q | string | The search query to use |
|
||||||
|
-| limit? ^1^ | integer | The maximum number of GIFs to return (20-500) |
|
||||||
|
-| media_format? | string | The media format to use (default `mediumgif`) |
|
||||||
|
-| locale? | string | The locale to use in search results (default `en-US`) |
|
||||||
|
+| Field | Type | Description |
|
||||||
|
+| ---------------- | ------- | ----------------------------------------------------------- |
|
||||||
|
+| q | string | The search query to use |
|
||||||
|
+| limit? ^1^ | integer | The maximum number of GIFs to return (20-500) (default 100) |
|
||||||
|
+| media_format ^2^ | string | The [media format](#gif-media-format) to use |
|
||||||
|
+| locale? | string | The locale to use in search results (default `en-US`) |
|
||||||
|
|
||||||
|
^1^ The limit is only a suggestion; the API may return fewer GIFs.
|
||||||
|
|
||||||
|
+^2^ Invalid values default to `gif`.
|
||||||
|
+
|
||||||
|
<RouteHeader method="GET" url="/gifs/trending" unauthenticated>
|
||||||
|
Get Trending GIF Categories
|
||||||
|
</RouteHeader>
|
||||||
|
@@ -354,10 +359,10 @@ Returns trending GIF categories and their associated preview GIFs.
|
||||||
|
|
||||||
|
###### Query String Parameters
|
||||||
|
|
||||||
|
-| Field | Type | Description |
|
||||||
|
-| ------------- | ------ | ----------------------------------------------------- |
|
||||||
|
-| media_format? | string | The media format to use (default `mediumgif`) |
|
||||||
|
-| locale? | string | The locale to use in search results (default `en-US`) |
|
||||||
|
+| Field | Type | Description |
|
||||||
|
+| ------------ | ------ | ----------------------------------------------------- |
|
||||||
|
+| media_format | string | The [media format](#gif-media-format) to use |
|
||||||
|
+| locale? | string | The locale to use in search results (default `en-US`) |
|
||||||
|
|
||||||
|
###### Response Body
|
||||||
|
|
||||||
|
@@ -406,11 +411,11 @@ Returns a list of [GIF](#gif-structure) objects that are currently trending.
|
||||||
|
|
||||||
|
###### Query String Parameters
|
||||||
|
|
||||||
|
-| Field | Type | Description |
|
||||||
|
-| ------------- | ------- | ----------------------------------------------------- |
|
||||||
|
-| limit? ^1^ | integer | The maximum number of GIFs to return (20-500) |
|
||||||
|
-| media_format? | string | The media format to use (default `mediumgif`) |
|
||||||
|
-| locale? | string | The locale to use in search results (default `en-US`) |
|
||||||
|
+| Field | Type | Description |
|
||||||
|
+| ------------ | ------- | ----------------------------------------------------- |
|
||||||
|
+| limit? ^1^ | integer | The maximum number of GIFs to return (20-500) |
|
||||||
|
+| media_format | string | The [media format](#gif-media-format) to use |
|
||||||
|
+| locale? | string | The locale to use in search results (default `en-US`) |
|
||||||
|
|
||||||
|
^1^ The limit is only a suggestion; the API may return fewer GIFs.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```protobuf
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package bignutty.pagex;
|
||||||
|
|
||||||
|
🍋🟩
|
||||||
|
|
||||||
|
// Represents preprocessed metadata for pagex media items.
|
||||||
|
message PagexProcessedMedia {
|
||||||
|
// The version of this metadata payload.
|
||||||
|
int32 version = 1;
|
||||||
|
// Preprocessed LQIP value for this media item.
|
||||||
|
int32 lqip = 2;
|
||||||
|
// Attributions
|
||||||
|
repeated PagexMediaAttribution attributions = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// An attribution (copyright, source) for a media item.
|
||||||
|
message PagexMediaAttribution {
|
||||||
|
// Text label (i.e Copyright 2025 bignutty).
|
||||||
|
string label = 1;
|
||||||
|
// URL linking to the original source or author.
|
||||||
|
optional string url = 2;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Horizontal Rule
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Blockquotes
|
||||||
|
|
||||||
|
> This is a blockquote.
|
||||||
|
> It can span multiple lines.
|
||||||
|
> > And even be nested.
|
||||||
|
|
||||||
|
## Tables
|
||||||
|
|
||||||
|
| Header 1 | Header 2 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 | Header 3 |
|
||||||
|
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|
||||||
|
| Cell 1 | Cell 2 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 | Cell 3 |
|
||||||
|
| Cell 4 | Cell 5 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 | Cell 6 |
|
||||||
|
|
||||||
|
## HTML
|
||||||
|
|
||||||
|
<p>This is some HTML text.</p>
|
||||||
|
<marquee>Test</marquee>
|
||||||
|
<voidcannon-cta style="margin-top: 1em;">
|
||||||
|
<md-icon slot="icon">convert_to_text</md-icon>
|
||||||
|
this is a cta rendered from a markdown document
|
||||||
|
<button slot="button">pluh</button>
|
||||||
|
</voidcannon-cta>
|
||||||
|
<br>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
## Line Breaks
|
||||||
|
|
||||||
|
This is a line.<br>
|
||||||
|
This is another line.
|
||||||
|
|
||||||
|
## Escaping
|
||||||
|
|
||||||
|
\* \* \* \* \*
|
||||||
|
|
||||||
|
## Special Characters
|
||||||
|
|
||||||
|
` ~ ! @ # $ % ^ & * ( ) - _ = + [ ] { } | ; : ' " , . / < > ?
|
||||||
BIN
src/content/articles/playground/media/enemy.jpg
Normal file
|
After Width: | Height: | Size: 426 KiB |
BIN
src/content/articles/playground/media/joker.jpg
Normal file
|
After Width: | Height: | Size: 216 KiB |
BIN
src/content/articles/playground/media/menu.jpg
Normal file
|
After Width: | Height: | Size: 391 KiB |
64
src/content/articles/playground/playground.pagex.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import {
|
||||||
|
VoidcannonHeaderLayoutType,
|
||||||
|
VoidcannonHeaderType,
|
||||||
|
VoidcannonContentType,
|
||||||
|
VoidcannonEmojiStyle
|
||||||
|
} from "voidcannon";
|
||||||
|
|
||||||
|
import bignutty from "../../authors/bignutty.pagex.js";
|
||||||
|
|
||||||
|
import testCollection from "../../collections/test.pagex.js";
|
||||||
|
import featuredCollection from "../../collections/_featured.pagex.js";
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.ARTICLE,
|
||||||
|
content: {
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN,
|
||||||
|
path: "./content.md"
|
||||||
|
},
|
||||||
|
id: "playground",
|
||||||
|
title: "Playground Test Article",
|
||||||
|
created_at: Date.now(),
|
||||||
|
abstract: "Article to quickly run tests for all pagex markdown features. Abstract has a lot of filler and padding to test if css limits work as intended across all surfaces.",
|
||||||
|
cta: "View Test Article!",
|
||||||
|
theme: {
|
||||||
|
emoji_style: VoidcannonEmojiStyle.FLUENT_FLAT,
|
||||||
|
colors: {
|
||||||
|
light: "#D02843",
|
||||||
|
dark: "#c7f718",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
type: VoidcannonHeaderType.IMMERSIVE,
|
||||||
|
layout: VoidcannonHeaderLayoutType.TEXT,
|
||||||
|
label: "Article Title :catsmile:",
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/background.png"
|
||||||
|
},
|
||||||
|
immersive_content: {
|
||||||
|
left: {
|
||||||
|
base: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_left/full.png"
|
||||||
|
},
|
||||||
|
outer: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_left/outer_v2.png"
|
||||||
|
},
|
||||||
|
inner: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "./assets/header/immersive_left/base_v2.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
color: "#c7f718"
|
||||||
|
},
|
||||||
|
authors: [bignutty],
|
||||||
|
collections: [
|
||||||
|
testCollection.id,
|
||||||
|
featuredCollection.id
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
src/content/authors/assets/bignutty.png
Normal file
|
After Width: | Height: | Size: 105 KiB |
14
src/content/authors/bignutty.pagex.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import {PagexResourceType, PagexResourceTransformer} from "pagex";
|
||||||
|
import {VoidcannonContentType} from "voidcannon";
|
||||||
|
import {file} from "pagex/src/utils.js";
|
||||||
|
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.AUTHOR,
|
||||||
|
id: "bignutty",
|
||||||
|
name: "bignutty",
|
||||||
|
avatar: {
|
||||||
|
_transform: PagexResourceTransformer.MEDIA,
|
||||||
|
path: "/content/authors/assets/bignutty.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/content/collections/_featured.pagex.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {VoidcannonCollectionIconType, VoidcannonCollectionType, VoidcannonContentType} from "voidcannon";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.COLLECTION,
|
||||||
|
collection_type: VoidcannonCollectionType.HIDDEN,
|
||||||
|
id: "featured",
|
||||||
|
name: "Featured Content",
|
||||||
|
description: "Featured Content Collection",
|
||||||
|
icon: {
|
||||||
|
type: VoidcannonCollectionIconType.ICON,
|
||||||
|
icon: "star"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/content/collections/test.pagex.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {VoidcannonCollectionColor, VoidcannonCollectionIconType, VoidcannonContentType} from "voidcannon";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.COLLECTION,
|
||||||
|
id: "test",
|
||||||
|
name: "Test Collection",
|
||||||
|
description: "contains testing articles",
|
||||||
|
color: VoidcannonCollectionColor.YELLOW_VIBRANT,
|
||||||
|
icon: {
|
||||||
|
type: VoidcannonCollectionIconType.EMOJI,
|
||||||
|
emoji: "🥰"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/content/collections/videogames.pagex.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {VoidcannonCollectionColor, VoidcannonCollectionIconType, VoidcannonContentType} from "voidcannon";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.COLLECTION,
|
||||||
|
id: "videogames",
|
||||||
|
name: "Video Games",
|
||||||
|
description: "Video Game Articles",
|
||||||
|
color: VoidcannonCollectionColor.RED_VIBRANT,
|
||||||
|
icon: {
|
||||||
|
type: VoidcannonCollectionIconType.ICON,
|
||||||
|
icon: "stadia_controller"
|
||||||
|
}
|
||||||
|
}
|
||||||
9
src/content/editorial/home/content.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Voidcannon
|
||||||
|
|
||||||
|
a modern blogging frontend, powered by **pagex**.
|
||||||
|
|
||||||
|
## Test Articles
|
||||||
|
|
||||||
|
- [playground](./playground)
|
||||||
|
- [p3](./playground-p3)
|
||||||
|
- [totk](./playground-totk)
|
||||||
71
src/content/editorial/home/home.pagex.js
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import {
|
||||||
|
VoidcannonContentType,
|
||||||
|
VoidcannonSectionType
|
||||||
|
} from "voidcannon";
|
||||||
|
|
||||||
|
import {PagexResourceTransformer} from "pagex";
|
||||||
|
import CollectionContentTransformer from "voidcannon/src/transformers/CollectionContent.transformer.js";
|
||||||
|
import RecentContentTransformer from "voidcannon/src/transformers/RecentContent.transformer.js";
|
||||||
|
import ContentByIdentifierTransformer from "voidcannon/src/transformers/ContentByIdentifier.transformer.js";
|
||||||
|
import playground from "../../articles/playground/playground.pagex.js";
|
||||||
|
import playgroundP3 from "../../articles/playground-p3/playground-p3.pagex.js";
|
||||||
|
import playgroundTotk from "../../articles/playground-totk/playground-totk.pagex.js";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: VoidcannonContentType.EDITORIAL,
|
||||||
|
id: "index",
|
||||||
|
name: "Voidcannon Home",
|
||||||
|
description: "Voidcannon Home",
|
||||||
|
color: null,
|
||||||
|
sections: [
|
||||||
|
{
|
||||||
|
type: VoidcannonSectionType.STORY_HERO,
|
||||||
|
content: {
|
||||||
|
_transform: ContentByIdentifierTransformer.id,
|
||||||
|
content_ids: [
|
||||||
|
playgroundP3.id,
|
||||||
|
playground.id,
|
||||||
|
playgroundTotk.id
|
||||||
|
],
|
||||||
|
// TODO: implement this
|
||||||
|
content_types: [
|
||||||
|
VoidcannonContentType.ARTICLE
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: VoidcannonSectionType.CAROUSEL,
|
||||||
|
content: {
|
||||||
|
_transform: CollectionContentTransformer.id,
|
||||||
|
collection_id: "featured"
|
||||||
|
},
|
||||||
|
label: "Various Articles",
|
||||||
|
target: "collections/featured"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: VoidcannonSectionType.EDITORIAL,
|
||||||
|
content: {
|
||||||
|
_transform: PagexResourceTransformer.MARKDOWN,
|
||||||
|
path: "./content.md"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: VoidcannonSectionType.CONTENT_GRID,
|
||||||
|
content: {
|
||||||
|
_transform: CollectionContentTransformer.id,
|
||||||
|
collection_id: "test"
|
||||||
|
},
|
||||||
|
label: "Testing Articles",
|
||||||
|
icon: "forklift"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: VoidcannonSectionType.CONTENT_GRID,
|
||||||
|
content: {
|
||||||
|
_transform: RecentContentTransformer.id,
|
||||||
|
amount: 15
|
||||||
|
},
|
||||||
|
label: "Recent Articles",
|
||||||
|
icon: "history"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||