some refactoring of posts, rich text editor
This commit is contained in:
parent
4cb279b9ac
commit
76ccea9619
20 changed files with 198 additions and 76 deletions
assets
config
lib
mix.exsmix.lock
|
@ -1,5 +0,0 @@
|
|||
import Trix from 'trix'
|
||||
|
||||
document.addEventListener('trix-before-initialize', () => {
|
||||
console.log('trix-before-initialize')
|
||||
})
|
28
assets/package-lock.json
generated
28
assets/package-lock.json
generated
|
@ -5,8 +5,7 @@
|
|||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"@tailwindcss/typography": "^0.5.16",
|
||||
"trix": "^2.1.12"
|
||||
"@tailwindcss/typography": "^0.5.16"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/typography": {
|
||||
|
@ -24,13 +23,6 @@
|
|||
"tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/trusted-types": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
|
||||
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/cssesc": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
|
||||
|
@ -43,15 +35,6 @@
|
|||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/dompurify": {
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz",
|
||||
"integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==",
|
||||
"license": "(MPL-2.0 OR Apache-2.0)",
|
||||
"optionalDependencies": {
|
||||
"@types/trusted-types": "^2.0.7"
|
||||
}
|
||||
},
|
||||
"node_modules/lodash.castarray": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
|
||||
|
@ -90,15 +73,6 @@
|
|||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/trix": {
|
||||
"version": "2.1.12",
|
||||
"resolved": "https://registry.npmjs.org/trix/-/trix-2.1.12.tgz",
|
||||
"integrity": "sha512-0hQvJdy257XuzRdCzSQ/QvcqyTp+8ixMxVLWxSbWvEzD2kgKFlcrMjgWZbtVkJENaod+jm2sBTOWAZVNWK+DMA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"dompurify": "^3.2.3"
|
||||
}
|
||||
},
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
{
|
||||
"dependencies": {
|
||||
"@tailwindcss/typography": "^0.5.16",
|
||||
"trix": "^2.1.12"
|
||||
"@tailwindcss/typography": "^0.5.16"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,9 +13,44 @@ module.exports = {
|
|||
],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
brand: "#FD4F00",
|
||||
}
|
||||
typography: ({theme}) => ({
|
||||
cms: {
|
||||
css: {
|
||||
'--tw-prose-body': theme('colors.black'),
|
||||
'--tw-prose-headings': theme('colors.black'),
|
||||
'--tw-prose-lead': theme('colors.black'),
|
||||
'--tw-prose-links': theme('colors.black'),
|
||||
'--tw-prose-bold': theme('colors.black'),
|
||||
'--tw-prose-counters': theme('colors.black'),
|
||||
'--tw-prose-bullets': theme('colors.black'),
|
||||
'--tw-prose-hr': theme('colors.black'),
|
||||
'--tw-prose-quotes': theme('colors.black'),
|
||||
'--tw-prose-quote-borders': theme('colors.gray[200]'),
|
||||
'--tw-prose-captions': theme('colors.black'),
|
||||
'--tw-prose-code': theme('colors.black'),
|
||||
'--tw-prose-pre-code': theme('colors.black'),
|
||||
'--tw-prose-pre-bg': theme('colors.black'),
|
||||
'--tw-prose-th-borders': theme('colors.gray[400]'),
|
||||
'--tw-prose-td-borders': theme('colors.gray[400]'),
|
||||
// '--tw-prose-invert-body': theme('colors.pink[200]'),
|
||||
// '--tw-prose-invert-headings': theme('colors.white'),
|
||||
// '--tw-prose-invert-lead': theme('colors.pink[300]'),
|
||||
// '--tw-prose-invert-links': theme('colors.white'),
|
||||
// '--tw-prose-invert-bold': theme('colors.white'),
|
||||
// '--tw-prose-invert-counters': theme('colors.pink[400]'),
|
||||
// '--tw-prose-invert-bullets': theme('colors.pink[600]'),
|
||||
// '--tw-prose-invert-hr': theme('colors.pink[700]'),
|
||||
// '--tw-prose-invert-quotes': theme('colors.pink[100]'),
|
||||
// '--tw-prose-invert-quote-borders': theme('colors.pink[700]'),
|
||||
// '--tw-prose-invert-captions': theme('colors.pink[400]'),
|
||||
// '--tw-prose-invert-code': theme('colors.white'),
|
||||
// '--tw-prose-invert-pre-code': theme('colors.pink[300]'),
|
||||
// '--tw-prose-invert-pre-bg': 'rgb(0 0 0 / 50%)',
|
||||
// '--tw-prose-invert-th-borders': theme('colors.pink[600]'),
|
||||
// '--tw-prose-invert-td-borders': theme('colors.pink[700]'),
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
|
|
|
@ -27,8 +27,7 @@ config :cms,
|
|||
config :esbuild,
|
||||
version: "0.17.11",
|
||||
cms: [
|
||||
args:
|
||||
~w(js/app.js js/editor.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
|
||||
args: ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
|
||||
cd: Path.expand("../assets", __DIR__),
|
||||
env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
|
||||
]
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
defmodule CMS.Posts do
|
||||
@moduledoc false
|
||||
import Ecto.Query
|
||||
|
||||
alias CMS.Posts.Post
|
||||
alias CMS.Repo
|
||||
|
||||
|
@ -20,6 +22,10 @@ defmodule CMS.Posts do
|
|||
end
|
||||
|
||||
def list_posts do
|
||||
Repo.all(Post)
|
||||
query =
|
||||
from post in Post,
|
||||
order_by: [desc: post.inserted_at]
|
||||
|
||||
Repo.all(query)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,6 +4,26 @@ defmodule CMSWeb.CoreComponents do
|
|||
"""
|
||||
use Phoenix.Component
|
||||
|
||||
attr :class, :string, default: nil
|
||||
attr :global, :global
|
||||
slot :inner_block
|
||||
|
||||
def title(assigns) do
|
||||
~H"""
|
||||
<h1 class={["font-bold text-xl mb-3", @class]} {@global}>{render_slot(@inner_block)}</h1>
|
||||
"""
|
||||
end
|
||||
|
||||
attr :class, :string, default: nil
|
||||
attr :global, :global
|
||||
slot :inner_block
|
||||
|
||||
def subtitle(assigns) do
|
||||
~H"""
|
||||
<h2 class={["font-bold text-lg mb-2", @class]} {@global}>{render_slot(@inner_block)}</h2>
|
||||
"""
|
||||
end
|
||||
|
||||
attr :class, :string, default: nil
|
||||
|
||||
attr :global, :global,
|
||||
|
@ -17,12 +37,32 @@ defmodule CMSWeb.CoreComponents do
|
|||
"""
|
||||
end
|
||||
|
||||
attr :class, :string, default: nil
|
||||
attr :type, :string, default: "button"
|
||||
attr :global, :global
|
||||
slot :inner_block
|
||||
|
||||
def button(assigns) do
|
||||
~H"""
|
||||
<button type={@type} class={["hover:underline", @class]} {@global}>
|
||||
{render_slot(@inner_block)}
|
||||
</button>
|
||||
"""
|
||||
end
|
||||
|
||||
attr :class, :string, default: nil
|
||||
attr :field, Phoenix.HTML.FormField, required: true
|
||||
attr :global, :global, include: ~w[required placeholder type]
|
||||
|
||||
def input(assigns) do
|
||||
~H"""
|
||||
<input id={@field.id} name={@field.name} value={@field.value} {@global} />
|
||||
<input
|
||||
class={["px-1 py-0.5 border border-gray-400 rounded", @class]}
|
||||
id={@field.id}
|
||||
name={@field.name}
|
||||
value={@field.value}
|
||||
{@global}
|
||||
/>
|
||||
"""
|
||||
end
|
||||
|
||||
|
@ -52,4 +92,22 @@ defmodule CMSWeb.CoreComponents do
|
|||
<span class={[@name, @class]} />
|
||||
"""
|
||||
end
|
||||
|
||||
attr :format, :string, required: true
|
||||
attr :value, :any, default: nil
|
||||
attr :global, :global
|
||||
|
||||
def timex(%{value: nil} = assigns) do
|
||||
~H"""
|
||||
<time datetime="">--</time>
|
||||
"""
|
||||
end
|
||||
|
||||
def timex(assigns) do
|
||||
~H"""
|
||||
<time datetime={Timex.format!(@value, "{ISO:Extended:Z}")} {@global}>
|
||||
{Timex.format!(@value, @format)}
|
||||
</time>
|
||||
"""
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,14 +1,19 @@
|
|||
<div
|
||||
:if={@admin?}
|
||||
class="sticky top-0 bg-white z-50 flex flex-row justify-between py-1 px-3 md:mb-2 border-b border-slate-100"
|
||||
class="sticky top-0 bg-white z-50 flex flex-row justify-between py-1 px-3 md:mb-2 border-b border-gray-200"
|
||||
>
|
||||
<section class="flex flex-row gap-x-2">
|
||||
<div class="pr-2 border-r border-slate-100">
|
||||
<.a navigate={~p"/admin"} class="font-bold">admin mode</.a>
|
||||
<div class="pr-2 border-r border-gray-200">
|
||||
<.a navigate={~p"/admin"} class="font-bold">admin</.a>
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="flex flex-row">
|
||||
<.a href={~p"/admin/posts/new"}>new post</.a>
|
||||
<ul class="flex flex-row gap-x-2">
|
||||
<li>
|
||||
<.a href={~p"/admin/microblog/new"}>new status</.a>
|
||||
</li>
|
||||
<li>
|
||||
<.a href={~p"/admin/writing/new"}>new draft</.a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</section>
|
||||
|
@ -20,12 +25,15 @@
|
|||
</section>
|
||||
</div>
|
||||
<div class="flex flex-col md:flex-row mx-auto max-w-4xl">
|
||||
<section class="flex flex-col p-2 gap-y-1 border-slate-100 border-b md:border-b-0">
|
||||
<section class="flex flex-col p-2 gap-y-1 border-gray-200 border-b md:border-b-0">
|
||||
<.a href={~p"/"} class="font-bold">sloanelybutsurely.com</.a>
|
||||
<nav>
|
||||
<ul>
|
||||
<li>
|
||||
<.a href={~p"/posts"}>writing</.a>
|
||||
<.a href={~p"/writing"}>writing</.a>
|
||||
</li>
|
||||
<li>
|
||||
<.a href={~p"/microblog"}>microblog</.a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
|
|
@ -10,6 +10,11 @@
|
|||
<link phx-track-static rel="stylesheet" href={~p"/assets/app.css"} />
|
||||
<script defer phx-track-static type="text/javascript" src={~p"/assets/app.js"}>
|
||||
</script>
|
||||
<%= if @load_trix? do %>
|
||||
<link rel="stylesheet" type="text/css" href="https://unpkg.com/trix@2.0.8/dist/trix.css" />
|
||||
<script type="text/javascript" src="https://unpkg.com/trix@2.0.8/dist/trix.umd.min.js">
|
||||
</script>
|
||||
<% end %>
|
||||
</head>
|
||||
<body class="bg-white">
|
||||
{@inner_content}
|
||||
|
|
|
@ -3,15 +3,19 @@ defmodule CMSWeb.Globals do
|
|||
use CMSWeb, :live_view
|
||||
|
||||
def assign_globals(%Plug.Conn{} = conn, _opts) do
|
||||
Plug.Conn.assign(conn, :current_path, conn.request_path)
|
||||
conn
|
||||
|> Plug.Conn.assign(:current_path, conn.request_path)
|
||||
|> Plug.Conn.assign(:load_trix?, false)
|
||||
end
|
||||
|
||||
def on_mount(:default, _params, _session, socket) do
|
||||
socket =
|
||||
attach_hook(socket, :assign_handle_params_globals, :handle_params, fn _params, uri, socket ->
|
||||
socket
|
||||
|> attach_hook(:assign_handle_params_globals, :handle_params, fn _params, uri, socket ->
|
||||
%URI{path: current_path} = URI.parse(uri)
|
||||
{:cont, assign(socket, :current_path, current_path)}
|
||||
end)
|
||||
|> assign(:load_trix?, false)
|
||||
|
||||
{:cont, socket}
|
||||
end
|
||||
|
|
|
@ -1,15 +1,13 @@
|
|||
defmodule CMSWeb.PageController do
|
||||
use CMSWeb, :controller
|
||||
|
||||
alias CMS.Posts
|
||||
|
||||
def home(conn, _params) do
|
||||
render(conn, :home)
|
||||
end
|
||||
posts = Enum.take(Posts.list_posts(), 5)
|
||||
|
||||
def microblog(conn, _params) do
|
||||
render(conn, :microblog)
|
||||
end
|
||||
|
||||
def writing(conn, _params) do
|
||||
render(conn, :writing)
|
||||
conn
|
||||
|> assign(:posts, posts)
|
||||
|> render(:home)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
<section>
|
||||
<.subtitle>
|
||||
<.a href={~p"/writing"}>writing</.a>
|
||||
</.subtitle>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<.subtitle>
|
||||
<.a href={~p"/microblog"}>microblog</.a>
|
||||
</.subtitle>
|
||||
</section>
|
|
@ -1,6 +1,13 @@
|
|||
<%= for post <- @posts do %>
|
||||
<article id={"post-#{post.id}"}>
|
||||
<h2><.link href={~p"/posts/#{post}"}>{post.title}</.link></h2>
|
||||
<p>{post.contents}</p>
|
||||
</article>
|
||||
<% end %>
|
||||
<.title>writing</.title>
|
||||
<ul class="flex flex-col">
|
||||
<li :for={post <- @posts} class="flex flex-row justify-between">
|
||||
<.a href={~p"/writing/#{post}"}>
|
||||
<%= if post.title do %>
|
||||
{post.title}
|
||||
<% else %>
|
||||
(no title)
|
||||
<% end %>
|
||||
</.a>
|
||||
<.timex value={post.inserted_at} format="{YYYY}-{0M}-{0D}" class="text-gray-500" />
|
||||
</li>
|
||||
</ul>
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
<article>
|
||||
<header class="flex flex-row justify-between">
|
||||
<header class="flex flex-row">
|
||||
<h1 :if={@post.title} class="font-bold text-xl mb-3">{@post.title}</h1>
|
||||
<.link :if={@admin?} href={~p"/admin/posts/#{@post}"}>edit</.link>
|
||||
</header>
|
||||
<section class="prose">{raw(@post.contents)}</section>
|
||||
<section class="prose prose-cms max-w-none">{raw(@post.contents)}</section>
|
||||
<footer class="mt-5 py-1 border-t border-gray-200 relative">
|
||||
<.link :if={@admin?} class="absolute right-0" href={~p"/admin/posts/#{@post}"}>edit</.link>
|
||||
</footer>
|
||||
</article>
|
||||
|
|
|
@ -5,6 +5,13 @@ defmodule CMSWeb.PostLive do
|
|||
alias CMS.Posts
|
||||
alias CMS.Posts.Post
|
||||
|
||||
@impl true
|
||||
def mount(_params, _session, socket) do
|
||||
socket = assign(socket, :load_trix?, true)
|
||||
|
||||
{:ok, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_params(_params, _uri, %{assigns: %{live_action: :new}} = socket) do
|
||||
post = %Post{}
|
||||
|
@ -54,16 +61,13 @@ defmodule CMSWeb.PostLive do
|
|||
~H"""
|
||||
<.form for={@form} class="flex flex-col gap-y-2" phx-submit="save_post">
|
||||
<.input type="hidden" field={@form[:contents]} />
|
||||
<.input class="border-gray-400 rounded" field={@form[:title]} />
|
||||
<.input class="text-lg" field={@form[:title]} placeholder="Title" />
|
||||
<div id="editor" phx-update="ignore">
|
||||
<trix-editor input={@form[:contents].id} class="prose prose-gray max-w-full"></trix-editor>
|
||||
<trix-editor input={@form[:contents].id} class="prose prose-cms max-w-none"></trix-editor>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="self-end">save</button>
|
||||
</.form>
|
||||
<link rel="stylesheet" type="text/css" href="https://unpkg.com/trix@2.0.8/dist/trix.css" />
|
||||
<script defer phx-track-static type="text/javascript" src={~p"/assets/editor.js"}>
|
||||
</script>
|
||||
"""
|
||||
end
|
||||
end
|
||||
|
|
|
@ -33,8 +33,8 @@ defmodule CMSWeb.Router do
|
|||
|
||||
get "/", PageController, :home
|
||||
|
||||
get "/posts", PostController, :index
|
||||
get "/posts/:post_id", PostController, :show
|
||||
get "/writing", PostController, :index
|
||||
get "/writing/:post_id", PostController, :show
|
||||
|
||||
live "/sign-in", AdminLoginLive
|
||||
post "/admin/session/create", AdminSessionController, :create
|
||||
|
@ -47,8 +47,11 @@ defmodule CMSWeb.Router do
|
|||
|
||||
live "/", AdminLive
|
||||
|
||||
live "/posts/new", PostLive, :new
|
||||
live "/posts/:post_id", PostLive, :edit
|
||||
live "/writing/new", PostLive, :new
|
||||
live "/writing/:post_id", PostLive, :edit
|
||||
|
||||
live "/microblog/new", StatusLive, :new
|
||||
live "/microblog/:status_id", StatusLive, :edit
|
||||
end
|
||||
end
|
||||
|
||||
|
|
1
mix.exs
1
mix.exs
|
@ -51,6 +51,7 @@ defmodule CMS.MixProject do
|
|||
{:dns_cluster, "~> 0.1.1"},
|
||||
{:bandit, "~> 1.5"},
|
||||
{:argon2_elixir, "~> 4.1"},
|
||||
{:timex, "~> 3.7"},
|
||||
|
||||
# dev/test only
|
||||
{:styler, "~> 1.4", only: [:dev, :test], runtime: false}
|
||||
|
|
13
mix.lock
13
mix.lock
|
@ -2,6 +2,8 @@
|
|||
"argon2_elixir": {:hex, :argon2_elixir, "4.1.2", "1160a3ccd59b951175525882240651f5ed3303b75c616204713f8b31c76b37bd", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "9222341e1b0d9aa5ca7e26a1c77bd1bd92d2314c92b57ca3e2c7ed847223b51d"},
|
||||
"bandit": {:hex, :bandit, "1.6.7", "42f30e37a1c89a2a12943c5dca76f731a2313e8a2e21c1a95dc8241893e922d1", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "551ba8ff5e4fc908cbeb8c9f0697775fb6813a96d9de5f7fe02e34e76fd7d184"},
|
||||
"castore": {:hex, :castore, "1.0.11", "4bbd584741601eb658007339ea730b082cc61f3554cf2e8f39bf693a11b49073", [:mix], [], "hexpm", "e03990b4db988df56262852f20de0f659871c35154691427a5047f4967a16a62"},
|
||||
"certifi": {:hex, :certifi, "2.14.0", "ed3bef654e69cde5e6c022df8070a579a79e8ba2368a00acf3d75b82d9aceeed", [:rebar3], [], "hexpm", "ea59d87ef89da429b8e905264fdec3419f84f2215bb3d81e07a18aac919026c3"},
|
||||
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
|
||||
"comeonin": {:hex, :comeonin, "5.5.1", "5113e5f3800799787de08a6e0db307133850e635d34e9fab23c70b6501669510", [:mix], [], "hexpm", "65aac8f19938145377cee73973f192c5645873dcf550a8a6b18187d17c13ccdb"},
|
||||
"db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"},
|
||||
"decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"},
|
||||
|
@ -10,12 +12,19 @@
|
|||
"ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"},
|
||||
"elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"},
|
||||
"esbuild": {:hex, :esbuild, "0.9.0", "f043eeaca4932ca8e16e5429aebd90f7766f31ac160a25cbd9befe84f2bc068f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b415027f71d5ab57ef2be844b2a10d0c1b5a492d431727f43937adce22ba45ae"},
|
||||
"expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"},
|
||||
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
|
||||
"floki": {:hex, :floki, "0.37.0", "b83e0280bbc6372f2a403b2848013650b16640cd2470aea6701f0632223d719e", [:mix], [], "hexpm", "516a0c15a69f78c47dc8e0b9b3724b29608aa6619379f91b1ffa47109b5d0dd3"},
|
||||
"gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"},
|
||||
"hackney": {:hex, :hackney, "1.22.0", "4efc68df70322d4d2e3d2744e9bd191a39a0cb8d08c35379a08d9fb0f040d595", [:rebar3], [{:certifi, "~> 2.14.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "628569e451820950382be3d3e6481d7c59997e606c7823bddb4ce5d10812dfcb"},
|
||||
"heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]},
|
||||
"hpax": {:hex, :hpax, "1.0.2", "762df951b0c399ff67cc57c3995ec3cf46d696e41f0bba17da0518d94acd4aac", [:mix], [], "hexpm", "2f09b4c1074e0abd846747329eaa26d535be0eb3d189fa69d812bfb8bfefd32f"},
|
||||
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
|
||||
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
|
||||
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
|
||||
"mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
|
||||
"mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"},
|
||||
"parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"},
|
||||
"phoenix": {:hex, :phoenix, "1.7.19", "36617efe5afbd821099a8b994ff4618a340a5bfb25531a1802c4d4c634017a57", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "ba4dc14458278773f905f8ae6c2ec743d52c3a35b6b353733f64f02dfe096cd6"},
|
||||
"phoenix_ecto": {:hex, :phoenix_ecto, "4.6.3", "f686701b0499a07f2e3b122d84d52ff8a31f5def386e03706c916f6feddf69ef", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "909502956916a657a197f94cc1206d9a65247538de8a5e186f7537c895d95764"},
|
||||
"phoenix_html": {:hex, :phoenix_html, "4.2.0", "83a4d351b66f472ebcce242e4ae48af1b781866f00ef0eb34c15030d4e2069ac", [:mix], [], "hexpm", "9713b3f238d07043583a94296cc4bbdceacd3b3a6c74667f4df13971e7866ec8"},
|
||||
|
@ -27,12 +36,16 @@
|
|||
"plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
|
||||
"plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},
|
||||
"postgrex": {:hex, :postgrex, "0.20.0", "363ed03ab4757f6bc47942eff7720640795eb557e1935951c1626f0d303a3aed", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "d36ef8b36f323d29505314f704e21a1a038e2dc387c6409ee0cd24144e187c0f"},
|
||||
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
|
||||
"styler": {:hex, :styler, "1.4.0", "5944723d08afe4d38210b674d7e97dd1137a75968a85a633983cc308e86dc5f2", [:mix], [], "hexpm", "07de0e89c27490c8e469bb814d77ddaaa3283d7d8038501021d80a7705cf13e9"},
|
||||
"tailwind": {:hex, :tailwind, "0.2.4", "5706ec47182d4e7045901302bf3a333e80f3d1af65c442ba9a9eed152fb26c2e", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "c6e4a82b8727bab593700c998a4d98cf3d8025678bfde059aed71d0000c3e463"},
|
||||
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
|
||||
"telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"},
|
||||
"telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"},
|
||||
"thousand_island": {:hex, :thousand_island, "1.3.10", "a9971ebab1dfb36e2710a86b37c3f54973fbc9470d892035334415521fb53328", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "17ab1f1b13aadb1f4b4c8e5b59c06874d701119fed082884c9c6d38addad254f"},
|
||||
"timex": {:hex, :timex, "3.7.11", "bb95cb4eb1d06e27346325de506bcc6c30f9c6dea40d1ebe390b262fad1862d1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.20", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8b9024f7efbabaf9bd7aa04f65cf8dcd7c9818ca5737677c7b76acbc6a94d1aa"},
|
||||
"tzdata": {:hex, :tzdata, "1.1.2", "45e5f1fcf8729525ec27c65e163be5b3d247ab1702581a94674e008413eef50b", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "cec7b286e608371602318c414f344941d5eb0375e14cfdab605cca2fe66cba8b"},
|
||||
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
|
||||
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
|
||||
"websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"},
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue