Site stuff

This commit is contained in:
Toastie (DCS Team) 2024-06-22 00:52:41 +12:00
commit d3f02683f0
Signed by: toastie_t0ast
GPG key ID: 27F3B6855AFD40A4
41 changed files with 350 additions and 656 deletions

View file

@ -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"
]
} }

View file

@ -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",

View file

@ -36,8 +36,9 @@ import '@fontsource-variable/inter';
--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 {
@ -54,7 +55,9 @@ import '@fontsource-variable/inter';
--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>

View file

@ -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">

View file

@ -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" />

View file

@ -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}

View file

@ -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
} }

View file

@ -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>

View file

@ -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;

View file

@ -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} />}

View file

@ -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"

View file

@ -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

View file

@ -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>
<h6 set:html={dt} />
<div class="dd ml-8" set:html={content} /> <div class="dd ml-8" set:html={content} />

View file

@ -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>
) )
} }

View file

@ -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>
) )
} }

View file

@ -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>
)} )}

View file

@ -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,59 +22,24 @@ 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,
description,
icon,
callToAction,
classes: itemClasses = {},
}) => (
<div
class={twMerge(
"relative flex flex-col",
panelClass,
itemClasses?.panel
)}
>
{(icon || defaultIcon) && ( {(icon || defaultIcon) && (
<Icon <Icon name={icon || defaultIcon} class={twMerge('mb-2 w-10 h-10', defaultIconClass, itemClasses?.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
class={twMerge(
"text-xl font-bold",
titleClass,
itemClasses?.title
)}
>
{title}
</div>
{description && ( {description && (
<p <p class={twMerge('text-muted mt-2', descriptionClass, itemClasses?.description)} set:html={description} />
class={twMerge(
"text-muted mt-2",
descriptionClass,
itemClasses?.description
)}
set:html={description}
/>
)} )}
{callToAction && ( {callToAction && (
<div class="mt-2"> <div class="mt-2">
@ -87,8 +47,7 @@ const {
</div> </div>
)} )}
</div> </div>
) ))}
)}
</div> </div>
) )
} }

View file

@ -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 = {} },
index = 0
) => (
<div class={twMerge("flex", panelClass, itemClasses?.panel)}>
<div class="flex flex-col items-center mr-4 rtl:mr-0 rtl:ml-4"> <div class="flex flex-col items-center mr-4 rtl:mr-0 rtl:ml-4">
<div> <div>
<div class="flex items-center justify-center"> <div class="flex items-center justify-center">
{(icon || defaultIcon) && ( {(icon || defaultIcon) && (
<Icon <Icon
name={icon || defaultIcon} name={icon || defaultIcon}
class={twMerge( class={twMerge('w-10 h-10 p-2 rounded-full border-2', defaultIconClass, itemClasses?.icon)}
"w-10 h-10 p-2 rounded-full border-2",
defaultIconClass,
itemClasses?.icon
)}
/> />
)} )}
</div> </div>
</div> </div>
{index !== items.length - 1 && ( {index !== items.length - 1 && <div class="w-px h-full bg-black/10 dark:bg-slate-400/50" />}
<div class="w-px h-full bg-black/10 dark:bg-slate-400/50" />
)}
</div> </div>
<div <div class={`pt-1 ${index !== items.length - 1 ? 'pb-8' : ''}`}>
class={`pt-1 ${ {title && <p class={twMerge('text-xl font-bold', titleClass, itemClasses?.title)} set:html={title} />}
index !== items.length - 1 ? "pb-8" : ""
}`}
>
{title && (
<p
class={twMerge(
"text-xl font-bold",
titleClass,
itemClasses?.title
)}
set:html={title}
/>
)}
{description && ( {description && (
<p <p
class={twMerge( class={twMerge('text-muted mt-2', descriptionClass, itemClasses?.description)}
"text-muted mt-2",
descriptionClass,
itemClasses?.description
)}
set:html={description} set:html={description}
/> />
)} )}
</div> </div>
</div> </div>
) ))}
)}
</div> </div>
) )
} }

View file

@ -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 },
]} ]}
> >

View file

@ -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>

View file

@ -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) : [];

View file

@ -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>
)} )}

View file

@ -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;

View file

@ -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 {}) ?? {}),
}} }}
/> />

View file

@ -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 {}) ?? {}),
}} }}
/> />

View file

@ -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">
@ -150,7 +151,7 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
))} ))}
</span> </span>
) : ( ) : (
"" ''
) )
} }
</div> </div>

View file

@ -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 && ( {
tagline && (
<p <p
class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase" class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase"
set:html={tagline} set:html={tagline}
/> />
)} )
}
{ {
title && ( title && (
<h1 <h1

View file

@ -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>
)} )}

View file

@ -22,7 +22,7 @@ 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,7 +38,7 @@ 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
@ -51,7 +51,7 @@ const {
src={image?.src} src={image?.src}
alt={image?.alt || ''} alt={image?.alt || ''}
/> />
))} )}
</div> </div>
) )
} }

View file

@ -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>

View file

@ -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 = '',

View file

@ -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

View 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?)

View file

@ -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;

View file

@ -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.

View file

@ -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} />
<!-- <!--

View file

@ -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 } : {}) }

View file

@ -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',
}, },
]} ]}
/> />

View file

@ -5,9 +5,7 @@
"allowJs": true, "allowJs": true,
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"~/*": [ "~/*": ["src/*"]
"src/*"
]
} }
} }
} }