Update CSS and HTML

This commit is contained in:
Anders Englöf Ytterström 2025-02-11 13:15:43 +01:00
parent 82276d6a48
commit 65dd0847bf
24 changed files with 1164 additions and 773 deletions

View file

@ -16,3 +16,14 @@ Ready to run in production? Please [check our deployment guides](https://hexdocs
* Docs: https://hexdocs.pm/phoenix
* Forum: https://elixirforum.com/c/phoenix-forum
* Source: https://github.com/phoenixframework/phoenix
## Dev secret template
```
import Config
directus_url = ""
directus_token = ""
config :mse25, :directus, base_url: directus_url, token: directus_token
```

File diff suppressed because it is too large Load diff

View file

@ -26,7 +26,7 @@ config :esbuild,
version: "0.17.11",
mse25: [
args:
~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/bl/* --external:/images/* --external:/*.{vcf,png,ico,pdf}),
~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/bl/* --external:/images/* --external:/*.{vcf,png,ico,pdf,jpg}),
cd: Path.expand("../assets", __DIR__),
env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
]

View file

@ -42,6 +42,31 @@ defmodule Mse25.Directus do
get("/articles?" <> params)
end
def get_note(slug) do
get_item(:notes, slug)
end
def get_notes!(options \\ []) do
params =
[
"fields=" <>
Enum.join(
[
"id",
"contents",
"images",
"date_created",
"location"
],
","
)
]
|> annual?(:notes, options)
|> query_params_string(options, :notes)
get("/notes?" <> params)
end
def get_album(externalId) do
case get_item(
:albums,
@ -198,6 +223,13 @@ defmodule Mse25.Directus do
end
end
defp get_item(:notes, externalId, fields) do
case get("/notes?fields=" <> fields <> "&filter[id][_eq]=" <> externalId) do
[] -> {:not_found, externalId}
[item | _] -> {:ok, item}
end
end
defp get_item(collection, slug, fields) do
case get(
"/" <> to_string(collection) <> "?fields=" <> fields <> "&filter[slug][_eq]=" <> slug

View file

@ -0,0 +1,54 @@
defmodule Mse25Web.Breadcrumbs do
use Mse25Web, :html
def breadcrumbs_html(assigns) do
~H"""
<div class="breadcrumbs">
<span class="sr-only">Du är här:</span>
<span class="trail" itemscope itemtype="https://schema.org/BreadcrumbList">
<span itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="/" rel="home">
<span itemprop="name">madr.se</span>
</a>
<meta itemprop="position" content="1" />
</span>
<%= for {index, {parent_slug, parent_name}} <- breadcrumbs(@trail) do %>
<span class="sr-only">&gt;</span>
<span itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href={parent_slug}>
<span itemprop="name"><%= parent_name %></span>
</a>
<meta itemprop="position" content={index} />
</span>
<% end %>
</span>
</div>
"""
end
defp breadcrumbs(nodes) do
breadcrumbs([], "", 1, nodes)
end
defp breadcrumbs(seen, _path, _index, []) do
Enum.reverse(seen)
end
defp breadcrumbs(seen, path, index, [{slug, name} | nodes]) do
breadcrumbs(
[{index + 1, {path <> "/" <> to_string(slug), name}} | seen],
path <> "/" <> to_string(slug),
index + 1,
nodes
)
end
defp breadcrumbs(seen, path, index, [{slug, name, custom_prefix} | nodes]) do
breadcrumbs(
[{index + 1, {custom_prefix <> "/" <> to_string(slug), name}} | seen],
path <> "/" <> to_string(slug),
index + 1,
nodes
)
end
end

View file

@ -78,32 +78,6 @@ defmodule Mse25Web.Layouts do
"""
end
def breadcrumbs(nodes) do
breadcrumbs([], "", 1, nodes)
end
def breadcrumbs(seen, _path, _index, []) do
Enum.reverse(seen)
end
def breadcrumbs(seen, path, index, [{slug, name} | nodes]) do
breadcrumbs(
[{index + 1, {path <> "/" <> to_string(slug), name}} | seen],
path <> "/" <> to_string(slug),
index + 1,
nodes
)
end
def breadcrumbs(seen, path, index, [{slug, name, custom_prefix} | nodes]) do
breadcrumbs(
[{index + 1, {custom_prefix <> "/" <> to_string(slug), name}} | seen],
path <> "/" <> to_string(slug),
index + 1,
nodes
)
end
def show_interactive_event_map?(assigns) do
Map.has_key?(assigns, :events)
end
@ -111,4 +85,12 @@ defmodule Mse25Web.Layouts do
def show_footer?(%{heading: "Kolofon"}), do: false
def show_footer?(%{}), do: true
def current?(_key, []) do
false
end
def current?(k, path) do
Enum.member?(path, k)
end
end

View file

@ -1,36 +1,72 @@
<a href="#content" class="skiplink">Hoppa till innehållet</a>
<nav>
<span class="sr-only">Du är här:</span>
<span class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList">
<span itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="/" rel="home">
<span itemprop="name">madr.se</span>
</a>
<meta itemprop="position" content="1" />
</span>
<%= for {index, {parent_slug, parent_name}} <- breadcrumbs(@breadcrumbs) do %>
<span class="sr-only">&gt;</span>
<span itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href={parent_slug}>
<span itemprop="name"><%= parent_name %></span>
<header>
<strong>
<a href="/" rel="home">madr.se</a>
</strong>
<nav>
<ul>
<li>
<a
class={if current?("webblogg", @conn.path_info), do: "current", else: ""}
href="/webblogg"
>
Webblogg
</a>
<meta itemprop="position" content={index} />
</span>
<% end %>
</span>
</nav>
</li>
<li>
<a
class={if current?("delningar", @conn.path_info), do: "current", else: ""}
href="/delningar"
>
Länkar
</a>
</li>
<li>
<a
class={if current?("anteckningar", @conn.path_info), do: "current", else: ""}
href="/anteckningar"
>
Anteckningar
</a>
</li>
<li>
<a
class={if current?("evenemang", @conn.path_info), do: "current", else: ""}
href="/evenemang"
>
Evenemang
</a>
</li>
<li>
<a class={if current?("om", @conn.path_info), do: "current", else: ""} href="/om">
Om
</a>
</li>
</ul>
</nav>
<div>
<!-- <dl> -->
<!-- <dt>18 apr</dt> -->
<!-- <dd>Behemoth</dd> -->
<!-- <dt>5 jun</dt> -->
<!-- <dd>Sweden Rock Festival</dd> -->
<!-- </dl> -->
</div>
</header>
<main id="content">
<%= @inner_content %>
</main>
<%= if show_footer?(assigns) do %>
<footer>
<p vocab="https://schema.org/" typeof="Person">
<footer vocab="https://schema.org/" typeof="Person">
<img src={~p"/mugshot.jpg"} property="image" alt="Anders, hösten 2021" />
<p>
<a href="https://madr.se" property="url">madr.se</a>
är <span property="name">Anders Englöf Ytterström</span>s hemsida. Anders är <span property="jobTitle">webbutvecklare</span>, linuxentusiast, ljudtekniker och hårdrockare, bosatt i <span
property="address"
typeof="PostalAddress"
><span property="addressLocality">Borlänge</span> (<span property="addressRegion">Dalarna</span>)</span>.
är hemsida åt <span property="name">Anders Englöf Ytterström</span>, en
<span property="jobTitle">webbutvecklare</span>
och <span property="skills">hårdrockare</span>
från <span property="address" typeof="PostalAddress"><span property="addressLocality">Borlänge</span>, <span property="addressRegion">Dalarna</span></span>.
Läs <a href="/colophon">kolofonen</a>.
</p>
</footer>

View file

@ -41,6 +41,13 @@ defmodule Mse25Web.ItemController do
end
end
defp fetch([_year, album_id], :note) do
case Directus.get_note(album_id) do
{:ok, response} -> {:ok, :note, response}
not_found -> not_found
end
end
defp fetch([year, "brutal-legend-" <> external_id]) do
fetch([year, external_id], :album)
end
@ -174,6 +181,21 @@ defmodule Mse25Web.ItemController do
]
end
defp assigns(:note, %{
"contents" => text,
"images" => images,
"date_created" => published_at
}) do
year = String.slice(published_at, 0..3)
[
text: Earmark.as_html!(text),
breadcrumbs: [{"anteckningar", "Anteckningar"}, {year, year, ""}],
date_created: String.slice(published_at, 0..9),
images: images
]
end
defp assigns(:album, %{
"year" => year,
"album" => album,

View file

@ -1,6 +1,7 @@
defmodule Mse25Web.ItemHTML do
use Mse25Web, :html
import Mse25.EventHelpers
import Mse25Web.Breadcrumbs
embed_templates "item_html/*"

View file

@ -1,4 +1,5 @@
<article class="article" vocab="https://schema.org/" typeof="Article">
<article class="collapsed article card" vocab="https://schema.org/" typeof="Article">
<%= breadcrumbs_html(%{:trail => @breadcrumbs}) %>
<h1 property="name"><%= @heading %></h1>
<div property="articleBody">

View file

@ -1,4 +1,4 @@
<article class="event" vocab="https://schema.org/" typeof="Event Review">
<article class="event card" vocab="https://schema.org/" typeof="Event Review">
<h1 property="name"><%= @heading %></h1>
<ul>

View file

@ -0,0 +1,10 @@
<article class="collapsed article card" vocab="https://schema.org/" typeof="Article">
<h1 property="name articleBody"><%= raw(@contents) %></h1>
<footer>
<p>
Publicerad <time property="datePublished"><%= @published_at %></time>
av <span property="publisher">Anders Englöf Ytterström</span>
</p>
</footer>
</article>

View file

@ -1,4 +1,4 @@
<article class="article" vocab="https://schema.org/" typeof="Article">
<article class="card article" vocab="https://schema.org/" typeof="Article">
<h1 property="name"><%= @heading %></h1>
<div property="articleBody">

View file

@ -8,9 +8,9 @@ defmodule Mse25Web.PageController do
def home(conn, _params) do
[most_recent_article, older_article] = Directus.get_articles!(limit: 2)
recent_event = Directus.get_events!(limit: 1)
upcoming_events = Directus.get_events!(limit: 2, upcoming: true)
brutal_legends = Directus.get_albums!(limit: 1)
recent_event = Directus.get_events!(limit: 3)
upcoming_events = Directus.get_events!(limit: 3, upcoming: true)
brutal_legends = Directus.get_albums!(limit: 8)
render(conn, :home,
page_title: "Anders Englöf Ytterström",
@ -68,6 +68,26 @@ defmodule Mse25Web.PageController do
)
end
def notes(conn, params) do
{notes, page_title} =
case params do
%{"q" => query_string} ->
{Directus.get_notes!(limit: @almost_infinity, query: query_string),
"Anteckningar: \"#{query_string}\""}
_ ->
{Directus.get_notes!(limit: @almost_infinity), "Anteckningar"}
end
render(conn, :notes,
page_title: page_title,
breadcrumbs: [],
notes: group_by_creation_date(notes),
q: params["q"],
nosearch?: params["q"] == nil or params["q"] == ""
)
end
def events(conn, params) do
{_, %{"title" => title, "contents" => contents}} = Directus.get_page("evenemang")
@ -93,7 +113,7 @@ defmodule Mse25Web.PageController do
end
def links(conn, _params) do
links = Directus.get_links!(limit: @almost_infinity) |> group_by_date
links = Directus.get_links!(limit: @almost_infinity) |> group_by_pub_date
render(conn, :links,
page_title: "Delningar",
@ -109,10 +129,31 @@ defmodule Mse25Web.PageController do
|> Enum.sort(fn {a, _a}, {b, _b} -> b < a end)
end
defp group_by_date(items) do
defp group_by_pub_date(items) do
items
|> Enum.group_by(fn %{"pubDate" => pub_date} -> pub_date end)
|> Map.to_list()
|> Enum.sort(fn {a, _a}, {b, _b} -> b < a end)
end
defp group_by_creation_date(items) do
items
|> Enum.group_by(fn %{"date_created" => pub_date} -> String.slice(pub_date, 0..9) end)
|> Map.to_list()
|> Enum.sort(fn {a, _a}, {b, _b} -> b < a end)
end
# redirect routes
def cv(conn, _params) do
redirect(conn, to: ~p"/cv/anders-englof-ytterstrom.html")
end
def brutal_legend(conn, _params) do
redirect(conn, to: ~p"/bl/index.html")
end
def mugshot(conn, _params) do
redirect(conn, to: ~p"/images/mugshot.jpg")
end
end

View file

@ -1,6 +1,11 @@
defmodule Mse25Web.PageHTML do
use Mse25Web, :html
import Mse25.EventHelpers
import Mse25Web.Breadcrumbs
embed_templates "page_html/*"
defp fancy_timestamp(datestr) do
datestr |> IO.inspect()
end
end

View file

@ -1,41 +1,46 @@
<h1>
<%= @page_title %>
</h1>
<p>
Inlägg skrivna sedan 2006.
<%= if @nosearch? do %>
Gå direkt till:
<% end %>
</p>
<ul class="months">
<%= for {year, articles} <- @articles do %>
<li>
<a href={"#y" <> year}><%= year %></a> (<%= Enum.count(articles) %>)
</li>
<% end %>
</ul>
<form method="get" action="/webblogg">
<div class="head">
<%= breadcrumbs_html(%{:trail => @breadcrumbs}) %>
<h1>
<%= @page_title %>
</h1>
<p>
Inlägg skrivna sedan 2006.
<%= if @nosearch? do %>
Eller
Gå direkt till:
<% end %>
<label for="q">sök innehåll</label>:
<input type="search" value={@q} name="q" id="q" size="7" />
<button>Sök</button>
</p>
</form>
<%= for {year, articles} <- @articles do %>
<section id={"y" <> year}>
<h2 class="sticky"><%= year %></h2>
<div class="articles">
<%= for article <- articles do %>
<article class="article" vocab="https://schema.org/" typeof="Article">
<h2 property="name">
<a href={"/" <> article["slug"]}><%= article["title"] %></a>
</h2>
<time><%= article["pubDate"] %></time>
</article>
<ul class="months">
<%= for {year, articles} <- @articles do %>
<li>
<a href={"#y" <> year}><%= year %></a> (<%= Enum.count(articles) %>)
</li>
<% end %>
</ul>
<form method="get" action="/webblogg">
<p>
<%= if @nosearch? do %>
Eller
<% end %>
</div>
</section>
<% end %>
<label for="q">sök innehåll</label>:
<input type="search" value={@q} name="q" id="q" size="7" />
<button>Sök</button>
</p>
</form>
</div>
<div class="cards">
<%= for {year, articles} <- @articles do %>
<section class="card" id={"y" <> year}>
<h2 class="bookmark-date"><%= year %></h2>
<div class="articles">
<%= for article <- articles do %>
<article class="article" vocab="https://schema.org/" typeof="Article">
<time><%= article["pubDate"] %></time>
<h3 property="name">
<a href={"/" <> article["slug"]}><%= article["title"] %></a>
</h3>
</article>
<% end %>
</div>
</section>
<% end %>
</div>

View file

@ -1,70 +1,77 @@
<h1><%= @page_title %></h1>
<div class="head">
<h1><%= @page_title %></h1>
<%= raw(@contents) %>
<p>
<%= if @nosearch? do %>
Gå direkt till:
<% end %>
</p>
<ul class="months">
<%= for {year, events} <- @events do %>
<li>
<a href={"#y" <> year}><%= year %></a> (<%= Enum.count(events) %>)
</li>
<% end %>
</ul>
<form method="get" action="/evenemang">
<p>
<%= if @nosearch? do %>
Eller
<% end %>
<label for="q">sök innehåll</label>:
<input type="search" value={@q} name="q" id="q" size="7" />
<button>Sök</button>
</p>
</form>
</div>
<%= raw(@contents) %>
<section id="map">
<h2>Geografisk utspridning</h2>
<figure>
<div id="leaflet" class="interactive-map"></div>
</figure>
</section>
<p>
<%= if @nosearch? do %>
Gå direkt till:
<% end %>
</p>
<ul class="months">
<div class="bookmarks">
<%= for {year, events} <- @events do %>
<li>
<a href={"#y" <> year}><%= year %></a> (<%= Enum.count(events) %>)
</li>
<section class="card" id={"y" <> year}>
<h2 class="sticky bookmark-date"><%= year %></h2>
<div class="events">
<%= for event <- events do %>
<article class="event" vocab="https://schema.org/" typeof="Event">
<h3>
<a property="name" href={"/" <> event["slug"]}><%= event["title"] %></a>
</h3>
<div>
<p property="description"><%= event["lead"] %></p>
<%= if hilights?(event) do %>
<p>
Personliga höjdpunkter: <%= rdfa_bandlist(event["bands"]) |> raw %>
</p>
<% end %>
<%= if missed?(event) do %>
<p>
Band jag missade: <%= bandlist(event["mia"]) %>
</p>
<% end %>
<%= if opening_acts?(event) do %>
<p>
Förband: <%= event["bands"] |> Enum.drop(1) |> rdfa_bandlist() |> raw %>
</p>
<% end %>
</div>
<%= if event["poster"] do %>
<img
property="thumbnail"
loading="lazy"
src={"https://n.madr.se/assets/" <> event["poster"] <> "?key=poster"}
alt="affisch"
width="150"
/>
<% end %>
</article>
<% end %>
</div>
</section>
<% end %>
</ul>
<form method="get" action="/evenemang">
<p>
<%= if @nosearch? do %>
Eller
<% end %>
<label for="q">sök innehåll</label>:
<input type="search" value={@q} name="q" id="q" size="7" />
<button>Sök</button>
</p>
</form>
<%= for {year, events} <- @events do %>
<section id={"y" <> year}>
<h2 class="sticky"><%= year %></h2>
<div class="events">
<%= for event <- events do %>
<article class="event" vocab="https://schema.org/" typeof="Event">
<h2>
<a property="name" href={"/" <> event["slug"]}><%= event["title"] %></a>
</h2>
<p property="description"><%= event["lead"] %></p>
<%= if hilights?(event) do %>
<p>
Personliga höjdpunkter: <%= rdfa_bandlist(event["bands"]) |> raw %>
</p>
<% end %>
<%= if missed?(event) do %>
<p>
Band jag missade: <%= bandlist(event["mia"]) %>
</p>
<% end %>
<%= if opening_acts?(event) do %>
<p>
Förband: <%= event["bands"] |> Enum.drop(1) |> rdfa_bandlist() |> raw %>
</p>
<% end %>
<%= if event["poster"] do %>
<img
property="thumbnail"
loading="lazy"
src={"https://n.madr.se/assets/" <> event["poster"] <> "?key=poster"}
alt="affisch"
width="150"
/>
<% end %>
</article>
<% end %>
</div>
</section>
<% end %>
</div>

View file

@ -1,134 +1,123 @@
<main class="landing">
<img src={~p"/images/aey.svg"} width="120" alt="Anders Englöf Ytterström" />
<h1 class="home-h1">Anders Englöf Ytterström</h1>
<ul class="tree">
<li class="article">
<span></span>
<div class="uc">Under construction <a href="/2025/ombyggnation">Va?</a> 🚧🪏</div>
<div class="home-hero">
<img src={~p"/mugshot.jpg"} alt="Anders, hösten 2021" />
<h1 class="home-h1">Anders Englöf Ytterström</h1>
<p>Webbutvecklare med 18 års erfarenhet, med särskilt intresse för tillgänglighet,
containerteknik och webbstandarder. Hårdrockare och Linuxanvändare.</p>
<div class="c2a">
<a href="/cv">CV</a>
<a href="/om">Om mig</a>
<a href="https://github.com/madr" rel="external">Min Github</a>
<a
href="https://se.linkedin.com/in/anders-engl%C3%B6f-ytterstr%C3%B6m-0ba4452a2"
rel="external"
>
Min LinkedIn
</a>
</div>
<a href="/vad-jag-gor">
Vad jag gör
</a>
</div>
<div class="home-section articles-color">
<h2>Blogginlägg</h2>
<div class="home-articles">
<a href={"/" <> @recent_article["slug"]}>
<%= @recent_article["title"] %>
<small><time><%= @recent_article["pubDate"] %></time></small>
</a>
<small><time><%= @recent_article["pubDate"] %></time></small>
</li>
<li class="article">
<span></span>
<a href={"/" <> @older_article["slug"]}>
<%= @older_article["title"] %>
<small><time><%= @older_article["pubDate"] %></time></small>
</a>
<small><time><%= @older_article["pubDate"] %></time></small>
</li>
<li class="page">
<span></span>
<a href="/webblogg" class="list-link">Alla Webbloggens inlägg</a>
</li>
<%= for event <- @recent_event do %>
<li class="events">
<%= if event["poster"] do %>
<img
src={"https://n.madr.se/assets/" <> event["poster"] <> "?key=thumbnail"}
alt="affisch"
loading="lazy"
/>
<% else %>
<span></span>
<% end %>
<a href={event["slug"]} title={event["lead"]}>
<%= event["title"] %>
</a>
<small><time><%= event["started_at"] %></time></small>
</li>
<% end %>
<%= for event <- @upcoming do %>
<li class="events">
<%= if event["poster"] do %>
<img
src={"https://n.madr.se/assets/" <> event["poster"] <> "?key=thumbnail"}
alt="affisch"
loading="lazy"
/>
<% else %>
<span></span>
<% end %>
<%= event["title"] %>
<small><time><%= event["started_at"] %></time></small>
</li>
<% end %>
<li class="feed events page">
<span></span>
<a href="/evenemang" class="list-link">Evenemangstidslinje</a>
<span></span>
</li>
<li class="feed events ics">
<span></span>
</div>
<a href="/webblogg" class="list-link">Alla Webbloggens inlägg</a>
</div>
<div class="home-section events-color">
<h2>Evenemang</h2>
<h3>Kommande evenemang</h3>
<div class="home-events home-grid">
<%= for event <- @upcoming do %>
<article>
<a href={event["slug"]}>
<%= if event["poster"] do %>
<img
src={"https://n.madr.se/assets/" <> event["poster"] <> "?key=poster"}
alt="affisch"
loading="lazy"
class="poster-image"
/>
<% else %>
<span class="poster-image poster-placeholder"></span>
<% end %>
</a>
<div class="event-meta">
<div><time><%= event["started_at"] %></time></div>
<div><%= event["title"] %></div>
</div>
</article>
<% end %>
</div>
<h3>Besökta evenemang</h3>
<div class="home-events home-grid">
<%= for event <- @recent_event do %>
<article>
<a href={event["slug"]}>
<%= if event["poster"] do %>
<img
src={"https://n.madr.se/assets/" <> event["poster"] <> "?key=poster"}
alt="affisch"
loading="lazy"
class="poster-image"
/>
<% else %>
<span class="poster-image poster-placeholder"></span>
<% end %>
</a>
<div class="event-meta">
<div><time><%= event["started_at"] %></time></div>
<div><%= event["title"] %></div>
</div>
</article>
<% end %>
</div>
<p class="head">
Se <a href="/evenemang" class="list-link">Evenemangstidslinje</a>
för alla besökta evenemang.
Vill du haka på? Prenumerera på
<a href="/kommande-evenemang.ics" class="feed-link">Kommande evenemang</a>
<small>.ics</small>
</li>
<li class="feed links">
<span></span>
<a href="/delningar" class="list-link">
Delningar
</a>
<span></span>
</li>
<%= for legend <- @brutal_legends do %>
<li class="album">
<%= if legend["cover"] do %>
<img
src={"https://n.madr.se/assets/" <> legend["cover"] <> "?key=thumbnail"}
alt="skivomslag"
loading="lazy"
/>
<% else %>
<span></span>
<% end %>
<a href={"/" <> legend["purchase_year"] <> "/brutal-legend-" <> legend["externalId"]}>
<%= legend["artist"] %> - <%= legend["album"] %> (<%= legend["year"] %>)
</a>
<span></span>
</li>
<% end %>
<li class="page">
<span></span>
<a href="/vad-jag-gor">
Vad jag gör
</a>
<span></span>
</li>
<li class="page">
<span></span>
<a href="/om">
Anders, 39, Hårdrockare
</a>
<span></span>
</li>
<li class="feed rss">
<span></span>
<a href="/prenumerera.xml" class="feed-link">Prenumerera</a>
<small>.rss</small>
</li>
<li class="">
<span></span>
<a clasS="feed-link" href={~p"/aey.vcf"}>
Kontakt
</a>
<small>.vcf</small>
</li>
</ul>
<form method="get" action="/sok" class="home-search">
<label for="q">Sök innehåll</label>: <input size="9" type="search" id="q" name="q" />
<button>Sök</button>
i din kalenderapp: kopiera länken och klistra in.
</p>
</div>
<div class="home-section brutal-color">
<h2>Brütal legends</h2>
<div class="home-brutal home-grid brutal">
<%= for legend <- @brutal_legends do %>
<article>
<a href={"/" <> legend["purchase_year"] <> "/brutal-legend-" <> legend["externalId"]}>
<%= if legend["cover"] do %>
<img
class="cover-image"
src={"https://n.madr.se/assets/" <> legend["cover"] <> "?key=legend"}
alt="skivomslag"
loading="lazy"
/>
<% end %>
</a>
</article>
<% end %>
</div>
<p>Dessa är de 8 senaste. <a href="/bl">Se alla skivorna</a></p>
</div>
<form method="get" action="/sok" class="home-section home-search">
<div>
<label for="q">Sök innehåll</label>: <input size="9" type="search" id="q" name="q" />
<button>Sök</button>
</div>
</form>
<ul class="profiles">
<li><a href="/cv/anders-englof-ytterstrom.html">CV</a></li>
<li><a href="https://github.com/madr">Github</a></li>
<li>
<a href="https://www.discogs.com/user/madrse/collection?limit=250&sort=artist&sort_order=asc&layout=big">
Discogs
</a>
</li>
<li>
<a href="/colophon">
Kolofon
</a>
</li>
</ul>
</main>

View file

@ -1,11 +1,13 @@
<h1>Delningar</h1>
<p>
Länkar som är värda att uppmärksammas och lämna åsikt om.
</p>
<%= for {date, links} <- @links do %>
<section id={"d" <> date}>
<div class="links">
<h2>
<div class="head">
<h1>Delningar</h1>
<p>
Länkar som är värda att uppmärksammas och lämna åsikt om.
</p>
</div>
<div class="cards">
<%= for {date, links} <- @links do %>
<section class="card" id={"d" <> date}>
<h2 class="bookmark-date">
<%= date
|> Date.from_iso8601!()
|> Calendar.strftime(
@ -46,20 +48,24 @@
)
|> String.replace(~r/ 0/, " ") %>
</h2>
<%= for link <- links do %>
<article vocab="https://schema.org/" typeof="WebContent Review" class="bookmark">
<h3>
<span property="name"><%= link["title"] %></span>
<a class="permalink" href={"/" <> link["slug"]} title="Permalänk">#</a>
</h3>
<div property="reviewBody">
<%= link["contents"] |> Earmark.as_html!() |> raw %>
</div>
<div class="source">
Källa: <a href={link["source"]} rel="external"><%= link["h1"] %></a>
</div>
</article>
<% end %>
</div>
</section>
<% end %>
<div class="bookmarks">
<%= for link <- links do %>
<article vocab="https://schema.org/" typeof="WebContent Review" class="bookmark">
<h3>
<span property="name"><%= link["title"] %></span>
</h3>
<div property="reviewBody">
<%= link["contents"] |> Earmark.as_html!() |> raw %>
</div>
<div class="line">
<div class="source">
Källa: <a href={link["source"]} rel="external"><%= link["h1"] %></a>
</div>
<a class="permalink" href={"/" <> link["slug"]} title="Permalänk">#</a>
</div>
</article>
<% end %>
</div>
</section>
<% end %>
</div>

View file

@ -0,0 +1,75 @@
<div class="head">
<h1>Anteckningar</h1>
<p>Blandade tankar, oftast på engelska. Replikerat på Mastodon.</p>
<!-- <p><a href="atom.xml">Prenumerera via Atom</a></p> -->
</div>
<div class="cards">
<%= for {date, links} <- @notes do %>
<section class="card" id={"d" <> date}>
<h2 class="bookmark-date">
<%= date
|> Date.from_iso8601!()
|> Calendar.strftime(
"%A, %d %B %Y",
month_names: fn m ->
Enum.at(
[
"januari",
"februari",
"mars",
"april",
"maj",
"juni",
"juli",
"augusti",
"september",
"oktober",
"november",
"december"
],
m - 1
)
end,
day_of_week_names: fn d ->
Enum.at(
[
"måndag",
"tisdag",
"onsdag",
"torsdag",
"fredag",
"lördag",
"söndag"
],
d - 1
)
end
)
|> String.replace(~r/ 0/, " ") %>
</h2>
<div class="notes">
<%= for link <- links do %>
<article vocab="https://schema.org/" typeof="WebContent Review" class="bookmark">
<h3 class="note">
<div property="reviewBody">
<%= link["contents"] |> Earmark.as_html!(breaks: true) |> raw %>
</div>
</h3>
<footer class="note">
<p>
Posted on
<a class="permalinks" href={"/notes/" <> to_string(link["id"])} title="Permalänk">
<%= fancy_timestamp(link["date_created"]) %>
</a>
at
<a href="https://www.openstreetmap.org/#map=15/50.82806/-0.12861">
pos
</a>
</p>
</footer>
</article>
<% end %>
</div>
</section>
<% end %>
</div>

View file

@ -31,6 +31,7 @@ defmodule Mse25Web.Router do
get "/evenemang", PageController, :events
get "/webblogg", PageController, :articles
get "/delningar", PageController, :links
get "/anteckningar", PageController, :notes
get "/sok", PageController, :search
get "/prenumerera.xml", FeedController, :feed
@ -38,6 +39,10 @@ defmodule Mse25Web.Router do
get "/events.json", FeedController, :events
get "/kommande-evenemang.ics", FeedController, :calendar
get "/cv", PageController, :cv
get "/bl", PageController, :brutal_legend
get "/mugshot.jpg", PageController, :mugshot
get "/*path", ItemController, :index
end

View file

@ -0,0 +1 @@
<svg width="436.4" height="238" viewBox="0 0 115.5 63" xmlns="http://www.w3.org/2000/svg"><path style="stroke-width:.18255" d="m119.8 51.6 1.7-1.4-.2-.3-.5.4-.4-.4v-7.4l.7-1-.3-.1-.4.3-.2.3-1.6-1.3-2.7 2q0-.9-.2-1.2l-.9-.8-.2.2-1.5.8-.7.4-.6.4-.6.4q-.6.6-.9 1.3l-.3 2h-.7l-.5.3-.4.4-.3.5.3.2q.4-.5.8-.5.6 0 1 .7.5.7.5 1.5t-.3 1.2q-.3.4-1.1.5-.8 0-1.1.4-.4.4-.4 1.2v.2h.4q0-.7.8-.7h.4l.8.1q2.2 0 2.2-2.6v-3h2v2.1q0 .7-.2 1h-.2v.4l.8.7.8.8 2.5-2.3-.2-.2-.6.5v-3l.9-1.1h-.9V42l.4-.3 1 .9v6.6q0 1.1.2 1.5.2.4 1 .9zm-3.8-5h1v3.2l-.4.2q-.4 0-.5-.3l-.1-1.3zm1-1.1h-1V43l1-.8zm-2.6-1.9v1.9h-1.3l-.7.9v-2q0-1.2.3-1.7.2-.4 1-1 .5.4.6.7l.1 1.2zm-3.6 7.4h-.4q.7-.3 1-.8l.1-1.8v-3q0-1.4.2-1.9 0-.4.7-.9-.3.6-.3 1.8V49q0 1.2-.2 1.6-.3.4-1 .4zm19.5.6 1.8-1.5-.3-.3q-.4.4-.6.4-.2 0-.3-.3v-.3l-.1-.7-.3-5.4V43q0-.8.2-1.2l.4-.4.6-.4-.2-.3-.4.2-.3.2-.3.3-.5.4h-.1q-1.7-1.2-3.4-1.2-1.6 0-2.8 1.2-1.2 1-1.2 2.6 0 1 .6 1.7.5.9 1.4 1.5l-1 1.6-.8 1.1-.1.6q0 .3.2.5.1.2.3.2.4 0 .4-.4l-.1-.4-.2-.4.1-.2.3-.1q.8 0 3 1.5l2.6-2v.4l.3 1 .8.6zm-5.6-3.7h4.5v1.2l-1.5 1.2-3.6-1.5zm3.7-5.3.3.2.3.2.1 3.8h-3.6zM126 44q.4 0 1 .3l-2.2 3q-1.7-1-1.7-2.6 0-1.1 1-1.9.8-.8 2.1-.8 1 0 2 .5l-.5.7-1.2-.2q-1.3 0-1.8 1.5l.2.1q.5-.6 1.1-.6zm15 7.7 2.3-1.6v-.4q0-3.4-.3-5-.5-1.8-1.4-2.5-1-.6-2.9-.6h-3l-.7.1h-1.4q-.4-.2-.6-.7h-.2v.2q0 1 .5 1.5t1.9.5h1.8q-1.3.6-1.7 1.3-.4.7-.4 2.2v.3l-.7-.2q-1 0-1.6 1.1l.2.2q.4-.4.8-.4t.8.4q.3.4.3.9 0 .6-.4 1l-.5.6-.8.7h-.2l.2.3.8-.5.8-.5q1.1-1 1.5-1.6.3-.6.3-2v-2.7l.2-.3.3-.4q.1-.2.4-.3l.5-.2-.2.5-.2.5v3.6l-.1.5v.3l-.2.3q-.6 1-2 1.9l-1.6 1h-.3l.3.4q1-.6 1.9-.8.9-.3 2-.3 1.7 0 3.7.6zm-2-2h-.1v-1.2q.7-.5 1.4-.5t1.5.5v1.8l-.3-.1-1.2-.3-1.2-.1zm1.4-2q-.7 0-1.5.4v-1.9q.7.5 1.4.5.5 0 1.3-.5l.1 1.2v.7q-.7-.5-1.3-.5zm-.2-1.4q-.5 0-1.3-.5V43h.2q1.4.2 1.9.8.5.5.6 2-.7.5-1.4.5zm-2-3.3h.3v6.7q-1 0-1.8.3.6-.6.8-1.2.2-.5.2-1.6v-2.5l.1-.7.5-1zm13 8.6 1.8-1.7-.3-.2-.7.7q-.3-.3-1.2-.6v-3l.3-.2q1 .2 1.6.9.6.7 1 2l.4 1.4.7.7 1.7-1.5-.3-.2-.5.5q-.5-.4-.8-1.3l-.2-.8q-.6-1.9-2.2-2.7l2.3-1.5-2.3-3.3-2.8 2q0-1-.6-1.5t-1.5-.5q-1.2 0-2 1v.2q.6-.3 1.1-.3.8 0 1.1.4.4.4.4 1.4v.3l-2.8 1.9v.2q1.4.4 2.1 1.3.7.9.7 2.1v.1q-1.9.2-3.2 2 1.5-.7 3.1-.7 1.7 0 3.1 1zm-4.6-6.3 1.6-1.1v2.3q-.6-.7-1.6-1.2zm3.9 4.4-.5-.2h-.3V43l.8-.6zm2.9-5-2.6 1.7v-4l.7-.5zM70 95.8l6.7-5.7-1-1q-1.5 1.3-2.1 1.3-1 0-1.3-1L72 88l-.1-2.6-1-20v-2.2q0-3 .8-4.5.5-.7 1.4-1.5.9-.8 2.3-1.6l-.7-1-1.6.9-1.2.7-1.2 1-1.6 1.5-.4.3h-.1Q62 54.6 56 54.6t-10.5 4.3Q41 63 41 68.6q0 3.5 2 6.7 1.9 3 5.5 5.4L44.2 87q-2 2.8-2.5 4-.5 1-.5 2.4 0 1 .6 1.7t1.4.7q1.5 0 1.5-1.3 0-.7-.6-1.7t-.6-1.4q0-.5.4-.8.4-.5 1-.5 3 0 11.5 6l9.8-8 .1 1.6q.2 2.5.9 3.7.6 1.1 2.9 2.6zM49.3 82H66v4.5L60.5 91 47 85.2zm13.8-20 1 .8 1 .9.6 14.1H52.1Zm-9 4.8q1.5 0 3.3 1.2l-8 11.5q-6.2-4.3-6.2-10 0-4.2 3.4-7 3.3-3 8.3-3 4 0 7.1 1.9l-1.7 2.4q-2.4-.6-4.4-.6-4.8 0-7 5.5l1 .5q2-2.4 4.2-2.4zM99.9 90V72.4l9.6.4 3.1-5.5-6.8-.2 8.3-8.4-.3-.8h-1.5q-4.3 0-10.8-3.2L90 64v13.6q0 2.4-.4 3.2-.3.8-1.7 2.1-3.3-4.6-3.3-10.5 0-8.4 8.5-14l-.6-1q-12.7 6.7-12.7 18.4 0 8.2 5.4 14 5.4 5.7 13.2 5.7 5.2 0 9.4-2.6 4.3-2.6 7.4-7.7l-.5-.5q-7 5.2-14 5.2zm8.4-27-8.4 8.4V59.8q3.6 2.2 8.4 3zm-12.8-1.2 3.1-2.5v30.5q-6.3-1-10.1-5.8l3.2-2.7q2.7-2.2 3.2-3.4.6-1.2.6-4zm23.7-4.7.6 1q1.3-.7 2.2-.7 3 0 4.2 2.2 1.3 2.1 1.3 7.1v2.2q-3-1.9-5-1.9-1.5 0-3.2 1l.2.9h.9q3 0 5 2.1 2 2.2 2 5.7v1.2q-2.9-2.3-5.9-2.3-1 0-2 .3v.8q1.8.1 3.3.9 1.5.7 2.5 2 1 1.2 1.6 3 .6 1.7.6 3.7v1q-4.2 0-6.9 2.2T118 95q0 3.4 2.6 5.8 2.5 2.3 6.3 2.3t10.9-3.8q3.2-1.8 4.5-1.8 1.3 0 1.3.9l-.2.6q-.9 1.1-.9 2 0 1.2.8 2 .7.7 1.7.7 2.7 0 2.7-2.9 0-2.2-2.2-3.7-2-1.5-5.2-1.5-2.2 0-4.8.8l-1.7.6-3 1q-4 1.5-5.9 1.5-1.1 0-2.1-.4-1-.3-1.7-1t-1.1-1.6q-.4-1-.4-2 0-2.8 2.5-4.3 2.5-1.6 7-1.6l4.4.1 4.4.1q9.5 0 14-4.3 4.6-4.4 4.6-13.6 0-6.2-3.2-10.2-3.2-4-8.3-4-4 0-11.2 4.1l-.7.5q-1.2-6.5-7.7-6.5-3.4 0-6 2.3zm16.5 30.2H133V63.1l2.7-1.7zm2 0h-.7V79q2.9-2.4 6.2-2.4 3.5 0 6.7 2.8-2.6 8-12.1 8zm5.4-12.1q-3.1 0-6.1 2.2v-8q2.9 2.3 6.4 2.3 1.9 0 3.4-.6l1.6-.8 1.8-1.4q.4 2 .4 4.3 0 2.7-.4 4.7-3.4-2.7-7-2.7zm.2-4.8h-1.6q-.8-.2-1.5-.6-.8-.3-1.6-.9l-1.6-1.3v-6.8q2.5-1 4.2-1 3 0 5.4 2.1 2.4 2.2 3.2 5.7-2.8 2.8-6.5 2.8z" transform="translate(-41 -40.6)"/></svg>

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
priv/static/mugshot.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB