@voidzero-dev/vitepress-theme 0.0.14 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/index-Bi151L4O.css +1 -0
- package/dist/index.js +6544 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +22 -15
- package/components/Eyebrow.vue +0 -11
- package/components/Footer.vue +0 -44
- package/components/Header.vue +0 -38
- package/components/RiveAnimation.vue +0 -144
- package/components/Terminal.vue +0 -165
- package/components/terminal-animations/TerminalAnimation1.vue +0 -54
- package/components/terminal-animations/TerminalAnimation2.vue +0 -59
- package/components/terminal-animations/TerminalAnimation3.vue +0 -46
- package/components/terminal-animations/TerminalAnimation4.vue +0 -50
- package/components/terminal-animations/TerminalAnimation5.vue +0 -51
- package/components/terminal-animations/TerminalAnimation6.vue +0 -55
- package/composables/useTypewriter.ts +0 -43
- package/index.ts +0 -44
- package/style.css +0 -346
- /package/{assets → dist/assets}/checkmark.svg +0 -0
- /package/{assets → dist/assets}/primary-button-background.jpg +0 -0
- /package/{assets → dist/assets}/terminal-background.jpg +0 -0
- /package/{fonts → dist/fonts}/APK-Protocol-Medium.woff2 +0 -0
- /package/{fonts → dist/fonts}/KHTeka-Medium.woff2 +0 -0
- /package/{fonts → dist/fonts}/KHTeka-Regular.woff2 +0 -0
- /package/{fonts → dist/fonts}/KHTekaMono-Medium.woff2 +0 -0
- /package/{fonts → dist/fonts}/KHTekaMono-Regular.woff2 +0 -0
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import {useTypewriter} from '../../composables/useTypewriter'
|
|
3
|
-
import {onMounted, onUnmounted} from "vue";
|
|
4
|
-
|
|
5
|
-
const props = defineProps<{
|
|
6
|
-
onAnimationComplete?: () => void
|
|
7
|
-
}>()
|
|
8
|
-
|
|
9
|
-
let typewriter;
|
|
10
|
-
|
|
11
|
-
onMounted(async () => {
|
|
12
|
-
const Typewriter = await useTypewriter()
|
|
13
|
-
const target = document.getElementById('terminal-code');
|
|
14
|
-
typewriter = new Typewriter(target, {
|
|
15
|
-
loop: false,
|
|
16
|
-
delay: 1,
|
|
17
|
-
})
|
|
18
|
-
typewriter
|
|
19
|
-
.typeString(`<span>$ vite test</span>`)
|
|
20
|
-
.pauseFor(200)
|
|
21
|
-
.pasteString(`<span class="block w-full h-[1rem]"></span>`)
|
|
22
|
-
.pasteString(`<div class="block"><span class="text-vite">VITE+ v1.0.0</span> <span class="text-aqua">test</span> RUN ~/vite-plus-demo</div>`)
|
|
23
|
-
.pasteString(`<span class="block w-full h-[1rem]"></span>`)
|
|
24
|
-
.pauseFor(300)
|
|
25
|
-
.pasteString(`<div class="block"><span class="text-zest">✓</span> test/hello.spec.ts <span class="text-grey">(1 test)</span> <span class="text-zest">1ms</span></div>`)
|
|
26
|
-
.pasteString(`<span class="block w-full h-[1rem]"></span>`)
|
|
27
|
-
.pasteString(`<div class="block text-grey">Test Files <span class="text-zest">1 passed</span> <span class="text-grey">(1)</span></div>`)
|
|
28
|
-
.pasteString(`<div class="block text-grey">Tests <span class="text-zest">1 passed</span> <span class="text-grey">(1)</span></div>`)
|
|
29
|
-
.pasteString(`<div class="block text-grey">Start at <span class="text-white">00:13:44</span></div>`)
|
|
30
|
-
.pasteString(`<div class="block text-grey">Duration <span class="text-white">199ms</span> <span class="text-grey">(transform 13ms, setup 0ms, collect 8ms, tests 1ms, environment 0ms, prepare 33ms)</span></div>`)
|
|
31
|
-
.pasteString(`<span class="block w-full h-[1rem]"></span>`)
|
|
32
|
-
.callFunction(() => {
|
|
33
|
-
if (props.onAnimationComplete) {
|
|
34
|
-
props.onAnimationComplete()
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
.start();
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
onUnmounted(() => {
|
|
41
|
-
if(typewriter){
|
|
42
|
-
typewriter.stop()
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
</script>
|
|
46
|
-
|
|
47
|
-
<template>
|
|
48
|
-
<p class="font-mono text-sm text-white leading-[1.5rem]">
|
|
49
|
-
<span id="terminal-code"></span>
|
|
50
|
-
</p>
|
|
51
|
-
</template>
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import {useTypewriter} from '../../composables/useTypewriter'
|
|
3
|
-
import {onMounted, onUnmounted} from "vue";
|
|
4
|
-
|
|
5
|
-
const props = defineProps<{
|
|
6
|
-
onAnimationComplete?: () => void
|
|
7
|
-
}>()
|
|
8
|
-
|
|
9
|
-
let typewriter;
|
|
10
|
-
|
|
11
|
-
onMounted(async () => {
|
|
12
|
-
const Typewriter = await useTypewriter()
|
|
13
|
-
const target = document.getElementById('terminal-code');
|
|
14
|
-
typewriter = new Typewriter(target, {
|
|
15
|
-
loop: false,
|
|
16
|
-
delay: 1,
|
|
17
|
-
})
|
|
18
|
-
typewriter
|
|
19
|
-
.typeString(`<span>$ vite build</span>`)
|
|
20
|
-
.pauseFor(200)
|
|
21
|
-
.pasteString(`<span class="block w-full h-[1rem]"></span>`)
|
|
22
|
-
.pasteString(`<div class="block"><span class="text-vite">VITE+ v1.0.0</span> <span class="text-aqua">building for production</span></div>`)
|
|
23
|
-
.pauseFor(100)
|
|
24
|
-
.pasteString(`<div class="block">transforming...</div>`)
|
|
25
|
-
.pauseFor(400)
|
|
26
|
-
.pasteString(`<div class="block"><span class="text-zest">✓</span> <span class="text-grey">32 modules transformed...</span></div>`)
|
|
27
|
-
.pauseFor(300)
|
|
28
|
-
.pasteString(`<div class="block">rendering chunks...</div>`)
|
|
29
|
-
.pasteString(`<div class="block">computing gzip size...</div>`)
|
|
30
|
-
.pasteString(`<div class="block text-grey"><span class="w-72 inline-block">dist/<span class="text-white">index.html</span></span> 0.46 kB | gzip: 0.30 kB</div>`)
|
|
31
|
-
.pasteString(`<div class="block text-grey"><span class="w-72 inline-block">dist/assets/<span class="text-vite">react-CHdo91hT.svg</span></span> 4.13 kB | gzip: 2.05 kB</div>`)
|
|
32
|
-
.pasteString(`<div class="block text-grey"><span class="w-72 inline-block">dist/assets/<span class="text-electric">index-D8b4DHJx.css</span></span> 1.39 kB | gzip: 0.71 kB</div>`)
|
|
33
|
-
.pasteString(`<div class="block text-grey"><span class="w-72 inline-block">dist/assets/<span class="text-aqua">index-CAl1KfkQ.js</span></span>188.06 kB | gzip: 59.21 kB</div>`)
|
|
34
|
-
.pasteString(`<div class="block"><span class="text-zest">✓ built in 308ms</span></div>`)
|
|
35
|
-
.pasteString(`<span class="block w-full h-[1rem]"></span>`)
|
|
36
|
-
.callFunction(() => {
|
|
37
|
-
if (props.onAnimationComplete) {
|
|
38
|
-
props.onAnimationComplete()
|
|
39
|
-
}
|
|
40
|
-
})
|
|
41
|
-
.start();
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
onUnmounted(() => {
|
|
45
|
-
if(typewriter){
|
|
46
|
-
typewriter.stop()
|
|
47
|
-
}
|
|
48
|
-
})
|
|
49
|
-
</script>
|
|
50
|
-
|
|
51
|
-
<template>
|
|
52
|
-
<p class="font-mono text-sm text-white leading-[1.5rem]">
|
|
53
|
-
<span id="terminal-code"></span>
|
|
54
|
-
</p>
|
|
55
|
-
</template>
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
// Dynamically load Typewriter from CDN
|
|
2
|
-
let TypewriterClass: any = null
|
|
3
|
-
let loadingPromise: Promise<any> | null = null
|
|
4
|
-
|
|
5
|
-
export async function useTypewriter() {
|
|
6
|
-
// Return cached class if already loaded
|
|
7
|
-
if (TypewriterClass) {
|
|
8
|
-
return TypewriterClass
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// Return existing loading promise if already loading
|
|
12
|
-
if (loadingPromise) {
|
|
13
|
-
return loadingPromise
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Start loading from CDN
|
|
17
|
-
loadingPromise = new Promise((resolve, reject) => {
|
|
18
|
-
// Check if already loaded globally
|
|
19
|
-
if ((window as any).Typewriter) {
|
|
20
|
-
TypewriterClass = (window as any).Typewriter
|
|
21
|
-
resolve(TypewriterClass)
|
|
22
|
-
return
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Create script tag to load from CDN
|
|
26
|
-
const script = document.createElement('script')
|
|
27
|
-
script.src = 'https://unpkg.com/typewriter-effect@2.22.0/dist/core.js'
|
|
28
|
-
script.async = true
|
|
29
|
-
|
|
30
|
-
script.onload = () => {
|
|
31
|
-
TypewriterClass = (window as any).Typewriter
|
|
32
|
-
resolve(TypewriterClass)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
script.onerror = () => {
|
|
36
|
-
reject(new Error('Failed to load Typewriter from CDN'))
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
document.head.appendChild(script)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
return loadingPromise
|
|
43
|
-
}
|
package/index.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @voidzero-dev/vitepress-theme
|
|
3
|
-
*
|
|
4
|
-
* Shared VitePress theme providing base styles, fonts, and design tokens
|
|
5
|
-
* for VoidZero projects.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* Extend this theme in your project's VitePress theme.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* // In your-project/.vitepress/theme/index.ts
|
|
13
|
-
* import Theme from '@voidzero-dev/vitepress-theme'
|
|
14
|
-
* import './overrides.css' // Your project-specific styles
|
|
15
|
-
*
|
|
16
|
-
* export default {
|
|
17
|
-
* extends: Theme,
|
|
18
|
-
* Layout: YourLayout
|
|
19
|
-
* }
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import type { Theme } from 'vitepress'
|
|
24
|
-
import Footer from './components/Footer.vue'
|
|
25
|
-
import Header from './components/Header.vue'
|
|
26
|
-
import Terminal from './components/Terminal.vue'
|
|
27
|
-
import Eyebrow from './components/Eyebrow.vue'
|
|
28
|
-
import RiveAnimation from './components/RiveAnimation.vue'
|
|
29
|
-
|
|
30
|
-
// NOTE: We don't import style.css here because the consuming theme
|
|
31
|
-
// needs to import Tailwind first, then our styles.
|
|
32
|
-
// See the usage example in the JSDoc comment above.
|
|
33
|
-
|
|
34
|
-
export default {
|
|
35
|
-
Layout: () => null, // Base theme provides no layout, consuming themes must provide one
|
|
36
|
-
enhanceApp({ app }) {
|
|
37
|
-
// Register shared components globally - available in all consuming projects
|
|
38
|
-
app.component('Footer', Footer)
|
|
39
|
-
app.component('Header', Header)
|
|
40
|
-
app.component('Terminal', Terminal)
|
|
41
|
-
app.component('Eyebrow', Eyebrow)
|
|
42
|
-
app.component('RiveAnimation', RiveAnimation)
|
|
43
|
-
}
|
|
44
|
-
} satisfies Theme
|
package/style.css
DELETED
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared theme styles
|
|
3
|
-
*
|
|
4
|
-
* NOTE: This file does NOT import Tailwind itself.
|
|
5
|
-
* The consuming project must import Tailwind first, then this file.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
@plugin "@tailwindcss/typography";
|
|
9
|
-
|
|
10
|
-
@custom-variant dark (&:where(.dark, .dark *));
|
|
11
|
-
|
|
12
|
-
/* Fonts */
|
|
13
|
-
@font-face {
|
|
14
|
-
font-family: 'APK Protocol';
|
|
15
|
-
font-weight: 500;
|
|
16
|
-
src: url('./fonts/APK-Protocol-Medium.woff2') format('woff2');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
@font-face {
|
|
20
|
-
font-family: 'KH Teka';
|
|
21
|
-
font-weight: 400;
|
|
22
|
-
src: url('./fonts/KHTeka-Regular.woff2') format('woff2');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
@font-face {
|
|
26
|
-
font-family: 'KH Teka';
|
|
27
|
-
font-weight: 500;
|
|
28
|
-
src: url('./fonts/KHTeka-Medium.woff2') format('woff2');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
@font-face {
|
|
32
|
-
font-family: 'KH Teka Mono';
|
|
33
|
-
font-weight: 400;
|
|
34
|
-
src: url('./fonts/KHTekaMono-Regular.woff2') format('woff2');
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
@font-face {
|
|
38
|
-
font-family: 'KH Teka Mono';
|
|
39
|
-
font-weight: 500;
|
|
40
|
-
src: url('./fonts/KHTekaMono-Medium.woff2') format('woff2');
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));
|
|
44
|
-
|
|
45
|
-
@theme {
|
|
46
|
-
--font-*: initial;
|
|
47
|
-
--font-heading: 'APK Protocol', sans-serif;
|
|
48
|
-
--font-sans: 'KH Teka', sans-serif;
|
|
49
|
-
--font-mono: 'KH Teka Mono', monospace;
|
|
50
|
-
|
|
51
|
-
--color-*: initial;
|
|
52
|
-
--color-white: #FFFFFF;
|
|
53
|
-
--color-primary: #08060D;
|
|
54
|
-
--color-beige: #F4F3EC;
|
|
55
|
-
--color-nickel: #3B3440;
|
|
56
|
-
--color-grey: #827A89;
|
|
57
|
-
--color-stroke: #E5E4E7;
|
|
58
|
-
--color-midnight: #0C0912;
|
|
59
|
-
--color-slate: #14121A;
|
|
60
|
-
--color-ruby: #863BFF;
|
|
61
|
-
--color-wine: #140033;
|
|
62
|
-
--color-violet: #140033;
|
|
63
|
-
--color-plum: #1D0033;
|
|
64
|
-
--color-electric: #6C3BFF;
|
|
65
|
-
--color-vite: #b39aff;
|
|
66
|
-
--color-space: #110033;
|
|
67
|
-
--color-zest: #22FF73;
|
|
68
|
-
--color-forest: #002611;
|
|
69
|
-
--color-fire: #FF5500;
|
|
70
|
-
--color-rust: #260001;
|
|
71
|
-
--color-aqua: #32F3E9;
|
|
72
|
-
--color-sea: #002624;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
@layer base {
|
|
76
|
-
|
|
77
|
-
h1 {
|
|
78
|
-
@apply text-5xl md:text-6xl font-medium font-heading text-balance text-primary md:leading-[4.2rem] tracking-tighter;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
h2 {
|
|
82
|
-
@apply text-3xl md:text-5xl font-medium font-heading tracking-tight text-balance text-primary;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
h3 {
|
|
86
|
-
@apply text-3xl md:text-4xl font-medium font-heading text-balance text-primary;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
h4 {
|
|
90
|
-
@apply text-xl md:text-3xl font-medium font-heading text-balance text-primary;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
h5 {
|
|
94
|
-
@apply text-lg md:text-2xl font-medium font-heading md:leading-7 text-balance text-primary;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
h6 {
|
|
98
|
-
@apply text-base md:text-xl font-medium font-heading md:leading-7 text-balance text-primary;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
p, li {
|
|
102
|
-
@apply text-base md:text-lg text-grey;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
code {
|
|
106
|
-
@apply font-mono text-space text-base px-1.5 py-0.5 outline outline-stroke rounded dark:outline-grey dark:text-white;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
@layer components {
|
|
112
|
-
|
|
113
|
-
.wrapper {
|
|
114
|
-
@apply max-w-[calc(100vw-2rem)] xl:max-w-[80rem] mx-auto border-l border-r border-stroke dark:border-nickel divide-stroke dark:divide-nickel relative overflow-x-clip;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
.wrapper--ticks::before, .tick-left::before {
|
|
118
|
-
content: '';
|
|
119
|
-
position: absolute;
|
|
120
|
-
top: -5px;
|
|
121
|
-
left: 0;
|
|
122
|
-
width: 0;
|
|
123
|
-
height: 0;
|
|
124
|
-
border-top: 5px solid transparent;
|
|
125
|
-
border-right: 5px solid transparent;
|
|
126
|
-
border-bottom: 5px solid transparent;
|
|
127
|
-
border-left: 5px solid var(--color-stroke);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
.wrapper--ticks::after, .tick-right::after {
|
|
131
|
-
content: '';
|
|
132
|
-
position: absolute;
|
|
133
|
-
top: -5px;
|
|
134
|
-
right: 0;
|
|
135
|
-
width: 0;
|
|
136
|
-
height: 0;
|
|
137
|
-
border-top: 5px solid transparent;
|
|
138
|
-
border-right: 5px solid var(--color-stroke);
|
|
139
|
-
border-bottom: 5px solid transparent;
|
|
140
|
-
border-left: 5px solid transparent;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
[data-theme=dark] .wrapper--ticks::before, [data-theme=dark] .tick-left::before {
|
|
144
|
-
border-left-color: var(--color-nickel);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
[data-theme=dark] .wrapper--ticks::after, [data-theme=dark] .tick-right::after {
|
|
148
|
-
border-right-color: var(--color-nickel);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
.button {
|
|
152
|
-
@apply select-none py-2 px-4 rounded-lg outline outline-stroke inline-flex items-center gap-2 overflow-hidden justify-center text-primary dark:text-white bg-white dark:bg-transparent dark:outline-nickel font-medium hover:shadow-md dark:hover:bg-white dark:hover:text-primary hover:scale-105 transition-all;
|
|
153
|
-
|
|
154
|
-
&.button--sm{
|
|
155
|
-
@apply text-base py-1.5 px-3 rounded;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
&.button--primary {
|
|
159
|
-
@apply text-white relative overflow-visible outline-none transition-colors transform-gpu hover:scale-105 transition-transform;
|
|
160
|
-
|
|
161
|
-
&:hover {
|
|
162
|
-
|
|
163
|
-
&::before {
|
|
164
|
-
filter: brightness(130%);
|
|
165
|
-
transform: scaleX(1.0125) scaleY(1.025);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
&::after {
|
|
169
|
-
transform: scaleX(0.98) scaleY(0.96);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
&::before {
|
|
174
|
-
content: '';
|
|
175
|
-
position: absolute;
|
|
176
|
-
top: -3px;
|
|
177
|
-
left: -3px;
|
|
178
|
-
right: -3px;
|
|
179
|
-
bottom: -3px;
|
|
180
|
-
background-color: #CCCCCC;
|
|
181
|
-
background-image: url('./assets/primary-button-background.jpg');
|
|
182
|
-
background-size: 150% 150%;
|
|
183
|
-
background-position: center;
|
|
184
|
-
border-radius: calc(0.5rem + 3px);
|
|
185
|
-
z-index: -2;
|
|
186
|
-
animation: move-background 16s ease-in-out infinite;
|
|
187
|
-
transition: all 200ms ease-in-out;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
&::after {
|
|
191
|
-
content: '';
|
|
192
|
-
position: absolute;
|
|
193
|
-
inset: 0;
|
|
194
|
-
background: var(--color-primary);
|
|
195
|
-
z-index: -1;
|
|
196
|
-
border-radius: 0.5rem;
|
|
197
|
-
transition: all 300ms ease-in-out;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
&.button--white {
|
|
201
|
-
@apply text-primary;
|
|
202
|
-
|
|
203
|
-
&::after {
|
|
204
|
-
background: var(--color-white);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
@keyframes move-background {
|
|
213
|
-
0%, 100% {
|
|
214
|
-
background-position: 40% 40%;
|
|
215
|
-
}
|
|
216
|
-
50% {
|
|
217
|
-
background-position: 60% 60%;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
.stacked-blocks {
|
|
222
|
-
@apply flex items-center justify-start;
|
|
223
|
-
|
|
224
|
-
> *:not(:first-child) {
|
|
225
|
-
@apply -ml-2;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
li, a {
|
|
229
|
-
@apply size-12 sm:size-14 relative bg-[#F9F8F5] rounded-xl outline-[3px] outline-offset-[-3px] outline-white overflow-hidden p-4 flex items-center justify-center;
|
|
230
|
-
transition: transform 0.2s ease;
|
|
231
|
-
|
|
232
|
-
&:hover {
|
|
233
|
-
transform: translateY(-4px);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
> *:nth-child(1) {
|
|
238
|
-
&:hover, &:hover li, &:hover a {
|
|
239
|
-
transform: translateY(-4px) rotate(-5deg);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
> *:nth-child(2) {
|
|
244
|
-
&:hover, &:hover li, &:hover a {
|
|
245
|
-
transform: translateY(-4px) rotate(5deg);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
> *:nth-child(3) {
|
|
250
|
-
&:hover, &:hover li, &:hover a {
|
|
251
|
-
transform: translateY(-4px) rotate(-5deg);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
> *:nth-child(4) {
|
|
256
|
-
&:hover, &:hover li, &:hover a {
|
|
257
|
-
transform: translateY(-4px) rotate(5deg);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
.checkmark-list {
|
|
263
|
-
@apply list-none flex flex-col gap-3;
|
|
264
|
-
|
|
265
|
-
li {
|
|
266
|
-
@apply text-white text-base tracking-tight relative pl-8;
|
|
267
|
-
|
|
268
|
-
&::before {
|
|
269
|
-
content: '';
|
|
270
|
-
position: absolute;
|
|
271
|
-
left: 0;
|
|
272
|
-
top: 50%;
|
|
273
|
-
transform: translateY(-50%);
|
|
274
|
-
width: 20px;
|
|
275
|
-
height: 20px;
|
|
276
|
-
background-image: url('./assets/checkmark.svg');
|
|
277
|
-
background-size: contain;
|
|
278
|
-
background-repeat: no-repeat;
|
|
279
|
-
background-position: center;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
.project-icon {
|
|
285
|
-
@apply flex items-center gap-2;
|
|
286
|
-
|
|
287
|
-
figcaption {
|
|
288
|
-
@apply text-white text-base tracking-tight;
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
ul.nav {
|
|
293
|
-
@apply flex items-center gap-10;
|
|
294
|
-
|
|
295
|
-
li {
|
|
296
|
-
a {
|
|
297
|
-
@apply !text-primary text-base;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/* Reka UI tabs styling */
|
|
303
|
-
[role="tablist"] {
|
|
304
|
-
[data-reka-collection-item] {
|
|
305
|
-
@apply px-1.5 sm:px-2.5 py-1 rounded text-sm font-mono tracking-tight text-grey cursor-pointer hover:text-white transition-colors duration-75 select-none;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
[data-reka-collection-item][data-state='active'] {
|
|
309
|
-
@apply bg-white text-primary;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
html {
|
|
316
|
-
overflow-x: clip;
|
|
317
|
-
font-size: 16px;
|
|
318
|
-
color: var(--color-nickel);
|
|
319
|
-
|
|
320
|
-
[data-theme=dark] {
|
|
321
|
-
color: var(--color-white);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
body {
|
|
326
|
-
margin: 0;
|
|
327
|
-
padding: 0;
|
|
328
|
-
position: relative;
|
|
329
|
-
overflow-x: clip;
|
|
330
|
-
text-rendering: optimizeLegibility;
|
|
331
|
-
image-rendering: high-quality;
|
|
332
|
-
-webkit-font-smoothing: antialiased;
|
|
333
|
-
-moz-osx-font-smoothing: grayscale;
|
|
334
|
-
|
|
335
|
-
&::-webkit-scrollbar {
|
|
336
|
-
width: 10px;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
&::-webkit-scrollbar-track {
|
|
340
|
-
background-color: #efefef;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
&::-webkit-scrollbar-thumb {
|
|
344
|
-
background-color: #000;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|