Massive site update.
This commit is contained in:
parent
e442c36cc7
commit
22fe06c4b8
41 changed files with 350 additions and 656 deletions
148
.vscode/astrowind/config-schema.json
vendored
148
.vscode/astrowind/config-schema.json
vendored
|
@ -21,12 +21,7 @@
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["name", "site", "base", "trailingSlash"],
|
||||||
"name",
|
|
||||||
"site",
|
|
||||||
"base",
|
|
||||||
"trailingSlash"
|
|
||||||
],
|
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
},
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
|
@ -42,10 +37,7 @@
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["default", "template"]
|
||||||
"default",
|
|
||||||
"template"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"description": {
|
"description": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
@ -60,10 +52,7 @@
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["index", "follow"]
|
||||||
"index",
|
|
||||||
"follow"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"openGraph": {
|
"openGraph": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -72,10 +61,7 @@
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["site_name", "type"]
|
||||||
"site_name",
|
|
||||||
"type"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"twitter": {
|
"twitter": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -90,20 +76,10 @@
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["handle", "site", "cardType"]
|
||||||
"handle",
|
|
||||||
"site",
|
|
||||||
"cardType"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["title", "description", "robots", "openGraph", "twitter"]
|
||||||
"title",
|
|
||||||
"description",
|
|
||||||
"robots",
|
|
||||||
"openGraph",
|
|
||||||
"twitter"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"i18n": {
|
"i18n": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -115,10 +91,7 @@
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["language", "textDirection"]
|
||||||
"language",
|
|
||||||
"textDirection"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"apps": {
|
"apps": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -151,16 +124,10 @@
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["index"]
|
||||||
"index"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["isEnabled", "permalink", "robots"]
|
||||||
"isEnabled",
|
|
||||||
"permalink",
|
|
||||||
"robots"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -181,16 +148,10 @@
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["index"]
|
||||||
"index"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["isEnabled", "pathname", "robots"]
|
||||||
"isEnabled",
|
|
||||||
"pathname",
|
|
||||||
"robots"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -211,16 +172,10 @@
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["index"]
|
||||||
"index"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["isEnabled", "pathname", "robots"]
|
||||||
"isEnabled",
|
|
||||||
"pathname",
|
|
||||||
"robots"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"tag": {
|
"tag": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -241,31 +196,16 @@
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["index"]
|
||||||
"index"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["isEnabled", "pathname", "robots"]
|
||||||
"isEnabled",
|
|
||||||
"pathname",
|
|
||||||
"robots"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["isEnabled", "postsPerPage", "post", "list", "category", "tag"]
|
||||||
"isEnabled",
|
|
||||||
"postsPerPage",
|
|
||||||
"post",
|
|
||||||
"list",
|
|
||||||
"category",
|
|
||||||
"tag"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["blog"]
|
||||||
"blog"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"analytics": {
|
"analytics": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -277,29 +217,20 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"id": {
|
"id": {
|
||||||
"type": [
|
"type": ["string", "null"]
|
||||||
"string",
|
|
||||||
"null"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"partytown": {
|
"partytown": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true
|
"default": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["id"]
|
||||||
"id"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["googleAnalytics"]
|
||||||
"googleAnalytics"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["vendors"]
|
||||||
"vendors"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"ui": {
|
"ui": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -385,17 +316,10 @@
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["sans", "serif", "heading"]
|
||||||
"sans",
|
|
||||||
"serif",
|
|
||||||
"heading"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["colors", "fonts"]
|
||||||
"colors",
|
|
||||||
"fonts"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"dark": {
|
"dark": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -463,30 +387,14 @@
|
||||||
"type": "object"
|
"type": "object"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["colors", "fonts"]
|
||||||
"colors",
|
|
||||||
"fonts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["default", "dark"]
|
||||||
"default",
|
|
||||||
"dark"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["theme", "tokens"]
|
||||||
"theme",
|
|
||||||
"tokens"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": ["site", "metadata", "i18n", "apps", "analytics", "ui"]
|
||||||
"site",
|
}
|
||||||
"metadata",
|
|
||||||
"i18n",
|
|
||||||
"apps",
|
|
||||||
"analytics",
|
|
||||||
"ui"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
12
package.json
12
package.json
|
@ -12,13 +12,13 @@
|
||||||
"lint:eslint": "eslint . --ext .js,.ts,.astro"
|
"lint:eslint": "eslint . --ext .js,.ts,.astro"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/check": "^0.4.1",
|
"@astrojs/check": "^0.7.0",
|
||||||
"@astrojs/rss": "^4.0.1",
|
"@astrojs/rss": "^4.0.6",
|
||||||
"@astrojs/sitemap": "^3.0.4",
|
"@astrojs/sitemap": "^3.1.6",
|
||||||
"@astrolib/analytics": "^0.5.0",
|
"@astrolib/analytics": "^0.5.0",
|
||||||
"@astrolib/seo": "^1.0.0-beta.5",
|
"@astrolib/seo": "^1.0.0-beta.5",
|
||||||
"@fontsource-variable/inter": "^5.0.16",
|
"@fontsource-variable/inter": "^5.0.16",
|
||||||
"astro": "^4.1.1",
|
"astro": "^4.11.0",
|
||||||
"astro-icon": "^1.0.2",
|
"astro-icon": "^1.0.2",
|
||||||
"limax": "4.1.0",
|
"limax": "4.1.0",
|
||||||
"lodash.merge": "^4.6.2",
|
"lodash.merge": "^4.6.2",
|
||||||
|
@ -26,8 +26,8 @@
|
||||||
"unpic": "^3.16.0"
|
"unpic": "^3.16.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@astrojs/mdx": "^2.0.3",
|
"@astrojs/mdx": "^3.1.1",
|
||||||
"@astrojs/partytown": "^2.0.3",
|
"@astrojs/partytown": "^2.1.1",
|
||||||
"@astrojs/tailwind": "5.1.0",
|
"@astrojs/tailwind": "5.1.0",
|
||||||
"@iconify-json/flat-color-icons": "^1.1.10",
|
"@iconify-json/flat-color-icons": "^1.1.10",
|
||||||
"@iconify-json/tabler": "^1.1.103",
|
"@iconify-json/tabler": "^1.1.103",
|
||||||
|
|
|
@ -29,15 +29,16 @@ import '@fontsource-variable/inter';
|
||||||
--aw-color-secondary: rgb(30 58 138);
|
--aw-color-secondary: rgb(30 58 138);
|
||||||
--aw-color-accent: rgb(109 40 217);
|
--aw-color-accent: rgb(109 40 217);
|
||||||
|
|
||||||
--aw-color-text-heading: rgb(0 0 0);
|
--aw-color-text-heading: rgb(0 0 0);
|
||||||
--aw-color-text-default: rgb(16 16 16);
|
--aw-color-text-default: rgb(16 16 16);
|
||||||
--aw-color-text-muted: rgb(16 16 16 / 66%);
|
--aw-color-text-muted: rgb(16 16 16 / 66%);
|
||||||
--aw-color-bg-page: rgb(255 255 255);
|
--aw-color-bg-page: rgb(255 255 255);
|
||||||
|
|
||||||
--aw-color-bg-page-dark: rgb(3 6 32);
|
--aw-color-bg-page-dark: rgb(3 6 32);
|
||||||
|
|
||||||
::selection {background-color: lavender;}
|
::selection {
|
||||||
|
background-color: lavender;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark {
|
.dark {
|
||||||
|
@ -49,12 +50,14 @@ import '@fontsource-variable/inter';
|
||||||
--aw-color-secondary: rgb(30 58 138);
|
--aw-color-secondary: rgb(30 58 138);
|
||||||
--aw-color-accent: rgb(109 40 217);
|
--aw-color-accent: rgb(109 40 217);
|
||||||
|
|
||||||
--aw-color-text-heading: rgb(0 0 0);
|
--aw-color-text-heading: rgb(0 0 0);
|
||||||
--aw-color-text-default: rgb(229 236 246);
|
--aw-color-text-default: rgb(229 236 246);
|
||||||
--aw-color-text-muted: rgb(229 236 246 / 66%);
|
--aw-color-text-muted: rgb(229 236 246 / 66%);
|
||||||
--aw-color-bg-page: var(--aw-color-bg-page-dark);
|
--aw-color-bg-page: var(--aw-color-bg-page-dark);
|
||||||
|
|
||||||
::selection {background-color: black; color: snow}
|
::selection {
|
||||||
|
background-color: black;
|
||||||
|
color: snow;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -7,13 +7,12 @@ import Image from '~/components/common/Image.astro';
|
||||||
import { findImage } from '~/utils/images';
|
import { findImage } from '~/utils/images';
|
||||||
import { getPermalink } from '~/utils/permalinks';
|
import { getPermalink } from '~/utils/permalinks';
|
||||||
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
post: Post;
|
post: Post;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { post } = Astro.props;
|
const { post } = Astro.props;
|
||||||
const image = (await findImage(post.image));
|
const image = await findImage(post.image);
|
||||||
---
|
---
|
||||||
|
|
||||||
<article class="mb-6 transition">
|
<article class="mb-6 transition">
|
||||||
|
|
|
@ -74,13 +74,7 @@ const { Content } = post;
|
||||||
<div
|
<div
|
||||||
class="mx-auto px-6 sm:px-6 max-w-3xl prose prose-lg lg:prose-xl dark:prose-invert dark:prose-headings:text-slate-300 prose-md prose-headings:font-heading prose-headings:leading-tighter prose-headings:tracking-tighter prose-headings:font-bold prose-a:text-primary dark:prose-a:text-blue-400 prose-img:rounded-md prose-img:shadow-lg mt-8 prose-headings:scroll-mt-[80px]"
|
class="mx-auto px-6 sm:px-6 max-w-3xl prose prose-lg lg:prose-xl dark:prose-invert dark:prose-headings:text-slate-300 prose-md prose-headings:font-heading prose-headings:leading-tighter prose-headings:tracking-tighter prose-headings:font-bold prose-a:text-primary dark:prose-a:text-blue-400 prose-img:rounded-md prose-img:shadow-lg mt-8 prose-headings:scroll-mt-[80px]"
|
||||||
>
|
>
|
||||||
{
|
{Content ? <Content /> : <Fragment set:html={post.content || ''} />}
|
||||||
Content ? (
|
|
||||||
<Content />
|
|
||||||
) : (
|
|
||||||
<Fragment set:html={post.content || ""} />
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="mx-auto px-6 sm:px-6 max-w-3xl mt-8 flex justify-between flex-col sm:flex-row">
|
<div class="mx-auto px-6 sm:px-6 max-w-3xl mt-8 flex justify-between flex-col sm:flex-row">
|
||||||
<PostTags tags={post.tags} class="mr-5 rtl:mr-0 rtl:ml-5" />
|
<PostTags tags={post.tags} class="mr-5 rtl:mr-0 rtl:ml-5" />
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
import { getPermalink } from '~/utils/permalinks';
|
import { getPermalink } from '~/utils/permalinks';
|
||||||
|
|
||||||
import { APP_BLOG } from '~/utils/config';
|
import { APP_BLOG } from '~/utils/config';
|
||||||
import type { Post } from '~/types';
|
import type { Post } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
tags: Post['tags'];
|
tags: Post['tags'];
|
||||||
class?: string;
|
class?: string;
|
||||||
title?: string | undefined;
|
title?: string | undefined;
|
||||||
isCategory?: boolean;
|
isCategory?: boolean;
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,11 @@ const { tags, class: className = 'text-sm', title = undefined, isCategory = fals
|
||||||
tags && Array.isArray(tags) && (
|
tags && Array.isArray(tags) && (
|
||||||
<>
|
<>
|
||||||
<>
|
<>
|
||||||
{title !== undefined && <span class="align-super font-normal underline underline-offset-4 decoration-2 dark:text-slate-400">{title}</span>}
|
{title !== undefined && (
|
||||||
|
<span class="align-super font-normal underline underline-offset-4 decoration-2 dark:text-slate-400">
|
||||||
|
{title}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
<ul class={className}>
|
<ul class={className}>
|
||||||
{tags.map((tag) => (
|
{tags.map((tag) => (
|
||||||
|
@ -27,7 +31,7 @@ const { tags, class: className = 'text-sm', title = undefined, isCategory = fals
|
||||||
tag
|
tag
|
||||||
) : (
|
) : (
|
||||||
<a
|
<a
|
||||||
href={getPermalink(tag, (isCategory ? 'category' : 'tag'))}
|
href={getPermalink(tag, isCategory ? 'category' : 'tag')}
|
||||||
class="text-muted dark:text-slate-300 hover:text-primary dark:hover:text-gray-200"
|
class="text-muted dark:text-slate-300 hover:text-primary dark:hover:text-gray-200"
|
||||||
>
|
>
|
||||||
{tag}
|
{tag}
|
||||||
|
|
|
@ -5,6 +5,9 @@ import { ANALYTICS } from '~/utils/config';
|
||||||
|
|
||||||
{
|
{
|
||||||
ANALYTICS?.vendors?.googleAnalytics?.id ? (
|
ANALYTICS?.vendors?.googleAnalytics?.id ? (
|
||||||
<GoogleAnalytics id={String(ANALYTICS.vendors.googleAnalytics.id)} partytown={ANALYTICS?.vendors?.googleAnalytics?.partytown} />
|
<GoogleAnalytics
|
||||||
|
id={String(ANALYTICS.vendors.googleAnalytics.id)}
|
||||||
|
partytown={ANALYTICS?.vendors?.googleAnalytics?.partytown}
|
||||||
|
/>
|
||||||
) : null
|
) : null
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,33 +1,33 @@
|
||||||
---
|
---
|
||||||
import { UI } from "~/utils/config";
|
import { UI } from '~/utils/config';
|
||||||
|
|
||||||
// TODO: This code is temporary
|
// TODO: This code is temporary
|
||||||
---
|
---
|
||||||
|
|
||||||
<script is:inline define:vars={{ defaultTheme: UI.theme || "system" }}>
|
<script is:inline define:vars={{ defaultTheme: UI.theme || 'system' }}>
|
||||||
function applyTheme(theme) {
|
function applyTheme(theme) {
|
||||||
if (theme === "dark") {
|
if (theme === 'dark') {
|
||||||
document.documentElement.classList.add("dark");
|
document.documentElement.classList.add('dark');
|
||||||
} else {
|
} else {
|
||||||
document.documentElement.classList.remove("dark");
|
document.documentElement.classList.remove('dark');
|
||||||
}
|
}
|
||||||
const matches = document.querySelectorAll("[data-aw-toggle-color-scheme] > input");
|
const matches = document.querySelectorAll('[data-aw-toggle-color-scheme] > input');
|
||||||
|
|
||||||
if (matches && matches.length) {
|
if (matches && matches.length) {
|
||||||
matches.forEach((elem) => {
|
matches.forEach((elem) => {
|
||||||
elem.checked = theme !== "dark";
|
elem.checked = theme !== 'dark';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((defaultTheme && defaultTheme.endsWith(":only")) || (!localStorage.theme && defaultTheme !== "system")) {
|
if ((defaultTheme && defaultTheme.endsWith(':only')) || (!localStorage.theme && defaultTheme !== 'system')) {
|
||||||
applyTheme(defaultTheme.replace(":only", ""));
|
applyTheme(defaultTheme.replace(':only', ''));
|
||||||
} else if (
|
} else if (
|
||||||
localStorage.theme === "dark" ||
|
localStorage.theme === 'dark' ||
|
||||||
(!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches)
|
(!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)
|
||||||
) {
|
) {
|
||||||
applyTheme("dark");
|
applyTheme('dark');
|
||||||
} else {
|
} else {
|
||||||
applyTheme("light");
|
applyTheme('light');
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -5,4 +5,4 @@ import { getAsset } from '~/utils/permalinks';
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
|
||||||
<link rel="sitemap" href={getAsset('/sitemap-index.xml')} />
|
<link rel="sitemap" href={getAsset('/sitemap-index.xml')} />
|
||||||
|
|
|
@ -5,14 +5,14 @@ import {
|
||||||
astroAsseetsOptimizer,
|
astroAsseetsOptimizer,
|
||||||
unpicOptimizer,
|
unpicOptimizer,
|
||||||
type ImageProps,
|
type ImageProps,
|
||||||
type AttributesProps
|
type AttributesProps,
|
||||||
} from '~/utils/images-optimization';
|
} from '~/utils/images-optimization';
|
||||||
|
|
||||||
type Props = ImageProps;
|
type Props = ImageProps;
|
||||||
type ImageType = {
|
type ImageType = {
|
||||||
src: string;
|
src: string;
|
||||||
attributes: AttributesProps;
|
attributes: AttributesProps;
|
||||||
}
|
};
|
||||||
|
|
||||||
const props = Astro.props;
|
const props = Astro.props;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
import { SITE } from "~/utils/config";
|
import { SITE } from '~/utils/config';
|
||||||
---
|
---
|
||||||
|
|
||||||
{SITE.googleSiteVerificationId && <meta name="google-site-verification" content={SITE.googleSiteVerificationId} />}
|
{SITE.googleSiteVerificationId && <meta name="google-site-verification" content={SITE.googleSiteVerificationId} />}
|
||||||
|
|
|
@ -12,7 +12,12 @@ const { text, url, class: className = 'inline-block' } = Astro.props;
|
||||||
|
|
||||||
<div class={className}>
|
<div class={className}>
|
||||||
<span class="align-super font-bold text-gray-400 dark:text-slate-400">Share:</span>
|
<span class="align-super font-bold text-gray-400 dark:text-slate-400">Share:</span>
|
||||||
<button class="ml-2 rtl:ml-0 rtl:mr-2" title="Email Share" data-aw-social-share="mail" data-aw-url={url} data-aw-text={text}
|
<button
|
||||||
|
class="ml-2 rtl:ml-0 rtl:mr-2"
|
||||||
|
title="Email Share"
|
||||||
|
data-aw-social-share="mail"
|
||||||
|
data-aw-url={url}
|
||||||
|
data-aw-text={text}
|
||||||
><Icon
|
><Icon
|
||||||
name="tabler:mail"
|
name="tabler:mail"
|
||||||
class="w-6 h-6 text-gray-400 dark:text-slate-500 hover:text-black dark:hover:text-slate-300"
|
class="w-6 h-6 text-gray-400 dark:text-slate-500 hover:text-black dark:hover:text-slate-300"
|
||||||
|
|
|
@ -6,16 +6,11 @@ export interface Props {
|
||||||
|
|
||||||
const {
|
const {
|
||||||
label = 'Toggle Menu',
|
label = 'Toggle Menu',
|
||||||
class:
|
class: className = 'flex flex-col h-12 w-12 rounded justify-center items-center cursor-pointer group',
|
||||||
className = "flex flex-col h-12 w-12 rounded justify-center items-center cursor-pointer group",
|
|
||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<button
|
<button class={className} aria-label={label} data-aw-toggle-menu>
|
||||||
class={className}
|
|
||||||
aria-label={label}
|
|
||||||
data-aw-toggle-menu
|
|
||||||
>
|
|
||||||
<span class="sr-only">{label}</span>
|
<span class="sr-only">{label}</span>
|
||||||
<slot>
|
<slot>
|
||||||
<span
|
<span
|
||||||
|
|
|
@ -10,14 +10,13 @@
|
||||||
// closing tags - it's simply contained in an enclosing div with a
|
// closing tags - it's simply contained in an enclosing div with a
|
||||||
// margin left. No need for 'dd' items.
|
// margin left. No need for 'dd' items.
|
||||||
//
|
//
|
||||||
const {
|
const { dt } = Astro.props;
|
||||||
dt
|
|
||||||
} = Astro.props;
|
|
||||||
interface Props {
|
interface Props {
|
||||||
dt:string
|
dt: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const content:string = await Astro.slots.render('default');
|
const content: string = await Astro.slots.render('default');
|
||||||
---
|
---
|
||||||
<h6 set:html={dt}></h6>
|
|
||||||
<div class="dd ml-8" set:html={content}/>
|
<h6 set:html={dt} />
|
||||||
|
<div class="dd ml-8" set:html={content} />
|
||||||
|
|
|
@ -70,7 +70,9 @@ const { inputs, textarea, disclaimer, button = 'Contact us', description = '' }
|
||||||
{
|
{
|
||||||
button && (
|
button && (
|
||||||
<div class="mt-10 grid">
|
<div class="mt-10 grid">
|
||||||
<Button variant="primary" type="submit">{button}</Button>
|
<Button variant="primary" type="submit">
|
||||||
|
{button}
|
||||||
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,35 @@
|
||||||
---
|
---
|
||||||
import type { Headline } from "~/types";
|
import type { Headline } from '~/types';
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from 'tailwind-merge';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render("title"),
|
title = await Astro.slots.render('title'),
|
||||||
subtitle = await Astro.slots.render("subtitle"),
|
subtitle = await Astro.slots.render('subtitle'),
|
||||||
tagline,
|
tagline,
|
||||||
classes = {},
|
classes = {},
|
||||||
} = Astro.props as Headline;
|
} = Astro.props as Headline;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
container: containerClass = "max-w-3xl",
|
container: containerClass = 'max-w-3xl',
|
||||||
title: titleClass = "text-3xl md:text-4xl ",
|
title: titleClass = 'text-3xl md:text-4xl ',
|
||||||
subtitle: subtitleClass = "text-xl",
|
subtitle: subtitleClass = 'text-xl',
|
||||||
} = classes;
|
} = classes;
|
||||||
---
|
---
|
||||||
|
|
||||||
{
|
{
|
||||||
(title || subtitle || tagline) && (
|
(title || subtitle || tagline) && (
|
||||||
<div
|
<div class={twMerge('mb-8 md:mx-auto md:mb-12 text-center', containerClass)}>
|
||||||
class={twMerge("mb-8 md:mx-auto md:mb-12 text-center", containerClass)}
|
|
||||||
>
|
|
||||||
{tagline && (
|
{tagline && (
|
||||||
<p
|
<p class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase" set:html={tagline} />
|
||||||
class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase"
|
|
||||||
set:html={tagline}
|
|
||||||
/>
|
|
||||||
)}
|
)}
|
||||||
{title && (
|
{title && (
|
||||||
<h2
|
<h2
|
||||||
class={twMerge(
|
class={twMerge('font-bold leading-tighter tracking-tighter font-heading text-heading text-3xl', titleClass)}
|
||||||
"font-bold leading-tighter tracking-tighter font-heading text-heading text-3xl",
|
|
||||||
titleClass
|
|
||||||
)}
|
|
||||||
set:html={title}
|
set:html={title}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{subtitle && (
|
{subtitle && <p class={twMerge('mt-4 text-muted', subtitleClass)} set:html={subtitle} />}
|
||||||
<p
|
|
||||||
class={twMerge("mt-4 text-muted", subtitleClass)}
|
|
||||||
set:html={subtitle}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,10 +24,10 @@ const {
|
||||||
columns === 4
|
columns === 4
|
||||||
? 'lg:grid-cols-4 md:grid-cols-3 sm:grid-cols-2'
|
? 'lg:grid-cols-4 md:grid-cols-3 sm:grid-cols-2'
|
||||||
: columns === 3
|
: columns === 3
|
||||||
? 'lg:grid-cols-3 sm:grid-cols-2'
|
? 'lg:grid-cols-3 sm:grid-cols-2'
|
||||||
: columns === 2
|
: columns === 2
|
||||||
? 'sm:grid-cols-2 '
|
? 'sm:grid-cols-2 '
|
||||||
: ''
|
: ''
|
||||||
}`,
|
}`,
|
||||||
containerClass
|
containerClass
|
||||||
)}
|
)}
|
||||||
|
@ -52,13 +52,7 @@ const {
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{callToAction && (
|
{callToAction && (
|
||||||
<div
|
<div class={twMerge(`${title || description ? 'mt-3' : ''}`, actionClass, itemClasses?.actionClass)}>
|
||||||
class={twMerge(
|
|
||||||
`${title || description ? 'mt-3' : ''}`,
|
|
||||||
actionClass,
|
|
||||||
itemClasses?.actionClass
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<Button variant="link" {...callToAction} />
|
<Button variant="link" {...callToAction} />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -1,23 +1,18 @@
|
||||||
---
|
---
|
||||||
import { Icon } from "astro-icon/components";
|
import { Icon } from 'astro-icon/components';
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from 'tailwind-merge';
|
||||||
import type { ItemGrid } from "~/types";
|
import type { ItemGrid } from '~/types';
|
||||||
import Button from "./Button.astro";
|
import Button from './Button.astro';
|
||||||
|
|
||||||
|
const { items = [], columns, defaultIcon = '', classes = {} } = Astro.props as ItemGrid;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
items = [],
|
container: containerClass = '',
|
||||||
columns,
|
|
||||||
defaultIcon = "",
|
|
||||||
classes = {},
|
|
||||||
} = Astro.props as ItemGrid;
|
|
||||||
|
|
||||||
const {
|
|
||||||
container: containerClass = "",
|
|
||||||
// container: containerClass = "sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
|
// container: containerClass = "sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
|
||||||
panel: panelClass = "",
|
panel: panelClass = '',
|
||||||
title: titleClass = "",
|
title: titleClass = '',
|
||||||
description: descriptionClass = "",
|
description: descriptionClass = '',
|
||||||
icon: defaultIconClass = "text-primary",
|
icon: defaultIconClass = 'text-primary',
|
||||||
} = classes;
|
} = classes;
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -27,68 +22,32 @@ const {
|
||||||
class={twMerge(
|
class={twMerge(
|
||||||
`grid gap-8 gap-x-12 sm:gap-y-8 ${
|
`grid gap-8 gap-x-12 sm:gap-y-8 ${
|
||||||
columns === 4
|
columns === 4
|
||||||
? "lg:grid-cols-4 md:grid-cols-3 sm:grid-cols-2"
|
? 'lg:grid-cols-4 md:grid-cols-3 sm:grid-cols-2'
|
||||||
: columns === 3
|
: columns === 3
|
||||||
? "lg:grid-cols-3 sm:grid-cols-2"
|
? 'lg:grid-cols-3 sm:grid-cols-2'
|
||||||
: columns === 2
|
: columns === 2
|
||||||
? "sm:grid-cols-2 "
|
? 'sm:grid-cols-2 '
|
||||||
: ""
|
: ''
|
||||||
}`,
|
}`,
|
||||||
containerClass
|
containerClass
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{items.map(
|
{items.map(({ title, description, icon, callToAction, classes: itemClasses = {} }) => (
|
||||||
({
|
<div class={twMerge('relative flex flex-col', panelClass, itemClasses?.panel)}>
|
||||||
title,
|
{(icon || defaultIcon) && (
|
||||||
description,
|
<Icon name={icon || defaultIcon} class={twMerge('mb-2 w-10 h-10', defaultIconClass, itemClasses?.icon)} />
|
||||||
icon,
|
)}
|
||||||
callToAction,
|
<div class={twMerge('text-xl font-bold', titleClass, itemClasses?.title)}>{title}</div>
|
||||||
classes: itemClasses = {},
|
{description && (
|
||||||
}) => (
|
<p class={twMerge('text-muted mt-2', descriptionClass, itemClasses?.description)} set:html={description} />
|
||||||
<div
|
)}
|
||||||
class={twMerge(
|
{callToAction && (
|
||||||
"relative flex flex-col",
|
<div class="mt-2">
|
||||||
panelClass,
|
<Button {...callToAction} />
|
||||||
itemClasses?.panel
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{(icon || defaultIcon) && (
|
|
||||||
<Icon
|
|
||||||
name={icon || defaultIcon}
|
|
||||||
class={twMerge(
|
|
||||||
"mb-2 w-10 h-10",
|
|
||||||
defaultIconClass,
|
|
||||||
itemClasses?.icon
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<div
|
|
||||||
class={twMerge(
|
|
||||||
"text-xl font-bold",
|
|
||||||
titleClass,
|
|
||||||
itemClasses?.title
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{title}
|
|
||||||
</div>
|
</div>
|
||||||
{description && (
|
)}
|
||||||
<p
|
</div>
|
||||||
class={twMerge(
|
))}
|
||||||
"text-muted mt-2",
|
|
||||||
descriptionClass,
|
|
||||||
itemClasses?.description
|
|
||||||
)}
|
|
||||||
set:html={description}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{callToAction && (
|
|
||||||
<div class="mt-2">
|
|
||||||
<Button {...callToAction} />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
import { Icon } from "astro-icon/components";
|
import { Icon } from 'astro-icon/components';
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from 'tailwind-merge';
|
||||||
import type { Item } from "~/types";
|
import type { Item } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
items?: Array<Item>;
|
items?: Array<Item>;
|
||||||
|
@ -12,71 +12,43 @@ export interface Props {
|
||||||
const { items = [], classes = {}, defaultIcon } = Astro.props as Props;
|
const { items = [], classes = {}, defaultIcon } = Astro.props as Props;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
container: containerClass = "",
|
container: containerClass = '',
|
||||||
panel: panelClass = "",
|
panel: panelClass = '',
|
||||||
title: titleClass = "",
|
title: titleClass = '',
|
||||||
description: descriptionClass = "",
|
description: descriptionClass = '',
|
||||||
icon: defaultIconClass = "text-primary dark:text-slate-200 border-primary dark:border-blue-700",
|
icon: defaultIconClass = 'text-primary dark:text-slate-200 border-primary dark:border-blue-700',
|
||||||
} = classes;
|
} = classes;
|
||||||
---
|
---
|
||||||
|
|
||||||
{
|
{
|
||||||
items && items.length && (
|
items && items.length && (
|
||||||
<div class={containerClass}>
|
<div class={containerClass}>
|
||||||
{items.map(
|
{items.map(({ title, description, icon, classes: itemClasses = {} }, index = 0) => (
|
||||||
(
|
<div class={twMerge('flex', panelClass, itemClasses?.panel)}>
|
||||||
{ title, description, icon, classes: itemClasses = {} },
|
<div class="flex flex-col items-center mr-4 rtl:mr-0 rtl:ml-4">
|
||||||
index = 0
|
<div>
|
||||||
) => (
|
<div class="flex items-center justify-center">
|
||||||
<div class={twMerge("flex", panelClass, itemClasses?.panel)}>
|
{(icon || defaultIcon) && (
|
||||||
<div class="flex flex-col items-center mr-4 rtl:mr-0 rtl:ml-4">
|
<Icon
|
||||||
<div>
|
name={icon || defaultIcon}
|
||||||
<div class="flex items-center justify-center">
|
class={twMerge('w-10 h-10 p-2 rounded-full border-2', defaultIconClass, itemClasses?.icon)}
|
||||||
{(icon || defaultIcon) && (
|
/>
|
||||||
<Icon
|
)}
|
||||||
name={icon || defaultIcon}
|
|
||||||
class={twMerge(
|
|
||||||
"w-10 h-10 p-2 rounded-full border-2",
|
|
||||||
defaultIconClass,
|
|
||||||
itemClasses?.icon
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{index !== items.length - 1 && (
|
|
||||||
<div class="w-px h-full bg-black/10 dark:bg-slate-400/50" />
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class={`pt-1 ${
|
|
||||||
index !== items.length - 1 ? "pb-8" : ""
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{title && (
|
|
||||||
<p
|
|
||||||
class={twMerge(
|
|
||||||
"text-xl font-bold",
|
|
||||||
titleClass,
|
|
||||||
itemClasses?.title
|
|
||||||
)}
|
|
||||||
set:html={title}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{description && (
|
|
||||||
<p
|
|
||||||
class={twMerge(
|
|
||||||
"text-muted mt-2",
|
|
||||||
descriptionClass,
|
|
||||||
itemClasses?.description
|
|
||||||
)}
|
|
||||||
set:html={description}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
|
{index !== items.length - 1 && <div class="w-px h-full bg-black/10 dark:bg-slate-400/50" />}
|
||||||
</div>
|
</div>
|
||||||
)
|
<div class={`pt-1 ${index !== items.length - 1 ? 'pb-8' : ''}`}>
|
||||||
)}
|
{title && <p class={twMerge('text-xl font-bold', titleClass, itemClasses?.title)} set:html={title} />}
|
||||||
|
{description && (
|
||||||
|
<p
|
||||||
|
class={twMerge('text-muted mt-2', descriptionClass, itemClasses?.description)}
|
||||||
|
set:html={description}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from 'tailwind-merge';
|
||||||
import Background from "./Background.astro";
|
import Background from './Background.astro';
|
||||||
|
|
||||||
const { id, isDark = false, containerClass = "", bg, as = "section" } = Astro.props;
|
const { id, isDark = false, containerClass = '', bg, as = 'section' } = Astro.props;
|
||||||
|
|
||||||
const WrapperTag = as;
|
const WrapperTag = as;
|
||||||
---
|
---
|
||||||
|
@ -15,7 +15,7 @@ const WrapperTag = as;
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class:list={[
|
class:list={[
|
||||||
twMerge("relative mx-auto max-w-7xl px-4 md:px-6 py-12 md:py-16 lg:py-20 text-default", containerClass),
|
twMerge('relative mx-auto max-w-7xl px-4 md:px-6 py-12 md:py-16 lg:py-20 text-default', containerClass),
|
||||||
{ dark: isDark },
|
{ dark: isDark },
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
class="dark:bg-slate-700 bg-white/40 dark:text-slate-300 font-semibold px-1 py-0.5 text-xs mr-0.5 rtl:mr-0 rtl:ml-0.5 inline-block"
|
class="dark:bg-slate-700 bg-white/40 dark:text-slate-300 font-semibold px-1 py-0.5 text-xs mr-0.5 rtl:mr-0 rtl:ml-0.5 inline-block"
|
||||||
>NEW</span
|
>NEW</span
|
||||||
>
|
>
|
||||||
<a href="https://dragonschildstudios.com/welcome" class="text-muted hover:underline dark:text-slate-400 font-medium"
|
<a href="https://forum.dragonschildstudios.com" class="text-muted hover:underline dark:text-slate-400 font-medium"
|
||||||
>This site is now out of beta!</a
|
>We have a forum.</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
import { APP_BLOG } from "~/utils/config";
|
import { APP_BLOG } from '~/utils/config';
|
||||||
|
|
||||||
import Grid from "~/components/blog/Grid.astro";
|
import Grid from '~/components/blog/Grid.astro';
|
||||||
|
|
||||||
import { getBlogPermalink } from "~/utils/permalinks";
|
import { getBlogPermalink } from '~/utils/permalinks';
|
||||||
import { findPostsByIds } from "~/utils/blog";
|
import { findPostsByIds } from '~/utils/blog';
|
||||||
import WidgetWrapper from "~/components/ui/WidgetWrapper.astro";
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import type { Widget } from "~/types";
|
import type { Widget } from '~/types';
|
||||||
|
|
||||||
export interface Props extends Widget {
|
export interface Props extends Widget {
|
||||||
title?: string;
|
title?: string;
|
||||||
|
@ -17,16 +17,16 @@ export interface Props extends Widget {
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render("title"),
|
title = await Astro.slots.render('title'),
|
||||||
linkText = "View all posts",
|
linkText = 'View all posts',
|
||||||
linkUrl = getBlogPermalink(),
|
linkUrl = getBlogPermalink(),
|
||||||
information = await Astro.slots.render("information"),
|
information = await Astro.slots.render('information'),
|
||||||
postIds = [],
|
postIds = [],
|
||||||
|
|
||||||
id,
|
id,
|
||||||
isDark = false,
|
isDark = false,
|
||||||
classes = {},
|
classes = {},
|
||||||
bg = await Astro.slots.render("bg"),
|
bg = await Astro.slots.render('bg'),
|
||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
|
|
||||||
const posts = APP_BLOG.isEnabled ? await findPostsByIds(postIds) : [];
|
const posts = APP_BLOG.isEnabled ? await findPostsByIds(postIds) : [];
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
---
|
---
|
||||||
import { APP_BLOG } from "~/utils/config";
|
import { APP_BLOG } from '~/utils/config';
|
||||||
|
|
||||||
import Grid from "~/components/blog/Grid.astro";
|
import Grid from '~/components/blog/Grid.astro';
|
||||||
|
|
||||||
import { getBlogPermalink } from "~/utils/permalinks";
|
import { getBlogPermalink } from '~/utils/permalinks';
|
||||||
import { findLatestPosts } from "~/utils/blog";
|
import { findLatestPosts } from '~/utils/blog';
|
||||||
import WidgetWrapper from "~/components/ui/WidgetWrapper.astro";
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import type { Widget } from "~/types";
|
import type { Widget } from '~/types';
|
||||||
import Button from "../ui/Button.astro";
|
import Button from '../ui/Button.astro';
|
||||||
|
|
||||||
export interface Props extends Widget {
|
export interface Props extends Widget {
|
||||||
title?: string;
|
title?: string;
|
||||||
|
@ -18,16 +18,16 @@ export interface Props extends Widget {
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render("title"),
|
title = await Astro.slots.render('title'),
|
||||||
linkText = "View all posts",
|
linkText = 'View all posts',
|
||||||
linkUrl = getBlogPermalink(),
|
linkUrl = getBlogPermalink(),
|
||||||
information = await Astro.slots.render("information"),
|
information = await Astro.slots.render('information'),
|
||||||
count = 4,
|
count = 4,
|
||||||
|
|
||||||
id,
|
id,
|
||||||
isDark = false,
|
isDark = false,
|
||||||
classes = {},
|
classes = {},
|
||||||
bg = await Astro.slots.render("bg"),
|
bg = await Astro.slots.render('bg'),
|
||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
|
|
||||||
const posts = APP_BLOG.isEnabled ? await findLatestPosts({ count }) : [];
|
const posts = APP_BLOG.isEnabled ? await findLatestPosts({ count }) : [];
|
||||||
|
@ -44,7 +44,10 @@ const posts = APP_BLOG.isEnabled ? await findLatestPosts({ count }) : [];
|
||||||
set:html={title}
|
set:html={title}
|
||||||
/>
|
/>
|
||||||
{APP_BLOG.list.isEnabled && linkText && linkUrl && (
|
{APP_BLOG.list.isEnabled && linkText && linkUrl && (
|
||||||
<Button variant="link" href={linkUrl}> {linkText} »</Button>
|
<Button variant="link" href={linkUrl}>
|
||||||
|
{' '}
|
||||||
|
{linkText} »
|
||||||
|
</Button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
||||||
import type { CallToAction, Widget } from '~/types';
|
import type { CallToAction, Widget } from '~/types';
|
||||||
import Headline from '~/components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import Button from "~/components/ui/Button.astro"
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
interface Props extends Widget {
|
interface Props extends Widget {
|
||||||
title?: string;
|
title?: string;
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
---
|
---
|
||||||
import WidgetWrapper from "~/components/ui/WidgetWrapper.astro";
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import ItemGrid from "~/components/ui/ItemGrid.astro";
|
import ItemGrid from '~/components/ui/ItemGrid.astro';
|
||||||
import Headline from "~/components/ui/Headline.astro";
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import type { Features } from "~/types";
|
import type { Features } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render("title"),
|
title = await Astro.slots.render('title'),
|
||||||
subtitle = await Astro.slots.render("subtitle"),
|
subtitle = await Astro.slots.render('subtitle'),
|
||||||
tagline = await Astro.slots.render("tagline"),
|
tagline = await Astro.slots.render('tagline'),
|
||||||
items = [],
|
items = [],
|
||||||
columns = 2,
|
columns = 2,
|
||||||
|
|
||||||
|
@ -16,30 +16,20 @@ const {
|
||||||
id,
|
id,
|
||||||
isDark = false,
|
isDark = false,
|
||||||
classes = {},
|
classes = {},
|
||||||
bg = await Astro.slots.render("bg"),
|
bg = await Astro.slots.render('bg'),
|
||||||
} = Astro.props as Features;
|
} = Astro.props as Features;
|
||||||
---
|
---
|
||||||
|
|
||||||
<WidgetWrapper
|
<WidgetWrapper id={id} isDark={isDark} containerClass={`max-w-5xl ${classes?.container ?? ''}`} bg={bg}>
|
||||||
id={id}
|
<Headline title={title} subtitle={subtitle} tagline={tagline} classes={classes?.headline} />
|
||||||
isDark={isDark}
|
|
||||||
containerClass={`max-w-5xl ${classes?.container ?? ""}`}
|
|
||||||
bg={bg}
|
|
||||||
>
|
|
||||||
<Headline
|
|
||||||
title={title}
|
|
||||||
subtitle={subtitle}
|
|
||||||
tagline={tagline}
|
|
||||||
classes={classes?.headline}
|
|
||||||
/>
|
|
||||||
<ItemGrid
|
<ItemGrid
|
||||||
items={items}
|
items={items}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
defaultIcon={defaultIcon}
|
defaultIcon={defaultIcon}
|
||||||
classes={{
|
classes={{
|
||||||
container: "",
|
container: '',
|
||||||
title: "md:text-[1.3rem]",
|
title: 'md:text-[1.3rem]',
|
||||||
icon: "text-white bg-primary rounded-full w-10 h-10 p-2 md:w-12 md:h-12 md:p-3 mr-4 rtl:ml-4 rtl:mr-0",
|
icon: 'text-white bg-primary rounded-full w-10 h-10 p-2 md:w-12 md:h-12 md:p-3 mr-4 rtl:ml-4 rtl:mr-0',
|
||||||
...((classes?.items as {}) ?? {}),
|
...((classes?.items as {}) ?? {}),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
---
|
---
|
||||||
import WidgetWrapper from "~/components/ui/WidgetWrapper.astro";
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import Headline from "~/components/ui/Headline.astro";
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import ItemGrid2 from "~/components/ui/ItemGrid2.astro";
|
import ItemGrid2 from '~/components/ui/ItemGrid2.astro';
|
||||||
import type { Features } from "~/types";
|
import type { Features } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render("title"),
|
title = await Astro.slots.render('title'),
|
||||||
subtitle = await Astro.slots.render("subtitle"),
|
subtitle = await Astro.slots.render('subtitle'),
|
||||||
tagline = await Astro.slots.render("tagline"),
|
tagline = await Astro.slots.render('tagline'),
|
||||||
items = [],
|
items = [],
|
||||||
columns = 3,
|
columns = 3,
|
||||||
defaultIcon,
|
defaultIcon,
|
||||||
|
@ -15,33 +15,23 @@ const {
|
||||||
id,
|
id,
|
||||||
isDark = false,
|
isDark = false,
|
||||||
classes = {},
|
classes = {},
|
||||||
bg = await Astro.slots.render("bg"),
|
bg = await Astro.slots.render('bg'),
|
||||||
} = Astro.props as Features;
|
} = Astro.props as Features;
|
||||||
---
|
---
|
||||||
|
|
||||||
<WidgetWrapper
|
<WidgetWrapper id={id} isDark={isDark} containerClass={`max-w-7xl mx-auto ${classes?.container ?? ''}`} bg={bg}>
|
||||||
id={id}
|
<Headline title={title} subtitle={subtitle} tagline={tagline} classes={classes?.headline} />
|
||||||
isDark={isDark}
|
|
||||||
containerClass={`max-w-7xl mx-auto ${classes?.container ?? ''}`}
|
|
||||||
bg={bg}
|
|
||||||
>
|
|
||||||
<Headline
|
|
||||||
title={title}
|
|
||||||
subtitle={subtitle}
|
|
||||||
tagline={tagline}
|
|
||||||
classes={classes?.headline}
|
|
||||||
/>
|
|
||||||
<ItemGrid2
|
<ItemGrid2
|
||||||
items={items}
|
items={items}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
defaultIcon={defaultIcon}
|
defaultIcon={defaultIcon}
|
||||||
classes={{
|
classes={{
|
||||||
container: "gap-4 md:gap-6",
|
container: 'gap-4 md:gap-6',
|
||||||
panel:
|
panel:
|
||||||
'rounded-lg shadow-[0_4px_30px_rgba(0,0,0,0.1)] dark:shadow-[0_4px_30px_rgba(0,0,0,0.1)] backdrop-blur border border-[#ffffff29] bg-white dark:bg-slate-900 p-6',
|
'rounded-lg shadow-[0_4px_30px_rgba(0,0,0,0.1)] dark:shadow-[0_4px_30px_rgba(0,0,0,0.1)] backdrop-blur border border-[#ffffff29] bg-white dark:bg-slate-900 p-6',
|
||||||
// panel:
|
// panel:
|
||||||
// "text-center bg-page items-center md:text-left rtl:md:text-right md:items-start p-6 p-6 rounded-md shadow-xl dark:shadow-none dark:border dark:border-slate-800",
|
// "text-center bg-page items-center md:text-left rtl:md:text-right md:items-start p-6 p-6 rounded-md shadow-xl dark:shadow-none dark:border dark:border-slate-800",
|
||||||
icon: "w-12 h-12 mb-6 text-primary",
|
icon: 'w-12 h-12 mb-6 text-primary',
|
||||||
...((classes?.items as {}) ?? {}),
|
...((classes?.items as {}) ?? {}),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
---
|
---
|
||||||
import { Icon } from "astro-icon/components";
|
import { Icon } from 'astro-icon/components';
|
||||||
import Logo from "~/components/Logo.astro";
|
import Logo from '~/components/Logo.astro';
|
||||||
import ToggleTheme from "~/components/common/ToggleTheme.astro";
|
import ToggleTheme from '~/components/common/ToggleTheme.astro';
|
||||||
import ToggleMenu from "~/components/common/ToggleMenu.astro";
|
import ToggleMenu from '~/components/common/ToggleMenu.astro';
|
||||||
import Button from "~/components/ui/Button.astro"
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
import { getHomePermalink } from "~/utils/permalinks";
|
import { getHomePermalink } from '~/utils/permalinks';
|
||||||
import { trimSlash, getAsset } from "~/utils/permalinks";
|
import { trimSlash, getAsset } from '~/utils/permalinks';
|
||||||
import type { CallToAction } from "~/types";
|
import type { CallToAction } from '~/types';
|
||||||
|
|
||||||
interface Link {
|
interface Link {
|
||||||
text?: string;
|
text?: string;
|
||||||
|
@ -35,7 +35,7 @@ export interface Props {
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
id = "header",
|
id = 'header',
|
||||||
links = [],
|
links = [],
|
||||||
actions = [],
|
actions = [],
|
||||||
isSticky = false,
|
isSticky = false,
|
||||||
|
@ -43,30 +43,30 @@ const {
|
||||||
isFullWidth = false,
|
isFullWidth = false,
|
||||||
showToggleTheme = false,
|
showToggleTheme = false,
|
||||||
showRssFeed = false,
|
showRssFeed = false,
|
||||||
position = "center",
|
position = 'center',
|
||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
|
|
||||||
const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`;
|
||||||
---
|
---
|
||||||
|
|
||||||
<header
|
<header
|
||||||
class:list={[
|
class:list={[
|
||||||
{ sticky: isSticky, relative: !isSticky, dark: isDark },
|
{ sticky: isSticky, relative: !isSticky, dark: isDark },
|
||||||
"top-0 z-40 flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out",
|
'top-0 z-40 flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out',
|
||||||
]}
|
]}
|
||||||
{...isSticky ? { "data-aw-sticky-header": true } : {}}
|
{...isSticky ? { 'data-aw-sticky-header': true } : {}}
|
||||||
{...id ? { id } : {}}
|
{...id ? { id } : {}}
|
||||||
>
|
>
|
||||||
<div class="absolute inset-0"></div>
|
<div class="absolute inset-0"></div>
|
||||||
<div
|
<div
|
||||||
class:list={[
|
class:list={[
|
||||||
"relative text-default py-3 px-3 md:px-6 mx-auto w-full md:flex md:justify-between",
|
'relative text-default py-3 px-3 md:px-6 mx-auto w-full md:flex md:justify-between',
|
||||||
{
|
{
|
||||||
"max-w-7xl": !isFullWidth,
|
'max-w-7xl': !isFullWidth,
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<div class:list={[{ "mr-auto rtl:mr-0 rtl:ml-auto": position === "right" }, "flex justify-between"]}>
|
<div class:list={[{ 'mr-auto rtl:mr-0 rtl:ml-auto': position === 'right' }, 'flex justify-between']}>
|
||||||
<a class="flex items-center" href={getHomePermalink()}>
|
<a class="flex items-center" href={getHomePermalink()}>
|
||||||
<Logo />
|
<Logo />
|
||||||
</a>
|
</a>
|
||||||
|
@ -83,19 +83,20 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
links.map(({ text, href, links }) => (
|
links.map(({ text, href, links }) => (
|
||||||
<li class={links?.length ? "dropdown" : ""}>
|
<li class={links?.length ? 'dropdown' : ''}>
|
||||||
{links?.length ? (
|
{links?.length ? (
|
||||||
<>
|
<>
|
||||||
<button class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center">
|
<button class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center">
|
||||||
{text} <Icon name="tabler:chevron-down" class="w-3.5 h-3.5 ml-0.5 rtl:ml-0 rtl:mr-0.5 hidden md:inline" />
|
{text}{' '}
|
||||||
|
<Icon name="tabler:chevron-down" class="w-3.5 h-3.5 ml-0.5 rtl:ml-0 rtl:mr-0.5 hidden md:inline" />
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu md:backdrop-blur-md dark:md:bg-dark rounded md:absolute pl-4 md:pl-0 md:hidden font-medium md:bg-white/90 md:min-w-[200px] drop-shadow-xl">
|
<ul class="dropdown-menu md:backdrop-blur-md dark:md:bg-dark rounded md:absolute pl-4 md:pl-0 md:hidden font-medium md:bg-white/90 md:min-w-[200px] drop-shadow-xl">
|
||||||
{links.map(({ text: text2, href: href2 }) => (
|
{links.map(({ text: text2, href: href2 }) => (
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
class:list={[
|
class:list={[
|
||||||
"first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap",
|
'first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap',
|
||||||
{ "aw-link-active" : href2 === currentPath}
|
{ 'aw-link-active': href2 === currentPath },
|
||||||
]}
|
]}
|
||||||
href={href2}
|
href={href2}
|
||||||
>
|
>
|
||||||
|
@ -108,8 +109,8 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
||||||
) : (
|
) : (
|
||||||
<a
|
<a
|
||||||
class:list={[
|
class:list={[
|
||||||
"hover:text-link dark:hover:text-white px-4 py-3 flex items-centers",
|
'hover:text-link dark:hover:text-white px-4 py-3 flex items-centers',
|
||||||
{ "aw-link-active": href === currentPath }
|
{ 'aw-link-active': href === currentPath },
|
||||||
]}
|
]}
|
||||||
href={href}
|
href={href}
|
||||||
>
|
>
|
||||||
|
@ -123,8 +124,8 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
||||||
</nav>
|
</nav>
|
||||||
<div
|
<div
|
||||||
class:list={[
|
class:list={[
|
||||||
{ "ml-auto rtl:ml-0 rtl:mr-auto": position === "left" },
|
{ 'ml-auto rtl:ml-0 rtl:mr-auto': position === 'left' },
|
||||||
"hidden md:self-center flex md:flex items-center md:mb-0 fixed w-full md:w-auto md:static justify-end left-0 rtl:left-auto rtl:right-0 bottom-0 p-3 md:p-0",
|
'hidden md:self-center flex md:flex items-center md:mb-0 fixed w-full md:w-auto md:static justify-end left-0 rtl:left-auto rtl:right-0 bottom-0 p-3 md:p-0',
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<div class="items-center flex justify-between w-full md:w-auto">
|
<div class="items-center flex justify-between w-full md:w-auto">
|
||||||
|
@ -146,11 +147,11 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
||||||
actions?.length ? (
|
actions?.length ? (
|
||||||
<span class="ml-4 rtl:ml-0 rtl:mr-4">
|
<span class="ml-4 rtl:ml-0 rtl:mr-4">
|
||||||
{actions.map((btnProps) => (
|
{actions.map((btnProps) => (
|
||||||
<Button {...btnProps} class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto"/>
|
<Button {...btnProps} class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto" />
|
||||||
))}
|
))}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
""
|
''
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -17,12 +17,14 @@ const {
|
||||||
<div class="pt-0 md:pt-[76px] pointer-events-none"></div>
|
<div class="pt-0 md:pt-[76px] pointer-events-none"></div>
|
||||||
<div class="py-12 md:py-20 pb-8 md:pb-8">
|
<div class="py-12 md:py-20 pb-8 md:pb-8">
|
||||||
<div class="text-center max-w-5xl mx-auto">
|
<div class="text-center max-w-5xl mx-auto">
|
||||||
{tagline && (
|
{
|
||||||
<p
|
tagline && (
|
||||||
class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase"
|
<p
|
||||||
set:html={tagline}
|
class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase"
|
||||||
/>
|
set:html={tagline}
|
||||||
)}
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
{
|
{
|
||||||
title && (
|
title && (
|
||||||
<h1
|
<h1
|
||||||
|
|
|
@ -68,7 +68,8 @@ const {
|
||||||
{typeof callToAction === 'string' ? (
|
{typeof callToAction === 'string' ? (
|
||||||
<Fragment set:html={callToAction} />
|
<Fragment set:html={callToAction} />
|
||||||
) : (
|
) : (
|
||||||
callToAction && callToAction.href && <Button {...hasRibbon ? { variant:'primary' } : {}} {...callToAction}/>
|
callToAction &&
|
||||||
|
callToAction.href && <Button {...(hasRibbon ? { variant: 'primary' } : {})} {...callToAction} />
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -23,7 +23,7 @@ const {
|
||||||
{
|
{
|
||||||
stats &&
|
stats &&
|
||||||
stats.map(({ amount, title, icon }) => (
|
stats.map(({ amount, title, icon }) => (
|
||||||
<div class="p-4 md:w-1/4 sm:w-1/2 w-full min-w-[220px] text-center md:border-r md:last:border-none dark:md:border-slate-500">
|
<div class="p-4 md:w-1/4 sm:w-1/2 w-full min-w-[220px] text-center md:border-r md:last:border-none dark:md:border-slate-500">
|
||||||
{icon && (
|
{icon && (
|
||||||
<div class="flex items-center justify-center mx-auto mb-4 text-primary">
|
<div class="flex items-center justify-center mx-auto mb-4 text-primary">
|
||||||
<Icon name={icon} class="w-10 h-10" />
|
<Icon name={icon} class="w-10 h-10" />
|
||||||
|
|
|
@ -21,8 +21,8 @@ const {
|
||||||
---
|
---
|
||||||
|
|
||||||
<WidgetWrapper id={id} isDark={isDark} containerClass={`max-w-5xl ${classes?.container ?? ''}`} bg={bg}>
|
<WidgetWrapper id={id} isDark={isDark} containerClass={`max-w-5xl ${classes?.container ?? ''}`} bg={bg}>
|
||||||
<div class:list={['flex flex-col gap-8 md:gap-12', { 'md:flex-row-reverse': isReversed }, { 'md:flex-row': image}]}>
|
<div class:list={['flex flex-col gap-8 md:gap-12', { 'md:flex-row-reverse': isReversed }, { 'md:flex-row': image }]}>
|
||||||
<div class:list={["md:py-4 md:self-center", { 'md:basis-1/2': image }, { "w-full": !image}]}>
|
<div class:list={['md:py-4 md:self-center', { 'md:basis-1/2': image }, { 'w-full': !image }]}>
|
||||||
<Headline
|
<Headline
|
||||||
title={title}
|
title={title}
|
||||||
subtitle={subtitle}
|
subtitle={subtitle}
|
||||||
|
@ -38,20 +38,20 @@ const {
|
||||||
{
|
{
|
||||||
image && (
|
image && (
|
||||||
<div class="relative md:basis-1/2">
|
<div class="relative md:basis-1/2">
|
||||||
{(typeof image === 'string' ? (
|
{typeof image === 'string' ? (
|
||||||
<Fragment set:html={image} />
|
<Fragment set:html={image} />
|
||||||
) : (
|
) : (
|
||||||
<Image
|
<Image
|
||||||
class="inset-0 object-cover object-top w-full rounded-md shadow-lg md:absolute md:h-full bg-gray-400 dark:bg-slate-700"
|
class="inset-0 object-cover object-top w-full rounded-md shadow-lg md:absolute md:h-full bg-gray-400 dark:bg-slate-700"
|
||||||
widths={[400, 768]}
|
widths={[400, 768]}
|
||||||
sizes="(max-width: 768px) 100vw, 432px"
|
sizes="(max-width: 768px) 100vw, 432px"
|
||||||
width={432}
|
width={432}
|
||||||
height={768}
|
height={768}
|
||||||
layout="cover"
|
layout="cover"
|
||||||
src={image?.src}
|
src={image?.src}
|
||||||
alt={image?.alt || ''}
|
alt={image?.alt || ''}
|
||||||
/>
|
/>
|
||||||
))}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,9 +42,7 @@ const {
|
||||||
) : (
|
) : (
|
||||||
callToAction &&
|
callToAction &&
|
||||||
callToAction.text &&
|
callToAction.text &&
|
||||||
callToAction.href && (
|
callToAction.href && <Button variant="primary" {...callToAction} class="mb-12 w-auto" />
|
||||||
<Button variant="primary" {...callToAction} class="mb-12 w-auto"/>
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,7 +5,6 @@ import Button from '~/components/ui/Button.astro';
|
||||||
import Image from '~/components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import type { Testimonials } from '~/types';
|
import type { Testimonials } from '~/types';
|
||||||
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = '',
|
title = '',
|
||||||
subtitle = '',
|
subtitle = '',
|
||||||
|
|
|
@ -11,7 +11,7 @@ metadata:
|
||||||
title:
|
title:
|
||||||
default: Dragons child studios
|
default: Dragons child studios
|
||||||
template: '%s'
|
template: '%s'
|
||||||
description: "Welcome to the offical site for Dragons child studios."
|
description: 'Welcome to the offical site for Dragons child studios.'
|
||||||
robots:
|
robots:
|
||||||
index: true
|
index: true
|
||||||
follow: true
|
follow: true
|
||||||
|
|
24
src/content/post/site-announcement.md
Normal file
24
src/content/post/site-announcement.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
---
|
||||||
|
publishDate: 2024-06-21T16:20:00Z
|
||||||
|
title: 'Project and site announcements'
|
||||||
|
excerpt: Here is a post talking about new things we have started working on as well as a new site.
|
||||||
|
image: https://dragonschild.gcoms.xyz/banner.png
|
||||||
|
tags:
|
||||||
|
- announcement
|
||||||
|
metadata:
|
||||||
|
canonical: https://dragonschildstudios/site-announcement
|
||||||
|
---
|
||||||
|
|
||||||
|
Hi there, we have some new things to announce that are in the works.
|
||||||
|
|
||||||
|
### ValkyrieChat (Shortened to Valkyrie internally)
|
||||||
|
|
||||||
|
Valkyrie is a chat platform that we are currently developing since some of our team members have found glitches with how the Discord platform works for them. This plaatform is in early development (it is so early development there is not even an alpha yet)
|
||||||
|
|
||||||
|
### Dragon's child forum
|
||||||
|
|
||||||
|
Dragon's child forum is a forum setup by myself over the last couple of days as a place where people can ask questions of our team, make suggestions or just hang our and chat among themselves about whatever the team have announced on there e.g. Games, Services and other things, we hope you will take some time to look at our new forum site and say hello.
|
||||||
|
|
||||||
|
Thanks for reading this small announcement on this site,
|
||||||
|
|
||||||
|
Toastie (Leader/CEO?)
|
|
@ -5,8 +5,8 @@ import type { MetaData } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
frontmatter: {
|
frontmatter: {
|
||||||
title?: string
|
title?: string;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const { frontmatter } = Astro.props;
|
const { frontmatter } = Astro.props;
|
||||||
|
|
|
@ -49,6 +49,7 @@ export const footerData = {
|
||||||
title: 'Support',
|
title: 'Support',
|
||||||
links: [
|
links: [
|
||||||
{ text: 'Status', href: 'https://status.dragonschildhosting.net' },
|
{ text: 'Status', href: 'https://status.dragonschildhosting.net' },
|
||||||
|
{ text: 'Forums', href: 'https://forum.dragonschildstudios.com' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
// Commenting this out until this page is ready.
|
// Commenting this out until this page is ready.
|
||||||
|
@ -62,12 +63,14 @@ export const footerData = {
|
||||||
},
|
},
|
||||||
*/
|
*/
|
||||||
],
|
],
|
||||||
secondaryLinks: [
|
secondaryLinks: [{ text: 'Terms', href: getPermalink('/terms') }],
|
||||||
{ text: 'Terms', href: getPermalink('/terms') },
|
|
||||||
],
|
|
||||||
socialLinks: [
|
socialLinks: [
|
||||||
{ ariaLabel: 'RSS', icon: 'tabler:rss', href: getAsset('/rss.xml') },
|
{ ariaLabel: 'RSS', icon: 'tabler:rss', href: getAsset('/rss.xml') },
|
||||||
{ ariaLabel: 'Toastielab', icon: 'tabler:brand-git', href: 'https://toastielab.dev/Dragonschildstudios/dragonschildstudios.com' },
|
{
|
||||||
|
ariaLabel: 'Toastielab',
|
||||||
|
icon: 'tabler:brand-git',
|
||||||
|
href: 'https://toastielab.dev/Dragonschildstudios/dragonschildstudios.com',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
footNote: `
|
footNote: `
|
||||||
<a class="text-blue-600 hover:underline dark:text-gray-200" href="https://dragonschildstudios.com/"> Dragons child studios</a> · All rights reserved.
|
<a class="text-blue-600 hover:underline dark:text-gray-200" href="https://dragonschildstudios.com/"> Dragons child studios</a> · All rights reserved.
|
||||||
|
|
|
@ -37,11 +37,7 @@ const metadata = {
|
||||||
|
|
||||||
<Layout metadata={metadata}>
|
<Layout metadata={metadata}>
|
||||||
<section class="px-6 sm:px-6 py-12 sm:py-16 lg:py-20 mx-auto max-w-4xl">
|
<section class="px-6 sm:px-6 py-12 sm:py-16 lg:py-20 mx-auto max-w-4xl">
|
||||||
<Headline
|
<Headline subtitle="Here you can find out what we are up to at Dragons child studios.">Dragons Blog</Headline>
|
||||||
subtitle="Here you can find out what we are up to at Dragons child studios."
|
|
||||||
>
|
|
||||||
Dragons Blog
|
|
||||||
</Headline>
|
|
||||||
<BlogList posts={page.data} />
|
<BlogList posts={page.data} />
|
||||||
<Pagination prevUrl={page.url.prev} nextUrl={page.url.next} />
|
<Pagination prevUrl={page.url.prev} nextUrl={page.url.next} />
|
||||||
<!--
|
<!--
|
||||||
|
|
|
@ -35,7 +35,9 @@ const metadata = merge(
|
||||||
},
|
},
|
||||||
openGraph: {
|
openGraph: {
|
||||||
type: 'article',
|
type: 'article',
|
||||||
...(image ? { images: [{ url: image, width: (image as ImageMetadata)?.width, height: (image as ImageMetadata)?.height }] } : {}),
|
...(image
|
||||||
|
? { images: [{ url: image, width: (image as ImageMetadata)?.width, height: (image as ImageMetadata)?.height }] }
|
||||||
|
: {}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ ...(post?.metadata ? { ...post.metadata, canonical: post.metadata?.canonical || url } : {}) }
|
{ ...(post?.metadata ? { ...post.metadata, canonical: post.metadata?.canonical || url } : {}) }
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
import Features2 from '~/components/widgets/Features2.astro';
|
import Features2 from '~/components/widgets/Features2.astro';
|
||||||
import Features3 from '~/components/widgets/Features3.astro';
|
import Features3 from '~/components/widgets/Features3.astro';
|
||||||
import Hero from '~/components/widgets/Hero.astro';
|
import Hero from '~/components/widgets/Hero.astro';
|
||||||
import Stats from '~/components/widgets/Stats.astro';
|
|
||||||
import Steps2 from '~/components/widgets/Steps2.astro';
|
import Steps2 from '~/components/widgets/Steps2.astro';
|
||||||
import Layout from '~/layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
|
|
||||||
|
@ -14,166 +13,58 @@ const metadata = {
|
||||||
<Layout metadata={metadata}>
|
<Layout metadata={metadata}>
|
||||||
<!-- Hero Widget ******************* -->
|
<!-- Hero Widget ******************* -->
|
||||||
|
|
||||||
<Hero
|
<Hero tagline="About us">
|
||||||
tagline="About us"
|
|
||||||
image={{
|
|
||||||
src: 'https://images.unsplash.com/photo-1559136555-9303baea8ebd?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2070&q=80',
|
|
||||||
alt: 'Caos Image',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Fragment slot="title">
|
<Fragment slot="title">
|
||||||
Elevate your online presence with our <br />
|
A team who wants to create <br />
|
||||||
<span class="text-accent dark:text-white highlight"> Beautiful Website Templates</span>
|
<span class="text-accent dark:text-white highlight"> fun games and services</span>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
|
|
||||||
<Fragment slot="subtitle">
|
<Fragment slot="subtitle">
|
||||||
Donec efficitur, ipsum quis congue luctus, mauris magna convallis mauris, eu auctor nisi lectus non augue. Donec
|
Our team is a group of friends who came together through out love of games and we want to try and make games that
|
||||||
quis lorem non massa vulputate efficitur ac at turpis. Sed tincidunt ex a nunc convallis, et lobortis nisi tempus.
|
people will love.
|
||||||
Suspendisse vitae nisi eget tortor luctus maximus sed non lectus.
|
|
||||||
</Fragment>
|
</Fragment>
|
||||||
</Hero>
|
</Hero>
|
||||||
|
|
||||||
<!-- Stats Widget ****************** -->
|
|
||||||
|
|
||||||
<Stats
|
|
||||||
title="Statistics about us"
|
|
||||||
stats={[
|
|
||||||
{ title: 'Offices', amount: '4' },
|
|
||||||
{ title: 'Employees', amount: '248' },
|
|
||||||
{ title: 'Templates', amount: '12' },
|
|
||||||
{ title: 'Awards', amount: '24' },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Features3 Widget ************** -->
|
<!-- Features3 Widget ************** -->
|
||||||
|
|
||||||
<Features3
|
<Features3
|
||||||
title="Our templates"
|
title="Our Founders"
|
||||||
subtitle="Etiam scelerisque, enim eget vestibulum luctus, nibh mauris blandit nulla, nec vestibulum risus justo ut enim. Praesent lacinia diam et ante imperdiet euismod."
|
subtitle="The team members who started this adventure."
|
||||||
columns={3}
|
columns={2}
|
||||||
isBeforeContent={true}
|
isBeforeContent={true}
|
||||||
items={[
|
items={[
|
||||||
{
|
{
|
||||||
title: 'Educational',
|
title: 'Toastie',
|
||||||
description:
|
description: 'A software and systems administrator from the small country of New Zealand.',
|
||||||
'Morbi faucibus luctus quam, sit amet aliquet felis tempor id. Cras augue massa, ornare quis dignissim a, molestie vel nulla.',
|
icon: 'tabler:user',
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Interior Design',
|
title: 'Azreel Indrason',
|
||||||
description:
|
description: 'A chaotic yeen who had the initial dream of starting Dragons Child Studios.',
|
||||||
'Vivamus porttitor, tortor convallis aliquam pretium, turpis enim consectetur elit, vitae egestas purus erat ac nunc nulla.',
|
icon: 'tabler:user',
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Photography',
|
|
||||||
description:
|
|
||||||
'Duis sed lectus in nisl vehicula porttitor eget quis odio. Aliquam erat volutpat. Nulla eleifend nulla id sem fermentum.',
|
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- Features3 Widget ************** -->
|
|
||||||
|
|
||||||
<Features3
|
|
||||||
columns={3}
|
|
||||||
isAfterContent={true}
|
|
||||||
items={[
|
|
||||||
{
|
|
||||||
title: 'E-commerce',
|
|
||||||
description:
|
|
||||||
'Rutrum non odio at vehicula. Proin ipsum justo, dignissim in vehicula sit amet, dignissim id quam. Sed ac tincidunt sapien.',
|
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Blog',
|
|
||||||
description:
|
|
||||||
'Nullam efficitur volutpat sem sed fringilla. Suspendisse et enim eu orci volutpat laoreet ac vitae libero.',
|
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Business',
|
|
||||||
description:
|
|
||||||
'Morbi et elit finibus, facilisis justo ut, pharetra ipsum. Donec efficitur, ipsum quis congue luctus, mauris magna.',
|
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Branding',
|
|
||||||
description:
|
|
||||||
'Suspendisse vitae nisi eget tortor luctus maximus sed non lectus. Cras malesuada pretium placerat. Nullam venenatis dolor a ante rhoncus.',
|
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Medical',
|
|
||||||
description:
|
|
||||||
'Vestibulum malesuada lacus id nibh posuere feugiat. Nam volutpat nulla a felis ultrices, id suscipit mauris congue. In hac habitasse platea dictumst.',
|
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Fashion Design',
|
|
||||||
description:
|
|
||||||
'Maecenas eu tellus eget est scelerisque lacinia et a diam. Aliquam velit lorem, vehicula id fermentum et, rhoncus et purus.',
|
|
||||||
icon: 'tabler:template',
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
image={{
|
|
||||||
src: 'https://images.unsplash.com/photo-1504384308090-c894fdcc538d?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1740&q=80',
|
|
||||||
alt: 'Colorful Image',
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Steps2 Widget ****************** -->
|
<!-- Steps2 Widget ****************** -->
|
||||||
|
|
||||||
<Steps2
|
<Steps2
|
||||||
title="Our values"
|
title="Our values"
|
||||||
subtitle="Maecenas eu tellus eget est scelerisque lacinia et a diam. Aliquam velit lorem, vehicula id fermentum et, rhoncus et purus. Nulla facilisi. Vestibulum malesuada lacus."
|
subtitle="Our values that we hold in the heart of our team."
|
||||||
items={[
|
items={[
|
||||||
{
|
{
|
||||||
title: 'Customer-centric approach',
|
title: 'Privacy based',
|
||||||
description:
|
description: 'We do not like our data being sold so why should we sell your data off to other companies?',
|
||||||
'Donec id nibh neque. Quisque et fermentum tortor. Fusce vitae dolor a mauris dignissim commodo. Ut eleifend luctus condimentum.',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Constant Improvement',
|
title: 'Have fun making games',
|
||||||
description:
|
description:
|
||||||
'Phasellus laoreet fermentum venenatis. Vivamus dapibus pulvinar arcu eget mattis. Fusce eget mauris leo.',
|
'We try to have fun in all that we do. We love games and we love to play them. So why should we make games that arent fun?',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Ethical Practices',
|
title: 'Honesty and transparency',
|
||||||
description:
|
description:
|
||||||
'Vestibulum imperdiet libero et lectus molestie, et maximus augue porta. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.',
|
'If we have any privacy issues we will make sure that they are resolved and that a transparency report is made.',
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Steps2 Widget ****************** -->
|
|
||||||
|
|
||||||
<Steps2
|
|
||||||
title="Achievements"
|
|
||||||
subtitle="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi sagittis, quam nec venenatis lobortis, mi risus tempus nulla, sed porttitor est nibh at nulla."
|
|
||||||
isReversed={true}
|
|
||||||
callToAction={{
|
|
||||||
text: 'See more',
|
|
||||||
href: '/',
|
|
||||||
}}
|
|
||||||
items={[
|
|
||||||
{
|
|
||||||
title: 'Global reach',
|
|
||||||
description: 'Nam malesuada urna in enim imperdiet tincidunt. Phasellus non tincidunt nisi, at elementum mi.',
|
|
||||||
icon: 'tabler:globe',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Positive customer feedback and reviews',
|
|
||||||
description:
|
|
||||||
'Cras semper nulla leo, eget laoreet erat cursus sed. Praesent faucibus massa in purus iaculis dictum.',
|
|
||||||
icon: 'tabler:message-star',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Awards and recognition as industry experts',
|
|
||||||
description:
|
|
||||||
'Phasellus lacinia cursus velit, eu malesuada magna pretium eu. Etiam aliquet tellus purus, blandit lobortis ex rhoncus vitae.',
|
|
||||||
icon: 'tabler:award',
|
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
@ -181,47 +72,19 @@ const metadata = {
|
||||||
<!-- Features2 Widget ************** -->
|
<!-- Features2 Widget ************** -->
|
||||||
|
|
||||||
<Features2
|
<Features2
|
||||||
title="Our locations"
|
title="On our Discord or forums"
|
||||||
tagline="Find us"
|
|
||||||
columns={4}
|
|
||||||
items={[
|
|
||||||
{
|
|
||||||
title: 'EE.UU',
|
|
||||||
description: '1234 Lorem Ipsum St, 12345, Miami',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Spain',
|
|
||||||
description: '5678 Lorem Ipsum St, 56789, Madrid',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Australia',
|
|
||||||
description: '9012 Lorem Ipsum St, 90123, Sydney',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Brazil',
|
|
||||||
description: '3456 Lorem Ipsum St, 34567, São Paulo',
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Features2 Widget ************** -->
|
|
||||||
|
|
||||||
<Features2
|
|
||||||
title="Technical Support"
|
|
||||||
tagline="Contact us"
|
tagline="Contact us"
|
||||||
columns={2}
|
columns={2}
|
||||||
items={[
|
items={[
|
||||||
{
|
{
|
||||||
title: 'Chat with us',
|
title: 'Discord',
|
||||||
description:
|
description: 'Our Discord server is open to everyone. Feel free to join and ask us any questions!',
|
||||||
'Integer luctus laoreet libero, auctor varius purus rutrum sit amet. Ut nec molestie nisi, quis eleifend mi.',
|
icon: 'tabler:brand-discord',
|
||||||
icon: 'tabler:messages',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Call us',
|
title: 'Forums',
|
||||||
description:
|
description: 'Our forums are another place where you can reach us and ask questions.',
|
||||||
'Mauris faucibus finibus orci, in posuere elit viverra non. In hac habitasse platea dictumst. Cras lobortis metus a hendrerit congue.',
|
icon: 'tabler:messages',
|
||||||
icon: 'tabler:headset',
|
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -5,9 +5,7 @@
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"~/*": [
|
"~/*": ["src/*"]
|
||||||
"src/*"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue