10 | Minutes tracked 11 |
12 |Heads up!
10 |{text}
11 |
9 |
10 | {top_language}
27 |34 | {children} 35 |
36 | ); 37 | }; 38 | 39 | export default AnimatedShinyText; 40 | -------------------------------------------------------------------------------- /web/styles/globals.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Inter:100,200,300,regular,500,600,700,800,900); 2 | 3 | @tailwind base; 4 | @tailwind components; 5 | @tailwind utilities; 6 | 7 | input::-ms-reveal, 8 | input::-ms-clear { 9 | display: none; 10 | } 11 | 12 | body { 13 | font-family: Inter; 14 | overflow-x: hidden; 15 | background-color: #09090b; 16 | } 17 | /* 18 | #__next { 19 | overflow-x: hidden; 20 | } */ 21 | 22 | .color-scale-1 { 23 | fill: #e0d1f5; 24 | } 25 | .color-scale-2 { 26 | fill: #c2a3eb; 27 | } 28 | .color-scale-3 { 29 | fill: #a374e0; 30 | } 31 | .color-scale-4 { 32 | fill: #8546d6; 33 | } 34 | .color-scale-5 { 35 | fill: #6610f2; 36 | } 37 | .color-scale-0 { 38 | fill: #09090b; 39 | } 40 | 41 | .react-calendar-heatmap text { 42 | font-size: 10px; 43 | fill: #aaa; 44 | } 45 | 46 | .landing .react-calendar-heatmap text { 47 | font-size: 7px; 48 | fill: #aaa; 49 | } 50 | 51 | input:-webkit-autofill, 52 | input:-webkit-autofill:hover, 53 | input:-webkit-autofill:focus, 54 | input:-webkit-autofill:active { 55 | -webkit-box-shadow: 0 0 0 30px #09090b inset !important; 56 | -webkit-text-fill-color: white !important; 57 | } 58 | -------------------------------------------------------------------------------- /web/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import ActivityChart from "@/components/landing/ActivityChart"; 2 | import Features from "@/components/landing/Features"; 3 | import Footer from "@/components/landing/Footer"; 4 | import Hero from "@/components/landing/Hero"; 5 | import Navbar from "@/components/landing/Navbar"; 6 | import OpenSource from "@/components/landing/OpenSource"; 7 | import Screenshot from "@/components/landing/Screenshot"; 8 | import TeamFeatures from "@/components/landing/TeamFeatures"; 9 | import TimeTracked from "@/components/landing/TimeTracked"; 10 | import Head from "next/head"; 11 | 12 | export default function Index() { 13 | return ( 14 |{range}
14 |
20 | {codetime[range as CodeTimeKeys].time}
21 |
22 | {/*
{description}
57 |{data?.email}
26 |@{data?.username}
39 |
28 |
29 | {/*
23 |
31 | Gain valuable insights into coding time and productivity with Sooner, 32 | empowering developers and managers with detailed metrics to enhance 33 | performance and identify bottlenecks. 34 |
35 | 36 |setShow(!show)} 43 | > 44 | {data?.key} 45 |
46 |
19 | ),
20 | },
21 | {
22 | title: "Private Leaderboards",
23 | icon: RiMedalLine,
24 | bg: (
25 | 46 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto! 47 |
48 | 49 |
19 | ),
20 | },
21 | {
22 | title: "Powerful analytics",
23 | icon: MdOutlineMultilineChart,
24 | bg: (
25 | 46 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto! 47 |
48 | 49 |Streak
44 |{data?.streak} days
47 |Daily average
53 |{data?.daily_average}
56 |35 | See how much time you spend coding each day of the year. 36 |
37 |Use the OTP below to complete your signup
58 |13 | It sucks when services we use and love shut down. So Sooner comes with 14 | a promise: it will remain online forever. 15 |
16 |18 | Apps and services shut down too often, and our data/content tends to 19 | either get lost completely or we are forced to tediously transition it 20 | to yet another service of questionable longevity. I built Sooner to 21 | solve my own problems, so I feel a great obligation to users. This 22 | platform must stay alive. 23 |
24 | 25 |So these are a few promises from me to you:
27 |This is my promise.
50 | 51 |53 | Inspired by{" "} 54 | 55 | Svbtle 56 | 57 |
58 |
39 |
47 | {time_to_human(l.time)}
48 |
{p.project}
63 |
64 | {time_to_human(p.time)}
65 |
43 |
49 | {submitted && "Thank you! Your report has been submitted."} 50 |
51 |54 | {failed && "Bug report submission failed, please try again."} 55 |
56 | 57 |Enter the OTP sent to your email
55 |62 | {`Don't have an account?`}{" "} 63 | 64 | Get started 65 | 66 |
67 |77 | {`Already have an account?`}{" "} 78 | 79 | Sign in 80 | 81 |
82 |93 | You need your API key to sync the Sooner VS Code extension with your 94 | dashboard. 95 |
96 |setShow(!show)} 100 | > 101 | {data?.key} 102 |
103 |124 | The Sooner extension helps you track your codetime automatically. 125 |
126 | 127 |153 | Installation will automatically be verified when you activate the 154 | extension. 155 |
156 |= MAX_COUNT ? "text-red-500" : ""}`}
158 | >
159 | {activationStatus}{" "}
160 | {activationStatus === "Waiting for activation..." && (
161 |
Last 7 days
47 |53 | {data?.time_human_readable} 54 |
55 |Branch
61 |67 | all 68 |
69 |Top language
75 |{data?.top_language}
82 |All time
89 |91 | {data?.all_time} 92 |
93 |117 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolor 118 | placeat expedita nesciunt molestiae doloribus, vitae accusamus 119 | tenetur ad natus eos pariatur saepe nihil porro, inventore at 120 | ipsa consequuntur voluptate enim id! Distinctio molestias 121 | blanditiis aliquid libero reprehenderit fugit quis alias 122 | explicabo, aperiam animi eveniet quo! Temporibus, expedita 123 | praesentium! Minus tempore nisi soluta ab eum amet inventore, 124 | quam expedita placeat iure, labore laborum impedit eveniet nam 125 | molestias quae sit provident, aperiam quis molestiae similique 126 | aut delectus est? Aperiam cumque deleniti accusantium? Dolor 127 | exercitationem ex ab esse cumque atque. Voluptates nulla id 128 | laudantium, eaque, libero, earum aliquid blanditiis atque 129 | aspernatur maiores dolore. 130 |
131 |{truncate(f.file, 30)}
140 |
141 | {time_to_human(f.time)}
142 |
{b.branch}
152 |
153 | {time_to_human(b.time)}
154 |