diff --git a/.github/workflows/npm-theme-brutalbyelian.yml b/.github/workflows/npm-theme-brutalbyelian.yml
new file mode 100644
index 00000000..fe6a56df
--- /dev/null
+++ b/.github/workflows/npm-theme-brutalbyelian.yml
@@ -0,0 +1,52 @@
+name: NPM-Theme (Brutal By Elian)
+
+on:
+ workflow_dispatch:
+
+jobs:
+ publishnpm:
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: ./packages/astro-ghostcms-brutalbyelian
+ steps:
+ - name: checkout
+ uses: actions/checkout@v4
+ - name: node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ registry-url: https://registry.npmjs.org/
+ - name: publish-npm
+ run: |
+ # Change publish registry
+ echo "$(jq '.publishConfig.registry = "https://registry.npmjs.org"' package.json)" > package.json
+ # Publish package
+ npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
+
+ githubpackage:
+ permissions:
+ contents: read
+ packages: write
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: ./packages/astro-ghostcms-brutalbyelian
+ steps:
+ - name: checkout
+ uses: actions/checkout@v4
+ - name: node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ registry-url: https://npm.pkg.github.com
+ - name: publish-github
+ run: |
+ # Change publish registry
+ echo "$(jq '.publishConfig.registry = "https://npm.pkg.github.com"' package.json)" > package.json
+ # Publish package
+ npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{secrets.ACTION_TOKEN}}
diff --git a/packages/astro-ghostcms-brutalbyelian/brutalunocss-preset.ts b/packages/astro-ghostcms-brutalbyelian/brutalunocss-preset.ts
new file mode 100644
index 00000000..97c23f3f
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/brutalunocss-preset.ts
@@ -0,0 +1,21 @@
+import { definePreset, presetIcons,
+ presetWind, presetTypography } from 'unocss';
+
+export default definePreset(() => {
+ return {
+ name: 'brutalTheme',
+ presets: [
+ presetWind(),
+ presetIcons({
+ collections: {
+ //@ts-expect-error
+ logos: () =>
+ import('@iconify-json/logos/icons.json').then((i) => i.default),
+ uil: () =>
+ import('@iconify-json/uil/icons.json').then((l) => l.default),
+ },
+ }),
+ presetTypography(),
+ ]
+ }
+})
\ No newline at end of file
diff --git a/packages/astro-ghostcms-brutalbyelian/package.json b/packages/astro-ghostcms-brutalbyelian/package.json
new file mode 100644
index 00000000..b09e3755
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/package.json
@@ -0,0 +1,69 @@
+{
+ "name": "@matthiesenxyz/astro-ghostcms-brutalbyelian",
+ "description": "ElianCodes Brutal theme modified to work with Astro-GhostCMS",
+ "version": "0.0.1",
+ "homepage": "https://astro-ghostcms.xyz/",
+ "type": "module",
+ "license": "MIT",
+ "publishConfig": {
+ "access": "public"
+ },
+ "sideEffects": false,
+ "author": {
+ "email": "adam@matthiesen.xyz",
+ "name": "Adam Matthiesen - MatthiesenXYZ",
+ "url": "https://matthiesen.xyz"
+ },
+ "keywords": [
+ "astro-ghostcms"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/MatthiesenXYZ/astro-ghostcms.git"
+ },
+ "bugs": {
+ "url": "https://github.com/MatthiesenXYZ/astro-ghostcms/issues",
+ "email": "issues@astro-ghostcms.xyz"
+ },
+ "main": "./brutalunocss-preset.ts",
+ "files": [
+ "src",
+ "brutalunocss-preset.ts"
+ ],
+ "exports": {
+ ".": "./brutalunocss-preset.ts",
+ "./index.astro": "./src/routes/index.astro",
+ "./[slug].astro": "./src/routes/[slug].astro",
+ "./tags.astro": "./src/routes/tags.astro",
+ "./authors.astro": "./src/routes/authors.astro",
+ "./tag/[slug].astro": "./src/routes/tag/[slug].astro",
+ "./author/[slug].astro": "./src/routes/author/[slug].astro",
+ "./archives/[...page].astro": "./src/routes/archives/[...page].astro"
+ },
+ "scripts": { },
+ "peerDependencies": {
+ "astro": "^4.2.0"
+ },
+ "devDependencies": {
+ "@resvg/resvg-js": "^2.6.0",
+ "@typescript-eslint/parser": "^6.15.0",
+ "eslint": "^8.56.0",
+ "eslint-plugin-astro": "^0.29.1",
+ "eslint-plugin-jsx-a11y": "^6.8.0",
+ "prettier": "^3.1.1",
+ "prettier-plugin-astro": "^0.12.2",
+ "sharp": "^0.32.6",
+ "@matthiesenxyz/astro-ghostcms": "workspace:*"
+ },
+ "dependencies": {
+ "@iconify-json/logos": "^1.1.41",
+ "@iconify-json/uil": "^1.1.8",
+ "@matthiesenxyz/astro-ghostcms": "^3.1.8",
+ "@unocss/astro": "^0.57.7",
+ "@unocss/reset": "^0.57.7",
+ "unocss": "^0.57.7",
+ "@eliancodes/brutal-ui": "^0.2.3",
+ "astro-font": "^0.0.72",
+ "typescript": "^5.3.3"
+ }
+}
diff --git a/packages/astro-ghostcms-brutalbyelian/src/assets/astro.jpeg b/packages/astro-ghostcms-brutalbyelian/src/assets/astro.jpeg
new file mode 100644
index 00000000..4ed48d19
Binary files /dev/null and b/packages/astro-ghostcms-brutalbyelian/src/assets/astro.jpeg differ
diff --git a/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorCollection.astro b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorCollection.astro
new file mode 100644
index 00000000..7bf57346
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorCollection.astro
@@ -0,0 +1,23 @@
+---
+import AuthorList from './AuthorList.astro';
+import { Card } from '@eliancodes/brutal-ui';
+
+import type { Settings, Post, Author } from "@matthiesenxyz/astro-ghostcms/api";
+export type Props = {
+ authors: Author[];
+ settings: Settings;
+ isHome?: boolean;
+};
+const { authors, settings } = Astro.props as Props;
+---
+
+
+
+
+
+ Our Authors
+
+
+
+
+
diff --git a/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorDetailCard.astro b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorDetailCard.astro
new file mode 100644
index 00000000..0e187ed4
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorDetailCard.astro
@@ -0,0 +1,95 @@
+---
+export type Props = {
+ name: string,
+ image?: string | null,
+ count: number,
+ bio: string | null,
+ location: string | null,
+ website: string | null,
+ twitter: string | null,
+ facebook: string | null
+};
+
+const {
+ name, image, bio, location, website, twitter, facebook, count
+} = Astro.props as Props;
+---
+
+
+
+
diff --git a/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorList.astro b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorList.astro
new file mode 100644
index 00000000..f384036c
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorList.astro
@@ -0,0 +1,21 @@
+---
+import AuthorSummaryCard from './AuthorSummaryCard.astro';
+import type { Settings, Post, Author } from "@matthiesenxyz/astro-ghostcms/api";
+export type Props = {
+ authors: Author[];
+ settings: Settings;
+};
+const { authors, settings } = Astro.props as Props;
+---
+
+
+ {
+ authors.map((author: Author) => {
+ return (
+ -
+
+
+ );
+ })
+ }
+
diff --git a/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorSummaryCard.astro b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorSummaryCard.astro
new file mode 100644
index 00000000..98acf323
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorSummaryCard.astro
@@ -0,0 +1,38 @@
+---
+import SummaryCard from './AuthorSummaryCardHeader.astro';
+import type { Settings, Author } from "@matthiesenxyz/astro-ghostcms/api";
+import { getGhostImgPath, formatDate } from "../../utils";
+import { Pill } from '@eliancodes/brutal-ui';
+import Button from "../generic/button.astro"
+
+interface Props {
+ author: Author;
+ settings: Settings;
+};
+
+const { author, settings } = Astro.props;
+---
+
+
+
+
+
+
+
+
+
+ {author.count && author.count.posts && (
+
+
{author.count.posts > 0 ? `${author.count.posts} posts` : "No posts"}
+
+
+ )}
+
+
+
+
diff --git a/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorSummaryCardHeader.astro b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorSummaryCardHeader.astro
new file mode 100644
index 00000000..2292ef32
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/src/components/authors/AuthorSummaryCardHeader.astro
@@ -0,0 +1,28 @@
+---
+import { Card } from '@eliancodes/brutal-ui';
+import { Image } from 'astro:assets';
+
+interface Props {
+ title: string;
+ imgSrc: string | null;
+ imgAlt: string;
+ description: string;
+}
+
+const { title, imgAlt, imgSrc, description } = Astro.props;
+---
+
+
+
+ {imgSrc && ()}
+
+ {title}
+ {description}
+
+
diff --git a/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogContent.astro b/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogContent.astro
new file mode 100644
index 00000000..f4f94e39
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogContent.astro
@@ -0,0 +1,17 @@
+---
+interface Props {
+ content: any;
+}
+
+const { content } = Astro.props;
+---
+
+
+ ← Back to blog
+
+ Published on {content.pubDate} by {content.author}
+
+
+ Written by {content.author}
+ ← Back to blog
+
diff --git a/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogList.astro b/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogList.astro
new file mode 100644
index 00000000..44812339
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogList.astro
@@ -0,0 +1,21 @@
+---
+import BlogSummaryCard from './BlogSummaryCard.astro';
+import type { Settings, Post } from "@matthiesenxyz/astro-ghostcms/api";
+export type Props = {
+ posts: Post[];
+ settings: Settings;
+};
+const { posts, settings } = Astro.props as Props;
+---
+
+
+ {
+ posts.map((post: Post) => {
+ return (
+ -
+
+
+ );
+ })
+ }
+
diff --git a/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogSideBar.astro b/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogSideBar.astro
new file mode 100644
index 00000000..b378a3a8
--- /dev/null
+++ b/packages/astro-ghostcms-brutalbyelian/src/components/blog/BlogSideBar.astro
@@ -0,0 +1,29 @@
+---
+interface Props {
+ headings: Array