diff --git a/.env.dev b/.env.dev
index d1cce53d..1a3bc234 100644
--- a/.env.dev
+++ b/.env.dev
@@ -19,10 +19,10 @@ SESSION_KEY=elixir_boilerplate
SESSION_SIGNING_SALT= # Generate salt with `mix phx.gen.secret`
# Database configuration
-# - Use `postgres://localhost/elixir_boilerplate_dev` if you have a local PostgreSQL server
-# - Use `postgres://username:password@localhost/elixir_boilerplate_dev` if you have a local PostgreSQL server with credentials
# - Use `postgres://postgres:development@localhost/elixir_boilerplate_dev` if you’re using the PostgreSQL server provided by Docker Compose
-DATABASE_URL=postgres://localhost/elixir_boilerplate_dev
+# - Use `postgres://username:password@localhost/elixir_boilerplate_dev` if you have a local PostgreSQL server with credentials
+# - Use `postgres://localhost/elixir_boilerplate_dev` if you have a local PostgreSQL server
+DATABASE_URL=postgres://postgres:development@localhost/elixir_boilerplate_dev
DATABASE_POOL_SIZE=20
DATABASE_SSL=false
diff --git a/.formatter.exs b/.formatter.exs
index 6880d76a..6bde019f 100644
--- a/.formatter.exs
+++ b/.formatter.exs
@@ -1,4 +1,7 @@
[
- inputs: ["*.exs", "{config,lib,priv,rel,test}/**/*.{ex,exs}"],
+ import_deps: [:ecto, :ecto_sql, :phoenix],
+ subdirectories: ["priv/*/migrations"],
+ plugins: [Phoenix.LiveView.HTMLFormatter],
+ inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"],
line_length: 180
]
diff --git a/.gitignore b/.gitignore
index 89a9ec10..cf5eda12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,8 +3,10 @@
/db
/deps
/*.ez
-/cover
+
+# Temporary files
/tmp
+/cover
# Generated on crash by the VM
erl_crash.dump
diff --git a/Dockerfile b/Dockerfile
index 9c5c1dd8..2791711d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -38,6 +38,9 @@ ENV MIX_ENV="prod"
COPY mix.exs mix.lock ./
RUN mix deps.get --only $MIX_ENV
+# Setup assets dependencies (Esbuild, Tailwind, etc…) so the are cached
+RUN mix assets.setup
+
# Copy compile-time config files before we compile dependencies
# to ensure any relevant config change will trigger the dependencies
# to be re-compiled.
@@ -50,8 +53,7 @@ RUN mix deps.compile
# Compile assets
COPY --from=npm-builder /app/assets assets
COPY priv priv
-RUN mix esbuild default
-RUN mix phx.digest
+RUN mix assets.deploy
# Compile code
COPY lib lib
diff --git a/Makefile b/Makefile
index 378f6c28..26bcb9ec 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,7 @@ DOCKER_IMAGE_TAG ?= $(APP_VERSION)
DOCKER_REGISTRY ?=
DOCKER_LOCAL_IMAGE:= $(APP_NAME):$(DOCKER_IMAGE_TAG)
DOCKER_REMOTE_IMAGE:= $(DOCKER_REGISTRY)/$(DOCKER_LOCAL_IMAGE)
+HEROICONS_VERSION := 2.0.18
# Linter and formatter configuration
# ----------------------------------
@@ -90,6 +91,13 @@ sync-translations: ## Synchronize translations with Accent
test: ## Run the test suite
mix test
+.PHONY: update-heroicons
+update-heroicons: ## Update Heroicons assets
+ cd assets/vendor && \
+ curl -L "https://github.com/tailwindlabs/heroicons/archive/refs/tags/v${HEROICONS_VERSION}.tar.gz" | \
+ tar -xvz --strip-components=1 heroicons-${HEROICONS_VERSION}/optimized
+
+
# Check, lint and format targets
# ------------------------------
diff --git a/assets/css/app.css b/assets/css/app.css
index 8493514d..a31e4441 100644
--- a/assets/css/app.css
+++ b/assets/css/app.css
@@ -1,22 +1,3 @@
-.home {
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- padding: 40px;
- text-align: center;
- line-height: 1.4;
-}
-
-.home a {
- display: block;
- margin: 0 0 20px;
-}
-
-.home p {
- margin: 0 0 20px;
-}
-
-.home p:last-child {
- margin-bottom: 0;
-}
+@import 'tailwindcss/base';
+@import 'tailwindcss/components';
+@import 'tailwindcss/utilities';
diff --git a/assets/js/app.js b/assets/js/app.js
index 87555754..50b37350 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -1,2 +1,34 @@
-import 'simple-css-reset/reset.css';
-import '../css/app.css';
+// Include phoenix_html to handle method=PUT/DELETE in forms and buttons.
+import 'phoenix_html';
+
+// Show progress bar on live navigation and form submits
+import topbar from 'topbar';
+
+const DELAY_IN_MILISECONDS = 200;
+
+topbar.config({barColors: {0: '#29d'}, shadowColor: 'rgba(0, 0, 0, .3)'});
+window.addEventListener('phx:page-loading-start', (_info) =>
+ topbar.delayedShow(DELAY_IN_MILISECONDS)
+);
+window.addEventListener('phx:page-loading-stop', (_info) => topbar.hide());
+
+// Establish Phoenix Socket and LiveView configuration.
+import {Socket} from 'phoenix';
+import {LiveSocket} from 'phoenix_live_view';
+
+const csrfToken = document
+ .querySelector("meta[name='csrf-token']")
+ .getAttribute('content');
+const liveSocket = new LiveSocket('/live', Socket, {
+ // eslint-disable-next-line camelcase
+ params: {_csrf_token: csrfToken}
+});
+
+// connect if there are any LiveViews on the page
+liveSocket.connect();
+
+// expose liveSocket on window for web console debug logs and latency simulation:
+// >> liveSocket.enableDebug()
+// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session
+// >> liveSocket.disableLatencySim()
+window.liveSocket = liveSocket;
diff --git a/assets/package-lock.json b/assets/package-lock.json
index 9e666fb2..15659869 100644
--- a/assets/package-lock.json
+++ b/assets/package-lock.json
@@ -8,7 +8,7 @@
"name": "elixir-boilerplate",
"version": "0.0.1",
"dependencies": {
- "simple-css-reset": "^3.0.0"
+ "topbar": "^2.0.1"
},
"devDependencies": {
"@babel/eslint-parser": "^7.22.7",
@@ -2763,11 +2763,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/simple-css-reset": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/simple-css-reset/-/simple-css-reset-3.0.0.tgz",
- "integrity": "sha512-IN1NRbrCL9pLVBFzzyXmJfkgJAS4b5VwcWFXdpEGMx9asEUZ7AbSnqbLHnB5CvCPa7+uu41aLAsguiUQQvrBmw=="
- },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -3168,6 +3163,11 @@
"node": ">=8.0"
}
},
+ "node_modules/topbar": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/topbar/-/topbar-2.0.1.tgz",
+ "integrity": "sha512-4KvcxrJuGS3wkx8QacT7dfnkwyPJOuDzGUvHO/GDZqgoEEEFKTnZqCC6PYcvuZ0OfMNdyyKeAzVB2MPk0BIe8A=="
+ },
"node_modules/trim-newlines": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
diff --git a/assets/package.json b/assets/package.json
index 8e670176..14f891fd 100644
--- a/assets/package.json
+++ b/assets/package.json
@@ -8,7 +8,7 @@
"npm": "^9.5.1"
},
"dependencies": {
- "simple-css-reset": "^3.0.0"
+ "topbar": "^2.0.1"
},
"devDependencies": {
"@babel/eslint-parser": "^7.22.7",
diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js
new file mode 100644
index 00000000..68cb4add
--- /dev/null
+++ b/assets/tailwind.config.js
@@ -0,0 +1,99 @@
+/* eslint-env node */
+
+// See the Tailwind configuration guide for advanced usage
+// https://tailwindcss.com/docs/configuration
+
+const plugin = require('tailwindcss/plugin');
+const fs = require('fs');
+const path = require('path');
+
+module.exports = {
+ content: ['./js/**/*.js', '../lib/*_web.ex', '../lib/*_web/**/*.*ex'],
+ theme: {
+ extend: {
+ colors: {
+ brand: '#FD4F00'
+ }
+ }
+ },
+ plugins: [
+ require('@tailwindcss/forms'),
+ // Allows prefixing tailwind classes with LiveView classes to add rules
+ // only when LiveView classes are applied, for example:
+ //
+ //
+ //
+ plugin(({addVariant}) =>
+ addVariant('phx-no-feedback', ['.phx-no-feedback&', '.phx-no-feedback &'])
+ ),
+ plugin(({addVariant}) =>
+ addVariant('phx-click-loading', [
+ '.phx-click-loading&',
+ '.phx-click-loading &'
+ ])
+ ),
+ plugin(({addVariant}) =>
+ addVariant('phx-submit-loading', [
+ '.phx-submit-loading&',
+ '.phx-submit-loading &'
+ ])
+ ),
+ plugin(({addVariant}) =>
+ addVariant('phx-change-loading', [
+ '.phx-change-loading&',
+ '.phx-change-loading &'
+ ])
+ ),
+ plugin(({addVariant}) =>
+ addVariant('phx-change-loading', [
+ '.phx-change-loading&',
+ '.phx-change-loading &'
+ ])
+ ),
+
+ // Embeds Heroicons (https://heroicons.com) into your app.css bundle
+ // See your `CoreComponents.icon/1` for more information.
+ plugin(({matchComponents, theme}) => {
+ const iconsDir = path.join(__dirname, './vendor/heroicons/optimized');
+ const values = {};
+ const icons = [
+ ['', '/24/outline'],
+ ['-solid', '/24/solid'],
+ ['-mini', '/20/solid']
+ ];
+
+ /* eslint max-nested-callbacks: ["error", 3] */
+ icons.forEach(([suffix, dir]) => {
+ fs.readdirSync(path.join(iconsDir, dir)).map((file) => {
+ const name = path.basename(file, '.svg') + suffix;
+
+ values[name] = {name, fullPath: path.join(iconsDir, dir, file)};
+ });
+ });
+
+ matchComponents(
+ {
+ hero: ({name, fullPath}) => {
+ const content = fs
+ .readFileSync(fullPath)
+ .toString()
+ .replace(/\r?\n|\r/g, '');
+
+ return {
+ [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`,
+ '-webkit-mask': `var(--hero-${name})`,
+ mask: `var(--hero-${name})`,
+ 'mask-repeat': 'no-repeat',
+ 'background-color': 'currentColor',
+ 'vertical-align': 'middle',
+ display: 'inline-block',
+ width: theme('spacing.5'),
+ height: theme('spacing.5')
+ };
+ }
+ },
+ {values}
+ );
+ })
+ ]
+};
diff --git a/assets/vendor/heroicons/LICENSE.md b/assets/vendor/heroicons/LICENSE.md
new file mode 100644
index 00000000..1ac3e409
--- /dev/null
+++ b/assets/vendor/heroicons/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Refactoring UI Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/assets/vendor/heroicons/UPGRADE.md b/assets/vendor/heroicons/UPGRADE.md
new file mode 100644
index 00000000..452baec1
--- /dev/null
+++ b/assets/vendor/heroicons/UPGRADE.md
@@ -0,0 +1,6 @@
+You are running heroicons v2.0.18. To upgrade in place, you can run the following command,
+where your `HERO_VSN` export is your desired version:
+
+ export HERO_VSN="2.0.18" ; \
+ curl -L "https://github.com/tailwindlabs/heroicons/archive/refs/tags/v${HERO_VSN}.tar.gz" | \
+ tar -xvz --strip-components=1 heroicons-${HERO_VSN}/optimized
\ No newline at end of file
diff --git a/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg b/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg
new file mode 100644
index 00000000..bb980e6a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg
new file mode 100644
index 00000000..13f92510
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg
new file mode 100644
index 00000000..6f75b6c0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg
new file mode 100644
index 00000000..5ccef9d5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg
new file mode 100644
index 00000000..73acbef1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box.svg
new file mode 100644
index 00000000..2205ae8d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/archive-box.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg
new file mode 100644
index 00000000..bb21a894
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg
new file mode 100644
index 00000000..f0c36246
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg
new file mode 100644
index 00000000..d9c4db03
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg
new file mode 100644
index 00000000..4e8ee0f8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg
new file mode 100644
index 00000000..65cdada0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg
new file mode 100644
index 00000000..5c3589d9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg
new file mode 100644
index 00000000..8d577b1e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg
new file mode 100644
index 00000000..8cce243b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg
new file mode 100644
index 00000000..74d0699a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg
new file mode 100644
index 00000000..c7efd307
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg
new file mode 100644
index 00000000..d2630615
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg
new file mode 100644
index 00000000..297553c9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg
new file mode 100644
index 00000000..eea945e0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg
new file mode 100644
index 00000000..193ff978
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg
new file mode 100644
index 00000000..7d3deb58
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg
new file mode 100644
index 00000000..1a31b4c0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg
new file mode 100644
index 00000000..4178da9a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg
new file mode 100644
index 00000000..27c4dffd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg
new file mode 100644
index 00000000..95cc517a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg
new file mode 100644
index 00000000..b986c6cd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg
new file mode 100644
index 00000000..0cb7e71a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg
new file mode 100644
index 00000000..16beb5e3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg
new file mode 100644
index 00000000..7fda0e59
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg
new file mode 100644
index 00000000..c93df548
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg
new file mode 100644
index 00000000..5ec7c037
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg
new file mode 100644
index 00000000..67af2cc8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg
new file mode 100644
index 00000000..21d87f2e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg
new file mode 100644
index 00000000..fb500387
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg
new file mode 100644
index 00000000..0df0ed2a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg
new file mode 100644
index 00000000..01f18a8d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg
new file mode 100644
index 00000000..4841916d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg
new file mode 100644
index 00000000..832afe55
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg
new file mode 100644
index 00000000..24b12b78
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg
new file mode 100644
index 00000000..6839676d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg
new file mode 100644
index 00000000..6691aa4d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg
new file mode 100644
index 00000000..9a6e23bf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg
new file mode 100644
index 00000000..8e65bf8f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg
new file mode 100644
index 00000000..62758077
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg
new file mode 100644
index 00000000..14e1bcd1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg
new file mode 100644
index 00000000..87616d33
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg
new file mode 100644
index 00000000..b9c43d94
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg b/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg
new file mode 100644
index 00000000..a9e960de
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/backspace.svg b/assets/vendor/heroicons/optimized/20/solid/backspace.svg
new file mode 100644
index 00000000..d3c16860
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/backward.svg b/assets/vendor/heroicons/optimized/20/solid/backward.svg
new file mode 100644
index 00000000..8d341b28
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/banknotes.svg b/assets/vendor/heroicons/optimized/20/solid/banknotes.svg
new file mode 100644
index 00000000..979c5864
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/banknotes.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-2.svg b/assets/vendor/heroicons/optimized/20/solid/bars-2.svg
new file mode 100644
index 00000000..4ce1e193
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg
new file mode 100644
index 00000000..ebf785da
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg
new file mode 100644
index 00000000..af69c3d2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg
new file mode 100644
index 00000000..ee8a526e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3.svg
new file mode 100644
index 00000000..d164cfd3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-4.svg b/assets/vendor/heroicons/optimized/20/solid/bars-4.svg
new file mode 100644
index 00000000..8e3f650c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg
new file mode 100644
index 00000000..fd8f98d1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg
new file mode 100644
index 00000000..ba77dbea
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-0.svg b/assets/vendor/heroicons/optimized/20/solid/battery-0.svg
new file mode 100644
index 00000000..2320f7ee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-100.svg b/assets/vendor/heroicons/optimized/20/solid/battery-100.svg
new file mode 100644
index 00000000..e04408fb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/battery-100.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-50.svg b/assets/vendor/heroicons/optimized/20/solid/battery-50.svg
new file mode 100644
index 00000000..e5e84984
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/battery-50.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/beaker.svg b/assets/vendor/heroicons/optimized/20/solid/beaker.svg
new file mode 100644
index 00000000..025c46ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg b/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg
new file mode 100644
index 00000000..c84dc7c5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg
new file mode 100644
index 00000000..a4296ac5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg b/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg
new file mode 100644
index 00000000..ad4f8c5f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bell.svg b/assets/vendor/heroicons/optimized/20/solid/bell.svg
new file mode 100644
index 00000000..2a81bba7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg
new file mode 100644
index 00000000..e4c2499c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bolt.svg b/assets/vendor/heroicons/optimized/20/solid/bolt.svg
new file mode 100644
index 00000000..53f4fb95
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/book-open.svg b/assets/vendor/heroicons/optimized/20/solid/book-open.svg
new file mode 100644
index 00000000..99cf0d4d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg
new file mode 100644
index 00000000..1442fd44
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg
new file mode 100644
index 00000000..849c425e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark.svg
new file mode 100644
index 00000000..a3e68dec
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/briefcase.svg b/assets/vendor/heroicons/optimized/20/solid/briefcase.svg
new file mode 100644
index 00000000..275f4b3f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/briefcase.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg b/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg
new file mode 100644
index 00000000..bc866155
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/building-library.svg b/assets/vendor/heroicons/optimized/20/solid/building-library.svg
new file mode 100644
index 00000000..610bce7e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/building-library.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg b/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg
new file mode 100644
index 00000000..b25c33dd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/building-office.svg b/assets/vendor/heroicons/optimized/20/solid/building-office.svg
new file mode 100644
index 00000000..8fb3fabe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg b/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg
new file mode 100644
index 00000000..0d7da7cb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cake.svg b/assets/vendor/heroicons/optimized/20/solid/cake.svg
new file mode 100644
index 00000000..c58d3b96
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/calculator.svg b/assets/vendor/heroicons/optimized/20/solid/calculator.svg
new file mode 100644
index 00000000..cc261609
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg b/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg
new file mode 100644
index 00000000..ded23185
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/calendar.svg b/assets/vendor/heroicons/optimized/20/solid/calendar.svg
new file mode 100644
index 00000000..dea374d2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/camera.svg b/assets/vendor/heroicons/optimized/20/solid/camera.svg
new file mode 100644
index 00000000..17356aef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg b/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg
new file mode 100644
index 00000000..6d5b9768
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg
new file mode 100644
index 00000000..c496112a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg b/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg
new file mode 100644
index 00000000..37d18c9a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg
new file mode 100644
index 00000000..fee91bec
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg
new file mode 100644
index 00000000..24de840b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg
new file mode 100644
index 00000000..7e2b06cd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg
new file mode 100644
index 00000000..fceca7fb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg
new file mode 100644
index 00000000..cd706f94
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 00000000..88d9c32f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg
new file mode 100644
index 00000000..f3b3883f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/check-badge.svg b/assets/vendor/heroicons/optimized/20/solid/check-badge.svg
new file mode 100644
index 00000000..b13190c1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/check-circle.svg b/assets/vendor/heroicons/optimized/20/solid/check-circle.svg
new file mode 100644
index 00000000..dbbc9057
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/check.svg b/assets/vendor/heroicons/optimized/20/solid/check.svg
new file mode 100644
index 00000000..d1956aa4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg
new file mode 100644
index 00000000..3c651932
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg
new file mode 100644
index 00000000..a41e6159
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg
new file mode 100644
index 00000000..d78c9326
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg
new file mode 100644
index 00000000..f7ac6684
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg
new file mode 100644
index 00000000..6b63dfb5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg
new file mode 100644
index 00000000..b484a40e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg
new file mode 100644
index 00000000..9ce37459
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg
new file mode 100644
index 00000000..2499bb1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg
new file mode 100644
index 00000000..8aaaa1f7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg b/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg
new file mode 100644
index 00000000..fae20900
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg
new file mode 100644
index 00000000..24470123
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg
new file mode 100644
index 00000000..a78b24cb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg
new file mode 100644
index 00000000..f29a4336
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard.svg
new file mode 100644
index 00000000..3b2a7ff2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clock.svg b/assets/vendor/heroicons/optimized/20/solid/clock.svg
new file mode 100644
index 00000000..d72dd622
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg
new file mode 100644
index 00000000..cb32c04e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg
new file mode 100644
index 00000000..06b2c4ad
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud.svg b/assets/vendor/heroicons/optimized/20/solid/cloud.svg
new file mode 100644
index 00000000..c5eb0c88
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg b/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg
new file mode 100644
index 00000000..e4e35307
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg b/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg
new file mode 100644
index 00000000..4adfd32f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg
new file mode 100644
index 00000000..435032f4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg
new file mode 100644
index 00000000..0450feb1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cog.svg b/assets/vendor/heroicons/optimized/20/solid/cog.svg
new file mode 100644
index 00000000..10f43b58
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cog.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/command-line.svg b/assets/vendor/heroicons/optimized/20/solid/command-line.svg
new file mode 100644
index 00000000..59cf34c9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg b/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg
new file mode 100644
index 00000000..4eeac1bd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg b/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg
new file mode 100644
index 00000000..f7c49b41
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/credit-card.svg b/assets/vendor/heroicons/optimized/20/solid/credit-card.svg
new file mode 100644
index 00000000..d650fea6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/credit-card.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg b/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg
new file mode 100644
index 00000000..bfe9daee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cube.svg b/assets/vendor/heroicons/optimized/20/solid/cube.svg
new file mode 100644
index 00000000..c3436edd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg
new file mode 100644
index 00000000..2a272603
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg b/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg
new file mode 100644
index 00000000..1b00de7d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg b/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg
new file mode 100644
index 00000000..43fda8e5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg b/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg
new file mode 100644
index 00000000..9bc57fe3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg b/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg
new file mode 100644
index 00000000..67da528d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg b/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg
new file mode 100644
index 00000000..68fca067
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg
new file mode 100644
index 00000000..d2d36a78
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg
new file mode 100644
index 00000000..89ccfda4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg
new file mode 100644
index 00000000..68fac4fd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg b/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg
new file mode 100644
index 00000000..2490e1f0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg
new file mode 100644
index 00000000..a51461d8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg
new file mode 100644
index 00000000..d55aacdb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg
new file mode 100644
index 00000000..8d5f60a7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-check.svg b/assets/vendor/heroicons/optimized/20/solid/document-check.svg
new file mode 100644
index 00000000..b28da147
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg b/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg
new file mode 100644
index 00000000..64768cfd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg
new file mode 100644
index 00000000..0dc8ebaf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-minus.svg b/assets/vendor/heroicons/optimized/20/solid/document-minus.svg
new file mode 100644
index 00000000..bf7af065
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-plus.svg b/assets/vendor/heroicons/optimized/20/solid/document-plus.svg
new file mode 100644
index 00000000..133cc82b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-text.svg b/assets/vendor/heroicons/optimized/20/solid/document-text.svg
new file mode 100644
index 00000000..f7d91ba7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document.svg b/assets/vendor/heroicons/optimized/20/solid/document.svg
new file mode 100644
index 00000000..aa7070c8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg
new file mode 100644
index 00000000..799cf88d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg
new file mode 100644
index 00000000..a82211c6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg
new file mode 100644
index 00000000..ac9c83f6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg b/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg
new file mode 100644
index 00000000..a60035bc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/envelope.svg b/assets/vendor/heroicons/optimized/20/solid/envelope.svg
new file mode 100644
index 00000000..b582b8f6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/envelope.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg b/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg
new file mode 100644
index 00000000..3cf5b596
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg
new file mode 100644
index 00000000..a6cc02fd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg b/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg
new file mode 100644
index 00000000..cce08330
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg b/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg
new file mode 100644
index 00000000..cc2e2225
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/eye.svg b/assets/vendor/heroicons/optimized/20/solid/eye.svg
new file mode 100644
index 00000000..b17cec9d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/face-frown.svg b/assets/vendor/heroicons/optimized/20/solid/face-frown.svg
new file mode 100644
index 00000000..8cbb3b32
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/face-smile.svg b/assets/vendor/heroicons/optimized/20/solid/face-smile.svg
new file mode 100644
index 00000000..434c83e6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/film.svg b/assets/vendor/heroicons/optimized/20/solid/film.svg
new file mode 100644
index 00000000..95734456
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/finger-print.svg b/assets/vendor/heroicons/optimized/20/solid/finger-print.svg
new file mode 100644
index 00000000..409d67e4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/fire.svg b/assets/vendor/heroicons/optimized/20/solid/fire.svg
new file mode 100644
index 00000000..88fb85ed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/fire.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/flag.svg b/assets/vendor/heroicons/optimized/20/solid/flag.svg
new file mode 100644
index 00000000..b790f05e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg
new file mode 100644
index 00000000..4c2a9152
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg b/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg
new file mode 100644
index 00000000..248388b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-open.svg b/assets/vendor/heroicons/optimized/20/solid/folder-open.svg
new file mode 100644
index 00000000..79d245ed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg b/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg
new file mode 100644
index 00000000..0780a546
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder.svg b/assets/vendor/heroicons/optimized/20/solid/folder.svg
new file mode 100644
index 00000000..c92e0fff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/forward.svg b/assets/vendor/heroicons/optimized/20/solid/forward.svg
new file mode 100644
index 00000000..11fd161e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/funnel.svg b/assets/vendor/heroicons/optimized/20/solid/funnel.svg
new file mode 100644
index 00000000..af3078fb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/gif.svg b/assets/vendor/heroicons/optimized/20/solid/gif.svg
new file mode 100644
index 00000000..ff1cd387
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/gift-top.svg b/assets/vendor/heroicons/optimized/20/solid/gift-top.svg
new file mode 100644
index 00000000..d650d040
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/gift-top.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/gift.svg b/assets/vendor/heroicons/optimized/20/solid/gift.svg
new file mode 100644
index 00000000..90362ab5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/gift.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg b/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg
new file mode 100644
index 00000000..c8ff599d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg b/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg
new file mode 100644
index 00000000..7de87237
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg
new file mode 100644
index 00000000..b3da4dd2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg
new file mode 100644
index 00000000..92db1e13
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg b/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg
new file mode 100644
index 00000000..caa27db9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg
new file mode 100644
index 00000000..06ffbe05
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg
new file mode 100644
index 00000000..3d67d984
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/hashtag.svg b/assets/vendor/heroicons/optimized/20/solid/hashtag.svg
new file mode 100644
index 00000000..29c9f106
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/heart.svg b/assets/vendor/heroicons/optimized/20/solid/heart.svg
new file mode 100644
index 00000000..96e63d92
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/home-modern.svg b/assets/vendor/heroicons/optimized/20/solid/home-modern.svg
new file mode 100644
index 00000000..95033a38
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/home-modern.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/home.svg b/assets/vendor/heroicons/optimized/20/solid/home.svg
new file mode 100644
index 00000000..ae2acdc9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/home.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/identification.svg b/assets/vendor/heroicons/optimized/20/solid/identification.svg
new file mode 100644
index 00000000..7a8338c6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg
new file mode 100644
index 00000000..37f464eb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg b/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg
new file mode 100644
index 00000000..b8f22d16
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox.svg b/assets/vendor/heroicons/optimized/20/solid/inbox.svg
new file mode 100644
index 00000000..87ae30d0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/information-circle.svg b/assets/vendor/heroicons/optimized/20/solid/information-circle.svg
new file mode 100644
index 00000000..25ac6448
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/key.svg b/assets/vendor/heroicons/optimized/20/solid/key.svg
new file mode 100644
index 00000000..97e8ad8c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/language.svg b/assets/vendor/heroicons/optimized/20/solid/language.svg
new file mode 100644
index 00000000..e7524be1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/language.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg b/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg
new file mode 100644
index 00000000..79134c1a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg b/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg
new file mode 100644
index 00000000..415e3749
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/link.svg b/assets/vendor/heroicons/optimized/20/solid/link.svg
new file mode 100644
index 00000000..e8204136
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/link.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg b/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg
new file mode 100644
index 00000000..36379340
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg b/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg
new file mode 100644
index 00000000..e7e1dc1d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/lock-open.svg b/assets/vendor/heroicons/optimized/20/solid/lock-open.svg
new file mode 100644
index 00000000..2ac4b148
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg
new file mode 100644
index 00000000..e025769e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg
new file mode 100644
index 00000000..a8fb7a27
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg
new file mode 100644
index 00000000..e55fc4c3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg
new file mode 100644
index 00000000..d90520a6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/map-pin.svg b/assets/vendor/heroicons/optimized/20/solid/map-pin.svg
new file mode 100644
index 00000000..7adc8a91
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/map-pin.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/map.svg b/assets/vendor/heroicons/optimized/20/solid/map.svg
new file mode 100644
index 00000000..7e25c7be
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/megaphone.svg b/assets/vendor/heroicons/optimized/20/solid/megaphone.svg
new file mode 100644
index 00000000..cf737853
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/microphone.svg b/assets/vendor/heroicons/optimized/20/solid/microphone.svg
new file mode 100644
index 00000000..635ded0d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/microphone.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg b/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg
new file mode 100644
index 00000000..5c361e2a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/minus-small.svg b/assets/vendor/heroicons/optimized/20/solid/minus-small.svg
new file mode 100644
index 00000000..4e041d3e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/minus.svg b/assets/vendor/heroicons/optimized/20/solid/minus.svg
new file mode 100644
index 00000000..6d8dd243
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/moon.svg b/assets/vendor/heroicons/optimized/20/solid/moon.svg
new file mode 100644
index 00000000..b5921106
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/musical-note.svg b/assets/vendor/heroicons/optimized/20/solid/musical-note.svg
new file mode 100644
index 00000000..c7f0aa86
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/newspaper.svg b/assets/vendor/heroicons/optimized/20/solid/newspaper.svg
new file mode 100644
index 00000000..be785e38
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/newspaper.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg b/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg
new file mode 100644
index 00000000..8463da2b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg b/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg
new file mode 100644
index 00000000..c2db8c01
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg b/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg
new file mode 100644
index 00000000..35315adb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg b/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg
new file mode 100644
index 00000000..b38155ea
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg b/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg
new file mode 100644
index 00000000..732530a1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/pause.svg b/assets/vendor/heroicons/optimized/20/solid/pause.svg
new file mode 100644
index 00000000..b6544ba2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg b/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg
new file mode 100644
index 00000000..129ee44d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/pencil.svg b/assets/vendor/heroicons/optimized/20/solid/pencil.svg
new file mode 100644
index 00000000..fa504983
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg
new file mode 100644
index 00000000..feeb6366
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg
new file mode 100644
index 00000000..e1d93310
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg
new file mode 100644
index 00000000..6f1fd361
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/phone.svg b/assets/vendor/heroicons/optimized/20/solid/phone.svg
new file mode 100644
index 00000000..5fd57fcf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/photo.svg b/assets/vendor/heroicons/optimized/20/solid/photo.svg
new file mode 100644
index 00000000..db063d33
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/play-circle.svg b/assets/vendor/heroicons/optimized/20/solid/play-circle.svg
new file mode 100644
index 00000000..d1587b77
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/play-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/play-pause.svg b/assets/vendor/heroicons/optimized/20/solid/play-pause.svg
new file mode 100644
index 00000000..cdfa63b2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/play.svg b/assets/vendor/heroicons/optimized/20/solid/play.svg
new file mode 100644
index 00000000..2cd53e17
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg b/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg
new file mode 100644
index 00000000..3925a14f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/plus-small.svg b/assets/vendor/heroicons/optimized/20/solid/plus-small.svg
new file mode 100644
index 00000000..eb225984
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/plus.svg b/assets/vendor/heroicons/optimized/20/solid/plus.svg
new file mode 100644
index 00000000..218ab936
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/power.svg b/assets/vendor/heroicons/optimized/20/solid/power.svg
new file mode 100644
index 00000000..16038206
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg
new file mode 100644
index 00000000..e1a4242b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg
new file mode 100644
index 00000000..2e9281fc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/printer.svg b/assets/vendor/heroicons/optimized/20/solid/printer.svg
new file mode 100644
index 00000000..81d93dc2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg b/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg
new file mode 100644
index 00000000..e5329e52
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/qr-code.svg b/assets/vendor/heroicons/optimized/20/solid/qr-code.svg
new file mode 100644
index 00000000..d5daf2a9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/qr-code.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg b/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg
new file mode 100644
index 00000000..893dab55
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/queue-list.svg b/assets/vendor/heroicons/optimized/20/solid/queue-list.svg
new file mode 100644
index 00000000..91f5b573
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/radio.svg b/assets/vendor/heroicons/optimized/20/solid/radio.svg
new file mode 100644
index 00000000..9a12c8b7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg b/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg
new file mode 100644
index 00000000..1a8f2544
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg b/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg
new file mode 100644
index 00000000..a134c56c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg b/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg
new file mode 100644
index 00000000..599d5f4b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg b/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg
new file mode 100644
index 00000000..94b56547
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg b/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg
new file mode 100644
index 00000000..b97e89ed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/rss.svg b/assets/vendor/heroicons/optimized/20/solid/rss.svg
new file mode 100644
index 00000000..538ae9aa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/rss.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/scale.svg b/assets/vendor/heroicons/optimized/20/solid/scale.svg
new file mode 100644
index 00000000..60b0ed93
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/scissors.svg b/assets/vendor/heroicons/optimized/20/solid/scissors.svg
new file mode 100644
index 00000000..3122658b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/scissors.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/server-stack.svg b/assets/vendor/heroicons/optimized/20/solid/server-stack.svg
new file mode 100644
index 00000000..2247dbe8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/server-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/server.svg b/assets/vendor/heroicons/optimized/20/solid/server.svg
new file mode 100644
index 00000000..6c8899ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/server.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/share.svg b/assets/vendor/heroicons/optimized/20/solid/share.svg
new file mode 100644
index 00000000..e5aafee5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/shield-check.svg b/assets/vendor/heroicons/optimized/20/solid/shield-check.svg
new file mode 100644
index 00000000..a8572d4a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg b/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg
new file mode 100644
index 00000000..8562de40
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg b/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg
new file mode 100644
index 00000000..e70c815d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg b/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg
new file mode 100644
index 00000000..855a631e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg b/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg
new file mode 100644
index 00000000..822179a1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/signal.svg b/assets/vendor/heroicons/optimized/20/solid/signal.svg
new file mode 100644
index 00000000..75392048
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/signal.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/sparkles.svg b/assets/vendor/heroicons/optimized/20/solid/sparkles.svg
new file mode 100644
index 00000000..a247c949
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg b/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg
new file mode 100644
index 00000000..2e6b3e0c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg
new file mode 100644
index 00000000..0c39f61f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg b/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg
new file mode 100644
index 00000000..177d43a7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg
new file mode 100644
index 00000000..7d6b44f4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg b/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg
new file mode 100644
index 00000000..47c18173
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg b/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg
new file mode 100644
index 00000000..019eb371
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/star.svg b/assets/vendor/heroicons/optimized/20/solid/star.svg
new file mode 100644
index 00000000..a8703651
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg b/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg
new file mode 100644
index 00000000..9167a644
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/stop.svg b/assets/vendor/heroicons/optimized/20/solid/stop.svg
new file mode 100644
index 00000000..b0e40dbf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/sun.svg b/assets/vendor/heroicons/optimized/20/solid/sun.svg
new file mode 100644
index 00000000..449e36c4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/swatch.svg b/assets/vendor/heroicons/optimized/20/solid/swatch.svg
new file mode 100644
index 00000000..10895484
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/swatch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/table-cells.svg b/assets/vendor/heroicons/optimized/20/solid/table-cells.svg
new file mode 100644
index 00000000..aa8eacd7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/tag.svg b/assets/vendor/heroicons/optimized/20/solid/tag.svg
new file mode 100644
index 00000000..d6c9c8b8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/tag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/ticket.svg b/assets/vendor/heroicons/optimized/20/solid/ticket.svg
new file mode 100644
index 00000000..7d04b01e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/trash.svg b/assets/vendor/heroicons/optimized/20/solid/trash.svg
new file mode 100644
index 00000000..16bd5c63
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/trophy.svg b/assets/vendor/heroicons/optimized/20/solid/trophy.svg
new file mode 100644
index 00000000..e2ebdaff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/truck.svg b/assets/vendor/heroicons/optimized/20/solid/truck.svg
new file mode 100644
index 00000000..a50085ac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/truck.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/tv.svg b/assets/vendor/heroicons/optimized/20/solid/tv.svg
new file mode 100644
index 00000000..b0c7209e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/tv.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user-circle.svg b/assets/vendor/heroicons/optimized/20/solid/user-circle.svg
new file mode 100644
index 00000000..abd6c98d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user-group.svg b/assets/vendor/heroicons/optimized/20/solid/user-group.svg
new file mode 100644
index 00000000..dc837361
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user-minus.svg b/assets/vendor/heroicons/optimized/20/solid/user-minus.svg
new file mode 100644
index 00000000..b092b774
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user-plus.svg b/assets/vendor/heroicons/optimized/20/solid/user-plus.svg
new file mode 100644
index 00000000..afd59650
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user.svg b/assets/vendor/heroicons/optimized/20/solid/user.svg
new file mode 100644
index 00000000..4d9b2ee0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/users.svg b/assets/vendor/heroicons/optimized/20/solid/users.svg
new file mode 100644
index 00000000..43526a61
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/variable.svg b/assets/vendor/heroicons/optimized/20/solid/variable.svg
new file mode 100644
index 00000000..3460817a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg b/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg
new file mode 100644
index 00000000..95b94132
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/video-camera.svg b/assets/vendor/heroicons/optimized/20/solid/video-camera.svg
new file mode 100644
index 00000000..4d22f168
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/view-columns.svg b/assets/vendor/heroicons/optimized/20/solid/view-columns.svg
new file mode 100644
index 00000000..1111492e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg
new file mode 100644
index 00000000..5cfe9fbb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/wallet.svg b/assets/vendor/heroicons/optimized/20/solid/wallet.svg
new file mode 100644
index 00000000..6ce8050e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/wifi.svg b/assets/vendor/heroicons/optimized/20/solid/wifi.svg
new file mode 100644
index 00000000..f3c7118d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/window.svg b/assets/vendor/heroicons/optimized/20/solid/window.svg
new file mode 100644
index 00000000..9110a2b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg
new file mode 100644
index 00000000..2ad879f5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/wrench.svg b/assets/vendor/heroicons/optimized/20/solid/wrench.svg
new file mode 100644
index 00000000..2643e00e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/wrench.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/x-circle.svg b/assets/vendor/heroicons/optimized/20/solid/x-circle.svg
new file mode 100644
index 00000000..a660014f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/x-mark.svg
new file mode 100644
index 00000000..0635bacf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg b/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg
new file mode 100644
index 00000000..fc181078
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg
new file mode 100644
index 00000000..e859e5df
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg
new file mode 100644
index 00000000..61538090
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg
new file mode 100644
index 00000000..1a0a8303
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg
new file mode 100644
index 00000000..49bd0879
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box.svg
new file mode 100644
index 00000000..704f3536
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/archive-box.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg
new file mode 100644
index 00000000..248b0e85
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg
new file mode 100644
index 00000000..262b5ffe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg
new file mode 100644
index 00000000..42a5b84b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg
new file mode 100644
index 00000000..da1b827f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg
new file mode 100644
index 00000000..9cc7a30f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg
new file mode 100644
index 00000000..a77546c8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg
new file mode 100644
index 00000000..b5b04fd1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg
new file mode 100644
index 00000000..849cc5f2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg
new file mode 100644
index 00000000..0d6a3cce
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg
new file mode 100644
index 00000000..49f15d4a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg
new file mode 100644
index 00000000..eb7a92b5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg
new file mode 100644
index 00000000..d3e90057
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg
new file mode 100644
index 00000000..413d6b55
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg
new file mode 100644
index 00000000..fb029f44
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg
new file mode 100644
index 00000000..0cfe39e3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg
new file mode 100644
index 00000000..7da4fd2c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg
new file mode 100644
index 00000000..e7bcb80f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg
new file mode 100644
index 00000000..2b49becb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg
new file mode 100644
index 00000000..8527a52f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg
new file mode 100644
index 00000000..1f1a210e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg
new file mode 100644
index 00000000..778cb172
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg
new file mode 100644
index 00000000..1b5fc645
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg
new file mode 100644
index 00000000..4ed197ea
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg
new file mode 100644
index 00000000..c4a9239c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg
new file mode 100644
index 00000000..aebbb181
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg
new file mode 100644
index 00000000..868f3d3b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg
new file mode 100644
index 00000000..51340d6a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg
new file mode 100644
index 00000000..ba4e54e2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg
new file mode 100644
index 00000000..0d4d8236
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg
new file mode 100644
index 00000000..2c38ea01
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg
new file mode 100644
index 00000000..0b7a3727
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg
new file mode 100644
index 00000000..448b853e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg
new file mode 100644
index 00000000..e2696241
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg
new file mode 100644
index 00000000..51f99291
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg
new file mode 100644
index 00000000..b8f240ed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg
new file mode 100644
index 00000000..ece50919
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg
new file mode 100644
index 00000000..b76c54b1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg
new file mode 100644
index 00000000..0a8872d7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg
new file mode 100644
index 00000000..936ac458
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg
new file mode 100644
index 00000000..18890f31
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg
new file mode 100644
index 00000000..da4cdf3e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg b/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg
new file mode 100644
index 00000000..fe2f6442
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/backspace.svg b/assets/vendor/heroicons/optimized/24/outline/backspace.svg
new file mode 100644
index 00000000..f76c5df1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/backward.svg b/assets/vendor/heroicons/optimized/24/outline/backward.svg
new file mode 100644
index 00000000..fb1da49d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/banknotes.svg b/assets/vendor/heroicons/optimized/24/outline/banknotes.svg
new file mode 100644
index 00000000..0603b0dd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/banknotes.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-2.svg b/assets/vendor/heroicons/optimized/24/outline/bars-2.svg
new file mode 100644
index 00000000..9c49ca27
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg
new file mode 100644
index 00000000..e23bbc35
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg
new file mode 100644
index 00000000..a0f683d9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg
new file mode 100644
index 00000000..a8e83e1e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3.svg
new file mode 100644
index 00000000..a7cf3205
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-4.svg b/assets/vendor/heroicons/optimized/24/outline/bars-4.svg
new file mode 100644
index 00000000..f34bddfb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg
new file mode 100644
index 00000000..200fd3af
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg
new file mode 100644
index 00000000..d88bf4e5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-0.svg b/assets/vendor/heroicons/optimized/24/outline/battery-0.svg
new file mode 100644
index 00000000..fd2aa9da
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-100.svg b/assets/vendor/heroicons/optimized/24/outline/battery-100.svg
new file mode 100644
index 00000000..ba012c68
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/battery-100.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-50.svg b/assets/vendor/heroicons/optimized/24/outline/battery-50.svg
new file mode 100644
index 00000000..f6f98388
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/battery-50.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/beaker.svg b/assets/vendor/heroicons/optimized/24/outline/beaker.svg
new file mode 100644
index 00000000..2d143fda
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg b/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg
new file mode 100644
index 00000000..c4af4271
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg
new file mode 100644
index 00000000..2df7520f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg b/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg
new file mode 100644
index 00000000..117de29a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bell.svg b/assets/vendor/heroicons/optimized/24/outline/bell.svg
new file mode 100644
index 00000000..63ab1532
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg
new file mode 100644
index 00000000..13af3465
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bolt.svg b/assets/vendor/heroicons/optimized/24/outline/bolt.svg
new file mode 100644
index 00000000..5e629feb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/book-open.svg b/assets/vendor/heroicons/optimized/24/outline/book-open.svg
new file mode 100644
index 00000000..a4153b62
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg
new file mode 100644
index 00000000..f3ae625d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg
new file mode 100644
index 00000000..00e5cc37
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark.svg
new file mode 100644
index 00000000..6d06e4f3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/briefcase.svg b/assets/vendor/heroicons/optimized/24/outline/briefcase.svg
new file mode 100644
index 00000000..adab6ff5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/briefcase.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg b/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg
new file mode 100644
index 00000000..ac04fad8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/building-library.svg b/assets/vendor/heroicons/optimized/24/outline/building-library.svg
new file mode 100644
index 00000000..4e2e1dae
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/building-library.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg b/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg
new file mode 100644
index 00000000..45e063cd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/building-office.svg b/assets/vendor/heroicons/optimized/24/outline/building-office.svg
new file mode 100644
index 00000000..0efd9823
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg b/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg
new file mode 100644
index 00000000..31fca555
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cake.svg b/assets/vendor/heroicons/optimized/24/outline/cake.svg
new file mode 100644
index 00000000..a603e90a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/calculator.svg b/assets/vendor/heroicons/optimized/24/outline/calculator.svg
new file mode 100644
index 00000000..d97740ee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg b/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg
new file mode 100644
index 00000000..64b5f8f8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/calendar.svg b/assets/vendor/heroicons/optimized/24/outline/calendar.svg
new file mode 100644
index 00000000..5e449117
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/camera.svg b/assets/vendor/heroicons/optimized/24/outline/camera.svg
new file mode 100644
index 00000000..b8bdae37
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/camera.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg b/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg
new file mode 100644
index 00000000..d7fa42c5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg
new file mode 100644
index 00000000..27f20fac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg b/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg
new file mode 100644
index 00000000..fa51c167
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg
new file mode 100644
index 00000000..4bc306e1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg
new file mode 100644
index 00000000..d59d02aa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg
new file mode 100644
index 00000000..9a0ec734
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg
new file mode 100644
index 00000000..4d366b8d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg
new file mode 100644
index 00000000..a41bf1ed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 00000000..83d17516
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg
new file mode 100644
index 00000000..d0d0d899
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/check-badge.svg b/assets/vendor/heroicons/optimized/24/outline/check-badge.svg
new file mode 100644
index 00000000..8d6b79ad
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/check-circle.svg b/assets/vendor/heroicons/optimized/24/outline/check-circle.svg
new file mode 100644
index 00000000..d4471d6b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/check.svg b/assets/vendor/heroicons/optimized/24/outline/check.svg
new file mode 100644
index 00000000..7644e301
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg
new file mode 100644
index 00000000..d7e93704
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg
new file mode 100644
index 00000000..95834afa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg
new file mode 100644
index 00000000..37a809d7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg
new file mode 100644
index 00000000..51826916
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg
new file mode 100644
index 00000000..b38efa5b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg
new file mode 100644
index 00000000..73fe99af
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg
new file mode 100644
index 00000000..1e31bfdc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg
new file mode 100644
index 00000000..27b1d4f5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg
new file mode 100644
index 00000000..713a6f1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg b/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg
new file mode 100644
index 00000000..b8fb7699
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg
new file mode 100644
index 00000000..7bb03a16
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg
new file mode 100644
index 00000000..46707777
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg
new file mode 100644
index 00000000..783a3337
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard.svg
new file mode 100644
index 00000000..ad9b943b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clock.svg b/assets/vendor/heroicons/optimized/24/outline/clock.svg
new file mode 100644
index 00000000..337196cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg
new file mode 100644
index 00000000..7074791f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg
new file mode 100644
index 00000000..8b450812
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud.svg b/assets/vendor/heroicons/optimized/24/outline/cloud.svg
new file mode 100644
index 00000000..55fd7250
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg b/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg
new file mode 100644
index 00000000..8308024b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg b/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg
new file mode 100644
index 00000000..3361add4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg
new file mode 100644
index 00000000..d5856458
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg
new file mode 100644
index 00000000..28f85f42
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cog.svg b/assets/vendor/heroicons/optimized/24/outline/cog.svg
new file mode 100644
index 00000000..f2bad9ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cog.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/command-line.svg b/assets/vendor/heroicons/optimized/24/outline/command-line.svg
new file mode 100644
index 00000000..baaf3629
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg b/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg
new file mode 100644
index 00000000..fb9a6e0d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg b/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg
new file mode 100644
index 00000000..cabc435a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/credit-card.svg b/assets/vendor/heroicons/optimized/24/outline/credit-card.svg
new file mode 100644
index 00000000..3c0c917d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/credit-card.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg b/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg
new file mode 100644
index 00000000..5a8adac8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cube.svg b/assets/vendor/heroicons/optimized/24/outline/cube.svg
new file mode 100644
index 00000000..70b0091a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg
new file mode 100644
index 00000000..7f2fca3f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg b/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg
new file mode 100644
index 00000000..d376f4c9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg b/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg
new file mode 100644
index 00000000..8b9dd2e4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg b/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg
new file mode 100644
index 00000000..8e7c52d2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg b/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg
new file mode 100644
index 00000000..078bf058
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg b/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg
new file mode 100644
index 00000000..254011af
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg
new file mode 100644
index 00000000..c29d0fd5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg
new file mode 100644
index 00000000..500a04cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg
new file mode 100644
index 00000000..1caf9112
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg b/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg
new file mode 100644
index 00000000..7090ecbe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg
new file mode 100644
index 00000000..04f6e650
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg
new file mode 100644
index 00000000..c0ca80ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg
new file mode 100644
index 00000000..2ffa3fed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-check.svg b/assets/vendor/heroicons/optimized/24/outline/document-check.svg
new file mode 100644
index 00000000..5ea7d9c6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg b/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg
new file mode 100644
index 00000000..acc64640
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg
new file mode 100644
index 00000000..f94eff6c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-minus.svg b/assets/vendor/heroicons/optimized/24/outline/document-minus.svg
new file mode 100644
index 00000000..173cb1f3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-plus.svg b/assets/vendor/heroicons/optimized/24/outline/document-plus.svg
new file mode 100644
index 00000000..9ec31ad5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-text.svg b/assets/vendor/heroicons/optimized/24/outline/document-text.svg
new file mode 100644
index 00000000..cd77136f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document.svg b/assets/vendor/heroicons/optimized/24/outline/document.svg
new file mode 100644
index 00000000..863a8aa1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg
new file mode 100644
index 00000000..09aac530
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg
new file mode 100644
index 00000000..7541be5a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg
new file mode 100644
index 00000000..4676cf3c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg b/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg
new file mode 100644
index 00000000..ff9dccde
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/envelope.svg b/assets/vendor/heroicons/optimized/24/outline/envelope.svg
new file mode 100644
index 00000000..ae8ff727
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/envelope.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg b/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg
new file mode 100644
index 00000000..25ef36fa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg
new file mode 100644
index 00000000..c9742f1c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg b/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg
new file mode 100644
index 00000000..c7263e18
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg b/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg
new file mode 100644
index 00000000..072c9f2e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/eye.svg b/assets/vendor/heroicons/optimized/24/outline/eye.svg
new file mode 100644
index 00000000..2a54d63d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/face-frown.svg b/assets/vendor/heroicons/optimized/24/outline/face-frown.svg
new file mode 100644
index 00000000..ba0cab32
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/face-smile.svg b/assets/vendor/heroicons/optimized/24/outline/face-smile.svg
new file mode 100644
index 00000000..5246524e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/film.svg b/assets/vendor/heroicons/optimized/24/outline/film.svg
new file mode 100644
index 00000000..d76e5941
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/finger-print.svg b/assets/vendor/heroicons/optimized/24/outline/finger-print.svg
new file mode 100644
index 00000000..0c1eeb27
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/fire.svg b/assets/vendor/heroicons/optimized/24/outline/fire.svg
new file mode 100644
index 00000000..54c97480
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/fire.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/flag.svg b/assets/vendor/heroicons/optimized/24/outline/flag.svg
new file mode 100644
index 00000000..dff4126c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg
new file mode 100644
index 00000000..96290cd0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg b/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg
new file mode 100644
index 00000000..824cb0e1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-open.svg b/assets/vendor/heroicons/optimized/24/outline/folder-open.svg
new file mode 100644
index 00000000..0721502a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg b/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg
new file mode 100644
index 00000000..3df62d24
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder.svg b/assets/vendor/heroicons/optimized/24/outline/folder.svg
new file mode 100644
index 00000000..30548192
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/forward.svg b/assets/vendor/heroicons/optimized/24/outline/forward.svg
new file mode 100644
index 00000000..cc80dc93
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/funnel.svg b/assets/vendor/heroicons/optimized/24/outline/funnel.svg
new file mode 100644
index 00000000..338fa522
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/gif.svg b/assets/vendor/heroicons/optimized/24/outline/gif.svg
new file mode 100644
index 00000000..ba8a1867
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/gift-top.svg b/assets/vendor/heroicons/optimized/24/outline/gift-top.svg
new file mode 100644
index 00000000..055b6d2d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/gift-top.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/gift.svg b/assets/vendor/heroicons/optimized/24/outline/gift.svg
new file mode 100644
index 00000000..54458156
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/gift.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg b/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg
new file mode 100644
index 00000000..a605be00
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg b/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg
new file mode 100644
index 00000000..5d1a5cb7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg
new file mode 100644
index 00000000..f4898fa6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg
new file mode 100644
index 00000000..c8f797dc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg b/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg
new file mode 100644
index 00000000..859f1abc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg
new file mode 100644
index 00000000..c588a532
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg
new file mode 100644
index 00000000..66ca9c32
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/hashtag.svg b/assets/vendor/heroicons/optimized/24/outline/hashtag.svg
new file mode 100644
index 00000000..3ae10603
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/heart.svg b/assets/vendor/heroicons/optimized/24/outline/heart.svg
new file mode 100644
index 00000000..10847682
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/home-modern.svg b/assets/vendor/heroicons/optimized/24/outline/home-modern.svg
new file mode 100644
index 00000000..20f4e2c2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/home-modern.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/home.svg b/assets/vendor/heroicons/optimized/24/outline/home.svg
new file mode 100644
index 00000000..95433758
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/home.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/identification.svg b/assets/vendor/heroicons/optimized/24/outline/identification.svg
new file mode 100644
index 00000000..bfd302a1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg
new file mode 100644
index 00000000..db6ebda2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg b/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg
new file mode 100644
index 00000000..6c1e55c7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox.svg b/assets/vendor/heroicons/optimized/24/outline/inbox.svg
new file mode 100644
index 00000000..56b35cb0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/information-circle.svg b/assets/vendor/heroicons/optimized/24/outline/information-circle.svg
new file mode 100644
index 00000000..c7fa9d70
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/key.svg b/assets/vendor/heroicons/optimized/24/outline/key.svg
new file mode 100644
index 00000000..e9684cd1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/language.svg b/assets/vendor/heroicons/optimized/24/outline/language.svg
new file mode 100644
index 00000000..0c606ef3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/language.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg b/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg
new file mode 100644
index 00000000..1660e991
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg b/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg
new file mode 100644
index 00000000..e3f2d9a7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/link.svg b/assets/vendor/heroicons/optimized/24/outline/link.svg
new file mode 100644
index 00000000..916a7038
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/link.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg b/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg
new file mode 100644
index 00000000..14745732
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg b/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg
new file mode 100644
index 00000000..08b23c99
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/lock-open.svg b/assets/vendor/heroicons/optimized/24/outline/lock-open.svg
new file mode 100644
index 00000000..c5595dde
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg
new file mode 100644
index 00000000..e71f8bff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg
new file mode 100644
index 00000000..6bd11c16
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg
new file mode 100644
index 00000000..5dab7de0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg
new file mode 100644
index 00000000..7cff88fc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/map-pin.svg b/assets/vendor/heroicons/optimized/24/outline/map-pin.svg
new file mode 100644
index 00000000..1f272f4e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/map-pin.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/map.svg b/assets/vendor/heroicons/optimized/24/outline/map.svg
new file mode 100644
index 00000000..f96c988a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/megaphone.svg b/assets/vendor/heroicons/optimized/24/outline/megaphone.svg
new file mode 100644
index 00000000..ec195081
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/microphone.svg b/assets/vendor/heroicons/optimized/24/outline/microphone.svg
new file mode 100644
index 00000000..670b34f2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/microphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg b/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg
new file mode 100644
index 00000000..b9630fc6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/minus-small.svg b/assets/vendor/heroicons/optimized/24/outline/minus-small.svg
new file mode 100644
index 00000000..3e1a8b75
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/minus.svg b/assets/vendor/heroicons/optimized/24/outline/minus.svg
new file mode 100644
index 00000000..781994c3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/moon.svg b/assets/vendor/heroicons/optimized/24/outline/moon.svg
new file mode 100644
index 00000000..91501fd9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/musical-note.svg b/assets/vendor/heroicons/optimized/24/outline/musical-note.svg
new file mode 100644
index 00000000..c0667fc7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/newspaper.svg b/assets/vendor/heroicons/optimized/24/outline/newspaper.svg
new file mode 100644
index 00000000..0a4ac573
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/newspaper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg b/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg
new file mode 100644
index 00000000..19b0bd0a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg b/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg
new file mode 100644
index 00000000..b66098ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg b/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg
new file mode 100644
index 00000000..32da43ea
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg b/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg
new file mode 100644
index 00000000..1d78d81d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg b/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg
new file mode 100644
index 00000000..a9a9e935
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/pause.svg b/assets/vendor/heroicons/optimized/24/outline/pause.svg
new file mode 100644
index 00000000..9843f7be
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg b/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg
new file mode 100644
index 00000000..3de435b8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/pencil.svg b/assets/vendor/heroicons/optimized/24/outline/pencil.svg
new file mode 100644
index 00000000..0c8759a9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg
new file mode 100644
index 00000000..b1b2e611
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg
new file mode 100644
index 00000000..faaf659b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg
new file mode 100644
index 00000000..0b8de6db
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/phone.svg b/assets/vendor/heroicons/optimized/24/outline/phone.svg
new file mode 100644
index 00000000..6f73149e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/photo.svg b/assets/vendor/heroicons/optimized/24/outline/photo.svg
new file mode 100644
index 00000000..6982a115
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/play-circle.svg b/assets/vendor/heroicons/optimized/24/outline/play-circle.svg
new file mode 100644
index 00000000..3a2fa635
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/play-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/play-pause.svg b/assets/vendor/heroicons/optimized/24/outline/play-pause.svg
new file mode 100644
index 00000000..4ce4e55e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/play.svg b/assets/vendor/heroicons/optimized/24/outline/play.svg
new file mode 100644
index 00000000..c0ae6ded
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg b/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg
new file mode 100644
index 00000000..4da4d1f1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/plus-small.svg b/assets/vendor/heroicons/optimized/24/outline/plus-small.svg
new file mode 100644
index 00000000..991ed599
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/plus.svg b/assets/vendor/heroicons/optimized/24/outline/plus.svg
new file mode 100644
index 00000000..04808173
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/power.svg b/assets/vendor/heroicons/optimized/24/outline/power.svg
new file mode 100644
index 00000000..c4b2706a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg
new file mode 100644
index 00000000..87d8a6dc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg
new file mode 100644
index 00000000..2262e1f5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/printer.svg b/assets/vendor/heroicons/optimized/24/outline/printer.svg
new file mode 100644
index 00000000..6f7c5fac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg b/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg
new file mode 100644
index 00000000..13aa1a53
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/qr-code.svg b/assets/vendor/heroicons/optimized/24/outline/qr-code.svg
new file mode 100644
index 00000000..662a4bd2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/qr-code.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg b/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg
new file mode 100644
index 00000000..9fb25421
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/queue-list.svg b/assets/vendor/heroicons/optimized/24/outline/queue-list.svg
new file mode 100644
index 00000000..91c3f112
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/radio.svg b/assets/vendor/heroicons/optimized/24/outline/radio.svg
new file mode 100644
index 00000000..f9c177ae
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg b/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg
new file mode 100644
index 00000000..2d192559
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg b/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg
new file mode 100644
index 00000000..dc569fc1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg b/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg
new file mode 100644
index 00000000..b1849648
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg b/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg
new file mode 100644
index 00000000..e1c0272c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg b/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg
new file mode 100644
index 00000000..6400ee8f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/rss.svg b/assets/vendor/heroicons/optimized/24/outline/rss.svg
new file mode 100644
index 00000000..1c36b21f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/rss.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/scale.svg b/assets/vendor/heroicons/optimized/24/outline/scale.svg
new file mode 100644
index 00000000..500e3c66
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/scissors.svg b/assets/vendor/heroicons/optimized/24/outline/scissors.svg
new file mode 100644
index 00000000..a23dc816
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/scissors.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/server-stack.svg b/assets/vendor/heroicons/optimized/24/outline/server-stack.svg
new file mode 100644
index 00000000..3b7fe323
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/server-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/server.svg b/assets/vendor/heroicons/optimized/24/outline/server.svg
new file mode 100644
index 00000000..c1675f34
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/server.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/share.svg b/assets/vendor/heroicons/optimized/24/outline/share.svg
new file mode 100644
index 00000000..125b6d1a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/shield-check.svg b/assets/vendor/heroicons/optimized/24/outline/shield-check.svg
new file mode 100644
index 00000000..f9fa2b9f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg b/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg
new file mode 100644
index 00000000..b52a2ff1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg b/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg
new file mode 100644
index 00000000..f5a51bde
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg b/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg
new file mode 100644
index 00000000..661477ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg b/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg
new file mode 100644
index 00000000..62992c3e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/signal.svg b/assets/vendor/heroicons/optimized/24/outline/signal.svg
new file mode 100644
index 00000000..56114d3a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/signal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/sparkles.svg b/assets/vendor/heroicons/optimized/24/outline/sparkles.svg
new file mode 100644
index 00000000..5a78b096
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg b/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg
new file mode 100644
index 00000000..1b6dde78
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg
new file mode 100644
index 00000000..427e21e5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg b/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg
new file mode 100644
index 00000000..bc5e253b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg
new file mode 100644
index 00000000..8af2704a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg b/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg
new file mode 100644
index 00000000..601366d5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg b/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg
new file mode 100644
index 00000000..b8033c11
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/star.svg b/assets/vendor/heroicons/optimized/24/outline/star.svg
new file mode 100644
index 00000000..98aa481a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg b/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg
new file mode 100644
index 00000000..b570e8e3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/stop.svg b/assets/vendor/heroicons/optimized/24/outline/stop.svg
new file mode 100644
index 00000000..4ee917a0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/sun.svg b/assets/vendor/heroicons/optimized/24/outline/sun.svg
new file mode 100644
index 00000000..5667cb3b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/swatch.svg b/assets/vendor/heroicons/optimized/24/outline/swatch.svg
new file mode 100644
index 00000000..5b136ebd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/swatch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/table-cells.svg b/assets/vendor/heroicons/optimized/24/outline/table-cells.svg
new file mode 100644
index 00000000..cb37937d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/tag.svg b/assets/vendor/heroicons/optimized/24/outline/tag.svg
new file mode 100644
index 00000000..9620545e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/tag.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/ticket.svg b/assets/vendor/heroicons/optimized/24/outline/ticket.svg
new file mode 100644
index 00000000..da2d69e0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/trash.svg b/assets/vendor/heroicons/optimized/24/outline/trash.svg
new file mode 100644
index 00000000..0d32d58b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/trophy.svg b/assets/vendor/heroicons/optimized/24/outline/trophy.svg
new file mode 100644
index 00000000..f846e52d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/truck.svg b/assets/vendor/heroicons/optimized/24/outline/truck.svg
new file mode 100644
index 00000000..6e1ea69e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/truck.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/tv.svg b/assets/vendor/heroicons/optimized/24/outline/tv.svg
new file mode 100644
index 00000000..7b8a706a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/tv.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user-circle.svg b/assets/vendor/heroicons/optimized/24/outline/user-circle.svg
new file mode 100644
index 00000000..a177f269
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user-group.svg b/assets/vendor/heroicons/optimized/24/outline/user-group.svg
new file mode 100644
index 00000000..4e7089b6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user-minus.svg b/assets/vendor/heroicons/optimized/24/outline/user-minus.svg
new file mode 100644
index 00000000..703478e5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user-plus.svg b/assets/vendor/heroicons/optimized/24/outline/user-plus.svg
new file mode 100644
index 00000000..24533d10
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user.svg b/assets/vendor/heroicons/optimized/24/outline/user.svg
new file mode 100644
index 00000000..e9b6c20b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/users.svg b/assets/vendor/heroicons/optimized/24/outline/users.svg
new file mode 100644
index 00000000..87304a0d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/variable.svg b/assets/vendor/heroicons/optimized/24/outline/variable.svg
new file mode 100644
index 00000000..81fab040
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg b/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg
new file mode 100644
index 00000000..d1de13e7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/video-camera.svg b/assets/vendor/heroicons/optimized/24/outline/video-camera.svg
new file mode 100644
index 00000000..aae1a198
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/view-columns.svg b/assets/vendor/heroicons/optimized/24/outline/view-columns.svg
new file mode 100644
index 00000000..22a668e8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg
new file mode 100644
index 00000000..0583eef5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/wallet.svg b/assets/vendor/heroicons/optimized/24/outline/wallet.svg
new file mode 100644
index 00000000..8f19d644
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/wifi.svg b/assets/vendor/heroicons/optimized/24/outline/wifi.svg
new file mode 100644
index 00000000..084b3e13
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/window.svg b/assets/vendor/heroicons/optimized/24/outline/window.svg
new file mode 100644
index 00000000..4ffea711
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg
new file mode 100644
index 00000000..1023ae9d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/wrench.svg b/assets/vendor/heroicons/optimized/24/outline/wrench.svg
new file mode 100644
index 00000000..de3a6e2c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/wrench.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/x-circle.svg b/assets/vendor/heroicons/optimized/24/outline/x-circle.svg
new file mode 100644
index 00000000..294ba208
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/x-mark.svg
new file mode 100644
index 00000000..a6d9eb7f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg b/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg
new file mode 100644
index 00000000..2a13ef28
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg
new file mode 100644
index 00000000..ed9b9500
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg
new file mode 100644
index 00000000..fc4b90cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg
new file mode 100644
index 00000000..5999b72a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg
new file mode 100644
index 00000000..e7dd0d65
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box.svg
new file mode 100644
index 00000000..74e0471d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/archive-box.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg
new file mode 100644
index 00000000..c85a4ff9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg
new file mode 100644
index 00000000..5cd0d4dc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg
new file mode 100644
index 00000000..d2ef0b30
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg
new file mode 100644
index 00000000..35eab418
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg
new file mode 100644
index 00000000..8c60942e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg
new file mode 100644
index 00000000..a18c62d9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg
new file mode 100644
index 00000000..5cb396ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg
new file mode 100644
index 00000000..a937f8ef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg
new file mode 100644
index 00000000..972a85e7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg
new file mode 100644
index 00000000..51bef708
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg
new file mode 100644
index 00000000..891774e7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg
new file mode 100644
index 00000000..aa12c0c8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg
new file mode 100644
index 00000000..0bcb6a0e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg
new file mode 100644
index 00000000..b36d8e08
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg
new file mode 100644
index 00000000..0808a572
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg
new file mode 100644
index 00000000..48a71fd1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg
new file mode 100644
index 00000000..424f75a4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg
new file mode 100644
index 00000000..73a7a7eb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg
new file mode 100644
index 00000000..1b1bbd1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg
new file mode 100644
index 00000000..790993f5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg
new file mode 100644
index 00000000..231b1b25
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg
new file mode 100644
index 00000000..5d912612
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg
new file mode 100644
index 00000000..33b31cfd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg
new file mode 100644
index 00000000..ac1bc377
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg
new file mode 100644
index 00000000..f46b6098
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg
new file mode 100644
index 00000000..f2ece6e4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg
new file mode 100644
index 00000000..0a9999ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg
new file mode 100644
index 00000000..b6f9c2e7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg
new file mode 100644
index 00000000..b661da7a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg
new file mode 100644
index 00000000..cba893e0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg
new file mode 100644
index 00000000..7554631b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg
new file mode 100644
index 00000000..19093f6e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg
new file mode 100644
index 00000000..16f6c79d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg
new file mode 100644
index 00000000..69750249
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg
new file mode 100644
index 00000000..f0b679a0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg
new file mode 100644
index 00000000..2da0f98c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg
new file mode 100644
index 00000000..8cfe23d6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg
new file mode 100644
index 00000000..604920f0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg
new file mode 100644
index 00000000..2399662d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg
new file mode 100644
index 00000000..93fb7f11
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg
new file mode 100644
index 00000000..356e9ca3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg b/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg
new file mode 100644
index 00000000..a02c654e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/backspace.svg b/assets/vendor/heroicons/optimized/24/solid/backspace.svg
new file mode 100644
index 00000000..e5a79c21
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/backward.svg b/assets/vendor/heroicons/optimized/24/solid/backward.svg
new file mode 100644
index 00000000..bdf2a01a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/banknotes.svg b/assets/vendor/heroicons/optimized/24/solid/banknotes.svg
new file mode 100644
index 00000000..1cc18039
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/banknotes.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-2.svg b/assets/vendor/heroicons/optimized/24/solid/bars-2.svg
new file mode 100644
index 00000000..6ee47abf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg
new file mode 100644
index 00000000..a804c110
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg
new file mode 100644
index 00000000..2fd11ad9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg
new file mode 100644
index 00000000..9a2c1708
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3.svg
new file mode 100644
index 00000000..85584e88
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-4.svg b/assets/vendor/heroicons/optimized/24/solid/bars-4.svg
new file mode 100644
index 00000000..e3591d15
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg
new file mode 100644
index 00000000..10140b85
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg
new file mode 100644
index 00000000..4b3d4a7c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-0.svg b/assets/vendor/heroicons/optimized/24/solid/battery-0.svg
new file mode 100644
index 00000000..f03a7378
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-100.svg b/assets/vendor/heroicons/optimized/24/solid/battery-100.svg
new file mode 100644
index 00000000..62e4ec92
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/battery-100.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-50.svg b/assets/vendor/heroicons/optimized/24/solid/battery-50.svg
new file mode 100644
index 00000000..63344d75
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/battery-50.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/beaker.svg b/assets/vendor/heroicons/optimized/24/solid/beaker.svg
new file mode 100644
index 00000000..e0b73ccd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg b/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg
new file mode 100644
index 00000000..f280b00d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg
new file mode 100644
index 00000000..0ef076cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg b/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg
new file mode 100644
index 00000000..cf93ae09
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bell.svg b/assets/vendor/heroicons/optimized/24/solid/bell.svg
new file mode 100644
index 00000000..818496e0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg
new file mode 100644
index 00000000..59d24f74
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bolt.svg b/assets/vendor/heroicons/optimized/24/solid/bolt.svg
new file mode 100644
index 00000000..596c47a1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/book-open.svg b/assets/vendor/heroicons/optimized/24/solid/book-open.svg
new file mode 100644
index 00000000..2e0a1811
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg
new file mode 100644
index 00000000..8435a025
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg
new file mode 100644
index 00000000..a4d3ca5b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark.svg
new file mode 100644
index 00000000..e9f3fb71
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/briefcase.svg b/assets/vendor/heroicons/optimized/24/solid/briefcase.svg
new file mode 100644
index 00000000..a66af568
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/briefcase.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg b/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg
new file mode 100644
index 00000000..3c16cbcc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/building-library.svg b/assets/vendor/heroicons/optimized/24/solid/building-library.svg
new file mode 100644
index 00000000..90f86401
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/building-library.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg b/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg
new file mode 100644
index 00000000..240eedbf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/building-office.svg b/assets/vendor/heroicons/optimized/24/solid/building-office.svg
new file mode 100644
index 00000000..9883e33b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg b/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg
new file mode 100644
index 00000000..f3b54baf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cake.svg b/assets/vendor/heroicons/optimized/24/solid/cake.svg
new file mode 100644
index 00000000..f13b308f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/calculator.svg b/assets/vendor/heroicons/optimized/24/solid/calculator.svg
new file mode 100644
index 00000000..e058510e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg b/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg
new file mode 100644
index 00000000..0df9b163
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/calendar.svg b/assets/vendor/heroicons/optimized/24/solid/calendar.svg
new file mode 100644
index 00000000..27e208c3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/camera.svg b/assets/vendor/heroicons/optimized/24/solid/camera.svg
new file mode 100644
index 00000000..e58165d6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/camera.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg b/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg
new file mode 100644
index 00000000..d4af840a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg
new file mode 100644
index 00000000..abe5349e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg b/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg
new file mode 100644
index 00000000..5aea729a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg
new file mode 100644
index 00000000..bff24c4b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg
new file mode 100644
index 00000000..eab7a418
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg
new file mode 100644
index 00000000..1ee6159d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg
new file mode 100644
index 00000000..80ad26d8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg
new file mode 100644
index 00000000..3dd81b79
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 00000000..815c6d75
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg
new file mode 100644
index 00000000..473b921c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/check-badge.svg b/assets/vendor/heroicons/optimized/24/solid/check-badge.svg
new file mode 100644
index 00000000..058b329f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/check-circle.svg b/assets/vendor/heroicons/optimized/24/solid/check-circle.svg
new file mode 100644
index 00000000..2b908313
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/check.svg b/assets/vendor/heroicons/optimized/24/solid/check.svg
new file mode 100644
index 00000000..2a6bc17d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg
new file mode 100644
index 00000000..ddbe304a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg
new file mode 100644
index 00000000..5c6539d6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg
new file mode 100644
index 00000000..7e25238e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg
new file mode 100644
index 00000000..029e6871
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg
new file mode 100644
index 00000000..4f9ce7e9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg
new file mode 100644
index 00000000..2d89e8b2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg
new file mode 100644
index 00000000..36e4859b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg
new file mode 100644
index 00000000..58edbc3f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg
new file mode 100644
index 00000000..9abe9cd1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg b/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg
new file mode 100644
index 00000000..5a49d802
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg
new file mode 100644
index 00000000..21ec021e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg
new file mode 100644
index 00000000..d60bed5f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg
new file mode 100644
index 00000000..d70b7083
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard.svg
new file mode 100644
index 00000000..c09970f2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clock.svg b/assets/vendor/heroicons/optimized/24/solid/clock.svg
new file mode 100644
index 00000000..1d6fb4a6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg
new file mode 100644
index 00000000..d6cf7c5e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg
new file mode 100644
index 00000000..7e0dceed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud.svg b/assets/vendor/heroicons/optimized/24/solid/cloud.svg
new file mode 100644
index 00000000..95d0c733
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg b/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg
new file mode 100644
index 00000000..103f73be
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg b/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg
new file mode 100644
index 00000000..9f331efe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg
new file mode 100644
index 00000000..ba6fca5d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg
new file mode 100644
index 00000000..9b9b1a61
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cog.svg b/assets/vendor/heroicons/optimized/24/solid/cog.svg
new file mode 100644
index 00000000..e854f730
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cog.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/command-line.svg b/assets/vendor/heroicons/optimized/24/solid/command-line.svg
new file mode 100644
index 00000000..e2a0af88
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg b/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg
new file mode 100644
index 00000000..5b7f2efa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg b/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg
new file mode 100644
index 00000000..e20f6fb0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/credit-card.svg b/assets/vendor/heroicons/optimized/24/solid/credit-card.svg
new file mode 100644
index 00000000..fe4dc14e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/credit-card.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg b/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg
new file mode 100644
index 00000000..5577f268
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cube.svg b/assets/vendor/heroicons/optimized/24/solid/cube.svg
new file mode 100644
index 00000000..b0029f26
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg
new file mode 100644
index 00000000..ca13c68a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg b/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg
new file mode 100644
index 00000000..e0155df4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg b/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg
new file mode 100644
index 00000000..2926c252
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg b/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg
new file mode 100644
index 00000000..547f725b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg b/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg
new file mode 100644
index 00000000..2ee9b46b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg b/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg
new file mode 100644
index 00000000..65ef9bc4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg
new file mode 100644
index 00000000..c0e462ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg
new file mode 100644
index 00000000..867faa41
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg
new file mode 100644
index 00000000..eec0738e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg b/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg
new file mode 100644
index 00000000..88e2cc81
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg
new file mode 100644
index 00000000..77ac19cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg
new file mode 100644
index 00000000..bc26cb91
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg
new file mode 100644
index 00000000..83d0eacf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-check.svg b/assets/vendor/heroicons/optimized/24/solid/document-check.svg
new file mode 100644
index 00000000..e8278544
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg b/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg
new file mode 100644
index 00000000..fa7375d4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg
new file mode 100644
index 00000000..ab165f71
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-minus.svg b/assets/vendor/heroicons/optimized/24/solid/document-minus.svg
new file mode 100644
index 00000000..265c6ebf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-minus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-plus.svg b/assets/vendor/heroicons/optimized/24/solid/document-plus.svg
new file mode 100644
index 00000000..5e314595
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-plus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-text.svg b/assets/vendor/heroicons/optimized/24/solid/document-text.svg
new file mode 100644
index 00000000..73b30cd0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-text.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document.svg b/assets/vendor/heroicons/optimized/24/solid/document.svg
new file mode 100644
index 00000000..a05f20f1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg
new file mode 100644
index 00000000..6ec2b50f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg
new file mode 100644
index 00000000..ddb5a3fe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg
new file mode 100644
index 00000000..792c0aeb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg b/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg
new file mode 100644
index 00000000..e6bf97b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/envelope.svg b/assets/vendor/heroicons/optimized/24/solid/envelope.svg
new file mode 100644
index 00000000..702341b8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/envelope.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg b/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg
new file mode 100644
index 00000000..fdaadc0e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg
new file mode 100644
index 00000000..627a7122
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg b/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg
new file mode 100644
index 00000000..15b16d04
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg b/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg
new file mode 100644
index 00000000..11ef99b0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/eye.svg b/assets/vendor/heroicons/optimized/24/solid/eye.svg
new file mode 100644
index 00000000..a648db3b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/face-frown.svg b/assets/vendor/heroicons/optimized/24/solid/face-frown.svg
new file mode 100644
index 00000000..7040d58c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/face-smile.svg b/assets/vendor/heroicons/optimized/24/solid/face-smile.svg
new file mode 100644
index 00000000..d5e75a2d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/film.svg b/assets/vendor/heroicons/optimized/24/solid/film.svg
new file mode 100644
index 00000000..fbd26cc9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/finger-print.svg b/assets/vendor/heroicons/optimized/24/solid/finger-print.svg
new file mode 100644
index 00000000..68e72b45
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/fire.svg b/assets/vendor/heroicons/optimized/24/solid/fire.svg
new file mode 100644
index 00000000..93b1b1fc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/fire.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/flag.svg b/assets/vendor/heroicons/optimized/24/solid/flag.svg
new file mode 100644
index 00000000..8c67b013
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg
new file mode 100644
index 00000000..5d963b4f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg b/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg
new file mode 100644
index 00000000..d0292b84
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-open.svg b/assets/vendor/heroicons/optimized/24/solid/folder-open.svg
new file mode 100644
index 00000000..b9d80ba8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg b/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg
new file mode 100644
index 00000000..efaf9494
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder.svg b/assets/vendor/heroicons/optimized/24/solid/folder.svg
new file mode 100644
index 00000000..a7847f89
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/forward.svg b/assets/vendor/heroicons/optimized/24/solid/forward.svg
new file mode 100644
index 00000000..de908634
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/funnel.svg b/assets/vendor/heroicons/optimized/24/solid/funnel.svg
new file mode 100644
index 00000000..fe5699f9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/gif.svg b/assets/vendor/heroicons/optimized/24/solid/gif.svg
new file mode 100644
index 00000000..283e6e52
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/gift-top.svg b/assets/vendor/heroicons/optimized/24/solid/gift-top.svg
new file mode 100644
index 00000000..4bd4e6fe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/gift-top.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/gift.svg b/assets/vendor/heroicons/optimized/24/solid/gift.svg
new file mode 100644
index 00000000..2ca6c929
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/gift.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg b/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg
new file mode 100644
index 00000000..0cbacaef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg b/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg
new file mode 100644
index 00000000..5ae0d5da
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg
new file mode 100644
index 00000000..14249d63
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg
new file mode 100644
index 00000000..49a78fd3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg b/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg
new file mode 100644
index 00000000..1717d511
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg
new file mode 100644
index 00000000..7a2b9a61
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg
new file mode 100644
index 00000000..4942d2d4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/hashtag.svg b/assets/vendor/heroicons/optimized/24/solid/hashtag.svg
new file mode 100644
index 00000000..29e677d3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/heart.svg b/assets/vendor/heroicons/optimized/24/solid/heart.svg
new file mode 100644
index 00000000..b5f0d950
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/home-modern.svg b/assets/vendor/heroicons/optimized/24/solid/home-modern.svg
new file mode 100644
index 00000000..488685a6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/home-modern.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/home.svg b/assets/vendor/heroicons/optimized/24/solid/home.svg
new file mode 100644
index 00000000..ec0bae18
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/home.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/identification.svg b/assets/vendor/heroicons/optimized/24/solid/identification.svg
new file mode 100644
index 00000000..829b24d5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg
new file mode 100644
index 00000000..4fd220bd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg b/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg
new file mode 100644
index 00000000..fffab993
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox.svg b/assets/vendor/heroicons/optimized/24/solid/inbox.svg
new file mode 100644
index 00000000..b74380ec
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/information-circle.svg b/assets/vendor/heroicons/optimized/24/solid/information-circle.svg
new file mode 100644
index 00000000..bd2723b5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/key.svg b/assets/vendor/heroicons/optimized/24/solid/key.svg
new file mode 100644
index 00000000..6acee277
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/language.svg b/assets/vendor/heroicons/optimized/24/solid/language.svg
new file mode 100644
index 00000000..60d1aee4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/language.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg b/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg
new file mode 100644
index 00000000..9ddc8d49
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg b/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg
new file mode 100644
index 00000000..ff49cb33
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/link.svg b/assets/vendor/heroicons/optimized/24/solid/link.svg
new file mode 100644
index 00000000..a6dc0930
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/link.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg b/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg
new file mode 100644
index 00000000..7983877a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg b/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg
new file mode 100644
index 00000000..8a5a6d7c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/lock-open.svg b/assets/vendor/heroicons/optimized/24/solid/lock-open.svg
new file mode 100644
index 00000000..4562f7ee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg
new file mode 100644
index 00000000..17a6f282
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg
new file mode 100644
index 00000000..06ae161b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg
new file mode 100644
index 00000000..92040d0a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg
new file mode 100644
index 00000000..b602e081
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/map-pin.svg b/assets/vendor/heroicons/optimized/24/solid/map-pin.svg
new file mode 100644
index 00000000..92e6785e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/map-pin.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/map.svg b/assets/vendor/heroicons/optimized/24/solid/map.svg
new file mode 100644
index 00000000..9d4f7ddd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/megaphone.svg b/assets/vendor/heroicons/optimized/24/solid/megaphone.svg
new file mode 100644
index 00000000..b1f1e102
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/microphone.svg b/assets/vendor/heroicons/optimized/24/solid/microphone.svg
new file mode 100644
index 00000000..a5f4cb6a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/microphone.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg b/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg
new file mode 100644
index 00000000..8c981ab6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/minus-small.svg b/assets/vendor/heroicons/optimized/24/solid/minus-small.svg
new file mode 100644
index 00000000..782213ea
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/minus.svg b/assets/vendor/heroicons/optimized/24/solid/minus.svg
new file mode 100644
index 00000000..1fa71170
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/moon.svg b/assets/vendor/heroicons/optimized/24/solid/moon.svg
new file mode 100644
index 00000000..97d5c5a0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/musical-note.svg b/assets/vendor/heroicons/optimized/24/solid/musical-note.svg
new file mode 100644
index 00000000..a9ab9b5e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/newspaper.svg b/assets/vendor/heroicons/optimized/24/solid/newspaper.svg
new file mode 100644
index 00000000..d1f2c1eb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/newspaper.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg b/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg
new file mode 100644
index 00000000..42eb7712
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg b/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg
new file mode 100644
index 00000000..35fd5a68
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg b/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg
new file mode 100644
index 00000000..9365a57b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg b/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg
new file mode 100644
index 00000000..0a0dcddd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg b/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg
new file mode 100644
index 00000000..4fe4f2b6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/pause.svg b/assets/vendor/heroicons/optimized/24/solid/pause.svg
new file mode 100644
index 00000000..2e121ace
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg b/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg
new file mode 100644
index 00000000..5f4aaf8c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/pencil.svg b/assets/vendor/heroicons/optimized/24/solid/pencil.svg
new file mode 100644
index 00000000..78ec61a3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg
new file mode 100644
index 00000000..06f3ba01
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg
new file mode 100644
index 00000000..678c4f62
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg
new file mode 100644
index 00000000..a017a7de
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/phone.svg b/assets/vendor/heroicons/optimized/24/solid/phone.svg
new file mode 100644
index 00000000..ca2a6bc1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/photo.svg b/assets/vendor/heroicons/optimized/24/solid/photo.svg
new file mode 100644
index 00000000..57e023db
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/play-circle.svg b/assets/vendor/heroicons/optimized/24/solid/play-circle.svg
new file mode 100644
index 00000000..752273ae
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/play-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/play-pause.svg b/assets/vendor/heroicons/optimized/24/solid/play-pause.svg
new file mode 100644
index 00000000..e5bb17cd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/play.svg b/assets/vendor/heroicons/optimized/24/solid/play.svg
new file mode 100644
index 00000000..da0e4e2e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg b/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg
new file mode 100644
index 00000000..b45f965b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/plus-small.svg b/assets/vendor/heroicons/optimized/24/solid/plus-small.svg
new file mode 100644
index 00000000..0c4b7443
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/plus.svg b/assets/vendor/heroicons/optimized/24/solid/plus.svg
new file mode 100644
index 00000000..85d3b140
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/power.svg b/assets/vendor/heroicons/optimized/24/solid/power.svg
new file mode 100644
index 00000000..2bf830f8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg
new file mode 100644
index 00000000..cb0bc9ab
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg
new file mode 100644
index 00000000..54e10b2b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/printer.svg b/assets/vendor/heroicons/optimized/24/solid/printer.svg
new file mode 100644
index 00000000..4fce7910
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg b/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg
new file mode 100644
index 00000000..4f85b374
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/qr-code.svg b/assets/vendor/heroicons/optimized/24/solid/qr-code.svg
new file mode 100644
index 00000000..7f676cab
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/qr-code.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg b/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg
new file mode 100644
index 00000000..2ae51be9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/queue-list.svg b/assets/vendor/heroicons/optimized/24/solid/queue-list.svg
new file mode 100644
index 00000000..536fd88b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/radio.svg b/assets/vendor/heroicons/optimized/24/solid/radio.svg
new file mode 100644
index 00000000..92ca5149
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg b/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg
new file mode 100644
index 00000000..5eb63714
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg b/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg
new file mode 100644
index 00000000..6a1a154e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg b/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg
new file mode 100644
index 00000000..289d1985
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg b/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg
new file mode 100644
index 00000000..82a1334e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg b/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg
new file mode 100644
index 00000000..522fc646
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/rss.svg b/assets/vendor/heroicons/optimized/24/solid/rss.svg
new file mode 100644
index 00000000..b9a8ab2e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/rss.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/scale.svg b/assets/vendor/heroicons/optimized/24/solid/scale.svg
new file mode 100644
index 00000000..b7e57c7b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/scissors.svg b/assets/vendor/heroicons/optimized/24/solid/scissors.svg
new file mode 100644
index 00000000..9c971b38
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/scissors.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/server-stack.svg b/assets/vendor/heroicons/optimized/24/solid/server-stack.svg
new file mode 100644
index 00000000..c0d3074b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/server-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/server.svg b/assets/vendor/heroicons/optimized/24/solid/server.svg
new file mode 100644
index 00000000..55f9aedb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/server.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/share.svg b/assets/vendor/heroicons/optimized/24/solid/share.svg
new file mode 100644
index 00000000..8f45dfca
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/shield-check.svg b/assets/vendor/heroicons/optimized/24/solid/shield-check.svg
new file mode 100644
index 00000000..2596ace4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg b/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg
new file mode 100644
index 00000000..ce53fcc1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg b/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg
new file mode 100644
index 00000000..e6503ee3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg b/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg
new file mode 100644
index 00000000..931a12f5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg b/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg
new file mode 100644
index 00000000..21c65cb3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/signal.svg b/assets/vendor/heroicons/optimized/24/solid/signal.svg
new file mode 100644
index 00000000..9027aef1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/signal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/sparkles.svg b/assets/vendor/heroicons/optimized/24/solid/sparkles.svg
new file mode 100644
index 00000000..0d8d0c19
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg b/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg
new file mode 100644
index 00000000..bd84477f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg
new file mode 100644
index 00000000..e71f1b67
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg b/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg
new file mode 100644
index 00000000..c3726a52
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg
new file mode 100644
index 00000000..8ed638de
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg b/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg
new file mode 100644
index 00000000..475f6c3d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg b/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg
new file mode 100644
index 00000000..88a2dda4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/star.svg b/assets/vendor/heroicons/optimized/24/solid/star.svg
new file mode 100644
index 00000000..85098192
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg b/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg
new file mode 100644
index 00000000..8e57a2c2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/stop.svg b/assets/vendor/heroicons/optimized/24/solid/stop.svg
new file mode 100644
index 00000000..1bf426f6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/sun.svg b/assets/vendor/heroicons/optimized/24/solid/sun.svg
new file mode 100644
index 00000000..1b597fa1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/swatch.svg b/assets/vendor/heroicons/optimized/24/solid/swatch.svg
new file mode 100644
index 00000000..9b26c039
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/swatch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/table-cells.svg b/assets/vendor/heroicons/optimized/24/solid/table-cells.svg
new file mode 100644
index 00000000..151a30c1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/tag.svg b/assets/vendor/heroicons/optimized/24/solid/tag.svg
new file mode 100644
index 00000000..efcd01bc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/tag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/ticket.svg b/assets/vendor/heroicons/optimized/24/solid/ticket.svg
new file mode 100644
index 00000000..e947c416
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/trash.svg b/assets/vendor/heroicons/optimized/24/solid/trash.svg
new file mode 100644
index 00000000..ed7bf43c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/trophy.svg b/assets/vendor/heroicons/optimized/24/solid/trophy.svg
new file mode 100644
index 00000000..ed7ee159
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/truck.svg b/assets/vendor/heroicons/optimized/24/solid/truck.svg
new file mode 100644
index 00000000..c218da65
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/truck.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/tv.svg b/assets/vendor/heroicons/optimized/24/solid/tv.svg
new file mode 100644
index 00000000..8f270260
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/tv.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user-circle.svg b/assets/vendor/heroicons/optimized/24/solid/user-circle.svg
new file mode 100644
index 00000000..978d0b8d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user-group.svg b/assets/vendor/heroicons/optimized/24/solid/user-group.svg
new file mode 100644
index 00000000..7ae76006
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user-group.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user-minus.svg b/assets/vendor/heroicons/optimized/24/solid/user-minus.svg
new file mode 100644
index 00000000..062a7c94
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user-plus.svg b/assets/vendor/heroicons/optimized/24/solid/user-plus.svg
new file mode 100644
index 00000000..ef313fa9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user.svg b/assets/vendor/heroicons/optimized/24/solid/user.svg
new file mode 100644
index 00000000..207213d8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/users.svg b/assets/vendor/heroicons/optimized/24/solid/users.svg
new file mode 100644
index 00000000..2959115d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/variable.svg b/assets/vendor/heroicons/optimized/24/solid/variable.svg
new file mode 100644
index 00000000..5601cac1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg b/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg
new file mode 100644
index 00000000..2a344d5a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/video-camera.svg b/assets/vendor/heroicons/optimized/24/solid/video-camera.svg
new file mode 100644
index 00000000..55bf7b4f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/view-columns.svg b/assets/vendor/heroicons/optimized/24/solid/view-columns.svg
new file mode 100644
index 00000000..f7295e37
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg
new file mode 100644
index 00000000..e04b727f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/wallet.svg b/assets/vendor/heroicons/optimized/24/solid/wallet.svg
new file mode 100644
index 00000000..001b38a7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/wifi.svg b/assets/vendor/heroicons/optimized/24/solid/wifi.svg
new file mode 100644
index 00000000..eb4fd4e6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/window.svg b/assets/vendor/heroicons/optimized/24/solid/window.svg
new file mode 100644
index 00000000..4de83b3f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg
new file mode 100644
index 00000000..b7e0e9e8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/wrench.svg b/assets/vendor/heroicons/optimized/24/solid/wrench.svg
new file mode 100644
index 00000000..3b61d5b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/wrench.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/x-circle.svg b/assets/vendor/heroicons/optimized/24/solid/x-circle.svg
new file mode 100644
index 00000000..913782ad
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/x-mark.svg
new file mode 100644
index 00000000..e525a8f0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/config/config.exs b/config/config.exs
index 732a2ac0..8392be84 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -10,9 +10,14 @@ config :phoenix, :json_library, Jason
config :elixir_boilerplate, ElixirBoilerplateWeb.Endpoint,
pubsub_server: ElixirBoilerplate.PubSub,
- render_errors: [view: ElixirBoilerplateWeb.Errors.View, accepts: ~w(html json)]
+ render_errors: [
+ formats: [html: ElixirBoilerplateWeb.Controllers.ErrorHTML, json: ElixirBoilerplateWeb.Controllers.ErrorJSON],
+ layout: false
+ ]
-config :elixir_boilerplate, ElixirBoilerplate.Repo, start_apps_before_migration: [:ssl]
+config :elixir_boilerplate, ElixirBoilerplate.Repo,
+ migration_primary_key: [name: :id, type: :binary_id],
+ start_apps_before_migration: [:ssl]
config :elixir_boilerplate, Corsica, allow_headers: :all
@@ -21,13 +26,24 @@ config :elixir_boilerplate, ElixirBoilerplate.Gettext, default_locale: "en"
config :elixir_boilerplate, ElixirBoilerplateWeb.Plugs.Security, allow_unsafe_scripts: false
config :esbuild,
- version: "0.16.4",
+ version: "0.17.11",
default: [
- args: ~w(js/app.js --bundle --target=es2016 --outdir=../priv/static/assets),
+ 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__)}
]
+config :tailwind,
+ version: "3.2.7",
+ default: [
+ args: ~w(
+ --config=tailwind.config.js
+ --input=css/app.css
+ --output=../priv/static/assets/app.css
+ ),
+ cd: Path.expand("../assets", __DIR__)
+ ]
+
config :sentry,
root_source_code_path: File.cwd!(),
release: version
diff --git a/config/dev.exs b/config/dev.exs
index bbeab660..fd46b977 100644
--- a/config/dev.exs
+++ b/config/dev.exs
@@ -4,13 +4,14 @@ config :elixir_boilerplate, ElixirBoilerplateWeb.Endpoint,
code_reloader: true,
check_origin: false,
watchers: [
- esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}
+ esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]},
+ tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]}
],
live_reload: [
patterns: [
- ~r{priv/gettext/.*$},
- ~r{priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$},
- ~r{lib/elixir_boilerplate_web/.*(ee?x)$}
+ ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$",
+ ~r"priv/gettext/.*(po)$",
+ ~r"lib/elixir_boilerplate_web/(controllers|live|components)/.*(ex|heex)$"
]
]
@@ -19,3 +20,6 @@ config :elixir_boilerplate, ElixirBoilerplateWeb.Plugs.Security, allow_unsafe_sc
config :logger, :console, format: "[$level] $message\n"
config :phoenix, :stacktrace_depth, 20
+
+# Enable dev routes for dashboard and mailbox
+config :elixir_boilerplate, dev_routes: true
diff --git a/config/prod.exs b/config/prod.exs
index 9afb8170..3be83ca3 100644
--- a/config/prod.exs
+++ b/config/prod.exs
@@ -8,3 +8,6 @@ config :logger, :console,
format: "$time $metadata[$level] $message\n",
level: :info,
metadata: ~w(request_id graphql_operation_name)a
+
+# Runtime production configuration, including reading
+# of environment variables, is done on config/runtime.exs.
diff --git a/config/runtime.exs b/config/runtime.exs
index 7996551e..9389e952 100644
--- a/config/runtime.exs
+++ b/config/runtime.exs
@@ -21,7 +21,7 @@ config :elixir_boilerplate, ElixirBoilerplateWeb.Endpoint,
static_url: get_endpoint_url_config(static_uri),
debug_errors: get_env("DEBUG_ERRORS", :boolean)
-config :elixir_boilerplate, ElixirBoilerplateWeb.Router,
+config :elixir_boilerplate, ElixirBoilerplateWeb.Session,
session_key: get_env!("SESSION_KEY"),
session_signing_salt: get_env!("SESSION_SIGNING_SALT")
diff --git a/config/test.exs b/config/test.exs
index f338e5b1..9ecc56c4 100644
--- a/config/test.exs
+++ b/config/test.exs
@@ -23,4 +23,4 @@ config :elixir_boilerplate, ElixirBoilerplateWeb.Endpoint, server: false
# This config is to output keys instead of translated message in test
config :elixir_boilerplate, ElixirBoilerplate.Gettext, priv: "priv/null", interpolation: ElixirBoilerplate.GettextInterpolation
-config :logger, level: :warn
+config :logger, level: :warning
diff --git a/lib/elixir_boilerplate/application.ex b/lib/elixir_boilerplate/application.ex
index 0215e1ce..fd51d0d4 100644
--- a/lib/elixir_boilerplate/application.ex
+++ b/lib/elixir_boilerplate/application.ex
@@ -7,9 +7,11 @@ defmodule ElixirBoilerplate.Application do
def start(_type, _args) do
children = [
+ ElixirBoilerplateWeb.Telemetry,
ElixirBoilerplate.Repo,
{Phoenix.PubSub, [name: ElixirBoilerplate.PubSub, adapter: Phoenix.PubSub.PG2]},
- ElixirBoilerplateWeb.Endpoint
+ ElixirBoilerplateWeb.Endpoint,
+ {Absinthe.Subscription, ElixirBoilerplateWeb.Endpoint}
]
opts = [strategy: :one_for_one, name: ElixirBoilerplate.Supervisor]
diff --git a/lib/elixir_boilerplate/planning/planning.ex b/lib/elixir_boilerplate/planning/planning.ex
new file mode 100644
index 00000000..e74f16c5
--- /dev/null
+++ b/lib/elixir_boilerplate/planning/planning.ex
@@ -0,0 +1,31 @@
+defmodule ElixirBoilerplate.Planning do
+ alias ElixirBoilerplate.Planning.Project
+ alias ElixirBoilerplate.Repo
+
+ import Ecto.Query
+
+ def list do
+ projects =
+ queryable()
+ |> Repo.all()
+
+ {:ok, projects}
+ end
+
+ def get(project_id) do
+ project =
+ queryable()
+ |> where(id: ^project_id)
+ |> Repo.one()
+
+ {:ok, project}
+ end
+
+ defp queryable do
+ from(p in Project,
+ join: t in assoc(p, :tasks),
+ order_by: [asc: field(t, :priority)],
+ preload: [tasks: t]
+ )
+ end
+end
diff --git a/lib/elixir_boilerplate/planning/project.ex b/lib/elixir_boilerplate/planning/project.ex
new file mode 100644
index 00000000..b6b3a28f
--- /dev/null
+++ b/lib/elixir_boilerplate/planning/project.ex
@@ -0,0 +1,23 @@
+defmodule ElixirBoilerplate.Planning.Project do
+ use ElixirBoilerplate.Schema
+
+ alias ElixirBoilerplate.Planning.Task
+
+ schema "projects" do
+ field :description, :string
+ field :launch_at, :utc_datetime
+ field :next_milestone_at, :utc_datetime
+ field :title, :string
+
+ has_many :tasks, Task
+
+ timestamps()
+ end
+
+ @doc false
+ def changeset(project, attrs) do
+ project
+ |> cast(attrs, ~w[title description next_milestone_at launch_at]a)
+ |> validate_required(~w[title description]a)
+ end
+end
diff --git a/lib/elixir_boilerplate/planning/task.ex b/lib/elixir_boilerplate/planning/task.ex
new file mode 100644
index 00000000..94f4ff72
--- /dev/null
+++ b/lib/elixir_boilerplate/planning/task.ex
@@ -0,0 +1,22 @@
+defmodule ElixirBoilerplate.Planning.Task do
+ use ElixirBoilerplate.Schema
+
+ alias ElixirBoilerplate.Planning.Project
+
+ schema "tasks" do
+ field :description, :string
+ field :priority, :integer
+ field :due_at, :utc_datetime_usec
+
+ belongs_to :project, Project
+
+ timestamps()
+ end
+
+ @doc false
+ def changeset(task, attrs) do
+ task
+ |> cast(attrs, ~w[project_id description priority due_at]a)
+ |> validate_required(~w[project_id description]a)
+ end
+end
diff --git a/lib/elixir_boilerplate/schema.ex b/lib/elixir_boilerplate/schema.ex
new file mode 100644
index 00000000..b16f8174
--- /dev/null
+++ b/lib/elixir_boilerplate/schema.ex
@@ -0,0 +1,15 @@
+defmodule ElixirBoilerplate.Schema do
+ defmacro __using__(_) do
+ quote do
+ use Ecto.Schema
+
+ import Ecto.Changeset
+
+ alias Ecto.{Schema, UUID}
+
+ @primary_key {:id, :binary_id, autogenerate: true}
+ @foreign_key_type :binary_id
+ @timestamps_opts [type: :utc_datetime_usec]
+ end
+ end
+end
diff --git a/lib/elixir_boilerplate_graphql/planning/types.ex b/lib/elixir_boilerplate_graphql/planning/types.ex
new file mode 100644
index 00000000..e8d6fa43
--- /dev/null
+++ b/lib/elixir_boilerplate_graphql/planning/types.ex
@@ -0,0 +1,33 @@
+defmodule ElixirBoilerplateGraphQL.Planning.Types do
+ use Absinthe.Schema.Notation
+
+ object :project do
+ @desc "A sample project"
+ field(:id, :id)
+ field(:title, :string)
+ field(:description, :string)
+ field(:launch_at, :datetime)
+ field(:tasks, list_of(:task))
+ end
+
+ object :task do
+ @desc "A sample task"
+ field(:id, :id)
+ field(:description, :string)
+ field(:priority, :integer)
+ field(:due_at, :datetime)
+ end
+
+ object :planning_queries do
+ @desc "A list of projects"
+ field :projects, list_of(:project) do
+ resolve(fn _parent, _args, _resolution -> ElixirBoilerplate.Planning.list() end)
+ end
+
+ @desc "A project"
+ field :project, :project do
+ arg(:id, :id)
+ resolve(fn _parent, %{id: id}, _resolution -> ElixirBoilerplate.Planning.get(id) end)
+ end
+ end
+end
diff --git a/lib/elixir_boilerplate_graphql/router.ex b/lib/elixir_boilerplate_graphql/router.ex
deleted file mode 100644
index a1eed5a1..00000000
--- a/lib/elixir_boilerplate_graphql/router.ex
+++ /dev/null
@@ -1,24 +0,0 @@
-defmodule ElixirBoilerplateGraphQL.Router do
- use Plug.Router
-
- defmodule GraphQL do
- use Plug.Router
-
- plug(:match)
- plug(:dispatch)
-
- forward("/",
- to: Absinthe.Plug,
- init_opts: ElixirBoilerplateGraphQL.configuration()
- )
- end
-
- plug(ElixirBoilerplateGraphQL.Plugs.Context)
-
- plug(:match)
- plug(:dispatch)
-
- forward("/graphql", to: GraphQL)
-
- match(_, do: conn)
-end
diff --git a/lib/elixir_boilerplate_graphql/schema.ex b/lib/elixir_boilerplate_graphql/schema.ex
index a2807a04..7a0daceb 100644
--- a/lib/elixir_boilerplate_graphql/schema.ex
+++ b/lib/elixir_boilerplate_graphql/schema.ex
@@ -3,15 +3,19 @@ defmodule ElixirBoilerplateGraphQL.Schema do
import_types(Absinthe.Type.Custom)
import_types(ElixirBoilerplateGraphQL.Application.Types)
+ import_types(ElixirBoilerplateGraphQL.Planning.Types)
query do
import_fields(:application_queries)
+ import_fields(:planning_queries)
end
# Having an empty mutation block is invalid and raises an error in Absinthe.
# Uncomment it when you add the first mutation.
#
# mutation do
+ # import_fields(:application_mutations)
+ # import_fields(:planning_mutations)
# end
def context(context) do
diff --git a/lib/elixir_boilerplate_health/router.ex b/lib/elixir_boilerplate_health/router.ex
deleted file mode 100644
index 57281f7b..00000000
--- a/lib/elixir_boilerplate_health/router.ex
+++ /dev/null
@@ -1,30 +0,0 @@
-defmodule ElixirBoilerplateHealth.Router do
- use Plug.Router
-
- defmodule Health do
- use Plug.Router
-
- plug(:match)
- plug(:dispatch)
-
- forward(
- "/",
- to: PlugCheckup,
- init_opts:
- PlugCheckup.Options.new(
- json_encoder: Jason,
- checks: ElixirBoilerplateHealth.checks(),
- error_code: ElixirBoilerplateHealth.error_code(),
- timeout: :timer.seconds(5),
- pretty: false
- )
- )
- end
-
- plug(:match)
- plug(:dispatch)
-
- forward("/health", to: Health)
-
- match(_, do: conn)
-end
diff --git a/lib/elixir_boilerplate_web.ex b/lib/elixir_boilerplate_web.ex
new file mode 100644
index 00000000..578161e4
--- /dev/null
+++ b/lib/elixir_boilerplate_web.ex
@@ -0,0 +1,114 @@
+defmodule ElixirBoilerplateWeb do
+ @moduledoc """
+ The entrypoint for defining your web interface, such
+ as controllers, components, channels, and so on.
+
+ This can be used in your application as:
+
+ use ElixirBoilerplateWeb, :controller
+ use ElixirBoilerplateWeb, :html
+ The definitions below will be executed for every controller,
+ component, etc, so keep them short and clean, focused
+ on imports, uses and aliases.
+
+ Do NOT define functions inside the quoted expressions
+ below. Instead, define additional modules and import
+ those modules here.
+ """
+
+ def static_paths, do: ~w(assets fonts images favicon.ico robots.txt)
+
+ def router do
+ quote do
+ use Phoenix.Router, helpers: false
+
+ # Import common connection and controller functions to use in pipelines
+ import Plug.Conn
+ import Phoenix.Controller
+ import Phoenix.LiveView.Router
+ end
+ end
+
+ def channel do
+ quote do
+ use Phoenix.Channel
+ end
+ end
+
+ def controller do
+ quote do
+ use Phoenix.Controller,
+ namespace: ElixirBoilerplateWeb,
+ formats: [:html, :json],
+ layouts: [html: ElixirBoilerplateWeb.Layouts]
+
+ import Plug.Conn
+ import ElixirBoilerplate.Gettext
+
+ unquote(verified_routes())
+ end
+ end
+
+ def live_view do
+ quote do
+ use Phoenix.LiveView,
+ layout: {ElixirBoilerplateWeb.Layouts, :app}
+
+ unquote(html_helpers())
+ end
+ end
+
+ def live_component do
+ quote do
+ use Phoenix.LiveComponent
+
+ unquote(html_helpers())
+ end
+ end
+
+ def html do
+ quote do
+ use Phoenix.Component
+
+ # Import convenience functions from controllers
+ import Phoenix.Controller,
+ only: [get_csrf_token: 0, view_module: 1, view_template: 1]
+
+ # Include general helpers for rendering HTML
+ unquote(html_helpers())
+ end
+ end
+
+ defp html_helpers do
+ quote do
+ # HTML escaping functionality
+ import Phoenix.HTML
+ # Core UI components and translation
+ import ElixirBoilerplate.Gettext
+ import ElixirBoilerplateWeb.Components.Branding
+ import ElixirBoilerplateWeb.Components.Core
+
+ # Shortcut for generating JS commands
+ alias Phoenix.LiveView.JS
+
+ # Routes generation with the ~p sigil
+ unquote(verified_routes())
+ end
+ end
+
+ def verified_routes do
+ quote do
+ use Phoenix.VerifiedRoutes,
+ endpoint: ElixirBoilerplateWeb.Endpoint,
+ router: ElixirBoilerplateWeb.Router,
+ statics: ElixirBoilerplateWeb.static_paths()
+ end
+ end
+
+ @doc """
+ When used, dispatch to the appropriate controller/view/etc.
+ """
+ defmacro __using__(which) when is_atom(which) do
+ apply(__MODULE__, which, [])
+ end
+end
diff --git a/lib/elixir_boilerplate_web/components/branding.ex b/lib/elixir_boilerplate_web/components/branding.ex
new file mode 100644
index 00000000..c293f3b0
--- /dev/null
+++ b/lib/elixir_boilerplate_web/components/branding.ex
@@ -0,0 +1,24 @@
+defmodule ElixirBoilerplateWeb.Components.Branding do
+ @moduledoc """
+ Provides branding UI components.
+ """
+ use Phoenix.Component
+
+ @doc """
+ Renders the boilerplate logo as an inlined SVG.
+
+ ## Examples
+
+ <.logo width=500 />
+ """
+ attr :width, :integer, default: 500
+
+ def logo(assigns) do
+ ~H"""
+
+ """
+ end
+end
diff --git a/lib/elixir_boilerplate_web/components/core.ex b/lib/elixir_boilerplate_web/components/core.ex
new file mode 100644
index 00000000..7b9a6300
--- /dev/null
+++ b/lib/elixir_boilerplate_web/components/core.ex
@@ -0,0 +1,605 @@
+defmodule ElixirBoilerplateWeb.Components.Core do
+ @moduledoc """
+ Provides core UI components.
+
+ At the first glance, this module may seem daunting, but its goal is
+ to provide some core building blocks in your application, such modals,
+ tables, and forms. The components are mostly markup and well documented
+ with doc strings and declarative assigns. You may customize and style
+ them in any way you want, based on your application growth and needs.
+
+ The default components use Tailwind CSS, a utility-first CSS framework.
+ See the [Tailwind CSS documentation](https://tailwindcss.com) to learn
+ how to customize them or feel free to swap in another framework altogether.
+
+ Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage.
+ """
+ use Phoenix.Component
+
+ alias Phoenix.LiveView.JS
+ import ElixirBoilerplate.Gettext
+
+ @doc """
+ Renders a modal.
+
+ ## Examples
+
+ <.modal id="confirm-modal">
+ This is a modal.
+
+
+ JS commands may be passed to the `:on_cancel` to configure
+ the closing/cancel event, for example:
+
+ <.modal id="confirm" on_cancel={JS.navigate(~p"/posts")}>
+ This is another modal.
+
+
+ """
+ attr :id, :string, required: true
+ attr :show, :boolean, default: false
+ attr :on_cancel, JS, default: %JS{}
+ slot :inner_block, required: true
+
+ def modal(assigns) do
+ ~H"""
+
+
+
+
+
+ <.focus_wrap
+ id={"#{@id}-container"}
+ phx-window-keydown={JS.exec("data-cancel", to: "##{@id}")}
+ phx-key="escape"
+ phx-click-away={JS.exec("data-cancel", to: "##{@id}")}
+ class="shadow-zinc-700/10 ring-zinc-700/10 relative hidden rounded-2xl bg-white p-14 shadow-lg ring-1 transition"
+ >
+
+
+ <.icon name="hero-x-mark-solid" class="h-5 w-5" />
+
+
+
+ <%= render_slot(@inner_block) %>
+
+
+
+
+
+
+ """
+ end
+
+ @doc """
+ Renders flash notices.
+
+ ## Examples
+
+ <.flash kind={:info} flash={@flash} />
+ <.flash kind={:info} phx-mounted={show("#flash")}>Welcome Back!
+ """
+ attr :id, :string, default: "flash", doc: "the optional id of flash container"
+ attr :flash, :map, default: %{}, doc: "the map of flash messages to display"
+ attr :title, :string, default: nil
+ attr :kind, :atom, values: [:info, :error], doc: "used for styling and flash lookup"
+ attr :rest, :global, doc: "the arbitrary HTML attributes to add to the flash container"
+
+ slot :inner_block, doc: "the optional inner block that renders the flash message"
+
+ def flash(assigns) do
+ ~H"""
+
hide("##{@id}")}
+ role="alert"
+ class={[
+ "fixed top-2 right-2 w-80 sm:w-96 z-50 rounded-lg p-3 ring-1",
+ @kind == :info && "bg-emerald-50 text-emerald-800 ring-emerald-500 fill-cyan-900",
+ @kind == :error && "bg-rose-50 text-rose-900 shadow-md ring-rose-500 fill-rose-900"
+ ]}
+ {@rest}
+ >
+
+ <.icon :if={@kind == :info} name="hero-information-circle-mini" class="h-4 w-4" />
+ <.icon :if={@kind == :error} name="hero-exclamation-circle-mini" class="h-4 w-4" />
+ <%= @title %>
+
+
<%= msg %>
+
+ <.icon name="hero-x-mark-solid" class="h-5 w-5 opacity-40 group-hover:opacity-70" />
+
+
+ """
+ end
+
+ @doc """
+ Shows the flash group with standard titles and content.
+
+ ## Examples
+
+ <.flash_group flash={@flash} />
+ """
+ attr :flash, :map, required: true, doc: "the map of flash messages"
+
+ def flash_group(assigns) do
+ ~H"""
+ <.flash kind={:info} title="Success!" flash={@flash} />
+ <.flash kind={:error} title="Error!" flash={@flash} />
+ <.flash id="client-error" kind={:error} title="We can't find the internet" phx-disconnected={show(".phx-client-error #client-error")} phx-connected={hide("#client-error")} hidden>
+ Attempting to reconnect <.icon name="hero-arrow-path" class="ml-1 h-3 w-3 animate-spin" />
+
+
+ <.flash id="server-error" kind={:error} title="Something went wrong!" phx-disconnected={show(".phx-server-error #server-error")} phx-connected={hide("#server-error")} hidden>
+ Hang in there while we get back on track <.icon name="hero-arrow-path" class="ml-1 h-3 w-3 animate-spin" />
+
+ """
+ end
+
+ @doc """
+ Renders a simple form.
+
+ ## Examples
+
+ <.simple_form for={@form} phx-change="validate" phx-submit="save">
+ <.input field={@form[:email]} label="Email"/>
+ <.input field={@form[:username]} label="Username" />
+ <:actions>
+ <.button>Save
+
+
+ """
+ attr :for, :any, required: true, doc: "the datastructure for the form"
+ attr :as, :any, default: nil, doc: "the server side parameter to collect all input under"
+
+ attr :rest, :global,
+ include: ~w(autocomplete name rel action enctype method novalidate target multipart),
+ doc: "the arbitrary HTML attributes to apply to the form tag"
+
+ slot :inner_block, required: true
+ slot :actions, doc: "the slot for form actions, such as a submit button"
+
+ def simple_form(assigns) do
+ ~H"""
+ <.form :let={f} for={@for} as={@as} {@rest}>
+
+ <%= render_slot(@inner_block, f) %>
+
+ <%= render_slot(action, f) %>
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a button.
+
+ ## Examples
+
+ <.button>Send!
+ <.button phx-click="go" class="ml-2">Send!
+ """
+ attr :type, :string, default: nil
+ attr :class, :string, default: nil
+ attr :rest, :global, include: ~w(disabled form name value)
+
+ slot :inner_block, required: true
+
+ def button(assigns) do
+ ~H"""
+
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Renders an input with label and error messages.
+
+ A `Phoenix.HTML.FormField` may be passed as argument,
+ which is used to retrieve the input name, id, and values.
+ Otherwise all attributes may be passed explicitly.
+
+ ## Types
+
+ This function accepts all HTML input types, considering that:
+
+ * You may also set `type="select"` to render a `
` tag
+
+ * `type="checkbox"` is used exclusively to render boolean values
+
+ * For live file uploads, see `Phoenix.Component.live_file_input/1`
+
+ See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input
+ for more information.
+
+ ## Examples
+
+ <.input field={@form[:email]} type="email" />
+ <.input name="my-input" errors={["oh no!"]} />
+ """
+ attr :id, :any, default: nil
+ attr :name, :any
+ attr :label, :string, default: nil
+ attr :value, :any
+
+ attr :type, :string,
+ default: "text",
+ values: ~w(checkbox color date datetime-local email file hidden month number password
+ range radio search select tel text textarea time url week)
+
+ attr :field, Phoenix.HTML.FormField, doc: "a form field struct retrieved from the form, for example: @form[:email]"
+
+ attr :errors, :list, default: []
+ attr :checked, :boolean, doc: "the checked flag for checkbox inputs"
+ attr :prompt, :string, default: nil, doc: "the prompt for select inputs"
+ attr :options, :list, doc: "the options to pass to Phoenix.HTML.Form.options_for_select/2"
+ attr :multiple, :boolean, default: false, doc: "the multiple flag for select inputs"
+
+ attr :rest, :global, include: ~w(accept autocomplete capture cols disabled form list max maxlength min minlength
+ multiple pattern placeholder readonly required rows size step)
+
+ slot :inner_block
+
+ def input(%{field: %Phoenix.HTML.FormField{} = field} = assigns) do
+ assigns
+ |> assign(field: nil, id: assigns.id || field.id)
+ |> assign(:errors, Enum.map(field.errors, &translate_error(&1)))
+ |> assign_new(:name, fn -> if assigns.multiple, do: field.name <> "[]", else: field.name end)
+ |> assign_new(:value, fn -> field.value end)
+ |> input()
+ end
+
+ def input(%{type: "checkbox", value: value} = assigns) do
+ assigns = assign_new(assigns, :checked, fn -> Phoenix.HTML.Form.normalize_value("checkbox", value) end)
+
+ ~H"""
+
+
+
+
+ <%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ def input(%{type: "select"} = assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <%= @prompt %>
+ <%= Phoenix.HTML.Form.options_for_select(@options, @value) %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ def input(%{type: "textarea"} = assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ # All other inputs text, datetime-local, url, password, etc. are handled here...
+ def input(assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ @doc """
+ Renders a label.
+ """
+ attr :for, :string, default: nil
+ slot :inner_block, required: true
+
+ def label(assigns) do
+ ~H"""
+
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Generates a generic error message.
+ """
+ slot :inner_block, required: true
+
+ def error(assigns) do
+ ~H"""
+
+ <.icon name="hero-exclamation-circle-mini" class="mt-0.5 h-5 w-5 flex-none" />
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Renders a header with title.
+ """
+ attr :class, :string, default: nil
+
+ slot :inner_block, required: true
+ slot :subtitle
+ slot :actions
+
+ def header(assigns) do
+ ~H"""
+
+ """
+ end
+
+ @doc ~S"""
+ Renders a table with generic styling.
+
+ ## Examples
+
+ <.table id="users" rows={@users}>
+ <:col :let={user} label="id"><%= user.id %>
+ <:col :let={user} label="username"><%= user.username %>
+
+ """
+ attr :id, :string, required: true
+ attr :rows, :list, required: true
+ attr :row_id, :any, default: nil, doc: "the function for generating the row id"
+ attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row"
+
+ attr :row_item, :any,
+ default: &Function.identity/1,
+ doc: "the function for mapping each row before calling the :col and :action slots"
+
+ slot :col, required: true do
+ attr :label, :string
+ end
+
+ slot :action, doc: "the slot for showing user actions in the last table column"
+
+ def table(assigns) do
+ assigns =
+ with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do
+ assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end)
+ end
+
+ ~H"""
+
+
+
+
+ <%= col[:label] %>
+ <%= gettext("Actions") %>
+
+
+
+
+
+
+
+
+ <%= render_slot(col, @row_item.(row)) %>
+
+
+
+
+
+
+
+ <%= render_slot(action, @row_item.(row)) %>
+
+
+
+
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a data list.
+
+ ## Examples
+
+ <.list>
+ <:item title="Title"><%= @post.title %>
+ <:item title="Views"><%= @post.views %>
+
+ """
+ slot :item, required: true do
+ attr :title, :string, required: true
+ end
+
+ def list(assigns) do
+ ~H"""
+
+
+
+
<%= item.title %>
+ <%= render_slot(item) %>
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a back navigation link.
+
+ ## Examples
+
+ <.back navigate={~p"/posts"}>Back to posts
+ """
+ attr :navigate, :any, required: true
+ slot :inner_block, required: true
+
+ def back(assigns) do
+ ~H"""
+
+ <.link navigate={@navigate} class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700">
+ <.icon name="hero-arrow-left-solid" class="h-3 w-3" />
+ <%= render_slot(@inner_block) %>
+
+
+ """
+ end
+
+ @doc """
+ Renders a [Heroicon](https://heroicons.com).
+
+ Heroicons come in three styles – outline, solid, and mini.
+ By default, the outline style is used, but solid and mini may
+ be applied by using the `-solid` and `-mini` suffix.
+
+ You can customize the size and colors of the icons by setting
+ width, height, and background color classes.
+
+ Icons are extracted from your `assets/vendor/heroicons` directory and bundled
+ within your compiled app.css by the plugin in your `assets/tailwind.config.js`.
+
+ ## Examples
+
+ <.icon name="hero-x-mark-solid" />
+ <.icon name="hero-arrow-path" class="ml-1 w-3 h-3 animate-spin" />
+ """
+ attr :name, :string, required: true
+ attr :class, :string, default: nil
+
+ def icon(%{name: "hero-" <> _} = assigns) do
+ ~H"""
+
+ """
+ end
+
+ ## JS Commands
+
+ def show(js \\ %JS{}, selector) do
+ JS.show(js,
+ to: selector,
+ transition: {"transition-all transform ease-out duration-300", "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95", "opacity-100 translate-y-0 sm:scale-100"}
+ )
+ end
+
+ def hide(js \\ %JS{}, selector) do
+ JS.hide(js,
+ to: selector,
+ time: 200,
+ transition: {"transition-all transform ease-in duration-200", "opacity-100 translate-y-0 sm:scale-100", "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"}
+ )
+ end
+
+ def show_modal(js \\ %JS{}, id) when is_binary(id) do
+ js
+ |> JS.show(to: "##{id}")
+ |> JS.show(
+ to: "##{id}-bg",
+ transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"}
+ )
+ |> show("##{id}-container")
+ |> JS.add_class("overflow-hidden", to: "body")
+ |> JS.focus_first(to: "##{id}-content")
+ end
+
+ def hide_modal(js \\ %JS{}, id) do
+ js
+ |> JS.hide(
+ to: "##{id}-bg",
+ transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"}
+ )
+ |> hide("##{id}-container")
+ |> JS.hide(to: "##{id}", transition: {"block", "block", "hidden"})
+ |> JS.remove_class("overflow-hidden", to: "body")
+ |> JS.pop_focus()
+ end
+
+ @doc """
+ Translates an error message using gettext.
+ """
+ def translate_error({msg, opts}) do
+ # When using gettext, we typically pass the strings we want
+ # to translate as a static argument:
+ #
+ # # Translate the number of files with plural rules
+ # dngettext("errors", "1 file", "%{count} files", count)
+ #
+ # However the error messages in our forms and APIs are generated
+ # dynamically, so we need to translate them by calling Gettext
+ # with our gettext backend as first argument. Translations are
+ # available in the errors.po file (as we use the "errors" domain).
+ if count = opts[:count] do
+ Gettext.dngettext(ElixirBoilerplate.Gettext, "errors", msg, msg, count, opts)
+ else
+ Gettext.dgettext(ElixirBoilerplate.Gettext, "errors", msg, opts)
+ end
+ end
+
+ @doc """
+ Translates the errors for a field from a keyword list of errors.
+ """
+ def translate_errors(errors, field) when is_list(errors) do
+ for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts})
+ end
+end
diff --git a/lib/elixir_boilerplate_web/controllers/error_html.ex b/lib/elixir_boilerplate_web/controllers/error_html.ex
new file mode 100644
index 00000000..1ecc5be2
--- /dev/null
+++ b/lib/elixir_boilerplate_web/controllers/error_html.ex
@@ -0,0 +1,19 @@
+defmodule ElixirBoilerplateWeb.Controllers.ErrorHTML do
+ use ElixirBoilerplateWeb, :html
+
+ # If you want to customize your error pages,
+ # uncomment the embed_templates/1 call below
+ # and add pages to the error directory:
+ #
+ # * lib/elixir_boilerplate_web/controllers/error_html/404.html.heex
+ # * lib/elixir_boilerplate_web/controllers/error_html/500.html.heex
+ #
+ # embed_templates "error_html/*"
+
+ # The default is to render a plain text page based on
+ # the template name. For example, "404.html" becomes
+ # "Not Found".
+ def render(template, _assigns) do
+ Phoenix.Controller.status_message_from_template(template)
+ end
+end
diff --git a/lib/elixir_boilerplate_web/controllers/error_json.ex b/lib/elixir_boilerplate_web/controllers/error_json.ex
new file mode 100644
index 00000000..0ccb0a67
--- /dev/null
+++ b/lib/elixir_boilerplate_web/controllers/error_json.ex
@@ -0,0 +1,15 @@
+defmodule ElixirBoilerplateWeb.Controllers.ErrorJSON do
+ # If you want to customize a particular status code,
+ # you may add your own clauses, such as:
+ #
+ # def render("500.json", _assigns) do
+ # %{errors: %{detail: "Internal Server Error"}}
+ # end
+
+ # By default, Phoenix returns the status message from
+ # the template name. For example, "404.json" becomes
+ # "Not Found".
+ def render(template, _assigns) do
+ %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}}
+ end
+end
diff --git a/lib/elixir_boilerplate_web/controllers/landing_page.ex b/lib/elixir_boilerplate_web/controllers/landing_page.ex
new file mode 100644
index 00000000..13b77e83
--- /dev/null
+++ b/lib/elixir_boilerplate_web/controllers/landing_page.ex
@@ -0,0 +1,8 @@
+defmodule ElixirBoilerplateWeb.Controllers.LandingPage do
+ use ElixirBoilerplateWeb, :controller
+
+ @spec home(Plug.Conn.t(), map) :: Plug.Conn.t()
+ def home(conn, _params) do
+ render(conn, :home)
+ end
+end
diff --git a/lib/elixir_boilerplate_web/controllers/landing_page_html.ex b/lib/elixir_boilerplate_web/controllers/landing_page_html.ex
new file mode 100644
index 00000000..c118e4d5
--- /dev/null
+++ b/lib/elixir_boilerplate_web/controllers/landing_page_html.ex
@@ -0,0 +1,23 @@
+defmodule ElixirBoilerplateWeb.Controllers.LandingPageHTML do
+ use ElixirBoilerplateWeb, :html
+
+ attr :message, :string, default: nil
+
+ def home(assigns) do
+ ~H"""
+
+
+ <.logo width={500} />
+
+
+
+ This repository is the stable base upon which we build our Elixir projects at Mirego. We want to share it with the world so you can build awesome Elixir applications too.
+
+
+ <%= if @message do %>
+
Message: <%= @message %>
+ <% end %>
+
+ """
+ end
+end
diff --git a/lib/elixir_boilerplate_web/endpoint.ex b/lib/elixir_boilerplate_web/endpoint.ex
index 4eb95c97..7fffa411 100644
--- a/lib/elixir_boilerplate_web/endpoint.ex
+++ b/lib/elixir_boilerplate_web/endpoint.ex
@@ -1,14 +1,23 @@
defmodule ElixirBoilerplateWeb.Endpoint do
use Sentry.PlugCapture
+
use Phoenix.Endpoint, otp_app: :elixir_boilerplate
+ use Absinthe.Phoenix.Endpoint
+
alias Plug.Conn
@plug_ssl Plug.SSL.init(rewrite_on: [:x_forwarded_proto])
socket("/socket", ElixirBoilerplateWeb.Socket)
- plug(ElixirBoilerplateWeb.Plugs.Security)
+ socket "/live", Phoenix.LiveView.Socket,
+ websocket: [
+ connect_info: [
+ session: {ElixirBoilerplateWeb.Session, :get_options, []}
+ ]
+ ]
+
plug(:ping)
plug(:canonical_host)
plug(:force_ssl)
@@ -23,7 +32,7 @@ defmodule ElixirBoilerplateWeb.Endpoint do
at: "/",
from: :elixir_boilerplate,
gzip: true,
- only: ~w(assets fonts images favicon.ico robots.txt)
+ only: ElixirBoilerplateWeb.static_paths()
)
# Code reloading can be explicitly enabled under the
@@ -47,12 +56,13 @@ defmodule ElixirBoilerplateWeb.Endpoint do
)
plug(Sentry.PlugContext)
+
plug(Plug.MethodOverride)
plug(Plug.Head)
- plug(ElixirBoilerplateHealth.Router)
- plug(ElixirBoilerplateGraphQL.Router)
- plug(:halt_if_sent)
+ plug(:session)
+
+ # plug(ElixirBoilerplateHealth.Router)
plug(ElixirBoilerplateWeb.Router)
@doc """
@@ -63,7 +73,10 @@ defmodule ElixirBoilerplateWeb.Endpoint do
"""
def init(_key, config) do
if config[:load_from_system_env] do
- port = Application.get_env(:elixir_boilerplate, __MODULE__)[:http][:port] || raise "expected the PORT environment variable to be set"
+ port =
+ Application.get_env(:elixir_boilerplate, __MODULE__)[:http][:port] ||
+ raise "expected the PORT environment variable to be set"
+
{:ok, Keyword.put(config, :http, [:inet6, port: port])}
else
{:ok, config}
@@ -117,9 +130,9 @@ defmodule ElixirBoilerplateWeb.Endpoint do
end
end
- # Splitting routers in separate modules has a negative side effect:
- # Phoenix.Router does not check the Plug.Conn state and tries to match the
- # route even if it was already handled/sent by another router.
- defp halt_if_sent(%{state: :sent, halted: false} = conn, _opts), do: halt(conn)
- defp halt_if_sent(conn, _opts), do: conn
+ defp session(conn, _opts) do
+ opts = Plug.Session.init(ElixirBoilerplateWeb.Session.get_options())
+
+ Plug.Session.call(conn, opts)
+ end
end
diff --git a/lib/elixir_boilerplate_web/errors/errors.ex b/lib/elixir_boilerplate_web/errors/errors.ex
deleted file mode 100644
index 90ba9569..00000000
--- a/lib/elixir_boilerplate_web/errors/errors.ex
+++ /dev/null
@@ -1,65 +0,0 @@
-defmodule ElixirBoilerplateWeb.Errors do
- alias Ecto.Changeset
- alias ElixirBoilerplateWeb.Errors.View
-
- @doc """
- Generates a human-readable block containing all errors in a changeset. Errors
- are then localized using translations in the `ecto` domain.
-
- For example, you could have an `errors.po` file in the french locale:
-
- ```
- msgid ""
- msgstr ""
- "Language: fr"
-
- msgid "can't be blank"
- msgstr "ne peut être vide"
- ```
- """
- def error_messages(changeset) do
- changeset
- |> Changeset.traverse_errors(&translate_error/1)
- |> convert_errors_to_html(changeset.data.__struct__)
- end
-
- defp translate_error({message, options}) do
- if options[:count] do
- Gettext.dngettext(ElixirBoilerplate.Gettext, "errors", message, message, options[:count], options)
- else
- Gettext.dgettext(ElixirBoilerplate.Gettext, "errors", message, options)
- end
- end
-
- defp convert_errors_to_html(errors, schema) do
- errors = Enum.reduce(errors, [], &convert_error_field(&1, &2, schema))
-
- View.render("error_messages.html", %{errors: errors})
- end
-
- defp convert_error_field({field, errors}, memo, schema) when is_list(errors) do
- memo ++ Enum.flat_map(errors, &convert_error_subfield(&1, field, [], schema))
- end
-
- defp convert_error_field({field, errors}, memo, schema) when is_map(errors) do
- memo ++ Enum.flat_map(Map.keys(errors), &convert_error_subfield(&1, field, errors[&1], schema))
- end
-
- defp convert_error_subfield(message, field, _, _schema) when is_binary(message) do
- # NOTE `schema` is available here if we want to use something like
- # `schema.humanize_field(field)` to be able to display `"Email address is
- # invalid"` instead of `email is invalid"`.
- ["#{field} #{message}"]
- end
-
- defp convert_error_subfield(message, field, memo, schema) when is_map(message) do
- Enum.reduce(message, memo, fn {subfield, errors}, memo ->
- memo ++ convert_error_field({"#{field}.#{subfield}", errors}, memo, schema)
- end)
- end
-
- defp convert_error_subfield(subfield, field, errors, schema) do
- field = "#{field}.#{subfield}"
- convert_error_field({field, errors}, [], schema)
- end
-end
diff --git a/lib/elixir_boilerplate_web/errors/templates/error_messages.html.eex b/lib/elixir_boilerplate_web/errors/templates/error_messages.html.eex
deleted file mode 100644
index 56d46a2a..00000000
--- a/lib/elixir_boilerplate_web/errors/templates/error_messages.html.eex
+++ /dev/null
@@ -1,7 +0,0 @@
-<%= if @errors != [] do %>
-
- <%= for error <- @errors do %>
- <%= error %>
- <% end %>
-
-<% end %>
diff --git a/lib/elixir_boilerplate_web/errors/view.ex b/lib/elixir_boilerplate_web/errors/view.ex
deleted file mode 100644
index 750e096d..00000000
--- a/lib/elixir_boilerplate_web/errors/view.ex
+++ /dev/null
@@ -1,7 +0,0 @@
-defmodule ElixirBoilerplateWeb.Errors.View do
- use Phoenix.View, root: "lib/elixir_boilerplate_web", path: "errors/templates", namespace: ElixirBoilerplateWeb
-
- def template_not_found(template, _assigns) do
- Phoenix.Controller.status_message_from_template(template)
- end
-end
diff --git a/lib/elixir_boilerplate_health/elixir_boilerplate_health.ex b/lib/elixir_boilerplate_web/healthcheck.ex
similarity index 83%
rename from lib/elixir_boilerplate_health/elixir_boilerplate_health.ex
rename to lib/elixir_boilerplate_web/healthcheck.ex
index 5d803842..4c783a47 100644
--- a/lib/elixir_boilerplate_health/elixir_boilerplate_health.ex
+++ b/lib/elixir_boilerplate_web/healthcheck.ex
@@ -1,4 +1,4 @@
-defmodule ElixirBoilerplateHealth do
+defmodule ElixirBoilerplateWeb.Healthcheck do
@health_check_error_code 422
def checks do
diff --git a/lib/elixir_boilerplate_web/home/controller.ex b/lib/elixir_boilerplate_web/home/controller.ex
deleted file mode 100644
index 7f4d5cc7..00000000
--- a/lib/elixir_boilerplate_web/home/controller.ex
+++ /dev/null
@@ -1,10 +0,0 @@
-defmodule ElixirBoilerplateWeb.Home.Controller do
- use Phoenix.Controller
-
- plug(:put_view, ElixirBoilerplateWeb.Home.View)
-
- @spec index(Plug.Conn.t(), map) :: Plug.Conn.t()
- def index(conn, _) do
- render(conn, "index.html", message: "Hello, world!")
- end
-end
diff --git a/lib/elixir_boilerplate_web/home/templates/index.html.eex b/lib/elixir_boilerplate_web/home/templates/index.html.eex
deleted file mode 100644
index d0d7ac5d..00000000
--- a/lib/elixir_boilerplate_web/home/templates/index.html.eex
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
This repository is the stable base upon which we build our Elixir projects at Mirego. We want to share it with the world so you can build awesome Elixir applications too.
-
Message: <%= @message %>
-
diff --git a/lib/elixir_boilerplate_web/home/view.ex b/lib/elixir_boilerplate_web/home/view.ex
deleted file mode 100644
index 1ff0cf82..00000000
--- a/lib/elixir_boilerplate_web/home/view.ex
+++ /dev/null
@@ -1,3 +0,0 @@
-defmodule ElixirBoilerplateWeb.Home.View do
- use Phoenix.View, root: "lib/elixir_boilerplate_web", path: "home/templates", namespace: ElixirBoilerplateWeb
-end
diff --git a/lib/elixir_boilerplate_web/layouts/layouts.ex b/lib/elixir_boilerplate_web/layouts/layouts.ex
new file mode 100644
index 00000000..1d5e5213
--- /dev/null
+++ b/lib/elixir_boilerplate_web/layouts/layouts.ex
@@ -0,0 +1,5 @@
+defmodule ElixirBoilerplateWeb.Layouts do
+ use ElixirBoilerplateWeb, :html
+
+ embed_templates "templates/*"
+end
diff --git a/lib/elixir_boilerplate_web/layouts/templates/app.html.eex b/lib/elixir_boilerplate_web/layouts/templates/app.html.eex
deleted file mode 100644
index 3a8830a1..00000000
--- a/lib/elixir_boilerplate_web/layouts/templates/app.html.eex
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
- " />
- <%= csrf_meta_tag() %>
-
-
-
-
- <%= get(@flash, :info) %>
- <%= get(@flash, :error) %>
-
- <%= @inner_content %>
-
-
-
-
-
diff --git a/lib/elixir_boilerplate_web/layouts/templates/app.html.heex b/lib/elixir_boilerplate_web/layouts/templates/app.html.heex
new file mode 100644
index 00000000..5ab7fee0
--- /dev/null
+++ b/lib/elixir_boilerplate_web/layouts/templates/app.html.heex
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+ v<%= Application.spec(:phoenix, :vsn) %>
+
+
+
+
+
+
+
+
+ <.flash_group flash={@flash} />
+
+ <%= @inner_content %>
+
+
diff --git a/lib/elixir_boilerplate_web/layouts/templates/root.html.heex b/lib/elixir_boilerplate_web/layouts/templates/root.html.heex
new file mode 100644
index 00000000..50a98984
--- /dev/null
+++ b/lib/elixir_boilerplate_web/layouts/templates/root.html.heex
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ <.live_title suffix=" · ElixirBoilerplate">
+ <%= assigns[:page_title] || "ElixirBoilerplate" %>
+
+
+
+
+
+
+
+ <%= @inner_content %>
+
+
diff --git a/lib/elixir_boilerplate_web/layouts/view.ex b/lib/elixir_boilerplate_web/layouts/view.ex
deleted file mode 100644
index 4814b653..00000000
--- a/lib/elixir_boilerplate_web/layouts/view.ex
+++ /dev/null
@@ -1,8 +0,0 @@
-defmodule ElixirBoilerplateWeb.Layouts.View do
- use Phoenix.View, root: "lib/elixir_boilerplate_web", path: "layouts/templates", namespace: ElixirBoilerplateWeb
- use Phoenix.HTML
-
- import Phoenix.Flash, only: [get: 2]
-
- alias ElixirBoilerplateWeb.Router.Helpers, as: Routes
-end
diff --git a/lib/elixir_boilerplate_web/router.ex b/lib/elixir_boilerplate_web/router.ex
index 984d14b2..98b5a1d4 100644
--- a/lib/elixir_boilerplate_web/router.ex
+++ b/lib/elixir_boilerplate_web/router.ex
@@ -1,35 +1,51 @@
defmodule ElixirBoilerplateWeb.Router do
- use Phoenix.Router
+ use ElixirBoilerplateWeb, :router
pipeline :browser do
- plug(:accepts, ["html", "json"])
+ plug(:accepts, ~w[html json])
- plug(:session)
- plug(:fetch_session)
- plug(:fetch_flash)
+ plug :fetch_session
+ plug :fetch_live_flash
plug(:protect_from_forgery)
+ plug(ElixirBoilerplateWeb.Plugs.Security)
- plug(:put_layout, {ElixirBoilerplateWeb.Layouts.View, :app})
+ plug(:put_root_layout, html: {ElixirBoilerplateWeb.Layouts, :root})
+ end
+
+ pipeline :api do
+ plug(:accepts, ~w[json])
end
scope "/", ElixirBoilerplateWeb do
- pipe_through(:browser)
+ pipe_through :browser
- get("/", Home.Controller, :index, as: :home)
+ get("/", Controllers.LandingPage, :home)
end
- # The session will be stored in the cookie and signed,
- # this means its contents can be read but not tampered with.
- # Set :encryption_salt if you would also like to encrypt it.
- defp session(conn, _opts) do
- opts =
- Plug.Session.init(
- store: :cookie,
- key: Application.get_env(:elixir_boilerplate, __MODULE__)[:session_key],
- signing_salt: Application.get_env(:elixir_boilerplate, __MODULE__)[:session_signing_salt]
- )
+ scope "/api" do
+ pipe_through :api
- Plug.Session.call(conn, opts)
+ forward("/graphql", Absinthe.Plug, schema: ElixirBoilerplateGraphQL.Schema)
+
+ if Mix.env() == :dev do
+ forward("/graphiql", Absinthe.Plug.GraphiQL,
+ schema: ElixirBoilerplateGraphQL.Schema,
+ socket: ElixirBoilerplateWeb.Socket,
+ interface: :playground
+ )
+ end
end
+
+ forward(
+ "/health",
+ PlugCheckup,
+ PlugCheckup.Options.new(
+ json_encoder: Phoenix.json_library(),
+ checks: ElixirBoilerplateWeb.Healthcheck.checks(),
+ error_code: ElixirBoilerplateWeb.Healthcheck.error_code(),
+ timeout: :timer.seconds(5),
+ pretty: false
+ )
+ )
end
diff --git a/lib/elixir_boilerplate_web/session.ex b/lib/elixir_boilerplate_web/session.ex
new file mode 100644
index 00000000..fd96e4c8
--- /dev/null
+++ b/lib/elixir_boilerplate_web/session.ex
@@ -0,0 +1,11 @@
+defmodule ElixirBoilerplateWeb.Session do
+ @spec get_options() :: keyword()
+ def get_options do
+ [
+ store: :cookie,
+ key: Application.get_env(:elixir_boilerplate, __MODULE__)[:session_key],
+ signing_salt: Application.get_env(:elixir_boilerplate, __MODULE__)[:session_signing_salt],
+ secure: true
+ ]
+ end
+end
diff --git a/lib/elixir_boilerplate_web/socket.ex b/lib/elixir_boilerplate_web/socket.ex
index 48838ab7..dd9ca576 100644
--- a/lib/elixir_boilerplate_web/socket.ex
+++ b/lib/elixir_boilerplate_web/socket.ex
@@ -1,6 +1,8 @@
defmodule ElixirBoilerplateWeb.Socket do
use Phoenix.Socket
+ use Absinthe.Phoenix.Socket, schema: ElixirBoilerplateGraphQL.Schema
+
def connect(_params, socket) do
{:ok, socket}
end
diff --git a/lib/elixir_boilerplate_web/telemetry.ex b/lib/elixir_boilerplate_web/telemetry.ex
new file mode 100644
index 00000000..f87d8fad
--- /dev/null
+++ b/lib/elixir_boilerplate_web/telemetry.ex
@@ -0,0 +1,91 @@
+defmodule ElixirBoilerplateWeb.Telemetry do
+ use Supervisor
+ import Telemetry.Metrics
+
+ def start_link(arg) do
+ Supervisor.start_link(__MODULE__, arg, name: __MODULE__)
+ end
+
+ @impl true
+ def init(_arg) do
+ children = [
+ # Telemetry poller will execute the given period measurements
+ # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics
+ {:telemetry_poller, measurements: periodic_measurements(), period: 10_000}
+ # Add reporters as children of your supervision tree.
+ # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()}
+ ]
+
+ Supervisor.init(children, strategy: :one_for_one)
+ end
+
+ def metrics do
+ [
+ # Phoenix Metrics
+ summary("phoenix.endpoint.start.system_time",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.endpoint.stop.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.start.system_time",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.exception.duration",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.stop.duration",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.socket_connected.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.channel_join.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.channel_handled_in.duration",
+ tags: [:event],
+ unit: {:native, :millisecond}
+ ),
+
+ # Database Metrics
+ summary("<%= @app_name %>.repo.query.total_time",
+ unit: {:native, :millisecond},
+ description: "The sum of the other measurements"
+ ),
+ summary("<%= @app_name %>.repo.query.decode_time",
+ unit: {:native, :millisecond},
+ description: "The time spent decoding the data received from the database"
+ ),
+ summary("<%= @app_name %>.repo.query.query_time",
+ unit: {:native, :millisecond},
+ description: "The time spent executing the query"
+ ),
+ summary("<%= @app_name %>.repo.query.queue_time",
+ unit: {:native, :millisecond},
+ description: "The time spent waiting for a database connection"
+ ),
+ summary("<%= @app_name %>.repo.query.idle_time",
+ unit: {:native, :millisecond},
+ description: "The time the connection spent waiting before being checked out for the query"
+ ),
+
+ # VM Metrics
+ summary("vm.memory.total", unit: {:byte, :kilobyte}),
+ summary("vm.total_run_queue_lengths.total"),
+ summary("vm.total_run_queue_lengths.cpu"),
+ summary("vm.total_run_queue_lengths.io")
+ ]
+ end
+
+ defp periodic_measurements do
+ [
+ # A module, function and arguments to be invoked periodically.
+ # This function must call :telemetry.execute/3 and a metric must be added above.
+ # {<%= @web_namespace %>, :count_users, []}
+ ]
+ end
+end
diff --git a/mix.exs b/mix.exs
index 05bf2da5..e5225609 100644
--- a/mix.exs
+++ b/mix.exs
@@ -6,12 +6,17 @@ defmodule ElixirBoilerplate.Mixfile do
app: :elixir_boilerplate,
version: "0.0.1",
erlang: "~> 25.0",
- elixir: "~> 1.13",
+ elixir: "~> 1.14",
elixirc_paths: elixirc_paths(Mix.env()),
test_paths: ["test"],
test_pattern: "**/*_test.exs",
test_coverage: [tool: ExCoveralls],
- preferred_cli_env: [coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test],
+ preferred_cli_env: [
+ coveralls: :test,
+ "coveralls.detail": :test,
+ "coveralls.post": :test,
+ "coveralls.html": :test
+ ],
start_permanent: Mix.env() == :prod,
aliases: aliases(),
deps: deps(),
@@ -32,10 +37,10 @@ defmodule ElixirBoilerplate.Mixfile do
defp aliases do
[
- "assets.deploy": [
- "esbuild default --minify",
- "phx.digest"
- ],
+ setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"],
+ "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
+ "assets.build": ["tailwind default", "esbuild default"],
+ "assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"],
"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
"ecto.reset": ["ecto.drop", "ecto.setup"],
test: ["ecto.create --quiet", "ecto.migrate", "test"]
@@ -46,6 +51,7 @@ defmodule ElixirBoilerplate.Mixfile do
[
# Assets bundling
{:esbuild, "~> 0.7", runtime: Mix.env() == :dev},
+ {:tailwind, "~> 0.2", runtime: Mix.env() == :dev},
# HTTP Client
{:hackney, "~> 1.18"},
@@ -59,13 +65,17 @@ defmodule ElixirBoilerplate.Mixfile do
{:phoenix, "~> 1.7"},
{:phoenix_view, "~> 2.0"},
{:phoenix_html, "~> 3.3"},
+ {:phoenix_live_view, "~> 0.19.5"},
{:phoenix_ecto, "~> 4.4"},
{:phoenix_live_reload, "~> 1.4", only: :dev},
+ {:phoenix_live_dashboard, "~> 0.8.0"},
{:jason, "~> 1.4"},
+ {:heroicons, "~> 0.5"},
# GraphQL
{:absinthe, "~> 1.7"},
{:absinthe_plug, "~> 1.5"},
+ {:absinthe_phoenix, "~> 2.0"},
{:dataloader, "~> 2.0"},
{:absinthe_error_payload, "~> 1.1"},
@@ -95,6 +105,10 @@ defmodule ElixirBoilerplate.Mixfile do
# Health
{:plug_checkup, "~> 0.6"},
+ # Telemtry plugins
+ {:telemetry_metrics, "~> 0.6"},
+ {:telemetry_poller, "~> 1.0"},
+
# Test factories
{:ex_machina, "~> 2.7", only: :test},
{:faker, "~> 0.17", only: :test},
@@ -103,7 +117,9 @@ defmodule ElixirBoilerplate.Mixfile do
{:excoveralls, "~> 0.16", only: :test},
# Dialyzer
- {:dialyxir, "~> 1.3", only: [:dev, :test], runtime: false}
+ {:dialyxir, "~> 1.3", only: [:dev, :test], runtime: false},
+ {:observer_cli, "~> 1.7"},
+ {:recon, "~> 2.5"}
]
end
diff --git a/mix.lock b/mix.lock
index 5b474451..ed9dbab2 100644
--- a/mix.lock
+++ b/mix.lock
@@ -1,6 +1,7 @@
%{
"absinthe": {:hex, :absinthe, "1.7.5", "a15054f05738e766f7cc7fd352887dfd5e61cec371fb4741cca37c3359ff74ac", [:mix], [{:dataloader, "~> 1.0.0 or ~> 2.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 1.2.2 or ~> 1.3.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:opentelemetry_process_propagator, "~> 0.2.1", [hex: :opentelemetry_process_propagator, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "22a9a38adca26294ad0ee91226168f5d215b401efd770b8a1b8fd9c9b21ec316"},
"absinthe_error_payload": {:hex, :absinthe_error_payload, "1.1.4", "502ff239148c8deaac028ddb600d6502d5be68d24fece0c93f4c3cf7e74c1a4d", [:make, :mix], [{:absinthe, "~> 1.3", [hex: :absinthe, repo: "hexpm", optional: false]}, {:ecto, "~> 3.1", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "9e262ef2fd4a2c644075e0cdde2573b1f713c0676ab905c8640eaa8a882b2aca"},
+ "absinthe_phoenix": {:hex, :absinthe_phoenix, "2.0.2", "e607b438db900049b9b3760f8ecd0591017a46122fffed7057bf6989020992b5", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:absinthe_plug, "~> 1.5", [hex: :absinthe_plug, repo: "hexpm", optional: false]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.5", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}], "hexpm", "d36918925c380dc7d2ed7d039c9a3b4182ec36723f7417a68745ade5aab22f8d"},
"absinthe_plug": {:hex, :absinthe_plug, "1.5.8", "38d230641ba9dca8f72f1fed2dfc8abd53b3907d1996363da32434ab6ee5d6ab", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bbb04176647b735828861e7b2705465e53e2cf54ccf5a73ddd1ebd855f996e5a"},
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
"castore": {:hex, :castore, "1.0.3", "7130ba6d24c8424014194676d608cb989f62ef8039efd50ff4b3f33286d06db8", [:mix], [], "hexpm", "680ab01ef5d15b161ed6a95449fac5c6b8f60055677a8e79acf01b27baa4390b"},
@@ -27,6 +28,7 @@
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"gettext": {:hex, :gettext, "0.22.3", "c8273e78db4a0bb6fba7e9f0fd881112f349a3117f7f7c598fa18c66c888e524", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "935f23447713954a6866f1bb28c3a878c4c011e802bcd68a726f5e558e4b64bd"},
"hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~> 2.9.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.3.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", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"},
+ "heroicons": {:hex, :heroicons, "0.5.3", "ee8ae8335303df3b18f2cc07f46e1cb6e761ba4cf2c901623fbe9a28c0bc51dd", [: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", "a210037e8a09ac17e2a0a0779d729e89c821c944434c3baa7edfc1f5b32f3502"},
"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.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
@@ -36,11 +38,14 @@
"new_relic_absinthe": {:hex, :new_relic_absinthe, "0.0.4", "57917f99789d9b36e4beb599deba495a474e5bf99a5c70a33717b0e17f1c5d4d", [:mix], [{:absinthe, "~> 1.4", [hex: :absinthe, repo: "hexpm", optional: false]}, {:new_relic_agent, "~> 1.19", [hex: :new_relic_agent, repo: "hexpm", optional: false]}], "hexpm", "6b796662e550ddd07e98ff3df95803a6b2a023605e78e0a45261d3e66341c296"},
"new_relic_agent": {:hex, :new_relic_agent, "1.27.8", "a2835b686bc46fc7e53222651cce56a253ae1cedef6dd4042a2f12d41ff95624", [:mix], [{:castore, ">= 0.1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:ecto, ">= 3.4.1", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, ">= 3.4.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.5.5", [hex: :phoenix, repo: "hexpm", optional: true]}, {:plug, ">= 1.10.4", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 2.4.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:redix, ">= 0.11.0", [hex: :redix, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fd52f329db7d731a767d5f527f4424dd72d26c5c89f04504b769d4fa7f1ee77c"},
"nimble_parsec": {:hex, :nimble_parsec, "1.3.1", "2c54013ecf170e249e9291ed0a62e5832f70a476c61da16f6aac6dca0189f2af", [:mix], [], "hexpm", "2682e3c0b2eb58d90c6375fc0cc30bc7be06f365bf72608804fb9cffa5e1b167"},
+ "observer_cli": {:hex, :observer_cli, "1.7.4", "3c1bfb6d91bf68f6a3d15f46ae20da0f7740d363ee5bc041191ce8722a6c4fae", [:mix, :rebar3], [{:recon, "~> 2.5.1", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm", "50de6d95d814f447458bd5d72666a74624eddb0ef98bdcee61a0153aae0865ff"},
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
"phoenix": {:hex, :phoenix, "1.7.7", "4cc501d4d823015007ba3cdd9c41ecaaf2ffb619d6fb283199fa8ddba89191e0", [: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.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [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", "8966e15c395e5e37591b6ed0bd2ae7f48e961f0f60ac4c733f9566b519453085"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.2", "b21bd01fdeffcfe2fab49e4942aa938b6d3e89e93a480d4aee58085560a0bc0d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "70242edd4601d50b69273b057ecf7b684644c19ee750989fd555625ae4ce8f5d"},
"phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
+ "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.0", "0b3158b5b198aa444473c91d23d79f52fb077e807ffad80dacf88ce078fa8df2", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "87785a54474fed91a67a1227a741097eb1a42c2e49d3c0d098b588af65cd410d"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
+ "phoenix_live_view": {:hex, :phoenix_live_view, "0.19.5", "6e730595e8e9b8c5da230a814e557768828fd8dfeeb90377d2d8dbb52d4ec00a", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, 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]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b2eaa0dd3cfb9bd7fb949b88217df9f25aed915e986a28ad5c8a0d054e7ca9d3"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
"phoenix_template": {:hex, :phoenix_template, "1.0.3", "32de561eefcefa951aead30a1f94f1b5f0379bc9e340bb5c667f65f1edfa4326", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "16f4b6588a4152f3cc057b9d0c0ba7e82ee23afa65543da535313ad8d25d8e2c"},
"phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
@@ -51,10 +56,14 @@
"plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
"postgrex": {:hex, :postgrex, "0.17.2", "a3ec9e3239d9b33f1e5841565c4eb200055c52cc0757a22b63ca2d529bbe764c", [: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", "80a918a9e9531d39f7bd70621422f3ebc93c01618c645f2d91306f50041ed90c"},
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
+ "recon": {:hex, :recon, "2.5.3", "739107b9050ea683c30e96de050bc59248fd27ec147696f79a8797ff9fa17153", [:mix, :rebar3], [], "hexpm", "6c6683f46fd4a1dfd98404b9f78dcabc7fcd8826613a89dcb984727a8c3099d7"},
"sentry": {:hex, :sentry, "8.1.0", "8d235b62fce5f8e067ea1644e30939405b71a5e1599d9529ff82899d11d03f2b", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.3", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "f9fc7641ef61e885510f5e5963c2948b9de1de597c63f781e9d3d6c9c8681ab4"},
"sobelow": {:hex, :sobelow, "0.12.2", "45f4d500e09f95fdb5a7b94c2838d6b26625828751d9f1127174055a78542cf5", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "2f0b617dce551db651145662b84c8da4f158e7abe049a76daaaae2282df01c5d"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
+ "tailwind": {:hex, :tailwind, "0.2.1", "83d8eadbe71a8e8f67861fe7f8d51658ecfb258387123afe4d9dc194eddc36b0", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "e8a13f6107c95f73e58ed1b4221744e1eb5a093cd1da244432067e19c8c9a277"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
+ "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"},
+ "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
"websock": {:hex, :websock, "0.5.2", "b3c08511d8d79ed2c2f589ff430bd1fe799bb389686dafce86d28801783d8351", [:mix], [], "hexpm", "925f5de22fca6813dfa980fb62fd542ec43a2d1a1f83d2caec907483fe66ff05"},
"websock_adapter": {:hex, :websock_adapter, "0.5.3", "4908718e42e4a548fc20e00e70848620a92f11f7a6add8cf0886c4232267498d", [: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", "cbe5b814c1f86b6ea002b52dd99f345aeecf1a1a6964e209d208fb404d930d3d"},
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
new file mode 100644
index 00000000..c42b9e97
--- /dev/null
+++ b/priv/gettext/default.pot
@@ -0,0 +1,23 @@
+## This file is a PO Template file.
+##
+## "msgid"s here are often extracted from source code.
+## Add new messages manually only if they're dynamic
+## messages that can't be statically extracted.
+##
+## Run "mix gettext.extract" to bring this file up to
+## date. Leave "msgstr"s empty as changing them here has no
+## effect: edit them in PO (.po) files instead.
+#
+msgid ""
+msgstr ""
+
+#: lib/elixir_boilerplate_web/components/core_components.ex:456
+#, elixir-autogen, elixir-format
+msgid "Actions"
+msgstr ""
+
+#: lib/elixir_boilerplate_web/components/core_components.ex:80
+#: lib/elixir_boilerplate_web/components/core_components.ex:169
+#, elixir-autogen, elixir-format
+msgid "close"
+msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po
new file mode 100644
index 00000000..04f5f6cb
--- /dev/null
+++ b/priv/gettext/en/LC_MESSAGES/default.po
@@ -0,0 +1,23 @@
+## "msgid"s in this file come from POT (.pot) files.
+###
+### Do not add, change, or remove "msgid"s manually here as
+### they're tied to the ones in the corresponding POT file
+### (with the same domain).
+###
+### Use "mix gettext.extract --merge" or "mix gettext.merge"
+### to merge POT files into PO files.
+msgid ""
+msgstr ""
+"Language: en"
+"Plural-Forms: nplurals=2; plural=(n != 1)"
+
+#: lib/elixir_boilerplate_web/components/core_components.ex:456
+#, elixir-autogen, elixir-format
+msgid "Actions"
+msgstr ""
+
+#: lib/elixir_boilerplate_web/components/core_components.ex:80
+#: lib/elixir_boilerplate_web/components/core_components.ex:169
+#, elixir-autogen, elixir-format
+msgid "close"
+msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po
index c981fb3e..eee684cf 100644
--- a/priv/gettext/en/LC_MESSAGES/errors.po
+++ b/priv/gettext/en/LC_MESSAGES/errors.po
@@ -1,6 +1,7 @@
msgid ""
msgstr ""
"Language: en"
+"Plural-Forms: nplurals=2; plural=(n != 1)"
msgid "can't be blank"
msgstr "can’t be blank"
@@ -32,35 +33,53 @@ msgstr "is still associated with this entry"
msgid "are still associated with this entry"
msgstr "are still associated with this entry"
+msgid "should have %{count} item(s)"
+msgid_plural "should have %{count} item(s)"
+msgstr[0] "should have 1 item"
+msgstr[1] "should have %{count} items"
+
msgid "should be %{count} character(s)"
msgid_plural "should be %{count} character(s)"
msgstr[0] "should be 1 character"
msgstr[1] "should be %{count} characters"
-msgid "should have %{count} item(s)"
-msgid_plural "should have %{count} item(s)"
+#, fuzzy
+msgid "should be %{count} byte(s)"
+msgid_plural "should be %{count} byte(s)"
msgstr[0] "should have 1 item"
msgstr[1] "should have %{count} items"
+msgid "should have at least %{count} item(s)"
+msgid_plural "should have at least %{count} item(s)"
+msgstr[0] "should have at least 1 item"
+msgstr[1] "should have at least %{count} items"
+
msgid "should be at least %{count} character(s)"
msgid_plural "should be at least %{count} character(s)"
msgstr[0] "should be at least 1 character"
msgstr[1] "should be at least %{count} characters"
-msgid "should have at least %{count} item(s)"
-msgid_plural "should have at least %{count} item(s)"
-msgstr[0] "should have at least 1 item"
-msgstr[1] "should have at least %{count} items"
+#, fuzzy
+msgid "should be at least %{count} byte(s)"
+msgid_plural "should be at least %{count} byte(s)"
+msgstr[0] "should be at least 1 character"
+msgstr[1] "should be at least %{count} characters"
+
+msgid "should have at most %{count} item(s)"
+msgid_plural "should have at most %{count} item(s)"
+msgstr[0] "should have at most 1 item"
+msgstr[1] "should have at most %{count} items"
msgid "should be at most %{count} character(s)"
msgid_plural "should be at most %{count} character(s)"
msgstr[0] "should be at most 1 character"
msgstr[1] "should be at most %{count} characters"
-msgid "should have at most %{count} item(s)"
-msgid_plural "should have at most %{count} item(s)"
-msgstr[0] "should have at most 1 item"
-msgstr[1] "should have at most %{count} items"
+#, fuzzy
+msgid "should be at most %{count} byte(s)"
+msgid_plural "should be at most %{count} byte(s)"
+msgstr[0] "should be at most 1 character"
+msgstr[1] "should be at most %{count} characters"
msgid "must be less than %{number}"
msgstr "must be less than %{number}"
diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot
new file mode 100644
index 00000000..eef2de2b
--- /dev/null
+++ b/priv/gettext/errors.pot
@@ -0,0 +1,109 @@
+## This is a PO Template file.
+##
+## `msgid`s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run `mix gettext.extract` to bring this file up to
+## date. Leave `msgstr`s empty as changing them here has no
+## effect: edit them in PO (`.po`) files instead.
+## From Ecto.Changeset.cast/4
+msgid "can't be blank"
+msgstr ""
+
+## From Ecto.Changeset.unique_constraint/3
+msgid "has already been taken"
+msgstr ""
+
+## From Ecto.Changeset.put_change/3
+msgid "is invalid"
+msgstr ""
+
+## From Ecto.Changeset.validate_acceptance/3
+msgid "must be accepted"
+msgstr ""
+
+## From Ecto.Changeset.validate_format/3
+msgid "has invalid format"
+msgstr ""
+
+## From Ecto.Changeset.validate_subset/3
+msgid "has an invalid entry"
+msgstr ""
+
+## From Ecto.Changeset.validate_exclusion/3
+msgid "is reserved"
+msgstr ""
+
+## From Ecto.Changeset.validate_confirmation/3
+msgid "does not match confirmation"
+msgstr ""
+
+## From Ecto.Changeset.no_assoc_constraint/3
+msgid "is still associated with this entry"
+msgstr ""
+
+msgid "are still associated with this entry"
+msgstr ""
+
+## From Ecto.Changeset.validate_length/3
+msgid "should have %{count} item(s)"
+msgid_plural "should have %{count} item(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be %{count} character(s)"
+msgid_plural "should be %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be %{count} byte(s)"
+msgid_plural "should be %{count} byte(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should have at least %{count} item(s)"
+msgid_plural "should have at least %{count} item(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be at least %{count} character(s)"
+msgid_plural "should be at least %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be at least %{count} byte(s)"
+msgid_plural "should be at least %{count} byte(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should have at most %{count} item(s)"
+msgid_plural "should have at most %{count} item(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be at most %{count} character(s)"
+msgid_plural "should be at most %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be at most %{count} byte(s)"
+msgid_plural "should be at most %{count} byte(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+## From Ecto.Changeset.validate_number/3
+msgid "must be less than %{number}"
+msgstr ""
+
+msgid "must be greater than %{number}"
+msgstr ""
+
+msgid "must be less than or equal to %{number}"
+msgstr ""
+
+msgid "must be greater than or equal to %{number}"
+msgstr ""
+
+msgid "must be equal to %{number}"
+msgstr ""
diff --git a/priv/repo/migrations/20230620204612_create_projects.exs b/priv/repo/migrations/20230620204612_create_projects.exs
new file mode 100644
index 00000000..0501ecda
--- /dev/null
+++ b/priv/repo/migrations/20230620204612_create_projects.exs
@@ -0,0 +1,14 @@
+defmodule ElixirBoilerplate.Repo.Migrations.CreateProjects do
+ use Ecto.Migration
+
+ def change do
+ create table(:projects) do
+ add :title, :string
+ add :description, :string
+ add :next_milestone_at, :utc_datetime_usec
+ add :launch_at, :utc_datetime_usec
+
+ timestamps()
+ end
+ end
+end
diff --git a/priv/repo/migrations/20230620205057_create_tasks.exs b/priv/repo/migrations/20230620205057_create_tasks.exs
new file mode 100644
index 00000000..85a49638
--- /dev/null
+++ b/priv/repo/migrations/20230620205057_create_tasks.exs
@@ -0,0 +1,14 @@
+defmodule ElixirBoilerplate.Repo.Migrations.CreateTasks do
+ use Ecto.Migration
+
+ def change do
+ create table(:tasks) do
+ add :project_id, references(:projects), null: false
+ add :description, :string
+ add :priority, :integer
+ add :due_at, :utc_datetime_usec
+
+ timestamps()
+ end
+ end
+end
diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs
index 91d285d3..2ddecd7f 100644
--- a/priv/repo/seeds.exs
+++ b/priv/repo/seeds.exs
@@ -2,10 +2,28 @@
#
# mix run priv/repo/seeds.exs
#
-# Inside the script, you can read and write to any of your
-# repositories directly:
+# Inside the script, you can read and write to any of your repositories directly:
#
# ElixirBoilerplate.Repo.insert!(%ElixirBoilerplate.SomeSchema{})
#
-# We recommend using the bang functions (`insert!`, `update!`
-# and so on) as they will fail if something goes wrong.
+# We recommend using the bang functions (`insert!`, `update!` and so on) as they
+# will fail if something goes wrong.
+
+alias ElixirBoilerplate.Planning.{Project, Task}
+alias ElixirBoilerplate.Repo
+
+project =
+ %Project{
+ title: "TODOs",
+ description: "A simple schema to showcase the way we are structuring our relational database data structures",
+ inserted_at: DateTime.utc_now(),
+ updated_at: DateTime.utc_now()
+ }
+ |> Repo.insert!()
+
+_tasks =
+ Repo.insert_all(Task, [
+ [description: "A first task in the project;", project_id: project.id, inserted_at: DateTime.utc_now(), updated_at: DateTime.utc_now()],
+ [description: "A second task", project_id: project.id, inserted_at: DateTime.utc_now(), updated_at: DateTime.utc_now()],
+ [description: "And one last one…", project_id: project.id, inserted_at: DateTime.utc_now(), updated_at: DateTime.utc_now()]
+ ])
diff --git a/test/elixir_boilerplate_web/controllers/error_html_test.exs b/test/elixir_boilerplate_web/controllers/error_html_test.exs
new file mode 100644
index 00000000..01547e75
--- /dev/null
+++ b/test/elixir_boilerplate_web/controllers/error_html_test.exs
@@ -0,0 +1,14 @@
+defmodule ElixirBoilerplateWeb.Controllers.ErrorHTMLTest do
+ use ElixirBoilerplateWeb.ConnCase, async: true
+
+ # Bring render_to_string/4 for testing custom views
+ import Phoenix.Template
+
+ test "renders 404.html" do
+ assert render_to_string(ElixirBoilerplateWeb.Controllers.ErrorHTML, "404", "html", []) == "Not Found"
+ end
+
+ test "renders 500.html" do
+ assert render_to_string(ElixirBoilerplateWeb.Controllers.ErrorHTML, "500", "html", []) == "Internal Server Error"
+ end
+end
diff --git a/test/elixir_boilerplate_web/controllers/error_json_test.exs b/test/elixir_boilerplate_web/controllers/error_json_test.exs
new file mode 100644
index 00000000..68e563e9
--- /dev/null
+++ b/test/elixir_boilerplate_web/controllers/error_json_test.exs
@@ -0,0 +1,12 @@
+defmodule ElixirBoilerplateWeb.Controllers.ErrorJSONTest do
+ use ElixirBoilerplateWeb.ConnCase, async: true
+
+ test "renders 404" do
+ assert ElixirBoilerplateWeb.Controllers.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}}
+ end
+
+ test "renders 500" do
+ assert ElixirBoilerplateWeb.Controllers.ErrorJSON.render("500.json", %{}) ==
+ %{errors: %{detail: "Internal Server Error"}}
+ end
+end
diff --git a/test/elixir_boilerplate_web/controllers/page_test.exs b/test/elixir_boilerplate_web/controllers/page_test.exs
new file mode 100644
index 00000000..abe37242
--- /dev/null
+++ b/test/elixir_boilerplate_web/controllers/page_test.exs
@@ -0,0 +1,8 @@
+defmodule ElixirBoilerplateWeb.Controllers.PageTest do
+ use ElixirBoilerplateWeb.ConnCase
+
+ test "GET /", %{conn: conn} do
+ conn = get(conn, "/")
+ assert html_response(conn, 200) =~ "stable base upon which"
+ end
+end
diff --git a/test/elixir_boilerplate_web/errors/view_test.exs b/test/elixir_boilerplate_web/errors/view_test.exs
deleted file mode 100644
index dd4d0ea7..00000000
--- a/test/elixir_boilerplate_web/errors/view_test.exs
+++ /dev/null
@@ -1,17 +0,0 @@
-defmodule ElixirBoilerplateWeb.Errors.ViewTest do
- use ElixirBoilerplateWeb.ConnCase, async: true
-
- import Phoenix.View, only: [render_to_string: 3]
-
- test "renders 404.html" do
- assert render_to_string(ElixirBoilerplateWeb.Errors.View, "404.html", []) == "Not Found"
- end
-
- test "render 500.html" do
- assert render_to_string(ElixirBoilerplateWeb.Errors.View, "500.html", []) == "Internal Server Error"
- end
-
- test "render any other" do
- assert render_to_string(ElixirBoilerplateWeb.Errors.View, "505.html", []) == "HTTP Version Not Supported"
- end
-end
diff --git a/test/elixir_boilerplate_web/errors_test.exs b/test/elixir_boilerplate_web/errors_test.exs
deleted file mode 100644
index 896e12a0..00000000
--- a/test/elixir_boilerplate_web/errors_test.exs
+++ /dev/null
@@ -1,80 +0,0 @@
-defmodule ElixirBoilerplateWeb.ErrorsTest do
- use ElixirBoilerplate.DataCase, async: true
-
- alias ElixirBoilerplateWeb.Errors
-
- defmodule UserRole do
- use Ecto.Schema
-
- import Ecto.Changeset
-
- embedded_schema do
- field(:type, :string)
-
- timestamps()
- end
-
- def changeset(%__MODULE__{} = user_role, params) do
- user_role
- |> cast(params, [:type])
- |> validate_required([:type])
- |> validate_inclusion(:type, ~w(admin moderator member))
- end
- end
-
- defmodule User do
- use Ecto.Schema
-
- import Ecto.Changeset
-
- schema "users" do
- field(:username, :string)
- field(:email, :string)
- field(:nicknames, {:array, :string})
-
- embeds_one(:single_role, UserRole)
- embeds_many(:multiple_roles, UserRole)
-
- timestamps()
- end
-
- def changeset(%__MODULE__{} = user, params) do
- user
- |> cast(params, [:email, :nicknames])
- |> cast_embed(:single_role)
- |> cast_embed(:multiple_roles)
- |> validate_required(:username)
- |> validate_length(:email, is: 10)
- |> validate_length(:nicknames, min: 1)
- |> validate_format(:email, ~r/@/)
- end
- end
-
- test "error_messages/1 without errors should return an empty string" do
- html =
- %User{}
- |> change()
- |> changeset_to_error_messages()
-
- assert html == ""
- end
-
- test "error_messages/1 should render error messages on changeset" do
- html =
- %User{}
- |> User.changeset(%{"email" => "foo", "nicknames" => [], "single_role" => %{"type" => "bar"}, "multiple_roles" => [%{"type" => ""}]})
- |> changeset_to_error_messages()
-
- assert html =~ "email has invalid format[validation=:format] "
- assert html =~ "email should be %{count} character(s)[count=10,kind=:is,type=:string,validation=:length] "
- assert html =~ "multiple_roles.type can't be blank[validation=:required] "
- assert html =~ "nicknames should have at least %{count} item(s)[count=1,kind=:min,type=:list,validation=:length] "
- assert html =~ "single_role.type is invalid[enum=admin,moderator,member,validation=:inclusion] "
- end
-
- defp changeset_to_error_messages(changeset) do
- changeset
- |> Errors.error_messages()
- |> Phoenix.HTML.safe_to_string()
- end
-end
diff --git a/test/elixir_boilerplate_web/home/controller_test.exs b/test/elixir_boilerplate_web/home/controller_test.exs
deleted file mode 100644
index 97c8bbb4..00000000
--- a/test/elixir_boilerplate_web/home/controller_test.exs
+++ /dev/null
@@ -1,8 +0,0 @@
-defmodule ElixirBoilerplateWeb.Home.ControllerTest do
- use ElixirBoilerplateWeb.ConnCase
-
- test "GET /", %{conn: conn} do
- conn = get(conn, "/")
- assert html_response(conn, 200) =~ "Hello, world!"
- end
-end
diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex
index 42b9d80a..8325b0ac 100644
--- a/test/support/conn_case.ex
+++ b/test/support/conn_case.ex
@@ -5,42 +5,35 @@ defmodule ElixirBoilerplateWeb.ConnCase do
Such tests rely on `Phoenix.ConnTest` and also
import other functionality to make it easier
- to build common datastructures and query the data layer.
+ to build common data structures and query the data layer.
Finally, if the test case interacts with the database,
- it cannot be async. For this reason, every test runs
- inside a transaction which is reset at the beginning
- of the test unless the test case is marked as async.
+ we enable the SQL sandbox, so changes done to the database
+ are reverted at the end of every test. If you are using
+ PostgreSQL, you can even run database tests asynchronously
+ by setting `use ElixirBoilerplateWeb.ConnCase, async: true`, although
+ this option is not recommended for other databases.
"""
use ExUnit.CaseTemplate
- alias Ecto.Adapters.SQL.Sandbox
- alias ElixirBoilerplate.Repo
- alias ElixirBoilerplateWeb.Endpoint
- alias Phoenix.ConnTest
-
using do
quote do
+ # The default endpoint for testing
+ @endpoint ElixirBoilerplateWeb.Endpoint
+
+ use ElixirBoilerplateWeb, :verified_routes
+
# Import conveniences for testing with connections
import Plug.Conn
import Phoenix.ConnTest
-
- import ElixirBoilerplateWeb.Router.Helpers
-
- # The default endpoint for testing
- @endpoint Endpoint
+ import ElixirBoilerplateWeb.ConnCase
end
end
setup tags do
- :ok = Sandbox.checkout(Repo)
-
- unless tags[:async] do
- Sandbox.mode(Repo, {:shared, self()})
- end
-
- {:ok, conn: %{ConnTest.build_conn() | host: host()}}
+ ElixirBoilerplate.DataCase.setup_sandbox(tags)
+ {:ok, conn: %{Phoenix.ConnTest.build_conn() | host: host()}}
end
defp host, do: Application.get_env(:elixir_boilerplate, :canonical_host)
diff --git a/test/support/data_case.ex b/test/support/data_case.ex
index 6f5af09e..c5e8793f 100644
--- a/test/support/data_case.ex
+++ b/test/support/data_case.ex
@@ -7,17 +7,15 @@ defmodule ElixirBoilerplate.DataCase do
your tests.
Finally, if the test case interacts with the database,
- it cannot be async. For this reason, every test runs
- inside a transaction which is reset at the beginning
- of the test unless the test case is marked as async.
+ we enable the SQL sandbox, so changes done to the database
+ are reverted at the end of every test. If you are using
+ PostgreSQL, you can even run database tests asynchronously
+ by setting `use ElixirBoilerplate.DataCase, async: true`, although
+ this option is not recommended for other databases.
"""
use ExUnit.CaseTemplate
- alias Ecto.Adapters.SQL.Sandbox
- alias Ecto.Changeset
- alias ElixirBoilerplate.Repo
-
using do
quote do
alias ElixirBoilerplate.Repo
@@ -30,27 +28,28 @@ defmodule ElixirBoilerplate.DataCase do
end
setup tags do
- :ok = Sandbox.checkout(Repo)
-
- unless tags[:async] do
- Sandbox.mode(Repo, {:shared, self()})
- end
-
+ ElixirBoilerplate.DataCase.setup_sandbox(tags)
:ok
end
@doc """
- A helper that transform changeset errors to a map of messages.
+ Sets up the sandbox based on the test tags.
+ """
+ def setup_sandbox(tags) do
+ pid = Ecto.Adapters.SQL.Sandbox.start_owner!(ElixirBoilerplate.Repo, shared: not tags[:async])
+ on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end)
+ end
+ @doc """
+ A helper that transforms changeset errors into a map of messages.
assert {:error, changeset} = Accounts.create_user(%{password: "short"})
assert "password is too short" in errors_on(changeset).password
assert %{password: ["password is too short"]} = errors_on(changeset)
-
"""
def errors_on(changeset) do
- Changeset.traverse_errors(changeset, fn {message, opts} ->
- Enum.reduce(opts, message, fn {key, value}, acc ->
- String.replace(acc, "%{#{key}}", to_string(value))
+ Ecto.Changeset.traverse_errors(changeset, fn {message, opts} ->
+ Regex.replace(~r"%{(\w+)}", message, fn _, key ->
+ opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string()
end)
end)
end