From a1ebc240b1179bbdfd51ba2b945e6d5e8310344f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferdinand=20M=C3=BCtsch?= Date: Sun, 3 Nov 2024 16:46:38 +0100 Subject: [PATCH 1/4] fix: do not crash when using dev mode outside project source folder (resolve #703) (also see #693) --- config/config.go | 10 +++++++--- config/fs.go | 5 ++++- config/sentry.go | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/config/config.go b/config/config.go index a39b4d8f..6c59da21 100644 --- a/config/config.go +++ b/config/config.go @@ -3,7 +3,6 @@ package config import ( "encoding/json" "fmt" - "log" "net" "net/http" "os" @@ -73,6 +72,7 @@ var emailProviders = []string{ // first wakatime commit was on this day ;-) so no real heartbeats should exist before // https://github.com/wakatime/legacy-python-cli/commit/3da94756aa1903c1cca5035803e3f704e818c086 const heartbeatsMinDate = "2013-07-06" +const colorsFile = "data/colors.json" var leaderboardScopes = []string{"24_hours", "week", "month", "year", "7_days", "14_days", "30_days", "6_months", "12_months", "all_time"} @@ -437,7 +437,11 @@ func readColors() map[string]map[string]string { raw := data.ColorsFile if IsDev(env) { - raw, _ = os.ReadFile("data/colors.json") + if _, err := os.Stat(colorsFile); err == nil { + raw, _ = os.ReadFile(colorsFile) + } else { + Log().Warn("attempted to read colors from local fs in dev mode, but failed", "file", colorsFile) + } } var colors = make(map[string]map[string]string) @@ -472,7 +476,7 @@ func Get() *Config { func Load(configFlag string, version string) *Config { config := &Config{} if err := configor.New(&configor.Config{}).Load(config, configFlag); err != nil { - log.Fatal("failed to read config", err) + Log().Fatal("failed to read config", err) } env = config.Env diff --git a/config/fs.go b/config/fs.go index aea1c926..2237aa73 100644 --- a/config/fs.go +++ b/config/fs.go @@ -8,7 +8,10 @@ import ( // ChooseFS returns a local (DirFS) file system when on 'dev' environment and the given go-embed file system otherwise func ChooseFS(localDir string, embeddedFS fs.FS) fs.FS { if Get().IsDev() { - return os.DirFS(localDir) + if _, err := os.Stat(localDir); err == nil { + return os.DirFS(localDir) + } + Log().Warn("attempted to use local fs for directory in dev mode, but failed", "path", localDir) } return embeddedFS } diff --git a/config/sentry.go b/config/sentry.go index 59e9d183..f81176a9 100644 --- a/config/sentry.go +++ b/config/sentry.go @@ -28,7 +28,7 @@ func Log() *SentryLogger { } level := slog.LevelInfo - if Get().IsDev() { + if IsDev(env) { level = slog.LevelDebug } From c7b07476d097378c692805c32b451cb855460f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferdinand=20M=C3=BCtsch?= Date: Sun, 3 Nov 2024 22:10:04 +0100 Subject: [PATCH 2/4] fix: time format returned by stats compat endpoints (resolve #698) --- models/compat/wakatime/v1/stats.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/compat/wakatime/v1/stats.go b/models/compat/wakatime/v1/stats.go index 1b264151..7e8bc909 100644 --- a/models/compat/wakatime/v1/stats.go +++ b/models/compat/wakatime/v1/stats.go @@ -17,8 +17,8 @@ type StatsViewModel struct { type StatsData struct { Username string `json:"username"` UserId string `json:"user_id"` - Start time.Time `json:"start"` - End time.Time `json:"end"` + Start string `json:"start"` + End string `json:"end"` Status string `json:"status"` TotalSeconds float64 `json:"total_seconds"` DailyAverage float64 `json:"daily_average"` @@ -45,8 +45,8 @@ func NewStatsFrom(summary *models.Summary, filters *models.Filters) *StatsViewMo data := &StatsData{ Username: summary.UserID, UserId: summary.UserID, - Start: summary.FromTime.T(), - End: summary.ToTime.T(), + Start: summary.FromTime.T().Format(time.RFC3339), + End: summary.ToTime.T().Format(time.RFC3339), Status: "ok", TotalSeconds: totalTime.Seconds(), DaysIncludingHolidays: numDays, From b04f8c573ef9c632896d1ab326f151bf25546cf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferdinand=20M=C3=BCtsch?= Date: Sun, 3 Nov 2024 22:40:57 +0100 Subject: [PATCH 3/4] chore: show date of first heartbeat in range (resolve #685) --- static/assets/css/app.dist.css | 2 +- static/assets/css/app.dist.css.br | Bin 3903 -> 3905 bytes views/summary.tpl.html | 16 +++++++++------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/static/assets/css/app.dist.css b/static/assets/css/app.dist.css index 272dd0fd..8ea7c532 100644 --- a/static/assets/css/app.dist.css +++ b/static/assets/css/app.dist.css @@ -1 +1 @@ -/*! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.absolute{position:absolute}.relative{position:relative}.top-0{top:0}.right-0{right:0}.top-1{top:.25rem}.z-10{z-index:10}.col-span-1{grid-column:span 1/span 1}.row-span-1{grid-row:span 1/span 1}.float-right{float:right}.m-0{margin:0}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mt-16{margin-top:4rem}.mr-1{margin-right:.25rem}.mt-20{margin-top:5rem}.mb-10{margin-bottom:2.5rem}.mt-10{margin-top:2.5rem}.mb-14{margin-bottom:3.5rem}.-mt-4{margin-top:-1rem}.mt-8{margin-top:2rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.mt-4{margin-top:1rem}.mt-12{margin-top:3rem}.mb-8{margin-bottom:2rem}.mr-4{margin-right:1rem}.mr-8{margin-right:2rem}.mr-px{margin-right:1px}.ml-px{margin-left:1px}.mb-16{margin-bottom:4rem}.ml-4{margin-left:1rem}.mb-2{margin-bottom:.5rem}.-ml-1{margin-left:-.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-3{margin-left:.75rem}.mt-6{margin-top:1.5rem}.mt-1{margin-top:.25rem}.-mb-1{margin-bottom:-.25rem}.ml-2{margin-left:.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.inline-grid{display:inline-grid}.hidden{display:none}.h-min{height:-moz-min-content;height:min-content}.h-4{height:1rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-full{width:100%}.w-12{width:3rem}.w-16{width:4rem}.w-1\/2{width:50%}.w-2\/3{width:66.666667%}.w-1\/3{width:33.333333%}.w-4{width:1rem}.\!w-auto{width:auto!important}.w-40{width:10rem}.max-w-lg{max-width:32rem}.max-w-screen-lg{max-width:1024px}.max-w-4xl{max-width:56rem}.max-w-screen-xl{max-width:1280px}.max-w-full{max-width:100%}.max-w-screen-sm{max-width:640px}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.cursor-help{cursor:help}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-3{gap:.75rem}.gap-2{gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.overflow-x-auto{overflow-x:auto}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-sm{border-radius:.125rem}.rounded-md{border-radius:.375rem}.rounded-full{border-radius:9999px}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-transparent{background-color:initial}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.p-4{padding:1rem}.p-1{padding:.25rem}.p-px{padding:1px}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-8{padding-left:2rem;padding-right:2rem}.pt-10{padding-top:2.5rem}.pt-8{padding-top:2rem}.pb-10{padding-bottom:2.5rem}.pb-4{padding-bottom:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-8xl{font-size:6rem;line-height:1}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-base{font-size:1rem;line-height:1.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-snug{line-height:1.375}.leading-none{line-height:1}.leading-6{line-height:1.5rem}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.outline-none{outline:2px solid #0000;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}body{font-family:Source Sans\ 3,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif}[v-cloak]{display:none}.bg-gray-850{background-color:#242b3a}.hover\:bg-gray-850:hover{--bg-opacity:1;background-color:#242b3a}.text-xsi{font-size:.75rem!important;line-height:1rem!important}.text-xxs{font-size:.65rem!important}.mt-14{margin-top:3.5rem}.text-7xl{font-size:4.5rem;line-height:1.1}.text-8xl{font-size:5rem;line-height:1.1}.imp\:cursor-not-allowed{cursor:not-allowed!important}.h1{margin:0;font-size:1.875rem;line-height:2.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.h1-subcaption{font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.btn-default{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-default:hover{--bg-opacity:1;background-color:#242b3a}.btn-disabled{background-color:rgb(31 41 55/var(--tw-bg-opacity));color:rgb(75 85 99/var(--tw-text-opacity))}.btn-disabled,.btn-primary{border-radius:.25rem;--tw-bg-opacity:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1}.btn-primary{background-color:rgb(4 120 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.btn-danger{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.btn-small{padding:.25rem .5rem}.input-default{width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px;background-color:#242b3a}.input-default:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.select-default{cursor:pointer;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px;background-color:#242b3a}.select-default:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.menu-item{display:flex;cursor:pointer;align-items:center}.menu-item>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.menu-item{border-radius:.25rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.menu-item:hover{--bg-opacity:1;background-color:#242b3a}.submenu-item{border-radius:.25rem;padding:.25rem;text-align:right}.submenu-item:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.chip{margin-bottom:.25rem;display:inline-block;border-radius:.25rem;border-radius:9999px;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;background-color:#242b3a}.chip,.link{font-weight:600}.link{color:rgb(156 163 175/var(--tw-text-opacity))}.link,.link:hover{--tw-text-opacity:1}.link:hover{color:rgb(209 213 219/var(--tw-text-opacity))}.newsbox{border-radius:.375rem;border-width:2px;--tw-border-opacity:1;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));background-color:#242b3a}.newsbox,.newsbox-default{border-color:rgb(4 120 87/var(--tw-border-opacity))}.newsbox-default,.newsbox-warning{--tw-border-opacity:1}.newsbox-warning{border-color:rgb(202 138 4/var(--tw-border-opacity))}.newsbox-danger{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.leaderboard-default{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.leaderboard-self{margin-left:-10px;margin-right:-10px;padding-left:calc(1rem + 10px);padding-right:calc(1rem + 10px);--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.text-gold{color:#daa520}.leaderboard-gold{border-color:#daa520}.leaderboard-silver{border-color:silver}.leaderboard-bronze{border-color:#cd7f32}::-webkit-calendar-picker-indicator{filter:invert(1);cursor:pointer}.max-available{max-width:-moz-available;max-width:-webkit-fill-available;max-width:fill-available}.projects-item a{display:flex;flex-direction:column;border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));padding:.5rem 1rem;vertical-align:middle;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.projects-item a,.projects-item a:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.projects-item a:hover{--bg-opacity:1;background-color:#242b3a;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.projects-item .color-fading{position:absolute;height:100%;width:100%;border-radius:.375rem;pointer-events:none}.disabled{pointer-events:none;cursor:default;opacity:75%}.entity-filter-control{width:180px;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.entity-filter-control label{vertical-align:text-bottom;font-weight:600;text-transform:capitalize}.entity-filter-control select{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:.375rem .625rem}.wi-min{width:-moz-min-content!important;width:min-content!important}.checked\:text-green-500:checked{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:row-span-2{grid-row:span 2/span 2}.sm\:row-span-1{grid-row:span 1/span 1}.sm\:row-span-3{grid-row:span 3/span 3}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:flex-shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-nowrap{flex-wrap:nowrap}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-3{grid-column:span 3/span 3}.md\:row-span-2{grid-row:span 2/span 2}.md\:row-span-1{grid-row:span 1/span 1}.md\:row-span-3{grid-row:span 3/span 3}.md\:mb-0{margin-bottom:0}.md\:mt-16{margin-top:4rem}.md\:flex{display:flex}.md\:w-3\/4{width:75%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-1\/2{width:50%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-nowrap{flex-wrap:nowrap}.md\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.lg\:inline-block{display:inline-block}.lg\:w-3\/4{width:75%}.lg\:w-1\/2{width:50%}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:px-24{padding-left:6rem;padding-right:6rem}} \ No newline at end of file +/*! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.absolute{position:absolute}.relative{position:relative}.top-0{top:0}.right-0{right:0}.top-1{top:.25rem}.z-10{z-index:10}.col-span-1{grid-column:span 1/span 1}.row-span-1{grid-row:span 1/span 1}.float-right{float:right}.m-0{margin:0}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mt-16{margin-top:4rem}.mr-1{margin-right:.25rem}.mt-20{margin-top:5rem}.mb-10{margin-bottom:2.5rem}.mt-10{margin-top:2.5rem}.mb-14{margin-bottom:3.5rem}.-mt-4{margin-top:-1rem}.mt-8{margin-top:2rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.mt-4{margin-top:1rem}.mt-12{margin-top:3rem}.mb-8{margin-bottom:2rem}.mr-4{margin-right:1rem}.mr-8{margin-right:2rem}.mr-px{margin-right:1px}.ml-px{margin-left:1px}.mb-16{margin-bottom:4rem}.ml-4{margin-left:1rem}.mb-2{margin-bottom:.5rem}.-ml-1{margin-left:-.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-3{margin-left:.75rem}.mt-6{margin-top:1.5rem}.mt-1{margin-top:.25rem}.-mb-1{margin-bottom:-.25rem}.ml-2{margin-left:.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.inline-grid{display:inline-grid}.hidden{display:none}.h-min{height:-moz-min-content;height:min-content}.h-4{height:1rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-full{width:100%}.w-12{width:3rem}.w-16{width:4rem}.w-1\/2{width:50%}.w-2\/3{width:66.666667%}.w-1\/3{width:33.333333%}.w-4{width:1rem}.\!w-auto{width:auto!important}.w-40{width:10rem}.max-w-lg{max-width:32rem}.max-w-screen-lg{max-width:1024px}.max-w-4xl{max-width:56rem}.max-w-screen-xl{max-width:1280px}.max-w-full{max-width:100%}.max-w-screen-sm{max-width:640px}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.cursor-help{cursor:help}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-3{gap:.75rem}.gap-2{gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.overflow-x-auto{overflow-x:auto}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-sm{border-radius:.125rem}.rounded-md{border-radius:.375rem}.rounded-full{border-radius:9999px}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-transparent{background-color:initial}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.p-4{padding:1rem}.p-1{padding:.25rem}.p-px{padding:1px}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-8{padding-left:2rem;padding-right:2rem}.pt-10{padding-top:2.5rem}.pt-8{padding-top:2rem}.pt-2{padding-top:.5rem}.pb-10{padding-bottom:2.5rem}.pb-4{padding-bottom:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-8xl{font-size:6rem;line-height:1}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-base{font-size:1rem;line-height:1.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-snug{line-height:1.375}.leading-none{line-height:1}.leading-6{line-height:1.5rem}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.outline-none{outline:2px solid #0000;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}body{font-family:Source Sans\ 3,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif}[v-cloak]{display:none}.bg-gray-850{background-color:#242b3a}.hover\:bg-gray-850:hover{--bg-opacity:1;background-color:#242b3a}.text-xsi{font-size:.75rem!important;line-height:1rem!important}.text-xxs{font-size:.65rem!important}.mt-14{margin-top:3.5rem}.text-7xl{font-size:4.5rem;line-height:1.1}.text-8xl{font-size:5rem;line-height:1.1}.imp\:cursor-not-allowed{cursor:not-allowed!important}.h1{margin:0;font-size:1.875rem;line-height:2.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.h1-subcaption{font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.btn-default{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-default:hover{--bg-opacity:1;background-color:#242b3a}.btn-disabled{background-color:rgb(31 41 55/var(--tw-bg-opacity));color:rgb(75 85 99/var(--tw-text-opacity))}.btn-disabled,.btn-primary{border-radius:.25rem;--tw-bg-opacity:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1}.btn-primary{background-color:rgb(4 120 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.btn-danger{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.btn-small{padding:.25rem .5rem}.input-default{width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px;background-color:#242b3a}.input-default:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.select-default{cursor:pointer;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px;background-color:#242b3a}.select-default:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.menu-item{display:flex;cursor:pointer;align-items:center}.menu-item>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.menu-item{border-radius:.25rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.menu-item:hover{--bg-opacity:1;background-color:#242b3a}.submenu-item{border-radius:.25rem;padding:.25rem;text-align:right}.submenu-item:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.chip{margin-bottom:.25rem;display:inline-block;border-radius:.25rem;border-radius:9999px;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;background-color:#242b3a}.chip,.link{font-weight:600}.link{color:rgb(156 163 175/var(--tw-text-opacity))}.link,.link:hover{--tw-text-opacity:1}.link:hover{color:rgb(209 213 219/var(--tw-text-opacity))}.newsbox{border-radius:.375rem;border-width:2px;--tw-border-opacity:1;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));background-color:#242b3a}.newsbox,.newsbox-default{border-color:rgb(4 120 87/var(--tw-border-opacity))}.newsbox-default,.newsbox-warning{--tw-border-opacity:1}.newsbox-warning{border-color:rgb(202 138 4/var(--tw-border-opacity))}.newsbox-danger{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.leaderboard-default{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.leaderboard-self{margin-left:-10px;margin-right:-10px;padding-left:calc(1rem + 10px);padding-right:calc(1rem + 10px);--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.text-gold{color:#daa520}.leaderboard-gold{border-color:#daa520}.leaderboard-silver{border-color:silver}.leaderboard-bronze{border-color:#cd7f32}::-webkit-calendar-picker-indicator{filter:invert(1);cursor:pointer}.max-available{max-width:-moz-available;max-width:-webkit-fill-available;max-width:fill-available}.projects-item a{display:flex;flex-direction:column;border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));padding:.5rem 1rem;vertical-align:middle;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.projects-item a,.projects-item a:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.projects-item a:hover{--bg-opacity:1;background-color:#242b3a;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.projects-item .color-fading{position:absolute;height:100%;width:100%;border-radius:.375rem;pointer-events:none}.disabled{pointer-events:none;cursor:default;opacity:75%}.entity-filter-control{width:180px;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.entity-filter-control label{vertical-align:text-bottom;font-weight:600;text-transform:capitalize}.entity-filter-control select{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:.375rem .625rem}.wi-min{width:-moz-min-content!important;width:min-content!important}.checked\:text-green-500:checked{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:row-span-2{grid-row:span 2/span 2}.sm\:row-span-1{grid-row:span 1/span 1}.sm\:row-span-3{grid-row:span 3/span 3}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:flex-shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-nowrap{flex-wrap:nowrap}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-3{grid-column:span 3/span 3}.md\:row-span-2{grid-row:span 2/span 2}.md\:row-span-1{grid-row:span 1/span 1}.md\:row-span-3{grid-row:span 3/span 3}.md\:mb-0{margin-bottom:0}.md\:mt-16{margin-top:4rem}.md\:flex{display:flex}.md\:w-3\/4{width:75%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-1\/2{width:50%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-nowrap{flex-wrap:nowrap}.md\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.lg\:inline-block{display:inline-block}.lg\:w-3\/4{width:75%}.lg\:w-1\/2{width:50%}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:px-24{padding-left:6rem;padding-right:6rem}} \ No newline at end of file diff --git a/static/assets/css/app.dist.css.br b/static/assets/css/app.dist.css.br index 86e3f7ebdd17659373f4dfc30cbe8b34c9555248..92239628ab66288639063a82217c1c0dc95461fc 100644 GIT binary patch literal 3905 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 Pa!RSnXeRVFIfXd^0u!XH literal 3903 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 -
-
+
+
Total Time {{ .TotalTime | duration }} + after {{ .FromTime.T | datetime }}
-
+
Total Heartbeats {{ .NumHeartbeats }}
-
+
Top Project {{ .MaxByToString 0 }}
-
+
Top Language {{ .MaxByToString 1 }}
-
+
Top OS {{ .MaxByToString 3 }}
-
+
Top Editor {{ .MaxByToString 2 }}
+ {{ else }}

From d29b11173cc5937b8db4b1bde40bffae219252c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferdinand=20M=C3=BCtsch?= Date: Sun, 3 Nov 2024 23:23:43 +0100 Subject: [PATCH 4/4] docs: contrib guidelines --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0fb971b6 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,2 @@ +# Contributing +Please refer to our [contribution guidelines](https://github.com/muety/wakapi/wiki/Contributing) and [design goals](https://github.com/muety/wakapi/wiki/Design-Goals). \ No newline at end of file