commit f9bc305acaaf26bf3c5ef4ae49f7b5a20c9c1dfe
parent a5fd6f427bab2cac03b4da5668eed18b900ba3be
Author: f0x52 <f0x@cthu.lu>
Date: Mon, 21 Jun 2021 19:46:10 +0200
new styling for frontpage, update login and authorize templates (#46)
* new styling for frontpage, update login and authorize templates
* run go fmt
* add AssetBaseDir to command flag parsing
* untested: move landing page to it's own router
* go fmt, fix typo
* fix package, adapt to proper Route structure
Diffstat:
22 files changed, 971 insertions(+), 62 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -6,3 +6,6 @@
# exclude coverage report
cp.out
+
+# exclude node_modules if installed
+/web/source/node_modules
+\ No newline at end of file
diff --git a/README.md b/README.md
@@ -4,7 +4,7 @@
Federated social media software.
-![Sloth logo made by Freepik from www.flaticon.com](./assets/sloth.png)
+![Sloth logo made by Freepik from www.flaticon.com](./web/assets/sloth.png)
GoToSocial is a Fediverse server project, written in Golang. It provides an alternative to existing projects such as [Mastodon](https://joinmastodon.org/), [Pleroma](https://pleroma.social/), [Friendica](https://friendica.net), [PixelFed](https://pixelfed.org/) etc.
diff --git a/cmd/gotosocial/main.go b/cmd/gotosocial/main.go
@@ -118,6 +118,12 @@ func main() {
Value: defaults.TemplateBaseDir,
EnvVars: []string{envNames.TemplateBaseDir},
},
+ &cli.StringFlag{
+ Name: flagNames.AssetBaseDir,
+ Usage: "Directory to serve static assets from, accessible at example.com/assets/",
+ Value: defaults.AssetBaseDir,
+ EnvVars: []string{envNames.AssetBaseDir},
+ },
// ACCOUNTS FLAGS
&cli.BoolFlag{
diff --git a/go.mod b/go.mod
@@ -15,6 +15,7 @@ require (
github.com/dsoprea/go-utility v0.0.0-20200717064901-2fccff4aa15e // indirect
github.com/gin-contrib/cors v1.3.1
github.com/gin-contrib/sessions v0.0.3
+ github.com/gin-contrib/static v0.0.1 // indirect
github.com/gin-gonic/gin v1.7.2
github.com/go-errors/errors v1.4.0 // indirect
github.com/go-fed/activity v1.0.1-0.20210426194615-e0de0863dcc1
diff --git a/go.sum b/go.sum
@@ -66,7 +66,10 @@ github.com/gin-contrib/sessions v0.0.3 h1:PoBXki+44XdJdlgDqDrY5nDVe3Wk7wDV/UCOuL
github.com/gin-contrib/sessions v0.0.3/go.mod h1:8C/J6cad3Il1mWYYgtw0w+hqasmpvy25mPkXdOgeB9I=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-contrib/static v0.0.1 h1:JVxuvHPuUfkoul12N7dtQw7KRn/pSMq7Ue1Va9Swm1U=
+github.com/gin-contrib/static v0.0.1/go.mod h1:CSxeF+wep05e0kCOsqWdAWbSszmc31zTIbD8TvWl7Hs=
github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
+github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA=
github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
@@ -95,6 +98,7 @@ github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTM
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-playground/validator/v10 v10.6.1 h1:W6TRDXt4WcWp4c4nf/G+6BkGdhiIo0k417gfr+V6u4I=
github.com/go-playground/validator/v10 v10.6.1/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk=
diff --git a/internal/cliactions/server/server.go b/internal/cliactions/server/server.go
@@ -44,6 +44,7 @@ import (
timelineprocessing "github.com/superseriousbusiness/gotosocial/internal/timeline"
"github.com/superseriousbusiness/gotosocial/internal/transport"
"github.com/superseriousbusiness/gotosocial/internal/typeutils"
+ "github.com/superseriousbusiness/gotosocial/internal/web"
)
var models []interface{} = []interface{}{
@@ -123,6 +124,7 @@ var Start cliactions.GTSAction = func(ctx context.Context, c *config.Config, log
appsModule := app.New(c, processor, log)
followRequestsModule := followrequest.New(c, processor, log)
webfingerModule := webfinger.New(c, processor, log)
+ webBaseModule := web.New(c, processor, log)
usersModule := user.New(c, processor, log)
timelineModule := timeline.New(c, processor, log)
notificationModule := notification.New(c, processor, log)
@@ -143,6 +145,7 @@ var Start cliactions.GTSAction = func(ctx context.Context, c *config.Config, log
authModule,
// now everything else
+ webBaseModule,
accountModule,
instanceModule,
appsModule,
diff --git a/internal/config/config.go b/internal/config/config.go
@@ -170,6 +170,11 @@ func (c *Config) ParseCLIFlags(f KeyedFlags) error {
c.TemplateConfig.BaseDir = f.String(fn.TemplateBaseDir)
}
+ // template flags
+ if c.TemplateConfig.AssetBaseDir == "" || f.IsSet(fn.AssetBaseDir) {
+ c.TemplateConfig.AssetBaseDir = f.String(fn.AssetBaseDir)
+ }
+
// accounts flags
if f.IsSet(fn.AccountsOpenRegistration) {
c.AccountsConfig.OpenRegistration = f.Bool(fn.AccountsOpenRegistration)
@@ -283,6 +288,7 @@ type Flags struct {
DbDatabase string
TemplateBaseDir string
+ AssetBaseDir string
AccountsOpenRegistration string
AccountsApprovalRequired string
@@ -326,6 +332,7 @@ type Defaults struct {
DbDatabase string
TemplateBaseDir string
+ AssetBaseDir string
AccountsOpenRegistration bool
AccountsRequireApproval bool
@@ -371,6 +378,7 @@ func GetFlagNames() Flags {
DbDatabase: "db-database",
TemplateBaseDir: "template-basedir",
+ AssetBaseDir: "asset-basedir",
AccountsOpenRegistration: "accounts-open-registration",
AccountsApprovalRequired: "accounts-approval-required",
@@ -417,6 +425,7 @@ func GetEnvNames() Flags {
DbDatabase: "GTS_DB_DATABASE",
TemplateBaseDir: "GTS_TEMPLATE_BASEDIR",
+ AssetBaseDir: "GTS_ASSET_BASEDIR",
AccountsOpenRegistration: "GTS_ACCOUNTS_OPEN_REGISTRATION",
AccountsApprovalRequired: "GTS_ACCOUNTS_APPROVAL_REQUIRED",
diff --git a/internal/config/default.go b/internal/config/default.go
@@ -18,7 +18,8 @@ func TestDefault() *Config {
ApplicationName: defaults.ApplicationName,
},
TemplateConfig: &TemplateConfig{
- BaseDir: defaults.TemplateBaseDir,
+ BaseDir: defaults.TemplateBaseDir,
+ AssetBaseDir: defaults.AssetBaseDir,
},
AccountsConfig: &AccountsConfig{
OpenRegistration: defaults.AccountsOpenRegistration,
@@ -71,7 +72,8 @@ func Default() *Config {
ApplicationName: defaults.ApplicationName,
},
TemplateConfig: &TemplateConfig{
- BaseDir: defaults.TemplateBaseDir,
+ BaseDir: defaults.TemplateBaseDir,
+ AssetBaseDir: defaults.AssetBaseDir,
},
AccountsConfig: &AccountsConfig{
OpenRegistration: defaults.AccountsOpenRegistration,
@@ -124,6 +126,7 @@ func GetDefaults() Defaults {
DbDatabase: "postgres",
TemplateBaseDir: "./web/template/",
+ AssetBaseDir: "./web/assets/",
AccountsOpenRegistration: true,
AccountsRequireApproval: true,
diff --git a/internal/config/template.go b/internal/config/template.go
@@ -22,4 +22,6 @@ package config
type TemplateConfig struct {
// Directory from which gotosocial will attempt to load html templates (.tmpl files).
BaseDir string `yaml:"baseDir"`
+ // Directory from which static files are served
+ AssetBaseDir string `yaml:"assetDir"`
}
diff --git a/internal/web/base.go b/internal/web/base.go
@@ -0,0 +1,85 @@
+/*
+ GoToSocial
+ Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package web
+
+import (
+ "fmt"
+ "net/http"
+ "os"
+ "path/filepath"
+
+ "github.com/gin-contrib/static"
+ "github.com/gin-gonic/gin"
+ "github.com/sirupsen/logrus"
+ "github.com/superseriousbusiness/gotosocial/internal/api"
+ "github.com/superseriousbusiness/gotosocial/internal/config"
+ "github.com/superseriousbusiness/gotosocial/internal/processing"
+ "github.com/superseriousbusiness/gotosocial/internal/router"
+)
+
+type Module struct {
+ config *config.Config
+ processor processing.Processor
+ log *logrus.Logger
+}
+
+func New(config *config.Config, processor processing.Processor, log *logrus.Logger) api.ClientModule {
+ return &Module{
+ config: config,
+ log: log,
+ processor: processor,
+ }
+}
+
+func (m *Module) baseHandler(c *gin.Context) {
+ l := m.log.WithField("func", "BaseGETHandler")
+ l.Trace("serving index html")
+
+ instance, err := m.processor.InstanceGet(m.config.Host)
+ if err != nil {
+ l.Debugf("error getting instance from processor: %s", err)
+ c.JSON(http.StatusInternalServerError, gin.H{"error": "internal server error"})
+ return
+ }
+
+ // FIXME: fill in more variables?
+ c.HTML(http.StatusOK, "index.tmpl", gin.H{
+ "instance": instance,
+ "countUsers": 3,
+ "countStatuses": 42069,
+ "version": "1.0.0",
+ "adminUsername": "@admin",
+ })
+}
+
+// Route satisfies the RESTAPIModule interface
+func (m *Module) Route(s router.Router) error {
+
+ // serve static files from /assets
+ cwd, err := os.Getwd()
+ if err != nil {
+ return fmt.Errorf("error getting current working directory: %s", err)
+ }
+ assetPath := filepath.Join(cwd, m.config.TemplateConfig.AssetBaseDir)
+ s.AttachMiddleware(static.Serve("/assets", static.LocalFile(assetPath, false)))
+
+ // serve front-page
+ s.AttachHandler(http.MethodGet, "/", m.baseHandler)
+ return nil
+}
diff --git a/web/assets/bundle.css b/web/assets/bundle.css
@@ -0,0 +1,191 @@
+html, body {
+ padding: 0;
+ margin: 0;
+ background: #525c66;
+ color: #fafaff;
+ font-family: sans-serif;
+}
+
+body {
+ display: grid;
+ grid-template-columns: 1fr 50% 1fr;
+ grid-template-columns: 1fr 90ch 1fr;
+ line-height: 1.5em;
+
+ min-height: 100vh;
+ grid-auto-rows: auto;
+ grid-auto-flow: dense;
+}
+
+body > * {
+ align-self: start;
+ grid-column: 2;
+ }
+
+body header, body footer, body .fullWidth {
+ grid-column: 1/4;
+ grid-column: 1/-1;
+ }
+
+body aside.left {
+ grid-column: 1;
+ }
+
+body aside.right {
+ grid-column: 3;
+ }
+
+header {
+ background: rgb(70, 79, 88);
+ padding: 2rem;
+ margin-bottom: 4rem;
+}
+
+h1 {
+ /* color: $acc1; */
+ margin: 0;
+ line-height: 2.4rem;
+}
+
+a {
+ color: #de8957;
+}
+
+a.button, button {
+ border-radius: 0.2rem;
+ background: #de8957;
+ color: #fafaff;
+ text-decoration: none;
+ font-size: 1.2rem;
+ font-weight: bold;
+ padding: 0.5rem;
+}
+
+a.button:hover, button:hover {
+ background: #c76d33;
+ }
+
+button {
+ border: none;
+ cursor: pointer;
+}
+
+.count {
+ background: rgb(70, 79, 88);
+ border-radius: 0.3rem;
+ padding: 0.2rem;
+}
+
+.nounderline {
+ text-decoration: none;
+}
+
+.accent {
+ color: #de8957;
+}
+
+aside.logo {
+ justify-self: center;
+}
+
+aside.logo img {
+ height: 30vh;
+ }
+
+section.apps {
+ align-self: start;
+}
+
+section.apps .applist {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-gap: 0.5rem;
+ align-content: start;
+ }
+
+section.apps .applist .entry {
+ display: grid;
+ grid-template-columns: 30% 1fr;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ background: rgb(70, 79, 88);
+ border-radius: 0.5rem;
+ }
+
+section.apps .applist .entry .logo {
+ align-self: center;
+ width: 100%;
+ object-fit: contain;
+ flex: 1 1 auto;
+ }
+
+section.apps .applist .entry .logo.redraw {
+ fill: #fafaff;
+ stroke: #fafaff;
+ }
+
+section.apps .applist .entry div {
+ padding: 1rem 0;
+ }
+
+section.apps .applist .entry div h3 {
+ margin-top: 0;
+ }
+
+section.login form {
+ display: inline-grid;
+ grid-template-columns: auto 100%;
+ grid-gap: 0.7rem;
+ }
+
+section.login form input {
+ border: 1px solid #fafaff;
+ color: #fafaff;
+ background: #525c66;
+ width: 100%;
+ }
+
+section.login form button {
+ place-self: center;
+ grid-column: 2;
+ }
+
+footer {
+ align-self: end;
+
+ padding: 2rem;
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr 1fr;
+}
+
+footer a {
+ font-weight: bold;
+ }
+
+@media screen and (orientation: portrait) {
+ body {
+ grid-template-columns: 1fr 92% 1fr;
+ }
+
+ body footer, body aside.left, body aside.right {
+ grid-column: 2;
+ }
+
+ header {
+ text-align: center;
+ }
+
+ footer {
+ padding: 0;
+ margin-top: 2rem;
+ grid-template-columns: 1fr;
+ }
+
+ footer div {
+ margin: 1rem 0;
+ }
+
+ section.apps .applist {
+ grid-template-columns: 1fr;
+ }
+}
+\ No newline at end of file
diff --git a/assets/sloth.png b/web/assets/sloth.png
Binary files differ.
diff --git a/web/assets/tusky.svg b/web/assets/tusky.svg
@@ -0,0 +1,22 @@
+<svg class="logo" version="1.1" viewBox="0 0 580 580" xmlns="http://www.w3.org/2000/svg">
+ <g transform="translate(29.426 1.696)" clip-rule="evenodd" fill-rule="evenodd">
+ <path d="m464.58 257.93c9-0.87 16.14-4.1 22.16-9.94 0.35-0.35 0.6-0.8 0.9-1.17 2.6-3.1 4.94-7.18 9.7-6 8.63 2.17 9.46 19.48 8.04 27.45-2.27 12.7-15.7 28.74-32.62 35.6-12.25 4.96-24.58 7.38-37.55 7.56-3.2 0.05-5.85 1.06-7.62 3.62-11.13 16.1-27.1 24.06-45.85 27.12-4.9 0.8-6.02 2.84-6.35 7.64-1.16 16.88 4.23 31.18 14.22 44.6 7.1 9.5 12.35 20.34 19.04 30.18 10.18 14.96 17.16 31.45 23.9 48.05 2.45 6 3.75 12.48 5.46 18.75 2.57 9.45-3.48 19.32-14.44 25.83-12.1 7.18-25.26 10.55-39.16 10.48-5.64-0.02-9.43 3.12-13.65 5.57-3.18 1.85-6 4.53-8.57 7.23-12.92 13.6-28.9 20.17-47.43 21.3-8.83 0.53-59.78 16.9-123.24 8.78-21.94-2.82-46.9-7.1-65.27-15.48-13.75-6.3-34.63-21.73-39.26-36-1.2-3.7-1.98-3.43-4.3-2.18-7.3 3.93-15.16 4.83-23.26 4.33-14.96-0.9-26.27-7.77-33.72-20.9-5.6-9.83-9.05-20.23-8.48-31.68 0.1-2.2-1.33-2.7-2.8-3.43-4.3-2.08-7.4-5.33-9.3-9.68-2.25-5.15-1.1-8.83 3.95-11.24 2.32-1.1 2.5-2.5 2.26-4.65-0.88-8.4 2.67-14.56 9.92-18.62 6.56-3.68 12.47-1.43 14.5 5.84 1.18 4.23 2.5 6.9 7.75 6.54 4.86-0.33 8.34 2.58 9.86 7.3 1.4 4.3-1.13 10.6-5.2 13.4-1.88 1.28-3.72 2.73-5.8 3.6-4.46 1.84-4.5 5.17-3.25 8.88 1.77 5.3 4.23 10.28 7.58 14.76 4.47 6 12.88 6.42 17.92 0.98 4.64-5 5.95-10.86 5.1-17.6-1.64-13.3-1.74-26.68 0.23-40 1.1-7.43 3.4-14.64 5.9-21.7 7.34-20.78 14.77-41.55 30.63-57.9 4.12-4.24 8.4-8.16 13.42-11.32 1.3-0.84 3.36-1.62 0.95-3.5-6.4-5.02-7.04-12.57-8.6-19.7-0.43-1.9-0.85-3.86-0.8-5.8 0.05-3.8-1-6.2-5.08-7.56-3.14-1.04-3.9-4.64-4-7.85-0.75-23.95 4.8-46.1 17.6-66.64 10.64-17.05 21.42-33.95 33.88-49.72 2.43-3.07 5.1-6.94 8.3-9.25 2.47-2.42 4.02-5.3 3.25-9.43-2.45-13.18-4.05-25.76-2.9-38.73 1.16-12.8 12.96-25.3 28.64-18.68 2.1 0.88 3.03-0.28 3.8-1.85 5.56-11.32 25.42-26.14 35.6-27.08 5.4-0.5 11.06 3.56 12.63 10.08 1.06 4.38 2.12 6.15 7.37 4.7 5.6-1.57 11.84-1.57 15.74 4.57 1.37 2.14 2.5 4.48 1.77 6.92-2.34 6.77 0.22 6.7 4.22 6.64 19.47-0.34 36.57 11.34 52.55 22.58 4.43 3.12 7.88 7.36 11.35 11.43 9.5 11.2 18.47 22.87 29.36 32.8 8.34 7.58 17.73 13.18 29.46 13.54 1.8 0.06 3.6 0.16 5.38 0 9.7-0.88 13.12-7.9 8.15-16.43-3.77-6.46-9.08-12-11.58-19.24-3.07-8.9-4.93-17.73 1.06-26.2 1.36-1.94 0.78-3.72 0.17-5.6-1.98-6.1-0.9-12.03 1.47-17.67 1.57-3.76 4.62-6.53 9-6.6 4.3-0.04 8.12 1.35 10.13 5.58 1.33 2.8 2.57 5.65 3.64 8.55 1.63 4.44 5.64 6.35 9.57 3.78 2.73-1.77 3.28-4.88 5.76-7 3.8-3.24 7.8-4.04 12.02-1 4.23 3.04 6.86 7 6 12.5-0.33 2.25-0.96 4.45-2.46 6.32-3.24 4.02-2.96 7.96 0.14 12.03 2.95 3.9 5.88 7.86 9 11.57 10.86 13.11 17.68 28.11 21.09 44.55 2.06 9.93 1.8 20.08-0.46 30.13-3.2 14.18-8.4 27.4-17.4 38.95-0.37 0.48-0.52 1.12-1.1 2.4z" fill="#121419"/>
+ <path d="m434.05 70.75c-4.33 1.58-7.75 1.33-10.1-1.72-2.36-3.08-2.15-7.75 0.5-10.18 2.44-2.23 6.73-3.17 6.73-3.17s-5.97-18.84-7.52-24.82c-0.6-2.52-0.92-5.7 4.3-8.72 7.68-4.42 15.2-7.8 24.1-10.7 3.28-1.06 7.05-0.3 8.7 2.68 4.12 11.28 7 21.06 10.66 32.28 3.1 9.54-1.33 10.92-4.82 13-2.74 1.63-6.45 2.92-9.94 0.64-3-1.96-3.2-6.7-2.07-9.67 1.95-3.74 8.18-5.2 8.18-5.2s-2.03-6.4-3.1-9.5c-4.27-12.07-4.44-9.3-16.1-4.23-10.4 4.52-9.9 5.07-6.54 15.98 0.76 2.48 2.74 7.93 3.74 11.88 2.02 7.9-1.32 9.48-6.73 11.45zm-76.19-16.23c-0.06-6.67 9.1-15.55 15.24-15.43 2.4 0.03 4.03 1.26 5.13 3.2 5.96 10.4 11.24 21.16 17.7 31.3 2.23 3.47 1.18 6.97-1.84 10.06-3.42 3.48-6.68 4.82-11 1.6-7.96-5.9-25.96-26.6-25.24-30.74zm148.66 19.25c0.53 2.86-2.1 4.22-6.44 6.7-5.93 3.4-14.07 6.7-20.86 10.55-3.48 1.98-7.18 4.66-10.96 0.57-3.46-3.75-3.74-11.26-0.4-14.8 8.26-8.74 16.8-17.2 26.12-24.83 3.9-3.2 6.88-2.52 8.86 2.1 2.4 5.6 3.3 11.57 3.68 19.7zm-21.04 45.43c-10.47 0.63-11.15 0.1-12.55-10.14-0.86-6.2 0.57-8.46 6.56-9.66 9.93-2 19.34-5.8 29.12-8.33 6.37-1.65 8.36-0.26 8.5 6.3 0.17 6.6-2.64 12.2-6.38 17.08-3.2 4.18-24.45 4.7-25.26 4.75zm-80.08-93.1c0.38 7.18 1.68 23.77 1.65 24.9-0.1 3.47-0.96 6.85-4.7 7.7-3.56 0.83-5.83-2.2-7.2-4.75-3.84-7.16-6.7-14.8-8.8-22.66-0.68-2.53-1.16-5.1-1.98-7.55-2.1-6.2-1.5-9.24 3.5-13.36 2.86-2.38 5.83-4.8 9.43-6 4.92-1.64 7.73 0.03 8.03 5.1 0.33 5.52 0.08 11.07 0.08 16.6z" fill="#2b90d9"/>
+ <path d="m237.55 461.68c-3.74-4.52-5.68-10.24-9.82-14.5-8.22-8.45-18.98-11.4-29.97-12.43-13.3-1.25-25.84 2.5-37.3 9.43-1.23 0.75-4.1 1-2.96 3.46 1.12 2.44 3.37 1.07 5.2 0.6 0.63-0.17 1.3-0.3 1.84-0.64 12.76-7.84 26.86-6.72 39.83-2.92 12.03 3.52 22.96 10.7 28.42 23.56 7.16 16.86 10.88 34.32 10.7 52.63 0 2.65-0.3 4.42-3.3 5.6-7.93 3.1-10.82 10.33-7.84 18.34 0.33 0.87 0.67 1.73 1 2.6-1.97 0.64-2.25-0.7-2.8-1.58-3.06-4.83-7.6-6.5-13.04-5.87-5.22 0.6-7.82 4.27-9.36 8.86-1.05 3.13-1.84 6.34-1.14 9.63 0.37 1.73 0.28 2.84-1.7 3.23-1.8 0.35-2.7-0.2-3.1-2.07-0.83-3.67-3.48-6-6.05-8.6-7.77-7.88-17.46-2.88-19.98 6.12-0.96 3.38-2.3 3.72-5.05 2.9-2.5-0.72-5.07-1.22-7.54-2.04-11.78-3.97-14.72-13.16-14.2-24.34 0.17-3.45-0.14-6.85-1.16-10.15-0.4-1.32-1.14-2.53-2.7-2.4-1.6 0.16-2.1 1.5-2 2.9 0.28 3.7-1.95 9.37-7.6 10.37-14.93 2.63-38.63-9.07-43.2-28.57-1.64-1.5-3.04-1.64-4.8-0.98-1.07 0.4-2.16 0.86-3.04 1.55-9.6 7.47-20.4 8.52-32.02 6.66-6.1-0.98-11.44-3.3-15.46-7.65-9.14-9.86-13.94-21.8-14.97-35.23-0.2-2.55 0.46-4.92 2.46-6.64 2.48-2.13 4.33-2.62 6.5 1.02 3.45 5.8 3.97 12.56 7.33 18.4 7.13 12.36 22.7 17.5 35 2.98 4.64-5.47 4.54-10.5 3.78-16.98-2.33-20.22-1.35-40.16 4.53-60.02 5.46-18.4 13.88-35.12 23.95-51.2 5.25-8.37 12.45-15.13 20.4-20.88 4.24-3.1 10.25-2.7 14.76-5.88 1.4-1 2.28 0.94 2.98 1.85 4.92 6.36 11.94 8.28 19.36 9.05 9.7 1 15.67-4.7 19.8-12.45 2.16-4.04 3.35-4.27 6.72-1.1 3.13 2.94 6.97 5.32 11.15 6.9 1.4 0.54 2.73 1.28 4.2 0.65 1.43-0.6 3.6-0.34 4-2.33 0.44-2.22-1.8-2.45-3.1-3.13-5.34-2.84-10.44-6.04-15.34-9.6-1.9-1.4-2.3-2.74-1.52-4.94 3.85-10.7 2.88-21.9 2.96-32.94 0-2.66-1.03-5.73-4.37-5.4-3.42 0.34-2.4 3.4-2.48 5.83-0.34 10.57 0.2 48.52-20.4 51.8-5.6 0.88-11.72-3.87-14.97-7.55-1.05-1.2-1.6-2.82-2.3-4.3-1.9-3.97-4.7-4.7-8.32-2.28-1.6 1.1-3.16 2.3-4.77 3.42-6.07 4.18-11.02 2.55-13-4.62-2.12-7.58-2.73-15.4-2.9-23.25-0.18-7.1-0.37-7.44-7.23-7.38-3.63 0.02-3.4-2.65-3.34-4.76 0.3-7.84 1.16-15.63 3.16-23.24 5.44-20.78 15.25-39.46 27.34-57.06 9.98-14.53 20.6-28.52 32.6-41.46 1.35-1.46 2.53-3.08 1.88-5.25-3.8-12.62-4.97-25.52-4.34-38.64 0.18-3.68 1.14-7.06 3.14-10.16 4.82-7.47 11.9-8.46 18.45-2.54 4.23 3.82 5.38 3.75 7.42-1.7 4.34-11.62 13.95-18.16 23.3-25 1.14-0.85 2.63-1.3 4.03-1.74 8.2-2.65 11.25-0.47 11.25 8.02 0 1.15-0.07 2.3-0.03 3.43 0.13 4.47 1.23 5.28 5.4 3.6 3.7-1.5 7.53-2.1 11.46-2.12 2.42 0 5.3-0.08 6.36 2.63 1 2.62-0.22 5.13-1.9 7.25-1.02 1.28-2.27 2.37-3.23 3.67-1.26 1.72-1.58 3.66-0.2 5.45 1.3 1.7 3.07 1.46 4.9 0.9 2.35-0.7 4.7-1.3 7.08-1.85 5.5-1.3 10.67-0.84 16.25 0.93 22.57 7.14 39.55 21.56 53.67 39.85 10.63 13.77 21.63 27.04 37.92 34.54 8.35 3.85 16.9 6.37 26.37 6.2 15.5-0.27 22.1-14.73 14.75-28.12-2.35-4.27-5.4-8.16-8.04-12.27-3.88-6-10.2-16.04-5.6-23.58 3.3-5.45 5.37-11.58 2.52-18.9-0.08-1.6-0.05-3.35 0.46-4.83 1.42-4.12 5.42-4.9 8.47-1.8 1.54 1.56 2.3 3.5 2.8 5.62 0.98 4.25 2.27 8.28 7.44 9.2 5.6 0.97 10.84 0.58 14.68-4.23 1.48-1.85 3.28-3.16 5.2-4.4 1.44-0.92 2.98-1.45 4.56-0.33 1.6 1.12 1.42 2.82 1.23 4.46-0.2 1.65-0.9 3.1-1.9 4.44-5.77 7.8-5.23 16.43 2.02 22.87 23.06 20.5 30.33 46.86 26.25 76.12-2.65 18.97-11.78 35.84-25.73 49.58-2.2 2.18-4.45 4.3-6.68 6.46-2.33 2.23-3.93 2.15-4.3-1.4-0.36-3.5-1.98-6.5-3.52-9.58-2.34-4.65-6.03-6.72-11.1-6.17-3.3 0.34-8.26 5.75-9.05 9.47-3.08 14.45-13.34 23.87-27.43 26.86-15.9 3.36-30.32 1.14-43.77-8.18-3.5-2.43-7-4.17-9.73-8-5.08-7.13-16.4-6.98-23.1-0.75-0.6 0.56-1.48 1-1.12 1.93 0.48 1.22 1.7 0.8 2.55 0.65 0.94-0.16 1.8-0.77 2.72-1.1 5.43-1.83 7.9-1.44 13.27 2.3-3.13 1.38-6.1 2.42-8.8 3.9-15.9 8.8-23.13 20.6-18.48 36.6 1.56 5.37 3.22 10.8 8.85 13.87 3.24 1.77 2.84 3.92-0.62 5.42-3.44 1.5-6.83 3.12-10.25 4.65-0.87 0.4-2.22 0.47-2.1 1.67 0.17 1.43 1.6 1.47 2.7 1.43 5.6-0.17 11-1.56 16.26-3.22 3.9-1.24 7.4-1.2 11.37 0 12.8 3.8 23.85 4.72 37.07 3.7 4.57-0.36 5.7-1.85 5.04 6.07-1.6 11.56 0.48 21.77 5.14 32.76 1.3 5.25 1.8 10.5 0.6 15.88-0.85 3.8-1.32 7.7-1.27 11.6 0.03 2.27-0.54 4.24-3.2 4.77-2.78 0.83-2.32 3.13-2.37 5.22-0.17 7.17-4.74 22.1-8.8 28.5-2.3-2.82-2.4-6.32-3.54-9.36-1.73-4.62-3.83-9-6.77-12.94-0.88-1.17-2.2-2.94-4.04-1.66-1.7 1.18-0.24 2.68 0.23 3.94 9.64 25.54 15.33 51.83 14.55 79.25-0.1 4.02-1.04 8.04-1.04 12.12 0 1.86-0.92 2.67-2.87 3.2-11.3 3.13-14.4 8.67-11.5 20.46 0.5 1.98-0.13 2.68-1.68 3.32-1.76 0.73-2.25-0.3-2.74-1.7-0.43-1.2-1-2.42-1.74-3.48-3.22-4.67-8.8-6.6-13.74-4.87-5.05 1.8-8.96 7.98-8.8 14.03 0.02 1.28 0.7 3.1 0.1 3.75-1.44 1.55-3.4 1.9-4.72-0.53-0.85-1.58-1.54-3.24-2.5-4.73-5.35-8.23-16.2-9.3-21.15-0.74-2.25 3.88-3.3 5.1-7.07 3.8-5.44-1.85-10-4.88-13.63-9.14-3.86-4.55-2.3-10.3-2.3-15.55 0.1-20.53 1.55-41.06-0.07-61.6-0.5-6.54-2.04-12.88-3.3-19.27-0.45-2.2-0.6-5.1-3.8-4.7-3.36 0.44-2.14 3.43-2.3 5.55-0.04 0.48 0.06 0.97 0.1 1.46-1.97 6.44-11.3 12.66-17.7 11.78z" fill="#9baec8"/>
+ <path d="m370.76 415.57c1-8.35 2-16.7 2.98-25.04 0.28-2.4-0.07-4.88 0.88-7.2 11.63 18.26 23.94 36.14 34.7 54.9 9.17 16 15.53 33.42 21.23 51 0.55 1.68 0.68 2.63-1.66 2.85-12.2 1.16-16.57 7.23-13.92 18.97 0.13 0.56 0.02 1.18 0.02 1.8-2.04 0.28-2.4-1.26-3.07-2.23-3.37-4.92-7.88-6.6-13.62-5.1-5.52 1.4-9.5 4.85-10.5 10.37-0.68 3.88-2.28 4.43-5.52 3.85-4.17-0.74-8.36-1.36-12.56-1.97-2.54-0.37-3.56-1.5-3.3-4.3 1.32-14.88 0.22-29.66-2.8-44.27-0.6-2.87-0.3-5.22 0.94-7.93 5.26-11.42 10.02-23.04 10.24-35.9 0.07-3.8 0-7.65-4.04-9.8z" fill="#8192a6"/>
+ <path d="m356.08 338.47c-7.7 0.43-18.2-2.36-28.64-4.5-16.86-3.44-25.54-20.38-18.15-35.16 4.42-8.87 12.58-13.95 22.5-15.12 4.26-0.5 7.23 3.35 10.35 5.82 5.75 4.55 12 8.16 19.3 8.75 14.3 1.16 28.3-0.6 41.18-7.27 9.55-4.95 15.58-13.08 18.27-23.62 0.7-2.78 1.5-6.7 4.48-6.78 3.67-0.1 4.9 3.98 5.65 7.1 4.6 19.4-3.52 40.9-19.7 52.66-6.42 4.68-12.42 10.08-20 12.93-10.3 3.88-21.1 5.1-35.25 5.2z" fill="#d9e1e8"/>
+ <path d="m440 305c-3.6-0.1-3.5-1.06-3.58-5.14-0.32-13.9 7.15-20.92 14.32-27.6 5.77-5.37 11.57-8.7 19.6-9.65 8.85-1.02 16.66-5.3 22.36-12.68 0.9-1.16 1.73-3.32 3.63-2.48 1.62 0.72 2.38 2.66 2.6 4.5 0.92 7.78-0.24 15.26-3.5 22.4-7.07 15.62-27.1 24.16-36.08 27-6.98 2.23-15.14 3.76-19.34 3.65z" fill="#cad4e0"/>
+ <path d="m237.55 461.68c6.07-3.67 12.54-6.74 17.7-11.77 0.9 9.37 1.87 18.73 2.6 28.1 0.43 5.35 0.5 10.73 0.62 16.1 0.04 1.77-0.06 3.6-0.48 5.32-0.7 2.85-3.2 4.6-5.63 4.7-2.56 0.13-1.87-2.9-2.13-4.66-2-13.35-6.65-25.8-12.7-37.78zm-205.99-5.08c-3.18-1.1-5.75 0.44-8.2 2.1-4.54 3.08-6.36 2.92-9.92-1.35-0.93-1.1-1.68-2.4-2.42-3.65-0.5-0.84-1-1.88-0.34-2.75 0.95-1.27 2.02-0.18 3.06 0.1 3 0.82 6.4 4.16 8.85 2.05 2.36-2.03-1.6-4.94-2.08-7.75-0.7-4-1.72-7.94-1.6-12.06 0.1-3.6 2.05-5.86 5.37-6.68 3.62-0.88 4.72 2.2 5.97 4.58 1.4 2.67 1.2 5.7 1.4 8.62 0.12 1.73-0.6 3.82 1.47 4.78 1.8 0.84 2.96-0.8 4.32-1.6 1.54-0.9 3.1-1.96 4.77-2.4 3.37-0.88 5.83 1.87 4.8 5.12-0.7 2.13-13.23 10.96-15.47 10.9z" fill="#7f90a4"/>
+ <path d="m320.74 552.86c0-3.62 1.58-6.17 3.95-8.34 1.97-1.8 4.1-1.73 6.32-0.54 2.6 1.4 3.5 4.16 3.66 6.55 0.17 2.4-2.78 2.16-4.55 2.68-2.18 0.65-4.42 1.1-6.62 1.7-2.04 0.53-3.18 0.08-2.76-2.04zm-109.62 2.89c0.62-7.63 5.97-12.05 11-9.22 1.87 1.04 3.73 2.48 3.63 4.83-0.1 2.32-9 5.34-11.57 6.4-2 0.8-3.7 0.78-3.06-2zm-20.68 7.18c-1.76-0.23-10.18 0.22-10.6-2.52-0.35-2.33 1.4-4.48 3.5-6 2.27-1.65 4.47-1.77 6.75-0.26 1.06 0.7 2.23 1.4 3.02 2.37 1.1 1.33 3.2 2.64 2.36 4.47-0.8 1.78-2.98 2.23-5.04 1.96zm200.73-43.49c2.04-6.24 7-9.52 11.73-8.35 2.15 0.53 3.55 2.03 3.88 3.9 0.42 2.34-2.14 1.87-3.42 2.47-3.73 1.76-7.83 1.28-12.2 1.97zm-88.53 38.16c-3.28-0.47-11.57-0.97-11.9-2.4-0.42-1.8 1.33-3.16 2.75-4.2 4.6-3.4 8.78-2.1 10.7 3.23 1 2.82 0.55 3.43-1.56 3.36zm117.46-47.18c-1.2-5.6 0.16-9.25 4.92-11.44 1.9-0.88 3.66-0.63 4.82 0.74 1.2 1.43-0.37 2.67-1.28 3.7-2.34 2.63-4.96 4.94-8.47 7zm-63.13 20.48c-0.27 4.6-2 7.9-5.37 10.37-0.64 0.46-1.24 1.42-2 0.94-0.53-0.33-0.82-1.35-0.9-2.1-0.38-4.45 3.08-8.4 8.27-9.2zm-114.69 4.6c-0.73 3.33-1.4 6.46-4.55 7.58-0.62 0.22-0.98-2.36-0.68-3.82 0.53-2.58 1.12-5.3 4.13-5.85 1.8-0.32 0.86 1.56 1.1 2.1z" fill="#cad4e0"/>
+ <path d="m369.34 395.2c-0.36 10.82-7.26 15.35-17.1 11.05-1.5-0.65-2.08-0.66-3.2 0.53-7.24 7.7-14.98 6.93-20.1-2.23-1.5-2.67-2.45-3.12-5.43-1.97-7.26 2.82-11.64-0.6-11.53-8.5 0.06-4.7 1.6-8.96 4.12-12.87 0.8-1.26 2-2.45 3.64-1.64 1.92 0.95 0.28 2.3-0.08 3.3-1.25 3.6-2.2 7.2-2.02 11 0.18 3.53 2.2 3.96 4.5 2.1 2.1-1.7 3.7-4.08 5.5-6.2 0.75-0.88 1.4-1.87 2.8-1.45 1.32 0.4 1.52 1.5 1.67 2.7 0.63 4.87 2.5 9.06 6.5 12.16 2.58 2 4.4 1.93 5.47-1.45 0.74-2.32 1.6-4.6 2.26-6.96 0.8-2.9 2.17-3.03 4-0.92 2.32 2.68 5.2 5.96 8.57 3.67 3.46-2.35 1.47-6.54 0.3-9.9-0.9-2.64-2.05-5.16-4-7.24-0.8-0.84-1.68-1.75-0.73-2.96 0.7-0.9 1.7-0.6 2.7-0.43 4.32 0.73 7.47 2.7 9.14 7.06 1.4 3.65 3.27 7.1 3.04 11.17zm-111.54-160.25c0 3.1 0.06 5.4-0.03 7.67-0.05 1.25-0.75 2.13-2.06 2.38-1.4 0.27-2.43-0.06-3.33-1.34-8.95-12.77-2.18-30.7 12.84-33.9 7.24-1.53 18.57 3.32 22.34 9.53 1.63 2.66 0.77 5.45-0.96 7.1-2.03 1.94-3.08-1.2-4.62-2.1-3.3-1.95-6.58-4.33-10.2-5.3-6.54-1.75-12.92 3.24-13.6 9.93-0.24 2.27-0.28 4.56-0.36 6.02zm77.83-52.18c-0.4 3.9 0.7 6.67 1.5 9.5 0.5 1.72 0.1 3.34-1.5 4.28-1.32 0.8-2.77 0.04-3.48-0.96-3.8-5.36-6.13-11.28-4.57-17.9 1.37-5.78 5.48-9.1 11.26-10.22 7.58-1.47 16.86 5.04 17.3 12.13 0.1 1.34 0.82 3.13-1.05 3.9-1.44 0.58-2.48-0.47-3.45-1.34-1.58-1.4-3-3.04-4.72-4.25-2.7-1.88-5.8-2.27-8.88-1.06-3.2 1.27-2.16 4.37-2.42 5.93z" fill="#121419"/>
+ <path d="m334.32 456.65c0.4 3.22-0.48 5.42-2.9 6.2-2.62 0.85-4.6-1-5.16-3.3-1.23-5.03-2.02-10.18-2.83-15.3-0.3-1.87 0.14-3.75 2.42-4.15 2.12-0.36 3.48 1 4.1 2.76 1.63 4.77 3.06 9.6 4.38 13.8zm12.56 40.87c-0.37 3.22-1.74 5.15-4.26 5.35-2.76 0.2-4.25-2.07-4.25-4.42-0.02-5.18 0.42-10.37 0.83-15.55 0.15-1.88 1-3.6 3.32-3.45 2.14 0.14 3.16 1.77 3.33 3.64 0.48 5 0.73 10.04 1.03 14.42zm-235.55-92.29c-1.5 2.88-3.47 4.2-5.9 3.47-2.64-0.8-3.22-3.44-2.4-5.64 1.85-4.85 4.12-9.54 6.35-14.23 0.82-1.7 2.23-3 4.34-2.03 1.95 0.9 2.3 2.78 1.8 4.6-1.34 4.84-2.9 9.64-4.2 13.83zm13.73 28.37c-1.18 3.04-3 4.56-5.47 4.1-2.74-0.5-3.6-3.06-3-5.34 1.28-5.02 3.02-9.93 4.73-14.83 0.62-1.78 1.9-3.23 4.1-2.5 2.03 0.68 2.6 2.52 2.3 4.37-0.82 4.97-1.85 9.9-2.67 14.22zm193.89 53.76c-0.07 3.25-1.26 5.3-3.74 5.72-2.73 0.47-4.42-1.66-4.64-4-0.5-5.16-0.55-10.37-0.6-15.56-0.04-1.88 0.65-3.68 2.97-3.74 2.15-0.07 3.3 1.47 3.66 3.3 0.92 4.96 1.65 9.95 2.35 14.28zm-98.61-20.46c2.03 2.55 2.43 4.9 0.8 6.8-1.8 2.1-4.47 1.56-6.14-0.1-3.7-3.63-7.06-7.6-10.44-11.54-1.23-1.44-1.85-3.26-0.1-4.8 1.6-1.42 3.47-0.98 4.92 0.2 3.9 3.2 7.65 6.58 10.96 9.45zm-2.29 38.35c0.7 3.18 0.02 5.45-2.3 6.45-2.54 1.1-4.7-0.58-5.46-2.8-1.7-4.9-2.98-9.95-4.26-14.98-0.47-1.83-0.22-3.74 2.02-4.34 2.07-0.57 3.56 0.65 4.33 2.36 2.07 4.6 3.94 9.27 5.65 13.3z" fill="#8192a6"/>
+ <path d="m146.02 376.7c-1.1 4.03-2.14 8.66-3.63 13.13-0.78 2.3-2.78 3.84-5.43 2.93-2.74-0.93-3.6-3-2.78-5.86 1.37-4.75 3.28-9.23 6.55-13 0.98-1.14 2.27-2.02 3.87-1.16 1.32 0.7 1.5 2.04 1.4 3.95zm-12.22-136.87c1.24-5.52 3.77-10.15 7.84-13.9 1.08-1 2.33-1.1 3.57-0.23 1.22 0.86 1.73 2.12 1.23 3.43-1.82 4.68-3.67 9.36-5.76 13.93-0.7 1.54-2.42 2.3-4.18 1.58-2.17-0.88-2.2-3.04-2.7-4.8z" fill="#8192a6"/>
+ <path d="m364.47 208.65c0.68-3.4 2.7-5.58 4.54-7.8 2.75-3.3 6.58-5.2 10.03-7.6 1.67-1.14 3.5-1.1 4.63 0.8 1.1 1.9 0.32 3.47-1.46 4.5-5.08 2.98-9.5 6.58-12.3 11.93-0.7 1.33-1.87 2.42-3.55 1.87-1.97-0.65-1.72-2.5-1.88-3.7z" fill="#121419"/>
+ <path d="m162.8 248.16c-0.42 3.7-0.44 6.67-1.2 9.44-0.72 2.68-2.34 5.54-5.74 4.5-2.95-0.9-4-3.72-3.22-6.74 0.8-3.12 1.53-6.34 3.8-8.8 1.1-1.2 2.46-2.33 4.26-1.6 1.73 0.7 2.12 2.3 2.1 3.2z" fill="#8192a6"/>
+ <path d="m190.34 490.35c0.05 2.55-0.43 4.5-2.64 5.16-2.07 0.64-3.58-0.8-4.3-2.45-1.66-3.87-3.07-7.86-4.44-11.86-0.5-1.44-0.36-3 1.1-3.93 1.6-1 2.87-0.02 3.84 1.12 3.1 3.62 5.57 7.6 6.44 11.95zm-60.17-126.77c-2.9-0.2-4-2.12-3.06-4.66 2-5.3 6.8-8.15 11.1-11.2 1.7-1.2 3.38 0.36 3.4 2.66 0 2.32-8.13 12.54-10.33 13.05-0.32 0.08-0.64 0.1-1.1 0.15z" fill="#8192a6"/>
+ <path d="m179.53 216.1c-0.84 4-2.6 7.82-5.46 11.05-1.5 1.7-3.52 1.57-5.38 0.5-1.93-1.1-2.08-2.97-1.26-4.7 1.84-3.85 4.4-7.22 7.88-9.78 0.92-0.67 2.04-1.17 3.18-0.4 1.08 0.74 1.1 1.9 1.03 3.32z" fill="#8192a6"/>
+ <path d="m175.5 186.16c-1.3 3.68-3.26 7.4-6.47 10.23-1.24 1.1-2.8 0.47-4.02-0.48-1.37-1.08-2.35-2.67-1.32-4.22 2.05-3.08 3.98-6.37 7.17-8.44 2.43-1.57 4.7-0.2 4.65 2.9z" fill="#8192a6"/>
+ <path d="m386.26 211.43c0.38-4.44 1.16-8.6 3.12-12.42 0.98-1.9 2.6-3.23 4.77-2.26 2.48 1.1 1.68 3.02 0.77 4.95-1.66 3.53-3.06 7.2-4.73 10.72-0.57 1.18-0.87 3.34-2.8 2.72-1.68-0.54-0.95-2.52-1.14-3.7z" fill="#121419"/>
+ <path d="m404.98 200.06c0.27-2.52 0.07-5.14 2.68-5.6 3.04-0.52 2.94 2.3 3.4 4.27 0.53 2.2 1 4.43 1.52 6.64 0.44 1.85 0.72 3.75-1.6 4.38-2.45 0.67-4.13-0.43-4.68-2.94-0.52-2.37-0.94-4.76-1.32-6.74z" fill="#121419"/>
+ </g>
+</svg>
+\ No newline at end of file
diff --git a/web/source/build.js b/web/source/build.js
@@ -0,0 +1,23 @@
+"use strict";
+
+const fs = require("fs").promises;
+const postcss = require('postcss');
+const {parse} = require("postcss-scss");
+
+const postcssPlugins = ["postcss-strip-inline-comments", "postcss-nested", "postcss-simple-vars", "postcss-color-function"].map((plugin) => require(plugin)());
+
+let inputFile = `${__dirname}/style.css`;
+let outputFile = `${__dirname}/../assets/bundle.css`;
+
+fs.readFile(inputFile, "utf-8").then((input) => {
+ return parse(input);
+}).then((ast) => {
+ return postcss(postcssPlugins).process(ast, {
+ from: "style.css",
+ to: "bundle.css"
+ });
+}).then((bundle) => {
+ return fs.writeFile(outputFile, bundle.css);
+}).then(() => {
+ console.log("Finished writing CSS bundle");
+});
diff --git a/web/source/package.json b/web/source/package.json
@@ -0,0 +1,11 @@
+{
+ "license": "AGPL-3.0",
+ "dependencies": {
+ "postcss": "^8.3.5",
+ "postcss-color-function": "^4.1.0",
+ "postcss-scss": "^4.0.0",
+ "postcss-nested": "^4.2.1",
+ "postcss-simple-vars": "^5.0.2",
+ "postcss-strip-inline-comments": "^0.1.5"
+ }
+}
diff --git a/web/source/style.css b/web/source/style.css
@@ -0,0 +1,199 @@
+$bg: #525c66;
+$fg: #fafaff;
+
+$bg_accent: color($bg lightness(-5%));
+
+$acc1: #de8957; // sloth light orange
+$acc2: #c76d33; // sloth dark orange
+
+html, body {
+ padding: 0;
+ margin: 0;
+ background: $bg;
+ color: $fg;
+ font-family: sans-serif;
+}
+
+body {
+ display: grid;
+ grid-template-columns: 1fr 50% 1fr;
+ grid-template-columns: 1fr 90ch 1fr;
+ line-height: 1.5em;
+
+ min-height: 100vh;
+ grid-auto-rows: auto;
+ grid-auto-flow: dense;
+
+ & > * {
+ align-self: start;
+ grid-column: 2;
+ }
+
+ header, footer, .fullWidth {
+ grid-column: 1/4;
+ grid-column: 1/-1;
+ }
+
+ aside.left {
+ grid-column: 1;
+ }
+
+ aside.right {
+ grid-column: 3;
+ }
+}
+
+header {
+ background: $bg_accent;
+ padding: 2rem;
+ margin-bottom: 4rem;
+}
+
+h1 {
+ /* color: $acc1; */
+ margin: 0;
+ line-height: 2.4rem;
+}
+
+a {
+ color: $acc1;
+}
+
+a.button, button {
+ border-radius: 0.2rem;
+ background: $acc1;
+ color: $fg;
+ text-decoration: none;
+ font-size: 1.2rem;
+ font-weight: bold;
+ padding: 0.5rem;
+
+ &:hover {
+ background: $acc2;
+ }
+}
+
+button {
+ border: none;
+ cursor: pointer;
+}
+
+.count {
+ background: $bg_accent;
+ border-radius: 0.3rem;
+ padding: 0.2rem;
+}
+
+.nounderline {
+ text-decoration: none;
+}
+
+.accent {
+ color: $acc1;
+}
+
+aside.logo {
+ justify-self: center;
+ img {
+ height: 30vh;
+ }
+}
+
+section.apps {
+ align-self: start;
+
+ .applist {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-gap: 0.5rem;
+ align-content: start;
+
+ .entry {
+ display: grid;
+ grid-template-columns: 30% 1fr;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ background: $bg_accent;
+ border-radius: 0.5rem;
+
+ .logo {
+ align-self: center;
+ width: 100%;
+ object-fit: contain;
+ flex: 1 1 auto;
+ }
+
+ .logo.redraw {
+ fill: $fg;
+ stroke: $fg;
+ }
+
+ div {
+ padding: 1rem 0;
+ h3 {
+ margin-top: 0;
+ }
+ }
+ }
+ }
+}
+
+section.login {
+ form {
+ display: inline-grid;
+ grid-template-columns: auto 100%;
+ grid-gap: 0.7rem;
+
+ input {
+ border: 1px solid $fg;
+ color: $fg;
+ background: $bg;
+ width: 100%;
+ }
+
+ button {
+ place-self: center;
+ grid-column: 2;
+ }
+ }
+}
+
+footer {
+ align-self: end;
+
+ padding: 2rem;
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr 1fr;
+
+ a {
+ font-weight: bold;
+ }
+}
+
+@media screen and (orientation: portrait) {
+ body {
+ grid-template-columns: 1fr 92% 1fr;
+
+ footer, aside.left, aside.right {
+ grid-column: 2;
+ }
+ }
+
+ header {
+ text-align: center;
+ }
+
+ footer {
+ padding: 0;
+ margin-top: 2rem;
+ grid-template-columns: 1fr;
+
+ div {
+ margin: 1rem 0;
+ }
+ }
+
+ section.apps .applist {
+ grid-template-columns: 1fr;
+ }
+}
+\ No newline at end of file
diff --git a/web/source/yarn.lock b/web/source/yarn.lock
@@ -0,0 +1,297 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+balanced-match@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a"
+ integrity sha1-tQS9BYabOSWd0MXvw12EMXbczEo=
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+color-convert@^1.3.0, color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+ integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=
+ dependencies:
+ color-name "^1.0.0"
+
+color@^0.11.0:
+ version "0.11.4"
+ resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+ integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=
+ dependencies:
+ clone "^1.0.2"
+ color-convert "^1.3.0"
+ color-string "^0.3.0"
+
+colorette@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
+ integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+
+css-color-function@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/css-color-function/-/css-color-function-1.3.3.tgz#8ed24c2c0205073339fafa004bc8c141fccb282e"
+ integrity sha1-jtJMLAIFBzM5+voAS8jBQfzLKC4=
+ dependencies:
+ balanced-match "0.1.0"
+ color "^0.11.0"
+ debug "^3.1.0"
+ rgb "~0.1.0"
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+ integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+js-base64@^2.1.9:
+ version "2.6.4"
+ resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
+ integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanoid@^3.1.23:
+ version "3.1.23"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
+ integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==
+
+postcss-color-function@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-color-function/-/postcss-color-function-4.1.0.tgz#b6f9355e07b12fcc5c34dab957834769b03d8f57"
+ integrity sha512-2/fuv6mP5Lt03XbRpVfMdGC8lRP1sykme+H1bR4ARyOmSMB8LPSjcL6EAI1iX6dqUF+jNEvKIVVXhan1w/oFDQ==
+ dependencies:
+ css-color-function "~1.3.3"
+ postcss "^6.0.23"
+ postcss-message-helpers "^2.0.0"
+ postcss-value-parser "^3.3.1"
+
+postcss-message-helpers@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+ integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=
+
+postcss-nested@^4.2.1:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.2.3.tgz#c6f255b0a720549776d220d00c4b70cd244136f6"
+ integrity sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==
+ dependencies:
+ postcss "^7.0.32"
+ postcss-selector-parser "^6.0.2"
+
+postcss-scss@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.0.tgz#6cfe09040f01e3345c9c226894c5913ac5fa9381"
+ integrity sha512-xakgIr5ukOEyXFcsnADKjQtrk8nQyqn5VIEAA+PmPP4kBOpknmjpJMxBNqCR1/x20AS0aSfZkWsSdbMx2Ozm5A==
+
+postcss-selector-parser@^6.0.2:
+ version "6.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
+ integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-simple-vars@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz#e2f81b3d0847ddd4169816b6d141b91d51e6e22e"
+ integrity sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==
+ dependencies:
+ postcss "^7.0.14"
+
+postcss-strip-inline-comments@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/postcss-strip-inline-comments/-/postcss-strip-inline-comments-0.1.5.tgz#7ff6bcdc14e633ed4cdfa020bae3eddad4f84b90"
+ integrity sha1-f/a83BTmM+1M36AguuPt2tT4S5A=
+ dependencies:
+ postcss "^5.0.18"
+
+postcss-value-parser@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+ integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss@^5.0.18:
+ version "5.2.18"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+ integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
+ dependencies:
+ chalk "^1.1.3"
+ js-base64 "^2.1.9"
+ source-map "^0.5.6"
+ supports-color "^3.2.3"
+
+postcss@^6.0.23:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+postcss@^7.0.14, postcss@^7.0.32:
+ version "7.0.36"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb"
+ integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+postcss@^8.3.5:
+ version "8.3.5"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709"
+ integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==
+ dependencies:
+ colorette "^1.2.2"
+ nanoid "^3.1.23"
+ source-map-js "^0.6.2"
+
+rgb@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/rgb/-/rgb-0.1.0.tgz#be27b291e8feffeac1bd99729721bfa40fc037b5"
+ integrity sha1-vieykej+/+rBvZlylyG/pA/AN7U=
+
+source-map-js@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
+ integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
+
+source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+strip-ansi@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^5.3.0, supports-color@^5.4.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+util-deprecate@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
diff --git a/web/template/authorize.tmpl b/web/template/authorize.tmpl
@@ -1,34 +1,15 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta charset="UTF-8" />
- <title>GoToSocial Authorization</title>
- <link
- rel="stylesheet"
- href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"
- />
- <script src="//code.jquery.com/jquery-2.2.4.min.js"></script>
- <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
- </head>
-
- <body>
- <div class="container">
- <div class="jumbotron">
- <form action="/oauth/authorize" method="POST">
- <h1>Hi {{.user}}!</h1>
- <p>Application <b>{{.appname}}</b> {{if len .appwebsite | eq 0 | not}}({{.appwebsite}}) {{end}}would like to perform actions on your behalf, with scope <em>{{.scope}}</em>.</p>
- <p>The application will redirect to {{.redirect}} to continue.</p>
- <p>
+{{ template "header.tmpl" .}}
+ <form action="/oauth/authorize" method="POST">
+ <h1>Hi {{.user}}!</h1>
+ <p>Application <b>{{.appname}}</b> {{if len .appwebsite | eq 0 | not}}({{.appwebsite}}) {{end}}would like to perform actions on your behalf, with scope <em>{{.scope}}</em>.</p>
+ <p>The application will redirect to {{.redirect}} to continue.</p>
+ <p>
<button
- type="submit"
- class="btn btn-primary btn-lg"
- style="width:200px;"
+ type="submit"
+ style="width:200px;"
>
- Allow
+ Allow
</button>
- </p>
- </form>
- </div>
- </div>
- </body>
-</html>
+ </p>
+ </form>
+{{ template "footer.tmpl" .}}
+\ No newline at end of file
diff --git a/web/template/footer.tmpl b/web/template/footer.tmpl
@@ -0,0 +1,13 @@
+ <!-- footer.tmpl -->
+ <footer>
+ <div id="version">
+ Running GoToSocial version: <span class="accent">{{.instance.Version}}</span><br>
+ <a href="https://github.com/superseriousbusiness/gotosocial">Source Code</a>
+ </div>
+ <div id="contact">
+ Contact: <a href="/{{.instance.ContactAccount}}" class="nounderline">{{.instance.ContactAccount}}</a><br>
+ <!-- <a href="/moderation">Moderation team</a> -->
+ </div>
+ </footer>
+</body>
+</html>
+\ No newline at end of file
diff --git a/web/template/header.tmpl b/web/template/header.tmpl
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<!-- header.tmpl -->
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="/assets/bundle.css">
+ <title>{{.instance.Title}} - GoToSocial</title>
+</head>
+<body>
+ <header>
+ <h1>
+ {{.instance.Title}}
+ </h1>
+ </header>
+\ No newline at end of file
diff --git a/web/template/index.tmpl b/web/template/index.tmpl
@@ -0,0 +1,47 @@
+{{ template "header.tmpl" .}}
+<aside class="left logo">
+ <img src="/assets/sloth.png" alt="Clipart styled sloth logo">
+</aside>
+<section>
+ <!-- <h1>Home to <span class="count">{ {.instance.Stats.UserCount}}</span> users
+ who posted <span class="count">{ {.instance.Stats.StatusCount}}</span> statuses,
+ federating with <span class="count">{ {.instance.Stats.DomainCount}}</span> other instances.</h1> -->
+ <h1>Home to <span class="count">3</span> users
+ who posted <span class="count">42069</span> statuses,
+ federating with <span class="count">9001</span> other instances.</h1>
+
+ <h3>This is the default landing page, you can edit it from <span class="accent">./web/template/index.tmpl</span></h1>
+ <ul>
+ <li>Some explanation about the instance (description) with instance header and profile images.</li>
+ <li>Instructions for registering.</li>
+ <li>Etc.</li>
+ </ul>
+</section>
+
+<section class="apps">
+ <p>
+ GoToSocial does not provide it's own frontend, but implements the Mastodon client API.
+ You can use this server through a variety of clients:
+ </p>
+ <div class="applist">
+ <div class="entry">
+ <svg class="logo redraw" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10000 10000">
+ <path d="M9212 5993H5987V823c1053 667 2747 2177 3225 5170zM3100 2690A12240 12240 0 01939 6035h2161zm676 7210h2448a3067 3067 0 003067-3067H5052V627a527 527 0 00-1052 0v6206H709a3067 3067 0 003067 3067z"></path>
+ </svg>
+ <div>
+ <h3>Pinafore</h3>
+ <p>Pinafore is a web client designed for speed and simplicity.</p>
+ <a class="button" href="https://pinafore.social/settings/instances/add">Use Pinafore</a>
+ </div>
+ </div>
+ <div class="entry">
+ <img class="logo" src="/assets/tusky.svg" alt="The Tusky mascot, a cartoon elephant tooting happily"/>
+ <div>
+ <h3>Tusky</h3>
+ <p>Tusky is a lightweight mobile client for Android</p>
+ <a class="button" href="https://tusky.app">Get Tusky</a>
+ </div>
+ </div>
+ </div>
+</section>
+{{ template "footer.tmpl" .}}
+\ No newline at end of file
diff --git a/web/template/sign-in.tmpl b/web/template/sign-in.tmpl
@@ -1,28 +1,13 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <title>Login</title>
- <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
- <script src="//code.jquery.com/jquery-2.2.4.min.js"></script>
- <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
-</head>
-
-<body>
- <div class="container">
- <h1>Login</h1>
- <form action="/auth/sign_in" method="POST">
- <div class="form-group">
- <label for="email">Email</label>
- <input type="text" class="form-control" name="username" required placeholder="Please enter your email address">
- </div>
- <div class="form-group">
- <label for="password">Password</label>
- <input type="password" class="form-control" name="password" placeholder="Please enter your password">
- </div>
- <button type="submit" class="btn btn-success">Login</button>
- </form>
- </div>
-</body>
-
-</html>
+{{ template "header.tmpl" .}}
+<section class="login">
+ <h1>Login</h1>
+ <form action="/auth/sign_in" method="POST">
+ <label for="email">Email</label>
+ <input type="text" class="form-control" name="username" required placeholder="Please enter your email address">
+
+ <label for="password">Password</label>
+ <input type="password" class="form-control" name="password" required placeholder="Please enter your password">
+ <button type="submit" class="btn btn-success">Login</button>
+ </form>
+</section>
+{{ template "footer.tmpl" .}}