Massive site update.
This commit is contained in:
parent
e442c36cc7
commit
22fe06c4b8
41 changed files with 350 additions and 656 deletions
146
.vscode/astrowind/config-schema.json
vendored
146
.vscode/astrowind/config-schema.json
vendored
|
@ -21,12 +21,7 @@
|
|||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"site",
|
||||
"base",
|
||||
"trailingSlash"
|
||||
],
|
||||
"required": ["name", "site", "base", "trailingSlash"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"metadata": {
|
||||
|
@ -42,10 +37,7 @@
|
|||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"default",
|
||||
"template"
|
||||
]
|
||||
"required": ["default", "template"]
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
|
@ -60,10 +52,7 @@
|
|||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"index",
|
||||
"follow"
|
||||
]
|
||||
"required": ["index", "follow"]
|
||||
},
|
||||
"openGraph": {
|
||||
"type": "object",
|
||||
|
@ -72,10 +61,7 @@
|
|||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"site_name",
|
||||
"type"
|
||||
]
|
||||
"required": ["site_name", "type"]
|
||||
},
|
||||
"twitter": {
|
||||
"type": "object",
|
||||
|
@ -90,20 +76,10 @@
|
|||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"handle",
|
||||
"site",
|
||||
"cardType"
|
||||
]
|
||||
"required": ["handle", "site", "cardType"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"title",
|
||||
"description",
|
||||
"robots",
|
||||
"openGraph",
|
||||
"twitter"
|
||||
]
|
||||
"required": ["title", "description", "robots", "openGraph", "twitter"]
|
||||
},
|
||||
"i18n": {
|
||||
"type": "object",
|
||||
|
@ -115,10 +91,7 @@
|
|||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"language",
|
||||
"textDirection"
|
||||
]
|
||||
"required": ["language", "textDirection"]
|
||||
},
|
||||
"apps": {
|
||||
"type": "object",
|
||||
|
@ -151,16 +124,10 @@
|
|||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"index"
|
||||
]
|
||||
"required": ["index"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"isEnabled",
|
||||
"permalink",
|
||||
"robots"
|
||||
]
|
||||
"required": ["isEnabled", "permalink", "robots"]
|
||||
},
|
||||
"list": {
|
||||
"type": "object",
|
||||
|
@ -181,16 +148,10 @@
|
|||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"index"
|
||||
]
|
||||
"required": ["index"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"isEnabled",
|
||||
"pathname",
|
||||
"robots"
|
||||
]
|
||||
"required": ["isEnabled", "pathname", "robots"]
|
||||
},
|
||||
"category": {
|
||||
"type": "object",
|
||||
|
@ -211,16 +172,10 @@
|
|||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"index"
|
||||
]
|
||||
"required": ["index"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"isEnabled",
|
||||
"pathname",
|
||||
"robots"
|
||||
]
|
||||
"required": ["isEnabled", "pathname", "robots"]
|
||||
},
|
||||
"tag": {
|
||||
"type": "object",
|
||||
|
@ -241,31 +196,16 @@
|
|||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"index"
|
||||
]
|
||||
"required": ["index"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"isEnabled",
|
||||
"pathname",
|
||||
"robots"
|
||||
]
|
||||
"required": ["isEnabled", "pathname", "robots"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"isEnabled",
|
||||
"postsPerPage",
|
||||
"post",
|
||||
"list",
|
||||
"category",
|
||||
"tag"
|
||||
]
|
||||
"required": ["isEnabled", "postsPerPage", "post", "list", "category", "tag"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"blog"
|
||||
]
|
||||
"required": ["blog"]
|
||||
},
|
||||
"analytics": {
|
||||
"type": "object",
|
||||
|
@ -277,29 +217,20 @@
|
|||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"partytown": {
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id"
|
||||
]
|
||||
"required": ["id"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"googleAnalytics"
|
||||
]
|
||||
"required": ["googleAnalytics"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"vendors"
|
||||
]
|
||||
"required": ["vendors"]
|
||||
},
|
||||
"ui": {
|
||||
"type": "object",
|
||||
|
@ -385,17 +316,10 @@
|
|||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"sans",
|
||||
"serif",
|
||||
"heading"
|
||||
]
|
||||
"required": ["sans", "serif", "heading"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"colors",
|
||||
"fonts"
|
||||
]
|
||||
"required": ["colors", "fonts"]
|
||||
},
|
||||
"dark": {
|
||||
"type": "object",
|
||||
|
@ -463,30 +387,14 @@
|
|||
"type": "object"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"colors",
|
||||
"fonts"
|
||||
]
|
||||
"required": ["colors", "fonts"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"default",
|
||||
"dark"
|
||||
]
|
||||
"required": ["default", "dark"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"theme",
|
||||
"tokens"
|
||||
]
|
||||
"required": ["theme", "tokens"]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"site",
|
||||
"metadata",
|
||||
"i18n",
|
||||
"apps",
|
||||
"analytics",
|
||||
"ui"
|
||||
]
|
||||
"required": ["site", "metadata", "i18n", "apps", "analytics", "ui"]
|
||||
}
|
12
package.json
12
package.json
|
@ -12,13 +12,13 @@
|
|||
"lint:eslint": "eslint . --ext .js,.ts,.astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/check": "^0.4.1",
|
||||
"@astrojs/rss": "^4.0.1",
|
||||
"@astrojs/sitemap": "^3.0.4",
|
||||
"@astrojs/check": "^0.7.0",
|
||||
"@astrojs/rss": "^4.0.6",
|
||||
"@astrojs/sitemap": "^3.1.6",
|
||||
"@astrolib/analytics": "^0.5.0",
|
||||
"@astrolib/seo": "^1.0.0-beta.5",
|
||||
"@fontsource-variable/inter": "^5.0.16",
|
||||
"astro": "^4.1.1",
|
||||
"astro": "^4.11.0",
|
||||
"astro-icon": "^1.0.2",
|
||||
"limax": "4.1.0",
|
||||
"lodash.merge": "^4.6.2",
|
||||
|
@ -26,8 +26,8 @@
|
|||
"unpic": "^3.16.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@astrojs/mdx": "^2.0.3",
|
||||
"@astrojs/partytown": "^2.0.3",
|
||||
"@astrojs/mdx": "^3.1.1",
|
||||
"@astrojs/partytown": "^2.1.1",
|
||||
"@astrojs/tailwind": "5.1.0",
|
||||
"@iconify-json/flat-color-icons": "^1.1.10",
|
||||
"@iconify-json/tabler": "^1.1.103",
|
||||
|
|
|
@ -36,8 +36,9 @@ import '@fontsource-variable/inter';
|
|||
|
||||
--aw-color-bg-page-dark: rgb(3 6 32);
|
||||
|
||||
::selection {background-color: lavender;}
|
||||
|
||||
::selection {
|
||||
background-color: lavender;
|
||||
}
|
||||
}
|
||||
|
||||
.dark {
|
||||
|
@ -54,7 +55,9 @@ import '@fontsource-variable/inter';
|
|||
--aw-color-text-muted: rgb(229 236 246 / 66%);
|
||||
--aw-color-bg-page: var(--aw-color-bg-page-dark);
|
||||
|
||||
::selection {background-color: black; color: snow}
|
||||
|
||||
::selection {
|
||||
background-color: black;
|
||||
color: snow;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -7,13 +7,12 @@ import Image from '~/components/common/Image.astro';
|
|||
import { findImage } from '~/utils/images';
|
||||
import { getPermalink } from '~/utils/permalinks';
|
||||
|
||||
|
||||
export interface Props {
|
||||
post: Post;
|
||||
}
|
||||
|
||||
const { post } = Astro.props;
|
||||
const image = (await findImage(post.image));
|
||||
const image = await findImage(post.image);
|
||||
---
|
||||
|
||||
<article class="mb-6 transition">
|
||||
|
|
|
@ -74,13 +74,7 @@ const { Content } = post;
|
|||
<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]"
|
||||
>
|
||||
{
|
||||
Content ? (
|
||||
<Content />
|
||||
) : (
|
||||
<Fragment set:html={post.content || ""} />
|
||||
)
|
||||
}
|
||||
{Content ? <Content /> : <Fragment set:html={post.content || ''} />}
|
||||
</div>
|
||||
<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" />
|
||||
|
|
|
@ -18,7 +18,11 @@ const { tags, class: className = 'text-sm', title = undefined, isCategory = fals
|
|||
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}>
|
||||
{tags.map((tag) => (
|
||||
|
@ -27,7 +31,7 @@ const { tags, class: className = 'text-sm', title = undefined, isCategory = fals
|
|||
tag
|
||||
) : (
|
||||
<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"
|
||||
>
|
||||
{tag}
|
||||
|
|
|
@ -5,6 +5,9 @@ import { ANALYTICS } from '~/utils/config';
|
|||
|
||||
{
|
||||
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
|
||||
}
|
||||
|
|
|
@ -1,33 +1,33 @@
|
|||
---
|
||||
import { UI } from "~/utils/config";
|
||||
import { UI } from '~/utils/config';
|
||||
|
||||
// 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) {
|
||||
if (theme === "dark") {
|
||||
document.documentElement.classList.add("dark");
|
||||
if (theme === 'dark') {
|
||||
document.documentElement.classList.add('dark');
|
||||
} 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) {
|
||||
matches.forEach((elem) => {
|
||||
elem.checked = theme !== "dark";
|
||||
elem.checked = theme !== 'dark';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if ((defaultTheme && defaultTheme.endsWith(":only")) || (!localStorage.theme && defaultTheme !== "system")) {
|
||||
applyTheme(defaultTheme.replace(":only", ""));
|
||||
if ((defaultTheme && defaultTheme.endsWith(':only')) || (!localStorage.theme && defaultTheme !== 'system')) {
|
||||
applyTheme(defaultTheme.replace(':only', ''));
|
||||
} else if (
|
||||
localStorage.theme === "dark" ||
|
||||
(!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches)
|
||||
localStorage.theme === 'dark' ||
|
||||
(!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)
|
||||
) {
|
||||
applyTheme("dark");
|
||||
applyTheme('dark');
|
||||
} else {
|
||||
applyTheme("light");
|
||||
applyTheme('light');
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -5,14 +5,14 @@ import {
|
|||
astroAsseetsOptimizer,
|
||||
unpicOptimizer,
|
||||
type ImageProps,
|
||||
type AttributesProps
|
||||
type AttributesProps,
|
||||
} from '~/utils/images-optimization';
|
||||
|
||||
type Props = ImageProps;
|
||||
type ImageType = {
|
||||
src: string;
|
||||
attributes: AttributesProps;
|
||||
}
|
||||
};
|
||||
|
||||
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} />}
|
|
@ -12,7 +12,12 @@ const { text, url, class: className = 'inline-block' } = Astro.props;
|
|||
|
||||
<div class={className}>
|
||||
<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
|
||||
name="tabler:mail"
|
||||
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 {
|
||||
label = 'Toggle Menu',
|
||||
class:
|
||||
className = "flex flex-col h-12 w-12 rounded justify-center items-center cursor-pointer group",
|
||||
class: className = 'flex flex-col h-12 w-12 rounded justify-center items-center cursor-pointer group',
|
||||
} = Astro.props;
|
||||
---
|
||||
|
||||
<button
|
||||
class={className}
|
||||
aria-label={label}
|
||||
data-aw-toggle-menu
|
||||
>
|
||||
<button class={className} aria-label={label} data-aw-toggle-menu>
|
||||
<span class="sr-only">{label}</span>
|
||||
<slot>
|
||||
<span
|
||||
|
|
|
@ -10,14 +10,13 @@
|
|||
// closing tags - it's simply contained in an enclosing div with a
|
||||
// margin left. No need for 'dd' items.
|
||||
//
|
||||
const {
|
||||
dt
|
||||
} = Astro.props;
|
||||
const { dt } = Astro.props;
|
||||
interface Props {
|
||||
dt:string
|
||||
dt: string;
|
||||
}
|
||||
|
||||
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} />
|
|
@ -70,7 +70,9 @@ const { inputs, textarea, disclaimer, button = 'Contact us', description = '' }
|
|||
{
|
||||
button && (
|
||||
<div class="mt-10 grid">
|
||||
<Button variant="primary" type="submit">{button}</Button>
|
||||
<Button variant="primary" type="submit">
|
||||
{button}
|
||||
</Button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,48 +1,35 @@
|
|||
---
|
||||
import type { Headline } from "~/types";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
import type { Headline } from '~/types';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
|
||||
const {
|
||||
title = await Astro.slots.render("title"),
|
||||
subtitle = await Astro.slots.render("subtitle"),
|
||||
title = await Astro.slots.render('title'),
|
||||
subtitle = await Astro.slots.render('subtitle'),
|
||||
tagline,
|
||||
classes = {},
|
||||
} = Astro.props as Headline;
|
||||
|
||||
const {
|
||||
container: containerClass = "max-w-3xl",
|
||||
title: titleClass = "text-3xl md:text-4xl ",
|
||||
subtitle: subtitleClass = "text-xl",
|
||||
container: containerClass = 'max-w-3xl',
|
||||
title: titleClass = 'text-3xl md:text-4xl ',
|
||||
subtitle: subtitleClass = 'text-xl',
|
||||
} = classes;
|
||||
---
|
||||
|
||||
{
|
||||
(title || subtitle || tagline) && (
|
||||
<div
|
||||
class={twMerge("mb-8 md:mx-auto md:mb-12 text-center", containerClass)}
|
||||
>
|
||||
<div class={twMerge('mb-8 md:mx-auto md:mb-12 text-center', containerClass)}>
|
||||
{tagline && (
|
||||
<p
|
||||
class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase"
|
||||
set:html={tagline}
|
||||
/>
|
||||
<p class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase" set:html={tagline} />
|
||||
)}
|
||||
{title && (
|
||||
<h2
|
||||
class={twMerge(
|
||||
"font-bold leading-tighter tracking-tighter font-heading text-heading text-3xl",
|
||||
titleClass
|
||||
)}
|
||||
class={twMerge('font-bold leading-tighter tracking-tighter font-heading text-heading text-3xl', titleClass)}
|
||||
set:html={title}
|
||||
/>
|
||||
)}
|
||||
|
||||
{subtitle && (
|
||||
<p
|
||||
class={twMerge("mt-4 text-muted", subtitleClass)}
|
||||
set:html={subtitle}
|
||||
/>
|
||||
)}
|
||||
{subtitle && <p class={twMerge('mt-4 text-muted', subtitleClass)} set:html={subtitle} />}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -52,13 +52,7 @@ const {
|
|||
/>
|
||||
)}
|
||||
{callToAction && (
|
||||
<div
|
||||
class={twMerge(
|
||||
`${title || description ? 'mt-3' : ''}`,
|
||||
actionClass,
|
||||
itemClasses?.actionClass
|
||||
)}
|
||||
>
|
||||
<div class={twMerge(`${title || description ? 'mt-3' : ''}`, actionClass, itemClasses?.actionClass)}>
|
||||
<Button variant="link" {...callToAction} />
|
||||
</div>
|
||||
)}
|
||||
|
|
|
@ -1,23 +1,18 @@
|
|||
---
|
||||
import { Icon } from "astro-icon/components";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
import type { ItemGrid } from "~/types";
|
||||
import Button from "./Button.astro";
|
||||
import { Icon } from 'astro-icon/components';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
import type { ItemGrid } from '~/types';
|
||||
import Button from './Button.astro';
|
||||
|
||||
const { items = [], columns, defaultIcon = '', classes = {} } = Astro.props as ItemGrid;
|
||||
|
||||
const {
|
||||
items = [],
|
||||
columns,
|
||||
defaultIcon = "",
|
||||
classes = {},
|
||||
} = Astro.props as ItemGrid;
|
||||
|
||||
const {
|
||||
container: containerClass = "",
|
||||
container: containerClass = '',
|
||||
// container: containerClass = "sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
|
||||
panel: panelClass = "",
|
||||
title: titleClass = "",
|
||||
description: descriptionClass = "",
|
||||
icon: defaultIconClass = "text-primary",
|
||||
panel: panelClass = '',
|
||||
title: titleClass = '',
|
||||
description: descriptionClass = '',
|
||||
icon: defaultIconClass = 'text-primary',
|
||||
} = classes;
|
||||
---
|
||||
|
||||
|
@ -27,59 +22,24 @@ const {
|
|||
class={twMerge(
|
||||
`grid gap-8 gap-x-12 sm:gap-y-8 ${
|
||||
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
|
||||
? "lg:grid-cols-3 sm:grid-cols-2"
|
||||
? 'lg:grid-cols-3 sm:grid-cols-2'
|
||||
: columns === 2
|
||||
? "sm:grid-cols-2 "
|
||||
: ""
|
||||
? 'sm:grid-cols-2 '
|
||||
: ''
|
||||
}`,
|
||||
containerClass
|
||||
)}
|
||||
>
|
||||
{items.map(
|
||||
({
|
||||
title,
|
||||
description,
|
||||
icon,
|
||||
callToAction,
|
||||
classes: itemClasses = {},
|
||||
}) => (
|
||||
<div
|
||||
class={twMerge(
|
||||
"relative flex flex-col",
|
||||
panelClass,
|
||||
itemClasses?.panel
|
||||
)}
|
||||
>
|
||||
{items.map(({ title, description, icon, callToAction, classes: itemClasses = {} }) => (
|
||||
<div class={twMerge('relative flex flex-col', panelClass, itemClasses?.panel)}>
|
||||
{(icon || defaultIcon) && (
|
||||
<Icon
|
||||
name={icon || defaultIcon}
|
||||
class={twMerge(
|
||||
"mb-2 w-10 h-10",
|
||||
defaultIconClass,
|
||||
itemClasses?.icon
|
||||
<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 && (
|
||||
<p
|
||||
class={twMerge(
|
||||
"text-muted mt-2",
|
||||
descriptionClass,
|
||||
itemClasses?.description
|
||||
)}
|
||||
set:html={description}
|
||||
/>
|
||||
<p class={twMerge('text-muted mt-2', descriptionClass, itemClasses?.description)} set:html={description} />
|
||||
)}
|
||||
{callToAction && (
|
||||
<div class="mt-2">
|
||||
|
@ -87,8 +47,7 @@ const {
|
|||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
)}
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
import { Icon } from "astro-icon/components";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
import type { Item } from "~/types";
|
||||
import { Icon } from 'astro-icon/components';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
import type { Item } from '~/types';
|
||||
|
||||
export interface Props {
|
||||
items?: Array<Item>;
|
||||
|
@ -12,71 +12,43 @@ export interface Props {
|
|||
const { items = [], classes = {}, defaultIcon } = Astro.props as Props;
|
||||
|
||||
const {
|
||||
container: containerClass = "",
|
||||
panel: panelClass = "",
|
||||
title: titleClass = "",
|
||||
description: descriptionClass = "",
|
||||
icon: defaultIconClass = "text-primary dark:text-slate-200 border-primary dark:border-blue-700",
|
||||
container: containerClass = '',
|
||||
panel: panelClass = '',
|
||||
title: titleClass = '',
|
||||
description: descriptionClass = '',
|
||||
icon: defaultIconClass = 'text-primary dark:text-slate-200 border-primary dark:border-blue-700',
|
||||
} = classes;
|
||||
---
|
||||
|
||||
{
|
||||
items && items.length && (
|
||||
<div class={containerClass}>
|
||||
{items.map(
|
||||
(
|
||||
{ title, description, icon, classes: itemClasses = {} },
|
||||
index = 0
|
||||
) => (
|
||||
<div class={twMerge("flex", panelClass, itemClasses?.panel)}>
|
||||
{items.map(({ 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>
|
||||
<div class="flex items-center justify-center">
|
||||
{(icon || defaultIcon) && (
|
||||
<Icon
|
||||
name={icon || defaultIcon}
|
||||
class={twMerge(
|
||||
"w-10 h-10 p-2 rounded-full border-2",
|
||||
defaultIconClass,
|
||||
itemClasses?.icon
|
||||
)}
|
||||
class={twMerge('w-10 h-10 p-2 rounded-full border-2', defaultIconClass, itemClasses?.icon)}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
{index !== items.length - 1 && (
|
||||
<div class="w-px h-full bg-black/10 dark:bg-slate-400/50" />
|
||||
)}
|
||||
{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}
|
||||
/>
|
||||
)}
|
||||
<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
|
||||
)}
|
||||
class={twMerge('text-muted mt-2', descriptionClass, itemClasses?.description)}
|
||||
set:html={description}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
)}
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
---
|
||||
import { twMerge } from "tailwind-merge";
|
||||
import Background from "./Background.astro";
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
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;
|
||||
---
|
||||
|
@ -15,7 +15,7 @@ const WrapperTag = as;
|
|||
</div>
|
||||
<div
|
||||
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 },
|
||||
]}
|
||||
>
|
||||
|
|
|
@ -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"
|
||||
>NEW</span
|
||||
>
|
||||
<a href="https://dragonschildstudios.com/welcome" class="text-muted hover:underline dark:text-slate-400 font-medium"
|
||||
>This site is now out of beta!</a
|
||||
<a href="https://forum.dragonschildstudios.com" class="text-muted hover:underline dark:text-slate-400 font-medium"
|
||||
>We have a forum.</a
|
||||
>
|
||||
</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 { findPostsByIds } from "~/utils/blog";
|
||||
import WidgetWrapper from "~/components/ui/WidgetWrapper.astro";
|
||||
import type { Widget } from "~/types";
|
||||
import { getBlogPermalink } from '~/utils/permalinks';
|
||||
import { findPostsByIds } from '~/utils/blog';
|
||||
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||
import type { Widget } from '~/types';
|
||||
|
||||
export interface Props extends Widget {
|
||||
title?: string;
|
||||
|
@ -17,16 +17,16 @@ export interface Props extends Widget {
|
|||
}
|
||||
|
||||
const {
|
||||
title = await Astro.slots.render("title"),
|
||||
linkText = "View all posts",
|
||||
title = await Astro.slots.render('title'),
|
||||
linkText = 'View all posts',
|
||||
linkUrl = getBlogPermalink(),
|
||||
information = await Astro.slots.render("information"),
|
||||
information = await Astro.slots.render('information'),
|
||||
postIds = [],
|
||||
|
||||
id,
|
||||
isDark = false,
|
||||
classes = {},
|
||||
bg = await Astro.slots.render("bg"),
|
||||
bg = await Astro.slots.render('bg'),
|
||||
} = Astro.props;
|
||||
|
||||
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 { findLatestPosts } from "~/utils/blog";
|
||||
import WidgetWrapper from "~/components/ui/WidgetWrapper.astro";
|
||||
import type { Widget } from "~/types";
|
||||
import Button from "../ui/Button.astro";
|
||||
import { getBlogPermalink } from '~/utils/permalinks';
|
||||
import { findLatestPosts } from '~/utils/blog';
|
||||
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||
import type { Widget } from '~/types';
|
||||
import Button from '../ui/Button.astro';
|
||||
|
||||
export interface Props extends Widget {
|
||||
title?: string;
|
||||
|
@ -18,16 +18,16 @@ export interface Props extends Widget {
|
|||
}
|
||||
|
||||
const {
|
||||
title = await Astro.slots.render("title"),
|
||||
linkText = "View all posts",
|
||||
title = await Astro.slots.render('title'),
|
||||
linkText = 'View all posts',
|
||||
linkUrl = getBlogPermalink(),
|
||||
information = await Astro.slots.render("information"),
|
||||
information = await Astro.slots.render('information'),
|
||||
count = 4,
|
||||
|
||||
id,
|
||||
isDark = false,
|
||||
classes = {},
|
||||
bg = await Astro.slots.render("bg"),
|
||||
bg = await Astro.slots.render('bg'),
|
||||
} = Astro.props;
|
||||
|
||||
const posts = APP_BLOG.isEnabled ? await findLatestPosts({ count }) : [];
|
||||
|
@ -44,7 +44,10 @@ const posts = APP_BLOG.isEnabled ? await findLatestPosts({ count }) : [];
|
|||
set:html={title}
|
||||
/>
|
||||
{APP_BLOG.list.isEnabled && linkText && linkUrl && (
|
||||
<Button variant="link" href={linkUrl}> {linkText} »</Button>
|
||||
<Button variant="link" href={linkUrl}>
|
||||
{' '}
|
||||
{linkText} »
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
||||
import type { CallToAction, Widget } from '~/types';
|
||||
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 {
|
||||
title?: string;
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
---
|
||||
import WidgetWrapper from "~/components/ui/WidgetWrapper.astro";
|
||||
import ItemGrid from "~/components/ui/ItemGrid.astro";
|
||||
import Headline from "~/components/ui/Headline.astro";
|
||||
import type { Features } from "~/types";
|
||||
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||
import ItemGrid from '~/components/ui/ItemGrid.astro';
|
||||
import Headline from '~/components/ui/Headline.astro';
|
||||
import type { Features } from '~/types';
|
||||
|
||||
const {
|
||||
title = await Astro.slots.render("title"),
|
||||
subtitle = await Astro.slots.render("subtitle"),
|
||||
tagline = await Astro.slots.render("tagline"),
|
||||
title = await Astro.slots.render('title'),
|
||||
subtitle = await Astro.slots.render('subtitle'),
|
||||
tagline = await Astro.slots.render('tagline'),
|
||||
items = [],
|
||||
columns = 2,
|
||||
|
||||
|
@ -16,30 +16,20 @@ const {
|
|||
id,
|
||||
isDark = false,
|
||||
classes = {},
|
||||
bg = await Astro.slots.render("bg"),
|
||||
bg = await Astro.slots.render('bg'),
|
||||
} = Astro.props as Features;
|
||||
---
|
||||
|
||||
<WidgetWrapper
|
||||
id={id}
|
||||
isDark={isDark}
|
||||
containerClass={`max-w-5xl ${classes?.container ?? ""}`}
|
||||
bg={bg}
|
||||
>
|
||||
<Headline
|
||||
title={title}
|
||||
subtitle={subtitle}
|
||||
tagline={tagline}
|
||||
classes={classes?.headline}
|
||||
/>
|
||||
<WidgetWrapper id={id} isDark={isDark} containerClass={`max-w-5xl ${classes?.container ?? ''}`} bg={bg}>
|
||||
<Headline title={title} subtitle={subtitle} tagline={tagline} classes={classes?.headline} />
|
||||
<ItemGrid
|
||||
items={items}
|
||||
columns={columns}
|
||||
defaultIcon={defaultIcon}
|
||||
classes={{
|
||||
container: "",
|
||||
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",
|
||||
container: '',
|
||||
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',
|
||||
...((classes?.items as {}) ?? {}),
|
||||
}}
|
||||
/>
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
---
|
||||
import WidgetWrapper from "~/components/ui/WidgetWrapper.astro";
|
||||
import Headline from "~/components/ui/Headline.astro";
|
||||
import ItemGrid2 from "~/components/ui/ItemGrid2.astro";
|
||||
import type { Features } from "~/types";
|
||||
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||
import Headline from '~/components/ui/Headline.astro';
|
||||
import ItemGrid2 from '~/components/ui/ItemGrid2.astro';
|
||||
import type { Features } from '~/types';
|
||||
|
||||
const {
|
||||
title = await Astro.slots.render("title"),
|
||||
subtitle = await Astro.slots.render("subtitle"),
|
||||
tagline = await Astro.slots.render("tagline"),
|
||||
title = await Astro.slots.render('title'),
|
||||
subtitle = await Astro.slots.render('subtitle'),
|
||||
tagline = await Astro.slots.render('tagline'),
|
||||
items = [],
|
||||
columns = 3,
|
||||
defaultIcon,
|
||||
|
@ -15,33 +15,23 @@ const {
|
|||
id,
|
||||
isDark = false,
|
||||
classes = {},
|
||||
bg = await Astro.slots.render("bg"),
|
||||
bg = await Astro.slots.render('bg'),
|
||||
} = Astro.props as Features;
|
||||
---
|
||||
|
||||
<WidgetWrapper
|
||||
id={id}
|
||||
isDark={isDark}
|
||||
containerClass={`max-w-7xl mx-auto ${classes?.container ?? ''}`}
|
||||
bg={bg}
|
||||
>
|
||||
<Headline
|
||||
title={title}
|
||||
subtitle={subtitle}
|
||||
tagline={tagline}
|
||||
classes={classes?.headline}
|
||||
/>
|
||||
<WidgetWrapper id={id} isDark={isDark} containerClass={`max-w-7xl mx-auto ${classes?.container ?? ''}`} bg={bg}>
|
||||
<Headline title={title} subtitle={subtitle} tagline={tagline} classes={classes?.headline} />
|
||||
<ItemGrid2
|
||||
items={items}
|
||||
columns={columns}
|
||||
defaultIcon={defaultIcon}
|
||||
classes={{
|
||||
container: "gap-4 md:gap-6",
|
||||
container: 'gap-4 md:gap-6',
|
||||
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',
|
||||
// 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",
|
||||
icon: "w-12 h-12 mb-6 text-primary",
|
||||
icon: 'w-12 h-12 mb-6 text-primary',
|
||||
...((classes?.items as {}) ?? {}),
|
||||
}}
|
||||
/>
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
---
|
||||
import { Icon } from "astro-icon/components";
|
||||
import Logo from "~/components/Logo.astro";
|
||||
import ToggleTheme from "~/components/common/ToggleTheme.astro";
|
||||
import ToggleMenu from "~/components/common/ToggleMenu.astro";
|
||||
import Button from "~/components/ui/Button.astro"
|
||||
import { Icon } from 'astro-icon/components';
|
||||
import Logo from '~/components/Logo.astro';
|
||||
import ToggleTheme from '~/components/common/ToggleTheme.astro';
|
||||
import ToggleMenu from '~/components/common/ToggleMenu.astro';
|
||||
import Button from '~/components/ui/Button.astro';
|
||||
|
||||
import { getHomePermalink } from "~/utils/permalinks";
|
||||
import { trimSlash, getAsset } from "~/utils/permalinks";
|
||||
import type { CallToAction } from "~/types";
|
||||
import { getHomePermalink } from '~/utils/permalinks';
|
||||
import { trimSlash, getAsset } from '~/utils/permalinks';
|
||||
import type { CallToAction } from '~/types';
|
||||
|
||||
interface Link {
|
||||
text?: string;
|
||||
|
@ -35,7 +35,7 @@ export interface Props {
|
|||
}
|
||||
|
||||
const {
|
||||
id = "header",
|
||||
id = 'header',
|
||||
links = [],
|
||||
actions = [],
|
||||
isSticky = false,
|
||||
|
@ -43,30 +43,30 @@ const {
|
|||
isFullWidth = false,
|
||||
showToggleTheme = false,
|
||||
showRssFeed = false,
|
||||
position = "center",
|
||||
position = 'center',
|
||||
} = Astro.props;
|
||||
|
||||
const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
||||
const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`;
|
||||
---
|
||||
|
||||
<header
|
||||
class:list={[
|
||||
{ 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 } : {}}
|
||||
>
|
||||
<div class="absolute inset-0"></div>
|
||||
<div
|
||||
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()}>
|
||||
<Logo />
|
||||
</a>
|
||||
|
@ -83,19 +83,20 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
|||
>
|
||||
{
|
||||
links.map(({ text, href, links }) => (
|
||||
<li class={links?.length ? "dropdown" : ""}>
|
||||
<li class={links?.length ? 'dropdown' : ''}>
|
||||
{links?.length ? (
|
||||
<>
|
||||
<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>
|
||||
<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 }) => (
|
||||
<li>
|
||||
<a
|
||||
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",
|
||||
{ "aw-link-active" : href2 === currentPath}
|
||||
'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 },
|
||||
]}
|
||||
href={href2}
|
||||
>
|
||||
|
@ -108,8 +109,8 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
|||
) : (
|
||||
<a
|
||||
class:list={[
|
||||
"hover:text-link dark:hover:text-white px-4 py-3 flex items-centers",
|
||||
{ "aw-link-active": href === currentPath }
|
||||
'hover:text-link dark:hover:text-white px-4 py-3 flex items-centers',
|
||||
{ 'aw-link-active': href === currentPath },
|
||||
]}
|
||||
href={href}
|
||||
>
|
||||
|
@ -123,8 +124,8 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
|||
</nav>
|
||||
<div
|
||||
class:list={[
|
||||
{ "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",
|
||||
{ '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',
|
||||
]}
|
||||
>
|
||||
<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>
|
||||
) : (
|
||||
""
|
||||
''
|
||||
)
|
||||
}
|
||||
</div>
|
||||
|
|
|
@ -17,12 +17,14 @@ const {
|
|||
<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="text-center max-w-5xl mx-auto">
|
||||
{tagline && (
|
||||
{
|
||||
tagline && (
|
||||
<p
|
||||
class="text-base text-secondary dark:text-blue-200 font-bold tracking-wide uppercase"
|
||||
set:html={tagline}
|
||||
/>
|
||||
)}
|
||||
)
|
||||
}
|
||||
{
|
||||
title && (
|
||||
<h1
|
||||
|
|
|
@ -68,7 +68,8 @@ const {
|
|||
{typeof callToAction === 'string' ? (
|
||||
<Fragment set:html={callToAction} />
|
||||
) : (
|
||||
callToAction && callToAction.href && <Button {...hasRibbon ? { variant:'primary' } : {}} {...callToAction}/>
|
||||
callToAction &&
|
||||
callToAction.href && <Button {...(hasRibbon ? { variant: 'primary' } : {})} {...callToAction} />
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
|
|
@ -22,7 +22,7 @@ const {
|
|||
|
||||
<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={["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
|
||||
title={title}
|
||||
subtitle={subtitle}
|
||||
|
@ -38,7 +38,7 @@ const {
|
|||
{
|
||||
image && (
|
||||
<div class="relative md:basis-1/2">
|
||||
{(typeof image === 'string' ? (
|
||||
{typeof image === 'string' ? (
|
||||
<Fragment set:html={image} />
|
||||
) : (
|
||||
<Image
|
||||
|
@ -51,7 +51,7 @@ const {
|
|||
src={image?.src}
|
||||
alt={image?.alt || ''}
|
||||
/>
|
||||
))}
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -42,9 +42,7 @@ const {
|
|||
) : (
|
||||
callToAction &&
|
||||
callToAction.text &&
|
||||
callToAction.href && (
|
||||
<Button variant="primary" {...callToAction} class="mb-12 w-auto"/>
|
||||
)
|
||||
callToAction.href && <Button variant="primary" {...callToAction} class="mb-12 w-auto" />
|
||||
)
|
||||
}
|
||||
</div>
|
||||
|
|
|
@ -5,7 +5,6 @@ import Button from '~/components/ui/Button.astro';
|
|||
import Image from '~/components/common/Image.astro';
|
||||
import type { Testimonials } from '~/types';
|
||||
|
||||
|
||||
const {
|
||||
title = '',
|
||||
subtitle = '',
|
||||
|
|
|
@ -11,7 +11,7 @@ metadata:
|
|||
title:
|
||||
default: Dragons child studios
|
||||
template: '%s'
|
||||
description: "Welcome to the offical site for Dragons child studios."
|
||||
description: 'Welcome to the offical site for Dragons child studios.'
|
||||
robots:
|
||||
index: 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 {
|
||||
frontmatter: {
|
||||
title?: string
|
||||
}
|
||||
title?: string;
|
||||
};
|
||||
}
|
||||
|
||||
const { frontmatter } = Astro.props;
|
||||
|
|
|
@ -49,6 +49,7 @@ export const footerData = {
|
|||
title: 'Support',
|
||||
links: [
|
||||
{ text: 'Status', href: 'https://status.dragonschildhosting.net' },
|
||||
{ text: 'Forums', href: 'https://forum.dragonschildstudios.com' },
|
||||
],
|
||||
},
|
||||
// Commenting this out until this page is ready.
|
||||
|
@ -62,12 +63,14 @@ export const footerData = {
|
|||
},
|
||||
*/
|
||||
],
|
||||
secondaryLinks: [
|
||||
{ text: 'Terms', href: getPermalink('/terms') },
|
||||
],
|
||||
secondaryLinks: [{ text: 'Terms', href: getPermalink('/terms') }],
|
||||
socialLinks: [
|
||||
{ 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: `
|
||||
<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}>
|
||||
<section class="px-6 sm:px-6 py-12 sm:py-16 lg:py-20 mx-auto max-w-4xl">
|
||||
<Headline
|
||||
subtitle="Here you can find out what we are up to at Dragons child studios."
|
||||
>
|
||||
Dragons Blog
|
||||
</Headline>
|
||||
<Headline subtitle="Here you can find out what we are up to at Dragons child studios.">Dragons Blog</Headline>
|
||||
<BlogList posts={page.data} />
|
||||
<Pagination prevUrl={page.url.prev} nextUrl={page.url.next} />
|
||||
<!--
|
||||
|
|
|
@ -35,7 +35,9 @@ const metadata = merge(
|
|||
},
|
||||
openGraph: {
|
||||
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 } : {}) }
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
import Features2 from '~/components/widgets/Features2.astro';
|
||||
import Features3 from '~/components/widgets/Features3.astro';
|
||||
import Hero from '~/components/widgets/Hero.astro';
|
||||
import Stats from '~/components/widgets/Stats.astro';
|
||||
import Steps2 from '~/components/widgets/Steps2.astro';
|
||||
import Layout from '~/layouts/PageLayout.astro';
|
||||
|
||||
|
@ -14,166 +13,58 @@ const metadata = {
|
|||
<Layout metadata={metadata}>
|
||||
<!-- Hero Widget ******************* -->
|
||||
|
||||
<Hero
|
||||
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',
|
||||
}}
|
||||
>
|
||||
<Hero tagline="About us">
|
||||
<Fragment slot="title">
|
||||
Elevate your online presence with our <br />
|
||||
<span class="text-accent dark:text-white highlight"> Beautiful Website Templates</span>
|
||||
A team who wants to create <br />
|
||||
<span class="text-accent dark:text-white highlight"> fun games and services</span>
|
||||
</Fragment>
|
||||
|
||||
<Fragment slot="subtitle">
|
||||
Donec efficitur, ipsum quis congue luctus, mauris magna convallis mauris, eu auctor nisi lectus non augue. Donec
|
||||
quis lorem non massa vulputate efficitur ac at turpis. Sed tincidunt ex a nunc convallis, et lobortis nisi tempus.
|
||||
Suspendisse vitae nisi eget tortor luctus maximus sed non lectus.
|
||||
Our team is a group of friends who came together through out love of games and we want to try and make games that
|
||||
people will love.
|
||||
</Fragment>
|
||||
</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
|
||||
title="Our templates"
|
||||
subtitle="Etiam scelerisque, enim eget vestibulum luctus, nibh mauris blandit nulla, nec vestibulum risus justo ut enim. Praesent lacinia diam et ante imperdiet euismod."
|
||||
columns={3}
|
||||
title="Our Founders"
|
||||
subtitle="The team members who started this adventure."
|
||||
columns={2}
|
||||
isBeforeContent={true}
|
||||
items={[
|
||||
{
|
||||
title: 'Educational',
|
||||
description:
|
||||
'Morbi faucibus luctus quam, sit amet aliquet felis tempor id. Cras augue massa, ornare quis dignissim a, molestie vel nulla.',
|
||||
icon: 'tabler:template',
|
||||
title: 'Toastie',
|
||||
description: 'A software and systems administrator from the small country of New Zealand.',
|
||||
icon: 'tabler:user',
|
||||
},
|
||||
{
|
||||
title: 'Interior Design',
|
||||
description:
|
||||
'Vivamus porttitor, tortor convallis aliquam pretium, turpis enim consectetur elit, vitae egestas purus erat ac nunc nulla.',
|
||||
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',
|
||||
title: 'Azreel Indrason',
|
||||
description: 'A chaotic yeen who had the initial dream of starting Dragons Child Studios.',
|
||||
icon: 'tabler:user',
|
||||
},
|
||||
]}
|
||||
/>
|
||||
|
||||
<!-- 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
|
||||
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={[
|
||||
{
|
||||
title: 'Customer-centric approach',
|
||||
description:
|
||||
'Donec id nibh neque. Quisque et fermentum tortor. Fusce vitae dolor a mauris dignissim commodo. Ut eleifend luctus condimentum.',
|
||||
title: 'Privacy based',
|
||||
description: 'We do not like our data being sold so why should we sell your data off to other companies?',
|
||||
},
|
||||
{
|
||||
title: 'Constant Improvement',
|
||||
title: 'Have fun making games',
|
||||
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:
|
||||
'Vestibulum imperdiet libero et lectus molestie, et maximus augue porta. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.',
|
||||
},
|
||||
]}
|
||||
/>
|
||||
|
||||
<!-- 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',
|
||||
'If we have any privacy issues we will make sure that they are resolved and that a transparency report is made.',
|
||||
},
|
||||
]}
|
||||
/>
|
||||
|
@ -181,47 +72,19 @@ const metadata = {
|
|||
<!-- Features2 Widget ************** -->
|
||||
|
||||
<Features2
|
||||
title="Our locations"
|
||||
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"
|
||||
title="On our Discord or forums"
|
||||
tagline="Contact us"
|
||||
columns={2}
|
||||
items={[
|
||||
{
|
||||
title: 'Chat with us',
|
||||
description:
|
||||
'Integer luctus laoreet libero, auctor varius purus rutrum sit amet. Ut nec molestie nisi, quis eleifend mi.',
|
||||
icon: 'tabler:messages',
|
||||
title: 'Discord',
|
||||
description: 'Our Discord server is open to everyone. Feel free to join and ask us any questions!',
|
||||
icon: 'tabler:brand-discord',
|
||||
},
|
||||
{
|
||||
title: 'Call us',
|
||||
description:
|
||||
'Mauris faucibus finibus orci, in posuere elit viverra non. In hac habitasse platea dictumst. Cras lobortis metus a hendrerit congue.',
|
||||
icon: 'tabler:headset',
|
||||
title: 'Forums',
|
||||
description: 'Our forums are another place where you can reach us and ask questions.',
|
||||
icon: 'tabler:messages',
|
||||
},
|
||||
]}
|
||||
/>
|
||||
|
|
|
@ -5,9 +5,7 @@
|
|||
"allowJs": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"~/*": [
|
||||
"src/*"
|
||||
]
|
||||
"~/*": ["src/*"]
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue