Начальный коммит
This commit is contained in:
commit
203b2d8403
42 changed files with 5183 additions and 0 deletions
29
src/app.css
Normal file
29
src/app.css
Normal file
|
@ -0,0 +1,29 @@
|
|||
@import "tailwindcss";
|
||||
@plugin "@tailwindcss/typography";
|
||||
@config "../tailwind.config.ts";
|
||||
|
||||
@font-face {
|
||||
font-family: 'Lineyka';
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
src: url('/fonts/lineyka.otf');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Disket Mono';
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
src: url('/fonts/Disket-Mono-Regular.ttf');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Disket Mono';
|
||||
font-style: normal;
|
||||
font-weight: bold;
|
||||
src: url('/fonts/Disket-Mono-Bold.ttf');
|
||||
}
|
||||
|
||||
.no-x-scroll {
|
||||
max-width: 100%;
|
||||
overflow-x: hidden;
|
||||
}
|
36
src/app.d.ts
vendored
Normal file
36
src/app.d.ts
vendored
Normal file
|
@ -0,0 +1,36 @@
|
|||
import type { Member } from '$lib/types/Member';
|
||||
|
||||
declare global {
|
||||
namespace App {
|
||||
// interface Error {}
|
||||
// interface Locals {}
|
||||
// interface PageData {}
|
||||
// interface Platform {}
|
||||
|
||||
interface Route {
|
||||
label: string;
|
||||
icon: string;
|
||||
href: string;
|
||||
}
|
||||
|
||||
interface MdsvexFile {
|
||||
default: import('svelte/internal').SvelteComponent;
|
||||
metadata: Record<string, string>;
|
||||
}
|
||||
|
||||
type MdsvexResolver = () => Promise<MdsvexFile>;
|
||||
|
||||
interface BlogPost {
|
||||
slug: string;
|
||||
title: string;
|
||||
thumbnail: string;
|
||||
date: string;
|
||||
description: string;
|
||||
publisher: string;
|
||||
published?: boolean;
|
||||
member?: Member;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export {};
|
18
src/app.html
Normal file
18
src/app.html
Normal file
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://teasanctuary.ru" />
|
||||
<meta name="theme-color" content="#63A002" />
|
||||
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="%sveltekit.assets%/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="%sveltekit.assets%/favicon-16x16.png">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
%sveltekit.head%
|
||||
</head>
|
||||
<body data-sveltekit-preload-data="hover">
|
||||
<div style="display: contents">%sveltekit.body%</div>
|
||||
</body>
|
||||
</html>
|
27
src/lib/components/HoverIcon.svelte
Normal file
27
src/lib/components/HoverIcon.svelte
Normal file
|
@ -0,0 +1,27 @@
|
|||
<script lang="ts">
|
||||
import Icon from '@iconify/svelte';
|
||||
|
||||
let className: string = '';
|
||||
export { className as class };
|
||||
export let src: string | null = null;
|
||||
export let text: string;
|
||||
export let size: number = 32;
|
||||
|
||||
let isUrl;
|
||||
$: isUrl = src?.startsWith('/') || src?.startsWith('http');
|
||||
</script>
|
||||
|
||||
<div class="{className} fill-slate-50 text-sm uppercase transition-all">
|
||||
{#if src}
|
||||
{#if isUrl}
|
||||
<img {src} alt={text} width={size} height={size} />
|
||||
{:else}
|
||||
<Icon width={size} height={size} icon={src} color="#f8fafc" />
|
||||
{/if}
|
||||
{:else}
|
||||
{text}
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
</style>
|
73
src/lib/components/SocialButton.svelte
Normal file
73
src/lib/components/SocialButton.svelte
Normal file
|
@ -0,0 +1,73 @@
|
|||
<script lang="ts">
|
||||
import HoverIcon from './HoverIcon.svelte';
|
||||
|
||||
export let href: string;
|
||||
let className: string = '';
|
||||
export { className as class };
|
||||
export let customIcon: string | null = null;
|
||||
|
||||
let url: URL;
|
||||
let host: string;
|
||||
|
||||
const icons: Record<string, string> = {
|
||||
none: 'material-symbols:link',
|
||||
'steamcommunity.com': 'simple-icons:steam',
|
||||
'twitter.com': 'simple-icons:x',
|
||||
'x.com': 'simple-icons:x',
|
||||
'github.com': 'simple-icons:github',
|
||||
'youtube.com': 'simple-icons:youtube',
|
||||
'itch.io': 'simple-icons:itchdotio',
|
||||
'discord.gg': 'simple-icons:discord',
|
||||
'gamebanana.com': 'simple-icons:gamebanana',
|
||||
// https://хамяк.рф
|
||||
'xn--80auf8a2c.xn--p1ai': 'fluent-emoji-high-contrast:hamster',
|
||||
'teasanctuary.ru': '/icons/tea-sanctuary.svg',
|
||||
'hl.teasanctuary.ru': '/icons/half-life.svg',
|
||||
localhost: '/icons/tea-sanctuary.svg',
|
||||
email: 'material-symbols:alternate-email'
|
||||
};
|
||||
|
||||
function getHost(url: URL) {
|
||||
const isEmail = url.href.startsWith('mailto:');
|
||||
const hostname = isEmail ? 'email' : url.hostname;
|
||||
// const split = hostname.split('.');
|
||||
// const name = split[Math.max(split.length - 2, 0)];
|
||||
// if (split.length > 1) return `${name}.${split[split.length - 1]}`;
|
||||
|
||||
// return name;
|
||||
return hostname;
|
||||
}
|
||||
|
||||
function tryGetIcon(link: string) {
|
||||
try {
|
||||
url = new URL(link);
|
||||
host = getHost(url).replace(/\.com$/, '');
|
||||
} catch {
|
||||
return icons['none'];
|
||||
}
|
||||
|
||||
let domain = getHost(url).toLocaleLowerCase();
|
||||
let key = Object.keys(icons).find((key) => key == domain);
|
||||
if (key == null) return icons['none'];
|
||||
|
||||
return icons[key];
|
||||
}
|
||||
</script>
|
||||
|
||||
<a
|
||||
{href}
|
||||
class="{className} drop-shadow-2xl flex flex-row transition-all hover:scale-110"
|
||||
target="_blank"
|
||||
>
|
||||
<div class="shrink-0 rounded-l-xl bg-slate-800 p-2">
|
||||
<HoverIcon src={customIcon ?? tryGetIcon(href)} class="text-sm uppercase" text={host} />
|
||||
</div>
|
||||
<div
|
||||
class="flex shrink-0 grow flex-nowrap items-center justify-center rounded-r-xl bg-slate-100 p-2 text-2xl text-nowrap text-slate-950"
|
||||
>
|
||||
<slot />
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<style>
|
||||
</style>
|
70
src/lib/components/SocialHyperlink.svelte
Normal file
70
src/lib/components/SocialHyperlink.svelte
Normal file
|
@ -0,0 +1,70 @@
|
|||
<script lang="ts">
|
||||
import HoverIcon from './HoverIcon.svelte';
|
||||
|
||||
export let href: string;
|
||||
let className: string = '';
|
||||
export { className as class };
|
||||
export let customIcon: string | null = null;
|
||||
|
||||
let url: URL;
|
||||
let host: string;
|
||||
|
||||
const icons: Record<string, string> = {
|
||||
none: 'material-symbols:link',
|
||||
'steamcommunity.com': 'simple-icons:steam',
|
||||
'twitter.com': 'simple-icons:x',
|
||||
'x.com': 'simple-icons:x',
|
||||
'github.com': 'simple-icons:github',
|
||||
'youtube.com': 'simple-icons:youtube',
|
||||
'itch.io': 'simple-icons:itchdotio',
|
||||
'discord.gg': 'simple-icons:discord',
|
||||
'gamebanana.com': 'simple-icons:gamebanana',
|
||||
// https://хамяк.рф
|
||||
'xn--80auf8a2c.xn--p1ai': 'fluent-emoji-high-contrast:hamster',
|
||||
'teasanctuary.ru': '/icons/tea-sanctuary.svg',
|
||||
'hl.teasanctuary.ru': '/icons/half-life.svg',
|
||||
localhost: '/icons/tea-sanctuary.svg',
|
||||
email: 'material-symbols:alternate-email'
|
||||
};
|
||||
|
||||
function getHost(url: URL) {
|
||||
const isEmail = url.href.startsWith('mailto:');
|
||||
const hostname = isEmail ? 'email' : url.hostname;
|
||||
// const split = hostname.split('.');
|
||||
// const name = split[Math.max(split.length - 2, 0)];
|
||||
// if (split.length > 1) return `${name}.${split[split.length - 1]}`;
|
||||
|
||||
// return name;
|
||||
return hostname;
|
||||
}
|
||||
|
||||
function tryGetIcon(link: string) {
|
||||
try {
|
||||
url = new URL(link);
|
||||
host = getHost(url).replace(/\.com$/, '');
|
||||
} catch {
|
||||
return icons['none'];
|
||||
}
|
||||
|
||||
let domain = getHost(url).toLocaleLowerCase();
|
||||
let key = Object.keys(icons).find((key) => key == domain);
|
||||
if (key == null) return icons['none'];
|
||||
|
||||
return icons[key];
|
||||
}
|
||||
</script>
|
||||
|
||||
<a {href} class="{className} inline-block ml-1 mr-1 group" target="_blank">
|
||||
<span class="inline-block size-8 shrink-0 rounded-xl bg-emerald-800 p-1 align-bottom transition-all group-hover:scale-110">
|
||||
<HoverIcon
|
||||
src={customIcon ?? tryGetIcon(href)}
|
||||
text={host}
|
||||
size={24}
|
||||
/>
|
||||
</span>
|
||||
<span class="items-center justify-center rounded-r-xl text-emerald-900 underline">
|
||||
<slot />
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<style></style>
|
24
src/routes/+error.svelte
Normal file
24
src/routes/+error.svelte
Normal file
|
@ -0,0 +1,24 @@
|
|||
<script lang="ts">
|
||||
import { page } from '$app/state';
|
||||
</script>
|
||||
|
||||
<section
|
||||
class="bg-[url('/common/background-day.webp')] dark:bg-[url('/common/background-night.webp')] bg-fixed bg-cover sticky flex h-screen shrink-0 flex-col items-center justify-center gap-12 overflow-hidden p-4"
|
||||
>
|
||||
<div class="flex flex-nowrap flex-col gap-5">
|
||||
<div class="flex flex-nowrap flex-col gap-3 items-center justify-center lg:flex-row lg:flex-nowrap">
|
||||
<div class="shrink-0 size-48 relative bg-slate-50 rounded-2xl shadow-[inset_0px_0px_0px_2px] shadow-slate-200">
|
||||
<img src="/common/dotted-line.svg" class="absolute left-0 right-0 top-0 bottom-0" alt="Пунктирная линия"/>
|
||||
<!-- В документации Tailwind советуют использовать "Inline SVG" -->
|
||||
<svg width="196" height="196" class="absolute left-0 right-0 top-0 bottom-0 stroke-slate-950" fill="none"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="6" d="M48.996 95.53c-18.624 5.826-30.621 14.965-30.621 25.239 0 17.599 35.19 31.866 78.604 31.866s78.604-14.267 78.604-31.866c0-10.274-11.997-19.413-30.617-25.24"/><path stroke-linecap="round" stroke-linejoin="round" stroke-width="6" d="M18.375 121.626c0 17.599 19.118 40.364 78.604 40.364 59.486 0 78.604-23.622 78.604-41.221"/><path stroke-linecap="round" stroke-linejoin="round" stroke-width="6" d="M37.493 53.042c0 24.97 16.66 73.762 59.486 73.762 42.826 0 59.482-48.792 59.482-73.757"/><path stroke-linecap="round" stroke-linejoin="round" stroke-width="6" d="M96.98 72.083c32.85 0 59.481-8.523 59.481-19.036 0-10.514-26.631-19.037-59.482-19.037-32.85 0-59.482 8.523-59.482 19.037 0 7.175 12.403 13.423 30.722 16.667 2.118.375 1.516 4.375 4.613 20.787 9.272-8.774 6.42-19.261 8.735-19.063 4.915.42 10.082.645 15.412.645z" style="stroke-linecap:round;stroke-linejoin:miter"/><path d="M148.79 90.518c21.944 2.71 28.835-9.795 28.835-20.354 0-2.77-.279-5.264-.858-7.436" style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#020618;stroke-width:6;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000;stop-opacity:1"/><path d="M137.677 66.047c-4.989-3.6-21.321-6.238-40.698-6.238s-35.71 2.639-40.701 6.24" style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#020618;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000;stop-opacity:1"/></svg>
|
||||
</div>
|
||||
|
||||
<div class="font-disket font-bold text-slate-50 text-6xl [text-shadow:_0_0_15px_rgba(0,0,0,0.25)] text-center md:text-8xl lg:text-left">
|
||||
<h1 class="text-rose-200 [text-shadow:_0_0_15px_oklch(0.271_0.105_12.094_/_0.25)]">
|
||||
{page.status}
|
||||
</h1>
|
||||
<h1>SANCTUARY</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
94
src/routes/+layout.svelte
Normal file
94
src/routes/+layout.svelte
Normal file
|
@ -0,0 +1,94 @@
|
|||
<script lang="ts">
|
||||
import '../app.css';
|
||||
// import '../syntax-highlight.css'; // https://github.com/PrismJS/prism-themes
|
||||
import { page } from '$app/state';
|
||||
import { slide } from 'svelte/transition';
|
||||
import { navigating } from '$app/state';
|
||||
// import NavButton from '$lib/components/Nav-Button.svelte';
|
||||
import Icon from '@iconify/svelte';
|
||||
|
||||
const routes: App.Route[] = [
|
||||
{ label: 'команда', icon: 'material-symbols:person', href: '/team' },
|
||||
{ label: 'новости', icon: 'material-symbols:newspaper', href: '/blog' },
|
||||
{ label: 'проекты', icon: 'material-symbols:work', href: '/projects' }
|
||||
];
|
||||
|
||||
let isMenuOpen = false;
|
||||
$: if (navigating) isMenuOpen = false;
|
||||
</script>
|
||||
<!--
|
||||
<nav class="sticky top-0 z-50 mx-auto flex w-full flex-col bg-blue drop-shadow-md">
|
||||
<div class="container mx-auto flex h-16 flex-row items-center justify-between px-2">
|
||||
<a
|
||||
href="/"
|
||||
class="group pointer-events-auto flex items-center py-2 font-lineyka text-xl font-bold text-white transition-all hover:scale-105 active:scale-95"
|
||||
>
|
||||
<img src="/common/logo-square.png" alt="square logo" class="h-14 pr-2" />
|
||||
<p>Tea Sanctuary</p>
|
||||
</a>
|
||||
<div class="hidden h-full flex-row items-center gap-2 md:flex">
|
||||
{#key page.url.pathname}
|
||||
{#each routes as route}
|
||||
<div class="h-full">
|
||||
<NavButton
|
||||
href={route.href}
|
||||
icon={route.icon}
|
||||
label={route.label}
|
||||
disabled={page.url.pathname == route.href}
|
||||
/>
|
||||
</div>
|
||||
{/each}
|
||||
{/key}
|
||||
</div>
|
||||
<button
|
||||
class="pointer-events-auto scale-100 text-white transition-all md:hidden"
|
||||
on:click={() => {
|
||||
isMenuOpen = !isMenuOpen;
|
||||
}}
|
||||
>
|
||||
{#if !isMenuOpen}
|
||||
<div in:slide={{ axis: 'x', duration: 100 }}>
|
||||
<Icon icon="material-symbols:menu" class="text-4xl" />
|
||||
</div>
|
||||
{:else}
|
||||
<div in:slide={{ axis: 'x', duration: 100 }}>
|
||||
<Icon icon="material-symbols:close" class="text-4xl" />
|
||||
</div>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
{#if isMenuOpen}
|
||||
<div
|
||||
class="container mx-auto flex flex-col gap-2 p-4 pt-2 font-lineyka text-xl font-medium text-white md:hidden"
|
||||
transition:slide={{ duration: 300 }}
|
||||
>
|
||||
{#each routes as route} -->
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
<!-- <a
|
||||
href={route.href}
|
||||
class="flex origin-left {page.url.pathname == route.href
|
||||
? 'opacity-75'
|
||||
: ''} items-center transition-all active:scale-95"
|
||||
>
|
||||
<Icon icon={route.icon} class="mr-2" />
|
||||
<p>{route.label}</p>
|
||||
</a>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
</nav> -->
|
||||
|
||||
<div class="relative flex flex-col">
|
||||
<slot />
|
||||
</div>
|
||||
|
||||
<footer class="bg-emerald-950">
|
||||
<div
|
||||
class="mx-auto w-full max-w-screen-xl justify-center px-2 py-6 text-center text-emerald-50 md:flex"
|
||||
>
|
||||
<p>
|
||||
<span class="font-bold">© 2025 Tea Sanctuary</span>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
1
src/routes/+layout.ts
Normal file
1
src/routes/+layout.ts
Normal file
|
@ -0,0 +1 @@
|
|||
export const prerender = true;
|
181
src/routes/+page.svelte
Normal file
181
src/routes/+page.svelte
Normal file
|
@ -0,0 +1,181 @@
|
|||
<script lang="ts">
|
||||
import { onMount } from 'svelte';
|
||||
import SocialButton from '$lib/components/SocialButton.svelte';
|
||||
// import { BlogAsNews, NewsAsNews, type NewsEntry } from '$lib/types/News';
|
||||
// import NewsCard from '$lib/components/NewsCard.svelte';
|
||||
import { PUBLIC_TS_DISCORD } from '$env/static/public';
|
||||
import SocialHyperlink from '$lib/components/SocialHyperlink.svelte';
|
||||
|
||||
// let posts: NewsEntry[] = [];
|
||||
// onMount(() => {
|
||||
// FetchNewsAsync()
|
||||
// .then((res) => {
|
||||
// // Fetch news posts.
|
||||
// if (res == null) {
|
||||
// console.log('Failed to fetch sbox.game news posts');
|
||||
// return;
|
||||
// }
|
||||
// posts = res.map((n) => NewsAsNews(n));
|
||||
// })
|
||||
// .then(async () => {
|
||||
// // Get blog posts.
|
||||
// const response = await fetch(`/api/posts`);
|
||||
// const blogPosts: App.BlogPost[] = (await response.json()).filter(
|
||||
// (post: App.BlogPost) => post.published ?? true
|
||||
// );
|
||||
// const blogs = blogPosts.map((b) => BlogAsNews(b));
|
||||
// posts = [...posts, ...blogs];
|
||||
// posts = posts.slice(0, 3);
|
||||
// posts = posts.sort((a, b) => (b.date as any) - (a.date as any));
|
||||
// });
|
||||
// });
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<meta property="og:title" content="Tea Sanctuary" />
|
||||
<meta property="og:image" content="https://teasanctuary.ru/common/logo.png" />
|
||||
<meta property="og:description" content="Делаем вещи как можем." />
|
||||
|
||||
<title>Tea Sanctuary</title>
|
||||
</svelte:head>
|
||||
|
||||
<section
|
||||
class="sticky flex h-screen shrink-0 flex-col items-center justify-center gap-5 overflow-hidden bg-[url('/common/background-day.webp')] bg-cover bg-fixed p-4 dark:bg-[url('/common/background-night.webp')]"
|
||||
>
|
||||
<div class="basis-full"></div>
|
||||
<div
|
||||
class="flex flex-col flex-nowrap items-center justify-center gap-3 lg:flex-row lg:flex-nowrap"
|
||||
>
|
||||
<div
|
||||
class="relative size-48 shrink-0 rounded-2xl bg-slate-50 shadow-[inset_0px_0px_0px_2px] shadow-slate-200"
|
||||
>
|
||||
<img
|
||||
src="/common/dotted-line.svg"
|
||||
class="absolute top-0 right-0 bottom-0 left-0"
|
||||
alt="Пунктирная линия"
|
||||
/>
|
||||
<!-- В документации Tailwind советуют использовать "Inline SVG" -->
|
||||
<svg
|
||||
width="196"
|
||||
height="196"
|
||||
class="absolute top-0 right-0 bottom-0 left-0 stroke-slate-950"
|
||||
fill="none"
|
||||
><path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="6"
|
||||
d="M48.996 95.53c-18.624 5.826-30.621 14.965-30.621 25.239 0 17.599 35.19 31.866 78.604 31.866s78.604-14.267 78.604-31.866c0-10.274-11.997-19.413-30.617-25.24"
|
||||
/><path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="6"
|
||||
d="M18.375 121.626c0 17.599 19.118 40.364 78.604 40.364 59.486 0 78.604-23.622 78.604-41.221"
|
||||
/><path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="6"
|
||||
d="M37.493 53.042c0 24.97 16.66 73.762 59.486 73.762 42.826 0 59.482-48.792 59.482-73.757"
|
||||
/><path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="6"
|
||||
d="M96.98 72.083c32.85 0 59.481-8.523 59.481-19.036 0-10.514-26.631-19.037-59.482-19.037-32.85 0-59.482 8.523-59.482 19.037 0 10.513 26.631 19.036 59.482 19.036Z"
|
||||
/><path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="6"
|
||||
d="M153.746 58.743c-6.958-7.938-29.739-13.757-56.767-13.757-27.027 0-49.808 5.819-56.77 13.76M147.6 90.349c24.664 4.41 30.025-9.625 30.025-20.184 0-10.56-4.051-17.117-13.377-17.117a10.125 10.125 0 0 0-7.913 3.854"
|
||||
/></svg
|
||||
>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="font-disket text-center text-6xl font-bold text-slate-50 [text-shadow:_0_0_15px_rgba(0,0,0,0.25)] md:text-8xl lg:text-left"
|
||||
>
|
||||
<h1>TEA</h1>
|
||||
<h1>SANCTUARY</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex basis-full flex-col items-center justify-start gap-4">
|
||||
<div class="flex flex-row gap-2 rounded-2xl bg-amber-950 p-2 text-center text-amber-50 ring-2 shadow">
|
||||
Сайт находится в разработке. Если эта плашка висит после 1.06.2025 - пинайте Ивана!
|
||||
</div>
|
||||
<div class="flex flex-row flex-wrap items-start justify-center gap-4">
|
||||
<SocialButton class="w-60 shrink-0" href={PUBLIC_TS_DISCORD}>Сообщество</SocialButton>
|
||||
<SocialButton class="w-60 shrink-0" href="https://github.com/TeaSanctuary/">
|
||||
GitHub
|
||||
</SocialButton>
|
||||
<SocialButton
|
||||
class="w-60 shrink-0"
|
||||
href="https://teasanctuary.ru/git"
|
||||
customIcon="devicon-plain:git"
|
||||
>
|
||||
Наш Git
|
||||
</SocialButton>
|
||||
<SocialButton class="w-60 shrink-0" href="https://hl.teasanctuary.ru">
|
||||
Сервер HLDM
|
||||
</SocialButton>
|
||||
</div>
|
||||
<SocialButton class="w-60 opacity-0 hover:opacity-100" href="https://хамяк.рф">
|
||||
хамяк)
|
||||
</SocialButton>
|
||||
</div>
|
||||
</section>
|
||||
<section class="flex justify-center bg-slate-50 text-slate-950">
|
||||
<!-- {#if posts}
|
||||
<div class="mb-20 flex justify-center px-2 pt-8 text-center">
|
||||
<p class="text-sm font-bold text-white text-shadow sm:text-2xl md:w-1/2">
|
||||
Latest Small Fish fishy news!
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="mb-20 flex w-full flex-row flex-wrap items-center justify-center gap-10 px-5 md:px-20"
|
||||
>
|
||||
{#each posts as post, i}
|
||||
<NewsCard {post} class="w-[30rem]" />
|
||||
{/each}
|
||||
</div>
|
||||
{/if} -->
|
||||
<div
|
||||
class="flex w-5xl max-w-screen flex-col flex-nowrap gap-12 p-2 px-2 pt-12 pb-12 text-base sm:text-xl"
|
||||
>
|
||||
<section id="who-are-we">
|
||||
<h1 class="font-disket mb-4 text-5xl font-bold sm:text-8xl">Кто мы?</h1>
|
||||
<div class="text-justify">
|
||||
<b>Tea Sanctuary</b> — это в первую очередь коллектив друзей, разрабатывающих проекты
|
||||
для души, для всеобщего пользования и даже на заказ. С <b>8 июля 2018 года</b> мы ведём публичную
|
||||
деятельность в сфере разработки ПО и развлечений.
|
||||
</div>
|
||||
<br />
|
||||
<div class="text-justify">
|
||||
<b>Tea Sanctuary</b> — это также и сообщество единомышленников. Любовь к добротным видеоиграм
|
||||
и пассивная агрессия к вычислительной технике у нас в крови. Когда-то сообщество было закрытым
|
||||
и насчитывало около 50 участников, но впоследствии мы решили его расширить. Станьте частью коллектива!
|
||||
</div>
|
||||
</section>
|
||||
<section id="what-are-we-doing">
|
||||
<h1 class="font-disket mb-4 text-5xl font-bold sm:text-8xl">Что делаем?</h1>
|
||||
<div class="text-justify">
|
||||
Наша главная страсть — это, конечно, видеоигры. Мы часто участвуем в так называемых
|
||||
"гейм джемах" — конкурсах на разработку игр. Наши игры вы можете оценить здесь:
|
||||
<SocialHyperlink customIcon="simple-icons:itchdotio" href="https://randomtrash.itch.io">Наш Itch.IO</SocialHyperlink>. Также мы
|
||||
ведём работу над нашим первым полноценным игровым проектом. Следите за новостями в нашем
|
||||
<SocialHyperlink href={PUBLIC_TS_DISCORD}>сообществе</SocialHyperlink>!
|
||||
</div>
|
||||
<br />
|
||||
<div class="text-justify">
|
||||
Отдельные участники нашего коллектива занимаются модификацией существующих игр, добавляя в
|
||||
них новый контент. Например, <b>MegaZerg</b> создаёт оригинальные карты для такой
|
||||
бессмертной классики, как Counter-Strike 1.6, и выкладывает их на ресурс GameBanana:
|
||||
<SocialHyperlink href="https://gamebanana.com/members/2971042">kemist</SocialHyperlink>
|
||||
</div>
|
||||
<br />
|
||||
<div class="text-justify">
|
||||
Не одними играми едины, за нашими плечами есть несколько прикладных программ, созданных под
|
||||
заказ. Про них ничего особо рассказать не можем, но если вам надо что-нибудь сделать —
|
||||
пишите нам!
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
6
src/routes/discord/+page.server.ts
Normal file
6
src/routes/discord/+page.server.ts
Normal file
|
@ -0,0 +1,6 @@
|
|||
import { redirect } from '@sveltejs/kit';
|
||||
import { PUBLIC_TS_DISCORD } from '$env/static/public';
|
||||
|
||||
export function load() {
|
||||
throw redirect(302, PUBLIC_TS_DISCORD);
|
||||
}
|
0
src/routes/discord/+page.svelte
Normal file
0
src/routes/discord/+page.svelte
Normal file
142
src/syntax-highlight.css
Normal file
142
src/syntax-highlight.css
Normal file
|
@ -0,0 +1,142 @@
|
|||
/**
|
||||
* atom-dark theme for `prism.js`
|
||||
* Based on Atom's `atom-dark` theme: https://github.com/atom/atom-dark-syntax
|
||||
* @author Joe Gibson (@gibsjose)
|
||||
*/
|
||||
|
||||
code[class*='language-'],
|
||||
pre[class*='language-'] {
|
||||
color: #c5c8c6;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, 0.3);
|
||||
font-family: Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace;
|
||||
direction: ltr;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
line-height: 1.5;
|
||||
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
pre[class*='language-'] {
|
||||
padding: 1em;
|
||||
margin: 0.5em 0;
|
||||
overflow: auto;
|
||||
border-radius: 0.3em;
|
||||
}
|
||||
|
||||
:not(pre) > code[class*='language-'],
|
||||
pre[class*='language-'] {
|
||||
background: #1d1f21;
|
||||
}
|
||||
|
||||
/* Inline code */
|
||||
:not(pre) > code[class*='language-'] {
|
||||
padding: 0.1em;
|
||||
border-radius: 0.3em;
|
||||
}
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: #7c7c7c;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #c5c8c6;
|
||||
}
|
||||
|
||||
.namespace {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.token.property,
|
||||
.token.keyword,
|
||||
.token.tag {
|
||||
color: #96cbfe;
|
||||
}
|
||||
|
||||
.token.class-name {
|
||||
color: #ffd466;
|
||||
}
|
||||
|
||||
.token.boolean,
|
||||
.token.constant {
|
||||
color: #99cc99;
|
||||
}
|
||||
|
||||
.token.symbol,
|
||||
.token.deleted {
|
||||
color: #f92672;
|
||||
}
|
||||
|
||||
.token.number {
|
||||
color: #fc749b;
|
||||
}
|
||||
|
||||
.token.selector,
|
||||
.token.attr-name,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.builtin,
|
||||
.token.inserted {
|
||||
color: #ffd466;
|
||||
}
|
||||
|
||||
.token.variable {
|
||||
color: #c6c5fe;
|
||||
}
|
||||
|
||||
.token.operator {
|
||||
color: #ededed;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
color: #ffffb6;
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
.token.url {
|
||||
color: #96cbfe;
|
||||
}
|
||||
|
||||
.language-css .token.string,
|
||||
.style .token.string {
|
||||
color: #87c38a;
|
||||
}
|
||||
|
||||
.token.atrule,
|
||||
.token.attr-value {
|
||||
color: #f9ee98;
|
||||
}
|
||||
|
||||
.token.function {
|
||||
color: #87c38a;
|
||||
}
|
||||
|
||||
.token.regex {
|
||||
color: #e9c062;
|
||||
}
|
||||
|
||||
.token.important {
|
||||
color: #fd971f;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue