Site stuff

This commit is contained in:
Toastie 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"
}
},
"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"]
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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 {
frontmatter: {
title?: string
}
title?: string;
};
}
const { frontmatter } = Astro.props;

View file

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

View file

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

View file

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

View file

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

View file

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