@@ -12,6 +12,9 @@ const commitUrl = computed(() =>
1212 ? ' https://github.com/zyyv/zyyv.dev'
1313 : ` https://github.com/zyyv/zyyv.dev/commit/${commitHash .value } ` ,
1414)
15+ const { stats } = useSiteStats ()
16+ const totalViews = computed (() => stats .value .totalViews ?.toLocaleString (' en-US' ) ?? ' —' )
17+ const onlineVisitors = computed (() => stats .value .onlineVisitors ?.toLocaleString (' en-US' ) ?? ' —' )
1518
1619const socialLinks = [
1720 { label: ' GitHub' , href: ' https://github.com/zyyv' , external: true },
@@ -27,11 +30,6 @@ function backToTop() {
2730
2831<template >
2932 <footer class =" site-footer" :class =" { 'site-footer--home': isHome }" >
30- <div class =" site-footer__meta" >
31- <p >Chris / Front-end developer</p >
32- <p >End of transmission</p >
33- </div >
34-
3533 <p class =" site-footer__statement" >
3634 <span >You found the edge</span >
3735 <span >of the page. Nothing fell off.</span >
@@ -40,6 +38,16 @@ function backToTop() {
4038 <div class =" site-footer__base" >
4139 <div class =" site-footer__identity" >
4240 <p >© {{ year }} Chris</p >
41+ <dl class =" site-footer__stats" aria-label =" Site activity" >
42+ <div >
43+ <dt >Views</dt >
44+ <dd >{{ totalViews }}</dd >
45+ </div >
46+ <div >
47+ <dt ><span class =" site-footer__live-dot" aria-hidden =" true" /> Online</dt >
48+ <dd >{{ onlineVisitors }}</dd >
49+ </div >
50+ </dl >
4351 <nav class =" site-footer__links" aria-label =" Social links" >
4452 <a
4553 v-for =" link in socialLinks"
@@ -72,13 +80,12 @@ function backToTop() {
7280<style scoped>
7381.site-footer {
7482 width : 100% ;
75- padding : clamp (5rem , 10 vw , 10 rem ) clamp (1rem , 4vw , 4rem ) clamp (1.5rem , 3vw , 3rem );
83+ padding : clamp (3. 5rem , 6 vw , 6 rem ) clamp (1rem , 4vw , 4rem ) clamp (1.5rem , 3vw , 3rem );
7684 border-top : 1px solid color-mix(in srgb , currentColor 16% , transparent );
7785 color : inherit ;
7886 font-family : ' DM Sans' , sans-serif ;
7987}
8088
81- .site-footer__meta ,
8289.site-footer__base {
8390 display : grid ;
8491 grid-template-columns : 1fr 1fr ;
@@ -88,21 +95,16 @@ function backToTop() {
8895 text-transform : uppercase ;
8996}
9097
91- .site-footer__meta p ,
9298.site-footer__base p ,
9399.site-footer__statement {
94100 margin : 0 ;
95101}
96102
97- .site-footer__meta p :last-child {
98- text-align : right ;
99- }
100-
101103.site-footer__statement {
102104 display : flex ;
103105 flex-wrap : wrap ;
104106 gap : 0.3em ;
105- margin : clamp (3 rem , 6 vw , 5 rem ) 0 clamp (3.5 rem , 7 vw , 6 rem );
107+ margin : clamp (2.5 rem , 4 vw , 4 rem ) 0 clamp (3 rem , 5 vw , 4.5 rem );
106108 font-size : clamp (1.15rem , 2.2vw , 1.7rem );
107109 font-weight : 500 ;
108110 line-height : 1.15 ;
@@ -119,15 +121,14 @@ function backToTop() {
119121}
120122
121123.site-footer--home .site-footer__statement {
122- display : grid ;
123- margin : clamp (4.5rem , 10vw , 9rem ) 0 clamp (5rem , 11vw , 10rem );
124- font-size : clamp (3.9rem , 10.2vw , 10rem );
125- line-height : 0.78 ;
126- letter-spacing : -0.085em ;
124+ margin : clamp (2.75rem , 5vw , 4.5rem ) 0 clamp (3.25rem , 6vw , 5rem );
125+ font-size : clamp (2.1rem , 5vw , 5.25rem );
126+ line-height : 0.92 ;
127+ letter-spacing : -0.065em ;
127128}
128129
129130.site-footer--home .site-footer__statement span :last-child {
130- margin-left : 8 vw ;
131+ margin-left : clamp ( 1.5 rem , 5 vw , 5 rem ) ;
131132}
132133
133134.site-footer__base {
@@ -149,6 +150,38 @@ function backToTop() {
149150 gap : 0.45rem clamp (0.85rem , 1.8vw , 1.5rem );
150151}
151152
153+ .site-footer__stats {
154+ display : flex ;
155+ gap : 0.5rem clamp (0.9rem , 1.8vw , 1.5rem );
156+ margin : 0 ;
157+ font-variant-numeric : tabular-nums ;
158+ }
159+
160+ .site-footer__stats div {
161+ display : flex ;
162+ gap : 0.35rem ;
163+ }
164+
165+ .site-footer__stats dt ,
166+ .site-footer__stats dd {
167+ margin : 0 ;
168+ }
169+
170+ .site-footer__stats dt {
171+ color : color-mix(in srgb , currentColor 48% , transparent );
172+ }
173+
174+ .site-footer__live-dot {
175+ display : inline-block ;
176+ width : 0.38rem ;
177+ height : 0.38rem ;
178+ margin-right : 0.18rem ;
179+ border-radius : 50% ;
180+ background : #4f9a68 ;
181+ box-shadow : 0 0 0 0.18rem color-mix(in srgb , #4f9a68 18% , transparent );
182+ vertical-align : 0.04rem ;
183+ }
184+
152185.site-footer__links a {
153186 color : inherit ;
154187 text-decoration : none ;
@@ -180,22 +213,34 @@ function backToTop() {
180213
181214.site-footer__actions a ,
182215.site-footer__actions button {
216+ position : relative ;
183217 display : inline-flex ;
184218 align-items : center ;
185219 gap : 0.45rem ;
186220 padding : 0 0 0.2rem ;
187221 border : 0 ;
188- border-bottom : 1px solid currentColor ;
189222 border-radius : 0 ;
190223 background : transparent ;
191224 color : inherit ;
192225 font : inherit ;
193226 text-transform : uppercase ;
194227 text-decoration : none ;
195228 cursor : pointer ;
196- transition :
197- opacity 240ms ease ,
198- transform 240ms cubic-bezier (0.16 , 1 , 0.3 , 1 );
229+ transition : transform 240ms cubic-bezier (0.16 , 1 , 0.3 , 1 );
230+ }
231+
232+ .site-footer__actions a ::after ,
233+ .site-footer__actions button ::after {
234+ position : absolute ;
235+ right : 0 ;
236+ bottom : 0 ;
237+ left : 0 ;
238+ height : 1px ;
239+ background : currentColor ;
240+ content : ' ' ;
241+ transform : scaleX (0 );
242+ transform-origin : right center ;
243+ transition : transform 420ms cubic-bezier (0.16 , 1 , 0.3 , 1 );
199244}
200245
201246.site-footer__actions code {
@@ -206,10 +251,17 @@ function backToTop() {
206251
207252.site-footer__actions a :hover ,
208253.site-footer__actions button :hover {
209- opacity : 0.55 ;
210254 transform : translateY (-1px );
211255}
212256
257+ .site-footer__actions a :hover ::after ,
258+ .site-footer__actions button :hover ::after ,
259+ .site-footer__actions a :focus-visible ::after ,
260+ .site-footer__actions button :focus-visible ::after {
261+ transform : scaleX (1 );
262+ transform-origin : left center ;
263+ }
264+
213265.site-footer__actions a :active ,
214266.site-footer__actions button :active {
215267 transform : translateY (1px );
@@ -223,12 +275,8 @@ function backToTop() {
223275
224276@media (max-width : 767.9px ) {
225277 .site-footer {
226- padding-top : 5rem ;
227- padding-bottom : 5.5rem ;
228- }
229-
230- .site-footer__meta {
231- font-size : 0.62rem ;
278+ padding-top : 3.5rem ;
279+ padding-bottom : 4.5rem ;
232280 }
233281
234282 .site-footer__statement {
@@ -238,9 +286,9 @@ function backToTop() {
238286 }
239287
240288 .site-footer--home .site-footer__statement {
241- margin : 4.75 rem 0 6 rem ;
242- font-size : clamp (3 .65rem , 18.5 vw , 6 rem );
243- line-height : 0.82 ;
289+ margin : 3 rem 0 4 rem ;
290+ font-size : clamp (2 .65rem , 13 vw , 4.5 rem );
291+ line-height : 0.9 ;
244292 }
245293
246294 .site-footer--home .site-footer__statement span :last-child {
@@ -266,6 +314,11 @@ function backToTop() {
266314 gap : 0.75rem 1rem ;
267315 }
268316
317+ .site-footer__stats {
318+ order : 3 ;
319+ width : 100% ;
320+ }
321+
269322 .site-footer__links {
270323 gap : 0.45rem 0.85rem ;
271324 }
@@ -274,6 +327,8 @@ function backToTop() {
274327@media (prefers-reduced-motion: reduce) {
275328 .site-footer__actions a ,
276329 .site-footer__actions button ,
330+ .site-footer__actions a ::after ,
331+ .site-footer__actions button ::after ,
277332 .site-footer__links a {
278333 transition : none ;
279334 }
0 commit comments