11"use client" ;
22
33import { Style } from "@/components/Style" ;
4- import { useEffect , useState } from "react" ;
4+ import { Toast } from "@/components/Toast" ;
5+ import { useState } from "react" ;
56import { GoCommandPalette } from "react-icons/go" ;
67import { RxOpenInNewWindow } from "react-icons/rx" ;
78import { SiCodesandbox , SiGithub , SiStackblitz } from "react-icons/si" ;
@@ -13,116 +14,118 @@ export function Social({
1314 demoname : string ;
1415 embed_url : string ;
1516} ) {
16- const [ copied , setCopied ] = useState ( false ) ;
17+ const [ show , setShow ] = useState ( false ) ;
18+
19+ const command = `npx -y degit pmndrs/examples/demos/${ demoname } ${ demoname } && cd ${ demoname } && npm i && npm run dev` ;
1720
1821 const handleClick = async ( ) => {
19- await navigator . clipboard . writeText (
20- `cd $(mktemp -d ${ demoname } .XXX) && npx -y degit pmndrs/examples/demos/${ demoname } . && npm i && npm run dev` ,
21- ) ;
22- setCopied ( true ) ;
22+ await navigator . clipboard . writeText ( command ) ;
23+ setShow ( true ) ;
2324 } ;
2425
25- useEffect ( ( ) => {
26- if ( ! copied ) return ;
27- const int = setTimeout ( ( ) => setCopied ( false ) , 2000 ) ;
28- return ( ) => clearTimeout ( int ) ;
29- } , [ copied ] ) ;
30-
3126 return (
32- < nav className = "Social" >
33- < Style
34- css = { `
35- @scope {
36- & {
37- display: flex;
38- gap: 0.1rem;
39- padding: 0.3rem;
40- border-radius: 999px;
41- background: rgb(255 255 255 / 0.82);
42- backdrop-filter: blur(10px);
43- box-shadow: 0 1px 6px rgb(0 0 0 / 0.1);
44- }
27+ < >
28+ < nav className = "Social" >
29+ < Style
30+ css = { `
31+ @scope {
32+ & {
33+ display: flex;
34+ gap: 0.1rem;
35+ padding: 0.3rem;
36+ border-radius: 999px;
37+ background: rgb(255 255 255 / 0.82);
38+ backdrop-filter: blur(10px);
39+ box-shadow: 0 1px 6px rgb(0 0 0 / 0.1);
40+ }
4541
46- a {
47- position: relative;
48- display: grid;
49- place-items: center;
50- width: 1.8rem;
51- height: 1.8rem;
52- border-radius: 50%;
53- color: #555;
54- transition:
55- background 0.15s ease,
56- color 0.15s ease;
57- }
42+ a {
43+ position: relative;
44+ display: grid;
45+ place-items: center;
46+ width: 1.8rem;
47+ height: 1.8rem;
48+ border-radius: 50%;
49+ color: #555;
50+ transition:
51+ background 0.15s ease,
52+ color 0.15s ease;
53+ }
5854
59- a:hover {
60- background: rgb(0 0 0 / 0.06);
61- color: #111;
62- }
55+ a:hover {
56+ background: rgb(0 0 0 / 0.06);
57+ color: #111;
58+ }
6359
64- a svg {
65- width: 0.95rem;
66- height: 0.95rem;
67- }
60+ a svg {
61+ width: 0.95rem;
62+ height: 0.95rem;
63+ }
6864
69- a > span {
70- position: absolute;
71- top: 100%;
72- left: 50%;
73- translate: -50% 0;
74- margin-top: 0.45rem;
75- padding: 0.25em 0.5em;
76- border-radius: 4px;
77- background: #222;
78- color: white;
79- font-size: 0.65rem;
80- white-space: nowrap;
81- pointer-events: none;
82- opacity: 0;
83- transition: opacity 0.15s ease;
84- }
65+ a > span {
66+ position: absolute;
67+ top: 100%;
68+ left: 50%;
69+ translate: -50% 0;
70+ margin-top: 0.45rem;
71+ padding: 0.25em 0.5em;
72+ border-radius: 4px;
73+ background: #222;
74+ color: white;
75+ font-size: 0.65rem;
76+ white-space: nowrap;
77+ pointer-events: none;
78+ opacity: 0;
79+ transition: opacity 0.15s ease;
80+ }
8581
86- a:hover > span {
87- opacity: 1;
82+ a:hover > span {
83+ opacity: 1;
84+ }
8885 }
89- }
90- ` }
91- />
86+ ` }
87+ />
9288
93- < a target = "_blank" rel = "noopener noreferrer" href = { embed_url } >
94- < RxOpenInNewWindow />
89+ < a target = "_blank" rel = "noopener noreferrer" href = { embed_url } >
90+ < RxOpenInNewWindow />
91+ < span > fullpage</ span >
92+ </ a >
93+ < a
94+ target = "_blank"
95+ rel = "noopener noreferrer"
96+ href = { `https://github.com/pmndrs/examples/tree/main/demos/${ demoname } ` }
97+ >
98+ < SiGithub />
99+ < span > code</ span >
100+ </ a >
101+ < a
102+ target = "_blank"
103+ rel = "noopener noreferrer"
104+ href = { `https://stackblitz.com/github/pmndrs/examples/tree/main/demos/${ demoname } ` }
105+ >
106+ < SiStackblitz />
107+ < span > stackblitz</ span >
108+ </ a >
109+ < a
110+ target = "_blank"
111+ rel = "noopener noreferrer"
112+ href = { `https://codesandbox.io/s/github/pmndrs/examples/tree/main/demos/${ demoname } ` }
113+ >
114+ < SiCodesandbox />
115+ < span > codesandbox</ span >
116+ </ a >
117+ < a href = "javascript:void(0);" onClick = { handleClick } >
118+ < GoCommandPalette />
119+ < span > degit</ span >
120+ </ a >
121+ </ nav >
95122
96- < span > fullpage</ span >
97- </ a >
98- < a
99- target = "_blank"
100- rel = "noopener noreferrer"
101- href = { `https://github.com/pmndrs/examples/tree/main/demos/${ demoname } ` }
102- >
103- < SiGithub />
104- < span > code</ span >
105- </ a >
106- < a
107- target = "_blank"
108- rel = "noopener noreferrer"
109- href = { `https://stackblitz.com/github/pmndrs/examples/tree/main/demos/${ demoname } ` }
110- >
111- < SiStackblitz />
112- < span > stackblitz</ span >
113- </ a >
114- < a
115- target = "_blank"
116- rel = "noopener noreferrer"
117- href = { `https://codesandbox.io/s/github/pmndrs/examples/tree/main/demos/${ demoname } ` }
118- >
119- < SiCodesandbox />
120- < span > codesandbox</ span >
121- </ a >
122- < a href = "javascript:void(0);" onClick = { handleClick } >
123- < GoCommandPalette />
124- < span > { copied ? "copied command!" : "degit" } </ span >
125- </ a >
126- </ nav >
123+ < Toast visible = { show } onDone = { ( ) => setShow ( false ) } >
124+ < p >
125+ Degit command copied. Paste in your terminal to install{ " " }
126+ < strong > { demoname } </ strong > locally.
127+ </ p >
128+ </ Toast >
129+ </ >
127130 ) ;
128131}
0 commit comments