diff --git a/.gitignore b/.gitignore
index f588feb5..d835b8cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
-# IDE & System Related Files #
.buildpath
.project
.settings
@@ -20,4 +19,5 @@ sites/**/theme/node_modules
sites/**/theme/css/*.map
# Sites
-sites/**
\ No newline at end of file
+sites/*
+!sites/dashboard
\ No newline at end of file
diff --git a/README.md b/README.md
index 674a52da..eca35288 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
Joomlatools Server
- Cloud Native development environment for Joomla
+ Cloud Native dev environment for Joomla
@@ -17,9 +17,9 @@ Welcome to the Joomlatools Server codebase, our home-grown **cloud native develo
### What is Joomlatools Server?
-Joomlatools Server is Docker container that is specially tailored for developing websites with Joomla CMS and [Joomlatools Pages](https://github.com/joomlatools/joomlatools-pages) and is supported on macOS, Linux, and Windows (via WSL2).
+Joomlatools Server is Docker container that is specially tailored for developing websites with Joomla CMS, Wordpress and [Joomlatools Pages](https://github.com/joomlatools/joomlatools-pages) and is supported on macOS, Linux, and Windows (via WSL2).
-It offers support for both Joomla 3 and 4 and can be used as a local/remote development environment. You can run it locally using Docker Desktop, or remotely using Gitpod.
+It offers support for both Joomla 3 a& 4, Wordpress 5 & 6 and Joomlatools Pages and can be used as a local/remote development environment. You can run it locally using Docker Desktop, or remotely using Gitpod.
## Getting started
diff --git a/config/phpmyadmin/config.inc.php b/config/phpmyadmin/config.inc.php
new file mode 100644
index 00000000..0ff86edb
--- /dev/null
+++ b/config/phpmyadmin/config.inc.php
@@ -0,0 +1,28 @@
+.
+ */
+
+declare(strict_types=1);
+
+// Logo link back to Dashboard
+$cfg['NavigationLogoLink'] = 'http://localhost';
+
+// Theme
+$cfg['ThemeDefault'] = 'bootstrap';
+
+// Theme selector on front page
+$cfg['ThemeManager'] = false;
+
+// Disable recent tables button
+$cfg['NumRecentTables'] = '0';
+
+// Disable favourite tables button
+$cfg['NumFavoriteTables'] = '0';
+
+// Disable the server select box
+$cfg['NavigationDisplayServers'] = false;
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 410ad6b6..e4f0d311 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -32,15 +32,32 @@ services:
- .env
labels:
- "traefik.enable=true"
+
# Routers
- - "traefik.http.routers.joomlatools-server-tunnel.rule=HostRegexp(`{name:(.*)}.trycloudflare.com`)"
- - "traefik.http.routers.joomlatools-server-tunnel.entrypoints=web"
+ - "traefik.http.routers.dashboard-http.rule=Host(`localhost`)"
+ - "traefik.http.routers.dashboard-http.entrypoints=web"
+ - "traefik.http.routers.dashboard-http.service=dashboard"
+
+ - "traefik.http.routers.dashboard-https.rule=Host(`localhost`)"
+ - "traefik.http.routers.dashboard-https.entrypoints=websecure"
+ - "traefik.http.routers.dashboard-https.service=dashboard"
+ - "traefik.http.routers.dashboard-https.tls=true"
+
- "traefik.http.routers.joomlatools-server-http.rule=HostRegexp(`{name:(.*)}.test`)"
- "traefik.http.routers.joomlatools-server-http.entrypoints=web"
+ - "traefik.http.routers.joomlatools-server-http.service=joomlatools-server"
+
+ - "traefik.http.routers.joomlatools-server-tunnel.rule=HostRegexp(`{name:(.*)}.trycloudflare.com`)"
+ - "traefik.http.routers.joomlatools-server-tunnel.entrypoints=web"
+ - "traefik.http.routers.joomlatools-server-tunnel.service=joomlatools-server"
+
- "traefik.http.routers.joomlatools-server-https.rule=HostRegexp(`{name:(.*)}.test`)"
- "traefik.http.routers.joomlatools-server-https.entrypoints=websecure"
+ - "traefik.http.routers.joomlatools-server-https.service=joomlatools-server"
- "traefik.http.routers.joomlatools-server-https.tls=true"
+
# Services
+ - "traefik.http.services.dashboard.loadbalancer.server.port=8008"
- "traefik.http.services.joomlatools-server.loadbalancer.server.port=80"
volumes:
- ./sites/:/var/www/sites
@@ -166,6 +183,10 @@ services:
restart: unless-stopped
depends_on:
- joomlatools-server
+ volumes:
+ - type: bind
+ source: ./config/phpmyadmin/config.inc.php
+ target: /etc/phpmyadmin/config.user.inc.php
environment:
- PMA_HOST=joomlatools-server
- PMA_VERBOSE=joomlatools-server
diff --git a/sites/dashboard/config.php b/sites/dashboard/config.php
new file mode 100644
index 00000000..8e199e66
--- /dev/null
+++ b/sites/dashboard/config.php
@@ -0,0 +1,17 @@
+ include __DIR__.'/redirects.php',
+
+ 'extension_config' =>
+ [
+
+ ],
+
+
+ // Page
+ 'page' => [
+ 'visible' => true,
+ ]
+];
diff --git a/sites/dashboard/config/apache/server.conf b/sites/dashboard/config/apache/server.conf
new file mode 100644
index 00000000..af4f07a8
--- /dev/null
+++ b/sites/dashboard/config/apache/server.conf
@@ -0,0 +1,10 @@
+Listen 8008
+
+
+
+ use vhost
+ use site
+
+ DocumentRoot ${APP_ROOT}/sites/dashboard
+
+
\ No newline at end of file
diff --git a/sites/dashboard/data/sites.json b/sites/dashboard/data/sites.json
new file mode 100644
index 00000000..b3aee163
--- /dev/null
+++ b/sites/dashboard/data/sites.json
@@ -0,0 +1,81 @@
+[
+ {
+ "url": "#",
+ "img": "pages_thumbnail.png",
+ "name": "www.example.com",
+ "desc": "",
+ "platform_name": "Pages",
+ "platform_version": "0.24",
+ "platform_bg_color": "jtblue-200",
+ "platform_text_color": "jtblue-600"
+ },
+ {
+ "url": "#",
+ "img": "pages_thumbnail.png",
+ "name": "pagestest",
+ "desc": "",
+ "platform_name": "Pages",
+ "platform_version": "0.23",
+ "platform_bg_color": "jtblue-200",
+ "platform_text_color": "jtblue-600"
+ },
+ {
+ "url": "#",
+ "img": "j3_template_preview.png",
+ "name": "joomla3test",
+ "desc": "Joomla! - the dynamic portal engine and content management system",
+ "platform_name": "Joomla 3",
+ "platform_version": "3.10.99",
+ "platform_bg_color": "red-200",
+ "platform_text_color": "red-600"
+ },
+ {
+ "url": "#",
+ "img": "j3_template_preview.png",
+ "name": "joomla3test2",
+ "desc": "Joomla! - the dynamic portal engine and content management system",
+ "platform_name": "Joomla 3",
+ "platform_version": "3.10.15",
+ "platform_bg_color": "red-200",
+ "platform_text_color": "red-600"
+ },
+ {
+ "url": "#",
+ "img": "j4_template_preview.png",
+ "name": "joomla4test",
+ "platform_name": "Joomla 4",
+ "desc": "Joomla! - the dynamic portal engine and content management system",
+ "platform_bg_color": "green-200",
+ "platform_text_color": "green-600"
+ },
+ {
+ "url": "#",
+ "img": "j4_template_preview.png",
+ "name": "joomla4test2",
+ "platform_name": "Joomla 4",
+ "desc": "Joomla! - the dynamic portal engine and content management system",
+ "platform_version": "4.0.15",
+ "platform_bg_color": "green-200",
+ "platform_text_color": "green-600"
+ },
+ {
+ "url": "#",
+ "img": "wp_screenshot.png",
+ "name": "wptest",
+ "desc": "wordpress – Just another WordPress site",
+ "platform_name": "WordPress 5",
+ "platform_version": "5.93",
+ "platform_bg_color": "yellow-200",
+ "platform_text_color": "yellow-600"
+ },
+ {
+ "url": "#",
+ "img": "wp_screenshot.png",
+ "name": "wptest2",
+ "desc": "wordpress – Just another WordPress site",
+ "platform_name": "WordPress 6",
+ "platform_version": "6.01",
+ "platform_bg_color": "purple-200",
+ "platform_text_color": "purple-600"
+ }
+]
\ No newline at end of file
diff --git a/sites/dashboard/images/.gitkeep b/sites/dashboard/images/.gitkeep
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/sites/dashboard/images/.gitkeep
@@ -0,0 +1 @@
+
diff --git a/sites/dashboard/images/app-logos/PHP-OPcache.jpg b/sites/dashboard/images/app-logos/PHP-OPcache.jpg
new file mode 100644
index 00000000..33091e1f
Binary files /dev/null and b/sites/dashboard/images/app-logos/PHP-OPcache.jpg differ
diff --git a/sites/dashboard/images/app-logos/PhpMyAdmin_logo.jpg b/sites/dashboard/images/app-logos/PhpMyAdmin_logo.jpg
new file mode 100644
index 00000000..1a411d72
Binary files /dev/null and b/sites/dashboard/images/app-logos/PhpMyAdmin_logo.jpg differ
diff --git a/sites/dashboard/images/app-logos/Xdebug_Logo.jpg b/sites/dashboard/images/app-logos/Xdebug_Logo.jpg
new file mode 100644
index 00000000..14cd0113
Binary files /dev/null and b/sites/dashboard/images/app-logos/Xdebug_Logo.jpg differ
diff --git a/sites/dashboard/images/app-logos/dozzle.jpg b/sites/dashboard/images/app-logos/dozzle.jpg
new file mode 100644
index 00000000..244e406e
Binary files /dev/null and b/sites/dashboard/images/app-logos/dozzle.jpg differ
diff --git a/sites/dashboard/images/app-logos/mailhog.jpg b/sites/dashboard/images/app-logos/mailhog.jpg
new file mode 100644
index 00000000..daf6b71c
Binary files /dev/null and b/sites/dashboard/images/app-logos/mailhog.jpg differ
diff --git a/sites/dashboard/images/app-logos/php-apc.jpg b/sites/dashboard/images/app-logos/php-apc.jpg
new file mode 100644
index 00000000..7595b448
Binary files /dev/null and b/sites/dashboard/images/app-logos/php-apc.jpg differ
diff --git a/sites/dashboard/images/app-logos/php-fpm.jpg b/sites/dashboard/images/app-logos/php-fpm.jpg
new file mode 100644
index 00000000..fbc8a17e
Binary files /dev/null and b/sites/dashboard/images/app-logos/php-fpm.jpg differ
diff --git a/sites/dashboard/images/app-logos/php-info.jpg b/sites/dashboard/images/app-logos/php-info.jpg
new file mode 100644
index 00000000..3ad92a0f
Binary files /dev/null and b/sites/dashboard/images/app-logos/php-info.jpg differ
diff --git a/sites/dashboard/images/app-logos/traefik-proxy-logo.jpg b/sites/dashboard/images/app-logos/traefik-proxy-logo.jpg
new file mode 100644
index 00000000..e72c6dda
Binary files /dev/null and b/sites/dashboard/images/app-logos/traefik-proxy-logo.jpg differ
diff --git a/sites/dashboard/images/j3_template_preview.png b/sites/dashboard/images/j3_template_preview.png
new file mode 100644
index 00000000..1594d9dc
Binary files /dev/null and b/sites/dashboard/images/j3_template_preview.png differ
diff --git a/sites/dashboard/images/j3_template_thumbnail.png b/sites/dashboard/images/j3_template_thumbnail.png
new file mode 100644
index 00000000..90156a52
Binary files /dev/null and b/sites/dashboard/images/j3_template_thumbnail.png differ
diff --git a/sites/dashboard/images/j4_template_preview.png b/sites/dashboard/images/j4_template_preview.png
new file mode 100644
index 00000000..a83ca412
Binary files /dev/null and b/sites/dashboard/images/j4_template_preview.png differ
diff --git a/sites/dashboard/images/j4_template_thumbnail.png b/sites/dashboard/images/j4_template_thumbnail.png
new file mode 100644
index 00000000..e237919e
Binary files /dev/null and b/sites/dashboard/images/j4_template_thumbnail.png differ
diff --git a/sites/dashboard/images/joomlatools_logo_black.png b/sites/dashboard/images/joomlatools_logo_black.png
new file mode 100644
index 00000000..c201077c
Binary files /dev/null and b/sites/dashboard/images/joomlatools_logo_black.png differ
diff --git a/sites/dashboard/images/pages_thumbnail.png b/sites/dashboard/images/pages_thumbnail.png
new file mode 100644
index 00000000..f9e1f78c
Binary files /dev/null and b/sites/dashboard/images/pages_thumbnail.png differ
diff --git a/sites/dashboard/images/wp_screenshot.png b/sites/dashboard/images/wp_screenshot.png
new file mode 100644
index 00000000..9e8710cd
Binary files /dev/null and b/sites/dashboard/images/wp_screenshot.png differ
diff --git a/sites/dashboard/index.php b/sites/dashboard/index.php
new file mode 100755
index 00000000..2b0f50f4
--- /dev/null
+++ b/sites/dashboard/index.php
@@ -0,0 +1,6 @@
+
+
+
Sites running on this server
+
+ Add a site
+
+
+
+
+
+
+
Site
+
Platform
+
Actions
+
+
+ $id = 1; foreach(data('sites') as $site) : ?>
+
+ $id++; endforeach ?>
+
+
diff --git a/sites/dashboard/pages/php/.order.yaml b/sites/dashboard/pages/php/.order.yaml
new file mode 100644
index 00000000..22c875a4
--- /dev/null
+++ b/sites/dashboard/pages/php/.order.yaml
@@ -0,0 +1,6 @@
+- index.html.php
+- php-xdebug.html.php
+- php-apc.html.php
+- php-fpm.html.php
+- php-opcache.html.php
+- php-info.html.php
diff --git a/sites/dashboard/pages/php/index.html.php b/sites/dashboard/pages/php/index.html.php
new file mode 100644
index 00000000..21b62dc7
--- /dev/null
+++ b/sites/dashboard/pages/php/index.html.php
@@ -0,0 +1,124 @@
+---
+@layout:
+ path: /default
+
+
+name: PHP
+title: Joomlatools Server PHP Information and Tools
+---
+
+
+
+
PHP tools and information
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/php/php-apc.html.php b/sites/dashboard/pages/php/php-apc.html.php
new file mode 100644
index 00000000..28f3a80d
--- /dev/null
+++ b/sites/dashboard/pages/php/php-apc.html.php
@@ -0,0 +1,13 @@
+---
+@layout:
+ path: /default
+
+name: Cache
+title: Joomlatools Server APC
+summary: PHP-APC for Joomlatools Server
+visible: true
+---
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/php/php-fpm.html.php b/sites/dashboard/pages/php/php-fpm.html.php
new file mode 100644
index 00000000..2e0be5b1
--- /dev/null
+++ b/sites/dashboard/pages/php/php-fpm.html.php
@@ -0,0 +1,13 @@
+---
+@layout:
+ path: /default
+
+name: FastCGI
+title: Joomlatools Server FPM
+summary: PHP-FPM for Joomlatools Server
+visible: true
+---
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/php/php-info.html.php b/sites/dashboard/pages/php/php-info.html.php
new file mode 100644
index 00000000..6ce88a19
--- /dev/null
+++ b/sites/dashboard/pages/php/php-info.html.php
@@ -0,0 +1,15 @@
+---
+@layout:
+ path: /default
+ pageclass: embedded
+
+
+name: Information
+title: Joomlatools Server PHP Info
+summary: PHP-PHP Info for Joomlatools Server
+visible: true
+---
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/php/php-opcache.html.php b/sites/dashboard/pages/php/php-opcache.html.php
new file mode 100644
index 00000000..cd07064a
--- /dev/null
+++ b/sites/dashboard/pages/php/php-opcache.html.php
@@ -0,0 +1,14 @@
+---
+@layout:
+ path: /default
+
+
+name: Performance
+title: Joomlatools Server Opcache
+summary: PHP-Opcache for Joomlatools Server
+visible: true
+---
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/php/php-xdebug.html.php b/sites/dashboard/pages/php/php-xdebug.html.php
new file mode 100644
index 00000000..05833b11
--- /dev/null
+++ b/sites/dashboard/pages/php/php-xdebug.html.php
@@ -0,0 +1,32 @@
+---
+@layout:
+ path: /default
+ pageclass: embedded
+
+
+name: Debugging and profiling
+title: Joomlatools Server Xdebug
+summary: PHP-Xdebug for Joomlatools Server
+visible: true
+---
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/phpmyadmin.html.php b/sites/dashboard/pages/phpmyadmin.html.php
new file mode 100644
index 00000000..37bbbf09
--- /dev/null
+++ b/sites/dashboard/pages/phpmyadmin.html.php
@@ -0,0 +1,11 @@
+---
+@layout:
+ path: /default
+
+redirect: http://phpmyadmin.localhost
+
+name: Databases
+title: Joomlatools Server PhpMyAdmin
+summary: PhpMyAdmin for managing Joomlatools Server
+visible: true
+---
\ No newline at end of file
diff --git a/sites/dashboard/pages/system/.order.yaml b/sites/dashboard/pages/system/.order.yaml
new file mode 100644
index 00000000..79c75168
--- /dev/null
+++ b/sites/dashboard/pages/system/.order.yaml
@@ -0,0 +1,3 @@
+- index.html.php
+- dozzle.html.php
+- traefik.html.php
diff --git a/sites/dashboard/pages/system/dozzle.html.php b/sites/dashboard/pages/system/dozzle.html.php
new file mode 100644
index 00000000..3f69a044
--- /dev/null
+++ b/sites/dashboard/pages/system/dozzle.html.php
@@ -0,0 +1,13 @@
+---
+@layout:
+ path: /default
+
+name: Logs
+title: Joomlatools Server Dozzle
+summary: Dozzle for Joomlatools Server
+visible: true
+---
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/system/index.html.php b/sites/dashboard/pages/system/index.html.php
new file mode 100644
index 00000000..8b80136d
--- /dev/null
+++ b/sites/dashboard/pages/system/index.html.php
@@ -0,0 +1,57 @@
+---
+@layout:
+ path: /default
+
+
+name: System
+title: Joomlatools Server System Information
+---
+
+
+
+
System information tools
+
+
+
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/system/traefik.html.php b/sites/dashboard/pages/system/traefik.html.php
new file mode 100644
index 00000000..4b11fe13
--- /dev/null
+++ b/sites/dashboard/pages/system/traefik.html.php
@@ -0,0 +1,13 @@
+---
+@layout:
+ path: /default
+
+name: Proxy
+title: Joomlatools Server Traefik
+summary: Traefik for Joomlatools Server
+visible: true
+---
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/tools/.order.yaml b/sites/dashboard/pages/tools/.order.yaml
new file mode 100644
index 00000000..7bf4852d
--- /dev/null
+++ b/sites/dashboard/pages/tools/.order.yaml
@@ -0,0 +1,2 @@
+- index.html.php
+- mailhog.html.php
diff --git a/sites/dashboard/pages/tools/index.html.php b/sites/dashboard/pages/tools/index.html.php
new file mode 100644
index 00000000..e98702e8
--- /dev/null
+++ b/sites/dashboard/pages/tools/index.html.php
@@ -0,0 +1,40 @@
+---
+@layout:
+ path: /default
+
+
+name: Tools
+title: Joomlatools Server Tools
+---
+
+
+
+
\ No newline at end of file
diff --git a/sites/dashboard/pages/tools/mailhog.html.php b/sites/dashboard/pages/tools/mailhog.html.php
new file mode 100644
index 00000000..3b8d79d9
--- /dev/null
+++ b/sites/dashboard/pages/tools/mailhog.html.php
@@ -0,0 +1,13 @@
+---
+@layout:
+ path: /default
+
+name: Email testing
+title: Joomlatools Server Mailhog
+summary: Mailhog for managing Joomlatools Server
+visible: true
+---
+
+
\ No newline at end of file
diff --git a/sites/dashboard/redirects.php b/sites/dashboard/redirects.php
new file mode 100644
index 00000000..56615dd3
--- /dev/null
+++ b/sites/dashboard/redirects.php
@@ -0,0 +1,4 @@
+ '/[:path]?',
+];
diff --git a/sites/dashboard/templates/layouts/default.html.php b/sites/dashboard/templates/layouts/default.html.php
new file mode 100644
index 00000000..d3d84b02
--- /dev/null
+++ b/sites/dashboard/templates/layouts/default.html.php
@@ -0,0 +1,63 @@
+---
+@layout: /index
+@process:
+ prefetch: .navigation
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = partial('logos/joomlatools',[
+ 'display_text' => 1,
+ 'display_time' => 0,
+ 'icon_size' => '6',
+ 'icon_colour' => 'white',
+ 'direction' => 'h',
+ ]);
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sites/dashboard/templates/layouts/index.html.php b/sites/dashboard/templates/layouts/index.html.php
new file mode 100644
index 00000000..c516165f
--- /dev/null
+++ b/sites/dashboard/templates/layouts/index.html.php
@@ -0,0 +1,18 @@
+---
+@layout: template://pages/document.html
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sites/dashboard/templates/partials/javascript/calc_height.html.php b/sites/dashboard/templates/partials/javascript/calc_height.html.php
new file mode 100644
index 00000000..ea7ec18e
--- /dev/null
+++ b/sites/dashboard/templates/partials/javascript/calc_height.html.php
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/sites/dashboard/templates/partials/logos/joomlatools.html.php b/sites/dashboard/templates/partials/logos/joomlatools.html.php
new file mode 100644
index 00000000..bc27e63f
--- /dev/null
+++ b/sites/dashboard/templates/partials/logos/joomlatools.html.php
@@ -0,0 +1,48 @@
+---
+icon_size: 10
+icon_colour:
+jt_black: var(--jt-black)
+jt_blue: var(--jt-blue)
+text_colour:
+direction:
+---
+
+
+$jt_black = (isset($icon_colour)) ? $icon_colour : $jt_black;
+$text_colour = (isset($icon_colour)) ? ' text-' . $icon_colour : '';
+$direction = ($direction == 'v') ? ' flex-col' : '';
+if($display_time):
+//Inspired by: https://medium.com/@jmperezperez/displaying-page-load-metrics-on-your-site-2e13f63164eb
+?>
+
+
+ endif; ?>
+
+
+
+
+ if($display_text):?>
+ joomlatools server
+ endif; ?>
+
+ if($display_time): ?>
+Loaded in s
+ endif; ?>
+
\ No newline at end of file
diff --git a/sites/dashboard/templates/partials/navigation/mainmenu.html.php b/sites/dashboard/templates/partials/navigation/mainmenu.html.php
new file mode 100644
index 00000000..d4591a66
--- /dev/null
+++ b/sites/dashboard/templates/partials/navigation/mainmenu.html.php
@@ -0,0 +1,71 @@
+ $pages = collection('pages', ['path' => $path ?? '/', 'level' => 3, 'recurse' => 'true', 'filter' => ['visible' => 'neq:false']]) ?>
+
+ foreach ($pages as $page) : ?>
+
+ // var_dump(page()->path);die;?>
+
+
+ = $page->name ?>
+
+
+ foreach($page->getChildren() as $child): ?>
+ if (strpos(page()->path, $page->path) === 0): ?>
+
+ if ($child->getChildren()): ?>
+
+
+ "
+ >
+
+ foreach($child->getChildren() as $sub):
+ ?>
+
+
+
+
+ = $sub->name ?>
+
+ endforeach; ?>
+
+
+
+ else: ?>
+
+
+ = $child->name ?>
+
+
+ endif; ?>
+ endif; ?>
+ endforeach; ?>
+ endforeach; ?>
+
\ No newline at end of file
diff --git a/sites/dashboard/theme/css/fonts.css b/sites/dashboard/theme/css/fonts.css
new file mode 100644
index 00000000..55abc516
--- /dev/null
+++ b/sites/dashboard/theme/css/fonts.css
@@ -0,0 +1,30 @@
+/**
+ * @license
+ * MyFonts Webfont Build ID 3961211, 2020-10-15T18:13:17-0400
+ *
+ * The fonts listed in this notice are subject to the End User License
+ * Agreement(s) entered into by the website owner. All other parties are
+ * explicitly restricted from using the Licensed Webfonts(s).
+ *
+ * You may obtain a valid license at the URLs below.
+ *
+ * Webfont: VAGRoundedTL-Regular by Tilde
+ * URL: https://www.myfonts.com/fonts/tilde/vag-rounded/regular/
+ * Copyright: Copyright 1990-2007 Bitstream Inc. All rights reserved. Modification for European languages. Copyright 1995-2007 Tilde, SIA.
+ *
+ *
+ *
+ * © 2020 MyFonts Inc
+*/
+
+
+/* @import must be at top of file, otherwise CSS will not work */
+@import url("//hello.myfonts.net/count/3c717b");
+
+@font-face {
+ font-family: 'VAGRoundedTL-Regular';
+ font-display: swap;
+ src: local(''),
+ url('../fonts/vag-rounded-tl-regular/vag-rounded-tl-regular.woff2') format('woff2'),
+ url('../fonts/vag-rounded-tl-regular/vag-rounded-tl-regular.woff') format('woff');
+}
diff --git a/sites/dashboard/theme/css/input.css b/sites/dashboard/theme/css/input.css
new file mode 100644
index 00000000..0453ef6f
--- /dev/null
+++ b/sites/dashboard/theme/css/input.css
@@ -0,0 +1,213 @@
+/* tailwind */
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+/* custom */
+@layer base {
+
+ :root {
+ /* Joomlatools logo colour override used /partials/logo/joomaltools.html.php */
+ --jt-blue:#00adef;
+ --jt-black:#000000;
+ }
+ /* add tailwind classes to pagination select list so it's pretty */
+ select.k-form-control {
+ @apply block appearance-none w-full bg-white border border-gray-100 hover:border-gray-200 px-4 py-2 pr-8 rounded shadow leading-tight focus:outline-none;
+ }
+ /* Pagination */
+ .k-pagination__pages {
+ padding-top: 8px;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ border: none;
+ background: transparent;
+ display: flex;
+ justify-content: center;
+ }
+ @media screen and (min-width: 560px) {
+ .k-pagination__pages {
+ padding-top: 12px;
+ }
+ }
+ @media screen and (min-width: 1024px) {
+ .k-pagination__pages {
+ padding-top: 16px;
+ }
+ }
+ .k-pagination__pages li {
+ margin: 0 4px;
+ }
+ .k-pagination__pages li a, .k-pagination__pages li span {
+ display: block;
+ min-width: 40px;
+ min-height: 40px;
+ text-align: center;
+ }
+ .k-pagination__pages li a {
+ position: relative;
+ overflow: hidden;
+ text-decoration: none;
+ border-radius: 50%;
+ background: #f1f1f1;
+ color: #333;
+ line-height: 40px;
+ transition: background 200ms cubic-bezier(0.195, 0.4, 0.45, 0.785) 0ms;
+ }
+ .k-pagination__pages li a:after {
+ content: "";
+ background: rgba(255, 255, 255, 0.3);
+ display: block;
+ position: absolute;
+ border-radius: 50%;
+ padding-top: 240%;
+ padding-left: 240%;
+ margin-top: -120%;
+ margin-left: -120%;
+ opacity: 0;
+ transition: all 1s;
+ }
+ .k-pagination__pages li a:active:after {
+ padding-top: 0;
+ padding-left: 0;
+ margin-top: 0;
+ margin-left: 0;
+ opacity: 1;
+ transition: 0s;
+ }
+ .k-pagination__pages li a[href]:hover, .k-pagination__pages li a[href]:focus {
+ background: #ddd;
+ }
+ .k-pagination__pages li span {
+ line-height: 40px;
+ }
+ .k-pagination__pages li span.active {
+ line-height: 40px;
+ background: #0089d6;
+ color: white;
+ border-radius: 50%;
+ }
+ .k-pagination__pages [aria-label="Next page"],
+ .k-pagination__pages [aria-label="Previous page"] {
+ position: relative;
+ }
+ .k-pagination__pages [aria-label="Next page"]:before,
+ .k-pagination__pages [aria-label="Previous page"]:before {
+ content: " ";
+ background: url("../assets/icons/custom/arrow.svg") 0px 5px no-repeat;
+ background-size: contain;
+ display: inline-block;
+ height: 24px;
+ width: 24px;
+ transform: scale(0.85);
+ opacity: 0.2;
+ transition: all 0.3s ease;
+ }
+ .k-pagination__pages [aria-label="Next page"]:hover:before,
+ .k-pagination__pages [aria-label="Previous page"]:hover:before {
+ transform: scale(1);
+ opacity: 0.8;
+ }
+ .k-pagination__pages [aria-label="Next page"] span,
+ .k-pagination__pages [aria-label="Previous page"] span {
+ display: none;
+ }
+ .k-pagination__pages [aria-label="Previous page"] {
+ position: relative;
+ }
+ .k-pagination__pages [aria-label="Previous page"]:before {
+ background-position: 0 -5px;
+ transform: scale(0.85) rotate(180deg);
+ }
+ .k-pagination__pages [aria-label="Previous page"]:hover:before {
+ transform: scale(1) rotate(180deg);
+ }
+
+ /* smooth scroll */
+ html {
+ background: white;
+ scroll-behavior: smooth;
+ }
+ @media screen and (prefers-reduced-motion: reduce) {
+ html {
+ scroll-behavior: auto;
+ }
+ }
+ /* tooltips */
+ .tooltip {
+ @apply invisible absolute;
+ }
+
+ .has-tooltip:hover .tooltip {
+ @apply visible whitespace-nowrap z-50;
+ }
+
+ .embedded a:link,
+ .embedded a:hover,
+ .embedded a:visited {
+ background-color: inherit;
+ color: inherit;
+ text-decoration: inherit;
+ }
+ .embedded a.is-active {
+ @apply text-gray-100;
+ }
+
+ /* 'md': '768px' */
+ @media (min-width: 768px) {
+ #sites {
+ grid-template-columns: 20% 20% 20% 40%;
+ grid-template-areas: "a b b b"
+ "a c c c"
+ "a d d ."
+ "a e e f"
+ }
+ }
+
+ /* 'lg': '1024px' */
+ @media (min-width: 1024px) {
+ #sites {
+ grid-template-columns: 30% 30% 40%;
+ grid-template-areas: "a a a"
+ "b b b"
+ "c c c"
+ "d d ."
+ "e e f"
+ }
+ }
+
+ #sites > div:nth-child(1) {
+ grid-area: a;
+ }
+
+ #sites > div:nth-child(2) {
+ grid-area: b;
+ }
+
+ #sites > div:nth-child(3) {
+ grid-area: c;
+ }
+
+ #sites > div:nth-child(4) {
+ /*background-color: red;*/
+ grid-area: d;
+ }
+
+ #sites > div:nth-child(5) {
+ grid-area: e;
+ }
+
+ #sites > div:nth-child(6) {
+ grid-area: f;
+ }
+
+}
+
+@layer components {
+
+}
+
+@layer utilities {
+
+}
\ No newline at end of file
diff --git a/sites/dashboard/theme/css/output.css b/sites/dashboard/theme/css/output.css
new file mode 100644
index 00000000..3f6e934c
--- /dev/null
+++ b/sites/dashboard/theme/css/output.css
@@ -0,0 +1,1602 @@
+/* tailwind */
+
+/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */
+
+/*
+Document
+========
+*/
+
+/**
+Use a better box model (opinionated).
+*/
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+/**
+Use a more readable tab size (opinionated).
+*/
+
+:root {
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+}
+
+/**
+1. Correct the line height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+*/
+
+html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/*
+Sections
+========
+*/
+
+/**
+Remove the margin in all browsers.
+*/
+
+body {
+ margin: 0;
+}
+
+/**
+Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
+*/
+
+body {
+ font-family:
+ system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif,
+ 'Segoe UI',
+ Roboto,
+ Helvetica,
+ Arial,
+ sans-serif,
+ 'Apple Color Emoji',
+ 'Segoe UI Emoji';
+}
+
+/*
+Grouping content
+================
+*/
+
+/**
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+*/
+
+hr {
+ height: 0; /* 1 */
+ color: inherit; /* 2 */
+}
+
+/*
+Text-level semantics
+====================
+*/
+
+/**
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr[title] {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+
+/**
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/**
+1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
+2. Correct the odd 'em' font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-family:
+ ui-monospace,
+ SFMono-Regular,
+ Consolas,
+ 'Liberation Mono',
+ Menlo,
+ monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+
+/**
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/**
+Prevent 'sub' and 'sup' elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+Tabular data
+============
+*/
+
+/**
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+*/
+
+table {
+ text-indent: 0; /* 1 */
+ border-color: inherit; /* 2 */
+}
+
+/*
+Forms
+=====
+*/
+
+/**
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+}
+
+/**
+Remove the inheritance of text transform in Edge and Firefox.
+1. Remove the inheritance of text transform in Firefox.
+*/
+
+button,
+select { /* 1 */
+ text-transform: none;
+}
+
+/**
+Correct the inability to style clickable types in iOS and Safari.
+*/
+
+button,
+[type='button'] {
+ -webkit-appearance: button;
+}
+
+/**
+Remove the inner border and padding in Firefox.
+*/
+
+/**
+Restore the focus styles unset by the previous rule.
+*/
+
+/**
+Remove the additional ':invalid' styles in Firefox.
+See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737
+*/
+
+/**
+Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.
+*/
+
+legend {
+ padding: 0;
+}
+
+/**
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/**
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+/**
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+/**
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+/**
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to 'inherit' in Safari.
+*/
+
+/*
+Interactive
+===========
+*/
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/**
+ * Manually forked from SUIT CSS Base: https://github.com/suitcss/base
+ * A thin layer on top of normalize.css that provides a starting point more
+ * suitable for web applications.
+ */
+
+/**
+ * Removes the default spacing and border for appropriate elements.
+ */
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
+}
+
+button {
+ background-color: transparent;
+ background-image: none;
+}
+
+/**
+ * Work around a Firefox/IE bug where the transparent `button` background
+ * results in a loss of the default `button` focus styles.
+ */
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+ol,
+ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/**
+ * Tailwind custom reset styles
+ */
+
+/**
+ * 1. Use the user's configured `sans` font-family (with Tailwind's default
+ * sans-serif font stack as a fallback) as a sane default.
+ * 2. Use Tailwind's default "normal" line-height so the user isn't forced
+ * to override it to ensure consistency even when using the default theme.
+ */
+
+html {
+ font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 1 */
+ line-height: 1.5; /* 2 */
+}
+
+/**
+ * Inherit font-family and line-height from `html` so users can set them as
+ * a class directly on the `html` element.
+ */
+
+body {
+ font-family: inherit;
+ line-height: inherit;
+}
+
+/**
+ * 1. Prevent padding and border from affecting element width.
+ *
+ * We used to set this in the html element and inherit from
+ * the parent element for everything else. This caused issues
+ * in shadow-dom-enhanced elements like where the content
+ * is wrapped by a div with box-sizing set to `content-box`.
+ *
+ * https://github.com/mozdevs/cssremedy/issues/4
+ *
+ *
+ * 2. Allow adding a border to an element by just adding a border-width.
+ *
+ * By default, the way the browser specifies that an element should have no
+ * border is by setting it's border-style to `none` in the user-agent
+ * stylesheet.
+ *
+ * In order to easily add borders to elements by just setting the `border-width`
+ * property, we change the default border-style for all elements to `solid`, and
+ * use border-width to hide them instead. This way our `border` utilities only
+ * need to set the `border-width` property instead of the entire `border`
+ * shorthand, making our border utilities much more straightforward to compose.
+ *
+ * https://github.com/tailwindcss/tailwindcss/pull/116
+ */
+
+*,
+::before,
+::after {
+ box-sizing: border-box; /* 1 */
+ border-width: 0; /* 2 */
+ border-style: solid; /* 2 */
+ border-color: #e5e7eb; /* 2 */
+}
+
+/*
+ * Ensure horizontal rules are visible by default
+ */
+
+hr {
+ border-top-width: 1px;
+}
+
+/**
+ * Undo the `border-style: none` reset that Normalize applies to images so that
+ * our `border-{width}` utilities have the expected effect.
+ *
+ * The Normalize reset is unnecessary for us since we default the border-width
+ * to 0 on all elements.
+ *
+ * https://github.com/tailwindcss/tailwindcss/issues/362
+ */
+
+img {
+ border-style: solid;
+}
+
+textarea {
+ resize: vertical;
+}
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ color: #9ca3af;
+}
+
+input:-ms-input-placeholder, textarea:-ms-input-placeholder {
+ color: #9ca3af;
+}
+
+input::placeholder,
+textarea::placeholder {
+ color: #9ca3af;
+}
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+/**
+ * Reset links to optimize for opt-in styling instead of
+ * opt-out.
+ */
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/**
+ * Reset form element properties that are easy to forget to
+ * style explicitly so you don't inadvertently introduce
+ * styles that deviate from your design system. These styles
+ * supplement a partial reset that is already applied by
+ * normalize.css.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ padding: 0;
+ line-height: inherit;
+ color: inherit;
+}
+
+/**
+ * Use the configured 'mono' font family for elements that
+ * are expected to be rendered with a monospace font, falling
+ * back to the system monospace stack if there is no configured
+ * 'mono' font family.
+ */
+
+pre,
+code,
+kbd,
+samp {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+}
+
+/**
+ * Make replaced elements `display: block` by default as that's
+ * the behavior you want almost all of the time. Inspired by
+ * CSS Remedy, with `svg` added as well.
+ *
+ * https://github.com/mozdevs/cssremedy/issues/14
+ */
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block;
+ vertical-align: middle;
+}
+
+/**
+ * Constrain images and videos to the parent width and preserve
+ * their instrinsic aspect ratio.
+ *
+ * https://github.com/mozdevs/cssremedy/issues/14
+ */
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+:root {
+ /* Joomlatools logo colour override used /partials/logo/joomaltools.html.php */
+ --jt-blue:#00adef;
+ --jt-black:#000000;
+}
+
+/* add tailwind classes to pagination select list so it's pretty */
+
+/* Pagination */
+
+/* smooth scroll */
+
+html {
+ background: white;
+ scroll-behavior: smooth;
+}
+
+@media screen and (prefers-reduced-motion: reduce) {
+ html {
+ scroll-behavior: auto;
+ }
+}
+
+/* tooltips */
+
+.tooltip {
+ position: absolute;
+ visibility: hidden;
+}
+
+.has-tooltip:hover .tooltip {
+ visibility: visible;
+ white-space: nowrap;
+ z-index: 50;
+}
+
+.embedded a:link,
+ .embedded a:hover,
+ .embedded a:visited {
+ background-color: inherit;
+ color: inherit;
+ text-decoration: inherit;
+}
+
+.embedded a.is-active {
+ --tw-text-opacity: 1;
+ color: rgba(243, 244, 246, var(--tw-text-opacity));
+}
+
+/* 'md': '768px' */
+
+@media (min-width: 768px) {
+ #sites {
+ grid-template-columns: 20% 20% 20% 40%;
+ grid-template-areas: "a b b b"
+ "a c c c"
+ "a d d ."
+ "a e e f"
+ }
+}
+
+/* 'lg': '1024px' */
+
+@media (min-width: 1024px) {
+ #sites {
+ grid-template-columns: 30% 30% 40%;
+ grid-template-areas: "a a a"
+ "b b b"
+ "c c c"
+ "d d ."
+ "e e f"
+ }
+}
+
+#sites > div:nth-child(1) {
+ grid-area: a;
+}
+
+#sites > div:nth-child(2) {
+ grid-area: b;
+}
+
+#sites > div:nth-child(3) {
+ grid-area: c;
+}
+
+#sites > div:nth-child(4) {
+ /*background-color: red;*/
+ grid-area: d;
+}
+
+#sites > div:nth-child(5) {
+ grid-area: e;
+}
+
+#sites > div:nth-child(6) {
+ grid-area: f;
+}
+
+.container {
+ width: 100%;
+}
+
+@media (min-width: 640px) {
+ .container {
+ max-width: 640px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 768px;
+ }
+}
+
+@media (min-width: 1024px) {
+ .container {
+ max-width: 1024px;
+ }
+}
+
+@media (min-width: 1280px) {
+ .container {
+ max-width: 1280px;
+ }
+}
+
+@media (min-width: 1536px) {
+ .container {
+ max-width: 1536px;
+ }
+}
+
+.space-y-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
+}
+
+.space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.bg-white {
+ --tw-bg-opacity: 1;
+ background-color: rgba(255, 255, 255, var(--tw-bg-opacity));
+}
+
+.bg-gray-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(243, 244, 246, var(--tw-bg-opacity));
+}
+
+.bg-gray-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(229, 231, 235, var(--tw-bg-opacity));
+}
+
+.bg-gray-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(31, 41, 55, var(--tw-bg-opacity));
+}
+
+.bg-red-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(254, 226, 226, var(--tw-bg-opacity));
+}
+
+.bg-red-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(254, 202, 202, var(--tw-bg-opacity));
+}
+
+.bg-yellow-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(253, 230, 138, var(--tw-bg-opacity));
+}
+
+.bg-green-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(167, 243, 208, var(--tw-bg-opacity));
+}
+
+.bg-purple-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(221, 214, 254, var(--tw-bg-opacity));
+}
+
+.bg-jtblue-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(177, 238, 246, var(--tw-bg-opacity));
+}
+
+.bg-jtblue-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(15, 123, 213, var(--tw-bg-opacity));
+}
+
+.hover\:bg-gray-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgba(243, 244, 246, var(--tw-bg-opacity));
+}
+
+.hover\:bg-gray-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgba(31, 41, 55, var(--tw-bg-opacity));
+}
+
+.hover\:bg-jtblue-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgba(19, 98, 176, var(--tw-bg-opacity));
+}
+
+.focus\:bg-jtblue-700:focus {
+ --tw-bg-opacity: 1;
+ background-color: rgba(19, 98, 176, var(--tw-bg-opacity));
+}
+
+.bg-gradient-to-tr {
+ background-image: linear-gradient(to top right, var(--tw-gradient-stops));
+}
+
+.bg-gradient-to-b {
+ background-image: linear-gradient(to bottom, var(--tw-gradient-stops));
+}
+
+.from-indigo-700 {
+ --tw-gradient-from: #4338ca;
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(67, 56, 202, 0));
+}
+
+.via-indigo-800 {
+ --tw-gradient-stops: var(--tw-gradient-from), #3730a3, var(--tw-gradient-to, rgba(55, 48, 163, 0));
+}
+
+.to-indigo-900 {
+ --tw-gradient-to: #312e81;
+}
+
+.border-gray-200 {
+ --tw-border-opacity: 1;
+ border-color: rgba(229, 231, 235, var(--tw-border-opacity));
+}
+
+.border-gray-300 {
+ --tw-border-opacity: 1;
+ border-color: rgba(209, 213, 219, var(--tw-border-opacity));
+}
+
+.rounded {
+ border-radius: 0.25rem;
+}
+
+.rounded-lg {
+ border-radius: 0.5rem;
+}
+
+.rounded-full {
+ border-radius: 9999px;
+}
+
+.border {
+ border-width: 1px;
+}
+
+.border-b {
+ border-bottom-width: 1px;
+}
+
+.cursor-pointer {
+ cursor: pointer;
+}
+
+.block {
+ display: block;
+}
+
+.inline {
+ display: inline;
+}
+
+.flex {
+ display: flex;
+}
+
+.inline-flex {
+ display: inline-flex;
+}
+
+.table {
+ display: table;
+}
+
+.grid {
+ display: grid;
+}
+
+.hidden {
+ display: none;
+}
+
+.flex-row {
+ flex-direction: row;
+}
+
+.flex-col {
+ flex-direction: column;
+}
+
+.place-items-center {
+ align-items: center;
+ justify-items: center;
+ place-items: center;
+}
+
+.place-self-center {
+ align-self: center;
+ justify-self: center;
+ place-self: center;
+}
+
+.items-center {
+ align-items: center;
+}
+
+.justify-end {
+ justify-content: flex-end;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.justify-between {
+ justify-content: space-between;
+}
+
+.flex-1 {
+ flex: 1 1 0%;
+}
+
+.font-jt {
+ font-family: VAGRoundedTL-Regular, "Arial Rounded", sans-serif;
+}
+
+.font-medium {
+ font-weight: 500;
+}
+
+.font-semibold {
+ font-weight: 600;
+}
+
+.font-bold {
+ font-weight: 700;
+}
+
+.h-4 {
+ height: 1rem;
+}
+
+.h-5 {
+ height: 1.25rem;
+}
+
+.h-6 {
+ height: 1.5rem;
+}
+
+.h-20 {
+ height: 5rem;
+}
+
+.h-40 {
+ height: 10rem;
+}
+
+.h-full {
+ height: 100%;
+}
+
+.h-screen {
+ height: 100vh;
+}
+
+.text-xs {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.text-xl {
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+
+.text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+}
+
+.leading-tight {
+ line-height: 1.25;
+}
+
+.leading-normal {
+ line-height: 1.5;
+}
+
+.my-8 {
+ margin-top: 2rem;
+ margin-bottom: 2rem;
+}
+
+.mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.mt-2 {
+ margin-top: 0.5rem;
+}
+
+.mr-2 {
+ margin-right: 0.5rem;
+}
+
+.mt-3 {
+ margin-top: 0.75rem;
+}
+
+.mr-3 {
+ margin-right: 0.75rem;
+}
+
+.mt-4 {
+ margin-top: 1rem;
+}
+
+.mb-4 {
+ margin-bottom: 1rem;
+}
+
+.mb-8 {
+ margin-bottom: 2rem;
+}
+
+.-ml-8 {
+ margin-left: -2rem;
+}
+
+.-mt-12 {
+ margin-top: -3rem;
+}
+
+.-ml-24 {
+ margin-left: -6rem;
+}
+
+.-ml-28 {
+ margin-left: -7rem;
+}
+
+.max-h-screen {
+ max-height: 100vh;
+}
+
+.max-w-7xl {
+ max-width: 80rem;
+}
+
+.min-h-screen {
+ min-height: 100vh;
+}
+
+.object-cover {
+ -o-object-fit: cover;
+ object-fit: cover;
+}
+
+.object-top {
+ -o-object-position: top;
+ object-position: top;
+}
+
+.focus\:outline-none:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+}
+
+.overflow-x-hidden {
+ overflow-x: hidden;
+}
+
+.overflow-x-scroll {
+ overflow-x: scroll;
+}
+
+.overflow-y-scroll {
+ overflow-y: scroll;
+}
+
+.p-1 {
+ padding: 0.25rem;
+}
+
+.p-2 {
+ padding: 0.5rem;
+}
+
+.p-4 {
+ padding: 1rem;
+}
+
+.py-1 {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+}
+
+.py-2 {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.px-2 {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.py-3 {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+}
+
+.px-3 {
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
+.py-4 {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+}
+
+.px-4 {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.py-5 {
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+}
+
+.px-5 {
+ padding-left: 1.25rem;
+ padding-right: 1.25rem;
+}
+
+.px-6 {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+}
+
+.py-2\.5 {
+ padding-top: 0.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.pl-0 {
+ padding-left: 0px;
+}
+
+.pt-2 {
+ padding-top: 0.5rem;
+}
+
+.pr-2 {
+ padding-right: 0.5rem;
+}
+
+.pb-6 {
+ padding-bottom: 1.5rem;
+}
+
+.pb-8 {
+ padding-bottom: 2rem;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.relative {
+ position: relative;
+}
+
+* {
+ --tw-shadow: 0 0 rgba(0,0,0,0);
+}
+
+.shadow {
+ --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
+ box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);
+}
+
+.shadow-md {
+ --tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
+ box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);
+}
+
+.shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);
+}
+
+.hover\:shadow-lg:hover {
+ --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);
+}
+
+.focus\:shadow-lg:focus {
+ --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);
+}
+
+* {
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgba(59, 130, 246, 0.5);
+ --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);
+ --tw-ring-shadow: 0 0 rgba(0,0,0,0);
+}
+
+.focus\:ring-0:focus {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));
+}
+
+.fill-current {
+ fill: currentColor;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-white {
+ --tw-text-opacity: 1;
+ color: rgba(255, 255, 255, var(--tw-text-opacity));
+}
+
+.text-gray-100 {
+ --tw-text-opacity: 1;
+ color: rgba(243, 244, 246, var(--tw-text-opacity));
+}
+
+.text-gray-400 {
+ --tw-text-opacity: 1;
+ color: rgba(156, 163, 175, var(--tw-text-opacity));
+}
+
+.text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgba(107, 114, 128, var(--tw-text-opacity));
+}
+
+.text-gray-600 {
+ --tw-text-opacity: 1;
+ color: rgba(75, 85, 99, var(--tw-text-opacity));
+}
+
+.text-red-600 {
+ --tw-text-opacity: 1;
+ color: rgba(220, 38, 38, var(--tw-text-opacity));
+}
+
+.text-red-700 {
+ --tw-text-opacity: 1;
+ color: rgba(185, 28, 28, var(--tw-text-opacity));
+}
+
+.text-yellow-600 {
+ --tw-text-opacity: 1;
+ color: rgba(217, 119, 6, var(--tw-text-opacity));
+}
+
+.text-green-600 {
+ --tw-text-opacity: 1;
+ color: rgba(5, 150, 105, var(--tw-text-opacity));
+}
+
+.text-purple-600 {
+ --tw-text-opacity: 1;
+ color: rgba(124, 58, 237, var(--tw-text-opacity));
+}
+
+.text-jtblue-600 {
+ --tw-text-opacity: 1;
+ color: rgba(15, 123, 213, var(--tw-text-opacity));
+}
+
+.hover\:text-gray-100:hover {
+ --tw-text-opacity: 1;
+ color: rgba(243, 244, 246, var(--tw-text-opacity));
+}
+
+.hover\:text-purple-500:hover {
+ --tw-text-opacity: 1;
+ color: rgba(139, 92, 246, var(--tw-text-opacity));
+}
+
+.uppercase {
+ text-transform: uppercase;
+}
+
+.hover\:underline:hover {
+ text-decoration: underline;
+}
+
+.antialiased {
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.visible {
+ visibility: visible;
+}
+
+.whitespace-nowrap {
+ white-space: nowrap;
+}
+
+.w-4 {
+ width: 1rem;
+}
+
+.w-5 {
+ width: 1.25rem;
+}
+
+.w-6 {
+ width: 1.5rem;
+}
+
+.w-20 {
+ width: 5rem;
+}
+
+.w-40 {
+ width: 10rem;
+}
+
+.w-64 {
+ width: 16rem;
+}
+
+.w-3\/12 {
+ width: 25%;
+}
+
+.w-4\/12 {
+ width: 33.333333%;
+}
+
+.w-5\/12 {
+ width: 41.666667%;
+}
+
+.w-full {
+ width: 100%;
+}
+
+.z-50 {
+ z-index: 50;
+}
+
+.gap-4 {
+ grid-gap: 1rem;
+ gap: 1rem;
+}
+
+.grid-cols-1 {
+ grid-template-columns: repeat(1, minmax(0, 1fr));
+}
+
+.transform {
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.hover\:scale-105:hover {
+ --tw-scale-x: 1.05;
+ --tw-scale-y: 1.05;
+}
+
+.hover\:scale-110:hover {
+ --tw-scale-x: 1.1;
+ --tw-scale-y: 1.1;
+}
+
+.-translate-x-full {
+ --tw-translate-x: -100%;
+}
+
+.transition-all {
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition {
+ transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-colors {
+ transition-property: background-color, border-color, color, fill, stroke;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.ease-in-out {
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.duration-150 {
+ transition-duration: 150ms;
+}
+
+.duration-300 {
+ transition-duration: 300ms;
+}
+
+.duration-500 {
+ transition-duration: 500ms;
+}
+
+@-webkit-keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@-webkit-keyframes ping {
+ 75%, 100% {
+ transform: scale(2);
+ opacity: 0;
+ }
+}
+
+@keyframes ping {
+ 75%, 100% {
+ transform: scale(2);
+ opacity: 0;
+ }
+}
+
+@-webkit-keyframes pulse {
+ 50% {
+ opacity: .5;
+ }
+}
+
+@keyframes pulse {
+ 50% {
+ opacity: .5;
+ }
+}
+
+@-webkit-keyframes bounce {
+ 0%, 100% {
+ transform: translateY(-25%);
+ -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);
+ animation-timing-function: cubic-bezier(0.8,0,1,1);
+ }
+
+ 50% {
+ transform: none;
+ -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);
+ animation-timing-function: cubic-bezier(0,0,0.2,1);
+ }
+}
+
+@keyframes bounce {
+ 0%, 100% {
+ transform: translateY(-25%);
+ -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);
+ animation-timing-function: cubic-bezier(0.8,0,1,1);
+ }
+
+ 50% {
+ transform: none;
+ -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);
+ animation-timing-function: cubic-bezier(0,0,0.2,1);
+ }
+}
+
+/* custom */
+
+@media (min-width: 640px) {
+ .sm\:grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media (min-width: 768px) {
+ .md\:bg-transparent {
+ background-color: transparent;
+ }
+
+ .md\:bg-white {
+ --tw-bg-opacity: 1;
+ background-color: rgba(255, 255, 255, var(--tw-bg-opacity));
+ }
+
+ .md\:hover\:bg-white:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgba(255, 255, 255, var(--tw-bg-opacity));
+ }
+
+ .md\:rounded-none {
+ border-radius: 0px;
+ }
+
+ .md\:rounded-lg {
+ border-radius: 0.5rem;
+ }
+
+ .md\:border-none {
+ border-style: none;
+ }
+
+ .md\:block {
+ display: block;
+ }
+
+ .md\:flex {
+ display: flex;
+ }
+
+ .md\:grid {
+ display: grid;
+ }
+
+ .md\:hidden {
+ display: none;
+ }
+
+ .md\:text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ }
+
+ .md\:text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+ }
+
+ .md\:m-4 {
+ margin: 1rem;
+ }
+
+ .md\:relative {
+ position: relative;
+ }
+
+ .md\:shadow {
+ --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
+ box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);
+ }
+
+ .md\:shadow-none {
+ --tw-shadow: 0 0 rgba(0,0,0,0);
+ box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);
+ }
+
+ .md\:text-left {
+ text-align: left;
+ }
+
+ .md\:w-full {
+ width: 100%;
+ }
+
+ .md\:gap-8 {
+ grid-gap: 2rem;
+ gap: 2rem;
+ }
+
+ .md\:hover\:scale-105:hover {
+ --tw-scale-x: 1.05;
+ --tw-scale-y: 1.05;
+ }
+
+ .md\:translate-x-0 {
+ --tw-translate-x: 0px;
+ }
+}
+
+@media (min-width: 1024px) {
+ .lg\:rounded-b-none {
+ border-bottom-right-radius: 0px;
+ border-bottom-left-radius: 0px;
+ }
+
+ .lg\:rounded-t-lg {
+ border-top-left-radius: 0.5rem;
+ border-top-right-radius: 0.5rem;
+ }
+
+ .lg\:place-self-start {
+ align-self: start;
+ justify-self: start;
+ place-self: start;
+ }
+
+ .lg\:h-40 {
+ height: 10rem;
+ }
+
+ .lg\:w-full {
+ width: 100%;
+ }
+
+ .lg\:grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .lg\:grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+}
+
+@media (min-width: 1280px) {
+ .xl\:grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+}
+
+@media (min-width: 1536px) {
+ .\32xl\:grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ }
+}
+/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImlucHV0LmNzcyIsIjxubyBzb3VyY2U+Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWE7O0FBQ2IsOEZBQWM7O0FBQWQ7OztDQUFjOztBQUFkOztDQUFjOztBQUFkOzs7RUFBQSxzQkFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEsZ0JBQWM7RUFBZCxjQUFjO0tBQWQsV0FBYztBQUFBOztBQUFkOzs7Q0FBYzs7QUFBZDtFQUFBLGlCQUFjLEVBQWQsTUFBYztFQUFkLDhCQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOzs7Q0FBYzs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLFNBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBOzs7Ozs7OztrQkFBYztBQUFBOztBQUFkOzs7Q0FBYzs7QUFBZDs7O0NBQWM7O0FBQWQ7RUFBQSxTQUFjLEVBQWQsTUFBYztFQUFkLGNBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkOztDQUFjOztBQUFkO0VBQUEseUNBQWM7VUFBZCxpQ0FBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOztFQUFBLG1CQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkOzs7O0VBQUE7Ozs7OztXQUFjLEVBQWQsTUFBYztFQUFkLGNBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7RUFBQSxjQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsY0FBYztFQUFkLGNBQWM7RUFBZCxrQkFBYztFQUFkLHdCQUFjO0FBQUE7O0FBQWQ7RUFBQSxlQUFjO0FBQUE7O0FBQWQ7RUFBQSxXQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkOzs7Q0FBYzs7QUFBZDtFQUFBLGNBQWMsRUFBZCxNQUFjO0VBQWQscUJBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkOzs7Q0FBYzs7QUFBZDs7Ozs7RUFBQSxvQkFBYyxFQUFkLE1BQWM7RUFBZCxlQUFjLEVBQWQsTUFBYztFQUFkLGlCQUFjLEVBQWQsTUFBYztFQUFkLFNBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkO1NBQUEsTUFBYztFQUFkLG9CQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsMEJBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7Q0FBYzs7QUFBZDs7O0NBQWM7O0FBQWQ7O0NBQWM7O0FBQWQ7RUFBQSxVQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7RUFBQSx3QkFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOzs7Q0FBYzs7QUFBZDs7Q0FBYzs7QUFBZDs7O0NBQWM7O0FBQWQ7OztDQUFjOztBQUFkOztDQUFjOztBQUFkO0VBQUEsa0JBQWM7QUFBQTs7QUFBZDs7OztFQUFjOztBQUFkOztFQUFjOztBQUFkOzs7Ozs7Ozs7Ozs7O0VBQUEsU0FBYztBQUFBOztBQUFkO0VBQUEsNkJBQWM7RUFBZCxzQkFBYztBQUFBOztBQUFkOzs7RUFBYzs7QUFBZDtFQUFBLG1CQUFjO0VBQWQsMENBQWM7QUFBQTs7QUFBZDtFQUFBLFNBQWM7RUFBZCxVQUFjO0FBQUE7O0FBQWQ7O0VBQUEsZ0JBQWM7RUFBZCxTQUFjO0VBQWQsVUFBYztBQUFBOztBQUFkOztFQUFjOztBQUFkOzs7OztFQUFjOztBQUFkO0VBQUEsd1JBQWMsRUFBZCxNQUFjO0VBQWQsZ0JBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7OztFQUFjOztBQUFkO0VBQUEsb0JBQWM7RUFBZCxvQkFBYztBQUFBOztBQUFkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFBYzs7QUFBZDs7O0VBQUEsc0JBQWMsRUFBZCxNQUFjO0VBQWQsZUFBYyxFQUFkLE1BQWM7RUFBZCxtQkFBYyxFQUFkLE1BQWM7RUFBZCxxQkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7RUFBYzs7QUFBZDtFQUFBLHFCQUFjO0FBQUE7O0FBQWQ7Ozs7Ozs7O0VBQWM7O0FBQWQ7RUFBQSxtQkFBYztBQUFBOztBQUFkO0VBQUEsZ0JBQWM7QUFBQTs7QUFBZDtFQUFBLGNBQWM7QUFBQTs7QUFBZDtFQUFBLGNBQWM7QUFBQTs7QUFBZDs7RUFBQSxjQUFjO0FBQUE7O0FBQWQ7O0VBQUEsZUFBYztBQUFBOztBQUFkO0VBQUEseUJBQWM7QUFBQTs7QUFBZDs7Ozs7O0VBQUEsa0JBQWM7RUFBZCxvQkFBYztBQUFBOztBQUFkOzs7RUFBYzs7QUFBZDtFQUFBLGNBQWM7RUFBZCx3QkFBYztBQUFBOztBQUFkOzs7Ozs7RUFBYzs7QUFBZDs7Ozs7RUFBQSxVQUFjO0VBQWQsb0JBQWM7RUFBZCxjQUFjO0FBQUE7O0FBQWQ7Ozs7O0VBQWM7O0FBQWQ7Ozs7RUFBQSwrR0FBYztBQUFBOztBQUFkOzs7Ozs7RUFBYzs7QUFBZDs7Ozs7Ozs7RUFBQSxjQUFjO0VBQWQsc0JBQWM7QUFBQTs7QUFBZDs7Ozs7RUFBYzs7QUFBZDs7RUFBQSxlQUFjO0VBQWQsWUFBYztBQUFBOztBQU9iO0VBQ0MsOEVBQThFO0VBQzlFLGlCQUFpQjtFQUNqQixrQkFBa0I7QUFDbkI7O0FBQ0Esa0VBQWtFOztBQUlsRSxlQUFlOztBQTZHZixrQkFBa0I7O0FBQ2xCO0VBQ0UsaUJBQWlCO0VBQ2pCLHVCQUF1QjtBQUN6Qjs7QUFDQTtFQUNFO0lBQ0UscUJBQXFCO0VBQ3ZCO0FBQ0Y7O0FBQ0EsYUFBYTs7QUFDYjtFQXRJRCxrQkFBbUI7RUFBbkIsa0JBQW1CO0FBd0lsQjs7QUFFQTtFQTFJRCxtQkFBbUI7RUFBbkIsbUJBQW1CO0VBQW5CLFdBQW1CO0FBNElsQjs7QUFFQTs7O0VBR0MseUJBQXlCO0VBQ3RCLGNBQWM7RUFDZCx3QkFBd0I7QUFDNUI7O0FBQ0E7RUFySkQsb0JBQW1CO0VBQW5CLGtEQUFtQjtBQXVKbEI7O0FBRUEsa0JBQWtCOztBQUNsQjtFQUNDO0lBQ0Msc0NBQXNDO0lBQ3RDOzs7O0VBSUQ7QUFDRDs7QUFFQSxtQkFBbUI7O0FBQ25CO0VBQ0M7SUFDQyxrQ0FBa0M7SUFDbEM7Ozs7O0VBS0Q7QUFDRDs7QUFFQTtFQUNDLFlBQVk7QUFDYjs7QUFFQTtFQUNDLFlBQVk7QUFDYjs7QUFFQTtFQUNDLFlBQVk7QUFDYjs7QUFFQTtFQUNDLHlCQUF5QjtFQUN6QixZQUFZO0FBQ2I7O0FBRUE7RUFDQyxZQUFZO0FBQ2I7O0FBRUE7RUFDQyxZQUFZO0FBQ2I7O0FBeE1EO0VBQUE7QUFBb0I7O0FBQXBCO0VBQUE7SUFBQTtFQUFvQjtBQUFBOztBQUFwQjtFQUFBO0lBQUE7RUFBb0I7QUFBQTs7QUFBcEI7RUFBQTtJQUFBO0VBQW9CO0FBQUE7O0FBQXBCO0VBQUE7SUFBQTtFQUFvQjtBQUFBOztBQUFwQjtFQUFBO0lBQUE7RUFBb0I7QUFBQTs7QUFDcEI7RUFBQSx1QkFBbUI7RUFBbkIsK0RBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLHVCQUFtQjtFQUFuQixvREFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUEsMkJBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CLHFCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkIsb0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBLG9CQUFtQjtLQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSx1QkFBbUI7S0FBbkI7QUFBbUI7O0FBQW5CO0VBQUEsOEJBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUEsNEVBQW1CO0VBQW5CLGtFQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxrRkFBbUI7RUFBbkIsa0VBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLG9GQUFtQjtFQUFuQixrRUFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsb0ZBQW1CO0VBQW5CLGtFQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxvRkFBbUI7RUFBbkIsa0VBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLDRDQUFtQjtFQUFuQiwyQkFBbUI7RUFBbkIsNEJBQW1CO0VBQW5CLHdDQUFtQjtFQUFuQiwwQ0FBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsMkdBQW1CO0VBQW5CLHlHQUFtQjtFQUFuQixrRkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBO0FBQW1COztBQUFuQjtFQUFBLG1DQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQSxjQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQTtBQUFtQjs7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkIsbUJBQW1CO0VBQW5CLGNBQW1CO0VBQW5CLGNBQW1CO0VBQW5CLGNBQW1CO0VBQW5CLGVBQW1CO0VBQW5CLGVBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUEsd0JBQW1CO0VBQW5CLHdEQUFtQjtFQUFuQjtBQUFtQjs7QUFBbkI7RUFBQSx3R0FBbUI7RUFBbkIsd0RBQW1CO0VBQW5CO0FBQW1COztBQUFuQjtFQUFBLHdFQUFtQjtFQUFuQix3REFBbUI7RUFBbkI7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7QUFBbUI7O0FBQW5CO0VBQUE7SUFBQTtFQUFtQjtBQUFBOztBQUFuQjtFQUFBO0lBQUE7RUFBbUI7QUFBQTs7QUFBbkI7RUFBQTtJQUFBLG1CQUFtQjtJQUFuQjtFQUFtQjtBQUFBOztBQUFuQjtFQUFBO0lBQUEsbUJBQW1CO0lBQW5CO0VBQW1CO0FBQUE7O0FBQW5CO0VBQUE7SUFBQTtFQUFtQjtBQUFBOztBQUFuQjtFQUFBO0lBQUE7RUFBbUI7QUFBQTs7QUFBbkI7RUFBQTtJQUFBLDJCQUFtQjtJQUFuQiwwREFBbUI7WUFBbkI7RUFBbUI7O0VBQW5CO0lBQUEsZUFBbUI7SUFBbkIsMERBQW1CO1lBQW5CO0VBQW1CO0FBQUE7O0FBQW5CO0VBQUE7SUFBQSwyQkFBbUI7SUFBbkIsMERBQW1CO1lBQW5CO0VBQW1COztFQUFuQjtJQUFBLGVBQW1CO0lBQW5CLDBEQUFtQjtZQUFuQjtFQUFtQjtBQUFBOztBQUVuQixXQUFXOztBQ0xYO0VER0E7SUFBQTtFQUFtQjtDQ0huQjs7QUFBQTtFREdBO0lBQUE7RUFBbUI7O0VBQW5CO0lBQUEsa0JBQW1CO0lBQW5CO0VBQW1COztFQUFuQjtJQUFBLGtCQUFtQjtJQUFuQjtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQSxtQkFBbUI7SUFBbkI7RUFBbUI7O0VBQW5CO0lBQUEsaUJBQW1CO0lBQW5CO0VBQW1COztFQUFuQjtJQUFBO0VBQW1COztFQUFuQjtJQUFBO0VBQW1COztFQUFuQjtJQUFBLDRFQUFtQjtJQUFuQixrRUFBbUI7SUFBbkI7RUFBbUI7O0VBQW5CO0lBQUEsOEJBQW1CO0lBQW5CLGtFQUFtQjtJQUFuQjtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQSxjQUFtQjtJQUFuQjtFQUFtQjs7RUFBbkI7SUFBQSxrQkFBbUI7SUFBbkI7RUFBbUI7O0VBQW5CO0lBQUE7RUFBbUI7Q0NIbkI7O0FBQUE7RURHQTtJQUFBLCtCQUFtQjtJQUFuQjtFQUFtQjs7RUFBbkI7SUFBQSw4QkFBbUI7SUFBbkI7RUFBbUI7O0VBQW5CO0lBQUEsaUJBQW1CO0lBQW5CLG1CQUFtQjtJQUFuQjtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjs7RUFBbkI7SUFBQTtFQUFtQjtDQ0huQjs7QUFBQTtFREdBO0lBQUE7RUFBbUI7Q0NIbkI7O0FBQUE7RURHQTtJQUFBO0VBQW1CO0NDSG5CIiwiZmlsZSI6Im91dHB1dC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0YWlsd2luZCAqL1xuQHRhaWx3aW5kIGJhc2U7XG5AdGFpbHdpbmQgY29tcG9uZW50cztcbkB0YWlsd2luZCB1dGlsaXRpZXM7XG5cbi8qIGN1c3RvbSAqL1xuQGxheWVyIGJhc2Uge1xuXG5cdDpyb290IHtcblx0XHQvKiBKb29tbGF0b29scyBsb2dvIGNvbG91ciBvdmVycmlkZSB1c2VkIC9wYXJ0aWFscy9sb2dvL2pvb21hbHRvb2xzLmh0bWwucGhwICovXG5cdFx0LS1qdC1ibHVlOiMwMGFkZWY7XG5cdFx0LS1qdC1ibGFjazojMDAwMDAwO1xuXHR9XG5cdC8qIGFkZCB0YWlsd2luZCBjbGFzc2VzIHRvIHBhZ2luYXRpb24gc2VsZWN0IGxpc3Qgc28gaXQncyBwcmV0dHkgKi9cblx0c2VsZWN0LmstZm9ybS1jb250cm9sIHtcblx0XHRAYXBwbHkgYmxvY2sgYXBwZWFyYW5jZS1ub25lIHctZnVsbCBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMTAwIGhvdmVyOmJvcmRlci1ncmF5LTIwMCBweC00IHB5LTIgcHItOCByb3VuZGVkIHNoYWRvdyBsZWFkaW5nLXRpZ2h0IGZvY3VzOm91dGxpbmUtbm9uZTtcblx0fVxuXHQvKiBQYWdpbmF0aW9uICovXG5cdC5rLXBhZ2luYXRpb25fX3BhZ2VzIHtcblx0ICBwYWRkaW5nLXRvcDogOHB4O1xuXHQgIG1hcmdpbjogMDtcblx0ICBwYWRkaW5nOiAwO1xuXHQgIGxpc3Qtc3R5bGU6IG5vbmU7XG5cdCAgYm9yZGVyOiBub25lO1xuXHQgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHQgIGRpc3BsYXk6IGZsZXg7XG5cdCAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdH1cblx0QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTYwcHgpIHtcblx0ICAuay1wYWdpbmF0aW9uX19wYWdlcyB7XG5cdCAgICBwYWRkaW5nLXRvcDogMTJweDtcblx0ICB9XG5cdH1cblx0QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTAyNHB4KSB7XG5cdCAgLmstcGFnaW5hdGlvbl9fcGFnZXMge1xuXHQgICAgcGFkZGluZy10b3A6IDE2cHg7XG5cdCAgfVxuXHR9XG5cdC5rLXBhZ2luYXRpb25fX3BhZ2VzIGxpIHtcblx0ICBtYXJnaW46IDAgNHB4O1xuXHR9XG5cdC5rLXBhZ2luYXRpb25fX3BhZ2VzIGxpIGEsIC5rLXBhZ2luYXRpb25fX3BhZ2VzIGxpIHNwYW4ge1xuXHQgIGRpc3BsYXk6IGJsb2NrO1xuXHQgIG1pbi13aWR0aDogNDBweDtcblx0ICBtaW4taGVpZ2h0OiA0MHB4O1xuXHQgIHRleHQtYWxpZ246IGNlbnRlcjtcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBsaSBhIHtcblx0ICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cdCAgb3ZlcmZsb3c6IGhpZGRlbjtcblx0ICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdCAgYm9yZGVyLXJhZGl1czogNTAlO1xuXHQgIGJhY2tncm91bmQ6ICNmMWYxZjE7XG5cdCAgY29sb3I6ICMzMzM7XG5cdCAgbGluZS1oZWlnaHQ6IDQwcHg7XG5cdCAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAyMDBtcyBjdWJpYy1iZXppZXIoMC4xOTUsIDAuNCwgMC40NSwgMC43ODUpIDBtcztcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBsaSBhOmFmdGVyIHtcblx0ICBjb250ZW50OiBcIlwiO1xuXHQgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTtcblx0ICBkaXNwbGF5OiBibG9jaztcblx0ICBwb3NpdGlvbjogYWJzb2x1dGU7XG5cdCAgYm9yZGVyLXJhZGl1czogNTAlO1xuXHQgIHBhZGRpbmctdG9wOiAyNDAlO1xuXHQgIHBhZGRpbmctbGVmdDogMjQwJTtcblx0ICBtYXJnaW4tdG9wOiAtMTIwJTtcblx0ICBtYXJnaW4tbGVmdDogLTEyMCU7XG5cdCAgb3BhY2l0eTogMDtcblx0ICB0cmFuc2l0aW9uOiBhbGwgMXM7XG5cdH1cblx0LmstcGFnaW5hdGlvbl9fcGFnZXMgbGkgYTphY3RpdmU6YWZ0ZXIge1xuXHQgIHBhZGRpbmctdG9wOiAwO1xuXHQgIHBhZGRpbmctbGVmdDogMDtcblx0ICBtYXJnaW4tdG9wOiAwO1xuXHQgIG1hcmdpbi1sZWZ0OiAwO1xuXHQgIG9wYWNpdHk6IDE7XG5cdCAgdHJhbnNpdGlvbjogMHM7XG5cdH1cblx0LmstcGFnaW5hdGlvbl9fcGFnZXMgbGkgYVtocmVmXTpob3ZlciwgLmstcGFnaW5hdGlvbl9fcGFnZXMgbGkgYVtocmVmXTpmb2N1cyB7XG5cdCAgYmFja2dyb3VuZDogI2RkZDtcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBsaSBzcGFuIHtcblx0ICBsaW5lLWhlaWdodDogNDBweDtcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBsaSBzcGFuLmFjdGl2ZSB7XG5cdCAgbGluZS1oZWlnaHQ6IDQwcHg7XG5cdCAgYmFja2dyb3VuZDogIzAwODlkNjtcblx0ICBjb2xvcjogd2hpdGU7XG5cdCAgYm9yZGVyLXJhZGl1czogNTAlO1xuXHR9XG5cdC5rLXBhZ2luYXRpb25fX3BhZ2VzIFthcmlhLWxhYmVsPVwiTmV4dCBwYWdlXCJdLFxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBbYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIl0ge1xuXHQgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBbYXJpYS1sYWJlbD1cIk5leHQgcGFnZVwiXTpiZWZvcmUsXG5cdC5rLXBhZ2luYXRpb25fX3BhZ2VzIFthcmlhLWxhYmVsPVwiUHJldmlvdXMgcGFnZVwiXTpiZWZvcmUge1xuXHQgIGNvbnRlbnQ6IFwiIFwiO1xuXHQgIGJhY2tncm91bmQ6IHVybChcIi4uL2Fzc2V0cy9pY29ucy9jdXN0b20vYXJyb3cuc3ZnXCIpIDBweCA1cHggbm8tcmVwZWF0O1xuXHQgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcblx0ICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdCAgaGVpZ2h0OiAyNHB4O1xuXHQgIHdpZHRoOiAyNHB4O1xuXHQgIHRyYW5zZm9ybTogc2NhbGUoMC44NSk7XG5cdCAgb3BhY2l0eTogMC4yO1xuXHQgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XG5cdH1cblx0LmstcGFnaW5hdGlvbl9fcGFnZXMgW2FyaWEtbGFiZWw9XCJOZXh0IHBhZ2VcIl06aG92ZXI6YmVmb3JlLFxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBbYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIl06aG92ZXI6YmVmb3JlIHtcblx0ICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuXHQgIG9wYWNpdHk6IDAuODtcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBbYXJpYS1sYWJlbD1cIk5leHQgcGFnZVwiXSBzcGFuLFxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBbYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIl0gc3BhbiB7XG5cdCAgZGlzcGxheTogbm9uZTtcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBbYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIl0ge1xuXHQgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBbYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIl06YmVmb3JlIHtcblx0ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC01cHg7XG5cdCAgdHJhbnNmb3JtOiBzY2FsZSgwLjg1KSByb3RhdGUoMTgwZGVnKTtcblx0fVxuXHQuay1wYWdpbmF0aW9uX19wYWdlcyBbYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIl06aG92ZXI6YmVmb3JlIHtcblx0ICB0cmFuc2Zvcm06IHNjYWxlKDEpIHJvdGF0ZSgxODBkZWcpO1xuXHR9XG5cblx0Lyogc21vb3RoIHNjcm9sbCAqL1xuXHRodG1sIHtcblx0ICBiYWNrZ3JvdW5kOiB3aGl0ZTtcblx0ICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDtcblx0fVxuXHRAbWVkaWEgc2NyZWVuIGFuZCAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7XG5cdCAgaHRtbCB7XG5cdCAgICBzY3JvbGwtYmVoYXZpb3I6IGF1dG87XG5cdCAgfVxuXHR9XG5cdC8qIHRvb2x0aXBzICovXG5cdC50b29sdGlwIHtcblx0ICBAYXBwbHkgaW52aXNpYmxlIGFic29sdXRlO1xuXHR9XG5cblx0Lmhhcy10b29sdGlwOmhvdmVyIC50b29sdGlwIHtcblx0ICBAYXBwbHkgdmlzaWJsZSB3aGl0ZXNwYWNlLW5vd3JhcCB6LTUwO1xuXHR9XG5cblx0LmVtYmVkZGVkIGE6bGluaywgXG5cdC5lbWJlZGRlZCBhOmhvdmVyLCBcblx0LmVtYmVkZGVkIGE6dmlzaXRlZCB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcbiAgICBcdGNvbG9yOiBpbmhlcml0O1xuICAgIFx0dGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0O1xuXHR9XG5cdC5lbWJlZGRlZCBhLmlzLWFjdGl2ZSB7XG5cdFx0QGFwcGx5IHRleHQtZ3JheS0xMDA7XG5cdH1cblxuXHQvKiAnbWQnOiAnNzY4cHgnICovXG5cdEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuXHRcdCNzaXRlcyB7XG5cdFx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDIwJSAyMCUgMjAlIDQwJTtcblx0XHRcdGdyaWQtdGVtcGxhdGUtYXJlYXM6IFwiYSBiIGIgYlwiXG5cdFx0XHQgICAgICAgICAgICAgICAgICAgICBcImEgYyBjIGNcIlxuXHRcdFx0ICAgICAgICAgICAgICAgICAgICAgXCJhIGQgZCAuXCJcblx0XHRcdCAgICAgICAgICAgICAgICAgICAgIFwiYSBlIGUgZlwiXG5cdFx0fVxuXHR9XG5cblx0LyogJ2xnJzogJzEwMjRweCcgKi9cblx0QG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuXHRcdCNzaXRlcyB7XG5cdFx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDMwJSAzMCUgNDAlO1xuXHRcdFx0Z3JpZC10ZW1wbGF0ZS1hcmVhczogXCJhIGEgYVwiXG5cdFx0XHQgICAgICAgICAgICAgICAgICAgICBcImIgYiBiXCJcblx0XHRcdCAgICAgICAgICAgICAgICAgICAgIFwiYyBjIGNcIlxuXHRcdFx0ICAgICAgICAgICAgICAgICAgICAgXCJkIGQgLlwiXG5cdFx0XHQgICAgICAgICAgICAgICAgICAgICBcImUgZSBmXCJcblx0XHR9XG5cdH1cblxuXHQjc2l0ZXMgPiBkaXY6bnRoLWNoaWxkKDEpIHtcblx0XHRncmlkLWFyZWE6IGE7XG5cdH1cblxuXHQjc2l0ZXMgPiBkaXY6bnRoLWNoaWxkKDIpIHtcblx0XHRncmlkLWFyZWE6IGI7XG5cdH1cblxuXHQjc2l0ZXMgPiBkaXY6bnRoLWNoaWxkKDMpIHtcblx0XHRncmlkLWFyZWE6IGM7XG5cdH1cblxuXHQjc2l0ZXMgPiBkaXY6bnRoLWNoaWxkKDQpIHtcblx0XHQvKmJhY2tncm91bmQtY29sb3I6IHJlZDsqL1xuXHRcdGdyaWQtYXJlYTogZDtcblx0fVxuXG5cdCNzaXRlcyA+IGRpdjpudGgtY2hpbGQoNSkge1xuXHRcdGdyaWQtYXJlYTogZTtcblx0fVxuXG5cdCNzaXRlcyA+IGRpdjpudGgtY2hpbGQoNikge1xuXHRcdGdyaWQtYXJlYTogZjtcblx0fVxuXG59XG5cbkBsYXllciBjb21wb25lbnRzIHtcblxufVxuXG5AbGF5ZXIgdXRpbGl0aWVzIHtcblxufSIsbnVsbF19 */
\ No newline at end of file
diff --git a/sites/dashboard/theme/css/output.min.css b/sites/dashboard/theme/css/output.min.css
new file mode 100644
index 00000000..025a0fe8
--- /dev/null
+++ b/sites/dashboard/theme/css/output.min.css
@@ -0,0 +1 @@
+/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9ca3af}input::placeholder,textarea::placeholder{color:#9ca3af}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}:root{--jt-blue:#00adef;--jt-black:#000}html{background:#fff;scroll-behavior:smooth}@media screen and (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}.tooltip{position:absolute;visibility:hidden}.has-tooltip:hover .tooltip{visibility:visible;white-space:nowrap;z-index:50}.embedded a:hover,.embedded a:link,.embedded a:visited{background-color:inherit;color:inherit;text-decoration:inherit}.embedded a.is-active{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}@media (min-width:768px){#sites{grid-template-columns:20% 20% 20% 40%;grid-template-areas:"a b b b" "a c c c" "a d d ." "a e e f"}}@media (min-width:1024px){#sites{grid-template-columns:30% 30% 40%;grid-template-areas:"a a a" "b b b" "c c c" "d d ." "e e f"}}#sites>div:first-child{grid-area:a}#sites>div:nth-child(2){grid-area:b}#sites>div:nth-child(3){grid-area:c}#sites>div:nth-child(4){grid-area:d}#sites>div:nth-child(5){grid-area:e}#sites>div:nth-child(6){grid-area:f}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.25rem*var(--tw-space-y-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.bg-jtblue-200{--tw-bg-opacity:1;background-color:rgba(177,238,246,var(--tw-bg-opacity))}.bg-jtblue-600{--tw-bg-opacity:1;background-color:rgba(15,123,213,var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.focus\:bg-jtblue-700:focus,.hover\:bg-jtblue-700:hover{--tw-bg-opacity:1;background-color:rgba(19,98,176,var(--tw-bg-opacity))}.bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.bg-gradient-to-b{background-image:linear-gradient(180deg,var(--tw-gradient-stops))}.from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.to-indigo-900{--tw-gradient-to:#312e81}.border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.border{border-width:1px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.place-items-center{align-items:center;justify-items:center;place-items:center}.place-self-center{align-self:center;justify-self:center;place-self:center}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.flex-1{flex:1 1 0%}.font-jt{font-family:VAGRoundedTL-Regular,Arial Rounded,sans-serif}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-20{height:5rem}.h-40{height:10rem}.h-full{height:100%}.h-screen{height:100vh}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.-ml-8{margin-left:-2rem}.-mt-12{margin-top:-3rem}.-ml-24{margin-left:-6rem}.-ml-28{margin-left:-7rem}.max-h-screen{max-height:100vh}.max-w-7xl{max-width:80rem}.min-h-screen{min-height:100vh}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.pl-0{padding-left:0}.pt-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.absolute{position:absolute}.relative{position:relative}*{--tw-shadow:0 0 transparent}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.shadow,.shadow-md{box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.focus\:shadow-lg:focus,.hover\:shadow-lg:hover,.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}*{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 transparent;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.fill-current{fill:currentColor}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.text-jtblue-600{--tw-text-opacity:1;color:rgba(15,123,213,var(--tw-text-opacity))}.hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.uppercase{text-transform:uppercase}.hover\:underline:hover{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.visible{visibility:visible}.whitespace-nowrap{white-space:nowrap}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-20{width:5rem}.w-40{width:10rem}.w-64{width:16rem}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-full{width:100%}.z-50{z-index:50}.gap-4{grid-gap:1rem;gap:1rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.transform{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.-translate-x-full{--tw-translate-x:-100%}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150{transition-duration:.15s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\:bg-transparent{background-color:transparent}.md\:bg-white,.md\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:rounded-none{border-radius:0}.md\:rounded-lg{border-radius:.5rem}.md\:border-none{border-style:none}.md\:block{display:block}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:m-4{margin:1rem}.md\:relative{position:relative}.md\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.md\:shadow,.md\:shadow-none{box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.md\:shadow-none{--tw-shadow:0 0 transparent}.md\:text-left{text-align:left}.md\:w-full{width:100%}.md\:gap-8{grid-gap:2rem;gap:2rem}.md\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.md\:translate-x-0{--tw-translate-x:0px}}@media (min-width:1024px){.lg\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.lg\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.lg\:place-self-start{align-self:start;justify-self:start;place-self:start}.lg\:h-40{height:10rem}.lg\:w-full{width:100%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:1536px){.\32xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
\ No newline at end of file
diff --git a/sites/dashboard/theme/fonts/vag-rounded-tl-regular/vag-rounded-tl-regular.woff b/sites/dashboard/theme/fonts/vag-rounded-tl-regular/vag-rounded-tl-regular.woff
new file mode 100644
index 00000000..4da21617
Binary files /dev/null and b/sites/dashboard/theme/fonts/vag-rounded-tl-regular/vag-rounded-tl-regular.woff differ
diff --git a/sites/dashboard/theme/fonts/vag-rounded-tl-regular/vag-rounded-tl-regular.woff2 b/sites/dashboard/theme/fonts/vag-rounded-tl-regular/vag-rounded-tl-regular.woff2
new file mode 100644
index 00000000..e311cc05
Binary files /dev/null and b/sites/dashboard/theme/fonts/vag-rounded-tl-regular/vag-rounded-tl-regular.woff2 differ
diff --git a/sites/dashboard/theme/manifest.json b/sites/dashboard/theme/manifest.json
new file mode 100644
index 00000000..71acfc2c
--- /dev/null
+++ b/sites/dashboard/theme/manifest.json
@@ -0,0 +1,5 @@
+{
+ "name": "Dashboard",
+ "background_color": "#ffffff",
+ "display": "browser"
+}
\ No newline at end of file
diff --git a/sites/dashboard/theme/mason.js b/sites/dashboard/theme/mason.js
new file mode 100644
index 00000000..acb6d86a
--- /dev/null
+++ b/sites/dashboard/theme/mason.js
@@ -0,0 +1,113 @@
+const mason = require('@joomlatools/mason-tools-v1');
+
+async function postcss() {
+ await mason.css.process(`css/input.css`, `css/output.css`, {
+ tailwind: {
+ purge: {
+ enabled: true,
+ content: [
+ '../**/*.html.php',
+ ],
+ options: {
+ safelist: [
+ // body tag
+ 'antialiased',
+ 'bg-gray-100',
+ // logo icon
+ 'w-6',
+ 'h-6',
+ // Platform colors
+ 'bg-jtblue-200',
+ 'text-jtblue-600',
+ 'bg-red-200',
+ 'text-red-600',
+ 'bg-green-200',
+ 'text-green-600',
+ 'bg-yellow-200',
+ 'text-yellow-600',
+ 'bg-purple-200',
+ 'text-purple-600',
+ 'bg-jtblue-200',
+ 'text-jtblue-600',
+ ],
+ },
+ },
+ theme: {
+ extend: {
+ colors: {
+ // Joomlatools blue
+ 'brand': '#00adef',
+ 'jtblue': {
+ '50': '#f2fafc',
+ '100': '#ddf8fa',
+ '200': '#b1eef6',
+ '300': '#7bdef2',
+ '400': '#37c1ee',
+ '500': '#00adef',
+ '600': '#0f7bd5',
+ '700': '#1362b0',
+ '800': '#134a81',
+ '900': '#113c63',
+ },
+ },
+ fontFamily: {
+ // Joomlatools webfont
+ 'jt': ['VAGRoundedTL-Regular', '"Arial Rounded"', 'sans-serif'],
+ },
+ }
+ },
+ variants: {
+ opacity: ['responsive', 'hover'],
+ borderWidth: ['responsive', 'hover', 'focus'],
+ },
+ plugins: [
+ // require('@tailwindcss/typography'),
+ ],
+ },
+
+ postcssPresetEnv: {
+ stage: 2, // default is 2 (A Working Draft championed by a W3C Working Group.)
+ autoprefixer: { cascade: true },
+ features: {
+ //'focus-within-pseudo-class': false, // Uncomment this if purge is set to false - See troubleshooting below
+ },
+ },
+
+ postcssImport: {
+ //root: process.cwd() //define the root where to resolve path (eg: place where node_modules are)
+ },
+
+ plugins: [
+ // add your own postcss plugins here
+ // they will run after postcss-import and before other default plugins
+ require('postcss-nested'),
+ ]
+
+ });
+}
+
+async function sync() {
+ mason.browserSync({
+ watch: true,
+ server: {
+ baseDir: './sites/dashboard/theme'
+ },
+ files: 'css/*.css',
+ });
+}
+
+module.exports = {
+ version: '1.0',
+ tasks: {
+ postcss,
+ sync,
+ watch: {
+ path: ['.'],
+ callback: async (path) => {
+ if (path.endsWith('css/input.css')) {
+ await postcss();
+ }
+ },
+ },
+ },
+};