mirror of
https://github.com/ash-project/ash_hq.git
synced 2024-09-19 21:03:30 +12:00
open graph metadata
This commit is contained in:
parent
95a6fae77a
commit
437fc69c88
3 changed files with 86 additions and 1 deletions
|
@ -20,6 +20,10 @@ defmodule AshHqWeb.Pages.Blog do
|
||||||
<div class="flex flex-col sm:flex-row sm:pt-32 sm:mx-32 min-h-screen">
|
<div class="flex flex-col sm:flex-row sm:pt-32 sm:mx-32 min-h-screen">
|
||||||
<div class="sm:w-9/12">
|
<div class="sm:w-9/12">
|
||||||
{#if @post}
|
{#if @post}
|
||||||
|
<head>
|
||||||
|
<meta property="og:title" content={"Ash Framework Blog: #{@post.title}"}>
|
||||||
|
<meta property="og:description" content={@post.tag_line}>
|
||||||
|
</head>
|
||||||
<div class="border shadow-sm rounded-lg px-8 pb-6 mb-6 dark:border-gray-600" ">
|
<div class="border shadow-sm rounded-lg px-8 pb-6 mb-6 dark:border-gray-600" ">
|
||||||
<div class="border-b">
|
<div class="border-b">
|
||||||
<h1 class="mt-6 text-3xl font-semibold mb-4">{@post.title}</h1>
|
<h1 class="mt-6 text-3xl font-semibold mb-4">{@post.title}</h1>
|
||||||
|
@ -42,6 +46,13 @@ defmodule AshHqWeb.Pages.Blog do
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{#else}
|
{#else}
|
||||||
|
<head>
|
||||||
|
<meta property="og:title" content="Ash Framework Blog">
|
||||||
|
<meta
|
||||||
|
property="og:description"
|
||||||
|
content="A declarative foundation for ambitious Elixir applications. Model your domain, derive the rest."
|
||||||
|
/>
|
||||||
|
</head>
|
||||||
{#if @tag}
|
{#if @tag}
|
||||||
<h2 class="text-3xl font-semibold mb-1">Showing posts with tag: {@tag}</h2>
|
<h2 class="text-3xl font-semibold mb-1">Showing posts with tag: {@tag}</h2>
|
||||||
{#else}
|
{#else}
|
||||||
|
|
|
@ -32,11 +32,17 @@ defmodule AshHqWeb.Pages.Docs do
|
||||||
data module, :any
|
data module, :any
|
||||||
data mix_task, :any
|
data mix_task, :any
|
||||||
data positional_options, :list
|
data positional_options, :list
|
||||||
|
data description, :string
|
||||||
|
data title, :string
|
||||||
|
|
||||||
@spec render(any) :: Phoenix.LiveView.Rendered.t()
|
@spec render(any) :: Phoenix.LiveView.Rendered.t()
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
~F"""
|
~F"""
|
||||||
<div class="flex flex-col xl:flex-row justify-center">
|
<div class="flex flex-col xl:flex-row justify-center">
|
||||||
|
<head>
|
||||||
|
<meta property="og:title" content={@title}>
|
||||||
|
<meta property="og:description" content={@description}>
|
||||||
|
</head>
|
||||||
<div class="xl:hidden sticky top-20 z-40 h-14 bg-white dark:bg-base-dark-850 flex flex-row justify-start w-full space-x-12 items-center border-b border-t border-base-light-300 dark:border-base-dark-700 py-3">
|
<div class="xl:hidden sticky top-20 z-40 h-14 bg-white dark:bg-base-dark-850 flex flex-row justify-start w-full space-x-12 items-center border-b border-t border-base-light-300 dark:border-base-dark-700 py-3">
|
||||||
<button class="dark:hover:text-base-dark-600" phx-click={show_sidebar()}>
|
<button class="dark:hover:text-base-dark-600" phx-click={show_sidebar()}>
|
||||||
<Heroicons.Outline.MenuIcon class="w-8 h-8 ml-4" />
|
<Heroicons.Outline.MenuIcon class="w-8 h-8 ml-4" />
|
||||||
|
@ -765,6 +771,8 @@ defmodule AshHqWeb.Pages.Docs do
|
||||||
socket.assigns.module ->
|
socket.assigns.module ->
|
||||||
assign(socket,
|
assign(socket,
|
||||||
docs: socket.assigns.module.html_for,
|
docs: socket.assigns.module.html_for,
|
||||||
|
title: "Module: #{socket.assigns.module.name}",
|
||||||
|
description: "View the documentation for #{socket.assigns.module.name} on Ash HQ.",
|
||||||
doc_path: [socket.assigns.library.name, socket.assigns.module.name],
|
doc_path: [socket.assigns.library.name, socket.assigns.module.name],
|
||||||
options: []
|
options: []
|
||||||
)
|
)
|
||||||
|
@ -772,13 +780,28 @@ defmodule AshHqWeb.Pages.Docs do
|
||||||
socket.assigns.mix_task ->
|
socket.assigns.mix_task ->
|
||||||
assign(socket,
|
assign(socket,
|
||||||
docs: socket.assigns.mix_task.html_for,
|
docs: socket.assigns.mix_task.html_for,
|
||||||
|
title: "Mix Task: #{socket.assigns.mix_task.name}",
|
||||||
|
description: "View the documentation for #{socket.assigns.mix_task.name} on Ash HQ.",
|
||||||
doc_path: [socket.assigns.library.name, socket.assigns.mix_task.name],
|
doc_path: [socket.assigns.library.name, socket.assigns.mix_task.name],
|
||||||
options: []
|
options: []
|
||||||
)
|
)
|
||||||
|
|
||||||
socket.assigns.dsl ->
|
socket.assigns.dsl ->
|
||||||
|
meta_name =
|
||||||
|
Enum.join(
|
||||||
|
[
|
||||||
|
socket.assigns.library.name,
|
||||||
|
socket.assigns.extension.name
|
||||||
|
] ++ socket.assigns.dsl.path ++ [socket.assigns.dsl.name],
|
||||||
|
" > "
|
||||||
|
)
|
||||||
|
|
||||||
|
meta_type = String.capitalize(to_string(socket.assigns.dsl.type))
|
||||||
|
|
||||||
assign(socket,
|
assign(socket,
|
||||||
docs: socket.assigns.dsl.html_for,
|
docs: socket.assigns.dsl.html_for,
|
||||||
|
title: "DSL #{meta_type}: #{meta_name}",
|
||||||
|
description: "View the documentation for DSL #{meta_type}: #{meta_name} on Ash HQ.",
|
||||||
doc_path:
|
doc_path:
|
||||||
[
|
[
|
||||||
socket.assigns.library.name,
|
socket.assigns.library.name,
|
||||||
|
@ -794,22 +817,54 @@ defmodule AshHqWeb.Pages.Docs do
|
||||||
socket.assigns.extension ->
|
socket.assigns.extension ->
|
||||||
assign(socket,
|
assign(socket,
|
||||||
docs: socket.assigns.extension.html_for,
|
docs: socket.assigns.extension.html_for,
|
||||||
|
title: "Extension: #{socket.assigns.extension.name}",
|
||||||
|
description: "View the documentation for #{socket.assigns.extension.name} on Ash HQ.",
|
||||||
doc_path: [socket.assigns.library.name, socket.assigns.extension.name],
|
doc_path: [socket.assigns.library.name, socket.assigns.extension.name],
|
||||||
options: []
|
options: []
|
||||||
)
|
)
|
||||||
|
|
||||||
socket.assigns.guide ->
|
socket.assigns.guide ->
|
||||||
assign(socket,
|
assign(socket,
|
||||||
|
title: "Guide: #{socket.assigns.guide.name}",
|
||||||
docs: socket.assigns.guide.html_for,
|
docs: socket.assigns.guide.html_for,
|
||||||
|
description: "Read the \"#{socket.assigns.guide.name}\" guide on Ash HQ",
|
||||||
doc_path: [socket.assigns.library.name, socket.assigns.guide.name],
|
doc_path: [socket.assigns.library.name, socket.assigns.guide.name],
|
||||||
options: []
|
options: []
|
||||||
)
|
)
|
||||||
|
|
||||||
true ->
|
true ->
|
||||||
assign(socket, docs: "", doc_path: [], dsls: [], options: [])
|
assign(socket,
|
||||||
|
docs: "",
|
||||||
|
title: "Ash Framework",
|
||||||
|
description: default_description(),
|
||||||
|
doc_path: [],
|
||||||
|
dsls: [],
|
||||||
|
options: []
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# defp description(html) do
|
||||||
|
# This isn't predictably good content to put in a snippet :(
|
||||||
|
# html
|
||||||
|
# |> Floki.parse_fragment()
|
||||||
|
# |> elem(1)
|
||||||
|
# |> Floki.text()
|
||||||
|
# |> String.split("\n", trim: true)
|
||||||
|
# |> Stream.map(&String.trim/1)
|
||||||
|
# |> Stream.map(&String.replace(&1, ~r/{{.*(?!}})$/, ""))
|
||||||
|
# |> Stream.reject(&(&1 == ""))
|
||||||
|
# |> Stream.take(4)
|
||||||
|
# |> Enum.join("\n")
|
||||||
|
# rescue
|
||||||
|
# _ ->
|
||||||
|
# default_description()
|
||||||
|
# end
|
||||||
|
|
||||||
|
defp default_description do
|
||||||
|
"A declarative foundation for ambitious Elixir applications. Model your domain, derive the rest."
|
||||||
|
end
|
||||||
|
|
||||||
# workaround for https://github.com/patrick-steele-idem/morphdom/pull/231
|
# workaround for https://github.com/patrick-steele-idem/morphdom/pull/231
|
||||||
# Adding a unique ID on the container for the rendered docs prevents morphdom
|
# Adding a unique ID on the container for the rendered docs prevents morphdom
|
||||||
# merging them incorrectly.
|
# merging them incorrectly.
|
||||||
|
|
|
@ -45,6 +45,25 @@ defmodule AshHqWeb.AppViewLive do
|
||||||
class={classes([@configured_theme, "h-full font-sans": true])}
|
class={classes([@configured_theme, "h-full font-sans": true])}
|
||||||
phx-hook="ColorTheme"
|
phx-hook="ColorTheme"
|
||||||
>
|
>
|
||||||
|
<head>
|
||||||
|
<meta property="og:type" content="text/html">
|
||||||
|
<meta property="og:image" content="https://ash-hq.org/images/ash-logo.png">
|
||||||
|
<meta property="og:url" content={to_string(@uri)}>
|
||||||
|
<meta property="og:site_name" content="Ash HQ">
|
||||||
|
<meta property="twitter:card" content="summary_large_image">
|
||||||
|
<meta property="twitter:domain" content="ash-hq.org">
|
||||||
|
<meta property="twitter:site" content="@AshFramework">
|
||||||
|
<!-- Need to adjust this for future blog writers -->
|
||||||
|
<meta property="twitter:creator" content="@ZachSDaniel1">
|
||||||
|
|
||||||
|
{#if @live_action not in [:docs_dsl, :blog]}
|
||||||
|
<meta property="og:title" content="Ash Framework">
|
||||||
|
<meta
|
||||||
|
property="og:description"
|
||||||
|
content="A declarative foundation for ambitious Elixir applications. Model your domain, derive the rest."
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
|
</head>
|
||||||
<div id="snowflakeContainer" phx-hook="Snowflakes">
|
<div id="snowflakeContainer" phx-hook="Snowflakes">
|
||||||
<span class="snowflake" />
|
<span class="snowflake" />
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue