Compare commits

..

No commits in common. "d3f02683f06ed0bb209ca17a523894bf648e7e1b" and "e442c36cc7aac419e1d790d363ebcb5cdd66d23a" have entirely different histories.

41 changed files with 657 additions and 351 deletions

View file

@ -21,7 +21,12 @@
"type": "string"
}
},
"required": ["name", "site", "base", "trailingSlash"],
"required": [
"name",
"site",
"base",
"trailingSlash"
],
"additionalProperties": false
},
"metadata": {
@ -37,7 +42,10 @@
"type": "string"
}
},
"required": ["default", "template"]
"required": [
"default",
"template"
]
},
"description": {
"type": "string"
@ -52,7 +60,10 @@
"type": "boolean"
}
},
"required": ["index", "follow"]
"required": [
"index",
"follow"
]
},
"openGraph": {
"type": "object",
@ -61,7 +72,10 @@
"type": "string"
}
},
"required": ["site_name", "type"]
"required": [
"site_name",
"type"
]
},
"twitter": {
"type": "object",
@ -76,10 +90,20 @@
"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",
@ -91,7 +115,10 @@
"type": "string"
}
},
"required": ["language", "textDirection"]
"required": [
"language",
"textDirection"
]
},
"apps": {
"type": "object",
@ -124,10 +151,16 @@
"type": "boolean"
}
},
"required": ["index"]
"required": [
"index"
]
}
},
"required": ["isEnabled", "permalink", "robots"]
"required": [
"isEnabled",
"permalink",
"robots"
]
},
"list": {
"type": "object",
@ -148,10 +181,16 @@
"type": "boolean"
}
},
"required": ["index"]
"required": [
"index"
]
}
},
"required": ["isEnabled", "pathname", "robots"]
"required": [
"isEnabled",
"pathname",
"robots"
]
},
"category": {
"type": "object",
@ -172,10 +211,16 @@
"type": "boolean"
}
},
"required": ["index"]
"required": [
"index"
]
}
},
"required": ["isEnabled", "pathname", "robots"]
"required": [
"isEnabled",
"pathname",
"robots"
]
},
"tag": {
"type": "object",
@ -196,16 +241,31 @@
"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",
@ -217,20 +277,29 @@
"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",
@ -316,10 +385,17 @@
"type": "string"
}
},
"required": ["sans", "serif", "heading"]
"required": [
"sans",
"serif",
"heading"
]
}
},
"required": ["colors", "fonts"]
"required": [
"colors",
"fonts"
]
},
"dark": {
"type": "object",
@ -387,14 +463,30 @@
"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.7.0",
"@astrojs/rss": "^4.0.6",
"@astrojs/sitemap": "^3.1.6",
"@astrojs/check": "^0.4.1",
"@astrojs/rss": "^4.0.1",
"@astrojs/sitemap": "^3.0.4",
"@astrolib/analytics": "^0.5.0",
"@astrolib/seo": "^1.0.0-beta.5",
"@fontsource-variable/inter": "^5.0.16",
"astro": "^4.11.0",
"astro": "^4.1.1",
"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": "^3.1.1",
"@astrojs/partytown": "^2.1.1",
"@astrojs/mdx": "^2.0.3",
"@astrojs/partytown": "^2.0.3",
"@astrojs/tailwind": "5.1.0",
"@iconify-json/flat-color-icons": "^1.1.10",
"@iconify-json/tabler": "^1.1.103",

View file

@ -36,9 +36,8 @@ import '@fontsource-variable/inter';
--aw-color-bg-page-dark: rgb(3 6 32);
::selection {
background-color: lavender;
}
::selection {background-color: lavender;}
}
.dark {
@ -55,9 +54,7 @@ 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,12 +7,13 @@ 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,7 +74,13 @@ 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,11 +18,7 @@ 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) => (
@ -31,7 +27,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,9 +5,6 @@ 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,12 +12,7 @@ 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,11 +6,16 @@ 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,13 +10,14 @@
// 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');
const content:string = await Astro.slots.render('default');
---
<h6 set:html={dt} />
<div class="dd ml-8" set:html={content} />
<h6 set:html={dt}></h6>
<div class="dd ml-8" set:html={content}/>

View file

@ -70,9 +70,7 @@ 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,35 +1,48 @@
---
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,7 +52,13 @@ 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,18 +1,23 @@
---
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;
import { Icon } from "astro-icon/components";
import { twMerge } from "tailwind-merge";
import type { ItemGrid } from "~/types";
import Button from "./Button.astro";
const {
container: containerClass = '',
items = [],
columns,
defaultIcon = "",
classes = {},
} = Astro.props as ItemGrid;
const {
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;
---
@ -22,24 +27,59 @@ 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)}>
{(icon || defaultIcon) && (
<Icon name={icon || defaultIcon} class={twMerge('mb-2 w-10 h-10', defaultIconClass, itemClasses?.icon)} />
{items.map(
({
title,
description,
icon,
callToAction,
classes: itemClasses = {},
}) => (
<div
class={twMerge(
"relative flex flex-col",
panelClass,
itemClasses?.panel
)}
<div class={twMerge('text-xl font-bold', titleClass, itemClasses?.title)}>{title}</div>
>
{(icon || defaultIcon) && (
<Icon
name={icon || defaultIcon}
class={twMerge(
"mb-2 w-10 h-10",
defaultIconClass,
itemClasses?.icon
)}
/>
)}
<div
class={twMerge(
"text-xl font-bold",
titleClass,
itemClasses?.title
)}
>
{title}
</div>
{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">
@ -47,7 +87,8 @@ 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,43 +12,71 @@ 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://forum.dragonschildstudios.com" class="text-muted hover:underline dark:text-slate-400 font-medium"
>We have a forum.</a
<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
>
</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,10 +44,7 @@ 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,20 +16,30 @@ 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,23 +15,33 @@ 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,20 +83,19 @@ 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}
>
@ -109,8 +108,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}
>
@ -124,8 +123,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">
@ -147,11 +146,11 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`;
actions?.length ? (
<span class="ml-4 rtl:ml-0 rtl:mr-4">
{actions.map((btnProps) => (
<Button {...btnProps} class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto" />
<Button {...btnProps} class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto"/>
))}
</span>
) : (
''
""
)
}
</div>

View file

@ -17,14 +17,12 @@ 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,8 +68,7 @@ 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

@ -21,8 +21,8 @@ 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={['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}]}>
<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,7 +42,9 @@ 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,6 +5,7 @@ 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

@ -1,24 +0,0 @@
---
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,7 +49,6 @@ 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.
@ -63,14 +62,12 @@ 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,7 +37,11 @@ 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,9 +35,7 @@ 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,6 +2,7 @@
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';
@ -13,35 +14,135 @@ const metadata = {
<Layout metadata={metadata}>
<!-- Hero Widget ******************* -->
<Hero tagline="About us">
<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',
}}
>
<Fragment slot="title">
A team who wants to create <br />
<span class="text-accent dark:text-white highlight"> fun games and services</span>
Elevate your online presence with our <br />
<span class="text-accent dark:text-white highlight"> Beautiful Website Templates</span>
</Fragment>
<Fragment slot="subtitle">
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.
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.
</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 Founders"
subtitle="The team members who started this adventure."
columns={2}
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}
isBeforeContent={true}
items={[
{
title: 'Toastie',
description: 'A software and systems administrator from the small country of New Zealand.',
icon: 'tabler:user',
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: 'Azreel Indrason',
description: 'A chaotic yeen who had the initial dream of starting Dragons Child Studios.',
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',
},
]}
/>
<!-- 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."
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: 'Constant Improvement',
description:
'Phasellus laoreet fermentum venenatis. Vivamus dapibus pulvinar arcu eget mattis. Fusce eget mauris leo.',
},
{
title: 'Ethical Practices',
description:
'Vestibulum imperdiet libero et lectus molestie, et maximus augue porta. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.',
},
]}
/>
@ -49,22 +150,30 @@ const metadata = {
<!-- Steps2 Widget ****************** -->
<Steps2
title="Our values"
subtitle="Our values that we hold in the heart of our team."
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: 'Privacy based',
description: 'We do not like our data being sold so why should we sell your data off to other companies?',
title: 'Global reach',
description: 'Nam malesuada urna in enim imperdiet tincidunt. Phasellus non tincidunt nisi, at elementum mi.',
icon: 'tabler:globe',
},
{
title: 'Have fun making games',
title: 'Positive customer feedback and reviews',
description:
'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?',
'Cras semper nulla leo, eget laoreet erat cursus sed. Praesent faucibus massa in purus iaculis dictum.',
icon: 'tabler:message-star',
},
{
title: 'Honesty and transparency',
title: 'Awards and recognition as industry experts',
description:
'If we have any privacy issues we will make sure that they are resolved and that a transparency report is made.',
'Phasellus lacinia cursus velit, eu malesuada magna pretium eu. Etiam aliquet tellus purus, blandit lobortis ex rhoncus vitae.',
icon: 'tabler:award',
},
]}
/>
@ -72,19 +181,47 @@ const metadata = {
<!-- Features2 Widget ************** -->
<Features2
title="On our Discord or forums"
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"
tagline="Contact us"
columns={2}
items={[
{
title: 'Discord',
description: 'Our Discord server is open to everyone. Feel free to join and ask us any questions!',
icon: 'tabler:brand-discord',
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: 'Forums',
description: 'Our forums are another place where you can reach us and ask questions.',
icon: 'tabler:messages',
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',
},
]}
/>

View file

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