Skip to content

Commit cd30fc6

Browse files
feat: new theme (#196)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent cf504c4 commit cd30fc6

263 files changed

Lines changed: 7679 additions & 3701 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app.config.ts

Lines changed: 17 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,60 @@
11
export default defineAppConfig({
22
ui: {
33
primary: 'yellow',
4-
gray: 'zinc',
5-
divider: {
6-
border: {
7-
base: 'flex border-zinc-200 dark:border-zinc-800',
8-
},
9-
},
10-
badge: {
4+
gray: 'cool',
5+
button: {
6+
base: 'transition ease-in',
117
color: {
128
gray: {
13-
solid: 'ring-1 ring-inset ring-zinc-300 dark:ring-zinc-700 text-zinc-700 dark:text-zinc-200 bg-zinc-50 dark:bg-zinc-800',
9+
solid: 'shadow-none bg-gray-300/20 hover:bg-gray-300/40 dark:bg-gray-700/40 dark:hover:bg-gray-700/50',
1410
},
1511
},
1612
},
17-
button: {
13+
select: {
1814
base: 'transition ease-in',
1915
color: {
20-
white: {
21-
solid: 'shadow-sm ring-1 ring-inset ring-zinc-300 dark:ring-zinc-700 text-zinc-900 dark:text-white bg-white hover:bg-zinc-50 disabled:bg-white dark:bg-zinc-900 dark:hover:bg-zinc-800/50 dark:disabled:bg-zinc-900 focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400',
22-
},
23-
gray: {
24-
solid: 'shadow-sm ring-1 ring-inset ring-zinc-300 dark:ring-zinc-700 text-zinc-700 dark:text-zinc-200 bg-zinc-50 hover:bg-zinc-100 disabled:bg-zinc-50 dark:bg-zinc-800 dark:hover:bg-zinc-700/50 dark:disabled:bg-zinc-800 focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400',
25-
ghost: 'text-zinc-700 dark:text-zinc-200 hover:text-zinc-900 dark:hover:text-white hover:bg-zinc-50 dark:hover:bg-zinc-800 focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400',
26-
},
16+
gray: { outline: 'shadow-none bg-gray-300/20 hover:bg-gray-300/40 dark:bg-gray-700/40 dark:hover:bg-gray-700/50' },
2717
},
2818
},
2919
buttonGroup: {
3020
shadow: 'shadow-none',
3121
},
32-
tooltip: {
33-
background: 'bg-white dark:bg-zinc-900',
34-
color: 'text-zinc-900 dark:text-white',
35-
ring: 'ring-1 ring-zinc-200 dark:ring-zinc-800',
36-
},
37-
kbd: {
38-
base: 'inline-flex items-center justify-center text-zinc-900 dark:text-white',
39-
background: 'bg-zinc-100 dark:bg-zinc-800',
40-
ring: 'ring-1 ring-zinc-300 dark:ring-zinc-700 ring-inset',
41-
},
4222
card: {
4323
base: 'transition ease-in duration-150',
44-
background: 'bg-white dark:bg-zinc-900',
45-
divide: 'divide-y divide-zinc-200 dark:divide-zinc-800',
46-
ring: 'ring-1 ring-zinc-200 dark:ring-zinc-700',
24+
4725
},
4826
input: {
27+
base: 'transition ease-in',
4928
color: {
50-
white: {
51-
outline: 'shadow-none bg-white dark:bg-zinc-900 text-zinc-900 dark:text-white ring-1 ring-inset ring-zinc-300 dark:ring-zinc-700 focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400',
52-
},
53-
placeholder: 'placeholder-zinc-400 dark:placeholder-zinc-500',
54-
},
55-
},
56-
select: {
57-
placeholder: 'text-zinc-900 dark:text-white',
58-
color: {
59-
white: {
60-
outline: 'shadow-none bg-white dark:bg-zinc-900 text-zinc-900 dark:text-white ring-1 ring-inset ring-zinc-300 dark:ring-zinc-700 focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400',
29+
gray: {
30+
outline: 'shadow-none bg-gray-300/20 hover:bg-gray-300/40 dark:bg-gray-700/40 dark:hover:bg-gray-700/50',
6131
},
6232
},
6333
},
6434
selectMenu: {
65-
background: 'bg-white dark:bg-zinc-800',
66-
ring: 'ring-1 ring-zinc-200 dark:ring-zinc-700',
6735
option: {
6836
base: 'cursor-pointer',
69-
color: 'text-zinc-900 dark:text-white',
70-
active: 'bg-zinc-100 dark:bg-zinc-900',
7137
},
7238
},
73-
avatar: {
74-
background: 'bg-zinc-100 dark:bg-zinc-800',
75-
rounded: 'rounded-full',
76-
text: 'font-medium leading-none text-zinc-900 dark:text-white truncate',
77-
placeholder: 'font-medium leading-none text-zinc-500 dark:text-zinc-400 truncate',
78-
},
79-
popover: {
80-
background: 'bg-white dark:bg-zinc-900',
81-
ring: 'ring-1 ring-zinc-200 dark:ring-zinc-800',
82-
},
8339
},
8440
website: {
8541
search: {
8642
groups: [
43+
/**
44+
* End / is very important since we use startsWith
45+
* Without, page /blog will be in the wrong group
46+
*/
8747
{
8848
name: 'Articles',
89-
path: '/resources',
49+
path: '/resources/',
9050
},
9151
{
9252
name: 'Blog',
93-
path: '/blog',
53+
path: '/blog/',
9454
},
9555
{
9656
name: 'Packages',
97-
path: '/packages',
57+
path: '/packages/',
9858
},
9959
],
10060
},
@@ -181,7 +141,6 @@ export default defineAppConfig({
181141
},
182142
],
183143
},
184-
{},
185144
],
186145
},
187146
socials: {

app.vue

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,38 @@
11
<script lang="ts" setup>
2+
import { joinURL } from 'ufo'
3+
4+
const site = useSiteConfig()
5+
6+
useHead({
7+
titleTemplate: title => title ? `${title} ${site.separator} ${site.name}` : `${site.name}: Unleash JavaScript\'s Potential`,
8+
htmlAttrs: {
9+
lang: site.defaultLocale,
10+
dir: 'ltr',
11+
class: 'scroll-smooth',
12+
},
13+
meta: [
14+
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
15+
{ name: 'theme-color', content: '#ECDC5A' },
16+
],
17+
link: [
18+
{ rel: 'icon', href: '/favicon.svg' },
19+
],
20+
})
21+
222
useSeoMeta({
3-
ogImage: 'https://unjs.io/og/home.jpg',
23+
ogSiteName: site.name,
24+
ogImage: joinURL(site.url, '/og/home.jpg'),
425
ogImageWidth: 1440,
526
ogImageHeight: 810,
27+
ogType: 'website',
28+
twitterCard: 'summary_large_image',
629
twitterSite: '@unjsio',
7-
twitterImage: 'https://unjs.io/og/home.jpg',
30+
twitterImage: joinURL(site.url, '/og/home.jpg'),
831
})
932
</script>
1033

1134
<template>
12-
<Html lang="en" dir="ltr" class="scroll-smooth">
35+
<Html>
1336
<Head>
1437
<SchemaOrgOrganization
1538
logo="/favicon.svg"
@@ -20,12 +43,19 @@ useSeoMeta({
2043
/>
2144
<SchemaOrgWebSite :potential-action="[defineSearchAction({ target: '/search?q={search_term_string}' })]" />
2245
<RobotMeta />
23-
<Link rel="icon" href="/favicon.svg" />
2446
</Head>
25-
<Body class="container mx-auto xl:max-w-7xl px-4 py-4 md:py-8 bg-primary font-sans">
47+
<Body class="font-sans dark:bg-gray-900">
48+
<NuxtLoadingIndicator color="#ECDC5A" />
49+
2650
<AppHeader />
27-
<NuxtPage />
51+
52+
<div class="px-4 container mx-auto xl:max-w-7xl">
53+
<NuxtPage />
54+
</div>
55+
2856
<AppFooter />
57+
58+
<UNotifications />
2959
</Body>
3060
</Html>
3161
</template>

assets/app.css

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,26 @@
1-
@font-face {
2-
font-family: "Nunito";
3-
font-weight: 100 900;
4-
font-display: swap;
5-
font-style: normal;
6-
src: url("/assets/fonts/nunito.ttf") format("truetype");
7-
}
8-
91
::-webkit-scrollbar {
102
width: 0.6em;
113
height: 0.6em;
12-
background: transparent;
4+
@apply bg-transparent;
135
}
146

157
::-webkit-scrollbar-track {
16-
background-color: transparent
17-
}
18-
19-
:is(.gray-scrollbar, pre)::-webkit-scrollbar-track {
20-
@apply bg-zinc-100 rounded-full
8+
@apply bg-gray-100;
219
}
2210

2311
::-webkit-scrollbar-thumb {
24-
@apply rounded-md bg-white
25-
}
26-
27-
:is(.gray-scrollbar, pre)::-webkit-scrollbar-thumb {
28-
@apply bg-zinc-400/20
12+
border-radius: 0.6em;
13+
@apply bg-gray-300 hover:bg-gray-400;
2914
}
3015

31-
::-webkit-scrollbar-thumb:hover {
32-
@apply bg-zinc-100
33-
}
34-
35-
:is(.gray-scrollbar, pre)::-webkit-scrollbar-thumb:hover {
36-
@apply bg-zinc-500/20
37-
}
38-
39-
::-webkit-scrollbar-thumb:active {
40-
@apply bg-zinc-200
41-
}
16+
.dark {
17+
& ::-webkit-scrollbar-track {
18+
@apply bg-gray-800;
19+
}
4220

43-
:is(.gray-scrollbar, pre)::-webkit-scrollbar-thumb:active {
44-
@apply bg-zinc-600/20
21+
& ::-webkit-scrollbar-thumb {
22+
@apply bg-gray-700 hover:bg-gray-600;
23+
}
4524
}
4625

4726
:is(h1, h2, h3, h4, h5, h6) {

components/Main.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<template>
2+
<main class="min-h-[calc(100vh-4rem)] py-8 md:py-16">
3+
<div v-if="$slots.header" class="mb-8 lg:mb-16">
4+
<slot name="header" />
5+
</div>
6+
7+
<slot />
8+
</main>
9+
</template>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script setup lang="ts">
2+
defineOptions({
3+
inheritAttrs: false,
4+
})
5+
6+
defineProps<{
7+
dark: string
8+
light: string
9+
}>()
10+
</script>
11+
12+
<template>
13+
<img :src="light" class="dark:hidden" v-bind="$attrs">
14+
<img :src="dark" class="hidden dark:block" v-bind="$attrs">
15+
</template>

components/app/AppFooter.vue

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,57 @@
11
<script lang="ts" setup>
22
const website = useWebsite()
33
4-
const uiButton = { color: { gray: { ghost: 'hover:bg-primary/10 dark:hover:bg-primary/90' } } }
4+
const colorMode = useColorMode()
5+
const toggleTheme = function () {
6+
colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark'
7+
}
8+
9+
const uiButton = { color: { gray: { ghost: 'text-gray-500 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200 hover:bg-primary/60 dark:hover:bg-primary/40' } } }
510
</script>
611

712
<template>
8-
<footer class="px-6 pt-20 pb-20 md:pb-30 flex flex-col gap-12 md:gap-20 rounded-2xl border border-zinc-100 bg-white">
9-
<div class="flex flex-col md:flex-row gap-12 md:gap-25">
10-
<div class="grow flex flex-col gap-6">
11-
<NuxtLink to="/" class="block">
12-
<AppLogo />
13-
</NuxtLink>
14-
<p class="max-w-lg text-sm md:text-base text-zinc-600 italic">
15-
{{ website.footer.quote }}
16-
</p>
17-
<ul class="flex gap-8">
13+
<div class="border-t border-gray-100 dark:border-gray-800">
14+
<footer class="container mx-auto max-w-7xl px-4 md:px-6 pt-20 pb-20 md:pb-30 flex flex-col gap-12 md:gap-20">
15+
<div class="grid md:grid-cols-2 gap-y-6 gap-x-12 md:gap-x-25">
16+
<div class="grow flex flex-col gap-6 max-w-sm">
17+
<NuxtLink to="/" class="block">
18+
<AppLogo />
19+
</NuxtLink>
20+
<p class="max-w-lg text-sm md:text-base text-gray-500 dark:text-gray-400 italic">
21+
{{ website.footer.quote }}
22+
</p>
23+
</div>
24+
<ul class="flex gap-2">
1825
<li v-for="social in website.socials" :key="social.name">
1926
<UButton :rel="social.rel" :target="social.target" :to="social.url" :icon="social.icon" :aria-label="`Follow us on ${social.name}`" size="xl" variant="ghost" color="gray" :ui="{ icon: { xl: 'md:w-7 md:h-7' }, ...uiButton }" />
2027
</li>
2128
</ul>
22-
</div>
23-
<nav class="grid grid-cols-2 md:grid-cols-3 gap-4 md:gap-10 text-[1.125rem]">
24-
<div v-for="list in website.footer.menu" :key="list.title" class="flex flex-col gap-4">
25-
<p class="font-bold">
26-
{{ list.title }}
27-
</p>
28-
<ul class="flex flex-col gap-3">
29-
<li v-for="item in list.items" :key="item.url">
30-
<NuxtLink :to="item.url" :rel="item.rel" :target="item.target" class="hover:underline underline-offset-8">
31-
{{ item.title }}
32-
</NuxtLink>
33-
</li>
34-
</ul>
29+
<nav class="mt-6 md:mt-0 md:justify-self-end md:col-start-2 md:row-start-1 grid grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-6 md:gap-10 text-[1.125rem]">
30+
<div v-for="list in website.footer.menu" :key="list.title" class="flex flex-col gap-4">
31+
<p class="font-bold text-gray-950 dark:text-gray-50">
32+
{{ list.title }}
33+
</p>
34+
<ul class="flex flex-col gap-3 text-gray-500 dark:text-gray-400">
35+
<li v-for="item in list.items" :key="item.url">
36+
<NuxtLink :to="item.url" :rel="item.rel" :target="item.target" class="hover:underline underline-offset-8">
37+
{{ item.title }}
38+
</NuxtLink>
39+
</li>
40+
</ul>
41+
</div>
42+
</nav>
43+
44+
<div class="place-self-center md:place-self-end">
45+
<ClientOnly>
46+
<UTooltip :text="$colorMode.value === 'dark' ? 'Light Mode' : 'Dark Mode'">
47+
<UButton size="xl" variant="ghost" color="gray" square :trailing-icon="$colorMode.value === 'dark' ? 'i-heroicons-sun' : 'i-heroicons-moon'" :ui="uiButton" aria-label="Toggle Theme" @click="toggleTheme">
48+
{{ $colorMode.value === 'dark' ? 'Light' : 'Dark' }}
49+
</UButton>
50+
</UTooltip>
51+
</ClientOnly>
3552
</div>
36-
</nav>
37-
</div>
38-
<AppFooterLicense class="text-sm text-zinc-400 text-center" />
39-
</footer>
53+
</div>
54+
<AppFooterLicense class="text-sm dark:text-gray-400 text-center" />
55+
</footer>
56+
</div>
4057
</template>

0 commit comments

Comments
 (0)