Intial commit from techit@Techits-Mac-Pro

This commit is contained in:
Techit Thawiang
2025-09-21 19:59:04 +07:00
commit bee7386709
27 changed files with 9890 additions and 0 deletions
Executable
+7
View File
@@ -0,0 +1,7 @@
<template>
<UApp>
<NuxtLayout>
<NuxtPage/>
</NuxtLayout>
</UApp>
</template>
+130
View File
@@ -0,0 +1,130 @@
@import "tailwindcss";
@import "@nuxt/ui";
@theme {
--ui-container-lg: var(--container-5xl);
--ui-container-md: var(--container-3xl);
--ui-container-sm: var(--container-2xl);
--ui-container: var(--container-lg);
--ui-container-padding: calc(var(--spacing)*4);
--ui-header-title-height: calc(var(--spacing)*16);
--ui-header-navbar-height: calc(var(--spacing)*10);
--ui-bg-container: oklch(0.9557 0.1104 102.71);
--ui-bg-container-bd: oklch(0.85 0.1104 102.71);
--ui-on-bg-container: oklch(0.4644 0.0554 82.5);
--ui-primary: oklch(0.6358 0.1185 82.5);
--ui-primary-light: oklch(0.5 0.1185 82.5);
--ui-on-primary: oklch(1 0 0);
--ui-radius: 0.125rem;
--font-sans: OpenSans, Sarabun, sans-serif;
--font-sans--font-feature-settings: "liga", "calt", "ss01", "cv05", "cv06", "cv11";
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--font-serif: "Noto Serif", "Noto Serif Thai", Georgia, Garamond, "Times New Roman", Times, serif;
}
@supports (font-variation-settings: normal) {
:root {
--font-sans: OpenSansVariable, Sarabun, sans-serif;
font-optical-sizing: auto;
}
}
body {
font-size: 14px;
line-height: 20px;
-webkit-font-smoothing: unset!important;
-moz-osx-font-smoothing: unset!important;
}
.container {
margin: 0 auto;
padding: 0 var(--ui-container-padding);
@apply max-w-(--ui-container) sm:max-w-(--ui-container-sm) md:max-w-(--ui-container-md) lg:max-w-(--ui-container-lg);
}
.row {
@apply flex items-center;
}
.nav {
@apply pl-0 list-none;
}
.navbar-nav {
@apply md:float-left md:m-0;
}
.navbar-nav > li {
float: left;
display: flex;
}
.navbar-nav > li > a {
padding: 10.5px 14px;
}
.navbar-nav > li > a.router-link-active, .navbar-nav > li > a.router-link-active:hover {
@apply bg-linear-[to_bottom,rgba(0,0,0,0.3)_10%,rgba(0,0,0,0)_100%];
}
.navbar-nav > li > a:hover {
@apply bg-linear-[to_bottom,rgba(255,255,255,0)_0%,rgba(255,255,255,0.3)_10%,rgba(255,255,255,0)_100%];
}
.site-title {
display: flex;
flex-direction: row;
align-items: center;
height: var(--ui-header-title-height);
@apply border-t border-t-(--ui-on-bg-container) bg-linear-[to_bottom,var(--ui-bg-container-bd)_0%,var(--ui-bg-container)_35%] text-(--ui-on-bg-container);
}
.site-navbar {
min-height: var(--ui-header-navbar-height);
display: flex;
flex-direction: row;
align-items: center;
height: auto;
@apply bg-linear-[to_bottom,var(--ui-primary)_0%,var(--ui-primary-light)_90%] text-white;
}
.hero-section {
@apply py-16 drop-shadow-md bg-green-50 bg-cover bg-center;
}
.hero-section > .container > .brace {
@apply my-4;
}
.hero-section > .container > .title {
@apply text-4xl font-bold my-4;
line-height: 1.4em;
}
.hero-section > .container > .subtitle {
@apply text-xl my-4;
line-height: 1.4em;
}
.page-section {
@apply my-16;
}
.page-section > .container .title {
@apply text-2xl font-medium my-[0.75rem];
}
.page-section > .container p {
@apply my-[0.75rem];
}
.page-section.page-section-alt {
@apply my-0;
}
.page-section.page-section-alt > .container {
@apply my-0 flex justify-between items-center;
}
.page-section.page-section-alt > .container > .section {
@apply mb-4;
}
.page-section.page-section-alt > .container > .section-img {
@apply w-[45%];
img {
@apply my-16;
}
}
.footer {
@apply bg-(--ui-bg-muted) py-16;
}
.site-footer {
@apply block;
}
.footer-notice {
@apply block;
}
+28
View File
@@ -0,0 +1,28 @@
<script setup>
const { t, locale, setLocale } = useI18n()
const currentLocale = ref(locale.value)
const toggleLocale = () => {
const newLocale = currentLocale.value === 'en' ? 'th' : 'en'
setLocale(newLocale).then(() => {
window.location.reload()
})
}
</script>
<template>
<ClientOnly>
<UTooltip :text="t('ui.language.tooltip')">
<UButton
@click="toggleLocale"
variant="outline"
color="neutral"
size="sm"
:label="t('ui.language.switch')"
/>
</UTooltip>
<template #fallback>
<USkeleton class="size-8" />
</template>
</ClientOnly>
</template>
+21
View File
@@ -0,0 +1,21 @@
<template>
<footer class="footer site-footer">
<div class="site-footer">
<div class="container">
<section class="row">
<section class="footer-notice">
<img width="48" height="48" src="/favicon.ico" alt="*nix" class="text-2xl"></img>
<h2 class="text-2xl font-bold my-[0.5em]">*nix in Thailand (กซในประเทศไทย)</h2>
<p class="my-[0.5em]">{{t('footer.copyright.notice', {'year': year, 'yearB': year + 543})}}</p>
<LanguageSwitcher/>
</section>
</section>
</div>
</div>
</footer>
</template>
<script setup lang="ts">
const {t} = useI18n();
const year = 2025
</script>
+78
View File
@@ -0,0 +1,78 @@
<template>
<header>
<div class="site-title">
<div class="container flex justify-between">
<div class="row w-fit items-center">
<div class="row flex">
<img width="48" height="48" src="/favicon.ico" alt="*nix" class="text-2xl mr-4"></img>
<img width="124" height="20" src="/wordmark.svg" alt="in Thailand" class="text-2xl my-[13px]"></img>
</div>
</div>
<div class="hidden sm:flex w-fit items-center justify-end">
<div class="row">
<UFieldGroup>
<UButton size="sm" :label="t('sites.join-discord')" to="https://discord.gg/p5wuX5GwB7" icon="i-lucide-users" />
<UDropdownMenu
size="sm"
:items="siteTitleItems"
:content="{
align: 'end',
side: 'bottom',
sideOffset: 8
}"
:ui="{
content: 'w-36'
}"
>
<UButton size="sm" :label="t('sites.all')" icon="i-lucide-map" color="neutral" variant="outline" />
</UDropdownMenu>
</UFieldGroup>
</div>
</div>
</div>
</div>
<nav class="site-navbar">
<div class="container">
<div class="hidden sm:flex">
<ul class="nav navbar-nav">
<li class="nav-link">
<NuxtLinkLocale href="/">{{ t('nav.home') }}</NuxtLinkLocale>
</li>
<li class="nav-link">
<NuxtLinkLocale href="/about">{{ t('nav.about') }}</NuxtLinkLocale>
</li>
<li class="nav-link">
<NuxtLinkLocale href="/contact">{{ t('nav.contact') }}</NuxtLinkLocale>
</li>
</ul>
</div>
</div>
</nav>
</header>
</template>
<script lang="ts" setup>
const { t } = useI18n();
const siteTitleItems = ref<DropdownMenuItem[]>([
{
label: t('sites.wiki'),
icon: 'i-lucide-book-open-text',
to: 'https://wiki.unix.in.th'
},
{
label: t('sites.identity'),
icon: 'i-lucide-user',
to: 'https://identity.unix.in.th'
},
{
label: t('sites.forum'),
icon: 'i-lucide-messages-square',
to: 'https://forum.unix.in.th'
},
{
label: t('sites.status'),
icon: 'i-lucide-activity',
to: 'https://status.unix.in.th'
},
])
</script>
+7
View File
@@ -0,0 +1,7 @@
<template>
<div>
<WebHeader/>
<slot/>
<WebFooter/>
</div>
</template>
+29
View File
@@ -0,0 +1,29 @@
<template>
<main>
<article class="article">
<section class="hero-section">
<div class="container">
<h1 :id="t('about.hero.title').replace(/ /g, '_')" class="title">{{ t('about.hero.title') }}</h1>
<!-- <p :id="t('about.hero.sub').replace(/ /g, '_')" class="subtitle">{{ t('about.hero.sub') }}</p> -->
</div>
</section>
<section class="container">
</section>
</article>
</main>
</template>
<script setup>
const {t} = useI18n();
const config = useRuntimeConfig();
const baseUrl = config.public.baseUrl
useHead({
title: '*nix in Thailand',
titleTemplate: '%s',
meta: [
{ property: 'og:type', content: 'website' }
]
})
</script>
+28
View File
@@ -0,0 +1,28 @@
<template>
<main>
<article class="article">
<section class="hero-section">
<div class="container">
<img></img>
<h2 class="text-3xl ">contact page</h2>
</div>
</section>
<section class="container">
</section>
</article>
</main>
</template>
<script setup>
const config = useRuntimeConfig();
const baseUrl = config.public.baseUrl
useHead({
title: '*nix in Thailand',
titleTemplate: '%s',
meta: [
{ property: 'og:type', content: 'website' }
]
})
</script>
+69
View File
@@ -0,0 +1,69 @@
<template>
<main>
<article class="article">
<section class="hero-section">
<div class="container">
<img class="brace" width="100" src="/brace-smile.svg"></img>
<h1 :id="t('home.hero.title').replace(/ /g, '_')" class="title">{{ t('home.hero.title') }}</h1>
<p :id="t('home.hero.sub').replace(/ /g, '_')" class="subtitle">{{ t('home.hero.sub') }}</p>
</div>
</section>
<!-- <section class="page-section page-section-alt">
<div class="container">
<section class="section">
<h2 class="title">{{ t('home.wiki.title') }}</h2>
<p>{{ t('home.wiki.paragraph') }}</p>
<UButton to="https://wiki.unix.in.th" :label="t('home.wiki.go')"/>
</section>
<section class="section-img">
<img class="aspect-[4/3]" src="/wiki-mac.png"></img>
</section>
</div>
</section>
<section class="page-section page-section-alt">
<div class="container">
<section class="section">
<h2 class="title">{{ t('home.forum.title') }}</h2>
<p>{{ t('home.forum.paragraph') }}</p>
<UButton to="https://forum.unix.in.th" :label="t('home.forum.go')"/>
</section>
<section class="section-img">
<img class="aspect-[4/3]" src="/wiki-mac.png"></img>
</section>
</div>
</section> -->
<section class="page-section" :aria-labelledby="t('home.wiki.title').replace(/ /g, '_')" :aria-describedby="t('home.wiki.paragraph').replace(/ /g, '_')">
<div class="container">
<section class="section">
<h2 :id="t('home.wiki.title').replace(/ /g, '_')" class="title">{{ t('home.wiki.title') }}</h2>
<p :id="t('home.wiki.paragraph').replace(/ /g, '_')">{{ t('home.wiki.paragraph') }}</p>
<UButton to="https://wiki.unix.in.th" :label="t('home.wiki.go')"/>
</section>
</div>
</section>
<section class="page-section" :aria-labelledby="t('home.forum.title').replace(/ /g, '_')" :aria-describedby="t('home.forum.paragraph').replace(/ /g, '_')">
<div class="container">
<section class="section">
<h2 :id="t('home.forum.title').replace(/ /g, '_')" class="title">{{ t('home.forum.title') }}</h2>
<p :id="t('home.forum.paragraph').replace(/ /g, '_')">{{ t('home.forum.paragraph') }}</p>
<UButton to="https://forum.unix.in.th" :label="t('home.forum.go')"/>
</section>
</div>
</section>
</article>
</main>
</template>
<script setup>
const {t} = useI18n();
const config = useRuntimeConfig();
const baseUrl = config.public.baseUrl
useHead({
title: '*nix in Thailand',
titleTemplate: '%s',
meta: [
{ property: 'og:type', content: 'website' }
]
})
</script>