- <.icon name={:exclamation_circle} solid class="w-5 h-5 mr-2 text-red-400" />
+ <.icon name="hero-exclamation-circle-solid" class="w-5 h-5 mr-2 text-red-400" />
Oops, something went wrong!
diff --git a/lib/atomic_web/views/helpers.ex b/lib/atomic_web/views/helpers.ex
index 75bdce693..5fca71f43 100644
--- a/lib/atomic_web/views/helpers.ex
+++ b/lib/atomic_web/views/helpers.ex
@@ -3,8 +3,7 @@ defmodule AtomicWeb.Helpers do
A module with helper functions to display data in views
"""
use Phoenix.HTML
-
- import AtomicWeb.Gettext
+ use Gettext, backend: AtomicWeb.Gettext
alias Timex.Format.DateTime.Formatters.Relative
diff --git a/mix.exs b/mix.exs
index 338e8792a..1b692ebf3 100644
--- a/mix.exs
+++ b/mix.exs
@@ -62,11 +62,22 @@ defmodule Atomic.MixProject do
# frontend
{:tailwind, "~> 0.1", runtime: Mix.env() == :dev},
{:tailwind_formatter, "~> 0.3.7", only: [:dev, :test], runtime: false},
- {:heroicons, "~> 0.5.3"},
{:esbuild, "~> 0.4", runtime: Mix.env() == :dev},
{:flop_phoenix, "~> 0.20.0"},
{:phoenix_storybook, "~> 0.5.6"},
+ # icons
+ {:heroicons,
+ github: "tailwindlabs/heroicons",
+ tag: "v2.1.5",
+ sparse: "optimized",
+ app: false,
+ compile: false,
+ depth: 1,
+ override: true},
+ {:tabler_icons,
+ github: "tabler/tabler-icons", sparse: "icons", app: false, compile: false, depth: 1},
+
# monitoring
{:telemetry_metrics, "~> 0.6"},
{:telemetry_poller, "~> 1.0"},
diff --git a/mix.lock b/mix.lock
index 2d2480764..da0d37fd4 100644
--- a/mix.lock
+++ b/mix.lock
@@ -14,22 +14,22 @@
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
"doctest_formatter": {:hex, :doctest_formatter, "0.2.1", "61d5674463ae0bf3249f58ae965c33f24e304662b03e7ebc1d46ceab584b545c", [:mix], [], "hexpm", "b2dad6d81b36800a4fd22888adcfdd97c955d9acf20d57cedc92c638125925a6"},
"earmark": {:hex, :earmark, "1.4.47", "7e7596b84fe4ebeb8751e14cbaeaf4d7a0237708f2ce43630cfd9065551f94ca", [:mix], [], "hexpm", "3e96bebea2c2d95f3b346a7ff22285bc68a99fbabdad9b655aa9c6be06c698f8"},
- "ecto": {:hex, :ecto, "3.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"},
- "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 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", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"},
+ "ecto": {:hex, :ecto, "3.12.3", "1a9111560731f6c3606924c81c870a68a34c819f6d4f03822f370ea31a582208", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9efd91506ae722f95e48dc49e70d0cb632ede3b7a23896252a60a14ac6d59165"},
+ "ecto_sql": {:hex, :ecto_sql, "3.12.0", "73cea17edfa54bde76ee8561b30d29ea08f630959685006d9c6e7d1e59113b7d", [: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", "dc9e4d206f274f3947e96142a8fdc5f69a2a6a9abb4649ef5c882323b6d512f0"},
"elixir_make": {:hex, :elixir_make, "0.8.4", "4960a03ce79081dee8fe119d80ad372c4e7badb84c493cc75983f9d3bc8bde0f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "6e7f1d619b5f61dfabd0a20aa268e575572b542ac31723293a4c1a567d5ef040"},
"elixlsx": {:hex, :elixlsx, "0.5.1", "3b4129c7059c7bd2ed4e2ff5f6c485410ab125058bee2e9de6e0eb8417176803", [:mix], [], "hexpm", "25d778d43ea1ae86df8dd20170842d324086c0cab40503eb484a3779a6e2254c"},
"esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"},
"ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"},
- "expo": {:hex, :expo, "1.0.0", "647639267e088717232f4d4451526e7a9de31a3402af7fcbda09b27e9a10395a", [:mix], [], "hexpm", "18d2093d344d97678e8a331ca0391e85d29816f9664a25653fd7e6166827827c"},
+ "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"},
"faker": {:hex, :faker, "0.18.0", "943e479319a22ea4e8e39e8e076b81c02827d9302f3d32726c5bf82f430e6e14", [:mix], [], "hexpm", "bfbdd83958d78e2788e99ec9317c4816e651ad05e24cfd1196ce5db5b3e81797"},
- "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"},
+ "file_system": {:hex, :file_system, "1.0.1", "79e8ceaddb0416f8b8cd02a0127bdbababe7bf4a23d2a395b983c1f8b3f73edd", [:mix], [], "hexpm", "4414d1f38863ddf9120720cd976fce5bdde8e91d8283353f0e31850fa89feb9e"},
"floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"},
"flop": {:hex, :flop, "0.17.2", "9408f71a91350f8904e221a6b82e4429acee5aba5c1abbfd7901d2465b7aa44c", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "8bd987e353bffff3687cc7203bfdeb83942d8de6172dc833d651438d477115fc"},
"flop_phoenix": {:hex, :flop_phoenix, "0.20.0", "acb2d94c79a2184a6c78c542fc552b0a14565a06f4e48479ded9dced398277dc", [:mix], [{:flop, ">= 0.17.1 and < 0.22.0", [hex: :flop, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.6.0 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}], "hexpm", "b7a328e2aa634278560973bdaac4eebcb326f945a5832c02413730c1cbc4417f"},
"gen_stage": {:hex, :gen_stage, "1.2.1", "19d8b5e9a5996d813b8245338a28246307fd8b9c99d1237de199d21efc4c76a1", [:mix], [], "hexpm", "83e8be657fa05b992ffa6ac1e3af6d57aa50aace8f691fcf696ff02f8335b001"},
- "gettext": {:hex, :gettext, "0.25.0", "98a95a862a94e2d55d24520dd79256a15c87ea75b49673a2e2f206e6ebc42e5d", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "38e5d754e66af37980a94fb93bb20dcde1d2361f664b0a19f01e87296634051f"},
+ "gettext": {:hex, :gettext, "0.26.1", "38e14ea5dcf962d1fc9f361b63ea07c0ce715a8ef1f9e82d3dfb8e67e0416715", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "01ce56f188b9dc28780a52783d6529ad2bc7124f9744e571e1ee4ea88bf08734"},
"hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.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", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"},
- "heroicons": {:hex, :heroicons, "0.5.5", "c2bcb05a90f010df246a5a2a2b54cac15483b5de137b2ef0bead77fcdf06e21a", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:phoenix_live_view, ">= 0.18.2", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}], "hexpm", "2f4bf929440fecd5191ba9f40e5009b0f75dc993d765c0e4d068fcb7026d6da1"},
+ "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "ad0ad1f6d51bd64dcd67e363d2b2833a8de25154", [tag: "v2.1.5", sparse: "optimized"]},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"inflex": {:hex, :inflex, "2.0.0", "db69d542b8fdb23ac667f9bc0c2395a3983fa2da6ae2efa7ab5dc541928f7a75", [:mix], [], "hexpm", "c018852409bd48b03ad96ed53594186bc074bdd1519043a0ad1fa5697aac4399"},
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
@@ -56,25 +56,26 @@
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
"phoenix_view": {:hex, :phoenix_view, "2.0.4", "b45c9d9cf15b3a1af5fb555c674b525391b6a1fe975f040fb4d913397b31abf4", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "4e992022ce14f31fe57335db27a28154afcc94e9983266835bb3040243eb620b"},
"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_cowboy": {:hex, :plug_cowboy, "2.7.1", "87677ffe3b765bc96a89be7960f81703223fe2e21efa42c125fcd0127dd9d6b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "02dbd5f9ab571b864ae39418db7811618506256f6d13b4a45037e5fe78dc5de3"},
+ "plug_cowboy": {:hex, :plug_cowboy, "2.7.2", "fdadb973799ae691bf9ecad99125b16625b1c6039999da5fe544d99218e662e4", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "245d8a11ee2306094840c000e8816f0cbed69a23fc0ac2bcf8d7835ae019bb2f"},
"plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
- "postgrex": {:hex, :postgrex, "0.19.0", "f7d50e50cb42e0a185f5b9a6095125a9ab7e4abccfbe2ab820ab9aa92b71dbab", [: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", "dba2d2a0a8637defbf2307e8629cb2526388ba7348f67d04ec77a5d6a72ecfae"},
+ "postgrex": {:hex, :postgrex, "0.19.1", "73b498508b69aded53907fe48a1fee811be34cc720e69ef4ccd568c8715495ea", [: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", "8bac7885a18f381e091ec6caf41bda7bb8c77912bb0e9285212829afe5d8a8f8"},
"qrcode_ex": {:hex, :qrcode_ex, "0.1.1", "8907a7558325babd30f7f43ff85a0169ef65c30820d68e90d792802318f9a062", [:mix], [], "hexpm", "9eb0b397fb3a1c3b16e55b6de6f845a0b4e7b7100ade39eb59fad98fb62455a7"},
"quantum": {:hex, :quantum, "3.5.3", "ee38838a07761663468145f489ad93e16a79440bebd7c0f90dc1ec9850776d99", [:mix], [{:crontab, "~> 1.1", [hex: :crontab, repo: "hexpm", optional: false]}, {:gen_stage, "~> 0.14 or ~> 1.0", [hex: :gen_stage, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_registry, "~> 0.2", [hex: :telemetry_registry, repo: "hexpm", optional: false]}], "hexpm", "500fd3fa77dcd723ed9f766d4a175b684919ff7b6b8cfd9d7d0564d58eba8734"},
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
- "swoosh": {:hex, :swoosh, "1.16.10", "04be6e2eb1a31aa0aa21a731175c81cc3998189456a92daf13d44a5c754afcf5", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "756be04db173c0cbe318f1dfe2bcc88aa63aed78cf5a4b02b61b36ee11fc716a"},
+ "swoosh": {:hex, :swoosh, "1.17.0", "4a082a6ce4d60b1f48ffa725c8da0e2304504569ff550f4ed2d088c923039cb0", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "659b8bc25f7483b872d051a7f0731fb8d5312165be0d0302a3c783b566b0a290"},
+ "tabler_icons": {:git, "https://github.com/tabler/tabler-icons.git", "405bcfffba9cecf08e686145367dcdc9cc44eb5c", [sparse: "icons"]},
"tailwind": {:hex, :tailwind, "0.2.3", "277f08145d407de49650d0a4685dc062174bdd1ae7731c5f1da86163a24dfcdb", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "8e45e7a34a676a7747d04f7913a96c770c85e6be810a1d7f91e713d3a3655b5d"},
"tailwind_formatter": {:hex, :tailwind_formatter, "0.3.7", "2728d031e6803dfddf63f1dd7c64b5b9fd70ffdf635709c50f47589f4fb48861", [:mix], [{:phoenix_live_view, ">= 0.17.6", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}], "hexpm", "3d91ac4d4622505b09c0f4678512281515b4fbe7644f012da1bd2722f5880185"},
- "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
+ "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
"telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"},
"telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"},
"telemetry_registry": {:hex, :telemetry_registry, "0.3.2", "701576890320be6428189bff963e865e8f23e0ff3615eade8f78662be0fc003c", [:mix, :rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7ed191eb1d115a3034af8e1e35e4e63d5348851d556646d46ca3d1b4e16bab9"},
"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.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"},
+ "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"},
"waffle": {:hex, :waffle, "1.1.9", "8ce5ca9e59fa5491da67a2df57b8711d93223df3c3e5c21ad2acdedc41a0f51a", [:mix], [{:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:ex_aws_s3, "~> 2.1", [hex: :ex_aws_s3, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "307c63cfdfb4624e7c423868a128ccfcb0e5291ae73a9deecb3a10b7a3eb277c"},
"waffle_ecto": {:hex, :waffle_ecto, "0.0.12", "e5c17c49b071b903df71861c642093281123142dc4e9908c930db3e06795b040", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:waffle, "~> 1.0", [hex: :waffle, repo: "hexpm", optional: false]}], "hexpm", "585fe6371057066d2e8e3383ddd7a2437ff0668caf3f4cbf5a041e0de9837168"},
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
- "websock_adapter": {:hex, :websock_adapter, "0.5.6", "0437fe56e093fd4ac422de33bf8fc89f7bc1416a3f2d732d8b2c8fd54792fe60", [: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", "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"},
+ "websock_adapter": {:hex, :websock_adapter, "0.5.7", "65fa74042530064ef0570b75b43f5c49bb8b235d6515671b3d250022cb8a1f9e", [: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", "d0f478ee64deddfec64b800673fd6e0c8888b079d9f3444dd96d2a98383bdbd1"},
}
diff --git a/storybook/components/avatar_group.story.exs b/storybook/components/avatar_group.story.exs
new file mode 100644
index 000000000..cc346b0ec
--- /dev/null
+++ b/storybook/components/avatar_group.story.exs
@@ -0,0 +1,196 @@
+defmodule AtomicWeb.Storybook.Components.AvatarGroup do
+ use PhoenixStorybook.Story, :component
+
+ alias AtomicWeb.Components.Avatar
+
+ def function, do: &Avatar.avatar_group/1
+
+ def variations do
+ [
+ %Variation{
+ id: :default,
+ attributes: %{
+ items:
+ Enum.reduce(1..4, [], fn _, acc ->
+ [generate_avatar_props() | acc]
+ end)
+ }
+ },
+ %VariationGroup{
+ id: :spacing,
+ description: "Different spacing",
+ variations: [
+ %Variation{
+ id: :minus_three,
+ attributes: %{
+ spacing: -3,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :minus_two,
+ attributes: %{
+ spacing: -2,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :minus_one,
+ attributes: %{
+ spacing: -1,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :zero,
+ attributes: %{
+ spacing: 0,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :one,
+ attributes: %{
+ spacing: 1,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :two,
+ attributes: %{
+ spacing: 2,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :three,
+ attributes: %{
+ spacing: 3,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ }
+ ]
+ },
+ %Variation{
+ id: :wrap,
+ attributes: %{
+ wrap: true,
+ spacing: 0,
+ avatar_class: "gap-2",
+ items:
+ Enum.reduce(1..32, [], fn _, acc ->
+ [generate_avatar_props() | acc]
+ end)
+ }
+ },
+ %VariationGroup{
+ id: :size,
+ description: "Avatar props",
+ variations: [
+ %Variation{
+ id: :size_extra_small,
+ attributes: %{
+ size: :xs,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :size_small,
+ attributes: %{
+ size: :sm,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :color_danger,
+ attributes: %{
+ color: :danger,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :color_info,
+ attributes: %{
+ color: :info,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :type_organization,
+ attributes: %{
+ type: :organization,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ },
+ %Variation{
+ id: :type_company,
+ attributes: %{
+ type: :company,
+ items: [
+ %{name: "John Doe"},
+ %{name: "Mike Smith"},
+ %{name: "Sara Johnson"}
+ ]
+ }
+ }
+ ]
+ }
+ ]
+ end
+
+ def generate_avatar_props() do
+ %{
+ name: Faker.Person.name(),
+ src:
+ "https://randomuser.me/api/portraits/#{Enum.random(["men", "women"])}/#{:rand.uniform(50)}.jpg"
+ }
+ end
+end
diff --git a/storybook/components/badge.story.exs b/storybook/components/badge.story.exs
index 458e228a0..bc1cdf8e9 100644
--- a/storybook/components/badge.story.exs
+++ b/storybook/components/badge.story.exs
@@ -294,7 +294,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
%Variation{
id: :xs,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :xs
},
slots: [
@@ -306,7 +306,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
%Variation{
id: :sm,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :sm
},
slots: [
@@ -318,7 +318,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
%Variation{
id: :md,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :md
},
slots: [
@@ -330,7 +330,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
%Variation{
id: :lg,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :lg
},
slots: [
@@ -342,7 +342,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
%Variation{
id: :xl,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :xl
},
slots: [
@@ -422,7 +422,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
id: :icon_left,
attributes: %{
size: :md,
- icon: :trophy,
+ icon: "hero-trophy",
icon_position: :left
},
slots: [
@@ -435,7 +435,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
id: :icon_right,
attributes: %{
size: :md,
- icon: :trophy,
+ icon: "hero-trophy",
icon_position: :right
},
slots: [
@@ -454,8 +454,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
id: :mini,
attributes: %{
size: :md,
- icon: :radio,
- icon_variant: :mini
+ icon: "hero-radio-mini"
},
slots: [
"""
@@ -467,8 +466,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
id: :solid,
attributes: %{
size: :md,
- icon: :radio,
- icon_variant: :solid
+ icon: "hero-radio-solid"
},
slots: [
"""
@@ -480,8 +478,7 @@ defmodule AtomicWeb.Storybook.Components.Badges do
id: :outline,
attributes: %{
size: :md,
- icon: :radio,
- icon_variant: :outline
+ icon: "hero-radio"
},
slots: [
"""
diff --git a/storybook/components/button.story.exs b/storybook/components/button.story.exs
index 1b4f1cbc5..ec7dc08b0 100644
--- a/storybook/components/button.story.exs
+++ b/storybook/components/button.story.exs
@@ -699,7 +699,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
%Variation{
id: :xs,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :xs
},
slots: [
@@ -711,7 +711,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
%Variation{
id: :sm,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :sm
},
slots: [
@@ -723,7 +723,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
%Variation{
id: :md,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :md
},
slots: [
@@ -735,7 +735,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
%Variation{
id: :lg,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :lg
},
slots: [
@@ -747,7 +747,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
%Variation{
id: :xl,
attributes: %{
- icon: :cake,
+ icon: "hero-cake",
size: :xl
},
slots: [
@@ -766,7 +766,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
id: :icon_left,
attributes: %{
size: :md,
- icon: :trophy,
+ icon: "hero-trophy",
icon_position: :left
},
slots: [
@@ -779,7 +779,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
id: :icon_right,
attributes: %{
size: :md,
- icon: :trophy,
+ icon: "hero-trophy",
icon_position: :right
},
slots: [
@@ -798,8 +798,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
id: :mini,
attributes: %{
size: :md,
- icon: :radio,
- icon_variant: :mini
+ icon: "hero-radio-mini"
},
slots: [
"""
@@ -811,8 +810,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
id: :solid,
attributes: %{
size: :md,
- icon: :radio,
- icon_variant: :solid
+ icon: "hero-radio-solid"
},
slots: [
"""
@@ -824,8 +822,7 @@ defmodule AtomicWeb.Storybook.Components.Button do
id: :outline,
attributes: %{
size: :md,
- icon: :radio,
- icon_variant: :outline
+ icon: "hero-radio"
},
slots: [
"""
diff --git a/storybook/components/calendar.story.exs b/storybook/components/calendar.story.exs
deleted file mode 100644
index f4e6679ed..000000000
--- a/storybook/components/calendar.story.exs
+++ /dev/null
@@ -1,32 +0,0 @@
-defmodule AtomicWeb.Storybook.Components.Calendar do
- use PhoenixStorybook.Story, :component
-
- alias AtomicWeb.Components.Calendar
-
- def function, do: &Calendar.calendar/1
-
- def variations do
- [
- %Variation{
- id: :default,
- attributes: %{
- current_path: "/storybook/components/calendar",
- activities: [],
- mode: "month",
- timezone: "Europe/Lisbon",
- params: %{}
- }
- },
- %Variation{
- id: :weekly,
- attributes: %{
- current_path: "/storybook/components/calendar",
- activities: [],
- mode: "week",
- timezone: "Europe/Lisbon",
- params: %{}
- }
- }
- ]
- end
-end
diff --git a/storybook/components/dropdown.story.exs b/storybook/components/dropdown.story.exs
index cb0b5976f..0136bfca0 100644
--- a/storybook/components/dropdown.story.exs
+++ b/storybook/components/dropdown.story.exs
@@ -12,9 +12,9 @@ defmodule AtomicWeb.Storybook.Components.Dropdown do
attributes: %{
id: "dropdown",
items: [
- %{name: "Profile", link: "#"},
- %{name: "Settings", link: "#"},
- %{name: "Logout", link: "#"}
+ %{name: "Profile", navigate: "#"},
+ %{name: "Settings", navigate: "#"},
+ %{name: "Logout", navigate: "#"}
],
orientation: :down
},
@@ -35,9 +35,9 @@ defmodule AtomicWeb.Storybook.Components.Dropdown do
attributes: %{
id: "dropdown-down",
items: [
- %{name: "Profile", link: "#"},
- %{name: "Settings", link: "#"},
- %{name: "Logout", link: "#"}
+ %{name: "Profile", navigate: "#"},
+ %{name: "Settings", navigate: "#"},
+ %{name: "Logout", navigate: "#"}
],
orientation: :down
},
@@ -54,9 +54,9 @@ defmodule AtomicWeb.Storybook.Components.Dropdown do
attributes: %{
id: "dropdown-top",
items: [
- %{name: "Profile", link: "#"},
- %{name: "Settings", link: "#"},
- %{name: "Logout", link: "#"}
+ %{name: "Profile", navigate: "#"},
+ %{name: "Settings", navigate: "#"},
+ %{name: "Logout", navigate: "#"}
],
orientation: :top
},
@@ -78,11 +78,10 @@ defmodule AtomicWeb.Storybook.Components.Dropdown do
id: :button,
attributes: %{
id: "dropdown-solid-icons",
- icon_variant: :solid,
items: [
- %{name: "Profile", link: "#", icon: :user},
- %{name: "Settings", link: "#", icon: :cog},
- %{name: "Logout", link: "#", icon: :arrow_left_on_rectangle}
+ %{name: "Profile", navigate: "#", icon: "hero-users-solid"},
+ %{name: "Settings", navigate: "#", icon: "hero-cog-solid"},
+ %{name: "Logout", navigate: "#", icon: "hero-arrow-left-on-rectangle-solid"}
],
orientation: :down
},
@@ -98,11 +97,10 @@ defmodule AtomicWeb.Storybook.Components.Dropdown do
id: :top,
attributes: %{
id: "dropdown-outline-icons",
- icon_variant: :outline,
items: [
- %{name: "Profile", link: "#", icon: :user},
- %{name: "Settings", link: "#", icon: :cog},
- %{name: "Logout", link: "#", icon: :arrow_left_on_rectangle}
+ %{name: "Profile", navigate: "#", icon: "hero-user"},
+ %{name: "Settings", navigate: "#", icon: "hero-cog"},
+ %{name: "Logout", navigate: "#", icon: "hero-arrow-left-on-rectangle"}
],
orientation: :top
},
diff --git a/storybook/components/icon.story.exs b/storybook/components/icon.story.exs
index 364c37b08..d89ddf180 100644
--- a/storybook/components/icon.story.exs
+++ b/storybook/components/icon.story.exs
@@ -7,7 +7,7 @@ defmodule AtomicWeb.Storybook.Components.Icon do
def template do
"""
-
+
<.lsb-variation />
"""
@@ -16,33 +16,45 @@ defmodule AtomicWeb.Storybook.Components.Icon do
def variations do
[
%Variation{
- id: :default,
+ id: :hero_outline,
+ description: "Heroicon outline",
attributes: %{
- name: :academic_cap
+ name: "hero-academic-cap"
}
},
%Variation{
- id: :outline,
- description: "Outline",
+ id: :hero_solid,
+ description: "Heroicon solid",
attributes: %{
- name: :academic_cap,
- outline: true
+ name: "hero-academic-cap-solid"
}
},
%Variation{
- id: :solid,
- description: "Solid",
+ id: :hero_mini,
+ description: "Heroicon mini",
attributes: %{
- name: :academic_cap,
- solid: true
+ name: "hero-academic-cap-mini"
}
},
%Variation{
- id: :mini,
- description: "Mini",
+ id: :hero_micro,
+ description: "Heroicon micro",
attributes: %{
- name: :academic_cap,
- mini: true
+ name: "hero-academic-cap-micro"
+ }
+ },
+ %Variation{
+ id: :tabler_outline,
+ description: "Tabler outline",
+ attributes: %{
+ name: "tabler-affiliate"
+ }
+ },
+ %Variation{
+ id: :tabler_filled,
+ description: "Tabler filled",
+ attributes: %{
+ name: "tabler-affiliate-filled"
}
}
]
diff --git a/storybook/components/map.story.exs b/storybook/components/map.story.exs
new file mode 100644
index 000000000..ae7cd4ad6
--- /dev/null
+++ b/storybook/components/map.story.exs
@@ -0,0 +1,52 @@
+defmodule AtomicWeb.Storybook.Components.Map do
+ use PhoenixStorybook.Story, :component
+
+ alias AtomicWeb.Components.Map
+
+ def function, do: &Map.map/1
+
+ def variations do
+ [
+ %Variation{
+ id: :default,
+ attributes: %{
+ location: "Centro de Estudantes de Engenharia Informática"
+ }
+ },
+ %VariationGroup{
+ id: :type,
+ description: "Type",
+ variations: [
+ %Variation{
+ id: :normal,
+ attributes: %{
+ location: "Universidade do Minho - Campus de Gualtar",
+ type: :normal
+ }
+ },
+ %Variation{
+ id: :satellite,
+ attributes: %{
+ location: "Universidade do Minho - Campus de Gualtar",
+ type: :satellite
+ }
+ }
+ ]
+ },
+ %Variation{
+ id: :zoom,
+ attributes: %{
+ location: "Núcleo de Informática da AEFEUP",
+ zoom: 7
+ }
+ },
+ %Variation{
+ id: :controls,
+ attributes: %{
+ location: "Braga, Portugal",
+ controls: true
+ }
+ }
+ ]
+ end
+end
diff --git a/storybook/components/tabs.story.exs b/storybook/components/tabs.story.exs
index 81224f96c..0d941a43d 100644
--- a/storybook/components/tabs.story.exs
+++ b/storybook/components/tabs.story.exs
@@ -67,11 +67,11 @@ defmodule AtomicWeb.Storybook.Components.Tabs do
slots: [
"""
<.tab active={true}>
- <.icon name={:home} class="h-5 w-5 mr-2" />
+ <.icon name="hero-home" class="size-5 mr-2" />
All
<.tab>
- <.icon name={:star} class="h-5 w-5 mr-2" />
+ <.icon name="hero-star" class="size-5 mr-2" />
Following
"""
diff --git a/storybook/components/unauthenticated.story.exs b/storybook/components/unauthenticated.story.exs
new file mode 100644
index 000000000..286c578a0
--- /dev/null
+++ b/storybook/components/unauthenticated.story.exs
@@ -0,0 +1,16 @@
+defmodule AtomicWeb.Storybook.Components.Unauthenticated do
+ use PhoenixStorybook.Story, :component
+
+ alias AtomicWeb.Components.Unauthenticated
+
+ def function, do: &Unauthenticated.unauthenticated_state/1
+
+ def variations do
+ [
+ %Variation{
+ id: :default,
+ attributes: %{}
+ }
+ ]
+ end
+end
diff --git a/storybook/icons.story.exs b/storybook/icons.story.exs
deleted file mode 100644
index 6ff438190..000000000
--- a/storybook/icons.story.exs
+++ /dev/null
@@ -1,27 +0,0 @@
-defmodule Storybook.Icons do
- use PhoenixStorybook.Story, :page
-
- import AtomicWeb.Components.Icon
-
- def doc, do: "Icons available to use in the application."
-
- def render(assigns) do
- ~H"""
-
-
- <%= for {name, _} <- Heroicons.__info__(:functions) |> Enum.drop(2) do %>
-
-
-
- <.icon name={name} />
-
-
:<%= name %>
-
-
<%= name |> to_string() |> String.replace("_", " ") |> String.capitalize() %>
-
- <% end %>
-
-
- """
- end
-end
diff --git a/test/atomic_web/controllers/user_auth_test.exs b/test/atomic_web/controllers/user_auth_test.exs
index c95f7500f..3eb6526e4 100644
--- a/test/atomic_web/controllers/user_auth_test.exs
+++ b/test/atomic_web/controllers/user_auth_test.exs
@@ -130,7 +130,7 @@ defmodule AtomicWeb.UserAuthTest do
test "redirects if user is not authenticated", %{conn: conn} do
conn = conn |> fetch_flash() |> UserAuth.require_authenticated_user([])
assert conn.halted
- assert redirected_to(conn) == Routes.user_session_path(conn, :new)
+ assert redirected_to(conn) == ~p"/users/log_in"
assert Phoenix.Flash.get(conn.assigns.flash, :error) ==
"You must log in to access this page."
diff --git a/test/atomic_web/controllers/user_change_password_controller_test.exs b/test/atomic_web/controllers/user_change_password_controller_test.exs
index 0b9e6bae9..ee9c2c589 100644
--- a/test/atomic_web/controllers/user_change_password_controller_test.exs
+++ b/test/atomic_web/controllers/user_change_password_controller_test.exs
@@ -8,22 +8,22 @@ defmodule AtomicWeb.UserSettingsControllerTest do
describe "GET /users/change_password" do
test "renders change password page", %{conn: conn} do
- conn = get(conn, Routes.user_change_password_path(conn, :edit))
+ conn = get(conn, ~p"/users/change_password")
response = html_response(conn, 200)
assert response =~ "Change Password"
end
test "redirects if user is not logged in" do
conn = build_conn()
- conn = get(conn, Routes.user_change_password_path(conn, :edit))
- assert redirected_to(conn) == Routes.user_session_path(conn, :new)
+ conn = get(conn, ~p"/users/change_password")
+ assert redirected_to(conn) == ~p"/users/log_in"
end
end
describe "PUT /users/change_password" do
test "updates the user password and resets tokens", %{conn: conn, user: user} do
new_password_conn =
- put(conn, Routes.user_change_password_path(conn, :update), %{
+ put(conn, ~p"/users/change_password", %{
"action" => "update_password",
"user" => %{
"current_password" => valid_user_password(),
@@ -32,7 +32,7 @@ defmodule AtomicWeb.UserSettingsControllerTest do
}
})
- assert redirected_to(new_password_conn) == Routes.user_change_password_path(conn, :edit)
+ assert redirected_to(new_password_conn) == ~p"/users/change_password"
assert get_session(new_password_conn, :user_token) != get_session(conn, :user_token)
assert Phoenix.Flash.get(new_password_conn.assigns.flash, :info) =~
@@ -43,7 +43,7 @@ defmodule AtomicWeb.UserSettingsControllerTest do
test "does not update password on invalid data", %{conn: conn} do
old_password_conn =
- put(conn, Routes.user_change_password_path(conn, :update), %{
+ put(conn, ~p"/users/change_password", %{
"action" => "update_password",
"user" => %{
"current_password" => "invalid",
diff --git a/test/atomic_web/controllers/user_confirmation_controller_test.exs b/test/atomic_web/controllers/user_confirmation_controller_test.exs
index b8ca01f15..120811301 100644
--- a/test/atomic_web/controllers/user_confirmation_controller_test.exs
+++ b/test/atomic_web/controllers/user_confirmation_controller_test.exs
@@ -11,7 +11,7 @@ defmodule AtomicWeb.UserConfirmationControllerTest do
describe "GET /users/confirm" do
test "renders the resend confirmation page", %{conn: conn} do
- conn = get(conn, Routes.user_confirmation_path(conn, :new))
+ conn = get(conn, ~p"/users/confirm")
response = html_response(conn, 200)
assert response =~ "Resend confirmation instructions
"
end
@@ -21,7 +21,7 @@ defmodule AtomicWeb.UserConfirmationControllerTest do
@tag :capture_log
test "sends a new confirmation token", %{conn: conn, user: user} do
conn =
- post(conn, Routes.user_confirmation_path(conn, :create), %{
+ post(conn, ~p"/users/confirm", %{
"user" => %{"email" => user.email}
})
@@ -34,7 +34,7 @@ defmodule AtomicWeb.UserConfirmationControllerTest do
Repo.update!(Accounts.User.confirm_changeset(user))
conn =
- post(conn, Routes.user_confirmation_path(conn, :create), %{
+ post(conn, ~p"/users/confirm", %{
"user" => %{"email" => user.email}
})
@@ -45,7 +45,7 @@ defmodule AtomicWeb.UserConfirmationControllerTest do
test "does not send confirmation token if email is invalid", %{conn: conn} do
conn =
- post(conn, Routes.user_confirmation_path(conn, :create), %{
+ post(conn, ~p"/users/confirm", %{
"user" => %{"email" => "unknown@example.com"}
})
@@ -62,7 +62,7 @@ defmodule AtomicWeb.UserConfirmationControllerTest do
Accounts.deliver_user_confirmation_instructions(user, url)
end)
- conn = get(conn, Routes.user_confirmation_path(conn, :edit, token))
+ conn = get(conn, ~p"/users/confirm/#{token}")
assert redirected_to(conn) == "/users/log_in"
assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "User confirmed successfully"
assert Accounts.get_user!(user.id).confirmed_at
@@ -70,7 +70,7 @@ defmodule AtomicWeb.UserConfirmationControllerTest do
assert Repo.all(Accounts.UserToken) == []
# When not logged in
- conn = get(conn, Routes.user_confirmation_path(conn, :edit, token))
+ conn = get(conn, ~p"/users/confirm/#{token}")
assert redirected_to(conn) == "/users/log_in"
assert Phoenix.Flash.get(conn.assigns.flash, :error) =~
@@ -80,14 +80,14 @@ defmodule AtomicWeb.UserConfirmationControllerTest do
conn =
build_conn()
|> log_in_user(user)
- |> get(Routes.user_confirmation_path(conn, :edit, token))
+ |> get(~p"/users/confirm/#{token}")
assert redirected_to(conn) == "/"
refute Phoenix.Flash.get(conn.assigns.flash, :error)
end
test "does not confirm email with invalid token", %{conn: conn, user: user} do
- conn = get(conn, Routes.user_confirmation_path(conn, :edit, "oops"))
+ conn = get(conn, ~p"/users/confirm/oops")
assert redirected_to(conn) == "/users/log_in"
assert Phoenix.Flash.get(conn.assigns.flash, :error) =~
diff --git a/test/atomic_web/controllers/user_registration_controller_test.exs b/test/atomic_web/controllers/user_registration_controller_test.exs
index 8a89dd164..a45e290d5 100644
--- a/test/atomic_web/controllers/user_registration_controller_test.exs
+++ b/test/atomic_web/controllers/user_registration_controller_test.exs
@@ -3,7 +3,7 @@ defmodule AtomicWeb.UserRegistrationControllerTest do
describe "GET /users/register" do
test "renders registration page", %{conn: conn} do
- conn = get(conn, Routes.user_registration_path(conn, :new))
+ conn = get(conn, ~p"/users/register")
response = html_response(conn, 200)
assert response =~ "Register"
assert response =~ "Login"
@@ -11,7 +11,7 @@ defmodule AtomicWeb.UserRegistrationControllerTest do
end
test "redirects if already logged in", %{conn: conn} do
- conn = conn |> log_in_user(insert(:user)) |> get(Routes.user_registration_path(conn, :new))
+ conn = conn |> log_in_user(insert(:user)) |> get(~p"/users/register")
assert redirected_to(conn) == "/"
end
end
@@ -27,7 +27,7 @@ defmodule AtomicWeb.UserRegistrationControllerTest do
}
conn =
- post(conn, Routes.user_registration_path(conn, :create), %{
+ post(conn, ~p"/users/register", %{
"user" => user_attrs
})
diff --git a/test/atomic_web/controllers/user_reset_password_controller_test.exs b/test/atomic_web/controllers/user_reset_password_controller_test.exs
index e7cb85804..5f8cc13d1 100644
--- a/test/atomic_web/controllers/user_reset_password_controller_test.exs
+++ b/test/atomic_web/controllers/user_reset_password_controller_test.exs
@@ -11,7 +11,7 @@ defmodule AtomicWeb.UserResetPasswordControllerTest do
describe "GET /users/reset_password" do
test "renders the reset password page", %{conn: conn} do
- conn = get(conn, Routes.user_reset_password_path(conn, :new))
+ conn = get(conn, ~p"/users/reset_password")
response = html_response(conn, 200)
assert response =~ "Recover Account"
end
@@ -21,7 +21,7 @@ defmodule AtomicWeb.UserResetPasswordControllerTest do
@tag :capture_log
test "sends a new reset password token given a valid email", %{conn: conn, user: user} do
conn =
- post(conn, Routes.user_reset_password_path(conn, :create), %{
+ post(conn, ~p"/users/reset_password", %{
"user" => %{"input" => user.email}
})
@@ -32,7 +32,7 @@ defmodule AtomicWeb.UserResetPasswordControllerTest do
end
test "does not send reset password token if email is invalid", %{conn: conn} do
- post(conn, Routes.user_reset_password_path(conn, :create), %{
+ post(conn, ~p"/users/reset_password", %{
"user" => %{"input" => "unknown@example.com"}
})
@@ -41,7 +41,7 @@ defmodule AtomicWeb.UserResetPasswordControllerTest do
test "sends a new reset password token given a valid slug", %{conn: conn, user: user} do
conn =
- post(conn, Routes.user_reset_password_path(conn, :create), %{
+ post(conn, ~p"/users/reset_password", %{
"user" => %{"input" => user.slug}
})
@@ -52,7 +52,7 @@ defmodule AtomicWeb.UserResetPasswordControllerTest do
end
test "does not send reset password token if slug is invalid", %{conn: conn} do
- post(conn, Routes.user_reset_password_path(conn, :create), %{
+ post(conn, ~p"/users/reset_password", %{
"user" => %{"input" => "unknown"}
})
@@ -71,7 +71,7 @@ defmodule AtomicWeb.UserResetPasswordControllerTest do
end
test "renders reset password", %{conn: conn, token: token} do
- conn = get(conn, Routes.user_reset_password_path(conn, :edit, token))
+ conn = get(conn, ~p"/users/reset_password/#{token}")
assert html_response(conn, 200) =~ "Reset Password"
end
end
@@ -88,14 +88,14 @@ defmodule AtomicWeb.UserResetPasswordControllerTest do
test "resets password once", %{conn: conn, user: user, token: token} do
conn =
- put(conn, Routes.user_reset_password_path(conn, :update, token), %{
+ put(conn, ~p"/users/reset_password/#{token}", %{
"user" => %{
"password" => "new valid password",
"password_confirmation" => "new valid password"
}
})
- assert redirected_to(conn) == Routes.user_session_path(conn, :new)
+ assert redirected_to(conn) == ~p"/users/log_in"
refute get_session(conn, :user_token)
assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Password changed successfully"
assert Accounts.get_user_by_email_and_password(user.email, "new valid password")
@@ -103,7 +103,7 @@ defmodule AtomicWeb.UserResetPasswordControllerTest do
test "does not reset password on invalid data", %{conn: conn, token: token} do
conn =
- put(conn, Routes.user_reset_password_path(conn, :update, token), %{
+ put(conn, ~p"/users/reset_password/#{token}", %{
"user" => %{
"password" => "too short",
"password_confirmation" => "does not match"
diff --git a/test/atomic_web/controllers/user_session_controller_test.exs b/test/atomic_web/controllers/user_session_controller_test.exs
index 453635d0d..ebf5a5be8 100644
--- a/test/atomic_web/controllers/user_session_controller_test.exs
+++ b/test/atomic_web/controllers/user_session_controller_test.exs
@@ -9,7 +9,7 @@ defmodule AtomicWeb.UserSessionControllerTest do
describe "GET /users/log_in" do
test "renders log in page", %{conn: conn} do
- conn = get(conn, Routes.user_session_path(conn, :new))
+ conn = get(conn, ~p"/users/log_in")
response = html_response(conn, 200)
assert response =~ "Log"
@@ -18,7 +18,7 @@ defmodule AtomicWeb.UserSessionControllerTest do
end
test "redirects if already logged in", %{conn: conn, user: user} do
- conn = conn |> log_in_user(user) |> get(Routes.user_session_path(conn, :new))
+ conn = conn |> log_in_user(user) |> get(~p"/users/log_in")
assert redirected_to(conn) == "/"
end
end
@@ -26,7 +26,7 @@ defmodule AtomicWeb.UserSessionControllerTest do
describe "POST /users/log_in" do
test "logs the user in", %{conn: conn, user: user} do
conn =
- post(conn, Routes.user_session_path(conn, :create), %{
+ post(conn, ~p"/users/log_in", %{
"user" => %{"email" => user.email, "password" => valid_user_password()}
})
@@ -41,7 +41,7 @@ defmodule AtomicWeb.UserSessionControllerTest do
test "logs the user in with remember me", %{conn: conn, user: user} do
conn =
- post(conn, Routes.user_session_path(conn, :create), %{
+ post(conn, ~p"/users/log_in", %{
"user" => %{
"email" => user.email,
"password" => valid_user_password(),
@@ -57,7 +57,7 @@ defmodule AtomicWeb.UserSessionControllerTest do
conn =
conn
|> init_test_session(user_return_to: "/foo/bar")
- |> post(Routes.user_session_path(conn, :create), %{
+ |> post(~p"/users/log_in", %{
"user" => %{
"email" => user.email,
"password" => valid_user_password()
@@ -69,7 +69,7 @@ defmodule AtomicWeb.UserSessionControllerTest do
test "emits error message with invalid credentials", %{conn: conn, user: user} do
conn =
- post(conn, Routes.user_session_path(conn, :create), %{
+ post(conn, ~p"/users/log_in", %{
"user" => %{"email" => user.email, "password" => "invalid_password"}
})
@@ -82,14 +82,14 @@ defmodule AtomicWeb.UserSessionControllerTest do
describe "DELETE /users/log_out" do
test "logs the user out", %{conn: conn, user: user} do
- conn = conn |> log_in_user(user) |> delete(Routes.user_session_path(conn, :delete))
+ conn = conn |> log_in_user(user) |> delete(~p"/users/log_out")
assert redirected_to(conn) == "/users/log_in"
refute get_session(conn, :user_token)
assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully"
end
test "succeeds even if the user is not logged in", %{conn: conn} do
- conn = delete(conn, Routes.user_session_path(conn, :delete))
+ conn = delete(conn, ~p"/users/log_out")
assert redirected_to(conn) == "/users/log_in"
refute get_session(conn, :user_token)
end
diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex
index 67463acc2..db69e95d8 100644
--- a/test/support/conn_case.ex
+++ b/test/support/conn_case.ex
@@ -21,16 +21,16 @@ defmodule AtomicWeb.ConnCase do
using do
quote do
+ # The default endpoint for testing
+ @endpoint AtomicWeb.Endpoint
+
+ use AtomicWeb, :verified_routes
+
# Import conveniences for testing with connections
import Plug.Conn
import Phoenix.ConnTest
import AtomicWeb.ConnCase
import Atomic.Factory
-
- alias AtomicWeb.Router.Helpers, as: Routes
-
- # The default endpoint for testing
- @endpoint AtomicWeb.Endpoint
end
end