From 847fb6491df7444222979316259764dc2568beb4 Mon Sep 17 00:00:00 2001 From: prettysunflower Date: Fri, 23 May 2025 18:12:16 +0200 Subject: [PATCH] Added blog posts, and improved homepage --- .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/dictionaries/project.xml | 7 + .idea/watcherTasks.xml | 4 + baseTemplates/baseTemplates.go | 6 + baseTemplates/templates/base.tmpl | 36 ++++ baseTemplates/templates/blog/blogPost.tmpl | 8 + baseTemplates/templates/blog/postsList.tmpl | 13 ++ baseTemplates/templates/pages/homepage.tmpl | 77 ++++++++ blog/init.go | 12 ++ blog/postBuilder.go | 57 ++++++ blog/posts.go | 87 +++++++++ blog/posts/2024-06-08-pride-flag-geneva.md | 37 ++++ go.mod | 2 + go.sum | 2 + main.go | 2 + pages/homepage.go | 10 +- pages/templates/homepage.tmpl | 78 --------- static/static/css/index.scss | 132 +++++++++++--- static/static/css/layout.scss | 85 +++++++++ static/static/css/style.css | 184 +++++++++++++++++--- static/static/css/style.css.map | 2 +- static/static/svg/bluesky.svg | 1 + static/static/svg/email.svg | 1 + static/static/svg/fediverse.svg | 1 + static/static/svg/gitea.svg | 1 + static/static/svg/github.svg | 1 + static/static/svg/key.svg | 1 + static/static/svg/signal.svg | 1 + 28 files changed, 721 insertions(+), 132 deletions(-) create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/dictionaries/project.xml create mode 100644 .idea/watcherTasks.xml create mode 100644 baseTemplates/baseTemplates.go create mode 100644 baseTemplates/templates/base.tmpl create mode 100644 baseTemplates/templates/blog/blogPost.tmpl create mode 100644 baseTemplates/templates/blog/postsList.tmpl create mode 100644 baseTemplates/templates/pages/homepage.tmpl create mode 100644 blog/init.go create mode 100644 blog/postBuilder.go create mode 100644 blog/posts.go create mode 100644 blog/posts/2024-06-08-pride-flag-geneva.md create mode 100644 go.sum delete mode 100644 pages/templates/homepage.tmpl create mode 100644 static/static/svg/bluesky.svg create mode 100644 static/static/svg/email.svg create mode 100644 static/static/svg/fediverse.svg create mode 100644 static/static/svg/gitea.svg create mode 100644 static/static/svg/github.svg create mode 100644 static/static/svg/key.svg create mode 100644 static/static/svg/signal.svg diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml new file mode 100644 index 0000000..3eb1cb1 --- /dev/null +++ b/.idea/dictionaries/project.xml @@ -0,0 +1,7 @@ + + + + prettysunflower + + + \ No newline at end of file diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 0000000..fb0d65a --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/baseTemplates/baseTemplates.go b/baseTemplates/baseTemplates.go new file mode 100644 index 0000000..4edfd7c --- /dev/null +++ b/baseTemplates/baseTemplates.go @@ -0,0 +1,6 @@ +package baseTemplates + +import "embed" + +//go:embed templates/* +var FS embed.FS diff --git a/baseTemplates/templates/base.tmpl b/baseTemplates/templates/base.tmpl new file mode 100644 index 0000000..ddbfb11 --- /dev/null +++ b/baseTemplates/templates/base.tmpl @@ -0,0 +1,36 @@ +{{define "base"}} + + + + + + + + + +
+ +
+ {{ template "content" . }} + + +{{ end }} \ No newline at end of file diff --git a/baseTemplates/templates/blog/blogPost.tmpl b/baseTemplates/templates/blog/blogPost.tmpl new file mode 100644 index 0000000..735e5e6 --- /dev/null +++ b/baseTemplates/templates/blog/blogPost.tmpl @@ -0,0 +1,8 @@ +{{ define "bodyClass" }}post post-{{ .Slug }}{{ end }} + +{{ define "content" }} +
+

{{ .Title }}

+ {{ .Body }} +
+{{ end }} \ No newline at end of file diff --git a/baseTemplates/templates/blog/postsList.tmpl b/baseTemplates/templates/blog/postsList.tmpl new file mode 100644 index 0000000..a13fa49 --- /dev/null +++ b/baseTemplates/templates/blog/postsList.tmpl @@ -0,0 +1,13 @@ +{{ define "bodyClass" }}page-postsList{{ end }} + +{{ define "content" }} +
+

Blog

+ + +
+{{ end }} \ No newline at end of file diff --git a/baseTemplates/templates/pages/homepage.tmpl b/baseTemplates/templates/pages/homepage.tmpl new file mode 100644 index 0000000..4bc0a8a --- /dev/null +++ b/baseTemplates/templates/pages/homepage.tmpl @@ -0,0 +1,77 @@ +{{ define "bodyClass" }}page-index{{ end }} + +{{ define "content" }} +
+
+
+ +
+
+

Nyallo! (=^ ◡ ^=)

+ +

+ We're Remilia (she/they), Xeon (they/them), and Takeno (she/her), + alias prettysunflower! 🌻 +

+ +

+ We are software/website developers at the Réseau Koumbit, Factorio and Touhou players, and your local trans woman/enby/plural person. +

+ +

+ We do love doing computer/servers/code stuff, riding trains, reading yuri manga, and making HRT in our kitchen. Oh, and sunflowers, of course, they're pretty! +

+
+
+ +
+

Where are we on the Internet?

+ +
+ +
+

Our main projects

+ +
+ + +
+

Kakigoori

+

+ Kakigoori is an picture distribution system to publish images on the web. + Upload it once, and Kakigoori will create versions of the image + optimized for the web (AVIF, WebP). +

+
+
+
+
+{{ end }} \ No newline at end of file diff --git a/blog/init.go b/blog/init.go new file mode 100644 index 0000000..b5eca38 --- /dev/null +++ b/blog/init.go @@ -0,0 +1,12 @@ +package blog + +import ( + "fmt" + "net/http" +) + +func InitHttpHandlers() { + prefix := "/blog/" + http.HandleFunc(fmt.Sprint(prefix, "{$}"), blogTop) + http.HandleFunc(fmt.Sprint(prefix, "{slug}/"), showPost) +} diff --git a/blog/postBuilder.go b/blog/postBuilder.go new file mode 100644 index 0000000..c9be8bb --- /dev/null +++ b/blog/postBuilder.go @@ -0,0 +1,57 @@ +package blog + +import ( + "github.com/gomarkdown/markdown" + "github.com/gomarkdown/markdown/html" + "github.com/gomarkdown/markdown/parser" + "html/template" + "regexp" + "time" +) + +func makePost(markdownContent []byte) Post { + headerRegex := regexp.MustCompile(`(?ms)^---\n.*?---`) + header := headerRegex.Find(markdownContent) + headerKeysRegex := regexp.MustCompile(`(?m)^(\w+): ([^\n]*)$`) + headerKeys := headerKeysRegex.FindAllSubmatch(header, -1) + postBody := headerRegex.ReplaceAll(markdownContent, []byte("")) + + post := Post{} + + for _, headerKey := range headerKeys { + key, value := string(headerKey[1]), string(headerKey[2]) + switch key { + case "title": + post.Title = value + case "date": + date, err := time.Parse(time.DateOnly, value) + if err != nil { + panic(err) + } + post.Date = date + case "updatedDate": + date, err := time.Parse(time.DateOnly, value) + if err != nil { + panic(err) + } + post.UpdatedDate = date + case "author": + post.Author = value + case "slug": + post.Slug = value + } + } + + extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock + p := parser.NewWithExtensions(extensions) + doc := p.Parse(postBody) + + // create HTML renderer with extensions + htmlFlags := html.CommonFlags | html.HrefTargetBlank + opts := html.RendererOptions{Flags: htmlFlags} + renderer := html.NewRenderer(opts) + + post.Body = template.HTML(markdown.Render(doc, renderer)) + + return post +} diff --git a/blog/posts.go b/blog/posts.go new file mode 100644 index 0000000..9c44728 --- /dev/null +++ b/blog/posts.go @@ -0,0 +1,87 @@ +package blog + +import ( + "embed" + "fmt" + "html/template" + "net/http" + "prettysunflower-website/baseTemplates" + "sort" + "strings" + "time" +) + +type Post struct { + Slug string + Title string + Author string + Date time.Time + UpdatedDate time.Time + Body template.HTML +} + +//go:embed posts/* +var postsFS embed.FS + +func getAllPosts() []Post { + postsDir, err := postsFS.ReadDir("posts") + if err != nil { + panic(err) + } + + var posts []Post + + for _, postFileName := range postsDir { + post, err := postsFS.ReadFile(fmt.Sprint("posts/", postFileName.Name())) + if err != nil { + panic(err) + } + + posts = append(posts, makePost(post)) + } + + //fmt.Println(posts[0].UpdatedDate.IsZero()) + return posts +} + +type PostListTemplateData struct { + Posts []Post +} + +func blogTop(w http.ResponseWriter, r *http.Request) { + posts := getAllPosts() + templateData := PostListTemplateData{ + Posts: posts, + } + + tmpl := template.Must(template.ParseFS(baseTemplates.FS, "templates/base.tmpl", "templates/blog/postsList.tmpl")) + + err := tmpl.ExecuteTemplate(w, "base", templateData) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} + +func showPost(w http.ResponseWriter, r *http.Request) { + slug := r.PathValue("slug") + posts := getAllPosts() + postIndex, found := sort.Find(len(posts), func(i int) int { + return strings.Compare(slug, posts[i].Slug) + }) + + if !found { + http.NotFound(w, r) + return + } + + post := posts[postIndex] + + tmpl := template.Must(template.ParseFS(baseTemplates.FS, "templates/base.tmpl", "templates/blog/blogPost.tmpl")) + + err := tmpl.ExecuteTemplate(w, "base", post) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} diff --git a/blog/posts/2024-06-08-pride-flag-geneva.md b/blog/posts/2024-06-08-pride-flag-geneva.md new file mode 100644 index 0000000..8ab0b67 --- /dev/null +++ b/blog/posts/2024-06-08-pride-flag-geneva.md @@ -0,0 +1,37 @@ +--- +title: Le Progress Pride flag de Genève +date: 2024-06-08 +updatedDate: 2024-06-20 +author: Remilia +slug: pride-flag-geneve +--- + +Cette année, lors de la journée internationale contre l'homophobie, la transphobie et la biphobie, +le pont du Mont-Blanc à Genève avait ces drapeaux de déployés, une version modifiée du Progress Pride flag +que je trouve absolument magnifique + +![image](https://kakigoori.dev/0e7cb84c-bad2-4519-9c04-c4481628c410/height/2100/auto) + +Pour avoir plus d'informations à propos de ce drapeau, j'ai contacté la ville de Genève, +qui m'a répondu par courriel: ce drapeau a apparemment été créé en 2020 spécialement pour la Ville de Genève, +par une personne qui souhaite rester anonyme, pour les pavoisements du Pont du Mont-Blanc et du Palais Anna et +Jean-Gabriel Eynard. Il a été introduit en 2021 lors de la campagne Ma vie, ma ville, mes couleurs. + +Il existe aussi des versions verticales de ce drapeau, qui sont notamment utilisées à d'autres endroits +comme la gare Cornavin ou la Place de Neuve. + +Les raisons pour la création de ce nouveau drapeau, selon la Ville, étaient qu'elle « souhaitait pouvoir +bénéficier de supports plus inclusifs et représentatifs de la diversité des communautés LGBTIQ+ tout en +répondant aux contraintes techniques spécifiques à ce type de pavoisement ». + +Étant donné que je ne trouve pas de versions de ce drapeau hors des photos, j'ai recréé ce drapeau dans Sketch, +si vous souhaitez désormais l'utiliser. + +

+Geneva's progress flag image +

+ +Veuillez noter que selon la Ville, « l'utilisation de ce design, réalisé sur commande par une personne concernée +qui a souhaité rester anonyme, est libre de droits, sous réserve de mention de son origine. » +Veuillez donc créditer correctement la personne qui a créé ce design si vous souhaitez l'utiliser ^^ +(et non, ce n'est pas moi 🙃). \ No newline at end of file diff --git a/go.mod b/go.mod index 169f7e0..23861bb 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module prettysunflower-website go 1.24 + +require github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..148941c --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b h1:EY/KpStFl60qA17CptGXhwfZ+k1sFNJIUNR8DdbcuUk= +github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= diff --git a/main.go b/main.go index 7e4401e..f61662a 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "net/http" + "prettysunflower-website/blog" "prettysunflower-website/keys" "prettysunflower-website/pages" "prettysunflower-website/regio43" @@ -13,6 +14,7 @@ func main() { regio43.InitHttpHandlers() static.InitHttpHandlers() keys.InitHttpHandlers() + blog.InitHttpHandlers() _ = http.ListenAndServe(":3334", nil) } diff --git a/pages/homepage.go b/pages/homepage.go index 5a731fa..75097b6 100644 --- a/pages/homepage.go +++ b/pages/homepage.go @@ -3,17 +3,13 @@ package pages import ( "html/template" "net/http" + "prettysunflower-website/baseTemplates" ) func homepage(w http.ResponseWriter, r *http.Request) { - templateFile := "templates/homepage.tmpl" - files, err := template.New(templateFile).ParseFS(content, templateFile) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } + files := template.Must(template.ParseFS(baseTemplates.FS, "templates/base.tmpl", "templates/pages/homepage.tmpl")) - err = files.ExecuteTemplate(w, "homepage.tmpl", nil) + err := files.ExecuteTemplate(w, "base", nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) diff --git a/pages/templates/homepage.tmpl b/pages/templates/homepage.tmpl deleted file mode 100644 index 14b6b30..0000000 --- a/pages/templates/homepage.tmpl +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - prettysunflower - - - -
-
- Avatar of prettysunflower - -
-

prettysunflower

-

- Nyallo! We're Remilia, Xeon, and Takeno! -

-

- We're a system of 3, we're software and website developers at - the Réseau Koumbit, we're Touhou and Factorio players, - and we're your local trans women/enby/plural person wishing you a good day! -

-
-
-
- -
-
-
-

Our pronouns 🏳️‍⚧

- -

- Remilia: they/them and she/her
- Xeon: they/them
- Takeno: she/her -

-
- -
-

The ways to contact us

-

- me@prettysunflower.moe
- Bluesky
- Fediverse -

-
- -
-

Our code

-

- Gitea
- GitHub -

-
-
- -
- -
-

Our main projects

- -
- - -
-

Kakigoori

-

- Kakigoori is an picture distribution system to publish images on the web. - Upload it once, and Kakigoori will create versions of the image - optimized for the web (AVIF, WebP). -

-
-
-
-
- - \ No newline at end of file diff --git a/static/static/css/index.scss b/static/static/css/index.scss index aecb19c..ea2e568 100644 --- a/static/static/css/index.scss +++ b/static/static/css/index.scss @@ -6,43 +6,123 @@ height: 75vh; background-image: url('https://kakigoori.dev/c152e805-b859-4ad0-817c-4d671e5f15ad/auto'); background-size: cover; - background-position: top center; - display: flex; - justify-content: center; - align-items: center; + background-position: center bottom; + position: relative; - & > div { + nav { + position: absolute; + bottom: 0; + left: 0; + right: 0; display: flex; justify-content: center; align-items: center; - gap: 2rem; - width: min(80%, 800px); - margin: 0 auto; - padding: 2rem; + padding: 1rem; background-color: rgba(255, 255, 255, 0.5); - backdrop-filter: blur(15px); - border-radius: 1rem; + backdrop-filter: blur(10px); + margin: 0; + width: auto; + + & > div { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + + @media screen and (max-width: 992px) { + flex-direction: column; + align-items: center; + } + + width: 100%; + max-width: 80%; + + img { + height: 3em; + border-radius: 50%; + } + + & > div:first-child { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + font-weight: 700; + font-size: 1.5rem; + } + + & > div:last-child { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + flex-wrap: wrap; + } + } + } + } + + main { + margin-top: 2rem; + margin-bottom: 2rem; + + #presentation { + .image-container { + display: flex; + justify-content: center; + align-items: center; + + img { + max-height: 500px; + max-width: 100%; + object-fit: contain; + border-radius: 1rem; + } + } + + @media screen and (max-width: 768px) { + flex-direction: column; + } + + margin-bottom: 2rem; } - img { - height: 200px; - border-radius: 50%; + #on-the-internet { + img { + max-height: 1em; + } + + .columns > div > div { + display: flex; + flex-direction: column; + } + } + + #main-projects { + & > div { + display: flex; + gap: 1rem; + flex-wrap: wrap; + + img { + width: 200px; + max-width: 100%; + object-fit: contain; + } + + & > div { + flex: 1; + } + + @media screen and (max-width: 768px) { + flex-direction: column; + align-items: center; + } + } } } hr { @include layout.light-hr; } - - .columns { - h2 { - text-align: center; - } - } - - .main-projects { - & > div { - display: flex; - } - } } \ No newline at end of file diff --git a/static/static/css/layout.scss b/static/static/css/layout.scss index 51ee906..9d9e4d8 100644 --- a/static/static/css/layout.scss +++ b/static/static/css/layout.scss @@ -1,10 +1,95 @@ +@use "colors"; + .columns { display: flex; flex-wrap: wrap; gap: 1rem; justify-content: space-evenly; + + & > * { + flex: 1; + } +} + +.max-80 { + max-width: 80vw; + margin-left: auto; + margin-right: auto; } @mixin light-hr($height: .5px, $color: oklch(75% 0 0deg)) { border: $height solid $color; +} + +nav { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + padding: 1rem 0; + background-color: oklch(from colors.$background-color calc(l - 0.05) c h); + + img { + height: 4rem; + border-radius: 50%; + } + + & > div { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + width: 100%; + max-width: 80vw; + + @media screen and (max-width: 992px) { + flex-direction: column; + align-items: center; + } + + img { + height: 3em; + border-radius: 50%; + } + + a { + text-decoration: none; + color: black; + + &:hover, &:focus, &:active { + text-decoration: underline; + } + + &:visited { + color: black; + } + } + + & > div:first-child { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + font-weight: 700; + font-size: 1.5rem; + } + + & > div:last-child { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + flex-wrap: wrap; + } + } +} + +.post { + main { + img { + max-width: 100%; + } + } + + margin-bottom: 2rem; } \ No newline at end of file diff --git a/static/static/css/style.css b/static/static/css/style.css index 026e0eb..10c7db3 100644 --- a/static/static/css/style.css +++ b/static/static/css/style.css @@ -5,6 +5,78 @@ gap: 1rem; justify-content: space-evenly; } +.columns > * { + flex: 1; +} + +.max-80 { + max-width: 80vw; + margin-left: auto; + margin-right: auto; +} + +nav { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + padding: 1rem 0; + background-color: oklch(from oklch(97% 0.0261 90.1deg) calc(l - 0.05) c h); +} +nav img { + height: 4rem; + border-radius: 50%; +} +nav > div { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + width: 100%; + max-width: 80vw; +} +@media screen and (max-width: 992px) { + nav > div { + flex-direction: column; + align-items: center; + } +} +nav > div img { + height: 3em; + border-radius: 50%; +} +nav > div a { + text-decoration: none; + color: black; +} +nav > div a:hover, nav > div a:focus, nav > div a:active { + text-decoration: underline; +} +nav > div a:visited { + color: black; +} +nav > div > div:first-child { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + font-weight: 700; + font-size: 1.5rem; +} +nav > div > div:last-child { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + flex-wrap: wrap; +} + +.post { + margin-bottom: 2rem; +} +.post main img { + max-width: 100%; +} body { font-family: "Open Sans", apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; @@ -17,36 +89,108 @@ body { height: 75vh; background-image: url("https://kakigoori.dev/c152e805-b859-4ad0-817c-4d671e5f15ad/auto"); background-size: cover; - background-position: top center; + background-position: center bottom; + position: relative; +} +.page-index header nav { + position: absolute; + bottom: 0; + left: 0; + right: 0; + display: flex; + justify-content: center; + align-items: center; + padding: 1rem; + background-color: rgba(255, 255, 255, 0.5); + backdrop-filter: blur(10px); + margin: 0; + width: auto; +} +.page-index header nav > div { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + width: 100%; + max-width: 80%; +} +@media screen and (max-width: 992px) { + .page-index header nav > div { + flex-direction: column; + align-items: center; + } +} +.page-index header nav > div img { + height: 3em; + border-radius: 50%; +} +.page-index header nav > div > div:first-child { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + font-weight: 700; + font-size: 1.5rem; +} +.page-index header nav > div > div:last-child { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + flex-wrap: wrap; +} +.page-index main { + margin-top: 2rem; + margin-bottom: 2rem; +} +.page-index main #presentation { + margin-bottom: 2rem; +} +.page-index main #presentation .image-container { display: flex; justify-content: center; align-items: center; } -.page-index header > div { - display: flex; - justify-content: center; - align-items: center; - gap: 2rem; - width: min(80%, 800px); - margin: 0 auto; - padding: 2rem; - background-color: rgba(255, 255, 255, 0.5); - backdrop-filter: blur(15px); +.page-index main #presentation .image-container img { + max-height: 500px; + max-width: 100%; + object-fit: contain; border-radius: 1rem; } -.page-index header img { - height: 200px; - border-radius: 50%; +@media screen and (max-width: 768px) { + .page-index main #presentation { + flex-direction: column; + } +} +.page-index main #on-the-internet img { + max-height: 1em; +} +.page-index main #on-the-internet .columns > div > div { + display: flex; + flex-direction: column; +} +.page-index main #main-projects > div { + display: flex; + gap: 1rem; + flex-wrap: wrap; +} +.page-index main #main-projects > div img { + width: 200px; + max-width: 100%; + object-fit: contain; +} +.page-index main #main-projects > div > div { + flex: 1; +} +@media screen and (max-width: 768px) { + .page-index main #main-projects > div { + flex-direction: column; + align-items: center; + } } .page-index hr { border: 0.5px solid oklch(75% 0 0deg); } -.page-index .columns h2 { - text-align: center; -} -.page-index .main-projects > div { - display: flex; -} .page-radio-trains .video-zone { display: flex; diff --git a/static/static/css/style.css.map b/static/static/css/style.css.map index ff51d6f..ff4e8ba 100644 --- a/static/static/css/style.css.map +++ b/static/static/css/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["fonts.scss","layout.scss","body.scss","colors.scss","index.scss","radio.scss"],"names":[],"mappings":"AAAQ;ACAR;EACI;EACA;EACA;EACA;;;ACDJ;EACI,aFFS;EEGT,kBCLe;EDMf;;;AEHA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAIR;EHxBA;;AG6BI;EACI;;AAKJ;EACI;;;ACzCR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIR;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGI;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAEA;EACI;EACA;;AAKZ;EAzBJ;IA0BQ;;;AAGJ;EA7BJ;IA8BQ;;;AAGJ;EAjCJ;IAkCQ","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["fonts.scss","layout.scss","body.scss","colors.scss","index.scss","radio.scss"],"names":[],"mappings":"AAAQ;ACER;EACI;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;;;AAOJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EARJ;IASQ;IACA;;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAKZ;EAOI;;AALI;EACI;;;ACtFZ;EACI,aFFS;EEGT,kBCLe;EDMf;;;AEHA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EAOA;EACA;;AANA;EANJ;IAOQ;IACA;;;AAMJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAMhB;EACI;EACA;;AAEA;EAkBI;;AAjBA;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIR;EAdJ;IAeQ;;;AAOJ;EACI;;AAGJ;EACI;EACA;;AAKJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EAfJ;IAgBQ;IACA;;;AAMhB;EHxGA;;;AIjBA;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIR;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGI;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAEA;EACI;EACA;;AAKZ;EAzBJ;IA0BQ;;;AAGJ;EA7BJ;IA8BQ;;;AAGJ;EAjCJ;IAkCQ","file":"style.css"} \ No newline at end of file diff --git a/static/static/svg/bluesky.svg b/static/static/svg/bluesky.svg new file mode 100644 index 0000000..b74c2ea --- /dev/null +++ b/static/static/svg/bluesky.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/static/svg/email.svg b/static/static/svg/email.svg new file mode 100644 index 0000000..fcbf8a6 --- /dev/null +++ b/static/static/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/static/svg/fediverse.svg b/static/static/svg/fediverse.svg new file mode 100644 index 0000000..cf9678e --- /dev/null +++ b/static/static/svg/fediverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/static/svg/gitea.svg b/static/static/svg/gitea.svg new file mode 100644 index 0000000..6aa141a --- /dev/null +++ b/static/static/svg/gitea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/static/svg/github.svg b/static/static/svg/github.svg new file mode 100644 index 0000000..920f01c --- /dev/null +++ b/static/static/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/static/svg/key.svg b/static/static/svg/key.svg new file mode 100644 index 0000000..5ffd7c0 --- /dev/null +++ b/static/static/svg/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/static/svg/signal.svg b/static/static/svg/signal.svg new file mode 100644 index 0000000..3f74d6a --- /dev/null +++ b/static/static/svg/signal.svg @@ -0,0 +1 @@ + \ No newline at end of file