diff --git a/astro.config.mjs b/astro.config.mjs index b271412..3a126ba 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -3,7 +3,6 @@ import { defineConfig } from 'astro/config' import react from '@astrojs/react' import markdoc from '@astrojs/markdoc' -// Only import keystatic and node in development let keystatic, node if (process.env.NODE_ENV !== 'production') { diff --git a/keystatic.config.ts b/keystatic.config.ts index 8abdf6c..3e2858c 100644 --- a/keystatic.config.ts +++ b/keystatic.config.ts @@ -1,19 +1,16 @@ -import { config, fields, collection } from '@keystatic/core'; +import { config } from '@keystatic/core' + +import { TagsCollection } from './src/definitions/collections/system/tags.ts' +import { AuthorsCollection } from './src/definitions/collections/system/authors.ts' +import { MetaPostsCollection } from './src/definitions/collections/meta/posts.ts' export default config({ storage: { kind: 'local', }, collections: { - posts: collection({ - label: 'Posts', - slugField: 'title', - path: 'src/content/posts/*', - format: { contentField: 'content' }, - schema: { - title: fields.slug({ name: { label: 'Title' } }), - content: fields.markdoc({ label: 'Content' }), - }, - }), + tags: TagsCollection, + authors: AuthorsCollection, + meta_posts: MetaPostsCollection, }, -}); \ No newline at end of file +}) diff --git a/package-lock.json b/package-lock.json index 9399719..5d7e7a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@fontsource/iosevka-aile": "^5.2.5", "@keystatic/astro": "^5.0.6", "@keystatic/core": "^0.5.48", + "@markdoc/markdoc": "^0.5.4", "@types/react": "^19.1.12", "@types/react-dom": "^19.1.9", "astro": "^5.13.5", @@ -39,6 +40,7 @@ "postcss-preset-env": "^10.3.1", "postcss-utilities": "^0.8.4", "prettier": "^3.6.2", + "prettier-plugin-astro": "^0.14.1", "stylelint": "^16.23.1", "stylelint-config-clean-order": "^7.0.0", "stylelint-config-html": "^1.1.0", @@ -12519,6 +12521,21 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-plugin-astro": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.14.1.tgz", + "integrity": "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.9.1", + "prettier": "^3.0.0", + "sass-formatter": "^0.7.6" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" + } + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -13302,6 +13319,13 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/s.color": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", + "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", + "dev": true, + "license": "MIT" + }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -13336,6 +13360,16 @@ ], "license": "MIT" }, + "node_modules/sass-formatter": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.9.tgz", + "integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "suf-log": "^2.5.3" + } + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", @@ -14129,6 +14163,16 @@ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", "license": "MIT" }, + "node_modules/suf-log": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", + "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "dev": true, + "license": "MIT", + "dependencies": { + "s.color": "0.0.15" + } + }, "node_modules/superstruct": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", diff --git a/package.json b/package.json index 89e7d25..7645b22 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@fontsource/iosevka-aile": "^5.2.5", "@keystatic/astro": "^5.0.6", "@keystatic/core": "^0.5.48", + "@markdoc/markdoc": "^0.5.4", "@types/react": "^19.1.12", "@types/react-dom": "^19.1.9", "astro": "^5.13.5", @@ -42,6 +43,7 @@ "postcss-preset-env": "^10.3.1", "postcss-utilities": "^0.8.4", "prettier": "^3.6.2", + "prettier-plugin-astro": "^0.14.1", "stylelint": "^16.23.1", "stylelint-config-clean-order": "^7.0.0", "stylelint-config-html": "^1.1.0", diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..d061a3e --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,26 @@ +import { defineCollection } from 'astro:content' + +import { TagsCollectionSchema } from '../definitions/collections/system/tags.ts' +import { AuthorsCollectionSchema } from '../definitions/collections/system/authors.ts' +import { MetaPostCollectionSchema } from '../definitions/collections/meta/posts.ts' + +const tags = defineCollection({ + type: 'data', + schema: TagsCollectionSchema, +}) + +const authors = defineCollection({ + type: 'data', + schema: AuthorsCollectionSchema, +}) + +const meta_posts = defineCollection({ + type: 'content', + schema: MetaPostCollectionSchema, +}) + +export const collections = { + tags, + authors, + meta_posts, +} diff --git a/src/content/system/authors/dave-damage.json b/src/content/system/authors/dave-damage.json new file mode 100644 index 0000000..becd414 --- /dev/null +++ b/src/content/system/authors/dave-damage.json @@ -0,0 +1,5 @@ +{ + "name": "Dave Damage", + "avatar": "avatar.jpeg", + "description": "Nothing nice 2 say" +} diff --git a/src/content/system/authors/dave-damage/avatar.jpeg b/src/content/system/authors/dave-damage/avatar.jpeg new file mode 100644 index 0000000..225d6ac Binary files /dev/null and b/src/content/system/authors/dave-damage/avatar.jpeg differ diff --git a/src/content/system/tags/rant-against-the-machine.json b/src/content/system/tags/rant-against-the-machine.json new file mode 100644 index 0000000..80045dc --- /dev/null +++ b/src/content/system/tags/rant-against-the-machine.json @@ -0,0 +1,4 @@ +{ + "name": "Rant against the Machine", + "description": "A just world is a sane world. There is nothing sane about this." +} diff --git a/src/content/system/tags/was-ist-was.json b/src/content/system/tags/was-ist-was.json new file mode 100644 index 0000000..52fc2fc --- /dev/null +++ b/src/content/system/tags/was-ist-was.json @@ -0,0 +1,4 @@ +{ + "name": "Was ist Was", + "description": "Where we look at new things, things we don't understand, and things we hate because they are new" +} diff --git a/src/content/the-metatron/kitchensink.mdoc b/src/content/the-metatron/kitchensink.mdoc new file mode 100644 index 0000000..1b5a769 --- /dev/null +++ b/src/content/the-metatron/kitchensink.mdoc @@ -0,0 +1,23 @@ +--- +title: Kitchensink +summary: Where we style Styles and look and things +publishing: + status: draft + cover: + alt: >- + Dude eviscatering a stranded whale with a chainsaw... because i don'T have + a better picture yet. Don'T you judge me! + featured: false + tags: + - was-ist-was + - rant-against-the-machine + author: dave-damage +seo: + metaTitle: Dame DMG – Kitchensink + metaDescription: Where we take a look at styling and designing the page + keywords: [] + noIndex: true +--- +ads + +`jkhlkjh. ihlkj h lkjhlk.jh l zuti76trf. Claude is a spazz!` diff --git a/src/definitions/collections/meta/posts.ts b/src/definitions/collections/meta/posts.ts new file mode 100644 index 0000000..b0ad59f --- /dev/null +++ b/src/definitions/collections/meta/posts.ts @@ -0,0 +1,14 @@ +import { collection } from '@keystatic/core' +import { articleFields, articleFieldSchema } from '../../fields/article.ts' + +export const MetaPostsCollection = collection({ + label: 'Meta – Posts', + slugField: 'title', + path: 'src/content/the-metatron/*', + format: { contentField: 'content' }, + schema: { + ...articleFields, + }, +}) + +export const MetaPostCollectionSchema = articleFieldSchema diff --git a/src/definitions/collections/system/authors.ts b/src/definitions/collections/system/authors.ts new file mode 100644 index 0000000..844c37b --- /dev/null +++ b/src/definitions/collections/system/authors.ts @@ -0,0 +1,20 @@ +import { collection, fields } from '@keystatic/core' +import { z } from 'zod' + +export const AuthorsCollection = collection({ + label: 'Authors', + slugField: 'name', + path: 'src/content/system/authors/*', + format: { data: 'json' }, + schema: { + name: fields.slug({ name: { label: 'Name' } }), + avatar: fields.image({ label: 'Avatar' }), + description: fields.text({ label: 'Description', multiline: true }), + }, +}) + +export const AuthorsCollectionSchema = z.object({ + name: z.string(), + avatar: z.string().optional(), + description: z.string().optional(), +}) diff --git a/src/definitions/collections/system/tags.ts b/src/definitions/collections/system/tags.ts new file mode 100644 index 0000000..39a3a54 --- /dev/null +++ b/src/definitions/collections/system/tags.ts @@ -0,0 +1,20 @@ +import { collection, fields } from '@keystatic/core' +import { z } from 'zod' + +export const TagsCollection = collection({ + label: 'Tags', + slugField: 'name', + path: 'src/content/system/tags/*', + format: { data: 'json' }, + schema: { + name: fields.slug({ name: { label: 'Name' } }), + icon: fields.image({ label: 'Icon' }), + description: fields.text({ label: 'Description', multiline: true }), + }, +}) + +export const TagsCollectionSchema = z.object({ + name: z.string(), + icon: z.string().optional(), + description: z.string().optional(), +}) diff --git a/src/definitions/fields/article.ts b/src/definitions/fields/article.ts new file mode 100644 index 0000000..8318f0d --- /dev/null +++ b/src/definitions/fields/article.ts @@ -0,0 +1,21 @@ +import { fields } from '@keystatic/core' +import { z } from 'zod' + +import { publishingField, publishingFieldSchema } from './publishing.ts' +import { seoField, seoFieldSchema } from './seo.ts' + +export const articleFields = { + title: fields.slug({ name: { label: 'Title' } }), + summary: fields.text({ label: 'Summary', multiline: true }), + publishing: publishingField, + seo: seoField, + content: fields.markdoc({ label: 'Content' }), +} + +export const articleFieldSchema = z.object({ + title: z.string(), + summary: z.string().optional(), + publishing: publishingFieldSchema, + seo: seoFieldSchema, + content: z.string().optional(), +}) diff --git a/src/definitions/fields/publishing.ts b/src/definitions/fields/publishing.ts new file mode 100644 index 0000000..983b4e6 --- /dev/null +++ b/src/definitions/fields/publishing.ts @@ -0,0 +1,64 @@ +import { fields } from '@keystatic/core' +import { z } from 'zod' + +export const publishingField = fields.object( + { + publishDate: fields.date({ label: 'Publish Date' }), + editDate: fields.date({ label: 'Edit Date' }), + status: fields.select({ + label: 'Status', + options: [ + { label: 'Draft', value: 'draft' }, + { label: 'Published', value: 'published' }, + { label: 'Archived', value: 'archived' }, + ], + defaultValue: 'draft', + }), + cover: fields.object( + { + src: fields.image({ label: 'Image' }), + alt: fields.text({ label: 'Alt' }), + }, + { + label: 'Cover', + } + ), + featured: fields.checkbox({ + label: 'Featured', + description: 'Show on Homepage', + }), + tags: fields.array( + fields.relationship({ + label: 'Tags', + collection: 'tags', + }), + { + label: 'Tags', + itemLabel: (props) => props.value || 'Select Tag', + } + ), + author: fields.relationship({ + label: 'Author', + collection: 'authors', + }), + }, + { + label: 'Publishing', + layout: [4, 4, 4, 12, 12, 12, 12], + } +) + +export const publishingFieldSchema = z.object({ + publishDate: z.date().optional(), + editDate: z.date().optional(), + status: z.enum(['draft', 'published', 'archived']), + cover: z + .object({ + src: z.string(), + alt: z.string(), + }) + .optional(), + featured: z.boolean().default(false), + tags: z.array(z.string()).optional(), + author: z.string().optional(), +}) diff --git a/src/definitions/fields/seo.ts b/src/definitions/fields/seo.ts new file mode 100644 index 0000000..36e324d --- /dev/null +++ b/src/definitions/fields/seo.ts @@ -0,0 +1,33 @@ +import { fields } from '@keystatic/core' +import { z } from 'zod' + +export const seoField = fields.object( + { + metaTitle: fields.text({ + label: 'Meta Title', + validation: { length: { max: 60 } }, + }), + metaDescription: fields.text({ + label: 'Meta Description', + multiline: true, + validation: { length: { max: 160 } }, + }), + keywords: fields.array(fields.text({ label: 'Keyword' }), { + label: 'SEO Keywords', + }), + noIndex: fields.checkbox({ + label: 'No Index', + description: 'Prevent search engines from indexing', + }), + }, + { + label: 'SEO Settings', + } +) + +export const seoFieldSchema = z.object({ + metaTitle: z.string().optional(), + metaDescription: z.string().optional(), + keywords: z.array(z.string()).optional(), + noIndex: z.boolean().default(false), +}) diff --git a/src/pages/index.astro b/src/pages/index.astro index 3d6e05e..c66456b 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -5,169 +5,309 @@ import Layout from '../layouts/base.astro'

Rods pursued studies dearer dangers Mellon spears lodgings.

-

Language Sméagol where? Forest cesspits talked reclaim verse dungeon Envenom 60 then venerable prolonging! There is only one Lord of the Ring.

+

+ Language Sméagol where? Forest cesspits talked reclaim verse dungeon + Envenom 60 then venerable prolonging! There is only one Lord of the Ring. +

Breeding job clothing talks caught Freda trust.

-

East dry because slinker deeper quarry knocks Sit. Treachery Front whim. Even the smallest person can change the course of the future.

+

+ East dry because slinker deeper quarry knocks Sit. Treachery Front whim. + Even the smallest person can change the course of the future. +

Fence Toby reaction greed fired parting!

-

Do not take me for some conjurer of cheap tricks. Room aged Hobbitses! Wall odds force simply shield hmm Tuckborough pearl privilege grows. Ride amazing seeps lake guardian pretty Arwen retrieve stroke steps?

+

+ Do not take me for some conjurer of cheap tricks. Room aged Hobbitses! + Wall odds force simply shield hmm Tuckborough pearl privilege grows. Ride + amazing seeps lake guardian pretty Arwen retrieve stroke steps? +

Maggot devils tea resisted person Sauron the White mist.

-

You shall not pass! Pelennor squash least crunchable feel faithless years well-done fun. Rock ending almost shared extend crooked alliances possible nightfall Dwarf fine risky.

+

+ You shall not pass! Pelennor squash least crunchable feel faithless years + well-done fun. Rock ending almost shared extend crooked alliances possible + nightfall Dwarf fine risky. +

    -
  1. Character Creation Process - The systematic approach to developing a playable character including attribute generation, skill selection, equipment procurement, and background development that establishes the foundation for all future adventures.
  2. -
  3. Combat Rules and Tactical Systems +
  4. + Character Creation Process - The systematic approach to developing a + playable character including attribute generation, skill selection, + equipment procurement, and background development that establishes the + foundation for all future adventures. +
  5. +
  6. + Combat Rules and Tactical Systems
      -
    1. Initiative Phase Determination - The method by which turn order is established at the beginning of combat encounters, typically involving dice rolls modified by relevant characteristics and environmental factors.
    2. -
    3. Action Resolution Mechanics and Probability Systems +
    4. + Initiative Phase Determination - The method by which turn order is + established at the beginning of combat encounters, typically + involving dice rolls modified by relevant characteristics and + environmental factors. +
    5. +
    6. + Action Resolution Mechanics and Probability Systems
        -
      1. Roll percentile dice against relevant skill values - The core mechanic requiring players to generate random numbers between 1 and 100 and compare the result to their character's applicable skill rating.
      2. -
      3. Compare results to skill values and apply situational modifiers +
      4. + Roll percentile dice against relevant skill values - The core + mechanic requiring players to generate random numbers between 1 + and 100 and compare the result to their character's applicable + skill rating. +
      5. +
      6. + Compare results to skill values and apply situational modifiers
          -
        1. Success conditions require rolling under the target skill value after applying all relevant bonuses and penalties from equipment, positioning, and environmental conditions.
        2. -
        3. Failure occurs when the dice result exceeds the modified skill value, resulting in missed attacks, failed attempts, or other negative outcomes depending on the specific action attempted.
        4. -
        5. Critical results happen on natural rolls of 01-05 for automatic success or 96-00 for catastrophic failure, regardless of skill levels or modifiers applied to the attempt.
        6. +
        7. + Success conditions require rolling under the target skill + value after applying all relevant bonuses and penalties from + equipment, positioning, and environmental conditions. +
        8. +
        9. + Failure occurs when the dice result exceeds the modified + skill value, resulting in missed attacks, failed attempts, + or other negative outcomes depending on the specific action + attempted. +
        10. +
        11. + Critical results happen on natural rolls of 01-05 for + automatic success or 96-00 for catastrophic failure, + regardless of skill levels or modifiers applied to the + attempt. +
      7. -
      8. Apply environmental modifiers, equipment bonuses, and situational penalties that reflect the current tactical situation and the character's preparation level for the specific challenge being attempted.
      9. +
      10. + Apply environmental modifiers, equipment bonuses, and + situational penalties that reflect the current tactical + situation and the character's preparation level for the specific + challenge being attempted. +
    7. -
    8. Damage Resolution and Wound Tracking - The system for determining injury severity, applying armor protection values, and tracking the cumulative effects of combat damage on character performance and survival.
    9. +
    10. + Damage Resolution and Wound Tracking - The system for determining + injury severity, applying armor protection values, and tracking the + cumulative effects of combat damage on character performance and + survival. +
  7. -
  8. Experience and Advancement Systems - The mechanisms by which characters improve their capabilities over time through successful completion of adventures, skill usage, and deliberate training between expeditions.
  9. +
  10. + Experience and Advancement Systems - The mechanisms by which characters + improve their capabilities over time through successful completion of + adventures, skill usage, and deliberate training between expeditions. +
  1. Spent begins Saruman become interrupt thing arts wide.
  2. Barad-dûr gives forest worm closer.
  3. Comings mission province Haleth character chill special service?
  4. -
  5. Fine mean hours triumph loyal jelly league someone's raze Bagshot!
  6. +
  7. + Fine mean hours triumph loyal jelly league someone's raze Bagshot! +
  8. Bars ostler crack spreads should spring too dissuade s World.

Else ah Bolger torment minutes hours.

-

Possibly Moon effect utterly tipsy overcrowd next misplaced? Covet parting Brandybuck hungers crevice hours pork haven't tempted clothing. All right, then. Keep your secrets.

+

+ Possibly Moon effect utterly tipsy overcrowd next misplaced? Covet parting + Brandybuck hungers crevice hours pork haven't tempted clothing. All right, + then. Keep your secrets. +

- - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + +
UnfoldGrumblingAgoLifetimePillaged
UnfoldGrumblingAgoLifetimePillaged
Ladwhiparrowsfairerbeggedstabs
Appreciationtrouble-makingalonehorridprovethey'll
Filthytombsvesttorchesbarrelspowerful
Insteadforetoldranksstarejoyunequaled
Knewrelationsfightingspiritsgongsbears
Seasoningnutone'sapprovegrayblessing
Ladwhiparrowsfairerbeggedstabs
Appreciationtrouble-makingalonehorridprovethey'll
Filthytombsvesttorchesbarrelspowerful
Insteadforetoldranksstarejoyunequaled
Knewrelationsfightingspiritsgongsbears
Seasoningnutone'sapprovegrayblessing
beheadingdisturberlaidforthwatchingdomains
beheadingdisturberlaidforthwatchingdomains

Sodding tongue Elros leaves perceived south pocket.

-

Born revenge utterly that'll Goblin-town gladness. Chips sustained times apocalypse closest Alfrid grow. I can cut across country easily enough. Clearing toss unhappy Smeagol's gifted?

+

+ Born revenge utterly that'll Goblin-town gladness. Chips sustained times + apocalypse closest Alfrid grow. I can cut across country easily enough. + Clearing toss unhappy Smeagol's gifted? +

Sam... I'm glad you are with me.

—Ravens, shore wizards skin harpoon
- Industrial machinery in abandoned factory -
Rusted conveyor systems in the former Blackwater Manufacturing plant, photographed during demolition in 2023.
-
+ Industrial machinery in abandoned factory +
+ Rusted conveyor systems in the former Blackwater Manufacturing plant, + photographed during demolition in 2023. +
+
-

More glad painted Sauron the White troop holidays captive has. Many pierced repel bathroom absence glimpse Tom. All right, then. Keep your secrets.

+

+ More glad painted Sauron the White troop holidays captive has. Many + pierced repel bathroom absence glimpse Tom. All right, then. Keep your + secrets. +

-
Common saying among veteran adventurers in the Undercity.
+
+ Common saying among veteran adventurers in the Undercity. +
Equipment Requirements -

All adventurers must carry a minimum of: one weapon (melee or ranged), basic armor or protective gear, emergency rations for 3 days, torch or light source, 50 feet of rope, and a first aid kit.

-

Optional but recommended: lockpicks, crowbar, grappling hook, healing potions, and backup weapon.

+

+ All adventurers must carry a minimum of: one weapon (melee or ranged), + basic armor or protective gear, emergency rations for 3 days, torch or + light source, 50 feet of rope, and a first aid kit. +

+

+ Optional but recommended: lockpicks, crowbar, grappling hook, healing + potions, and backup weapon. +

@@ -176,7 +316,10 @@ import Layout from '../layouts/base.astro'

Roll 1d10 + Initiative characteristic. Highest goes first.

Attack Resolution

-

Roll percentile dice under your relevant skill. Success means you hit, failure means you miss.

+

+ Roll percentile dice under your relevant skill. Success means you hit, + failure means you miss. +

  • Melee combat uses Weapon Skill
  • @@ -187,20 +330,52 @@ import Layout from '../layouts/base.astro'
    Currently Expanded Section -

    This details element starts open to test the expanded state styling.

    +

    + This details element starts open to test the expanded state styling. +

    -
    Raised Morgoth powerless roaming sing fire-breather regurgitation was.
    -

    More glad painted Sauron the White troop holidays captive has. Many pierced repel bathroom absence glimpse Tom. All right, then. Keep your secrets.

    +
    + Raised Morgoth powerless roaming sing fire-breather regurgitation was. +
    +

    + More glad painted Sauron the White troop holidays captive has. Many + pierced repel bathroom absence glimpse Tom. All right, then. Keep your + secrets. +

    Prepared Tilda adventure characters crush. Wilds overlook blessed walk requested. Ligulas sat eavesdropping breathes exceeding dim. Deeper clever becomes regain Dimholt fronts.
    Resilient closest regret vile birthright innards Middle-earth.
    -

    Shire herald dear hard army carry without proposition. Thranduil faint me chiefest middle hey-diddle-diddle squeaked sawed landlord. Hallway clot-head's injury journey Minas Morgul hasty? Ring sight fit Boffins S. Manage Bifur ways pity's swarming doubt. Wilderness breathing woe liege Khazad-dum King's handy! Join corpses rack tongs knockers gongs four-day Théoden's idiot. Hooded Kingsfoil biding may. Extra passion cutting skinned. Hurry problem delays Bucklebury. Corks hell hundred deal Barahir unprepared. What'll Dwarvish down bought haunted steps. Master's given Hobbit afterwards bodies gibbet. Towers stars productive Baggins. Juicy opinion note Déagol tough books spreads. Decide imaginable Goblin-mutant Silvan fellow. Sit Agreed thick drink pearl tale. Legolas approve night's retrieve endless.

    -
    +

    + Shire herald dear hard army carry without proposition. Thranduil + faint me chiefest middle hey-diddle-diddle squeaked sawed landlord. Hallway clot-head's injury journey Minas Morgul hasty? Ring sight fit Boffins S. Manage + Bifur ways pity's swarming doubt. Wilderness breathing woe liege + Khazad-dum King's handy! Join corpses rack tongs knockers gongs four-day Théoden's idiot. Hooded Kingsfoil biding may. Extra passion cutting skinned. Hurry problem delays Bucklebury. Corks + hell hundred deal Barahir unprepared. What'll Dwarvish down + bought haunted steps. Master's given Hobbit afterwards bodies gibbet. Towers stars productive Baggins. Juicy opinion note Déagol tough books spreads. Decide imaginable Goblin-mutant Silvan fellow. Sit Agreed thick drink pearl tale. Legolas approve night's + retrieve endless. +

    +
    How
    -
    Looks resilient eggs Tauriel higher supplant evisceration idiot barely.
    +
    + Looks resilient eggs Tauriel higher supplant evisceration idiot barely. +
    Names
    Slugs play Dwalin late parapet ending how morning?
    -
    Holidays even disease thunder-battle nice irregular cooked trouble'll Minas Tirith mistaken!
    +
    + Holidays even disease thunder-battle nice irregular cooked trouble'll + Minas Tirith mistaken! +
    Mice
    Productive Sit mend ones raiding hutch couldn't thirty-four.
    Facing others act doing lives usually pity Legolas laws daughter.
    @@ -211,47 +386,47 @@ import Layout from '../layouts/base.astro' Need bandy council
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    @@ -262,45 +437,45 @@ import Layout from '../layouts/base.astro' Wring moments
    - +
    - +
    - +
    - +
    - +
    - +
    - - - + + +
    - +
    - +
    - +
    - +
    diff --git a/src/pages/the-metatron/[...slug].astro b/src/pages/the-metatron/[...slug].astro new file mode 100644 index 0000000..49d6fbe --- /dev/null +++ b/src/pages/the-metatron/[...slug].astro @@ -0,0 +1,73 @@ +--- +export const prerender = true + +import { createReader } from '@keystatic/core/reader' +import keystaticConfig from '../../../keystatic.config' +import Markdoc from '@markdoc/markdoc' + +export async function getStaticPaths() { + const reader = createReader(process.cwd(), keystaticConfig) + const slugs = await reader.collections['meta_posts'].list() + + return slugs.map((slug) => ({ + params: { slug }, + props: { slug }, + })) +} + +const { slug } = Astro.props +const reader = createReader(process.cwd(), keystaticConfig) +const post = await reader.collections['meta_posts'].read(slug) + +// Render Markdoc content +const contentAst = await post.content() +const astNode = contentAst.node +const transformed = Markdoc.transform(astNode) +const htmlContent = Markdoc.renderers.html(transformed) +--- + + + + {post.title} + {post.seo?.metaTitle && {post.seo.metaTitle}} + { + post.seo?.metaDescription && ( + + ) + } + {post.seo?.noIndex && } + + +
    +
    +
    +

    {post.title}

    + {post.summary &&

    {post.summary}

    } + +
    + {post.publishing?.status} + { + post.publishing?.publishDate && ( + + ) + } +
    +
    + +
    + + { + post.publishing?.tags && post.publishing.tags.length > 0 && ( + + ) + } +
    +
    + +