From ed3a0d65104a90d17f1fe5c34b5813560b73c153 Mon Sep 17 00:00:00 2001 From: dyzulk <66510723+dyzulk@users.noreply.github.com> Date: Sun, 18 Jan 2026 16:00:12 +0700 Subject: [PATCH] docs: add MIT license --- LICENSE | 21 + README.md | 21 + plugin.php | 234 +++ theme/alogin.html | 57 + theme/api.json | 11 + theme/assets/aa.txt | 0 theme/assets/css/styles.css | 2512 ++++++++++++++++++++++++++ theme/assets/img/logo-m-dark.svg | 6 + theme/assets/img/logo-m.svg | 6 + theme/assets/js/alpine.min.js | 5 + theme/assets/js/html5-qrcode.min.js | 1 + theme/assets/js/i18n.js | 55 + theme/assets/js/main.js | 88 + theme/assets/js/md5.js | 62 + theme/assets/js/qr.js | 164 ++ theme/assets/js/theme.js | 24 + theme/assets/lang/en.json | 61 + theme/assets/lang/id.json | 61 + theme/assets/svg/id.svg | 4 + theme/assets/svg/us.svg | 9 + theme/error.html | 91 + theme/favicon.ico | Bin 0 -> 562718 bytes theme/login.html | 395 ++++ theme/logout.html | 109 ++ theme/radvert.html | 62 + theme/redirect.html | 41 + theme/rlogin.html | 51 + theme/status.html | 245 +++ theme/xml/WISPAccessGatewayParam.xsd | 101 ++ theme/xml/alogin.html | 18 + theme/xml/error.html | 12 + theme/xml/login.html | 22 + theme/xml/logout.html | 11 + theme/xml/rlogin.html | 15 + 34 files changed, 4575 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 plugin.php create mode 100644 theme/alogin.html create mode 100644 theme/api.json create mode 100644 theme/assets/aa.txt create mode 100644 theme/assets/css/styles.css create mode 100644 theme/assets/img/logo-m-dark.svg create mode 100644 theme/assets/img/logo-m.svg create mode 100644 theme/assets/js/alpine.min.js create mode 100644 theme/assets/js/html5-qrcode.min.js create mode 100644 theme/assets/js/i18n.js create mode 100644 theme/assets/js/main.js create mode 100644 theme/assets/js/md5.js create mode 100644 theme/assets/js/qr.js create mode 100644 theme/assets/js/theme.js create mode 100644 theme/assets/lang/en.json create mode 100644 theme/assets/lang/id.json create mode 100644 theme/assets/svg/id.svg create mode 100644 theme/assets/svg/us.svg create mode 100644 theme/error.html create mode 100644 theme/favicon.ico create mode 100644 theme/login.html create mode 100644 theme/logout.html create mode 100644 theme/radvert.html create mode 100644 theme/redirect.html create mode 100644 theme/rlogin.html create mode 100644 theme/status.html create mode 100644 theme/xml/WISPAccessGatewayParam.xsd create mode 100644 theme/xml/alogin.html create mode 100644 theme/xml/error.html create mode 100644 theme/xml/login.html create mode 100644 theme/xml/logout.html create mode 100644 theme/xml/rlogin.html diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1a14372 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 DyzulkDev + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..58e8576 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# Mivo Theme Downloader + +**Category:** Hotspot Tools +**Author:** DyzulkDev +**Version:** 1.0.0 + +The **Mivo Theme Downloader** allows you to easily download and install the latest Captive Portal themes directly from the Mivo settings panel. + +## Features +- **One-Click Download**: Fetch the latest themes from the official repository. +- **Auto-Extraction**: Automatically extracts and places theme files in the correct directory. +- **Updates**: Keeps your hotspot login page up to date with new designs. + +## Installation +1. Download the plugin ZIP file. +2. Go to **Mivo > Settings > Plugins**. +3. Click **Upload Plugin** and select the ZIP file. +4. The plugin will appear in your installed list. + +## Usage +Navigate to the **Theme Manager** in the sidebar (under Hotspot Tools) to browse and download available themes. diff --git a/plugin.php b/plugin.php new file mode 100644 index 0000000..08931a4 --- /dev/null +++ b/plugin.php @@ -0,0 +1,234 @@ += 1.0 + */ + +// 1. Register Routes +Hooks::addAction('router_init', function(Router $router) { + + // Page to show the download button + $router->get('/{session}/theme/manager', function($session) { + $title = 'Theme Manager'; // Fallback title + + // Include Header + require ROOT . '/app/Views/layouts/header_main.php'; + + // 1. Inject Plugin Translations using the new extend() method + ?> + + +
+
+

Theme Manager

+

Manage and download your captive portal theme.

+
+ +
+

Download Mivo Theme

+

Download the fully configured captive portal theme for this router session. The package includes your specific configuration (API Base URL and Session ID) automatically injected into the theme assets.

+ +
+ +
+ +
+

Installation

+
    +
  1. Download the zip file.
  2. +
  3. Extract the contents.
  4. +
  5. Upload the folders (css, fonts, js, etc.) and login.html to your Mikrotik Hotspot directory.
  6. +
+
+
+
+ post('/{session}/theme/download', function($session) { + $sourcePath = __DIR__ . '/theme'; + if (!is_dir($sourcePath)) { + die("Theme source not found."); + } + + // Determine Configuration + $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; + $host = $_SERVER['HTTP_HOST']; + $baseUrl = $protocol . $host . '/mivo/public'; // Adjust if needed based on real deployment, maybe just $protocol . $host if root + // If app is in root: + $baseUrl = $protocol . $host; + + // Prepare Zip + $zipFile = sys_get_temp_dir() . '/mivo-theme-' . $session . '-' . date('YmdHis') . '.zip'; + $zip = new ZipArchive(); + + if ($zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) { + die("Cannot create zip file."); + } + + $files = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($sourcePath, RecursiveDirectoryIterator::SKIP_DOTS), + RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($files as $name => $file) { + if ($file->isDir()) continue; + + $filePath = $file->getRealPath(); + $relativePath = substr($filePath, strlen($sourcePath) + 1); + + // Normalize slashes for Zip + $zipPath = str_replace('\\', '/', $relativePath); + + if (strpos($zipPath, 'assets/js/main.js') !== false) { + // Read and Replace + $content = file_get_contents($filePath); + + // Replacements + $content = str_replace('apiBaseUrl: ""', 'apiBaseUrl: "' . $baseUrl . '"', $content); + $content = str_replace('apiSession: "router-jakarta-1"', 'apiSession: "' . $session . '"', $content); + + $zip->addFromString($zipPath, $content); + } else { + $zip->addFile($filePath, $zipPath); + } + } + + $zip->close(); + + // Serve File + if (file_exists($zipFile)) { + header('Content-Description: File Transfer'); + header('Content-Type: application/zip'); + header('Content-Disposition: attachment; filename="mivo-theme-'.$session.'.zip"'); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($zipFile)); + readfile($zipFile); + unlink($zipFile); + exit; + } else { + die("Failed to create zip."); + } + }); + +}); + +// 2. Inject Menu into Sidebar (Using Footer JS Hack) +Hooks::addAction('mivo_footer', function() { + // Get current session from URL if possible + $uri = $_SERVER['REQUEST_URI'] ?? '/'; + $parts = explode('/', trim($uri, '/')); + if (count($parts) >= 2 && $parts[1] === 'dashboard' || isset($parts[0])) { + $session = $parts[0]; // Assuming /{session}/... + + // Check if it's a valid session context looking like a session string + // Simple basic check to avoid injecting on non-session pages + if (!empty($session) && $session !== 'settings' && $session !== 'login' && $session !== 'install') { + ?> + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ +
+
+ +
+

Redirecting...

+

You are being redirected to your destination.

+
+ +

+ If you are not redirected automatically, click here. +

+
+ +
+

MIVO THEME BY DYZULKDEV • POWERED BY MIVO

+
+ +
+ + + + + + diff --git a/theme/api.json b/theme/api.json new file mode 100644 index 0000000..7074b29 --- /dev/null +++ b/theme/api.json @@ -0,0 +1,11 @@ +{ + "captive": $(if logged-in == 'yes')false$(else)true$(endif), + "user-portal-url": "$(link-login-only)", +$(if session-timeout-secs != 0) + "seconds-remaining": $(session-timeout-secs), +$(endif) +$(if remain-bytes-total) + "bytes-remaining": $(remain-bytes-total), +$(endif) + "can-extend-session": true +} diff --git a/theme/assets/aa.txt b/theme/assets/aa.txt new file mode 100644 index 0000000..e69de29 diff --git a/theme/assets/css/styles.css b/theme/assets/css/styles.css new file mode 100644 index 0000000..672de9d --- /dev/null +++ b/theme/assets/css/styles.css @@ -0,0 +1,2512 @@ +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --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; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --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; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +/* +! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (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 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: Inter, sans-serif; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +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) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +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; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +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; +} + +/* +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) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden]:where(:not([hidden="until-found"])) { + display: none; +} + +:root { + --background: #f8fafc; + /* Lighter background for better contrast */ + --foreground: #020617; + /* Deeper slate for text */ + --accents-1: #f1f5f9; + --accents-2: #e2e8f0; + --accents-3: #cbd5e1; + --accents-4: #94a3b8; + --accents-5: #64748b; + --accents-6: #475569; + --accents-7: #334155; + --accents-8: #0f172a; +} + +.dark { + --background: #000000; + --foreground: #ffffff; + --accents-1: #111111; + --accents-2: #333333; + --accents-3: #444444; + --accents-4: #666666; + --accents-5: #888888; + --accents-6: #999999; + --accents-7: #eaeaea; + --accents-8: #fafafa; +} + +body { + background-color: var(--background); + font-family: Inter, sans-serif; + color: var(--foreground); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Card System */ + +.card { + border-radius: 1rem; + border-width: 2px; + border-color: rgb(255 255 255 / 0.4); + background-color: rgb(255 255 255 / 0.7); + padding: 1.5rem; + color: var(--foreground); + --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-backdrop-blur: blur(40px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 500ms; +} + +.card:hover { + --tw-translate-y: -0.25rem; + transform: translate(var(--tw-translate-x), 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)); + border-color: rgb(255 255 255 / 0.6); + background-color: rgb(255 255 255 / 0.8); +} + +.card:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); + background-color: rgb(0 0 0 / 0.4); +} + +.card:hover:is(.dark *) { + border-color: rgb(255 255 255 / 0.2); + background-color: rgb(0 0 0 / 0.6); +} + +.card-inner { + border-radius: 0.75rem; + border-width: 1px; + border-color: rgb(0 0 0 / 0.05); + background-color: rgb(0 0 0 / 0.05); + padding: 1rem; + --tw-backdrop-blur: blur(12px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +.card-inner:hover { + background-color: rgb(0 0 0 / 0.1); +} + +.card-inner:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); + background-color: rgb(255 255 255 / 0.05); +} + +.card-inner:hover:is(.dark *) { + background-color: rgb(255 255 255 / 0.1); +} + +.nav-card { + position: fixed; + top: 1.5rem; + left: 50%; + z-index: 50; + display: flex; + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), 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)); + align-items: center; + gap: 0.5rem; + border-radius: 9999px; + border-width: 1px; + border-color: rgb(255 255 255 / 0.4); + background-color: rgb(255 255 255 / 0.7); + padding: 0.375rem; + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-backdrop-blur: blur(24px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 500ms; +} + +.nav-card:hover { + background-color: rgb(255 255 255 / 0.8); + --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.nav-card:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); + background-color: rgb(0 0 0 / 0.4); +} + +.nav-card:hover:is(.dark *) { + background-color: rgb(0 0 0 / 0.6); +} + +.form-input { + display: flex; + height: 2.5rem; + width: 100%; + min-width: 0px; + align-items: center; + border-radius: 0.75rem; + border-width: 1px; + border-color: var(--accents-2); + background-color: rgb(255 255 255 / 0.4); + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.875rem; + line-height: 1.25rem; + color: var(--foreground); + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-backdrop-blur: blur(24px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +.form-input::-moz-placeholder { + color: var(--accents-5); +} + +.form-input::placeholder { + color: var(--accents-5); +} + +.form-input:hover { + border-color: var(--accents-4); + background-color: rgb(255 255 255 / 0.6); + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.form-input:focus-visible { + border-color: var(--foreground); + outline: 2px solid transparent; + outline-offset: 2px; + --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(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-color: var(--foreground); +} + +.form-input:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +.form-input:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); + background-color: rgb(255 255 255 / 0.05); +} + +.form-input:hover:is(.dark *) { + background-color: rgb(255 255 255 / 0.1); +} + +/* Remove Chrome Autofill Background */ + +input:-webkit-autofill, + input:-webkit-autofill:hover, + input:-webkit-autofill:focus, + input:-webkit-autofill:active { + -webkit-box-shadow: 0 0 0 30px rgba(0,0,0,0) inset !important; + -webkit-text-fill-color: var(--foreground) !important; + -webkit-transition: background-color 5000s ease-in-out 0s; + transition: background-color 5000s ease-in-out 0s; +} + +/* Global Button System */ + +.btn { + display: inline-flex; + height: 3rem; + align-items: center; + justify-content: center; + border-radius: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + letter-spacing: 0.025em; + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +.btn:active { + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), 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)); +} + +.btn:disabled { + pointer-events: none; + opacity: 0.5; +} + +.btn-primary { + display: inline-flex; + height: 3rem; + align-items: center; + justify-content: center; + border-radius: 0.75rem; + background-color: var(--foreground); + padding-left: 1.5rem; + padding-right: 1.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + letter-spacing: 0.025em; + color: var(--background); + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +.btn-primary:hover { + opacity: 0.9; +} + +.btn-primary:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.btn-primary:active { + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), 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)); +} + +.btn-primary:disabled { + pointer-events: none; + opacity: 0.5; +} + +.btn-danger { + display: inline-flex; + height: 3rem; + align-items: center; + justify-content: center; + border-radius: 0.75rem; + border-width: 1px; + border-color: rgb(239 68 68 / 0.2); + background-color: rgb(239 68 68 / 0.1); + padding-left: 1.5rem; + padding-right: 1.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + letter-spacing: 0.025em; + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity, 1)); + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +.btn-danger:hover { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.btn-danger:active { + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), 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)); +} + +.btn-danger:disabled { + pointer-events: none; + opacity: 0.5; +} + +.btn-danger:is(.dark *) { + background-color: rgb(239 68 68 / 0.2); + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity, 1)); +} + +.btn-danger:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.btn-secondary { + display: inline-flex; + height: 3rem; + align-items: center; + justify-content: center; + border-radius: 0.75rem; + border-width: 1px; + border-color: rgb(0 0 0 / 0.05); + background-color: var(--accents-2); + padding-left: 1.5rem; + padding-right: 1.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + letter-spacing: 0.025em; + color: var(--foreground); + --tw-backdrop-blur: blur(12px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +.btn-secondary:hover { + background-color: var(--accents-3); +} + +.btn-secondary:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.btn-secondary:active { + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), 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)); +} + +.btn-secondary:disabled { + pointer-events: none; + opacity: 0.5; +} + +.btn-secondary:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); + background-color: rgb(255 255 255 / 0.05); +} + +.btn-secondary:hover:is(.dark *) { + background-color: rgb(255 255 255 / 0.1); +} + +/* Tab System */ + +.tabs-container { + position: relative; + margin-bottom: 2rem; + display: flex; + overflow: hidden; + border-radius: 0.75rem; + border-width: 1px; + border-color: rgb(0 0 0 / 0.05); + background-color: rgb(0 0 0 / 0.05); + padding: 0.25rem; + --tw-backdrop-blur: blur(12px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.tabs-container:is(.dark *) { + border-color: rgb(255 255 255 / 0.05); + background-color: rgb(0 0 0 / 0.4); +} + +.tab-link { + position: relative; + z-index: 10; + flex: 1 1 0%; + border-radius: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +.tab-link-active { + color: var(--foreground); +} + +.tab-link-active:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.tab-link-inactive { + color: var(--accents-5); +} + +.tab-link-inactive:hover { + color: var(--foreground); +} + +.tab-slider { + position: absolute; + top: 0.25rem; + bottom: 0.25rem; + left: 0.25rem; + border-radius: 0.5rem; + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 500ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.tab-slider:is(.dark *) { + background-color: rgb(255 255 255 / 0.1); +} + +/* Tab Content Sliding */ + +.tab-window { + position: relative; + width: 100%; + overflow: hidden; +} + +.tab-track { + display: flex; + width: 200%; + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 500ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.tab-track-3 { + display: flex; + width: 300%; + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 500ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.tab-pane { + width: 50%; + flex-shrink: 0; + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.tab-pane-3 { + width: 33.333333%; + flex-shrink: 0; + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +/* Theme Toggle Sliding */ + +.theme-toggle-container { + position: relative; + display: flex; + align-items: center; + gap: 0.25rem; + border-radius: 9999px; + border-width: 1px; + border-color: rgb(0 0 0 / 0.05); + background-color: rgb(0 0 0 / 0.05); + padding: 0.25rem; +} + +.theme-toggle-container:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); + background-color: rgb(255 255 255 / 0.05); +} + +.theme-slider { + position: absolute; + top: 0.25rem; + bottom: 0.25rem; + left: 0.25rem; + width: 2rem; + border-radius: 9999px; + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 500ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.theme-slider:is(.dark *) { + background-color: rgb(255 255 255 / 0.1); +} + +.theme-btn { + position: relative; + z-index: 10; + display: flex; + height: 2rem; + width: 2rem; + align-items: center; + justify-content: center; + border-radius: 9999px; + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +/* Html5-Qrcode Overrides */ + +#reader { + border-style: none !important; +} + +#reader button { + cursor: pointer; + border-radius: 0.5rem; + border-width: 1px; + border-color: rgb(0 0 0 / 0.05); + background-color: var(--accents-2); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + padding-right: 1rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + color: var(--foreground); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +#reader button:hover { + background-color: var(--accents-3); +} + +#reader button:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); + background-color: rgb(255 255 255 / 0.1); +} + +#reader button:hover:is(.dark *) { + background-color: rgb(255 255 255 / 0.2); +} + +#reader #reader__dashboard_section_csr button { + display: inline-flex; + height: 3rem; + align-items: center; + justify-content: center; + border-radius: 0.75rem; + background-color: var(--foreground); + padding-left: 1.5rem; + padding-right: 1.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + letter-spacing: 0.025em; + color: var(--background); + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +#reader #reader__dashboard_section_csr button:hover { + opacity: 0.9; +} + +#reader #reader__dashboard_section_csr button:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +#reader #reader__dashboard_section_csr button:active { + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), 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)); +} + +#reader #reader__dashboard_section_csr button:disabled { + pointer-events: none; + opacity: 0.5; +} + +#reader #reader__dashboard_section_csr button { + margin-bottom: 0.5rem; + height: 2.5rem; + width: 100%; + font-size: 0.75rem; + line-height: 1rem; +} + +#reader #reader__dashboard_section_swaplink { + margin-top: 1rem; + display: block; + border-radius: 0.5rem; + background-color: rgb(0 0 0 / 0.05); + padding: 0.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + color: var(--foreground); + text-decoration-line: underline; + text-decoration-style: dotted; +} + +#reader #reader__dashboard_section_swaplink:hover { + text-decoration-style: solid; +} + +#reader #reader__dashboard_section_swaplink:is(.dark *) { + background-color: rgb(255 255 255 / 0.05); +} + +#reader select { + display: flex; + height: 2.5rem; + width: 100%; + min-width: 0px; + align-items: center; + border-radius: 0.75rem; + border-width: 1px; + border-color: var(--accents-2); + background-color: rgb(255 255 255 / 0.4); + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.875rem; + line-height: 1.25rem; + color: var(--foreground); + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-backdrop-blur: blur(24px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; +} + +#reader select::-moz-placeholder { + color: var(--accents-5); +} + +#reader select::placeholder { + color: var(--accents-5); +} + +#reader select:hover { + border-color: var(--accents-4); + background-color: rgb(255 255 255 / 0.6); + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +#reader select:focus-visible { + border-color: var(--foreground); + outline: 2px solid transparent; + outline-offset: 2px; + --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(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-color: var(--foreground); +} + +#reader select:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +#reader select:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); + background-color: rgb(255 255 255 / 0.05); +} + +#reader select:hover:is(.dark *) { + background-color: rgb(255 255 255 / 0.1); +} + +#reader select { + margin-bottom: 1rem; +} + +#reader span, #reader div { + color: var(--foreground); +} + +.pointer-events-none { + pointer-events: none; +} + +.visible { + visibility: visible; +} + +.collapse { + visibility: collapse; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-0 { + inset: 0px; +} + +.-left-\[10\%\] { + left: -10%; +} + +.-right-\[15\%\] { + right: -15%; +} + +.-top-\[20\%\] { + top: -20%; +} + +.bottom-0 { + bottom: 0px; +} + +.left-0 { + left: 0px; +} + +.right-0 { + right: 0px; +} + +.right-2 { + right: 0.5rem; +} + +.right-4 { + right: 1rem; +} + +.top-0 { + top: 0px; +} + +.top-1\/2 { + top: 50%; +} + +.top-4 { + top: 1rem; +} + +.top-\[30\%\] { + top: 30%; +} + +.z-0 { + z-index: 0; +} + +.z-10 { + z-index: 10; +} + +.z-\[100\] { + z-index: 100; +} + +.m-8 { + margin: 2rem; +} + +.mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.-mb-0\.5 { + margin-bottom: -0.125rem; +} + +.-ml-0\.5 { + margin-left: -0.125rem; +} + +.-mr-0\.5 { + margin-right: -0.125rem; +} + +.-mt-0\.5 { + margin-top: -0.125rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-1 { + margin-left: 0.25rem; +} + +.mt-0\.5 { + margin-top: 0.125rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.contents { + display: contents; +} + +.hidden { + display: none; +} + +.aspect-square { + aspect-ratio: 1 / 1; +} + +.size-1 { + width: 0.25rem; + height: 0.25rem; +} + +.h-1 { + height: 0.25rem; +} + +.h-10 { + height: 2.5rem; +} + +.h-12 { + height: 3rem; +} + +.h-16 { + height: 4rem; +} + +.h-2 { + height: 0.5rem; +} + +.h-3 { + height: 0.75rem; +} + +.h-3\.5 { + height: 0.875rem; +} + +.h-4 { + height: 1rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-8 { + height: 2rem; +} + +.h-\[60vw\] { + height: 60vw; +} + +.h-\[70vw\] { + height: 70vw; +} + +.h-full { + height: 100%; +} + +.min-h-\[100px\] { + min-height: 100px; +} + +.min-h-screen { + min-height: 100vh; +} + +.w-12 { + width: 3rem; +} + +.w-16 { + width: 4rem; +} + +.w-2 { + width: 0.5rem; +} + +.w-3\.5 { + width: 0.875rem; +} + +.w-4 { + width: 1rem; +} + +.w-48 { + width: 12rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-8 { + width: 2rem; +} + +.w-\[60vw\] { + width: 60vw; +} + +.w-\[70vw\] { + width: 70vw; +} + +.w-\[calc\(33\.33\%-4px\)\] { + width: calc(33.33% - 4px); +} + +.w-\[calc\(50\%-4px\)\] { + width: calc(50% - 4px); +} + +.w-auto { + width: auto; +} + +.w-full { + width: 100%; +} + +.w-px { + width: 1px; +} + +.min-w-\[80px\] { + min-width: 80px; +} + +.max-w-md { + max-width: 28rem; +} + +.max-w-sm { + max-width: 24rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.shrink-0 { + flex-shrink: 0; +} + +.grow { + flex-grow: 1; +} + +.-translate-x-1\/2 { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), 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)); +} + +.-translate-x-1\/3 { + --tw-translate-x: -33.333333%; + transform: translate(var(--tw-translate-x), 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)); +} + +.-translate-x-2\/3 { + --tw-translate-x: -66.666667%; + transform: translate(var(--tw-translate-x), 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)); +} + +.-translate-y-1\/2 { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), 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)); +} + +.-translate-y-24 { + --tw-translate-y: -6rem; + transform: translate(var(--tw-translate-x), 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)); +} + +.translate-x-0 { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), 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)); +} + +.translate-x-\[36px\] { + --tw-translate-x: 36px; + transform: translate(var(--tw-translate-x), 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)); +} + +.translate-x-\[calc\(100\%\+4px\)\] { + --tw-translate-x: calc(100% + 4px); + transform: translate(var(--tw-translate-x), 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)); +} + +.translate-x-\[calc\(200\%\+8px\)\] { + --tw-translate-x: calc(200% + 8px); + transform: translate(var(--tw-translate-x), 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)); +} + +.translate-x-full { + --tw-translate-x: 100%; + transform: translate(var(--tw-translate-x), 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)); +} + +.translate-y-0 { + --tw-translate-y: 0px; + transform: translate(var(--tw-translate-x), 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)); +} + +.translate-y-2 { + --tw-translate-y: 0.5rem; + transform: translate(var(--tw-translate-x), 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)); +} + +.rotate-180 { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), 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)); +} + +.scale-100 { + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), 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)); +} + +.scale-95 { + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), 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)); +} + +.transform { + transform: translate(var(--tw-translate-x), 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)); +} + +@keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +} + +.animate-ping { + animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; +} + +@keyframes pulse { + 50% { + opacity: .5; + } +} + +.animate-pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.animate-spin { + animation: spin 1s linear infinite; +} + +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.flex-col { + flex-direction: column; +} + +.items-start { + align-items: flex-start; +} + +.items-center { + align-items: center; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-1\.5 { + gap: 0.375rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.overflow-hidden { + overflow: hidden; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.break-words { + overflow-wrap: break-word; +} + +.rounded-2xl { + border-radius: 1rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.border { + border-width: 1px; +} + +.border-2 { + border-width: 2px; +} + +.border-b-4 { + border-bottom-width: 4px; +} + +.border-l-4 { + border-left-width: 4px; +} + +.border-r-4 { + border-right-width: 4px; +} + +.border-t { + border-top-width: 1px; +} + +.border-t-4 { + border-top-width: 4px; +} + +.border-accents-2 { + border-color: var(--accents-2); +} + +.border-black\/5 { + border-color: rgb(0 0 0 / 0.05); +} + +.border-emerald-500 { + --tw-border-opacity: 1; + border-color: rgb(16 185 129 / var(--tw-border-opacity, 1)); +} + +.border-red-500\/20 { + border-color: rgb(239 68 68 / 0.2); +} + +.border-white\/10 { + border-color: rgb(255 255 255 / 0.1); +} + +.border-white\/30 { + border-color: rgb(255 255 255 / 0.3); +} + +.border-white\/5 { + border-color: rgb(255 255 255 / 0.05); +} + +.bg-amber-500\/10 { + background-color: rgb(245 158 11 / 0.1); +} + +.bg-background { + background-color: var(--background); +} + +.bg-black\/5 { + background-color: rgb(0 0 0 / 0.05); +} + +.bg-black\/80 { + background-color: rgb(0 0 0 / 0.8); +} + +.bg-blue-500\/10 { + background-color: rgb(59 130 246 / 0.1); +} + +.bg-emerald-400 { + --tw-bg-opacity: 1; + background-color: rgb(52 211 153 / var(--tw-bg-opacity, 1)); +} + +.bg-emerald-500 { + --tw-bg-opacity: 1; + background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1)); +} + +.bg-green-500\/20 { + background-color: rgb(34 197 94 / 0.2); +} + +.bg-purple-500\/10 { + background-color: rgb(168 85 247 / 0.1); +} + +.bg-red-500\/10 { + background-color: rgb(239 68 68 / 0.1); +} + +.bg-red-500\/20 { + background-color: rgb(239 68 68 / 0.2); +} + +.bg-slate-100 { + --tw-bg-opacity: 1; + background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-white\/90 { + background-color: rgb(255 255 255 / 0.9); +} + +.bg-\[url\(\'data\:image\/svg\+xml\;base64\2c PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI\+PGNpcmNsZSBjeD0iMSIgY3k9IjEiIHI9IjEiIGZpbGw9InJnYmEoMCwwLDAsMC4wNSkiLz48L3N2Zz4\=\'\)\] { + background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iMSIgY3k9IjEiIHI9IjEiIGZpbGw9InJnYmEoMCwwLDAsMC4wNSkiLz48L3N2Zz4='); +} + +.bg-gradient-to-br { + background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); +} + +.from-white\/10 { + --tw-gradient-from: rgb(255 255 255 / 0.1) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.to-transparent { + --tw-gradient-to: transparent var(--tw-gradient-to-position); +} + +.bg-cover { + background-size: cover; +} + +.bg-center { + background-position: center; +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.p-1 { + padding: 0.25rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-64 { + padding: 16rem; +} + +.p-8 { + padding: 2rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.pr-10 { + padding-right: 2.5rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-36 { + padding-top: 9rem; +} + +.pt-8 { + padding-top: 2rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.font-mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-\[10px\] { + font-size: 10px; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.leading-relaxed { + line-height: 1.625; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.tracking-widest { + letter-spacing: 0.1em; +} + +.text-accents-5 { + color: var(--accents-5); +} + +.text-amber-500 { + --tw-text-opacity: 1; + color: rgb(245 158 11 / var(--tw-text-opacity, 1)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity, 1)); +} + +.text-cyan-400 { + --tw-text-opacity: 1; + color: rgb(34 211 238 / var(--tw-text-opacity, 1)); +} + +.text-emerald-400 { + --tw-text-opacity: 1; + color: rgb(52 211 153 / var(--tw-text-opacity, 1)); +} + +.text-emerald-500 { + --tw-text-opacity: 1; + color: rgb(16 185 129 / var(--tw-text-opacity, 1)); +} + +.text-emerald-600 { + --tw-text-opacity: 1; + color: rgb(5 150 105 / var(--tw-text-opacity, 1)); +} + +.text-foreground { + color: var(--foreground); +} + +.text-green-500 { + --tw-text-opacity: 1; + color: rgb(34 197 94 / var(--tw-text-opacity, 1)); +} + +.text-red-400 { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity, 1)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity, 1)); +} + +.text-slate-300 { + --tw-text-opacity: 1; + color: rgb(203 213 225 / var(--tw-text-opacity, 1)); +} + +.text-slate-400 { + --tw-text-opacity: 1; + color: rgb(148 163 184 / var(--tw-text-opacity, 1)); +} + +.text-slate-500 { + --tw-text-opacity: 1; + color: rgb(100 116 139 / var(--tw-text-opacity, 1)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.underline { + text-decoration-line: underline; +} + +.antialiased { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-100 { + opacity: 1; +} + +.opacity-25 { + opacity: 0.25; +} + +.opacity-75 { + opacity: 0.75; +} + +.shadow-inner { + --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-xl { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-red-500\/5 { + --tw-shadow-color: rgb(239 68 68 / 0.05); + --tw-shadow: var(--tw-shadow-colored); +} + +.outline { + outline-style: solid; +} + +.ring-1 { + --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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-black\/5 { + --tw-ring-color: rgb(0 0 0 / 0.05); +} + +.blur-\[100px\] { + --tw-blur: blur(100px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.blur-\[120px\] { + --tw-blur: blur(120px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.drop-shadow-lg { + --tw-drop-shadow: drop-shadow(0 10px 8px rgb(0 0 0 / 0.04)) drop-shadow(0 4px 3px rgb(0 0 0 / 0.1)); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.invert { + --tw-invert: invert(100%); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.backdrop-blur-md { + --tw-backdrop-blur: blur(12px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.backdrop-blur-sm { + --tw-backdrop-blur: blur(4px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.backdrop-blur-xl { + --tw-backdrop-blur: blur(24px); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-100 { + transition-duration: 100ms; +} + +.duration-1000 { + transition-duration: 1000ms; +} + +.duration-500 { + transition-duration: 500ms; +} + +.ease-out { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.\[mask-image\:linear-gradient\(to_bottom\2c white\2c transparent\)\] { + -webkit-mask-image: linear-gradient(to bottom,white,transparent); + mask-image: linear-gradient(to bottom,white,transparent); +} + +.selection\:text-white *::-moz-selection { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.selection\:text-white *::selection { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.selection\:text-white::-moz-selection { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.selection\:text-white::selection { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.hover\:bg-black\/10:hover { + background-color: rgb(0 0 0 / 0.1); +} + +.hover\:bg-black\/5:hover { + background-color: rgb(0 0 0 / 0.05); +} + +.hover\:bg-slate-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-white\/5:hover { + background-color: rgb(255 255 255 / 0.05); +} + +.hover\:text-foreground:hover { + color: var(--foreground); +} + +.hover\:text-slate-700:hover { + --tw-text-opacity: 1; + color: rgb(51 65 85 / var(--tw-text-opacity, 1)); +} + +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.focus\:ring-foreground:focus { + --tw-ring-color: var(--foreground); +} + +.group:hover .group-hover\:text-foreground { + color: var(--foreground); +} + +.dark\:border-white\/10:is(.dark *) { + border-color: rgb(255 255 255 / 0.1); +} + +.dark\:bg-black\/80:is(.dark *) { + background-color: rgb(0 0 0 / 0.8); +} + +.dark\:bg-blue-500\/5:is(.dark *) { + background-color: rgb(59 130 246 / 0.05); +} + +.dark\:bg-purple-500\/5:is(.dark *) { + background-color: rgb(168 85 247 / 0.05); +} + +.dark\:bg-white\/10:is(.dark *) { + background-color: rgb(255 255 255 / 0.1); +} + +.dark\:bg-white\/5:is(.dark *) { + background-color: rgb(255 255 255 / 0.05); +} + +.dark\:bg-\[url\(\'data\:image\/svg\+xml\;base64\2c PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI\+PGNpcmNsZSBjeD0iMSIgY3k9IjEiIHI9IjEiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsMC4wNSkiLz48L3N2Zz4\=\'\)\]:is(.dark *) { + background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iMSIgY3k9IjEiIHI9IjEiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsMC4wNSkiLz48L3N2Zz4='); +} + +.dark\:text-blue-400:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity, 1)); +} + +.dark\:text-emerald-400:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(52 211 153 / var(--tw-text-opacity, 1)); +} + +.dark\:hover\:bg-white\/10:hover:is(.dark *) { + background-color: rgb(255 255 255 / 0.1); +} + +.dark\:hover\:bg-white\/20:hover:is(.dark *) { + background-color: rgb(255 255 255 / 0.2); +} diff --git a/theme/assets/img/logo-m-dark.svg b/theme/assets/img/logo-m-dark.svg new file mode 100644 index 0000000..0df2041 --- /dev/null +++ b/theme/assets/img/logo-m-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/theme/assets/img/logo-m.svg b/theme/assets/img/logo-m.svg new file mode 100644 index 0000000..ff08b11 --- /dev/null +++ b/theme/assets/img/logo-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/theme/assets/js/alpine.min.js b/theme/assets/js/alpine.min.js new file mode 100644 index 0000000..a3be81c --- /dev/null +++ b/theme/assets/js/alpine.min.js @@ -0,0 +1,5 @@ +(()=>{var nt=!1,it=!1,W=[],ot=-1;function Ut(e){Rn(e)}function Rn(e){W.includes(e)||W.push(e),Mn()}function Wt(e){let t=W.indexOf(e);t!==-1&&t>ot&&W.splice(t,1)}function Mn(){!it&&!nt&&(nt=!0,queueMicrotask(Nn))}function Nn(){nt=!1,it=!0;for(let e=0;ee.effect(t,{scheduler:r=>{st?Ut(r):r()}}),at=e.raw}function ct(e){N=e}function Yt(e){let t=()=>{};return[n=>{let i=N(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),$(i))},i},()=>{t()}]}function ve(e,t){let r=!0,n,i=N(()=>{let o=e();JSON.stringify(o),r?n=o:queueMicrotask(()=>{t(o,n),n=o}),r=!1});return()=>$(i)}var Xt=[],Zt=[],Qt=[];function er(e){Qt.push(e)}function te(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Zt.push(t))}function Ae(e){Xt.push(e)}function Oe(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function lt(e,t){e._x_attributeCleanups&&Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}function tr(e){for(e._x_effects?.forEach(Wt);e._x_cleanups?.length;)e._x_cleanups.pop()()}var ut=new MutationObserver(mt),ft=!1;function ue(){ut.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),ft=!0}function dt(){kn(),ut.disconnect(),ft=!1}var le=[];function kn(){let e=ut.takeRecords();le.push(()=>e.length>0&&mt(e));let t=le.length;queueMicrotask(()=>{if(le.length===t)for(;le.length>0;)le.shift()()})}function m(e){if(!ft)return e();dt();let t=e();return ue(),t}var pt=!1,Se=[];function rr(){pt=!0}function nr(){pt=!1,mt(Se),Se=[]}function mt(e){if(pt){Se=Se.concat(e);return}let t=[],r=new Set,n=new Map,i=new Map;for(let o=0;o{s.nodeType===1&&s._x_marker&&r.add(s)}),e[o].addedNodes.forEach(s=>{if(s.nodeType===1){if(r.has(s)){r.delete(s);return}s._x_marker||t.push(s)}})),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{lt(s,o)}),n.forEach((o,s)=>{Xt.forEach(a=>a(s,o))});for(let o of r)t.some(s=>s.contains(o))||Zt.forEach(s=>s(o));for(let o of t)o.isConnected&&Qt.forEach(s=>s(o));t=null,r=null,n=null,i=null}function Ce(e){return z(B(e))}function k(e,t,r){return e._x_dataStack=[t,...B(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function B(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?B(e.host):e.parentNode?B(e.parentNode):[]}function z(e){return new Proxy({objects:e},Dn)}var Dn={ownKeys({objects:e}){return Array.from(new Set(e.flatMap(t=>Object.keys(t))))},has({objects:e},t){return t==Symbol.unscopables?!1:e.some(r=>Object.prototype.hasOwnProperty.call(r,t)||Reflect.has(r,t))},get({objects:e},t,r){return t=="toJSON"?Pn:Reflect.get(e.find(n=>Reflect.has(n,t))||{},t,r)},set({objects:e},t,r,n){let i=e.find(s=>Object.prototype.hasOwnProperty.call(s,t))||e[e.length-1],o=Object.getOwnPropertyDescriptor(i,t);return o?.set&&o?.get?o.set.call(n,r)||!0:Reflect.set(i,t,r)}};function Pn(){return Reflect.ownKeys(this).reduce((t,r)=>(t[r]=Reflect.get(this,r),t),{})}function Te(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0||typeof s=="object"&&s!==null&&s.__v_skip)return;let c=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,c,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,c)})};return r(e)}function Re(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>In(n,i),s=>ht(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function In(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function ht(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),ht(e[t[0]],t.slice(1),r)}}var ir={};function y(e,t){ir[e]=t}function fe(e,t){let r=Ln(t);return Object.entries(ir).forEach(([n,i])=>{Object.defineProperty(e,`$${n}`,{get(){return i(t,r)},enumerable:!1})}),e}function Ln(e){let[t,r]=_t(e),n={interceptor:Re,...t};return te(e,r),n}function or(e,t,r,...n){try{return r(...n)}catch(i){re(i,e,t)}}function re(e,t,r=void 0){e=Object.assign(e??{message:"No error message given."},{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} + +${r?'Expression: "'+r+`" + +`:""}`,t),setTimeout(()=>{throw e},0)}var Me=!0;function ke(e){let t=Me;Me=!1;let r=e();return Me=t,r}function R(e,t,r={}){let n;return x(e,t)(i=>n=i,r),n}function x(...e){return sr(...e)}var sr=xt;function ar(e){sr=e}function xt(e,t){let r={};fe(r,e);let n=[r,...B(e)],i=typeof t=="function"?$n(n,t):Fn(n,t,e);return or.bind(null,e,t,i)}function $n(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(z([n,...e]),i);Ne(r,o)}}var gt={};function jn(e,t){if(gt[e])return gt[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e.trim())||/^(let|const)\s/.test(e.trim())?`(async()=>{ ${e} })()`:e,o=(()=>{try{let s=new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`);return Object.defineProperty(s,"name",{value:`[Alpine] ${e}`}),s}catch(s){return re(s,t,e),Promise.resolve()}})();return gt[e]=o,o}function Fn(e,t,r){let n=jn(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=z([o,...e]);if(typeof n=="function"){let c=n(n,a).catch(l=>re(l,r,t));n.finished?(Ne(i,n.result,a,s,r),n.result=void 0):c.then(l=>{Ne(i,l,a,s,r)}).catch(l=>re(l,r,t)).finally(()=>n.result=void 0)}}}function Ne(e,t,r,n,i){if(Me&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>Ne(e,s,r,n)).catch(s=>re(s,i,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var wt="x-";function C(e=""){return wt+e}function cr(e){wt=e}var De={};function d(e,t){return De[e]=t,{before(r){if(!De[r]){console.warn(String.raw`Cannot find directive \`${r}\`. \`${e}\` will use the default order of execution`);return}let n=G.indexOf(r);G.splice(n>=0?n:G.indexOf("DEFAULT"),0,e)}}}function lr(e){return Object.keys(De).includes(e)}function pe(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([a,c])=>({name:a,value:c})),s=Et(o);o=o.map(a=>s.find(c=>c.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(o)}let n={};return t.map(dr((o,s)=>n[o]=s)).filter(mr).map(zn(n,r)).sort(Kn).map(o=>Bn(e,o))}function Et(e){return Array.from(e).map(dr()).filter(t=>!mr(t))}var yt=!1,de=new Map,ur=Symbol();function fr(e){yt=!0;let t=Symbol();ur=t,de.set(t,[]);let r=()=>{for(;de.get(t).length;)de.get(t).shift()();de.delete(t)},n=()=>{yt=!1,r()};e(r),n()}function _t(e){let t=[],r=a=>t.push(a),[n,i]=Yt(e);return t.push(i),[{Alpine:K,effect:n,cleanup:r,evaluateLater:x.bind(x,e),evaluate:R.bind(R,e)},()=>t.forEach(a=>a())]}function Bn(e,t){let r=()=>{},n=De[t.type]||r,[i,o]=_t(e);Oe(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),yt?de.get(ur).push(n):n())};return s.runCleanups=o,s}var Pe=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Ie=e=>e;function dr(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=pr.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var pr=[];function ne(e){pr.push(e)}function mr({name:e}){return hr().test(e)}var hr=()=>new RegExp(`^${wt}([^:^.]+)\\b`);function zn(e,t){return({name:r,value:n})=>{let i=r.match(hr()),o=r.match(/:([a-zA-Z0-9\-_:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var bt="DEFAULT",G=["ignore","ref","data","id","anchor","bind","init","for","model","modelable","transition","show","if",bt,"teleport"];function Kn(e,t){let r=G.indexOf(e.type)===-1?bt:e.type,n=G.indexOf(t.type)===-1?bt:t.type;return G.indexOf(r)-G.indexOf(n)}function J(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}function D(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>D(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)D(n,t,!1),n=n.nextElementSibling}function E(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var _r=!1;function gr(){_r&&E("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),_r=!0,document.body||E("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` + + + + + Mivo Hotspot - Error + + + +
+ +
+ +
+
+
+ + + + +
+
+
+ Mivo Logo +
+ +

System Error

+ +
+ +
$(error)
+
+ + + + Back to Login + +
+
+ + diff --git a/theme/favicon.ico b/theme/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cd167d6b1b2f25d9019615fe12b33e16ee7e4158 GIT binary patch literal 562718 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 ZQU~SKC)~5dK?(SmI4G|^;hseY{eQfMu+0Df literal 0 HcmV?d00001 diff --git a/theme/login.html b/theme/login.html new file mode 100644 index 0000000..c134e9f --- /dev/null +++ b/theme/login.html @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + Mivo Hotspot - Login + + + + + +
+ +
+ +
+
+
+ + + + + + +
+
+ $(if chap-id) +
+ + + + +
+ $(endif) + +
+
+ Mivo Logo +
+

Mivo Hotspot

+
+ + +
+
+ + + +
+ +
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ + + +
+ +
+
+ + + $(if trial == 'yes') + + + Free Trial Login + + $(endif) +
+
+ + +
+
+
+ +
+ + + +
+
+
+ +
+
+ + + +
+ +
+
+
+
+ + + +
+
+ + + $(if error) +
+
+
+ +
+ $(error) +
+
+ $(endif) +
+ +
+

MIVO THEME BY DYZULKDEV • POWERED BY MIVO

+
+ +
+ + + + + + +
+ + diff --git a/theme/logout.html b/theme/logout.html new file mode 100644 index 0000000..6f49151 --- /dev/null +++ b/theme/logout.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + Mivo Hotspot - Logout + + + + +
+ +
+ +
+
+
+ + + + +
+
+
+ Mivo Logo +
+ +

Logged Out

+

You have been successfully disconnected from the hotspot.

+ +
+
+ User + $(username) +
+
+
+

Total Uptime

+

$(uptime)

+
+
+

Data Used

+

$(bytes-total-nice)

+
+
+
+ + + Login Again + + +
+

MIVO THEME BY DYZULKDEV • POWERED BY MIVO

+
+ +
+
+ + diff --git a/theme/radvert.html b/theme/radvert.html new file mode 100644 index 0000000..39f7faa --- /dev/null +++ b/theme/radvert.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ +
+
+ +
+

Advertisement

+

Please view the advertisement to continue.

+
+ +

+ If nothing happens, open advertisement manually. +

+
+
+

MIVO THEME BY DYZULKDEV • POWERED BY MIVO

+
+ +
+ + + + diff --git a/theme/redirect.html b/theme/redirect.html new file mode 100644 index 0000000..e0ad91e --- /dev/null +++ b/theme/redirect.html @@ -0,0 +1,41 @@ +$(if http-status == 302)Hotspot redirect$(endif) +$(if http-header == "Location")$(link-redirect)$(endif) + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + + + + + diff --git a/theme/rlogin.html b/theme/rlogin.html new file mode 100644 index 0000000..5719fe8 --- /dev/null +++ b/theme/rlogin.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + +
+ +
+
+
+
+ +
+
+ +
+

Login Required

+

Redirecting to login page...

+ $(if http-status == 302)

Hotspot login required

$(endif) +
+ +

+ If not redirected, click here. +

+
+
+

MIVO THEME BY DYZULKDEV • POWERED BY MIVO

+
+ +
+ + + $(if http-header == "Location")$(link-redirect)$(endif) + + + + diff --git a/theme/status.html b/theme/status.html new file mode 100644 index 0000000..b5bb925 --- /dev/null +++ b/theme/status.html @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + Mivo Hotspot - Status + $(if refresh-timeout) + + $(endif) + + + + +
+ +
+ +
+
+
+ + + + +
+
+
+
+ Mivo Logo +
+

Connected

+

+ + + + + Active Session +

+
+
+
+ +
+
+ + +
+
+ User + $(username) +
+ +
+
+

IP Address

+

$(ip)

+
+
+

MAC

+

$(mac)

+
+
+ + +
+
+
+
+ +
+ Download +
+

$(bytes-out-nice)

+
+
+
+
+ +
+ Upload +
+

$(bytes-in-nice)

+
+
+ +
+
+ Session Uptime + $(uptime) +
+ + + $(if remain-time) +
+ Time Remaining + $(remain-time) +
+ $(endif) + + + + + + +
+
+ +
+ + + +
+ +
+

MIVO THEME BY DYZULKDEV • POWERED BY MIVO

+
+ +
+
+ + diff --git a/theme/xml/WISPAccessGatewayParam.xsd b/theme/xml/WISPAccessGatewayParam.xsd new file mode 100644 index 0000000..88efc75 --- /dev/null +++ b/theme/xml/WISPAccessGatewayParam.xsd @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/theme/xml/alogin.html b/theme/xml/alogin.html new file mode 100644 index 0000000..35fcee7 --- /dev/null +++ b/theme/xml/alogin.html @@ -0,0 +1,18 @@ + diff --git a/theme/xml/error.html b/theme/xml/error.html new file mode 100644 index 0000000..602231a --- /dev/null +++ b/theme/xml/error.html @@ -0,0 +1,12 @@ + diff --git a/theme/xml/login.html b/theme/xml/login.html new file mode 100644 index 0000000..a7486e5 --- /dev/null +++ b/theme/xml/login.html @@ -0,0 +1,22 @@ + diff --git a/theme/xml/logout.html b/theme/xml/logout.html new file mode 100644 index 0000000..33c55b4 --- /dev/null +++ b/theme/xml/logout.html @@ -0,0 +1,11 @@ + diff --git a/theme/xml/rlogin.html b/theme/xml/rlogin.html new file mode 100644 index 0000000..50d5a4f --- /dev/null +++ b/theme/xml/rlogin.html @@ -0,0 +1,15 @@ +