From 20252f200b736548f407cd78a972a47ab7c9479d Mon Sep 17 00:00:00 2001 From: m1ka Date: Tue, 7 Apr 2026 21:10:01 +0200 Subject: [PATCH] Import new stylesheets, should work in docker prod environmeny --- .dockerignore | 10 ++ .gitignore | 3 +- bricks/extended-footer.thtml | 13 --- bricks/footer.thtml | 10 -- bricks/navbar.thtml | 23 ++-- fxg | 2 +- kethel/lib/bricks.ex | 24 +++- kethel/lib/pages.ex | 8 +- kethel/lib/thoughts.ex | 43 +++++-- kethel/main.exs | 17 --- nginx.conf | 2 +- scripts/loadBuildData.js | 17 --- scripts/showMotd.js | 10 -- styles/base.css | 199 +++++++++++++++++++++------------ styles/index.css | 14 --- styles/thought.css | 15 --- styles/thoughts.css | 25 +---- templates/base.thtml | 20 +--- templates/inline_thought.thtml | 7 +- templates/pages/colophon.thtml | 23 ++-- templates/pages/index.thtml | 36 ------ templates/paste.thtml | 32 ------ templates/thought.thtml | 29 ++--- templates/thoughts.thtml | 27 ++--- 24 files changed, 251 insertions(+), 358 deletions(-) create mode 100644 .dockerignore delete mode 100644 bricks/extended-footer.thtml delete mode 100644 bricks/footer.thtml delete mode 100644 scripts/loadBuildData.js delete mode 100644 scripts/showMotd.js delete mode 100644 styles/index.css delete mode 100644 styles/thought.css delete mode 100644 templates/pages/index.thtml delete mode 100644 templates/paste.thtml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..988f80e1565cbdda25a74dbab8d88772e46e7531 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +/build/ +/fxg/target/ +/kethel/_build/ +/kethel/deps/ +/.vscode/ +Dockerfile +LICENSE +TODO +README.md +/deploy.sh \ No newline at end of file diff --git a/.gitignore b/.gitignore index cfb90ebecbc71abdb19d3d72f5cbb75a19e53772..1ee5acbc14f234d06544fab9348dea692c605a51 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /build -/static/*.min.* \ No newline at end of file +/static/*.min.* +/deploy.sh \ No newline at end of file diff --git a/bricks/extended-footer.thtml b/bricks/extended-footer.thtml deleted file mode 100644 index 93974af2ca1c906285f688b19714a7dea2925297..0000000000000000000000000000000000000000 --- a/bricks/extended-footer.thtml +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/bricks/footer.thtml b/bricks/footer.thtml deleted file mode 100644 index 4ff7e91e24126d40173fd0b32ddd4e398c4225ba..0000000000000000000000000000000000000000 --- a/bricks/footer.thtml +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/bricks/navbar.thtml b/bricks/navbar.thtml index 8df78d3fba3fcf18dc90917a1c501c15d59a6baf..e24eb112a10bb4126fd9fa41d447536a2e5188e3 100644 --- a/bricks/navbar.thtml +++ b/bricks/navbar.thtml @@ -1,12 +1,17 @@ -
-

.nl

-

m1kadev

-
+ + + + \ No newline at end of file diff --git a/fxg b/fxg index 61eb93988888de008c12e2fee91d079a91c69b7f..b4bac3cd6faf1adaee7cd333e476c15090e4861b 160000 --- a/fxg +++ b/fxg @@ -1 +1 @@ -Subproject commit 61eb93988888de008c12e2fee91d079a91c69b7f +Subproject commit b4bac3cd6faf1adaee7cd333e476c15090e4861b diff --git a/kethel/lib/bricks.ex b/kethel/lib/bricks.ex index 04d3d9687abd8156ce554974b2a9377deeac0911..377ae6de1b7e417ad43d6af723ffc6e23a58ed63 100644 --- a/kethel/lib/bricks.ex +++ b/kethel/lib/bricks.ex @@ -12,7 +12,27 @@ defmodule Bricks do @spec collect(relative_path()) :: bricks() def collect(folder) do - Path.wildcard(folder <> "/bricks/*.thtml") - |> Map.new(fn x -> {FileX.trimmed_filename(x), File.read!(x)} end) + from_files = + Path.wildcard(folder <> "/bricks/*.thtml") + |> Map.new(fn x -> {FileX.trimmed_filename(x), File.read!(x)} end) + + {lcss_version, 0} = System.cmd("npx", ["lightningcss", "-V"]) + {hmn_version, 0} = System.cmd("npx", ["html-minifier-next", "-V"]) + {ujs_version, 0} = System.cmd("npx", ["uglifyjs", "-V"]) + {git_commit, 0} = System.cmd("git", ["rev-parse", "HEAD"]) + + {build_date, 0} = System.cmd("date", ["+%H:%M %d/%m/%y"]) + {e_build_date, 0} = System.cmd("date", ["+%H:%M:%S %d/%m/%y"]) + + footer = """ + Built from commit #{git_commit |> binary_slice(0..7)}, on #{build_date} + """ + + extended_footer = """ + Built from commit #{git_commit |> String.trim()}, using lightningcss #{lcss_version}, + html-minifier-next version #{hmn_version}, uglifyjs version #{ujs_version}, on #{e_build_date} + """ + + Map.merge(%{footer: footer, extended_footer: extended_footer}, from_files) end end diff --git a/kethel/lib/pages.ex b/kethel/lib/pages.ex index e142cc18f48c9ddd7bebcca32d7b9e8184f23c09..9037a9acc027328ecb58e8ac7697c76f7c23d6c5 100644 --- a/kethel/lib/pages.ex +++ b/kethel/lib/pages.ex @@ -29,10 +29,12 @@ defmodule Pages do @spec compile(%Pages{}) :: none() def compile(pages) do t_begin = System.monotonic_time(:millisecond) + Task.async_stream(pages.source_files, fn page -> compile_file(pages, page) end) |> Enum.to_list() + t_end = System.monotonic_time(:millisecond) - t_end - t_begin + t_end - t_begin end # doc "compiles a file, already read into process memory. Does not return the binary, but instantly writes it to disk" @@ -49,8 +51,10 @@ defmodule Pages do {:error, err} -> raise err end + location = page_path |> binary_slice(1..byte_size(page_data)) + mustache_context = - Map.merge(%{fxg_content: invoke_fxg(page_data), location: page_path}, pages.bricks) + Map.merge(%{fxg_content: invoke_fxg(page_data), location: location}, pages.bricks) page_rendered = Mustache.render(template, mustache_context) File.write!(output_path, page_rendered) diff --git a/kethel/lib/thoughts.ex b/kethel/lib/thoughts.ex index eaa19aab6ada279dd695bcbbe67a45d7489f6930..f96dcd121fa207e5839d71f315de9db7bc5330c4 100644 --- a/kethel/lib/thoughts.ex +++ b/kethel/lib/thoughts.ex @@ -1,5 +1,5 @@ defmodule Thoughts do - defstruct [:thoughts, :template, :bricks, :project_root, :index_template, :inline_template ] + defstruct [:thoughts, :template, :bricks, :project_root, :index_template, :inline_template] @spec urlify(binary()) :: binary() defp urlify(name) do @@ -20,7 +20,7 @@ defmodule Thoughts do thoughts: Path.wildcard("#{project_root}/thoughts/*") |> Enum.map(fn path -> {path, get_file_commit_date(path), File.read!(path)} end) - |> Enum.sort_by(fn {_, date, _ } -> date end, :desc), + |> Enum.sort_by(fn {_, date, _} -> date end, :desc), inline_template: File.read!("#{project_root}/templates/inline_thought.thtml"), template: File.read!("#{project_root}/templates/thought.thtml"), index_template: File.read!("#{project_root}/templates/thoughts.thtml"), @@ -41,14 +41,22 @@ defmodule Thoughts do thoughts.thoughts |> Task.async_stream(fn thought -> - compile_file(thought, thoughts.template, thoughts.bricks, thoughts.project_root) end) + compile_file(thought, thoughts.template, thoughts.bricks, thoughts.project_root) + end) |> Enum.to_list() # generate index - index_content = thoughts.thoughts + index_content = + thoughts.thoughts |> Enum.map(fn thought -> inline_thought(thought, thoughts) end) |> Enum.join() - index = Mustache.render(thoughts.index_template, Map.merge(thoughts.bricks, %{fxg_content: index_content})) + + index = + Mustache.render( + thoughts.index_template, + Map.merge(thoughts.bricks, %{fxg_content: index_content}) + ) + File.write!("#{thoughts.project_root}/build/thoughts/index.html", index) IO.puts("[COMPILED] #{thoughts.project_root}/build/thoughts/index.html") @@ -58,15 +66,18 @@ defmodule Thoughts do defp inline_thought({path, date, thought}, context) do stripped_name = String.replace_prefix(path, "#{context.project_root}/thoughts/", "") - location = "https://m1kadev.nl/thoughts/#{urlify(stripped_name)}.html" + location = "/thoughts/#{urlify(stripped_name)}.html" title = "#{stripped_name}" - Mustache.render(context.inline_template, %{name: title, date: date, thought: thought}) + pretty_date = date |> DateTime.from_unix!() |> Calendar.strftime("%A, %H:%M (%Y/%m/%d)") + + Mustache.render(context.inline_template, %{name: title, date: pretty_date, thought: thought}) end defp compile_file({path, date, thought}, template, bricks, project_root) do name = trim_abs_path(path, project_root) output_path = "#{project_root}/build/thoughts/#{urlify(name)}.html" - mustache_context = Map.merge(bricks, %{thought: thought, name: name, date: date}) + pretty_date = date |> DateTime.from_unix!() |> Calendar.strftime("%A, %H:%M (%Y/%M/%d)") + mustache_context = Map.merge(bricks, %{thought: thought, name: name, date: pretty_date}) File.write!(output_path, Mustache.render(template, mustache_context)) IO.puts("[COMPILED] #{path} -> #{output_path}") @@ -74,16 +85,26 @@ defmodule Thoughts do def get_file_commit_date(path) do {ts_string, 0} = System.cmd("git", ["log", "--format=%ct", path]) + String.trim_trailing(ts_string) - |> String.to_integer() + |> String.to_integer() end def to_rss({path, date, thought}, template, project_root) do location = String.replace_prefix(path, project_root <> "/thoughts/", "") link = "https://m1kadev.nl/thoughts/" <> urlify(location) <> ".html" - rfc_date = date + + rfc_date = + date |> DateTime.from_unix!() |> Calendar.strftime("%a, %d %b %Y %H:%M:%S %Z") - Mustache.render(template, %{title: location, date: rfc_date, description: thought, category: "thoughts", link: link } ) + + Mustache.render(template, %{ + title: location, + date: rfc_date, + description: thought, + category: "thoughts", + link: link + }) end end diff --git a/kethel/main.exs b/kethel/main.exs index 2408c9d0dca3074f523af7e29f6c0ef17bba5fcc..2e00f6cdf4b81b82650cf55336479155e25f1160 100644 --- a/kethel/main.exs +++ b/kethel/main.exs @@ -61,23 +61,6 @@ if folder != nil do IO.puts("[COMPILED] #{project_root}/build/rss.xml") - {lcss_version, 0} = System.cmd("npx", ["lightningcss", "-V"]) - {hmn_version, 0} = System.cmd("npx", ["html-minifier-next", "-V"]) - {ujs_version, 0} = System.cmd("npx", ["uglifyjs", "-V"]) - {git_commit, 0} = System.cmd("git", ["rev-parse", "HEAD"]) - - {build_date, 0} = System.cmd("date", ["+%H:%M %d/%m/%y"]) - - info_txt = """ - commit=#{git_commit} - lightningcss=#{lcss_version} - html_minifier_next=#{hmn_version} - uglifyjs=#{ujs_version} - build_time=#{build_date} - """ - - File.write!("#{project_root}/build/info.txt", info_txt) - IO.puts("[COMPILED] #{project_root}/build/info.txt") IO.puts("Finalising...") diff --git a/nginx.conf b/nginx.conf index 5033c47dd723162be413369dd9a207cb5976aa0d..8e4744011093fe2e5efa273648c098919bcf894e 100644 --- a/nginx.conf +++ b/nginx.conf @@ -19,7 +19,7 @@ http { listen 8080; root /data/www; index index.html; - server_name localhost; + server_name www.m1kadev.nl; client_max_body_size 32m; error_page 500 502 503 503 /50x.html; location = /50x.html { diff --git a/scripts/loadBuildData.js b/scripts/loadBuildData.js deleted file mode 100644 index ff9ad2a5579c8a7d5418faf3de791b373c32c1a1..0000000000000000000000000000000000000000 --- a/scripts/loadBuildData.js +++ /dev/null @@ -1,17 +0,0 @@ -const fromCommit = Array.from(document.getElementsByClassName("from-commit-short")); -const buildDate = Array.from(document.getElementsByClassName("build-date")); -const htmlMinifierNext = Array.from(document.getElementsByClassName("html-minifier-next")); -const lightningcss = Array.from(document.getElementsByClassName("lightningcss")); -const uglifyjs = Array.from(document.getElementsByClassName("uglifyjs")); - -fetch("/info.txt").then(async data => { - const res = await data.text(); - let map = new Map(); - res.split("\n").map(x => x.split("=", 2)).map(([k, v]) => map[k] = v); - - fromCommit.forEach(e => e.innerHTML = map["commit"].substr(0, 8)); - buildDate.forEach(e => e.innerHTML = map["build_time"]); - htmlMinifierNext.forEach(e => e.innerHTML = map["html_minifier_next"]); - lightningcss.forEach(e => e.innerHTML = map["lightningcss"]); - uglifyjs.forEach(e => e.innerHTML = map["uglifyjs"]); -}); diff --git a/scripts/showMotd.js b/scripts/showMotd.js deleted file mode 100644 index fd9bf5d23d580e9c1d1f042f59d43687def0ce15..0000000000000000000000000000000000000000 --- a/scripts/showMotd.js +++ /dev/null @@ -1,10 +0,0 @@ -const motdElement = document.getElementById("motd").children[0]; - -fetch("/static/motds").then(async rres => { - const res = (await rres.text()); - const motds = res.split("\n").map(motd => motd.split("#", 2)); - let motd = motds[Math.floor(Math.random() * motds.length)]; - console.log(motd); - motdElement.innerHTML = motd[0].trimEnd(); - motdElement.setAttribute("title", motd[1].trimStart()); -}); \ No newline at end of file diff --git a/styles/base.css b/styles/base.css index 732afd17f1a29c9e50076c062b973ea00f292388..8d51b05234a1afc349973457485392bfdb834f1a 100644 --- a/styles/base.css +++ b/styles/base.css @@ -1,110 +1,165 @@ -@import url('https://fonts.googleapis.com/css2?family=Gothic+A1&family=Space+Grotesk:wght@300..700&display=swap'); - :root { - --bg-colour: #272640; - --txt-colour: #fae9d3; + --serif-font: "Castilo MT", serif; + --sans-serif-font: "SF Pro", "Segoe UI", sans-serif; + color-scheme: light dark; + --fg-color: light-dark(#121413, #eeeeee); + --bg-color: light-dark(#eeeeee, #121413); + --accent-color: #ee41b4; } -body, -html { - background-color: var(--bg-colour); - margin: 0px; +body { + color: var(--fg-color); + background-color: var(--bg-color); + font-family: var(--serif-font); + width: max-content; + margin: 0; } -body { - display: flex; +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: var(--sans-serif-font); + margin: 0; + border-bottom: .1rem solid var(--fg-color); + padding: .5rem; + font-weight: normal; + font-style: italic; } -h1 { - margin: 0px; +a { + color: var(--accent-color); } -#mark { - font-family: "Space Grotesk", sans-serif; - font-optical-sizing: auto; - font-weight: 300; - font-style: normal; - display: inline-block; - color: var(--txt-colour); - margin-top: 1em; - margin-left: 1em; +a:visited { + color: var(--accent-color); } -#mark>h3 { - margin: 0px; - text-align: right; - font-weight: 300; +header { + width: 100vw; } -#mark>h1 { - font-weight: 400; +#wordmark { + border-bottom: .1rem solid var(--fg-color); + text-align: right; + padding: .5rem; } -#content { - font-family: "Gothic A1", sans-serif; - color: var(--txt-colour); - width: 50vw; +#wordmark>span { + width: min-content; + display: block; margin-left: auto; - margin-right: auto; } -main>h2 { - font-weight: normal; +#wordmark>span>i { + text-align: left; + display: block; } -main>p { - font-weight: lighter; +#wordmark>span>span { + text-align: left; + display: block; + font-family: var(--sans-serif-font); + font-size: 1.5rem; } -main { - background-color: #00000080; - width: 60vw; - position: absolute; - left: 20vw; - top: 0px; - padding: 2em; +nav { + font-size: 1.2rem; } -footer { - display: flex; - justify-content: space-between; +nav>h3 { + font-weight: normal; + font-size: 1.2rem; } -#lynx { - justify-content: right; +main { + width: 100vw; } -a { - color: var(--txt-colour); +p { + border-bottom: .1rem solid var(--fg-color); + padding-right: calc(-450px + 100%); + padding-bottom: .5rem; + padding-top: .5rem; + padding-left: .5rem; + margin: 0; } -h1, -h2, -h3, -h4, -h5, -h6 { - text-decoration: underline #ffffff80; +.link-group { + border-bottom: .1rem solid var(--fg-color); + background-color: var(--fg-color); + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: end; + align-items: center; + justify-content: center; + gap: .1rem; } -#mark>h1, -#mark>h3 { - text-decoration: none; +.link-group::after { + background-color: var(--bg-color); } -nav { - font-family: "Gothic A1", sans-serif; - font-size: large; - color: var(--txt-colour); - padding-top: 1em; -} -nav>a { - display: block; - text-align: right; - position: relative; +.link-group>a { + padding: .4rem .6rem; + display: inline; + background-color: var(--bg-color); + width: max-content; + text-align: center; + flex-grow: 1; } -nav>a { - padding: .1em; +footer { + padding: .5rem; + width: 450px; +} + +@media (min-width: 900px) { + + .link-group { + flex-direction: column; + padding: .5rem; + background-color: var(--bg-color); + align-items: end + } + + .link-group>a { + padding: 0; + display: block; + width: max-content; + border-right: 0 solid transparent; + text-align: right; + } + + body { + display: flex; + width: 100vw; + min-height: 100vh; + } + + main { + border-left: .1rem solid var(--fg-color); + width: initial; + flex: 1; + } + + header { + width: min-content; + } + + nav>h3 { + min-width: max-content; + } + + nav { + text-align: right; + } + + nav>a { + text-align: right; + } } \ No newline at end of file diff --git a/styles/index.css b/styles/index.css deleted file mode 100644 index 160bddefd742ce5be7c41e7bed7c2557e799f1dd..0000000000000000000000000000000000000000 --- a/styles/index.css +++ /dev/null @@ -1,14 +0,0 @@ -#motd { - color: var(--txt-colour); - font-family: "Space Grotesk", sans-serif; -} - -#motd>h2 { - position: relative; - float: right; - writing-mode: vertical-rl; - text-decoration: none; - margin: 0; - padding: .5em; - height: 67vh; -} \ No newline at end of file diff --git a/styles/thought.css b/styles/thought.css deleted file mode 100644 index 4ff5e0a681ae766060fe249b19e8f1f9d8f43ffc..0000000000000000000000000000000000000000 --- a/styles/thought.css +++ /dev/null @@ -1,15 +0,0 @@ -h2 { - margin: 0px; - padding-bottom: .5em; -} - -#thought { - display: block; - padding-left: 1.5em; - font-style: italic; -} - -small { - text-align: right; - display: block; -} \ No newline at end of file diff --git a/styles/thoughts.css b/styles/thoughts.css index 2a1dc0c42fa03730ba96fd13aca02aaf8e0bc7b7..9e36f64c03c49e9dade1388f05d1ef7f3eecfaf5 100644 --- a/styles/thoughts.css +++ b/styles/thoughts.css @@ -1,25 +1,4 @@ -.thought { +p>small { display: block; - /*background-color: #00000050;*/ - padding-left: 1em; - padding-right: 1em; -} - -.thought>h3 { - padding-top: .2em; -} - -.thought>span { - display: block; - padding-left: .5em; - font-style: italic; -} - -.thought>small { text-align: right; - display: block; -} - -main hr:first-of-type { - display: none; -} +} \ No newline at end of file diff --git a/templates/base.thtml b/templates/base.thtml index d3dc421d8843005a4a61d4b83a66edc31316d3e2..9ce74ad5b5b31b17293c6964ecca458f47733573 100644 --- a/templates/base.thtml +++ b/templates/base.thtml @@ -2,29 +2,19 @@ - {{ &base_header }} - {{ &highlight }} - {{ location }} - m1kadev - {{ &ogp }} - - {{ &navbar }} - -
-
- {{ &fxg_content }} -
+
+ {{ &fxg_content }} +
{{ &footer }} -
-
- + + - \ No newline at end of file diff --git a/templates/inline_thought.thtml b/templates/inline_thought.thtml index 47baf56959c29e8a1d19cc664412ababff65211f..e136a0650ac4413bbd371c19c456ab37e1eabf3e 100644 --- a/templates/inline_thought.thtml +++ b/templates/inline_thought.thtml @@ -1,8 +1,7 @@ -

{{ &name }}

- +

{{ thought }} - - -mika, {{ date }} + -mika, {{ date }} +

diff --git a/templates/pages/colophon.thtml b/templates/pages/colophon.thtml index 9922a848aaa493a4e9c2ef0c087b4c6ed8cdab04..8a6a30d3e81bbfbf868db5b6bfc9369e795e3fd6 100644 --- a/templates/pages/colophon.thtml +++ b/templates/pages/colophon.thtml @@ -2,28 +2,19 @@ - {{ &base_header }} - - {{ location }} - m1kadev.nl - + {{ &highlight }} + {{ location }} - m1kadev {{ &ogp }} - - - {{ &navbar }} - -
-
- {{ &fxg_content }} -
+
+ {{ &fxg_content }} +
{{ &extended_footer }} -
-
- + + - \ No newline at end of file diff --git a/templates/pages/index.thtml b/templates/pages/index.thtml deleted file mode 100644 index 1ea8c4e85330c7401103b6aacffe4ea441ee8e9b..0000000000000000000000000000000000000000 --- a/templates/pages/index.thtml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - {{ &base_header }} - - {{ &highlight }} - - - - - - {{ location }} - m1kadev - - {{ &ogp }} - - - - - {{ &navbar }} - -
-
- {{ &fxg_content }} -
- {{ &footer }} -
-
- -
-

-
- - - \ No newline at end of file diff --git a/templates/paste.thtml b/templates/paste.thtml deleted file mode 100644 index f30af846fdf71c4e23af4452cf5bb1becfbbff15..0000000000000000000000000000000000000000 --- a/templates/paste.thtml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - {{ &base_header }} - - {{ &language }} - {{ &highlight }} - - {{ filename }} - m1kadev - - {{ &ogp }} - - - - - - {{ &navbar }} - -
-
-

{{ filename }}

-

{{ about_paste }}

-
- {{ &codetag }}{{ code }} -
- {{ &footer }} -
-
- - - \ No newline at end of file diff --git a/templates/thought.thtml b/templates/thought.thtml index 0f5a4ea6526fcb87521033fc3f7a657c8a812cee..38f20b952f126b28fa2a6d477294d458c427b9fa 100644 --- a/templates/thought.thtml +++ b/templates/thought.thtml @@ -2,33 +2,26 @@ - {{ &base_header }} - - - + {{ name }} - m1kadev - {{ &ogp }} - - {{ &navbar }} - -
-
-

{{ name }}

- +
+
+

{{ &name }}

+

{{ thought }} - - -mika, {{ date }} -


+ -mika, {{ date }} +

+
+
{{ &footer }} -
-
- + + \ No newline at end of file diff --git a/templates/thoughts.thtml b/templates/thoughts.thtml index 9671f7b467672b7e7b7948007795bf17ec8861bd..e22e1e35844e5625dda68c881130157561f60b20 100644 --- a/templates/thoughts.thtml +++ b/templates/thoughts.thtml @@ -2,32 +2,21 @@ - {{ &base_header }} - {{ &highlight }} - + thoughts - m1kadev - - {{ location }} - m1kadev - {{ &ogp }} - - {{ &navbar }} - -
-
-

thoughts :3

- {{ &fxg_content }} -
+
+

my thoughts :3

+ {{ &fxg_content }} +
-
- + + - - \ No newline at end of file +x \ No newline at end of file